49 using Base = CodeGenPassBuilder;
51 X86TargetMachine &
getTM()
const {
52 return static_cast<X86TargetMachine &
>(TM);
56 explicit X86CodeGenPassBuilder(X86TargetMachine &TM,
57 const CGPassBuilderOption &Opts,
58 PassInstrumentationCallbacks *
PIC)
59 : CodeGenPassBuilder(TM, Opts,
PIC) {}
61 void addIRPasses(PassManagerWrapper &PMW)
override;
62 void addPreISel(PassManagerWrapper &PMW)
override;
63 Error addInstSelector(PassManagerWrapper &PMW)
override;
65 Error addIRTranslator(PassManagerWrapper &PMW)
override;
66 void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
override;
67 Error addLegalizeMachineIR(PassManagerWrapper &PMW)
override;
68 void addPreRegBankSelect(PassManagerWrapper &PMW)
override;
69 Error addRegBankSelect(PassManagerWrapper &PMW)
override;
70 Error addGlobalInstructionSelect(PassManagerWrapper &PMW)
override;
72 void addMachineSSAOptimization(PassManagerWrapper &PMW)
override;
73 void addILPOpts(PassManagerWrapper &PMW)
override;
74 void addPreRegAlloc(PassManagerWrapper &PMW)
override;
75 Error addRegAssignAndRewriteFast(PassManagerWrapper &PMW)
override;
77 addRegAssignAndRewriteOptimized(PassManagerWrapper &PMW)
override;
78 void addPostRegAlloc(PassManagerWrapper &PMW)
override;
79 void addPreSched2(PassManagerWrapper &PMW)
override;
80 void addPreEmitPass(PassManagerWrapper &PMW)
override;
81 void addPreEmitPass2(PassManagerWrapper &PMW)
override;
82 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
83 void addAsmPrinter(PassManagerWrapper &PMW)
override;
84 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
88 addFunctionPass(AtomicExpandPass(TM), PMW);
92 addFunctionPass(X86LowerAMXIntrinsicsPass(&TM), PMW);
93 addFunctionPass(X86LowerAMXTypePass(&TM), PMW);
95 Base::addIRPasses(PMW);
97 if (getOptLevel() != CodeGenOptLevel::None) {
98 addFunctionPass(InterleavedAccessPass(TM), PMW);
99 addFunctionPass(X86PartialReductionPass(&
getTM()), PMW);
105 addFunctionPass(IndirectBrExpandPass(TM), PMW);
108 const Triple &
TT = TM.getTargetTriple();
109 if (
TT.isOSWindows())
110 addFunctionPass(CFGuardPass(), PMW);
112 if (TM.Options.JMCInstrument) {
114 addModulePass(JMCInstrumenterPass(), PMW);
117 addFunctionPass(X86FenceNonTemporalStoresPass(&
getTM()), PMW);
120void X86CodeGenPassBuilder::addPreISel(PassManagerWrapper &PMW) {
122 const Triple &
TT = TM.getTargetTriple();
123 if (
TT.isOSWindows() &&
TT.isX86_32()) {
125 addModulePass(X86WinEHStatePass(), PMW);
129Error X86CodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
130 addMachineFunctionPass(X86ISelDAGToDAGPass(
getTM()), PMW);
133 if (TM.getTargetTriple().isOSBinFormatELF() &&
134 getOptLevel() != CodeGenOptLevel::None) {
135 addMachineFunctionPass(X86CleanupLocalDynamicTLSPass(), PMW);
138 addMachineFunctionPass(X86GlobalBaseRegPass(), PMW);
139 addMachineFunctionPass(X86ArgumentStackSlotPass(), PMW);
143Error X86CodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
144 addMachineFunctionPass(IRTranslatorPass(getOptLevel()), PMW);
148void X86CodeGenPassBuilder::addPreLegalizeMachineIR(PassManagerWrapper &PMW) {
149 if (getOptLevel() != CodeGenOptLevel::None)
150 addMachineFunctionPass(X86PreLegalizerCombinerPass(), PMW);
153Error X86CodeGenPassBuilder::addLegalizeMachineIR(PassManagerWrapper &PMW) {
154 addMachineFunctionPass(LegalizerPass(), PMW);
158void X86CodeGenPassBuilder::addPreRegBankSelect(PassManagerWrapper &PMW) {
159 if (getOptLevel() != CodeGenOptLevel::None)
160 addMachineFunctionPass(X86PostLegalizerCombinerPass(), PMW);
163Error X86CodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
164 addMachineFunctionPass(RegBankSelectPass(), PMW);
168Error X86CodeGenPassBuilder::addGlobalInstructionSelect(
169 PassManagerWrapper &PMW) {
170 addMachineFunctionPass(InstructionSelectPass(getOptLevel()), PMW);
172 if (isGlobalISelAbortEnabled())
173 addMachineFunctionPass(X86GlobalBaseRegPass(), PMW);
177void X86CodeGenPassBuilder::addMachineSSAOptimization(PassManagerWrapper &PMW) {
178 addMachineFunctionPass(X86DomainReassignmentPass(), PMW);
179 Base::addMachineSSAOptimization(PMW);
182void X86CodeGenPassBuilder::addILPOpts(PassManagerWrapper &PMW) {
183 addMachineFunctionPass(EarlyIfConverterPass(), PMW);
185 addMachineFunctionPass(MachineCombinerPass(), PMW);
186 addMachineFunctionPass(X86CmovConversionPass(), PMW);
189void X86CodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW) {
190 if (getOptLevel() != CodeGenOptLevel::None) {
191 addMachineFunctionPass(LiveRangeShrinkPass(), PMW);
192 addMachineFunctionPass(X86FixupSetCCPass(), PMW);
193 addMachineFunctionPass(X86OptimizeLEAsPass(), PMW);
194 addMachineFunctionPass(X86CallFrameOptimizationPass(), PMW);
195 addMachineFunctionPass(X86AvoidStoreForwardingBlocksPass(), PMW);
198 addMachineFunctionPass(X86SuppressAPXForRelocationPass(), PMW);
199 addMachineFunctionPass(X86SpeculativeLoadHardeningPass(), PMW);
200 addMachineFunctionPass(X86FlagsCopyLoweringPass(), PMW);
201 addMachineFunctionPass(X86DynAllocaExpanderPass(), PMW);
203 if (getOptLevel() != CodeGenOptLevel::None)
204 addMachineFunctionPass(X86PreTileConfigPass(), PMW);
206 addMachineFunctionPass(X86FastPreTileConfigPass(), PMW);
210 const MachineRegisterInfo &
MRI,
213 return static_cast<const X86RegisterInfo &
>(
TRI).isTileRegisterClass(RC);
216Error X86CodeGenPassBuilder::addRegAssignAndRewriteFast(
217 PassManagerWrapper &PMW) {
218 Error PossibleError = Base::addRegAssignAndRewriteFast(PMW);
219 addMachineFunctionPass(X86FastTileConfigPass(), PMW);
220 return PossibleError;
223Expected<bool> X86CodeGenPassBuilder::addRegAssignAndRewriteOptimized(
224 PassManagerWrapper &PMW) {
226 if (Opt.RegAlloc == RegAllocType::Default &&
getTM().
getCLOpts().tile_ra) {
228 addMachineFunctionPass(
230 addMachineFunctionPass(X86TileConfigPass(), PMW);
232 return Base::addRegAssignAndRewriteOptimized(PMW);
235void X86CodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW) {
236 addMachineFunctionPass(X86LowerTileCopyPass(), PMW);
237 addMachineFunctionPass(X86FPStackifierPass(), PMW);
242 if (getOptLevel() != CodeGenOptLevel::None) {
243 addMachineFunctionPass(X86LoadValueInjectionLoadHardeningPass(), PMW);
247void X86CodeGenPassBuilder::addPreSched2(PassManagerWrapper &PMW) {
248 addMachineFunctionPass(X86ExpandPseudoPass(), PMW);
249 addMachineFunctionPass(MachineKCFIPass(), PMW);
252void X86CodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) {
253 if (getOptLevel() != CodeGenOptLevel::None) {
254 addMachineFunctionPass(ExecutionDomainFixPass(), PMW);
255 addMachineFunctionPass(BreakFalseDepsPass(), PMW);
258 addMachineFunctionPass(X86IndirectBranchTrackingPass(), PMW);
259 addMachineFunctionPass(X86InsertVZeroUpperPass(), PMW);
261 if (getOptLevel() != CodeGenOptLevel::None) {
262 addMachineFunctionPass(X86FixupBWInstsPass(), PMW);
263 addMachineFunctionPass(X86PadShortFunctionsPass(), PMW);
264 addMachineFunctionPass(X86FixupLEAsPass(), PMW);
265 addMachineFunctionPass(X86FixupInstTuningPass(), PMW);
266 addMachineFunctionPass(X86FixupVectorConstantsPass(), PMW);
268 addMachineFunctionPass(X86CompressEVEXPass(), PMW);
269 addMachineFunctionPass(X86InsertX87WaitPass(), PMW);
271 if (TM.getTargetTriple().isLFI())
272 addMachineFunctionPass(X86LFIRewritePass(), PMW);
275void X86CodeGenPassBuilder::addPreEmitPass2(PassManagerWrapper &PMW) {
276 const Triple &
TT = TM.getTargetTriple();
287 addMachineFunctionPass(X86SpeculativeExecutionSideEffectSuppressionPass(),
289 addMachineFunctionPass(X86IndirectThunksPass(), PMW);
290 addMachineFunctionPass(X86ReturnThunksPass(), PMW);
294 if (
TT.isOSWindows() &&
TT.isX86_64())
295 addMachineFunctionPass(X86AvoidTrailingCallPass(), PMW);
301 if (!
TT.isOSDarwin())
302 addMachineFunctionPass(CFIInstrInserterPass(), PMW);
304 if (
TT.isOSWindows()) {
306 addMachineFunctionPass(CFGuardLongjmpPass(), PMW);
308 addMachineFunctionPass(EHContGuardTargetsPass(), PMW);
311 addMachineFunctionPass(X86LoadValueInjectionRetHardeningPass(), PMW);
314 addMachineFunctionPass(PseudoProbeInserterPass(), PMW);
318 addMachineFunctionPass(
324 return M->getModuleFlag(
"kcfi") ||
326 (
M->getFunction(
"objc_retainAutoreleasedReturnValue") ||
327 M->getFunction(
"objc_unsafeClaimAutoreleasedReturnValue")));
333 if (
TT.isOSWindows() &&
TT.isX86_64()) {
334 addMachineFunctionPass(X86WinEHUnwindV2Pass(), PMW);
338void X86CodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
339 addModulePass(X86AsmPrinterBeginPass(), PMW,
true);
342void X86CodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
343 addMachineFunctionPass(X86AsmPrinterPass(), PMW);
346void X86CodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
347 addModulePass(X86AsmPrinterEndPass(), PMW,
true);
353#define GET_PASS_REGISTRY "X86PassRegistry.def"
362 auto CGPB = X86CodeGenPassBuilder(*
this, Opt,
PIC);
363 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
Register const TargetRegisterInfo * TRI
Promote Memory to Register
ModuleAnalysisManager MAM
PassBuilder PB(Mod->getContext(), Machine, PassOpts->PTO, std::nullopt, &PIC)
PassInstrumentationCallbacks PIC
MachineRegisterInfo & MRI
This file describes the interface of the MachineFunctionPass responsible for assigning the generic vi...
const GCNTargetMachine & getTM(const GCNSubtarget *STI)
static bool onlyAllocateTileRegisters(const TargetRegisterInfo &TRI, const MachineRegisterInfo &MRI, const Register Reg)
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.
Context object for machine code objects.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
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,...
const AArch64MCOptions & getCLOpts(const MCTargetOptions &Options)
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.
MCRegisterClass TargetRegisterClass