From 8721893d3ba605f5374d9c0c7987af6110355638 Mon Sep 17 00:00:00 2001 From: Richard-Qin-X Date: Wed, 12 Aug 2026 20:39:04 +0800 Subject: [CodeGen] Add TargetInstrInfo ownership --- .../rcc/CodeGen/MachineBranchOptimization.h | 6 +- .../include/rcc/CodeGen/MachineBranchRelaxation.h | 6 +- backend/include/rcc/CodeGen/MachineFallthrough.h | 6 +- backend/include/rcc/CodeGen/MachineFinalization.h | 6 +- .../rcc/CodeGen/MachineOptimizationPipeline.h | 4 +- .../include/rcc/CodeGen/MachinePseudoExpansion.h | 6 +- .../include/rcc/CodeGen/MachineTailDuplication.h | 6 +- backend/include/rcc/CodeGen/MachineTailMerge.h | 6 +- backend/include/rcc/CodeGen/TargetBranchInfo.h | 66 ---------------------- backend/include/rcc/CodeGen/TargetInstrInfo.h | 66 ++++++++++++++++++++++ 10 files changed, 89 insertions(+), 89 deletions(-) delete mode 100644 backend/include/rcc/CodeGen/TargetBranchInfo.h create mode 100644 backend/include/rcc/CodeGen/TargetInstrInfo.h (limited to 'backend/include/rcc/CodeGen') diff --git a/backend/include/rcc/CodeGen/MachineBranchOptimization.h b/backend/include/rcc/CodeGen/MachineBranchOptimization.h index a71c20f..9f120dc 100644 --- a/backend/include/rcc/CodeGen/MachineBranchOptimization.h +++ b/backend/include/rcc/CodeGen/MachineBranchOptimization.h @@ -9,7 +9,7 @@ namespace rcc { -class TargetBranchInfo; +class TargetInstrInfo; struct MachineBranchOptimizationOptions final { std::size_t MaximumThreadedEdges = 10'000; @@ -17,7 +17,7 @@ struct MachineBranchOptimizationOptions final { class MachineBranchOptimizationPass final : public MachineFunctionPass { public: - explicit MachineBranchOptimizationPass(const TargetBranchInfo &Info, + explicit MachineBranchOptimizationPass(const TargetInstrInfo &Info, MachineBranchOptimizationOptions Options = {}) noexcept : Info(&Info), Options(Options) {} @@ -30,7 +30,7 @@ private: [[nodiscard]] Expected runImplementation(MachineFunction &Function, const TargetDescription &Target) const; - const TargetBranchInfo *Info; + const TargetInstrInfo *Info; MachineBranchOptimizationOptions Options; }; diff --git a/backend/include/rcc/CodeGen/MachineBranchRelaxation.h b/backend/include/rcc/CodeGen/MachineBranchRelaxation.h index c88c1d5..03c7fa7 100644 --- a/backend/include/rcc/CodeGen/MachineBranchRelaxation.h +++ b/backend/include/rcc/CodeGen/MachineBranchRelaxation.h @@ -9,7 +9,7 @@ namespace rcc { -class TargetBranchInfo; +class TargetInstrInfo; struct MachineBranchRelaxationOptions final { std::size_t ConvergenceWatchdog = 1000000; @@ -17,7 +17,7 @@ struct MachineBranchRelaxationOptions final { class MachineBranchRelaxationPass final : public MachineFunctionPass { public: - explicit MachineBranchRelaxationPass(const TargetBranchInfo &Info, + explicit MachineBranchRelaxationPass(const TargetInstrInfo &Info, MachineBranchRelaxationOptions Options = {}) noexcept : Info(&Info), Options(Options) {} @@ -31,7 +31,7 @@ private: const TargetDescription &Target, MachineActionReplay &Actions) const; - const TargetBranchInfo *Info; + const TargetInstrInfo *Info; MachineBranchRelaxationOptions Options; }; diff --git a/backend/include/rcc/CodeGen/MachineFallthrough.h b/backend/include/rcc/CodeGen/MachineFallthrough.h index 413efe2..5793330 100644 --- a/backend/include/rcc/CodeGen/MachineFallthrough.h +++ b/backend/include/rcc/CodeGen/MachineFallthrough.h @@ -7,11 +7,11 @@ namespace rcc { -class TargetBranchInfo; +class TargetInstrInfo; class MachineFallthroughPass final : public MachineFunctionPass { public: - explicit MachineFallthroughPass(const TargetBranchInfo &Info) noexcept : Info(&Info) {} + explicit MachineFallthroughPass(const TargetInstrInfo &Info) noexcept : Info(&Info) {} [[nodiscard]] const MachinePassContract &contract() const noexcept override; [[nodiscard]] Expected run(MachineFunction &Function, @@ -19,7 +19,7 @@ public: MachineAnalysisManager &Analyses) override; private: - const TargetBranchInfo *Info; + const TargetInstrInfo *Info; }; } // namespace rcc diff --git a/backend/include/rcc/CodeGen/MachineFinalization.h b/backend/include/rcc/CodeGen/MachineFinalization.h index 147da86..1927691 100644 --- a/backend/include/rcc/CodeGen/MachineFinalization.h +++ b/backend/include/rcc/CodeGen/MachineFinalization.h @@ -7,7 +7,7 @@ namespace rcc { -class TargetBranchInfo; +class TargetInstrInfo; class FinalizeEmissionPseudosPass final : public MachineFunctionPass { public: @@ -19,7 +19,7 @@ public: class FinalEncodabilityVerifierPass final : public MachineFunctionPass { public: - explicit FinalEncodabilityVerifierPass(const TargetBranchInfo &BranchInfo) noexcept + explicit FinalEncodabilityVerifierPass(const TargetInstrInfo &BranchInfo) noexcept : BranchInfo(&BranchInfo) {} [[nodiscard]] const MachinePassContract &contract() const noexcept override; @@ -28,7 +28,7 @@ public: MachineAnalysisManager &Analyses) override; private: - const TargetBranchInfo *BranchInfo; + const TargetInstrInfo *BranchInfo; }; } // namespace rcc diff --git a/backend/include/rcc/CodeGen/MachineOptimizationPipeline.h b/backend/include/rcc/CodeGen/MachineOptimizationPipeline.h index 0953437..2cf1bcd 100644 --- a/backend/include/rcc/CodeGen/MachineOptimizationPipeline.h +++ b/backend/include/rcc/CodeGen/MachineOptimizationPipeline.h @@ -7,7 +7,7 @@ namespace rcc { -class TargetBranchInfo; +class TargetInstrInfo; class TargetFrameLowering; class TargetMachineCombinerInfo; class TargetMemoryFoldingInfo; @@ -22,7 +22,7 @@ struct MachineOptimizationPipelineTargetInfo final { const TargetFrameLowering &FrameLowering; const TargetPseudoExpansionInfo &PseudoExpansion; const TargetSchedulingModel &SchedulingModel; - const TargetBranchInfo &BranchInfo; + const TargetInstrInfo &BranchInfo; }; [[nodiscard]] Expected registerMachineOptimizationAnalyses(MachineAnalysisManager &Analyses); diff --git a/backend/include/rcc/CodeGen/MachinePseudoExpansion.h b/backend/include/rcc/CodeGen/MachinePseudoExpansion.h index 1dfb6ba..8c47441 100644 --- a/backend/include/rcc/CodeGen/MachinePseudoExpansion.h +++ b/backend/include/rcc/CodeGen/MachinePseudoExpansion.h @@ -8,7 +8,7 @@ namespace rcc { -class TargetBranchInfo; +class TargetInstrInfo; class TargetPseudoExpansionInfo; class PreparePostRAPseudosPass final : public MachineFunctionPass { @@ -54,7 +54,7 @@ private: class TargetLatePseudoExpansionPass final : public MachineFunctionPass { public: TargetLatePseudoExpansionPass(const TargetPseudoExpansionInfo &Info, - const TargetBranchInfo &BranchInfo) noexcept + const TargetInstrInfo &BranchInfo) noexcept : Info(&Info), BranchInfo(&BranchInfo) {} [[nodiscard]] const MachinePassContract &contract() const noexcept override; @@ -64,7 +64,7 @@ public: private: const TargetPseudoExpansionInfo *Info; - const TargetBranchInfo *BranchInfo; + const TargetInstrInfo *BranchInfo; }; } // namespace rcc diff --git a/backend/include/rcc/CodeGen/MachineTailDuplication.h b/backend/include/rcc/CodeGen/MachineTailDuplication.h index cd62509..1c21bdf 100644 --- a/backend/include/rcc/CodeGen/MachineTailDuplication.h +++ b/backend/include/rcc/CodeGen/MachineTailDuplication.h @@ -9,7 +9,7 @@ namespace rcc { -class TargetBranchInfo; +class TargetInstrInfo; struct MachineTailDuplicationOptions final { std::size_t MaximumTailInstructions = 8; @@ -18,7 +18,7 @@ struct MachineTailDuplicationOptions final { class MachineTailDuplicationPass final : public MachineFunctionPass { public: - explicit MachineTailDuplicationPass(const TargetBranchInfo &Info, + explicit MachineTailDuplicationPass(const TargetInstrInfo &Info, MachineTailDuplicationOptions Options = {}) noexcept : Info(&Info), Options(Options) {} @@ -31,7 +31,7 @@ private: [[nodiscard]] Expected runImplementation(MachineFunction &Function, const TargetDescription &Target) const; - const TargetBranchInfo *Info; + const TargetInstrInfo *Info; MachineTailDuplicationOptions Options; }; diff --git a/backend/include/rcc/CodeGen/MachineTailMerge.h b/backend/include/rcc/CodeGen/MachineTailMerge.h index 94084ac..7237d58 100644 --- a/backend/include/rcc/CodeGen/MachineTailMerge.h +++ b/backend/include/rcc/CodeGen/MachineTailMerge.h @@ -9,7 +9,7 @@ namespace rcc { -class TargetBranchInfo; +class TargetInstrInfo; struct MachineTailMergeOptions final { std::size_t MaximumMergedBlocks = 4'096; @@ -17,7 +17,7 @@ struct MachineTailMergeOptions final { class MachineTailMergePass final : public MachineFunctionPass { public: - explicit MachineTailMergePass(const TargetBranchInfo &Info, + explicit MachineTailMergePass(const TargetInstrInfo &Info, MachineTailMergeOptions Options = {}) noexcept : Info(&Info), Options(Options) {} @@ -30,7 +30,7 @@ private: [[nodiscard]] Expected runImplementation(MachineFunction &Function, const TargetDescription &Target) const; - const TargetBranchInfo *Info; + const TargetInstrInfo *Info; MachineTailMergeOptions Options; }; diff --git a/backend/include/rcc/CodeGen/TargetBranchInfo.h b/backend/include/rcc/CodeGen/TargetBranchInfo.h deleted file mode 100644 index 39c5122..0000000 --- a/backend/include/rcc/CodeGen/TargetBranchInfo.h +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef RCC_CODEGEN_TARGETBRANCHINFO_H -#define RCC_CODEGEN_TARGETBRANCHINFO_H - -#include "rcc/Support/Error.h" - -#include -#include - -namespace rcc { - -class MachineBasicBlock; -class MachineFunction; -class MachineInstr; -class TargetDescription; - -struct MachineBranchAnalysis final { - MachineInstr *Conditional = nullptr; - MachineInstr *Unconditional = nullptr; - MachineBasicBlock *TrueTarget = nullptr; - MachineBasicBlock *FalseTarget = nullptr; - bool HasUnanalyzableTerminator = false; -}; - -class TargetBranchInfo { -public: - virtual ~TargetBranchInfo() = default; - - [[nodiscard]] virtual Expected - analyzeBranch(MachineBasicBlock &Block, MachineFunction &Function, - const TargetDescription &Target) const = 0; - [[nodiscard]] virtual Expected - reverseBranchCondition(MachineInstr &Branch, MachineBasicBlock &NewTarget, - MachineFunction &Function, const TargetDescription &Target) const = 0; - [[nodiscard]] virtual Expected removeBranch(MachineInstr &Branch, MachineFunction &Function, - const TargetDescription &Target) const = 0; - [[nodiscard]] virtual Expected - rewriteBranchTarget(MachineBasicBlock &Block, MachineBasicBlock &OldTarget, - MachineBasicBlock &NewTarget, MachineFunction &Function, - const TargetDescription &Target) const = 0; - [[nodiscard]] virtual Expected - insertUnconditionalBranch(MachineBasicBlock &Block, MachineBasicBlock &TargetBlock, - MachineFunction &Function, const TargetDescription &Target) const = 0; - - [[nodiscard]] virtual Expected - instructionSize(const MachineInstr &Instruction, const MachineFunction &Function, - const TargetDescription &Target) const = 0; - [[nodiscard]] virtual Expected - branchTarget(MachineInstr &Instruction, MachineFunction &Function, - const TargetDescription &Target) const = 0; - [[nodiscard]] virtual Expected> - evaluateBranchCondition(const MachineInstr &, const MachineFunction &, - const TargetDescription &) const { - return std::optional{}; - } - [[nodiscard]] virtual bool isBranchOffsetInRange(const MachineInstr &Instruction, - std::int64_t Offset) const noexcept = 0; - [[nodiscard]] virtual Expected relaxBranch(MachineInstr &Instruction, std::int64_t Offset, - MachineFunction &Function, - const TargetDescription &Target) const = 0; -}; - -} // namespace rcc - -#endif // RCC_CODEGEN_TARGETBRANCHINFO_H diff --git a/backend/include/rcc/CodeGen/TargetInstrInfo.h b/backend/include/rcc/CodeGen/TargetInstrInfo.h new file mode 100644 index 0000000..d9f0906 --- /dev/null +++ b/backend/include/rcc/CodeGen/TargetInstrInfo.h @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef RCC_CODEGEN_TARGETINSTRINFO_H +#define RCC_CODEGEN_TARGETINSTRINFO_H + +#include "rcc/Support/Error.h" + +#include +#include + +namespace rcc { + +class MachineBasicBlock; +class MachineFunction; +class MachineInstr; +class TargetDescription; + +struct MachineBranchAnalysis final { + MachineInstr *Conditional = nullptr; + MachineInstr *Unconditional = nullptr; + MachineBasicBlock *TrueTarget = nullptr; + MachineBasicBlock *FalseTarget = nullptr; + bool HasUnanalyzableTerminator = false; +}; + +class TargetInstrInfo { +public: + virtual ~TargetInstrInfo(); + + [[nodiscard]] virtual Expected + analyzeBranch(MachineBasicBlock &Block, MachineFunction &Function, + const TargetDescription &Target) const = 0; + [[nodiscard]] virtual Expected + reverseBranchCondition(MachineInstr &Branch, MachineBasicBlock &NewTarget, + MachineFunction &Function, const TargetDescription &Target) const = 0; + [[nodiscard]] virtual Expected removeBranch(MachineInstr &Branch, MachineFunction &Function, + const TargetDescription &Target) const = 0; + [[nodiscard]] virtual Expected + rewriteBranchTarget(MachineBasicBlock &Block, MachineBasicBlock &OldTarget, + MachineBasicBlock &NewTarget, MachineFunction &Function, + const TargetDescription &Target) const = 0; + [[nodiscard]] virtual Expected + insertUnconditionalBranch(MachineBasicBlock &Block, MachineBasicBlock &TargetBlock, + MachineFunction &Function, const TargetDescription &Target) const = 0; + + [[nodiscard]] virtual Expected + instructionSize(const MachineInstr &Instruction, const MachineFunction &Function, + const TargetDescription &Target) const = 0; + [[nodiscard]] virtual Expected + branchTarget(MachineInstr &Instruction, MachineFunction &Function, + const TargetDescription &Target) const = 0; + [[nodiscard]] virtual Expected> + evaluateBranchCondition(const MachineInstr &, const MachineFunction &, + const TargetDescription &) const { + return std::optional{}; + } + [[nodiscard]] virtual bool isBranchOffsetInRange(const MachineInstr &Instruction, + std::int64_t Offset) const noexcept = 0; + [[nodiscard]] virtual Expected relaxBranch(MachineInstr &Instruction, std::int64_t Offset, + MachineFunction &Function, + const TargetDescription &Target) const = 0; +}; + +} // namespace rcc + +#endif // RCC_CODEGEN_TARGETINSTRINFO_H -- cgit v1.2.3