48 using Base = CodeGenPassBuilder;
50 X86TargetMachine &
getTM()
const {
51 return static_cast<X86TargetMachine &
>(TM);
55 explicit X86CodeGenPassBuilder(X86TargetMachine &TM,
56 const CGPassBuilderOption &Opts,
57 PassInstrumentationCallbacks *
PIC)
58 : CodeGenPassBuilder(TM, Opts,
PIC) {}
60 void addIRPasses(PassManagerWrapper &PMW)
override;
61 void addPreISel(PassManagerWrapper &PMW)
override;
62 Error addInstSelector(PassManagerWrapper &PMW)
override;
64 Error addIRTranslator(PassManagerWrapper &PMW)
override;
65 void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
override;
66 Error addLegalizeMachineIR(PassManagerWrapper &PMW)
override;
67 void addPreRegBankSelect(PassManagerWrapper &PMW)
override;
68 Error addRegBankSelect(PassManagerWrapper &PMW)
override;
69 Error addGlobalInstructionSelect(PassManagerWrapper &PMW)
override;
71 void addILPOpts(PassManagerWrapper &PMW)
override;
72 void addMachineSSAOptimization(PassManagerWrapper &PMW)
override;
73 void addPreRegAlloc(PassManagerWrapper &PMW)
override;
74 void addPostRegAlloc(PassManagerWrapper &PMW)
override;
75 void addPreSched2(PassManagerWrapper &PMW)
override;
76 void addPreEmitPass(PassManagerWrapper &PMW)
override;
77 void addPreEmitPass2(PassManagerWrapper &PMW)
override;
78 Error addRegAssignAndRewriteFast(PassManagerWrapper &PMW)
override;
80 addRegAssignAndRewriteOptimized(PassManagerWrapper &PMW)
override;
81 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
82 void addAsmPrinter(PassManagerWrapper &PMW)
override;
83 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
87 addFunctionPass(AtomicExpandPass(TM), PMW);
91 addFunctionPass(X86LowerAMXIntrinsicsPass(&TM), PMW);
92 addFunctionPass(X86LowerAMXTypePass(&TM), PMW);
94 Base::addIRPasses(PMW);
96 if (getOptLevel() != CodeGenOptLevel::None) {
97 addFunctionPass(InterleavedAccessPass(TM), PMW);
98 addFunctionPass(X86PartialReductionPass(&
getTM()), PMW);
104 addFunctionPass(IndirectBrExpandPass(TM), PMW);
107 const Triple &
TT = TM.getTargetTriple();
108 if (
TT.isOSWindows())
109 addFunctionPass(CFGuardPass(), PMW);
111 if (TM.Options.JMCInstrument) {
113 addModulePass(JMCInstrumenterPass(), PMW);
117void X86CodeGenPassBuilder::addPreISel(PassManagerWrapper &PMW) {
119 const Triple &
TT = TM.getTargetTriple();
120 if (
TT.isOSWindows() &&
TT.isX86_32()) {
122 addModulePass(X86WinEHStatePass(), PMW);
126Error X86CodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
127 addMachineFunctionPass(X86ISelDAGToDAGPass(
getTM()), PMW);
130 if (TM.getTargetTriple().isOSBinFormatELF() &&
131 getOptLevel() != CodeGenOptLevel::None) {
132 addMachineFunctionPass(X86CleanupLocalDynamicTLSPass(), PMW);
135 addMachineFunctionPass(X86GlobalBaseRegPass(), PMW);
136 addMachineFunctionPass(X86ArgumentStackSlotPass(), PMW);
140Error X86CodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
141 addMachineFunctionPass(IRTranslatorPass(getOptLevel()), PMW);
145void X86CodeGenPassBuilder::addPreLegalizeMachineIR(PassManagerWrapper &PMW) {
146 if (getOptLevel() != CodeGenOptLevel::None)
147 addMachineFunctionPass(X86PreLegalizerCombinerPass(), PMW);
150Error X86CodeGenPassBuilder::addLegalizeMachineIR(PassManagerWrapper &PMW) {
151 addMachineFunctionPass(LegalizerPass(), PMW);
155void X86CodeGenPassBuilder::addPreRegBankSelect(PassManagerWrapper &PMW) {
156 if (getOptLevel() != CodeGenOptLevel::None)
157 addMachineFunctionPass(X86PostLegalizerCombinerPass(), PMW);
160Error X86CodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
161 addMachineFunctionPass(RegBankSelectPass(), PMW);
165Error X86CodeGenPassBuilder::addGlobalInstructionSelect(
166 PassManagerWrapper &PMW) {
167 addMachineFunctionPass(InstructionSelectPass(getOptLevel()), PMW);
169 if (isGlobalISelAbortEnabled())
170 addMachineFunctionPass(X86GlobalBaseRegPass(), PMW);
174void X86CodeGenPassBuilder::addILPOpts(PassManagerWrapper &PMW) {
175 addMachineFunctionPass(EarlyIfConverterPass(), PMW);
177 addMachineFunctionPass(MachineCombinerPass(), PMW);
178 addMachineFunctionPass(X86CmovConversionPass(), PMW);
181void X86CodeGenPassBuilder::addMachineSSAOptimization(PassManagerWrapper &PMW) {
182 addMachineFunctionPass(X86DomainReassignmentPass(), PMW);
183 Base::addMachineSSAOptimization(PMW);
186void X86CodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW) {
187 if (getOptLevel() != CodeGenOptLevel::None) {
188 addMachineFunctionPass(LiveRangeShrinkPass(), PMW);
189 addMachineFunctionPass(X86FixupSetCCPass(), PMW);
190 addMachineFunctionPass(X86OptimizeLEAsPass(), PMW);
191 addMachineFunctionPass(X86CallFrameOptimizationPass(), PMW);
192 addMachineFunctionPass(X86AvoidStoreForwardingBlocksPass(), PMW);
195 addMachineFunctionPass(X86SuppressAPXForRelocationPass(), PMW);
196 addMachineFunctionPass(X86SpeculativeLoadHardeningPass(), PMW);
197 addMachineFunctionPass(X86FlagsCopyLoweringPass(), PMW);
198 addMachineFunctionPass(X86DynAllocaExpanderPass(), PMW);
200 if (getOptLevel() != CodeGenOptLevel::None)
201 addMachineFunctionPass(X86PreTileConfigPass(), PMW);
203 addMachineFunctionPass(X86FastPreTileConfigPass(), PMW);
206void X86CodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW) {
207 addMachineFunctionPass(X86LowerTileCopyPass(), PMW);
208 addMachineFunctionPass(X86FPStackifierPass(), PMW);
213 if (getOptLevel() != CodeGenOptLevel::None) {
214 addMachineFunctionPass(X86LoadValueInjectionLoadHardeningPass(), PMW);
218void X86CodeGenPassBuilder::addPreSched2(PassManagerWrapper &PMW) {
219 addMachineFunctionPass(X86ExpandPseudoPass(), PMW);
220 addMachineFunctionPass(MachineKCFIPass(), PMW);
223void X86CodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) {
224 if (getOptLevel() != CodeGenOptLevel::None) {
227 addMachineFunctionPass(BreakFalseDepsPass(), PMW);
230 addMachineFunctionPass(X86IndirectBranchTrackingPass(), PMW);
231 addMachineFunctionPass(X86InsertVZeroUpperPass(), PMW);
233 if (getOptLevel() != CodeGenOptLevel::None) {
234 addMachineFunctionPass(X86FixupBWInstsPass(), PMW);
235 addMachineFunctionPass(X86PadShortFunctionsPass(), PMW);
236 addMachineFunctionPass(X86FixupLEAsPass(), PMW);
237 addMachineFunctionPass(X86FixupInstTuningPass(), PMW);
238 addMachineFunctionPass(X86FixupVectorConstantsPass(), PMW);
240 addMachineFunctionPass(X86CompressEVEXPass(), PMW);
241 addMachineFunctionPass(X86InsertX87WaitPass(), PMW);
243 if (TM.getTargetTriple().isLFI())
244 addMachineFunctionPass(X86LFIRewritePass(), PMW);
247void X86CodeGenPassBuilder::addPreEmitPass2(PassManagerWrapper &PMW) {
248 const Triple &
TT = TM.getTargetTriple();
259 addMachineFunctionPass(X86SpeculativeExecutionSideEffectSuppressionPass(),
263 addMachineFunctionPass(X86ReturnThunksPass(), PMW);
267 if (
TT.isOSWindows() &&
TT.isX86_64())
268 addMachineFunctionPass(X86AvoidTrailingCallPass(), PMW);
274 if (!
TT.isOSDarwin())
275 addMachineFunctionPass(CFIInstrInserterPass(), PMW);
277 if (
TT.isOSWindows()) {
279 addMachineFunctionPass(CFGuardLongjmpPass(), PMW);
281 addMachineFunctionPass(EHContGuardTargetsPass(), PMW);
284 addMachineFunctionPass(X86LoadValueInjectionRetHardeningPass(), PMW);
287 addMachineFunctionPass(PseudoProbeInserterPass(), PMW);
291 addMachineFunctionPass(
297 return M->getModuleFlag(
"kcfi") ||
299 (
M->getFunction(
"objc_retainAutoreleasedReturnValue") ||
300 M->getFunction(
"objc_unsafeClaimAutoreleasedReturnValue")));
306 if (
TT.isOSWindows() &&
TT.isX86_64()) {
307 addMachineFunctionPass(X86WinEHUnwindV2Pass(), PMW);
312 const MachineRegisterInfo &MRI,
315 return static_cast<const X86RegisterInfo &
>(
TRI).isTileRegisterClass(RC);
318Error X86CodeGenPassBuilder::addRegAssignAndRewriteFast(
319 PassManagerWrapper &PMW) {
320 Error PossibleError = Base::addRegAssignAndRewriteFast(PMW);
321 addMachineFunctionPass(X86FastTileConfigPass(), PMW);
322 return PossibleError;
325Expected<bool> X86CodeGenPassBuilder::addRegAssignAndRewriteOptimized(
326 PassManagerWrapper &PMW) {
328 if (Opt.RegAlloc == RegAllocType::Default &&
getTM().
getCLOpts().tile_ra) {
330 addMachineFunctionPass(
332 addMachineFunctionPass(X86TileConfigPass(), PMW);
334 return Base::addRegAssignAndRewriteOptimized(PMW);
337void X86CodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
338 addModulePass(X86AsmPrinterBeginPass(), PMW,
true);
341void X86CodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
342 addMachineFunctionPass(X86AsmPrinterPass(), PMW);
345void X86CodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
346 addModulePass(X86AsmPrinterEndPass(), PMW,
true);
352#define GET_PASS_REGISTRY "X86PassRegistry.def"
361 auto CGPB = X86CodeGenPassBuilder(*
this, Opt,
PIC);
362 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
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