43 using Base = CodeGenPassBuilder;
45 X86TargetMachine &
getTM()
const {
46 return static_cast<X86TargetMachine &
>(TM);
50 explicit X86CodeGenPassBuilder(X86TargetMachine &TM,
51 const CGPassBuilderOption &Opts,
52 PassInstrumentationCallbacks *
PIC)
53 : CodeGenPassBuilder(TM, Opts,
PIC) {}
55 void addIRPasses(PassManagerWrapper &PMW)
override;
56 void addPreISel(PassManagerWrapper &PMW)
override;
57 Error addInstSelector(PassManagerWrapper &PMW)
override;
59 Error addIRTranslator(PassManagerWrapper &PMW)
override;
60 void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
override;
61 Error addLegalizeMachineIR(PassManagerWrapper &PMW)
override;
62 void addPreRegBankSelect(PassManagerWrapper &PMW)
override;
63 Error addRegBankSelect(PassManagerWrapper &PMW)
override;
64 Error addGlobalInstructionSelect(PassManagerWrapper &PMW)
override;
66 void addILPOpts(PassManagerWrapper &PMW)
override;
67 void addMachineSSAOptimization(PassManagerWrapper &PMW)
override;
68 void addPreRegAlloc(PassManagerWrapper &PMW)
override;
71 void addPostRegAlloc(PassManagerWrapper &PMW)
override;
72 void addPreSched2(PassManagerWrapper &PMW)
override;
73 void addPreEmitPass(PassManagerWrapper &PMW)
override;
74 void addPreEmitPass2(PassManagerWrapper &PMW)
override;
77 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
78 void addAsmPrinter(PassManagerWrapper &PMW)
override;
79 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
83 addFunctionPass(AtomicExpandPass(TM), PMW);
87 addFunctionPass(X86LowerAMXIntrinsicsPass(&TM), PMW);
88 addFunctionPass(X86LowerAMXTypePass(&TM), PMW);
90 Base::addIRPasses(PMW);
92 if (getOptLevel() != CodeGenOptLevel::None) {
93 addFunctionPass(InterleavedAccessPass(TM), PMW);
94 addFunctionPass(X86PartialReductionPass(&
getTM()), PMW);
100 addFunctionPass(IndirectBrExpandPass(TM), PMW);
103 const Triple &
TT = TM.getTargetTriple();
104 if (
TT.isOSWindows())
105 addFunctionPass(CFGuardPass(), PMW);
107 if (TM.Options.JMCInstrument) {
109 addModulePass(JMCInstrumenterPass(), PMW);
113void X86CodeGenPassBuilder::addPreISel(PassManagerWrapper &PMW) {
115 const Triple &
TT = TM.getTargetTriple();
116 if (
TT.isOSWindows() &&
TT.isX86_32()) {
118 addModulePass(X86WinEHStatePass(), PMW);
122Error X86CodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
123 addMachineFunctionPass(X86ISelDAGToDAGPass(
getTM()), PMW);
126 if (TM.getTargetTriple().isOSBinFormatELF() &&
127 getOptLevel() != CodeGenOptLevel::None) {
128 addMachineFunctionPass(X86CleanupLocalDynamicTLSPass(), PMW);
131 addMachineFunctionPass(X86GlobalBaseRegPass(), PMW);
132 addMachineFunctionPass(X86ArgumentStackSlotPass(), PMW);
136Error X86CodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
137 addMachineFunctionPass(IRTranslatorPass(getOptLevel()), PMW);
141void X86CodeGenPassBuilder::addPreLegalizeMachineIR(PassManagerWrapper &PMW) {
142 if (getOptLevel() != CodeGenOptLevel::None)
143 addMachineFunctionPass(X86PreLegalizerCombinerPass(), PMW);
146Error X86CodeGenPassBuilder::addLegalizeMachineIR(PassManagerWrapper &PMW) {
147 addMachineFunctionPass(LegalizerPass(), PMW);
151void X86CodeGenPassBuilder::addPreRegBankSelect(PassManagerWrapper &PMW) {
152 if (getOptLevel() != CodeGenOptLevel::None)
153 addMachineFunctionPass(X86PostLegalizerCombinerPass(), PMW);
156Error X86CodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
157 addMachineFunctionPass(RegBankSelectPass(), PMW);
161Error X86CodeGenPassBuilder::addGlobalInstructionSelect(
162 PassManagerWrapper &PMW) {
163 addMachineFunctionPass(InstructionSelectPass(getOptLevel()), PMW);
165 if (isGlobalISelAbortEnabled())
166 addMachineFunctionPass(X86GlobalBaseRegPass(), PMW);
170void X86CodeGenPassBuilder::addILPOpts(PassManagerWrapper &PMW) {
171 addMachineFunctionPass(EarlyIfConverterPass(), PMW);
172 if (
getTM().getCLOpts().machine_combiner)
173 addMachineFunctionPass(MachineCombinerPass(), PMW);
174 addMachineFunctionPass(X86CmovConversionPass(), PMW);
177void X86CodeGenPassBuilder::addMachineSSAOptimization(PassManagerWrapper &PMW) {
178 addMachineFunctionPass(X86DomainReassignmentPass(), PMW);
179 Base::addMachineSSAOptimization(PMW);
182void X86CodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW) {
183 if (getOptLevel() != CodeGenOptLevel::None) {
184 addMachineFunctionPass(LiveRangeShrinkPass(), PMW);
185 addMachineFunctionPass(X86FixupSetCCPass(), PMW);
186 addMachineFunctionPass(X86OptimizeLEAsPass(), PMW);
187 addMachineFunctionPass(X86CallFrameOptimizationPass(), PMW);
188 addMachineFunctionPass(X86AvoidStoreForwardingBlocksPass(), PMW);
191 addMachineFunctionPass(X86SuppressAPXForRelocationPass(), PMW);
192 addMachineFunctionPass(X86SpeculativeLoadHardeningPass(), PMW);
193 addMachineFunctionPass(X86FlagsCopyLoweringPass(), PMW);
194 addMachineFunctionPass(X86DynAllocaExpanderPass(), PMW);
196 if (getOptLevel() != CodeGenOptLevel::None)
197 addMachineFunctionPass(X86PreTileConfigPass(), PMW);
199 addMachineFunctionPass(X86FastPreTileConfigPass(), PMW);
202void X86CodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW) {
203 addMachineFunctionPass(X86LowerTileCopyPass(), PMW);
204 addMachineFunctionPass(X86FPStackifierPass(), PMW);
209 if (getOptLevel() != CodeGenOptLevel::None) {
210 addMachineFunctionPass(X86LoadValueInjectionLoadHardeningPass(), PMW);
214void X86CodeGenPassBuilder::addPreSched2(PassManagerWrapper &PMW) {
215 addMachineFunctionPass(X86ExpandPseudoPass(), PMW);
216 addMachineFunctionPass(MachineKCFIPass(), PMW);
219void X86CodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) {
220 if (getOptLevel() != CodeGenOptLevel::None) {
223 addMachineFunctionPass(BreakFalseDepsPass(), PMW);
226 addMachineFunctionPass(X86IndirectBranchTrackingPass(), PMW);
227 addMachineFunctionPass(X86InsertVZeroUpperPass(), PMW);
229 if (getOptLevel() != CodeGenOptLevel::None) {
230 addMachineFunctionPass(X86FixupBWInstsPass(), PMW);
233 addMachineFunctionPass(X86FixupLEAsPass(), PMW);
234 addMachineFunctionPass(X86FixupInstTuningPass(), PMW);
235 addMachineFunctionPass(X86FixupVectorConstantsPass(), PMW);
237 addMachineFunctionPass(X86CompressEVEXPass(), PMW);
238 addMachineFunctionPass(X86InsertX87WaitPass(), PMW);
240 if (TM.getTargetTriple().isLFI())
241 addMachineFunctionPass(X86LFIRewritePass(), PMW);
244void X86CodeGenPassBuilder::addPreEmitPass2(PassManagerWrapper &PMW) {
245 const Triple &
TT = TM.getTargetTriple();
246 const MCAsmInfo &MAI = TM.getMCAsmInfo();
257 addMachineFunctionPass(X86SpeculativeExecutionSideEffectSuppressionPass(),
261 addMachineFunctionPass(X86ReturnThunksPass(), PMW);
265 if (
TT.isOSWindows() &&
TT.isX86_64())
266 addMachineFunctionPass(X86AvoidTrailingCallPass(), PMW);
271 if (!
TT.isOSDarwin() &&
272 (!
TT.isOSWindows() ||
274 addMachineFunctionPass(CFIInstrInserterPass(), PMW);
276 if (
TT.isOSWindows()) {
281 addMachineFunctionPass(EHContGuardTargetsPass(), PMW);
284 addMachineFunctionPass(X86LoadValueInjectionRetHardeningPass(), PMW);
292 addMachineFunctionPass(
298 return M->getModuleFlag(
"kcfi") ||
300 (
M->getFunction(
"objc_retainAutoreleasedReturnValue") ||
301 M->getFunction(
"objc_unsafeClaimAutoreleasedReturnValue")));
307 if (
TT.isOSWindows() &&
TT.isX86_64()) {
308 addMachineFunctionPass(X86WinEHUnwindV2Pass(), PMW);
312void X86CodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
313 addModulePass(X86AsmPrinterBeginPass(), PMW,
true);
316void X86CodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
317 addMachineFunctionPass(X86AsmPrinterPass(), PMW);
320void X86CodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
321 addModulePass(X86AsmPrinterEndPass(), PMW,
true);
327#define GET_PASS_REGISTRY "X86PassRegistry.def"
336 auto CGPB = X86CodeGenPassBuilder(*
this, Opt,
PIC);
337 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...
Machine Check Debug Module
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)
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.
Function & getFunction()
Return the LLVM function that this machine code represents.
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.