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 addMachineSSAOptimization(PassManagerWrapper &PMW)
override;
72 void addILPOpts(PassManagerWrapper &PMW)
override;
73 void addPreRegAlloc(PassManagerWrapper &PMW)
override;
74 Error addRegAssignAndRewriteFast(PassManagerWrapper &PMW)
override;
76 addRegAssignAndRewriteOptimized(PassManagerWrapper &PMW)
override;
77 void addPostRegAlloc(PassManagerWrapper &PMW)
override;
78 void addPreSched2(PassManagerWrapper &PMW)
override;
79 void addPreEmitPass(PassManagerWrapper &PMW)
override;
80 void addPreEmitPass2(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);
116 addFunctionPass(X86FenceNonTemporalStoresPass(&
getTM()), PMW);
119void X86CodeGenPassBuilder::addPreISel(PassManagerWrapper &PMW) {
121 const Triple &
TT = TM.getTargetTriple();
122 if (
TT.isOSWindows() &&
TT.isX86_32()) {
124 addModulePass(X86WinEHStatePass(), PMW);
128Error X86CodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
129 addMachineFunctionPass(X86ISelDAGToDAGPass(
getTM()), PMW);
132 if (TM.getTargetTriple().isOSBinFormatELF() &&
133 getOptLevel() != CodeGenOptLevel::None) {
134 addMachineFunctionPass(X86CleanupLocalDynamicTLSPass(), PMW);
137 addMachineFunctionPass(X86GlobalBaseRegPass(), PMW);
138 addMachineFunctionPass(X86ArgumentStackSlotPass(), PMW);
142Error X86CodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
143 addMachineFunctionPass(IRTranslatorPass(getOptLevel()), PMW);
147void X86CodeGenPassBuilder::addPreLegalizeMachineIR(PassManagerWrapper &PMW) {
148 if (getOptLevel() != CodeGenOptLevel::None)
149 addMachineFunctionPass(X86PreLegalizerCombinerPass(), PMW);
152Error X86CodeGenPassBuilder::addLegalizeMachineIR(PassManagerWrapper &PMW) {
153 addMachineFunctionPass(LegalizerPass(), PMW);
157void X86CodeGenPassBuilder::addPreRegBankSelect(PassManagerWrapper &PMW) {
158 if (getOptLevel() != CodeGenOptLevel::None)
159 addMachineFunctionPass(X86PostLegalizerCombinerPass(), PMW);
162Error X86CodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
163 addMachineFunctionPass(RegBankSelectPass(), PMW);
167Error X86CodeGenPassBuilder::addGlobalInstructionSelect(
168 PassManagerWrapper &PMW) {
169 addMachineFunctionPass(InstructionSelectPass(getOptLevel()), PMW);
171 if (isGlobalISelAbortEnabled())
172 addMachineFunctionPass(X86GlobalBaseRegPass(), PMW);
176void X86CodeGenPassBuilder::addMachineSSAOptimization(PassManagerWrapper &PMW) {
177 addMachineFunctionPass(X86DomainReassignmentPass(), PMW);
178 Base::addMachineSSAOptimization(PMW);
181void X86CodeGenPassBuilder::addILPOpts(PassManagerWrapper &PMW) {
182 addMachineFunctionPass(EarlyIfConverterPass(), PMW);
184 addMachineFunctionPass(MachineCombinerPass(), PMW);
185 addMachineFunctionPass(X86CmovConversionPass(), PMW);
188void X86CodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW) {
189 if (getOptLevel() != CodeGenOptLevel::None) {
190 addMachineFunctionPass(LiveRangeShrinkPass(), PMW);
191 addMachineFunctionPass(X86FixupSetCCPass(), PMW);
192 addMachineFunctionPass(X86OptimizeLEAsPass(), PMW);
193 addMachineFunctionPass(X86CallFrameOptimizationPass(), PMW);
194 addMachineFunctionPass(X86AvoidStoreForwardingBlocksPass(), PMW);
197 addMachineFunctionPass(X86SuppressAPXForRelocationPass(), PMW);
198 addMachineFunctionPass(X86SpeculativeLoadHardeningPass(), PMW);
199 addMachineFunctionPass(X86FlagsCopyLoweringPass(), PMW);
200 addMachineFunctionPass(X86DynAllocaExpanderPass(), PMW);
202 if (getOptLevel() != CodeGenOptLevel::None)
203 addMachineFunctionPass(X86PreTileConfigPass(), PMW);
205 addMachineFunctionPass(X86FastPreTileConfigPass(), PMW);
209 const MachineRegisterInfo &
MRI,
212 return static_cast<const X86RegisterInfo &
>(
TRI).isTileRegisterClass(RC);
215Error X86CodeGenPassBuilder::addRegAssignAndRewriteFast(
216 PassManagerWrapper &PMW) {
217 Error PossibleError = Base::addRegAssignAndRewriteFast(PMW);
218 addMachineFunctionPass(X86FastTileConfigPass(), PMW);
219 return PossibleError;
222Expected<bool> X86CodeGenPassBuilder::addRegAssignAndRewriteOptimized(
223 PassManagerWrapper &PMW) {
225 if (Opt.RegAlloc == RegAllocType::Default &&
getTM().
getCLOpts().tile_ra) {
227 addMachineFunctionPass(
229 addMachineFunctionPass(X86TileConfigPass(), PMW);
231 return Base::addRegAssignAndRewriteOptimized(PMW);
234void X86CodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW) {
235 addMachineFunctionPass(X86LowerTileCopyPass(), PMW);
236 addMachineFunctionPass(X86FPStackifierPass(), PMW);
241 if (getOptLevel() != CodeGenOptLevel::None) {
242 addMachineFunctionPass(X86LoadValueInjectionLoadHardeningPass(), PMW);
246void X86CodeGenPassBuilder::addPreSched2(PassManagerWrapper &PMW) {
247 addMachineFunctionPass(X86ExpandPseudoPass(), PMW);
248 addMachineFunctionPass(MachineKCFIPass(), PMW);
251void X86CodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) {
252 if (getOptLevel() != CodeGenOptLevel::None) {
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(),
291 addMachineFunctionPass(X86ReturnThunksPass(), PMW);
295 if (
TT.isOSWindows() &&
TT.isX86_64())
296 addMachineFunctionPass(X86AvoidTrailingCallPass(), PMW);
302 if (!
TT.isOSDarwin())
303 addMachineFunctionPass(CFIInstrInserterPass(), PMW);
305 if (
TT.isOSWindows()) {
307 addMachineFunctionPass(CFGuardLongjmpPass(), PMW);
309 addMachineFunctionPass(EHContGuardTargetsPass(), PMW);
312 addMachineFunctionPass(X86LoadValueInjectionRetHardeningPass(), PMW);
315 addMachineFunctionPass(PseudoProbeInserterPass(), PMW);
319 addMachineFunctionPass(
325 return M->getModuleFlag(
"kcfi") ||
327 (
M->getFunction(
"objc_retainAutoreleasedReturnValue") ||
328 M->getFunction(
"objc_unsafeClaimAutoreleasedReturnValue")));
334 if (
TT.isOSWindows() &&
TT.isX86_64()) {
335 addMachineFunctionPass(X86WinEHUnwindV2Pass(), PMW);
339void X86CodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
340 addModulePass(X86AsmPrinterBeginPass(), PMW,
true);
343void X86CodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
344 addMachineFunctionPass(X86AsmPrinterPass(), PMW);
347void X86CodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
348 addModulePass(X86AsmPrinterEndPass(), PMW,
true);
354#define GET_PASS_REGISTRY "X86PassRegistry.def"
363 auto CGPB = X86CodeGenPassBuilder(*
this, Opt,
PIC);
364 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