36class X86CodeGenPassBuilder
38 using Base = CodeGenPassBuilder<X86CodeGenPassBuilder, X86TargetMachine>;
41 explicit X86CodeGenPassBuilder(X86TargetMachine &TM,
42 const CGPassBuilderOption &Opts,
43 PassInstrumentationCallbacks *
PIC)
44 : CodeGenPassBuilder(TM, Opts,
PIC) {}
46 void addIRPasses(PassManagerWrapper &PMW)
const;
47 void addPreISel(PassManagerWrapper &PMW)
const;
48 Error addInstSelector(PassManagerWrapper &PMW)
const;
49 void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
const;
50 void addILPOpts(PassManagerWrapper &PMW)
const;
51 void addPreRegBankSelect(PassManagerWrapper &PMW)
const;
52 void addMachineSSAOptimization(PassManagerWrapper &PMW)
const;
53 void addPreRegAlloc(PassManagerWrapper &PMW)
const;
56 void addPostRegAlloc(PassManagerWrapper &PMW)
const;
57 void addPreSched2(PassManagerWrapper &PMW)
const;
58 void addPreEmitPass(PassManagerWrapper &PMW)
const;
59 void addPreEmitPass2(PassManagerWrapper &PMW)
const;
62 void addAsmPrinterBegin(PassManagerWrapper &PMW)
const;
63 void addAsmPrinter(PassManagerWrapper &PMW)
const;
64 void addAsmPrinterEnd(PassManagerWrapper &PMW)
const;
68 addFunctionPass(AtomicExpandPass(TM), PMW);
72 addFunctionPass(X86LowerAMXIntrinsicsPass(&TM), PMW);
73 addFunctionPass(X86LowerAMXTypePass(&TM), PMW);
75 Base::addIRPasses(PMW);
77 if (getOptLevel() != CodeGenOptLevel::None) {
78 addFunctionPass(InterleavedAccessPass(TM), PMW);
79 addFunctionPass(X86PartialReductionPass(&TM), PMW);
85 addFunctionPass(IndirectBrExpandPass(TM), PMW);
88 const Triple &
TT = TM.getTargetTriple();
90 addFunctionPass(CFGuardPass(), PMW);
92 if (TM.Options.JMCInstrument) {
94 addModulePass(JMCInstrumenterPass(), PMW);
98void X86CodeGenPassBuilder::addPreISel(PassManagerWrapper &PMW)
const {
100 const Triple &
TT = TM.getTargetTriple();
101 if (
TT.isOSWindows() &&
TT.isX86_32()) {
103 addModulePass(X86WinEHStatePass(), PMW);
107Error X86CodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW)
const {
108 addMachineFunctionPass(X86ISelDAGToDAGPass(TM), PMW);
111 if (TM.getTargetTriple().isOSBinFormatELF() &&
112 getOptLevel() != CodeGenOptLevel::None) {
113 addMachineFunctionPass(X86CleanupLocalDynamicTLSPass(), PMW);
116 addMachineFunctionPass(X86GlobalBaseRegPass(), PMW);
117 addMachineFunctionPass(X86ArgumentStackSlotPass(), PMW);
121void X86CodeGenPassBuilder::addPreLegalizeMachineIR(
122 PassManagerWrapper &PMW)
const {
123 addMachineFunctionPass(X86PreLegalizerCombinerPass(), PMW);
126void X86CodeGenPassBuilder::addILPOpts(PassManagerWrapper &PMW)
const {
127 addMachineFunctionPass(EarlyIfConverterPass(), PMW);
132 addMachineFunctionPass(X86CmovConversionPass(), PMW);
135void X86CodeGenPassBuilder::addPreRegBankSelect(PassManagerWrapper &PMW)
const {
136 addMachineFunctionPass(X86PostLegalizerCombinerPass(), PMW);
139void X86CodeGenPassBuilder::addMachineSSAOptimization(
140 PassManagerWrapper &PMW)
const {
141 addMachineFunctionPass(X86DomainReassignmentPass(), PMW);
142 Base::addMachineSSAOptimization(PMW);
145void X86CodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW)
const {
146 if (getOptLevel() != CodeGenOptLevel::None) {
147 addMachineFunctionPass(LiveRangeShrinkPass(), PMW);
148 addMachineFunctionPass(X86FixupSetCCPass(), PMW);
149 addMachineFunctionPass(X86CallFrameOptimizationPass(), PMW);
150 addMachineFunctionPass(X86AvoidStoreForwardingBlocksPass(), PMW);
153 addMachineFunctionPass(X86SuppressAPXForRelocationPass(), PMW);
154 addMachineFunctionPass(X86SpeculativeLoadHardeningPass(), PMW);
155 addMachineFunctionPass(X86FlagsCopyLoweringPass(), PMW);
156 addMachineFunctionPass(X86DynAllocaExpanderPass(), PMW);
158 if (getOptLevel() != CodeGenOptLevel::None)
159 addMachineFunctionPass(X86PreTileConfigPass(), PMW);
161 addMachineFunctionPass(X86FastPreTileConfigPass(), PMW);
164void X86CodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW)
const {
165 addMachineFunctionPass(X86LowerTileCopyPass(), PMW);
166 addMachineFunctionPass(X86FPStackifierPass(), PMW);
171 if (getOptLevel() != CodeGenOptLevel::None) {
172 addMachineFunctionPass(X86LoadValueInjectionLoadHardeningPass(), PMW);
176void X86CodeGenPassBuilder::addPreSched2(PassManagerWrapper &PMW)
const {
177 addMachineFunctionPass(X86ExpandPseudoPass(), PMW);
178 addMachineFunctionPass(MachineKCFIPass(), PMW);
181void X86CodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW)
const {
182 if (getOptLevel() != CodeGenOptLevel::None) {
185 addMachineFunctionPass(BreakFalseDepsPass(), PMW);
188 addMachineFunctionPass(X86IndirectBranchTrackingPass(), PMW);
189 addMachineFunctionPass(X86InsertVZeroUpperPass(), PMW);
191 if (getOptLevel() != CodeGenOptLevel::None) {
192 addMachineFunctionPass(X86FixupBWInstsPass(), PMW);
195 addMachineFunctionPass(X86FixupLEAsPass(), PMW);
196 addMachineFunctionPass(X86FixupInstTuningPass(), PMW);
197 addMachineFunctionPass(X86FixupVectorConstantsPass(), PMW);
199 addMachineFunctionPass(X86CompressEVEXPass(), PMW);
200 addMachineFunctionPass(X86InsertX87WaitPass(), PMW);
203void X86CodeGenPassBuilder::addPreEmitPass2(PassManagerWrapper &PMW)
const {
204 const Triple &
TT = TM.getTargetTriple();
205 const MCAsmInfo &MAI = TM.getMCAsmInfo();
216 addMachineFunctionPass(X86SpeculativeExecutionSideEffectSuppressionPass(),
220 addMachineFunctionPass(X86ReturnThunksPass(), PMW);
224 if (
TT.isOSWindows() &&
TT.isX86_64())
225 addMachineFunctionPass(X86AvoidTrailingCallPass(), PMW);
230 if (!
TT.isOSDarwin() &&
231 (!
TT.isOSWindows() ||
237 if (
TT.isOSWindows()) {
246 addMachineFunctionPass(X86LoadValueInjectionRetHardeningPass(), PMW);
259 if (
TT.isOSWindows() &&
TT.isX86_64()) {
260 addMachineFunctionPass(X86WinEHUnwindV2Pass(), PMW);
264void X86CodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW)
const {
265 addModulePass(X86AsmPrinterBeginPass(), PMW,
true);
268void X86CodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW)
const {
269 addMachineFunctionPass(X86AsmPrinterPass(), PMW);
272void X86CodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW)
const {
273 addModulePass(X86AsmPrinterEndPass(), PMW,
true);
279#define GET_PASS_REGISTRY "X86PassRegistry.def"
285 "x86-asm-printer-begin");
288 "x86-asm-printer-end");
297 auto CGPB = X86CodeGenPassBuilder(*
this, Opt,
PIC);
298 return CGPB.buildPipeline(MPM,
MAM, Out, DwoOut, FileType, Ctx);
Interfaces for producing common pass manager configurations.
This file contains the declaration of the MachineKCFI class, which is a Machine Pass that implements ...
This file contains the declaration of the InterleavedAccessPass class, its corresponding pass name is...
ModuleAnalysisManager MAM
PassInstrumentationCallbacks PIC
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
cl::opt< bool > X86EnableMachineCombinerPass
This class provides access to building LLVM's passes.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
ExceptionHandling getExceptionHandlingType() const
Context object for machine code objects.
This class provides access to building LLVM's passes.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
void registerPassBuilderCallbacks(PassBuilder &PB) override
Allow the target to modify the pass pipeline.
Error buildCodeGenPipeline(ModulePassManager &MPM, ModuleAnalysisManager &MAM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut, CodeGenFileType FileType, const CGPassBuilderOption &Opt, MCContext &Ctx, PassInstrumentationCallbacks *PIC) override
An abstract base class for streams implementations that also support a pwrite operation.
Interfaces for registering analysis passes, producing common pass manager configurations,...
This is an optimization pass for GlobalISel generic memory operations.
CodeGenFileType
These enums are meant to be passed into addPassesToEmitFile to indicate what type of file to emit,...
PassManager< Module > ModulePassManager
Convenience typedef for a pass manager over modules.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.