37class X86CodeGenPassBuilder
39 using Base = CodeGenPassBuilder<X86CodeGenPassBuilder, X86TargetMachine>;
42 explicit X86CodeGenPassBuilder(X86TargetMachine &TM,
43 const CGPassBuilderOption &Opts,
44 PassInstrumentationCallbacks *
PIC)
45 : CodeGenPassBuilder(TM, Opts,
PIC) {}
47 void addIRPasses(PassManagerWrapper &PMW)
const;
48 void addPreISel(PassManagerWrapper &PMW)
const;
49 Error addInstSelector(PassManagerWrapper &PMW)
const;
50 void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
const;
51 void addILPOpts(PassManagerWrapper &PMW)
const;
52 void addPreRegBankSelect(PassManagerWrapper &PMW)
const;
53 void addMachineSSAOptimization(PassManagerWrapper &PMW)
const;
54 void addPreRegAlloc(PassManagerWrapper &PMW)
const;
57 void addPostRegAlloc(PassManagerWrapper &PMW)
const;
58 void addPreSched2(PassManagerWrapper &PMW)
const;
59 void addPreEmitPass(PassManagerWrapper &PMW)
const;
60 void addPreEmitPass2(PassManagerWrapper &PMW)
const;
63 void addAsmPrinterBegin(PassManagerWrapper &PMW)
const;
64 void addAsmPrinter(PassManagerWrapper &PMW)
const;
65 void addAsmPrinterEnd(PassManagerWrapper &PMW)
const;
69 addFunctionPass(AtomicExpandPass(TM), PMW);
73 addFunctionPass(X86LowerAMXIntrinsicsPass(&TM), PMW);
74 addFunctionPass(X86LowerAMXTypePass(&TM), PMW);
76 Base::addIRPasses(PMW);
78 if (getOptLevel() != CodeGenOptLevel::None) {
79 addFunctionPass(InterleavedAccessPass(TM), PMW);
80 addFunctionPass(X86PartialReductionPass(&TM), PMW);
86 addFunctionPass(IndirectBrExpandPass(TM), PMW);
89 const Triple &
TT = TM.getTargetTriple();
91 addFunctionPass(CFGuardPass(), PMW);
93 if (TM.Options.JMCInstrument) {
95 addModulePass(JMCInstrumenterPass(), PMW);
99void X86CodeGenPassBuilder::addPreISel(PassManagerWrapper &PMW)
const {
101 const Triple &
TT = TM.getTargetTriple();
102 if (
TT.isOSWindows() &&
TT.isX86_32()) {
104 addModulePass(X86WinEHStatePass(), PMW);
108Error X86CodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW)
const {
109 addMachineFunctionPass(X86ISelDAGToDAGPass(TM), PMW);
112 if (TM.getTargetTriple().isOSBinFormatELF() &&
113 getOptLevel() != CodeGenOptLevel::None) {
114 addMachineFunctionPass(X86CleanupLocalDynamicTLSPass(), PMW);
117 addMachineFunctionPass(X86GlobalBaseRegPass(), PMW);
118 addMachineFunctionPass(X86ArgumentStackSlotPass(), PMW);
122void X86CodeGenPassBuilder::addPreLegalizeMachineIR(
123 PassManagerWrapper &PMW)
const {
124 addMachineFunctionPass(X86PreLegalizerCombinerPass(), PMW);
127void X86CodeGenPassBuilder::addILPOpts(PassManagerWrapper &PMW)
const {
128 addMachineFunctionPass(EarlyIfConverterPass(), PMW);
133 addMachineFunctionPass(X86CmovConversionPass(), PMW);
136void X86CodeGenPassBuilder::addPreRegBankSelect(PassManagerWrapper &PMW)
const {
137 addMachineFunctionPass(X86PostLegalizerCombinerPass(), PMW);
140void X86CodeGenPassBuilder::addMachineSSAOptimization(
141 PassManagerWrapper &PMW)
const {
142 addMachineFunctionPass(X86DomainReassignmentPass(), PMW);
143 Base::addMachineSSAOptimization(PMW);
146void X86CodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW)
const {
147 if (getOptLevel() != CodeGenOptLevel::None) {
148 addMachineFunctionPass(LiveRangeShrinkPass(), PMW);
149 addMachineFunctionPass(X86FixupSetCCPass(), PMW);
150 addMachineFunctionPass(X86CallFrameOptimizationPass(), PMW);
151 addMachineFunctionPass(X86AvoidStoreForwardingBlocksPass(), PMW);
154 addMachineFunctionPass(X86SuppressAPXForRelocationPass(), PMW);
155 addMachineFunctionPass(X86SpeculativeLoadHardeningPass(), PMW);
156 addMachineFunctionPass(X86FlagsCopyLoweringPass(), PMW);
157 addMachineFunctionPass(X86DynAllocaExpanderPass(), PMW);
159 if (getOptLevel() != CodeGenOptLevel::None)
160 addMachineFunctionPass(X86PreTileConfigPass(), PMW);
162 addMachineFunctionPass(X86FastPreTileConfigPass(), PMW);
165void X86CodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW)
const {
166 addMachineFunctionPass(X86LowerTileCopyPass(), PMW);
167 addMachineFunctionPass(X86FPStackifierPass(), PMW);
172 if (getOptLevel() != CodeGenOptLevel::None) {
173 addMachineFunctionPass(X86LoadValueInjectionLoadHardeningPass(), PMW);
177void X86CodeGenPassBuilder::addPreSched2(PassManagerWrapper &PMW)
const {
178 addMachineFunctionPass(X86ExpandPseudoPass(), PMW);
179 addMachineFunctionPass(MachineKCFIPass(), PMW);
182void X86CodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW)
const {
183 if (getOptLevel() != CodeGenOptLevel::None) {
186 addMachineFunctionPass(BreakFalseDepsPass(), PMW);
189 addMachineFunctionPass(X86IndirectBranchTrackingPass(), PMW);
190 addMachineFunctionPass(X86InsertVZeroUpperPass(), PMW);
192 if (getOptLevel() != CodeGenOptLevel::None) {
193 addMachineFunctionPass(X86FixupBWInstsPass(), PMW);
196 addMachineFunctionPass(X86FixupLEAsPass(), PMW);
197 addMachineFunctionPass(X86FixupInstTuningPass(), PMW);
198 addMachineFunctionPass(X86FixupVectorConstantsPass(), PMW);
200 addMachineFunctionPass(X86CompressEVEXPass(), PMW);
201 addMachineFunctionPass(X86InsertX87WaitPass(), PMW);
204void X86CodeGenPassBuilder::addPreEmitPass2(PassManagerWrapper &PMW)
const {
205 const Triple &
TT = TM.getTargetTriple();
206 const MCAsmInfo &MAI = TM.getMCAsmInfo();
217 addMachineFunctionPass(X86SpeculativeExecutionSideEffectSuppressionPass(),
221 addMachineFunctionPass(X86ReturnThunksPass(), PMW);
225 if (
TT.isOSWindows() &&
TT.isX86_64())
226 addMachineFunctionPass(X86AvoidTrailingCallPass(), PMW);
231 if (!
TT.isOSDarwin() &&
232 (!
TT.isOSWindows() ||
238 if (
TT.isOSWindows()) {
247 addMachineFunctionPass(X86LoadValueInjectionRetHardeningPass(), PMW);
260 if (
TT.isOSWindows() &&
TT.isX86_64()) {
261 addMachineFunctionPass(X86WinEHUnwindV2Pass(), PMW);
265void X86CodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW)
const {
266 addModulePass(X86AsmPrinterBeginPass(), PMW,
true);
269void X86CodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW)
const {
270 addMachineFunctionPass(X86AsmPrinterPass(), PMW);
273void X86CodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW)
const {
274 addModulePass(X86AsmPrinterEndPass(), PMW,
true);
280#define GET_PASS_REGISTRY "X86PassRegistry.def"
286 "x86-asm-printer-begin");
289 "x86-asm-printer-end");
298 auto CGPB = X86CodeGenPassBuilder(*
this, Opt,
PIC);
299 return CGPB.buildPipeline(MPM,
MAM, Out, DwoOut, FileType, Ctx);
This file contains the declaration of the BreakFalseDepsPass class, used to identify and avoid false ...
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.