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>();
110 void addIRPasses(PassManagerWrapper &PMW)
override;
111 Error addInstSelector(PassManagerWrapper &PMW)
override;
112 void addPreRegAlloc(PassManagerWrapper &PMW)
override;
113 void addPostRegAlloc(PassManagerWrapper &PMW)
override;
116 void addTargetRegisterAllocator(PassManagerWrapper &PMW,
bool)
override {}
117 Error addFastRegAlloc(PassManagerWrapper &PMW)
override;
118 Error addOptimizedRegAlloc(PassManagerWrapper &PMW)
override;
120 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
121 void addAsmPrinter(PassManagerWrapper &PMW)
override;
122 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
126 void addEarlyCSEOrGVNPass(PassManagerWrapper &PMW);
129 void addAddressSpaceInferencePasses(PassManagerWrapper &PMW);
132 void addStraightLineScalarOptimizationPasses(PassManagerWrapper &PMW);
136 if (getOptLevel() == CodeGenOptLevel::Aggressive)
138 addFunctionPass(GVNPass(GVNOptions().setScalarPRE(
false)), PMW);
140 addFunctionPass(EarlyCSEPass(), PMW);
143void NVPTXCodeGenPassBuilder::addAddressSpaceInferencePasses(
144 PassManagerWrapper &PMW) {
150 addFunctionPass(NVPTXLowerAllocaPass(), PMW);
153 addFunctionPass(InferAddressSpacesPass(), PMW);
154 addFunctionPass(NVPTXAtomicLowerPass(), PMW);
157void NVPTXCodeGenPassBuilder::addStraightLineScalarOptimizationPasses(
158 PassManagerWrapper &PMW) {
159 addFunctionPass(SeparateConstOffsetFromGEPPass(), PMW);
160 addFunctionPass(SpeculativeExecutionPass(), PMW);
163 addFunctionPass(StraightLineStrengthReducePass(), PMW);
167 addEarlyCSEOrGVNPass(PMW);
169 addFunctionPass(NaryReassociatePass(), PMW);
172 addFunctionPass(EarlyCSEPass(), PMW);
175void NVPTXCodeGenPassBuilder::addIRPasses(PassManagerWrapper &PMW) {
183 addModulePass(NVVMReflectPass(
ST.getSmVersion()), PMW);
185 if (getOptLevel() != CodeGenOptLevel::None)
186 addFunctionPass(NVPTXImageOptimizerPass(), PMW);
188 addModulePass(NVPTXAssignValidGlobalNamesPass(), PMW);
189 addModulePass(GenericToNVVMPass(), PMW);
192 addModulePass(ExpandVariadicsPass(ExpandVariadicsMode::Lowering), PMW);
196 if (
getTM().getDrvInterface() == NVPTX::CUDA) {
197 addFunctionPass(NVPTXMarkKernelPtrsGlobalPass(), PMW);
200 addModulePass(NVPTXPromoteParamAlignPass(), PMW);
201 addModulePass(NVPTXLowerArgsPass(TM), PMW);
202 if (getOptLevel() != CodeGenOptLevel::None) {
203 addAddressSpaceInferencePasses(PMW);
204 addStraightLineScalarOptimizationPasses(PMW);
207 addFunctionPass(NVPTXLowerAllocaPass(), PMW);
210 addFunctionPass(AtomicExpandPass(TM), PMW);
212 addModulePass(NVPTXCtorDtorLoweringPass(), PMW);
215 Base::addIRPasses(PMW);
228 if (getOptLevel() != CodeGenOptLevel::None) {
229 addEarlyCSEOrGVNPass(PMW);
231 addFunctionPass(LoadStoreVectorizerPass(), PMW);
235 addFunctionPass(NVPTXTagInvariantLoadsPass(), PMW);
237 addFunctionPass(NVPTXIRPeepholePass(), PMW);
240 if (
ST.hasPTXASUnreachableBug()) {
243 addFunctionPass(NVPTXLowerUnreachablePass(TM.Options.TrapUnreachable,
244 TM.Options.NoTrapAfterNoreturn),
249Error NVPTXCodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
250 addFunctionPass(NVPTXLowerAggrCopiesPass(), PMW);
251 addFunctionPass(NVPTXAllocaHoistingPass(), PMW);
252 addMachineFunctionPass(NVPTXISelDAGToDAGPass(
getTM(), getOptLevel()), PMW);
253 addMachineFunctionPass(NVPTXReplaceImageHandlesPass(), PMW);
257void NVPTXCodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW) {
258 addMachineFunctionPass(NVPTXForwardParamsPass(), PMW);
259 if (getOptLevel() != CodeGenOptLevel::None)
260 addMachineFunctionPass(NVPTXAddressFolderPass(), PMW);
262 addMachineFunctionPass(NVPTXProxyRegErasurePass(), PMW);
265void NVPTXCodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW) {
266 addMachineFunctionPass(NVPTXPrologEpilogPass(), PMW);
267 if (getOptLevel() != CodeGenOptLevel::None) {
271 addMachineFunctionPass(NVPTXPeepholePass(), PMW);
275Error NVPTXCodeGenPassBuilder::addFastRegAlloc(PassManagerWrapper &PMW) {
276 addMachineFunctionPass(PHIEliminationPass(), PMW);
277 addMachineFunctionPass(TwoAddressInstructionPass(), PMW);
281Error NVPTXCodeGenPassBuilder::addOptimizedRegAlloc(PassManagerWrapper &PMW) {
282 addMachineFunctionPass(ProcessImplicitDefsPass(), PMW);
286 addMachineFunctionPass(UnreachableMachineBlockElimPass(), PMW);
287 addMachineFunctionPass(
288 RequireAnalysisPass<LiveVariablesAnalysis, MachineFunction>(), PMW);
289 addMachineFunctionPass(
290 RequireAnalysisPass<MachineLoopAnalysis, MachineFunction>(), PMW);
291 addMachineFunctionPass(PHIEliminationPass(), PMW);
293 addMachineFunctionPass(TwoAddressInstructionPass(), PMW);
294 addMachineFunctionPass(RegisterCoalescerPass(), PMW);
297 addMachineFunctionPass(MachineSchedulerPass(&TM), PMW);
299 addMachineFunctionPass(StackSlotColoringPass(), PMW);
307void NVPTXCodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
308 addModulePass(NVPTXAsmPrinterBeginPass(), PMW,
true);
311void NVPTXCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
312 addMachineFunctionPass(NVPTXAsmPrinterPass(), PMW);
315void NVPTXCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
316 addModulePass(NVPTXAsmPrinterEndPass(), PMW);
322#define GET_PASS_REGISTRY "NVPTXPassRegistry.def"
325 PB.registerPipelineStartEPCallback(
329 if (Subtarget.hasTargetName())
342 PB.registerFullLinkTimeOptimizationLastEPCallback(
356 auto CGPB = NVPTXCodeGenPassBuilder(*
this, Opt,
PIC);
357 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.