Skip to content

Commit dd4b40f

Browse files
authored
[CodeGen] Let CodeGenPassBuilder know concrete target machine (#88614)
Many backends passes accept only `<Target>TargetMachine`, this can avoid cast to derived type.
1 parent 8e4b089 commit dd4b40f

File tree

2 files changed

+59
-53
lines changed

2 files changed

+59
-53
lines changed

llvm/include/llvm/Passes/CodeGenPassBuilder.h

Lines changed: 56 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,9 @@ namespace llvm {
109109
/// construction. The \c MachinePassRegistry.def file specifies how to construct
110110
/// all of the built-in passes, and those may reference these members during
111111
/// construction.
112-
template <typename DerivedT> class CodeGenPassBuilder {
112+
template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
113113
public:
114-
explicit CodeGenPassBuilder(LLVMTargetMachine &TM,
114+
explicit CodeGenPassBuilder(TargetMachineT &TM,
115115
const CGPassBuilderOption &Opts,
116116
PassInstrumentationCallbacks *PIC)
117117
: TM(TM), Opt(Opts), PIC(PIC) {
@@ -237,7 +237,7 @@ template <typename DerivedT> class CodeGenPassBuilder {
237237
const DerivedT &PB;
238238
};
239239

240-
LLVMTargetMachine &TM;
240+
TargetMachineT &TM;
241241
CGPassBuilderOption Opt;
242242
PassInstrumentationCallbacks *PIC;
243243

@@ -498,8 +498,8 @@ template <typename DerivedT> class CodeGenPassBuilder {
498498
mutable bool Stopped = true;
499499
};
500500

501-
template <typename Derived>
502-
Error CodeGenPassBuilder<Derived>::buildPipeline(
501+
template <typename Derived, typename TargetMachineT>
502+
Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
503503
ModulePassManager &MPM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
504504
CodeGenFileType FileType) const {
505505
auto StartStopInfo = TargetPassConfig::getStartStopInfo(*PIC);
@@ -542,8 +542,8 @@ Error CodeGenPassBuilder<Derived>::buildPipeline(
542542
return verifyStartStop(*StartStopInfo);
543543
}
544544

545-
template <typename Derived>
546-
void CodeGenPassBuilder<Derived>::setStartStopPasses(
545+
template <typename Derived, typename TargetMachineT>
546+
void CodeGenPassBuilder<Derived, TargetMachineT>::setStartStopPasses(
547547
const TargetPassConfig::StartStopInfo &Info) const {
548548
if (!Info.StartPass.empty()) {
549549
Started = false;
@@ -585,8 +585,8 @@ void CodeGenPassBuilder<Derived>::setStartStopPasses(
585585
}
586586
}
587587

588-
template <typename Derived>
589-
Error CodeGenPassBuilder<Derived>::verifyStartStop(
588+
template <typename Derived, typename TargetMachineT>
589+
Error CodeGenPassBuilder<Derived, TargetMachineT>::verifyStartStop(
590590
const TargetPassConfig::StartStopInfo &Info) const {
591591
if (Started && Stopped)
592592
return Error::success();
@@ -604,8 +604,9 @@ Error CodeGenPassBuilder<Derived>::verifyStartStop(
604604
return Error::success();
605605
}
606606

607-
template <typename Derived>
608-
void CodeGenPassBuilder<Derived>::addISelPasses(AddIRPass &addPass) const {
607+
template <typename Derived, typename TargetMachineT>
608+
void CodeGenPassBuilder<Derived, TargetMachineT>::addISelPasses(
609+
AddIRPass &addPass) const {
609610
derived().addGlobalMergePass(addPass);
610611
if (TM.useEmulatedTLS())
611612
addPass(LowerEmuTLSPass());
@@ -620,8 +621,9 @@ void CodeGenPassBuilder<Derived>::addISelPasses(AddIRPass &addPass) const {
620621

621622
/// Add common target configurable passes that perform LLVM IR to IR transforms
622623
/// following machine independent optimization.
623-
template <typename Derived>
624-
void CodeGenPassBuilder<Derived>::addIRPasses(AddIRPass &addPass) const {
624+
template <typename Derived, typename TargetMachineT>
625+
void CodeGenPassBuilder<Derived, TargetMachineT>::addIRPasses(
626+
AddIRPass &addPass) const {
625627
// Before running any passes, run the verifier to determine if the input
626628
// coming from the front-end and/or optimizer is valid.
627629
if (!Opt.DisableVerify)
@@ -686,8 +688,8 @@ void CodeGenPassBuilder<Derived>::addIRPasses(AddIRPass &addPass) const {
686688

687689
/// Turn exception handling constructs into something the code generators can
688690
/// handle.
689-
template <typename Derived>
690-
void CodeGenPassBuilder<Derived>::addPassesToHandleExceptions(
691+
template <typename Derived, typename TargetMachineT>
692+
void CodeGenPassBuilder<Derived, TargetMachineT>::addPassesToHandleExceptions(
691693
AddIRPass &addPass) const {
692694
const MCAsmInfo *MCAI = TM.getMCAsmInfo();
693695
assert(MCAI && "No MCAsmInfo");
@@ -733,8 +735,9 @@ void CodeGenPassBuilder<Derived>::addPassesToHandleExceptions(
733735

734736
/// Add pass to prepare the LLVM IR for code generation. This should be done
735737
/// before exception handling preparation passes.
736-
template <typename Derived>
737-
void CodeGenPassBuilder<Derived>::addCodeGenPrepare(AddIRPass &addPass) const {
738+
template <typename Derived, typename TargetMachineT>
739+
void CodeGenPassBuilder<Derived, TargetMachineT>::addCodeGenPrepare(
740+
AddIRPass &addPass) const {
738741
if (getOptLevel() != CodeGenOptLevel::None && !Opt.DisableCGP)
739742
addPass(CodeGenPreparePass(&TM));
740743
// TODO: Default ctor'd RewriteSymbolPass is no-op.
@@ -743,8 +746,9 @@ void CodeGenPassBuilder<Derived>::addCodeGenPrepare(AddIRPass &addPass) const {
743746

744747
/// Add common passes that perform LLVM IR to IR transforms in preparation for
745748
/// instruction selection.
746-
template <typename Derived>
747-
void CodeGenPassBuilder<Derived>::addISelPrepare(AddIRPass &addPass) const {
749+
template <typename Derived, typename TargetMachineT>
750+
void CodeGenPassBuilder<Derived, TargetMachineT>::addISelPrepare(
751+
AddIRPass &addPass) const {
748752
derived().addPreISel(addPass);
749753

750754
addPass(CallBrPreparePass());
@@ -763,8 +767,8 @@ void CodeGenPassBuilder<Derived>::addISelPrepare(AddIRPass &addPass) const {
763767
addPass(VerifierPass());
764768
}
765769

766-
template <typename Derived>
767-
Error CodeGenPassBuilder<Derived>::addCoreISelPasses(
770+
template <typename Derived, typename TargetMachineT>
771+
Error CodeGenPassBuilder<Derived, TargetMachineT>::addCoreISelPasses(
768772
AddMachinePass &addPass) const {
769773
// Enable FastISel with -fast-isel, but allow that to be overridden.
770774
TM.setO0WantsFastISel(Opt.EnableFastISelOption.value_or(true));
@@ -846,17 +850,18 @@ Error CodeGenPassBuilder<Derived>::addCoreISelPasses(
846850
/// with nontrivial configuration or multiple passes are broken out below in
847851
/// add%Stage routines.
848852
///
849-
/// Any CodeGenPassBuilder<Derived>::addXX routine may be overriden by the
850-
/// Target. The addPre/Post methods with empty header implementations allow
851-
/// injecting target-specific fixups just before or after major stages.
852-
/// Additionally, targets have the flexibility to change pass order within a
853-
/// stage by overriding default implementation of add%Stage routines below. Each
854-
/// technique has maintainability tradeoffs because alternate pass orders are
855-
/// not well supported. addPre/Post works better if the target pass is easily
856-
/// tied to a common pass. But if it has subtle dependencies on multiple passes,
857-
/// the target should override the stage instead.
858-
template <typename Derived>
859-
Error CodeGenPassBuilder<Derived>::addMachinePasses(
853+
/// Any CodeGenPassBuilder<Derived, TargetMachine>::addXX routine may be
854+
/// overriden by the Target. The addPre/Post methods with empty header
855+
/// implementations allow injecting target-specific fixups just before or after
856+
/// major stages. Additionally, targets have the flexibility to change pass
857+
/// order within a stage by overriding default implementation of add%Stage
858+
/// routines below. Each technique has maintainability tradeoffs because
859+
/// alternate pass orders are not well supported. addPre/Post works better if
860+
/// the target pass is easily tied to a common pass. But if it has subtle
861+
/// dependencies on multiple passes, the target should override the stage
862+
/// instead.
863+
template <typename Derived, typename TargetMachineT>
864+
Error CodeGenPassBuilder<Derived, TargetMachineT>::addMachinePasses(
860865
AddMachinePass &addPass) const {
861866
// Add passes that optimize machine instructions in SSA form.
862867
if (getOptLevel() != CodeGenOptLevel::None) {
@@ -962,8 +967,8 @@ Error CodeGenPassBuilder<Derived>::addMachinePasses(
962967
}
963968

964969
/// Add passes that optimize machine instructions in SSA form.
965-
template <typename Derived>
966-
void CodeGenPassBuilder<Derived>::addMachineSSAOptimization(
970+
template <typename Derived, typename TargetMachineT>
971+
void CodeGenPassBuilder<Derived, TargetMachineT>::addMachineSSAOptimization(
967972
AddMachinePass &addPass) const {
968973
// Pre-ra tail duplication.
969974
addPass(EarlyTailDuplicatePass());
@@ -1014,8 +1019,8 @@ void CodeGenPassBuilder<Derived>::addMachineSSAOptimization(
10141019
/// A target that uses the standard regalloc pass order for fast or optimized
10151020
/// allocation may still override this for per-target regalloc
10161021
/// selection. But -regalloc=... always takes precedence.
1017-
template <typename Derived>
1018-
void CodeGenPassBuilder<Derived>::addTargetRegisterAllocator(
1022+
template <typename Derived, typename TargetMachineT>
1023+
void CodeGenPassBuilder<Derived, TargetMachineT>::addTargetRegisterAllocator(
10191024
AddMachinePass &addPass, bool Optimized) const {
10201025
if (Optimized)
10211026
addPass(RAGreedyPass());
@@ -1026,22 +1031,22 @@ void CodeGenPassBuilder<Derived>::addTargetRegisterAllocator(
10261031
/// Find and instantiate the register allocation pass requested by this target
10271032
/// at the current optimization level. Different register allocators are
10281033
/// defined as separate passes because they may require different analysis.
1029-
template <typename Derived>
1030-
void CodeGenPassBuilder<Derived>::addRegAllocPass(AddMachinePass &addPass,
1031-
bool Optimized) const {
1034+
template <typename Derived, typename TargetMachineT>
1035+
void CodeGenPassBuilder<Derived, TargetMachineT>::addRegAllocPass(
1036+
AddMachinePass &addPass, bool Optimized) const {
10321037
// TODO: Parse Opt.RegAlloc to add register allocator.
10331038
}
10341039

1035-
template <typename Derived>
1036-
Error CodeGenPassBuilder<Derived>::addRegAssignmentFast(
1040+
template <typename Derived, typename TargetMachineT>
1041+
Error CodeGenPassBuilder<Derived, TargetMachineT>::addRegAssignmentFast(
10371042
AddMachinePass &addPass) const {
10381043
// TODO: Ensure allocator is default or fast.
10391044
addRegAllocPass(addPass, false);
10401045
return Error::success();
10411046
}
10421047

1043-
template <typename Derived>
1044-
Error CodeGenPassBuilder<Derived>::addRegAssignmentOptimized(
1048+
template <typename Derived, typename TargetMachineT>
1049+
Error CodeGenPassBuilder<Derived, TargetMachineT>::addRegAssignmentOptimized(
10451050
AddMachinePass &addPass) const {
10461051
// Add the selected register allocation pass.
10471052
addRegAllocPass(addPass, true);
@@ -1062,8 +1067,8 @@ Error CodeGenPassBuilder<Derived>::addRegAssignmentOptimized(
10621067

10631068
/// Add the minimum set of target-independent passes that are required for
10641069
/// register allocation. No coalescing or scheduling.
1065-
template <typename Derived>
1066-
Error CodeGenPassBuilder<Derived>::addFastRegAlloc(
1070+
template <typename Derived, typename TargetMachineT>
1071+
Error CodeGenPassBuilder<Derived, TargetMachineT>::addFastRegAlloc(
10671072
AddMachinePass &addPass) const {
10681073
addPass(PHIEliminationPass());
10691074
addPass(TwoAddressInstructionPass());
@@ -1073,8 +1078,8 @@ Error CodeGenPassBuilder<Derived>::addFastRegAlloc(
10731078
/// Add standard target-independent passes that are tightly coupled with
10741079
/// optimized register allocation, including coalescing, machine instruction
10751080
/// scheduling, and register allocation itself.
1076-
template <typename Derived>
1077-
void CodeGenPassBuilder<Derived>::addOptimizedRegAlloc(
1081+
template <typename Derived, typename TargetMachineT>
1082+
void CodeGenPassBuilder<Derived, TargetMachineT>::addOptimizedRegAlloc(
10781083
AddMachinePass &addPass) const {
10791084
addPass(DetectDeadLanesPass());
10801085

@@ -1121,8 +1126,8 @@ void CodeGenPassBuilder<Derived>::addOptimizedRegAlloc(
11211126
//===---------------------------------------------------------------------===//
11221127

11231128
/// Add passes that optimize machine instructions after register allocation.
1124-
template <typename Derived>
1125-
void CodeGenPassBuilder<Derived>::addMachineLateOptimization(
1129+
template <typename Derived, typename TargetMachineT>
1130+
void CodeGenPassBuilder<Derived, TargetMachineT>::addMachineLateOptimization(
11261131
AddMachinePass &addPass) const {
11271132
// Branch folding must be run after regalloc and prolog/epilog insertion.
11281133
addPass(BranchFolderPass());
@@ -1142,8 +1147,8 @@ void CodeGenPassBuilder<Derived>::addMachineLateOptimization(
11421147
}
11431148

11441149
/// Add standard basic block placement passes.
1145-
template <typename Derived>
1146-
void CodeGenPassBuilder<Derived>::addBlockPlacement(
1150+
template <typename Derived, typename TargetMachineT>
1151+
void CodeGenPassBuilder<Derived, TargetMachineT>::addBlockPlacement(
11471152
AddMachinePass &addPass) const {
11481153
addPass(MachineBlockPlacementPass());
11491154
// Run a separate pass to collect block placement statistics.

llvm/lib/Target/X86/X86CodeGenPassBuilder.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@ using namespace llvm;
1919

2020
namespace {
2121

22-
class X86CodeGenPassBuilder : public CodeGenPassBuilder<X86CodeGenPassBuilder> {
22+
class X86CodeGenPassBuilder
23+
: public CodeGenPassBuilder<X86CodeGenPassBuilder, X86TargetMachine> {
2324
public:
24-
explicit X86CodeGenPassBuilder(LLVMTargetMachine &TM,
25+
explicit X86CodeGenPassBuilder(X86TargetMachine &TM,
2526
const CGPassBuilderOption &Opts,
2627
PassInstrumentationCallbacks *PIC)
2728
: CodeGenPassBuilder(TM, Opts, PIC) {}

0 commit comments

Comments
 (0)