From 8a4bb6e3b0bffa0ed79b51347b12ee4293b622a7 Mon Sep 17 00:00:00 2001 From: Richard-Qin-X Date: Sat, 22 Aug 2026 18:49:08 +0800 Subject: [CodeGen] Generate RISC-V macro fusion rules --- backend/include/rcc/CodeGen/ScheduleDAG.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'backend/include/rcc/CodeGen/ScheduleDAG.h') diff --git a/backend/include/rcc/CodeGen/ScheduleDAG.h b/backend/include/rcc/CodeGen/ScheduleDAG.h index 644d98a..7634202 100644 --- a/backend/include/rcc/CodeGen/ScheduleDAG.h +++ b/backend/include/rcc/CodeGen/ScheduleDAG.h @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -32,6 +33,7 @@ enum class ScheduleDependencyKind : std::uint8_t { Memory, Barrier, Artificial, + Cluster, RegisterUnit, RegisterMask, }; @@ -57,6 +59,8 @@ struct ScheduleUnit final { std::uint64_t Depth = 0; std::uint64_t Height = 0; MachineInstrStableID StableID; + std::optional ClusterPredecessor; + std::optional ClusterSuccessor; }; class ScheduleDAG final { @@ -64,7 +68,7 @@ public: [[nodiscard]] static Expected build(MachineBasicBlock &Block, std::span Instructions, const MachineFunction &Function, const TargetDescription &Target, - const TargetSchedulingModel &Model, ScheduleDAGMode Mode); + const TargetSchedulingModel &Model, ScheduleDAGMode Mode, bool EmitDebugOutput = false); [[nodiscard]] MachineBasicBlock &block() const noexcept { return *Block; @@ -84,6 +88,7 @@ public: [[nodiscard]] Expected addArtificialDependency(std::size_t Source, std::size_t Destination, std::uint32_t Latency); + [[nodiscard]] Expected fuseInstructionPair(std::size_t First, std::size_t Second); private: explicit ScheduleDAG(MachineBasicBlock &Block) : Block(&Block) {} @@ -97,9 +102,11 @@ private: ScheduleDAGMode Mode); [[nodiscard]] Expected buildMemoryDependencies(const TargetDescription &Target); [[nodiscard]] Expected buildOrderDependencies(const TargetDescription &Target); + [[nodiscard]] bool hasPath(std::size_t Source, std::size_t Destination) const; + [[nodiscard]] bool hasDirectDependency(std::size_t Source, std::size_t Destination) const; void addDependency(std::size_t Source, std::size_t Destination, ScheduleDependencyKind Kind, std::uint32_t Latency); - void computeCriticalPaths(); + [[nodiscard]] Expected computeCriticalPaths(); MachineBasicBlock *Block; std::vector Units; -- cgit v1.2.3