41 using Base = CodeGenPassBuilder;
43 X86TargetMachine &
getTM()
const {
44 return static_cast<X86TargetMachine &
>(TM);
48 explicit X86CodeGenPassBuilder(X86TargetMachine &TM,
49 const CGPassBuilderOption &Opts,
50 PassInstrumentationCallbacks *
PIC)
51 : CodeGenPassBuilder(TM, Opts,
PIC) {}
53 void addIRPasses(PassManagerWrapper &PMW)
override;
54 void addPreISel(PassManagerWrapper &PMW)
override;
55 Error addInstSelector(PassManagerWrapper &PMW)
override;
56 void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
override;
57 void addILPOpts(PassManagerWrapper &PMW)
override;
58 void addPreRegBankSelect(PassManagerWrapper &PMW)
override;
59 void addMachineSSAOptimization(PassManagerWrapper &PMW)
override;
60 void addPreRegAlloc(PassManagerWrapper &PMW)
override;
63 void addPostRegAlloc(PassManagerWrapper &PMW)
override;
64 void addPreSched2(PassManagerWrapper &PMW)
override;
65 void addPreEmitPass(PassManagerWrapper &PMW)
override;
66 void addPreEmitPass2(PassManagerWrapper &PMW)
override;
69 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
70 void addAsmPrinter(PassManagerWrapper &PMW)
override;
71 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
75 addFunctionPass(AtomicExpandPass(TM), PMW);
79 addFunctionPass(X86LowerAMXIntrinsicsPass(&TM), PMW);
80 addFunctionPass(X86LowerAMXTypePass(&TM), PMW);
82 Base::addIRPasses(PMW);
84 if (getOptLevel() != CodeGenOptLevel::None) {
85 addFunctionPass(InterleavedAccessPass(TM), PMW);
86 addFunctionPass(X86PartialReductionPass(&
getTM()), PMW);
92 addFunctionPass(IndirectBrExpandPass(TM), PMW);
95 const Triple &
TT = TM.getTargetTriple();
97 addFunctionPass(CFGuardPass(), PMW);
99 if (TM.Options.JMCInstrument) {
101 addModulePass(JMCInstrumenterPass(), PMW);
105void X86CodeGenPassBuilder::addPreISel(PassManagerWrapper &PMW) {
107 const Triple &
TT = TM.getTargetTriple();
108 if (
TT.isOSWindows() &&
TT.isX86_32()) {
110 addModulePass(X86WinEHStatePass(), PMW);
114Error X86CodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
115 addMachineFunctionPass(X86ISelDAGToDAGPass(
getTM()), PMW);
118 if (TM.getTargetTriple().isOSBinFormatELF() &&
119 getOptLevel() != CodeGenOptLevel::None) {
120 addMachineFunctionPass(X86CleanupLocalDynamicTLSPass(), PMW);
123 addMachineFunctionPass(X86GlobalBaseRegPass(), PMW);
124 addMachineFunctionPass(X86ArgumentStackSlotPass(), PMW);
128void X86CodeGenPassBuilder::addPreLegalizeMachineIR(PassManagerWrapper &PMW) {
129 addMachineFunctionPass(X86PreLegalizerCombinerPass(), PMW);
132void X86CodeGenPassBuilder::addILPOpts(PassManagerWrapper &PMW) {
133 addMachineFunctionPass(EarlyIfConverterPass(), PMW);
135 addMachineFunctionPass(MachineCombinerPass(), PMW);
136 addMachineFunctionPass(X86CmovConversionPass(), PMW);
139void X86CodeGenPassBuilder::addPreRegBankSelect(PassManagerWrapper &PMW) {
140 addMachineFunctionPass(X86PostLegalizerCombinerPass(), PMW);
143void X86CodeGenPassBuilder::addMachineSSAOptimization(PassManagerWrapper &PMW) {
144 addMachineFunctionPass(X86DomainReassignmentPass(), PMW);
145 Base::addMachineSSAOptimization(PMW);
148void X86CodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW) {
149 if (getOptLevel() != CodeGenOptLevel::None) {
150 addMachineFunctionPass(LiveRangeShrinkPass(), PMW);
151 addMachineFunctionPass(X86FixupSetCCPass(), PMW);
152 addMachineFunctionPass(X86CallFrameOptimizationPass(), PMW);
153 addMachineFunctionPass(X86AvoidStoreForwardingBlocksPass(), PMW);
156 addMachineFunctionPass(X86SuppressAPXForRelocationPass(), PMW);
157 addMachineFunctionPass(X86SpeculativeLoadHardeningPass(), PMW);
158 addMachineFunctionPass(X86FlagsCopyLoweringPass(), PMW);
159 addMachineFunctionPass(X86DynAllocaExpanderPass(), PMW);
161 if (getOptLevel() != CodeGenOptLevel::None)
162 addMachineFunctionPass(X86PreTileConfigPass(), PMW);
164 addMachineFunctionPass(X86FastPreTileConfigPass(), PMW);
167void X86CodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW) {
168 addMachineFunctionPass(X86LowerTileCopyPass(), PMW);
169 addMachineFunctionPass(X86FPStackifierPass(), PMW);
174 if (getOptLevel() != CodeGenOptLevel::None) {
175 addMachineFunctionPass(X86LoadValueInjectionLoadHardeningPass(), PMW);
179void X86CodeGenPassBuilder::addPreSched2(PassManagerWrapper &PMW) {
180 addMachineFunctionPass(X86ExpandPseudoPass(), PMW);
181 addMachineFunctionPass(MachineKCFIPass(), PMW);
184void X86CodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) {
185 if (getOptLevel() != CodeGenOptLevel::None) {
188 addMachineFunctionPass(BreakFalseDepsPass(), PMW);
191 addMachineFunctionPass(X86IndirectBranchTrackingPass(), PMW);
192 addMachineFunctionPass(X86InsertVZeroUpperPass(), PMW);
194 if (getOptLevel() != CodeGenOptLevel::None) {
195 addMachineFunctionPass(X86FixupBWInstsPass(), PMW);
198 addMachineFunctionPass(X86FixupLEAsPass(), PMW);
199 addMachineFunctionPass(X86FixupInstTuningPass(), PMW);
200 addMachineFunctionPass(X86FixupVectorConstantsPass(), PMW);
202 addMachineFunctionPass(X86CompressEVEXPass(), PMW);
203 addMachineFunctionPass(X86InsertX87WaitPass(), PMW);
206void X86CodeGenPassBuilder::addPreEmitPass2(PassManagerWrapper &PMW) {
207 const Triple &
TT = TM.getTargetTriple();
208 const MCAsmInfo &MAI = TM.getMCAsmInfo();
219 addMachineFunctionPass(X86SpeculativeExecutionSideEffectSuppressionPass(),
223 addMachineFunctionPass(X86ReturnThunksPass(), PMW);
227 if (
TT.isOSWindows() &&
TT.isX86_64())
228 addMachineFunctionPass(X86AvoidTrailingCallPass(), PMW);
233 if (!
TT.isOSDarwin() &&
234 (!
TT.isOSWindows() ||
236 addMachineFunctionPass(CFIInstrInserterPass(), PMW);
238 if (
TT.isOSWindows()) {
243 addMachineFunctionPass(EHContGuardTargetsPass(), PMW);
246 addMachineFunctionPass(X86LoadValueInjectionRetHardeningPass(), PMW);
259 if (
TT.isOSWindows() &&
TT.isX86_64()) {
260 addMachineFunctionPass(X86WinEHUnwindV2Pass(), PMW);
264void X86CodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
265 addModulePass(X86AsmPrinterBeginPass(), PMW,
true);
268void X86CodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
269 addMachineFunctionPass(X86AsmPrinterPass(), PMW);
272void X86CodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
273 addModulePass(X86AsmPrinterEndPass(), PMW,
true);
279#define GET_PASS_REGISTRY "X86PassRegistry.def"
288 auto CGPB = X86CodeGenPassBuilder(*
this, Opt,
PIC);
289 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)
const GCNTargetMachine & getTM(const GCNSubtarget *STI)
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.