35class X86CodeGenPassBuilder
37 using Base = CodeGenPassBuilder<X86CodeGenPassBuilder, X86TargetMachine>;
40 explicit X86CodeGenPassBuilder(X86TargetMachine &TM,
41 const CGPassBuilderOption &Opts,
42 PassInstrumentationCallbacks *
PIC)
43 : CodeGenPassBuilder(TM, Opts,
PIC) {}
45 void addIRPasses(PassManagerWrapper &PMW)
const;
46 void addPreISel(PassManagerWrapper &PMW)
const;
47 Error addInstSelector(PassManagerWrapper &PMW)
const;
48 void addILPOpts(PassManagerWrapper &PMW)
const;
49 void addPreRegBankSelect(PassManagerWrapper &PMW)
const;
50 void addMachineSSAOptimization(PassManagerWrapper &PMW)
const;
51 void addPreRegAlloc(PassManagerWrapper &PMW)
const;
54 void addPostRegAlloc(PassManagerWrapper &PMW)
const;
55 void addPreSched2(PassManagerWrapper &PMW)
const;
56 void addPreEmitPass(PassManagerWrapper &PMW)
const;
57 void addPreEmitPass2(PassManagerWrapper &PMW)
const;
60 void addAsmPrinterBegin(PassManagerWrapper &PMW)
const;
61 void addAsmPrinter(PassManagerWrapper &PMW)
const;
62 void addAsmPrinterEnd(PassManagerWrapper &PMW)
const;
66 addFunctionPass(AtomicExpandPass(TM), PMW);
70 addFunctionPass(X86LowerAMXIntrinsicsPass(&TM), PMW);
71 addFunctionPass(X86LowerAMXTypePass(&TM), PMW);
73 Base::addIRPasses(PMW);
75 if (getOptLevel() != CodeGenOptLevel::None) {
76 addFunctionPass(InterleavedAccessPass(TM), PMW);
77 addFunctionPass(X86PartialReductionPass(&TM), PMW);
83 addFunctionPass(IndirectBrExpandPass(TM), PMW);
86 const Triple &
TT = TM.getTargetTriple();
88 addFunctionPass(CFGuardPass(), PMW);
90 if (TM.Options.JMCInstrument) {
92 addModulePass(JMCInstrumenterPass(), PMW);
96void X86CodeGenPassBuilder::addPreISel(PassManagerWrapper &PMW)
const {
98 const Triple &
TT = TM.getTargetTriple();
99 if (
TT.isOSWindows() &&
TT.isX86_32()) {
101 addModulePass(X86WinEHStatePass(), PMW);
105Error X86CodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW)
const {
106 addMachineFunctionPass(X86ISelDAGToDAGPass(TM), PMW);
109 if (TM.getTargetTriple().isOSBinFormatELF() &&
110 getOptLevel() != CodeGenOptLevel::None) {
111 addMachineFunctionPass(X86CleanupLocalDynamicTLSPass(), PMW);
114 addMachineFunctionPass(X86GlobalBaseRegPass(), PMW);
115 addMachineFunctionPass(X86ArgumentStackSlotPass(), PMW);
119void X86CodeGenPassBuilder::addILPOpts(PassManagerWrapper &PMW)
const {
120 addMachineFunctionPass(EarlyIfConverterPass(), PMW);
125 addMachineFunctionPass(X86CmovConversionPass(), PMW);
128void X86CodeGenPassBuilder::addPreRegBankSelect(PassManagerWrapper &PMW)
const {
129 addMachineFunctionPass(X86PostLegalizerCombinerPass(), PMW);
132void X86CodeGenPassBuilder::addMachineSSAOptimization(
133 PassManagerWrapper &PMW)
const {
134 addMachineFunctionPass(X86DomainReassignmentPass(), PMW);
135 Base::addMachineSSAOptimization(PMW);
138void X86CodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW)
const {
139 if (getOptLevel() != CodeGenOptLevel::None) {
140 addMachineFunctionPass(LiveRangeShrinkPass(), PMW);
141 addMachineFunctionPass(X86FixupSetCCPass(), PMW);
142 addMachineFunctionPass(X86CallFrameOptimizationPass(), PMW);
143 addMachineFunctionPass(X86AvoidStoreForwardingBlocksPass(), PMW);
146 addMachineFunctionPass(X86SuppressAPXForRelocationPass(), PMW);
147 addMachineFunctionPass(X86SpeculativeLoadHardeningPass(), PMW);
148 addMachineFunctionPass(X86FlagsCopyLoweringPass(), PMW);
149 addMachineFunctionPass(X86DynAllocaExpanderPass(), PMW);
151 if (getOptLevel() != CodeGenOptLevel::None)
152 addMachineFunctionPass(X86PreTileConfigPass(), PMW);
154 addMachineFunctionPass(X86FastPreTileConfigPass(), PMW);
157void X86CodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW)
const {
158 addMachineFunctionPass(X86LowerTileCopyPass(), PMW);
159 addMachineFunctionPass(X86FPStackifierPass(), PMW);
164 if (getOptLevel() != CodeGenOptLevel::None) {
165 addMachineFunctionPass(X86LoadValueInjectionLoadHardeningPass(), PMW);
169void X86CodeGenPassBuilder::addPreSched2(PassManagerWrapper &PMW)
const {
170 addMachineFunctionPass(X86ExpandPseudoPass(), PMW);
174void X86CodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW)
const {
175 if (getOptLevel() != CodeGenOptLevel::None) {
178 addMachineFunctionPass(BreakFalseDepsPass(), PMW);
181 addMachineFunctionPass(X86IndirectBranchTrackingPass(), PMW);
182 addMachineFunctionPass(X86InsertVZeroUpperPass(), PMW);
184 if (getOptLevel() != CodeGenOptLevel::None) {
185 addMachineFunctionPass(X86FixupBWInstsPass(), PMW);
188 addMachineFunctionPass(X86FixupLEAsPass(), PMW);
189 addMachineFunctionPass(X86FixupInstTuningPass(), PMW);
190 addMachineFunctionPass(X86FixupVectorConstantsPass(), PMW);
192 addMachineFunctionPass(X86CompressEVEXPass(), PMW);
193 addMachineFunctionPass(X86InsertX87WaitPass(), PMW);
196void X86CodeGenPassBuilder::addPreEmitPass2(PassManagerWrapper &PMW)
const {
197 const Triple &
TT = TM.getTargetTriple();
198 const MCAsmInfo *MAI = TM.getMCAsmInfo();
209 addMachineFunctionPass(X86SpeculativeExecutionSideEffectSuppressionPass(),
213 addMachineFunctionPass(X86ReturnThunksPass(), PMW);
217 if (
TT.isOSWindows() &&
TT.isX86_64())
218 addMachineFunctionPass(X86AvoidTrailingCallPass(), PMW);
223 if (!
TT.isOSDarwin() &&
224 (!
TT.isOSWindows() ||
230 if (
TT.isOSWindows()) {
239 addMachineFunctionPass(X86LoadValueInjectionRetHardeningPass(), PMW);
252 if (
TT.isOSWindows() &&
TT.isX86_64()) {
253 addMachineFunctionPass(X86WinEHUnwindV2Pass(), PMW);
257void X86CodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW)
const {
258 addModulePass(X86AsmPrinterBeginPass(), PMW,
true);
261void X86CodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW)
const {
262 addMachineFunctionPass(X86AsmPrinterPass(), PMW);
265void X86CodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW)
const {
266 addModulePass(X86AsmPrinterEndPass(), PMW,
true);
272#define GET_PASS_REGISTRY "X86PassRegistry.def"
278 "x86-asm-printer-begin");
281 "x86-asm-printer-end");
290 auto CGPB = X86CodeGenPassBuilder(*
this, Opt,
PIC);
291 return CGPB.buildPipeline(MPM,
MAM, Out, DwoOut, FileType, Ctx);
Interfaces for producing common pass manager configurations.
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.