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 addILPOpts(PassManagerWrapper &PMW)
const;
50 void addPreRegBankSelect(PassManagerWrapper &PMW)
const;
51 void addMachineSSAOptimization(PassManagerWrapper &PMW)
const;
52 void addPreRegAlloc(PassManagerWrapper &PMW)
const;
55 void addPostRegAlloc(PassManagerWrapper &PMW)
const;
56 void addPreSched2(PassManagerWrapper &PMW)
const;
57 void addPreEmitPass(PassManagerWrapper &PMW)
const;
58 void addPreEmitPass2(PassManagerWrapper &PMW)
const;
61 void addAsmPrinterBegin(PassManagerWrapper &PMW)
const;
62 void addAsmPrinter(PassManagerWrapper &PMW)
const;
63 void addAsmPrinterEnd(PassManagerWrapper &PMW)
const;
67 addFunctionPass(AtomicExpandPass(TM), PMW);
71 addFunctionPass(X86LowerAMXIntrinsicsPass(&TM), PMW);
72 addFunctionPass(X86LowerAMXTypePass(&TM), PMW);
74 Base::addIRPasses(PMW);
76 if (getOptLevel() != CodeGenOptLevel::None) {
77 addFunctionPass(InterleavedAccessPass(TM), PMW);
78 addFunctionPass(X86PartialReductionPass(&TM), PMW);
84 addFunctionPass(IndirectBrExpandPass(TM), PMW);
87 const Triple &
TT = TM.getTargetTriple();
89 addFunctionPass(CFGuardPass(), PMW);
91 if (TM.Options.JMCInstrument) {
93 addModulePass(JMCInstrumenterPass(), PMW);
97void X86CodeGenPassBuilder::addPreISel(PassManagerWrapper &PMW)
const {
99 const Triple &
TT = TM.getTargetTriple();
100 if (
TT.isOSWindows() &&
TT.isX86_32()) {
102 addModulePass(X86WinEHStatePass(), PMW);
106Error X86CodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW)
const {
107 addMachineFunctionPass(X86ISelDAGToDAGPass(TM), PMW);
110 if (TM.getTargetTriple().isOSBinFormatELF() &&
111 getOptLevel() != CodeGenOptLevel::None) {
112 addMachineFunctionPass(X86CleanupLocalDynamicTLSPass(), PMW);
115 addMachineFunctionPass(X86GlobalBaseRegPass(), PMW);
116 addMachineFunctionPass(X86ArgumentStackSlotPass(), PMW);
120void X86CodeGenPassBuilder::addILPOpts(PassManagerWrapper &PMW)
const {
121 addMachineFunctionPass(EarlyIfConverterPass(), PMW);
126 addMachineFunctionPass(X86CmovConversionPass(), PMW);
129void X86CodeGenPassBuilder::addPreRegBankSelect(PassManagerWrapper &PMW)
const {
130 addMachineFunctionPass(X86PostLegalizerCombinerPass(), PMW);
133void X86CodeGenPassBuilder::addMachineSSAOptimization(
134 PassManagerWrapper &PMW)
const {
135 addMachineFunctionPass(X86DomainReassignmentPass(), PMW);
136 Base::addMachineSSAOptimization(PMW);
139void X86CodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW)
const {
140 if (getOptLevel() != CodeGenOptLevel::None) {
141 addMachineFunctionPass(LiveRangeShrinkPass(), PMW);
142 addMachineFunctionPass(X86FixupSetCCPass(), PMW);
143 addMachineFunctionPass(X86CallFrameOptimizationPass(), PMW);
144 addMachineFunctionPass(X86AvoidStoreForwardingBlocksPass(), PMW);
147 addMachineFunctionPass(X86SuppressAPXForRelocationPass(), PMW);
148 addMachineFunctionPass(X86SpeculativeLoadHardeningPass(), PMW);
149 addMachineFunctionPass(X86FlagsCopyLoweringPass(), PMW);
150 addMachineFunctionPass(X86DynAllocaExpanderPass(), PMW);
152 if (getOptLevel() != CodeGenOptLevel::None)
153 addMachineFunctionPass(X86PreTileConfigPass(), PMW);
155 addMachineFunctionPass(X86FastPreTileConfigPass(), PMW);
158void X86CodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW)
const {
159 addMachineFunctionPass(X86LowerTileCopyPass(), PMW);
160 addMachineFunctionPass(X86FPStackifierPass(), PMW);
165 if (getOptLevel() != CodeGenOptLevel::None) {
166 addMachineFunctionPass(X86LoadValueInjectionLoadHardeningPass(), PMW);
170void X86CodeGenPassBuilder::addPreSched2(PassManagerWrapper &PMW)
const {
171 addMachineFunctionPass(X86ExpandPseudoPass(), PMW);
172 addMachineFunctionPass(MachineKCFIPass(), PMW);
175void X86CodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW)
const {
176 if (getOptLevel() != CodeGenOptLevel::None) {
179 addMachineFunctionPass(BreakFalseDepsPass(), PMW);
182 addMachineFunctionPass(X86IndirectBranchTrackingPass(), PMW);
183 addMachineFunctionPass(X86InsertVZeroUpperPass(), PMW);
185 if (getOptLevel() != CodeGenOptLevel::None) {
186 addMachineFunctionPass(X86FixupBWInstsPass(), PMW);
189 addMachineFunctionPass(X86FixupLEAsPass(), PMW);
190 addMachineFunctionPass(X86FixupInstTuningPass(), PMW);
191 addMachineFunctionPass(X86FixupVectorConstantsPass(), PMW);
193 addMachineFunctionPass(X86CompressEVEXPass(), PMW);
194 addMachineFunctionPass(X86InsertX87WaitPass(), PMW);
197void X86CodeGenPassBuilder::addPreEmitPass2(PassManagerWrapper &PMW)
const {
198 const Triple &
TT = TM.getTargetTriple();
199 const MCAsmInfo *MAI = TM.getMCAsmInfo();
210 addMachineFunctionPass(X86SpeculativeExecutionSideEffectSuppressionPass(),
214 addMachineFunctionPass(X86ReturnThunksPass(), PMW);
218 if (
TT.isOSWindows() &&
TT.isX86_64())
219 addMachineFunctionPass(X86AvoidTrailingCallPass(), PMW);
224 if (!
TT.isOSDarwin() &&
225 (!
TT.isOSWindows() ||
231 if (
TT.isOSWindows()) {
240 addMachineFunctionPass(X86LoadValueInjectionRetHardeningPass(), PMW);
253 if (
TT.isOSWindows() &&
TT.isX86_64()) {
254 addMachineFunctionPass(X86WinEHUnwindV2Pass(), PMW);
258void X86CodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW)
const {
259 addModulePass(X86AsmPrinterBeginPass(), PMW,
true);
262void X86CodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW)
const {
263 addMachineFunctionPass(X86AsmPrinterPass(), PMW);
266void X86CodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW)
const {
267 addModulePass(X86AsmPrinterEndPass(), PMW,
true);
273#define GET_PASS_REGISTRY "X86PassRegistry.def"
279 "x86-asm-printer-begin");
282 "x86-asm-printer-end");
291 auto CGPB = X86CodeGenPassBuilder(*
this, Opt,
PIC);
292 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.