80 "nvptx-early-byval-copy",
81 cl::desc(
"Create a copy of byval function arguments early."),
94 explicit NVPTXCodeGenPassBuilder(NVPTXTargetMachine &TM,
95 const CGPassBuilderOption &Opts,
96 PassInstrumentationCallbacks *
PIC)
97 : CodeGenPassBuilder(TM, Opts,
PIC) {
103 disablePass<PrologEpilogInserterPass, MachineLateInstrsCleanupPass,
104 MachineCopyPropagationPass, TailDuplicatePass,
105 StackMapLivenessPass, PostRAMachineSinkingPass,
106 PostRASchedulerPass, FuncletLayoutPass, PatchableFunctionPass,
107 ShrinkWrapPass, RemoveLoadsIntoFakeUsesPass,
108 MachineBlockPlacementPass>();
111 void addIRPasses(PassManagerWrapper &PMW)
override;
112 Error addInstSelector(PassManagerWrapper &PMW)
override;
113 void addPreRegAlloc(PassManagerWrapper &PMW)
override;
114 void addPostRegAlloc(PassManagerWrapper &PMW)
override;
117 void addTargetRegisterAllocator(PassManagerWrapper &PMW,
bool)
override {}
118 Error addFastRegAlloc(PassManagerWrapper &PMW)
override;
119 Error addOptimizedRegAlloc(PassManagerWrapper &PMW)
override;
121 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
122 void addAsmPrinter(PassManagerWrapper &PMW)
override;
123 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
127 void addEarlyCSEOrGVNPass(PassManagerWrapper &PMW);
130 void addAddressSpaceInferencePasses(PassManagerWrapper &PMW);
133 void addStraightLineScalarOptimizationPasses(PassManagerWrapper &PMW);
137 if (getOptLevel() == CodeGenOptLevel::Aggressive)
139 addFunctionPass(GVNPass(GVNOptions().setScalarPRE(
false)), PMW);
141 addFunctionPass(EarlyCSEPass(), PMW);
144void NVPTXCodeGenPassBuilder::addAddressSpaceInferencePasses(
145 PassManagerWrapper &PMW) {
151 addFunctionPass(NVPTXLowerAllocaPass(), PMW);
154 addFunctionPass(InferAddressSpacesPass(), PMW);
155 addFunctionPass(NVPTXAtomicLowerPass(), PMW);
158void NVPTXCodeGenPassBuilder::addStraightLineScalarOptimizationPasses(
159 PassManagerWrapper &PMW) {
160 addFunctionPass(SeparateConstOffsetFromGEPPass(), PMW);
161 addFunctionPass(SpeculativeExecutionPass(), PMW);
164 addFunctionPass(StraightLineStrengthReducePass(), PMW);
168 addEarlyCSEOrGVNPass(PMW);
170 addFunctionPass(NaryReassociatePass(), PMW);
173 addFunctionPass(EarlyCSEPass(), PMW);
176void NVPTXCodeGenPassBuilder::addIRPasses(PassManagerWrapper &PMW) {
184 addModulePass(NVVMReflectPass(
ST.getSmVersion()), PMW);
186 if (getOptLevel() != CodeGenOptLevel::None)
187 addFunctionPass(NVPTXImageOptimizerPass(), PMW);
189 addModulePass(NVPTXAssignValidGlobalNamesPass(), PMW);
190 addModulePass(GenericToNVVMPass(), PMW);
193 addModulePass(ExpandVariadicsPass(ExpandVariadicsMode::Lowering), PMW);
197 if (
getTM().getDrvInterface() == NVPTX::CUDA) {
198 addFunctionPass(NVPTXMarkKernelPtrsGlobalPass(), PMW);
201 addModulePass(NVPTXPromoteParamAlignPass(), PMW);
202 addModulePass(NVPTXLowerArgsPass(TM), PMW);
203 if (getOptLevel() != CodeGenOptLevel::None) {
204 addAddressSpaceInferencePasses(PMW);
205 addStraightLineScalarOptimizationPasses(PMW);
208 addFunctionPass(NVPTXLowerAllocaPass(), PMW);
211 addFunctionPass(AtomicExpandPass(TM), PMW);
213 addModulePass(NVPTXCtorDtorLoweringPass(), PMW);
216 Base::addIRPasses(PMW);
229 if (getOptLevel() != CodeGenOptLevel::None) {
230 addEarlyCSEOrGVNPass(PMW);
232 addFunctionPass(LoadStoreVectorizerPass(), PMW);
236 addFunctionPass(NVPTXTagInvariantLoadsPass(), PMW);
238 addFunctionPass(NVPTXIRPeepholePass(), PMW);
241 if (
ST.hasPTXASUnreachableBug()) {
244 addFunctionPass(NVPTXLowerUnreachablePass(TM.Options.TrapUnreachable,
245 TM.Options.NoTrapAfterNoreturn),
250Error NVPTXCodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
251 addFunctionPass(NVPTXLowerAggrCopiesPass(), PMW);
252 addFunctionPass(NVPTXAllocaHoistingPass(), PMW);
253 addMachineFunctionPass(NVPTXISelDAGToDAGPass(
getTM(), getOptLevel()), PMW);
254 addMachineFunctionPass(NVPTXReplaceImageHandlesPass(), PMW);
258void NVPTXCodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW) {
259 addMachineFunctionPass(NVPTXForwardParamsPass(), PMW);
260 if (getOptLevel() != CodeGenOptLevel::None)
261 addMachineFunctionPass(NVPTXAddressFolderPass(), PMW);
263 addMachineFunctionPass(NVPTXProxyRegErasurePass(), PMW);
266void NVPTXCodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW) {
267 addMachineFunctionPass(NVPTXPrologEpilogPass(), PMW);
268 if (getOptLevel() != CodeGenOptLevel::None) {
272 addMachineFunctionPass(NVPTXPeepholePass(), PMW);
276Error NVPTXCodeGenPassBuilder::addFastRegAlloc(PassManagerWrapper &PMW) {
277 addMachineFunctionPass(PHIEliminationPass(), PMW);
278 addMachineFunctionPass(TwoAddressInstructionPass(), PMW);
282Error NVPTXCodeGenPassBuilder::addOptimizedRegAlloc(PassManagerWrapper &PMW) {
283 addMachineFunctionPass(ProcessImplicitDefsPass(), PMW);
284 addMachineFunctionPass(
285 RequireAnalysisPass<MachineLoopAnalysis, MachineFunction>(), PMW);
286 addMachineFunctionPass(PHIEliminationPass(), PMW);
288 addMachineFunctionPass(TwoAddressInstructionPass(), PMW);
289 addMachineFunctionPass(RegisterCoalescerPass(), PMW);
292 addMachineFunctionPass(MachineSchedulerPass(&TM), PMW);
294 addMachineFunctionPass(StackSlotColoringPass(), PMW);
302void NVPTXCodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
303 addModulePass(NVPTXAsmPrinterBeginPass(), PMW,
true);
306void NVPTXCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
307 addMachineFunctionPass(NVPTXAsmPrinterPass(), PMW);
310void NVPTXCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
311 addModulePass(NVPTXAsmPrinterEndPass(), PMW);
317#define GET_PASS_REGISTRY "NVPTXPassRegistry.def"
320 PB.registerPipelineStartEPCallback(
324 if (Subtarget.hasTargetName())
337 PB.registerFullLinkTimeOptimizationLastEPCallback(
351 auto CGPB = NVPTXCodeGenPassBuilder(*
this, Opt,
PIC);
352 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
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,...
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.