60 using Base = CodeGenPassBuilder;
62 const NVPTXOptions &CLOpts;
64 NVPTXTargetMachine &
getTM()
const {
65 return static_cast<NVPTXTargetMachine &
>(TM);
69 explicit NVPTXCodeGenPassBuilder(NVPTXTargetMachine &TM,
70 const CGPassBuilderOption &Opts,
71 PassInstrumentationCallbacks *
PIC)
72 : CodeGenPassBuilder(TM, Opts,
PIC), CLOpts(TM.
getCLOpts()) {
78 disablePass<PrologEpilogInserterPass, MachineLateInstrsCleanupPass,
79 MachineCopyPropagationPass, TailDuplicatePass,
80 StackMapLivenessPass, PostRAMachineSinkingPass,
81 PostRASchedulerPass, FuncletLayoutPass, PatchableFunctionPass,
82 ShrinkWrapPass, RemoveLoadsIntoFakeUsesPass,
83 MachineBlockPlacementPass>();
86 void addIRPasses(PassManagerWrapper &PMW)
override;
87 Error addInstSelector(PassManagerWrapper &PMW)
override;
88 void addPreRegAlloc(PassManagerWrapper &PMW)
override;
89 void addPostRegAlloc(PassManagerWrapper &PMW)
override;
92 void addTargetRegisterAllocator(PassManagerWrapper &PMW,
bool)
override {}
93 Error addFastRegAlloc(PassManagerWrapper &PMW)
override;
94 Error addOptimizedRegAlloc(PassManagerWrapper &PMW)
override;
96 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
97 void addAsmPrinter(PassManagerWrapper &PMW)
override;
98 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
102 void addEarlyCSEOrGVNPass(PassManagerWrapper &PMW);
105 void addAddressSpaceInferencePasses(PassManagerWrapper &PMW);
108 void addStraightLineScalarOptimizationPasses(PassManagerWrapper &PMW);
112 if (getOptLevel() == CodeGenOptLevel::Aggressive)
114 addFunctionPass(GVNPass(GVNOptions().setScalarPRE(
false)), PMW);
116 addFunctionPass(EarlyCSEPass(), PMW);
119void NVPTXCodeGenPassBuilder::addAddressSpaceInferencePasses(
120 PassManagerWrapper &PMW) {
126 addFunctionPass(NVPTXLowerAllocaPass(), PMW);
129 addFunctionPass(InferAddressSpacesPass(), PMW);
130 addFunctionPass(NVPTXAtomicLowerPass(), PMW);
133void NVPTXCodeGenPassBuilder::addStraightLineScalarOptimizationPasses(
134 PassManagerWrapper &PMW) {
135 addFunctionPass(SeparateConstOffsetFromGEPPass(), PMW);
136 addFunctionPass(SpeculativeExecutionPass(), PMW);
139 addFunctionPass(StraightLineStrengthReducePass(), PMW);
143 addEarlyCSEOrGVNPass(PMW);
145 addFunctionPass(NaryReassociatePass(), PMW);
148 addFunctionPass(EarlyCSEPass(), PMW);
151void NVPTXCodeGenPassBuilder::addIRPasses(PassManagerWrapper &PMW) {
159 addModulePass(NVVMReflectPass(
ST.getSmVersion()), PMW);
160 addModulePass(NVPTXCanonicalizeDynamicSharedPass(), PMW);
162 if (getOptLevel() != CodeGenOptLevel::None)
163 addFunctionPass(NVPTXImageOptimizerPass(), PMW);
165 addModulePass(NVPTXAssignValidGlobalNamesPass(), PMW);
166 addModulePass(GenericToNVVMPass(), PMW);
169 addModulePass(ExpandVariadicsPass(ExpandVariadicsMode::Lowering), PMW);
173 if (
getTM().getDrvInterface() == NVPTX::CUDA) {
174 addFunctionPass(NVPTXMarkKernelPtrsGlobalPass(), PMW);
177 addModulePass(NVPTXPromoteParamAlignPass(), PMW);
178 addModulePass(NVPTXLowerArgsPass(TM), PMW);
179 if (getOptLevel() != CodeGenOptLevel::None) {
180 addAddressSpaceInferencePasses(PMW);
181 addStraightLineScalarOptimizationPasses(PMW);
184 addFunctionPass(NVPTXLowerAllocaPass(), PMW);
187 addFunctionPass(AtomicExpandPass(TM), PMW);
189 addModulePass(NVPTXCtorDtorLoweringPass(), PMW);
192 Base::addIRPasses(PMW);
205 if (getOptLevel() != CodeGenOptLevel::None) {
206 addEarlyCSEOrGVNPass(PMW);
207 if (!CLOpts.disable_nvptx_load_store_vectorizer)
208 addFunctionPass(LoadStoreVectorizerPass(), PMW);
212 addFunctionPass(NVPTXTagInvariantLoadsPass(), PMW);
213 if (!CLOpts.disable_nvptx_ir_peephole)
214 addFunctionPass(NVPTXIRPeepholePass(), PMW);
217 if (
ST.hasPTXASUnreachableBug()) {
220 addFunctionPass(NVPTXLowerUnreachablePass(TM.Options.TrapUnreachable,
221 TM.Options.NoTrapAfterNoreturn),
226Error NVPTXCodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
227 addFunctionPass(NVPTXLowerAggrCopiesPass(), PMW);
228 addFunctionPass(NVPTXAllocaHoistingPass(), PMW);
229 addMachineFunctionPass(NVPTXISelDAGToDAGPass(
getTM(), getOptLevel()), PMW);
230 addMachineFunctionPass(NVPTXReplaceImageHandlesPass(), PMW);
234void NVPTXCodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW) {
235 addMachineFunctionPass(NVPTXForwardParamsPass(), PMW);
236 if (getOptLevel() != CodeGenOptLevel::None)
237 addMachineFunctionPass(NVPTXAddressFolderPass(), PMW);
239 addMachineFunctionPass(NVPTXProxyRegErasurePass(), PMW);
242void NVPTXCodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW) {
243 addMachineFunctionPass(NVPTXPrologEpilogPass(), PMW);
244 if (getOptLevel() != CodeGenOptLevel::None) {
248 addMachineFunctionPass(NVPTXPeepholePass(), PMW);
252Error NVPTXCodeGenPassBuilder::addFastRegAlloc(PassManagerWrapper &PMW) {
253 addMachineFunctionPass(PHIEliminationPass(), PMW);
254 addMachineFunctionPass(TwoAddressInstructionPass(), PMW);
258Error NVPTXCodeGenPassBuilder::addOptimizedRegAlloc(PassManagerWrapper &PMW) {
259 addMachineFunctionPass(ProcessImplicitDefsPass(), PMW);
260 addMachineFunctionPass(
261 RequireAnalysisPass<MachineLoopAnalysis, MachineFunction>(), PMW);
262 addMachineFunctionPass(PHIEliminationPass(), PMW);
264 addMachineFunctionPass(TwoAddressInstructionPass(), PMW);
265 addMachineFunctionPass(RegisterCoalescerPass(), PMW);
268 addMachineFunctionPass(MachineSchedulerPass(&TM), PMW);
270 addMachineFunctionPass(StackSlotColoringPass(), PMW);
278void NVPTXCodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
279 addModulePass(NVPTXAsmPrinterBeginPass(), PMW,
true);
282void NVPTXCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
283 addMachineFunctionPass(NVPTXAsmPrinterPass(), PMW);
286void NVPTXCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
287 addModulePass(NVPTXAsmPrinterEndPass(), PMW);
293#define GET_PASS_REGISTRY "NVPTXPassRegistry.def"
296 PB.registerPipelineStartEPCallback(
303 if (Subtarget.hasTargetName())
310 if (CLOpts.early_byval_copy)
319 PB.registerFullLinkTimeOptimizationEarlyEPCallback(CanonicalizeAfterLink);
320 PB.registerThinLinkTimeOptimizationEarlyEPCallback(CanonicalizeAfterLink);
323 PB.registerFullLinkTimeOptimizationLastEPCallback(
337 auto CGPB = NVPTXCodeGenPassBuilder(*
this, Opt,
PIC);
338 return CGPB.buildPipeline(MPM,
MAM, Out, DwoOut, FileType, Ctx);
Interfaces for producing common pass manager configurations.
This file provides the interface for a simple, fast CSE pass.
This file provides the interface for LLVM's Global Value Numbering pass which eliminates fully redund...
This is the NVPTX address space based alias analysis pass.
ModuleAnalysisManager MAM
PassBuilder PB(Mod->getContext(), Machine, PassOpts->PTO, std::nullopt, &PIC)
PassInstrumentationCallbacks PIC
This file defines the Pass Instrumentation classes that provide instrumentation points into the pass ...
const GCNTargetMachine & getTM(const GCNSubtarget *STI)
This file provides the interface for LLVM's Scalar Replacement of Aggregates pass.
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.
const TargetSubtargetInfo * getSubtargetImpl(const Function &) const override
Virtual method implemented by subclasses that returns a reference to that target's TargetSubtargetInf...
Context object for machine code objects.
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
This class provides access to building LLVM's passes.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same_v< PassT, PassManager > > addPass(PassT &&Pass)
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.
ModuleToFunctionPassAdaptor createModuleToFunctionPassAdaptor(FunctionPassT &&Pass, bool EagerlyInvalidate=false)
A function to deduce a function pass type and wrap it in the templated adaptor.
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.
PassManager< Function > FunctionPassManager
Convenience typedef for a pass manager over functions.
LLVM_ABI llvm::cl::opt< bool > NoKernelInfoEndLTO
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.