45 using Base = CodeGenPassBuilder;
47 X86TargetMachine &
getTM()
const {
48 return static_cast<X86TargetMachine &
>(TM);
52 explicit X86CodeGenPassBuilder(X86TargetMachine &TM,
53 const CGPassBuilderOption &Opts,
54 PassInstrumentationCallbacks *
PIC)
55 : CodeGenPassBuilder(TM, Opts,
PIC) {}
57 void addIRPasses(PassManagerWrapper &PMW)
override;
58 void addPreISel(PassManagerWrapper &PMW)
override;
59 Error addInstSelector(PassManagerWrapper &PMW)
override;
61 Error addIRTranslator(PassManagerWrapper &PMW)
override;
62 void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
override;
63 Error addLegalizeMachineIR(PassManagerWrapper &PMW)
override;
64 void addPreRegBankSelect(PassManagerWrapper &PMW)
override;
65 Error addRegBankSelect(PassManagerWrapper &PMW)
override;
66 Error addGlobalInstructionSelect(PassManagerWrapper &PMW)
override;
68 void addILPOpts(PassManagerWrapper &PMW)
override;
69 void addMachineSSAOptimization(PassManagerWrapper &PMW)
override;
70 void addPreRegAlloc(PassManagerWrapper &PMW)
override;
73 void addPostRegAlloc(PassManagerWrapper &PMW)
override;
74 void addPreSched2(PassManagerWrapper &PMW)
override;
75 void addPreEmitPass(PassManagerWrapper &PMW)
override;
76 void addPreEmitPass2(PassManagerWrapper &PMW)
override;
79 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
80 void addAsmPrinter(PassManagerWrapper &PMW)
override;
81 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
85 addFunctionPass(AtomicExpandPass(TM), PMW);
89 addFunctionPass(X86LowerAMXIntrinsicsPass(&TM), PMW);
90 addFunctionPass(X86LowerAMXTypePass(&TM), PMW);
92 Base::addIRPasses(PMW);
94 if (getOptLevel() != CodeGenOptLevel::None) {
95 addFunctionPass(InterleavedAccessPass(TM), PMW);
96 addFunctionPass(X86PartialReductionPass(&
getTM()), PMW);
102 addFunctionPass(IndirectBrExpandPass(TM), PMW);
105 const Triple &
TT = TM.getTargetTriple();
106 if (
TT.isOSWindows())
107 addFunctionPass(CFGuardPass(), PMW);
109 if (TM.Options.JMCInstrument) {
111 addModulePass(JMCInstrumenterPass(), PMW);
115void X86CodeGenPassBuilder::addPreISel(PassManagerWrapper &PMW) {
117 const Triple &
TT = TM.getTargetTriple();
118 if (
TT.isOSWindows() &&
TT.isX86_32()) {
120 addModulePass(X86WinEHStatePass(), PMW);
124Error X86CodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
125 addMachineFunctionPass(X86ISelDAGToDAGPass(
getTM()), PMW);
128 if (TM.getTargetTriple().isOSBinFormatELF() &&
129 getOptLevel() != CodeGenOptLevel::None) {
130 addMachineFunctionPass(X86CleanupLocalDynamicTLSPass(), PMW);
133 addMachineFunctionPass(X86GlobalBaseRegPass(), PMW);
134 addMachineFunctionPass(X86ArgumentStackSlotPass(), PMW);
138Error X86CodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
139 addMachineFunctionPass(IRTranslatorPass(getOptLevel()), PMW);
143void X86CodeGenPassBuilder::addPreLegalizeMachineIR(PassManagerWrapper &PMW) {
144 if (getOptLevel() != CodeGenOptLevel::None)
145 addMachineFunctionPass(X86PreLegalizerCombinerPass(), PMW);
148Error X86CodeGenPassBuilder::addLegalizeMachineIR(PassManagerWrapper &PMW) {
149 addMachineFunctionPass(LegalizerPass(), PMW);
153void X86CodeGenPassBuilder::addPreRegBankSelect(PassManagerWrapper &PMW) {
154 if (getOptLevel() != CodeGenOptLevel::None)
155 addMachineFunctionPass(X86PostLegalizerCombinerPass(), PMW);
158Error X86CodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
159 addMachineFunctionPass(RegBankSelectPass(), PMW);
163Error X86CodeGenPassBuilder::addGlobalInstructionSelect(
164 PassManagerWrapper &PMW) {
165 addMachineFunctionPass(InstructionSelectPass(getOptLevel()), PMW);
167 if (isGlobalISelAbortEnabled())
168 addMachineFunctionPass(X86GlobalBaseRegPass(), PMW);
172void X86CodeGenPassBuilder::addILPOpts(PassManagerWrapper &PMW) {
173 addMachineFunctionPass(EarlyIfConverterPass(), PMW);
175 addMachineFunctionPass(MachineCombinerPass(), PMW);
176 addMachineFunctionPass(X86CmovConversionPass(), PMW);
179void X86CodeGenPassBuilder::addMachineSSAOptimization(PassManagerWrapper &PMW) {
180 addMachineFunctionPass(X86DomainReassignmentPass(), PMW);
181 Base::addMachineSSAOptimization(PMW);
184void X86CodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW) {
185 if (getOptLevel() != CodeGenOptLevel::None) {
186 addMachineFunctionPass(LiveRangeShrinkPass(), PMW);
187 addMachineFunctionPass(X86FixupSetCCPass(), PMW);
188 addMachineFunctionPass(X86CallFrameOptimizationPass(), PMW);
189 addMachineFunctionPass(X86AvoidStoreForwardingBlocksPass(), PMW);
192 addMachineFunctionPass(X86SuppressAPXForRelocationPass(), PMW);
193 addMachineFunctionPass(X86SpeculativeLoadHardeningPass(), PMW);
194 addMachineFunctionPass(X86FlagsCopyLoweringPass(), PMW);
195 addMachineFunctionPass(X86DynAllocaExpanderPass(), PMW);
197 if (getOptLevel() != CodeGenOptLevel::None)
198 addMachineFunctionPass(X86PreTileConfigPass(), PMW);
200 addMachineFunctionPass(X86FastPreTileConfigPass(), PMW);
203void X86CodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW) {
204 addMachineFunctionPass(X86LowerTileCopyPass(), PMW);
205 addMachineFunctionPass(X86FPStackifierPass(), PMW);
210 if (getOptLevel() != CodeGenOptLevel::None) {
211 addMachineFunctionPass(X86LoadValueInjectionLoadHardeningPass(), PMW);
215void X86CodeGenPassBuilder::addPreSched2(PassManagerWrapper &PMW) {
216 addMachineFunctionPass(X86ExpandPseudoPass(), PMW);
217 addMachineFunctionPass(MachineKCFIPass(), PMW);
220void X86CodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) {
221 if (getOptLevel() != CodeGenOptLevel::None) {
224 addMachineFunctionPass(BreakFalseDepsPass(), PMW);
227 addMachineFunctionPass(X86IndirectBranchTrackingPass(), PMW);
228 addMachineFunctionPass(X86InsertVZeroUpperPass(), PMW);
230 if (getOptLevel() != CodeGenOptLevel::None) {
231 addMachineFunctionPass(X86FixupBWInstsPass(), PMW);
234 addMachineFunctionPass(X86FixupLEAsPass(), PMW);
235 addMachineFunctionPass(X86FixupInstTuningPass(), PMW);
236 addMachineFunctionPass(X86FixupVectorConstantsPass(), PMW);
238 addMachineFunctionPass(X86CompressEVEXPass(), PMW);
239 addMachineFunctionPass(X86InsertX87WaitPass(), PMW);
242void X86CodeGenPassBuilder::addPreEmitPass2(PassManagerWrapper &PMW) {
243 const Triple &
TT = TM.getTargetTriple();
244 const MCAsmInfo &MAI = TM.getMCAsmInfo();
255 addMachineFunctionPass(X86SpeculativeExecutionSideEffectSuppressionPass(),
259 addMachineFunctionPass(X86ReturnThunksPass(), PMW);
263 if (
TT.isOSWindows() &&
TT.isX86_64())
264 addMachineFunctionPass(X86AvoidTrailingCallPass(), PMW);
269 if (!
TT.isOSDarwin() &&
270 (!
TT.isOSWindows() ||
272 addMachineFunctionPass(CFIInstrInserterPass(), PMW);
274 if (
TT.isOSWindows()) {
279 addMachineFunctionPass(EHContGuardTargetsPass(), PMW);
282 addMachineFunctionPass(X86LoadValueInjectionRetHardeningPass(), PMW);
295 if (
TT.isOSWindows() &&
TT.isX86_64()) {
296 addMachineFunctionPass(X86WinEHUnwindV2Pass(), PMW);
300void X86CodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
301 addModulePass(X86AsmPrinterBeginPass(), PMW,
true);
304void X86CodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
305 addMachineFunctionPass(X86AsmPrinterPass(), PMW);
308void X86CodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
309 addModulePass(X86AsmPrinterEndPass(), PMW,
true);
315#define GET_PASS_REGISTRY "X86PassRegistry.def"
324 auto CGPB = X86CodeGenPassBuilder(*
this, Opt,
PIC);
325 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 declares the IRTranslator pass.
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)
This file describes the interface of the MachineFunctionPass responsible for assigning the generic vi...
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.