79 "nvptx-early-byval-copy",
80 cl::desc(
"Create a copy of byval function arguments early."),
93 explicit NVPTXCodeGenPassBuilder(NVPTXTargetMachine &TM,
94 const CGPassBuilderOption &Opts,
95 PassInstrumentationCallbacks *
PIC)
96 : CodeGenPassBuilder(TM, Opts,
PIC) {
102 disablePass<PrologEpilogInserterPass, MachineLateInstrsCleanupPass,
103 MachineCopyPropagationPass, TailDuplicatePass,
104 StackMapLivenessPass, PostRAMachineSinkingPass,
105 PostRASchedulerPass, FuncletLayoutPass, PatchableFunctionPass,
106 ShrinkWrapPass, RemoveLoadsIntoFakeUsesPass>();
109 void addIRPasses(PassManagerWrapper &PMW)
override;
110 Error addInstSelector(PassManagerWrapper &PMW)
override;
111 void addPreRegAlloc(PassManagerWrapper &PMW)
override;
112 void addPostRegAlloc(PassManagerWrapper &PMW)
override;
115 void addTargetRegisterAllocator(PassManagerWrapper &PMW,
bool)
override {}
116 Error addFastRegAlloc(PassManagerWrapper &PMW)
override;
117 Error addOptimizedRegAlloc(PassManagerWrapper &PMW)
override;
119 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
120 void addAsmPrinter(PassManagerWrapper &PMW)
override;
121 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
125 void addEarlyCSEOrGVNPass(PassManagerWrapper &PMW);
128 void addAddressSpaceInferencePasses(PassManagerWrapper &PMW);
131 void addStraightLineScalarOptimizationPasses(PassManagerWrapper &PMW);
135 if (getOptLevel() == CodeGenOptLevel::Aggressive)
137 addFunctionPass(GVNPass(GVNOptions().setScalarPRE(
false)), PMW);
139 addFunctionPass(EarlyCSEPass(), PMW);
142void NVPTXCodeGenPassBuilder::addAddressSpaceInferencePasses(
143 PassManagerWrapper &PMW) {
149 addFunctionPass(NVPTXLowerAllocaPass(), PMW);
152 addFunctionPass(InferAddressSpacesPass(), PMW);
153 addFunctionPass(NVPTXAtomicLowerPass(), PMW);
156void NVPTXCodeGenPassBuilder::addStraightLineScalarOptimizationPasses(
157 PassManagerWrapper &PMW) {
158 addFunctionPass(SeparateConstOffsetFromGEPPass(), PMW);
159 addFunctionPass(SpeculativeExecutionPass(), PMW);
162 addFunctionPass(StraightLineStrengthReducePass(), PMW);
166 addEarlyCSEOrGVNPass(PMW);
168 addFunctionPass(NaryReassociatePass(), PMW);
171 addFunctionPass(EarlyCSEPass(), PMW);
174void NVPTXCodeGenPassBuilder::addIRPasses(PassManagerWrapper &PMW) {
182 addModulePass(NVVMReflectPass(
ST.getSmVersion()), PMW);
184 if (getOptLevel() != CodeGenOptLevel::None)
185 addFunctionPass(NVPTXImageOptimizerPass(), PMW);
187 addModulePass(NVPTXAssignValidGlobalNamesPass(), PMW);
188 addModulePass(GenericToNVVMPass(), PMW);
191 addModulePass(ExpandVariadicsPass(ExpandVariadicsMode::Lowering), PMW);
195 if (
getTM().getDrvInterface() == NVPTX::CUDA) {
196 addFunctionPass(NVPTXMarkKernelPtrsGlobalPass(), PMW);
199 addModulePass(NVPTXPromoteParamAlignPass(), PMW);
200 addModulePass(NVPTXLowerArgsPass(TM), PMW);
201 if (getOptLevel() != CodeGenOptLevel::None) {
202 addAddressSpaceInferencePasses(PMW);
203 addStraightLineScalarOptimizationPasses(PMW);
206 addFunctionPass(NVPTXLowerAllocaPass(), PMW);
209 addFunctionPass(AtomicExpandPass(TM), PMW);
211 addModulePass(NVPTXCtorDtorLoweringPass(), PMW);
214 Base::addIRPasses(PMW);
227 if (getOptLevel() != CodeGenOptLevel::None) {
228 addEarlyCSEOrGVNPass(PMW);
230 addFunctionPass(LoadStoreVectorizerPass(), PMW);
234 addFunctionPass(NVPTXTagInvariantLoadsPass(), PMW);
236 addFunctionPass(NVPTXIRPeepholePass(), PMW);
239 if (
ST.hasPTXASUnreachableBug()) {
242 addFunctionPass(NVPTXLowerUnreachablePass(TM.Options.TrapUnreachable,
243 TM.Options.NoTrapAfterNoreturn),
248Error NVPTXCodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
249 addFunctionPass(NVPTXLowerAggrCopiesPass(), PMW);
250 addFunctionPass(NVPTXAllocaHoistingPass(), PMW);
251 addMachineFunctionPass(NVPTXISelDAGToDAGPass(
getTM(), getOptLevel()), PMW);
252 addMachineFunctionPass(NVPTXReplaceImageHandlesPass(), PMW);
256void NVPTXCodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW) {
257 addMachineFunctionPass(NVPTXForwardParamsPass(), PMW);
258 if (getOptLevel() != CodeGenOptLevel::None)
259 addMachineFunctionPass(NVPTXAddressFolderPass(), PMW);
261 addMachineFunctionPass(NVPTXProxyRegErasurePass(), PMW);
264void NVPTXCodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW) {
265 addMachineFunctionPass(NVPTXPrologEpilogPass(), PMW);
266 if (getOptLevel() != CodeGenOptLevel::None) {
270 addMachineFunctionPass(NVPTXPeepholePass(), PMW);
274Error NVPTXCodeGenPassBuilder::addFastRegAlloc(PassManagerWrapper &PMW) {
275 addMachineFunctionPass(PHIEliminationPass(), PMW);
276 addMachineFunctionPass(TwoAddressInstructionPass(), PMW);
280Error NVPTXCodeGenPassBuilder::addOptimizedRegAlloc(PassManagerWrapper &PMW) {
281 addMachineFunctionPass(ProcessImplicitDefsPass(), PMW);
282 addMachineFunctionPass(
283 RequireAnalysisPass<MachineLoopAnalysis, MachineFunction>(), PMW);
284 addMachineFunctionPass(PHIEliminationPass(), PMW);
286 addMachineFunctionPass(TwoAddressInstructionPass(), PMW);
287 addMachineFunctionPass(RegisterCoalescerPass(), PMW);
290 addMachineFunctionPass(MachineSchedulerPass(&TM), PMW);
292 addMachineFunctionPass(StackSlotColoringPass(), PMW);
300void NVPTXCodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
301 addModulePass(NVPTXAsmPrinterBeginPass(), PMW,
true);
304void NVPTXCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
305 addMachineFunctionPass(NVPTXAsmPrinterPass(), PMW);
308void NVPTXCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
309 addModulePass(NVPTXAsmPrinterEndPass(), PMW);
315#define GET_PASS_REGISTRY "NVPTXPassRegistry.def"
318 PB.registerPipelineStartEPCallback(
322 if (Subtarget.hasTargetName())
335 PB.registerFullLinkTimeOptimizationLastEPCallback(
349 auto CGPB = NVPTXCodeGenPassBuilder(*
this, Opt,
PIC);
350 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.
cl::opt< bool > DisableNVPTXIRPeephole
static cl::opt< bool > EarlyByValArgsCopy("nvptx-early-byval-copy", cl::desc("Create a copy of byval function arguments early."), cl::init(false), cl::Hidden)
cl::opt< bool > DisableLoadStoreVectorizer
ModuleAnalysisManager MAM
PassInstrumentationCallbacks PIC
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &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,...
initializer< Ty > init(const Ty &Val)
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.