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,
62 void addAsmPrinter(PassManagerWrapper &PMW,
64 void addAsmPrinterEnd(PassManagerWrapper &PMW,
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(
TT.isX86_64() ? CFGuardPass::Mechanism::Dispatch
92 : CFGuardPass::Mechanism::Check),
95 if (TM.Options.JMCInstrument) {
97 addModulePass(JMCInstrumenterPass(), PMW);
101void X86CodeGenPassBuilder::addPreISel(PassManagerWrapper &PMW)
const {
103 const Triple &
TT = TM.getTargetTriple();
104 if (
TT.isOSWindows() &&
TT.isX86_32()) {
106 addModulePass(X86WinEHStatePass(), PMW);
110Error X86CodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW)
const {
111 addMachineFunctionPass(X86ISelDAGToDAGPass(TM), PMW);
114 if (TM.getTargetTriple().isOSBinFormatELF() &&
115 getOptLevel() != CodeGenOptLevel::None) {
116 addMachineFunctionPass(X86CleanupLocalDynamicTLSPass(), PMW);
119 addMachineFunctionPass(X86GlobalBaseRegPass(), PMW);
120 addMachineFunctionPass(X86ArgumentStackSlotPass(), PMW);
124void X86CodeGenPassBuilder::addILPOpts(PassManagerWrapper &PMW)
const {
125 addMachineFunctionPass(EarlyIfConverterPass(), PMW);
130 addMachineFunctionPass(X86CmovConversionPass(), PMW);
133void X86CodeGenPassBuilder::addPreRegBankSelect(PassManagerWrapper &PMW)
const {
134 addMachineFunctionPass(X86PostLegalizerCombinerPass(), PMW);
137void X86CodeGenPassBuilder::addMachineSSAOptimization(
138 PassManagerWrapper &PMW)
const {
139 addMachineFunctionPass(X86DomainReassignmentPass(), PMW);
140 Base::addMachineSSAOptimization(PMW);
143void X86CodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW)
const {
144 if (getOptLevel() != CodeGenOptLevel::None) {
145 addMachineFunctionPass(LiveRangeShrinkPass(), PMW);
146 addMachineFunctionPass(X86FixupSetCCPass(), PMW);
147 addMachineFunctionPass(X86CallFrameOptimizationPass(), PMW);
148 addMachineFunctionPass(X86AvoidStoreForwardingBlocksPass(), PMW);
151 addMachineFunctionPass(X86SuppressAPXForRelocationPass(), PMW);
152 addMachineFunctionPass(X86SpeculativeLoadHardeningPass(), PMW);
153 addMachineFunctionPass(X86FlagsCopyLoweringPass(), PMW);
154 addMachineFunctionPass(X86DynAllocaExpanderPass(), PMW);
156 if (getOptLevel() != CodeGenOptLevel::None)
157 addMachineFunctionPass(X86PreTileConfigPass(), PMW);
159 addMachineFunctionPass(X86FastPreTileConfigPass(), PMW);
162void X86CodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW)
const {
163 addMachineFunctionPass(X86LowerTileCopyPass(), PMW);
164 addMachineFunctionPass(X86FPStackifierPass(), PMW);
169 if (getOptLevel() != CodeGenOptLevel::None) {
170 addMachineFunctionPass(X86LoadValueInjectionLoadHardeningPass(), PMW);
174void X86CodeGenPassBuilder::addPreSched2(PassManagerWrapper &PMW)
const {
175 addMachineFunctionPass(X86ExpandPseudoPass(), PMW);
179void X86CodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW)
const {
180 if (getOptLevel() != CodeGenOptLevel::None) {
183 addMachineFunctionPass(BreakFalseDepsPass(), PMW);
186 addMachineFunctionPass(X86IndirectBranchTrackingPass(), PMW);
190 if (getOptLevel() != CodeGenOptLevel::None) {
191 addMachineFunctionPass(X86FixupBWInstsPass(), PMW);
194 addMachineFunctionPass(X86FixupLEAsPass(), PMW);
195 addMachineFunctionPass(X86FixupInstTuningPass(), PMW);
196 addMachineFunctionPass(X86FixupVectorConstantsPass(), PMW);
198 addMachineFunctionPass(X86CompressEVEXPass(), PMW);
199 addMachineFunctionPass(X86InsertX87WaitPass(), PMW);
202void X86CodeGenPassBuilder::addPreEmitPass2(PassManagerWrapper &PMW)
const {
203 const Triple &
TT = TM.getTargetTriple();
204 const MCAsmInfo *MAI = TM.getMCAsmInfo();
215 addMachineFunctionPass(X86SpeculativeExecutionSideEffectSuppressionPass(),
219 addMachineFunctionPass(X86ReturnThunksPass(), PMW);
223 if (
TT.isOSWindows() &&
TT.isX86_64())
224 addMachineFunctionPass(X86AvoidTrailingCallPass(), PMW);
229 if (!
TT.isOSDarwin() &&
230 (!
TT.isOSWindows() ||
236 if (
TT.isOSWindows()) {
245 addMachineFunctionPass(X86LoadValueInjectionRetHardeningPass(), PMW);
258 if (
TT.isOSWindows() &&
TT.isX86_64()) {
259 addMachineFunctionPass(X86WinEHUnwindV2Pass(), PMW);
263void X86CodeGenPassBuilder::addAsmPrinterBegin(
265 addModulePass(X86AsmPrinterBeginPass(TM, CreateStreamer), PMW,
269void X86CodeGenPassBuilder::addAsmPrinter(
271 addMachineFunctionPass(X86AsmPrinterPass(TM, CreateStreamer), PMW);
274void X86CodeGenPassBuilder::addAsmPrinterEnd(
276 addModulePass(X86AsmPrinterEndPass(TM, CreateStreamer), PMW,
true);
282#define GET_PASS_REGISTRY "X86PassRegistry.def"
288 "x86-asm-printer-begin");
291 "x86-asm-printer-end");
299 auto CGPB = X86CodeGenPassBuilder(*
this, Opt,
PIC);
300 return CGPB.buildPipeline(MPM, 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...
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, 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.
std::function< Expected< std::unique_ptr< MCStreamer > >(TargetMachine &)> CreateMCStreamer
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.