34class X86CodeGenPassBuilder
36 using Base = CodeGenPassBuilder<X86CodeGenPassBuilder, X86TargetMachine>;
39 explicit X86CodeGenPassBuilder(X86TargetMachine &TM,
40 const CGPassBuilderOption &Opts,
41 PassInstrumentationCallbacks *
PIC)
42 : CodeGenPassBuilder(TM, Opts,
PIC) {}
44 void addIRPasses(PassManagerWrapper &PMW)
const;
45 void addPreISel(PassManagerWrapper &PMW)
const;
46 Error addInstSelector(PassManagerWrapper &PMW)
const;
47 void addILPOpts(PassManagerWrapper &PMW)
const;
48 void addMachineSSAOptimization(PassManagerWrapper &PMW)
const;
49 void addPreRegAlloc(PassManagerWrapper &PMW)
const;
52 void addPostRegAlloc(PassManagerWrapper &PMW)
const;
53 void addPreSched2(PassManagerWrapper &PMW)
const;
54 void addPreEmitPass(PassManagerWrapper &PMW)
const;
55 void addPreEmitPass2(PassManagerWrapper &PMW)
const;
58 void addAsmPrinter(PassManagerWrapper &PMW, CreateMCStreamer)
const;
62 addFunctionPass(AtomicExpandPass(TM), PMW);
66 addFunctionPass(X86LowerAMXIntrinsicsPass(&TM), PMW);
67 addFunctionPass(X86LowerAMXTypePass(&TM), PMW);
69 Base::addIRPasses(PMW);
71 if (getOptLevel() != CodeGenOptLevel::None) {
72 addFunctionPass(InterleavedAccessPass(TM), PMW);
73 addFunctionPass(X86PartialReductionPass(&TM), PMW);
79 addFunctionPass(IndirectBrExpandPass(TM), PMW);
82 const Triple &
TT = TM.getTargetTriple();
84 addFunctionPass(CFGuardPass(
TT.isX86_64() ? CFGuardPass::Mechanism::Dispatch
85 : CFGuardPass::Mechanism::Check),
88 if (TM.Options.JMCInstrument) {
90 addModulePass(JMCInstrumenterPass(), PMW);
94void X86CodeGenPassBuilder::addPreISel(PassManagerWrapper &PMW)
const {
96 const Triple &
TT = TM.getTargetTriple();
97 if (
TT.isOSWindows() &&
TT.isX86_32()) {
102Error X86CodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW)
const {
103 addMachineFunctionPass(X86ISelDAGToDAGPass(TM), PMW);
106 if (TM.getTargetTriple().isOSBinFormatELF() &&
107 getOptLevel() != CodeGenOptLevel::None) {
114 addMachineFunctionPass(X86ArgumentStackSlotPass(), PMW);
118void X86CodeGenPassBuilder::addILPOpts(PassManagerWrapper &PMW)
const {
119 addMachineFunctionPass(EarlyIfConverterPass(), PMW);
124 addMachineFunctionPass(X86CmovConversionPass(), PMW);
127void X86CodeGenPassBuilder::addMachineSSAOptimization(
128 PassManagerWrapper &PMW)
const {
131 Base::addMachineSSAOptimization(PMW);
134void X86CodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW)
const {
135 if (getOptLevel() != CodeGenOptLevel::None) {
136 addMachineFunctionPass(LiveRangeShrinkPass(), PMW);
137 addMachineFunctionPass(X86FixupSetCCPass(), PMW);
138 addMachineFunctionPass(X86CallFrameOptimizationPass(), PMW);
139 addMachineFunctionPass(X86AvoidStoreForwardingBlocksPass(), PMW);
142 addMachineFunctionPass(X86SuppressAPXForRelocationPass(), PMW);
143 addMachineFunctionPass(X86SpeculativeLoadHardeningPass(), PMW);
144 addMachineFunctionPass(X86FlagsCopyLoweringPass(), PMW);
145 addMachineFunctionPass(X86DynAllocaExpanderPass(), PMW);
147 if (getOptLevel() != CodeGenOptLevel::None)
148 addMachineFunctionPass(X86PreTileConfigPass(), PMW);
150 addMachineFunctionPass(X86FastPreTileConfigPass(), PMW);
153void X86CodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW)
const {
154 addMachineFunctionPass(X86LowerTileCopyPass(), PMW);
155 addMachineFunctionPass(X86FPStackifierPass(), PMW);
160 if (getOptLevel() != CodeGenOptLevel::None) {
161 addMachineFunctionPass(X86LoadValueInjectionRetHardeningPass(), PMW);
165void X86CodeGenPassBuilder::addPreSched2(PassManagerWrapper &PMW)
const {
166 addMachineFunctionPass(X86ExpandPseudoPass(), PMW);
170void X86CodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW)
const {
171 if (getOptLevel() != CodeGenOptLevel::None) {
174 addMachineFunctionPass(BreakFalseDepsPass(), PMW);
182 if (getOptLevel() != CodeGenOptLevel::None) {
183 addMachineFunctionPass(X86FixupBWInstsPass(), PMW);
186 addMachineFunctionPass(X86FixupLEAsPass(), PMW);
187 addMachineFunctionPass(X86FixupInstTuningPass(), PMW);
188 addMachineFunctionPass(X86FixupVectorConstantsPass(), PMW);
190 addMachineFunctionPass(X86CompressEVEXPass(), PMW);
194void X86CodeGenPassBuilder::addPreEmitPass2(PassManagerWrapper &PMW)
const {
195 const Triple &
TT = TM.getTargetTriple();
196 const MCAsmInfo *MAI = TM.getMCAsmInfo();
207 addMachineFunctionPass(X86SpeculativeExecutionSideEffectSuppressionPass(),
211 addMachineFunctionPass(X86ReturnThunksPass(), PMW);
215 if (
TT.isOSWindows() &&
TT.isX86_64())
216 addMachineFunctionPass(X86AvoidTrailingCallPass(), PMW);
221 if (!
TT.isOSDarwin() &&
222 (!
TT.isOSWindows() ||
228 if (
TT.isOSWindows()) {
251 if (
TT.isOSWindows() &&
TT.isX86_64()) {
257void X86CodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW,
258 CreateMCStreamer)
const {
265#define GET_PASS_REGISTRY "X86PassRegistry.def"
273 auto CGPB = X86CodeGenPassBuilder(*
this, Opt,
PIC);
274 return CGPB.buildPipeline(MPM, Out, DwoOut, FileType);
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
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 &, raw_pwrite_stream &, raw_pwrite_stream *, CodeGenFileType, const CGPassBuilderOption &, PassInstrumentationCallbacks *) 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.