82 "nvptx-early-byval-copy",
83 cl::desc(
"Create a copy of byval function arguments early."),
96 explicit NVPTXCodeGenPassBuilder(NVPTXTargetMachine &TM,
97 const CGPassBuilderOption &Opts,
98 PassInstrumentationCallbacks *
PIC)
99 : CodeGenPassBuilder(TM, Opts,
PIC) {
105 disablePass<PrologEpilogInserterPass, MachineLateInstrsCleanupPass,
106 MachineCopyPropagationPass, TailDuplicatePass,
107 StackMapLivenessPass, PostRAMachineSinkingPass,
108 PostRASchedulerPass, FuncletLayoutPass, PatchableFunctionPass,
109 ShrinkWrapPass, RemoveLoadsIntoFakeUsesPass>();
112 void addIRPasses(PassManagerWrapper &PMW)
override;
113 Error addInstSelector(PassManagerWrapper &PMW)
override;
114 void addPreRegAlloc(PassManagerWrapper &PMW)
override;
115 void addPostRegAlloc(PassManagerWrapper &PMW)
override;
118 void addTargetRegisterAllocator(PassManagerWrapper &PMW,
bool)
override {}
119 Error addFastRegAlloc(PassManagerWrapper &PMW)
override;
120 Error addOptimizedRegAlloc(PassManagerWrapper &PMW)
override;
122 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
123 void addAsmPrinter(PassManagerWrapper &PMW)
override;
124 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
128 void addEarlyCSEOrGVNPass(PassManagerWrapper &PMW);
131 void addAddressSpaceInferencePasses(PassManagerWrapper &PMW);
134 void addStraightLineScalarOptimizationPasses(PassManagerWrapper &PMW);
138 if (getOptLevel() == CodeGenOptLevel::Aggressive)
140 addFunctionPass(GVNPass(GVNOptions().setScalarPRE(
false)), PMW);
142 addFunctionPass(EarlyCSEPass(), PMW);
145void NVPTXCodeGenPassBuilder::addAddressSpaceInferencePasses(
146 PassManagerWrapper &PMW) {
152 addFunctionPass(NVPTXLowerAllocaPass(), PMW);
155 addFunctionPass(InferAddressSpacesPass(), PMW);
156 addFunctionPass(NVPTXAtomicLowerPass(), PMW);
159void NVPTXCodeGenPassBuilder::addStraightLineScalarOptimizationPasses(
160 PassManagerWrapper &PMW) {
161 addFunctionPass(SeparateConstOffsetFromGEPPass(), PMW);
162 addFunctionPass(SpeculativeExecutionPass(), PMW);
165 addFunctionPass(StraightLineStrengthReducePass(), PMW);
169 addEarlyCSEOrGVNPass(PMW);
171 addFunctionPass(NaryReassociatePass(), PMW);
174 addFunctionPass(EarlyCSEPass(), PMW);
177void NVPTXCodeGenPassBuilder::addIRPasses(PassManagerWrapper &PMW) {
185 addModulePass(NVVMReflectPass(
ST.getSmVersion()), PMW);
187 if (getOptLevel() != CodeGenOptLevel::None)
188 addFunctionPass(NVPTXImageOptimizerPass(), PMW);
190 addModulePass(NVPTXAssignValidGlobalNamesPass(), PMW);
191 addModulePass(GenericToNVVMPass(), PMW);
194 addModulePass(ExpandVariadicsPass(ExpandVariadicsMode::Lowering), PMW);
198 if (
getTM().getDrvInterface() == NVPTX::CUDA) {
199 addFunctionPass(NVPTXMarkKernelPtrsGlobalPass(), PMW);
202 addModulePass(NVPTXPromoteParamAlignPass(), PMW);
203 addModulePass(NVPTXLowerArgsPass(TM), PMW);
204 if (getOptLevel() != CodeGenOptLevel::None) {
205 addAddressSpaceInferencePasses(PMW);
206 addStraightLineScalarOptimizationPasses(PMW);
209 addFunctionPass(NVPTXLowerAllocaPass(), PMW);
212 addFunctionPass(AtomicExpandPass(TM), PMW);
214 addModulePass(NVPTXCtorDtorLoweringPass(), PMW);
217 Base::addIRPasses(PMW);
230 if (getOptLevel() != CodeGenOptLevel::None) {
231 addEarlyCSEOrGVNPass(PMW);
233 addFunctionPass(LoadStoreVectorizerPass(), PMW);
237 addFunctionPass(NVPTXTagInvariantLoadsPass(), PMW);
239 addFunctionPass(NVPTXIRPeepholePass(), PMW);
242 if (
ST.hasPTXASUnreachableBug()) {
245 addFunctionPass(NVPTXLowerUnreachablePass(TM.Options.TrapUnreachable,
246 TM.Options.NoTrapAfterNoreturn),
251Error NVPTXCodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
252 addFunctionPass(NVPTXLowerAggrCopiesPass(), PMW);
253 addFunctionPass(NVPTXAllocaHoistingPass(), PMW);
254 addMachineFunctionPass(NVPTXISelDAGToDAGPass(
getTM(), getOptLevel()), PMW);
255 addMachineFunctionPass(NVPTXReplaceImageHandlesPass(), PMW);
259void NVPTXCodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW) {
260 addMachineFunctionPass(NVPTXForwardParamsPass(), PMW);
261 if (getOptLevel() != CodeGenOptLevel::None)
262 addMachineFunctionPass(NVPTXAddressFolderPass(), PMW);
264 addMachineFunctionPass(NVPTXProxyRegErasurePass(), PMW);
267void NVPTXCodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW) {
268 addMachineFunctionPass(NVPTXPrologEpilogPass(), PMW);
269 if (getOptLevel() != CodeGenOptLevel::None) {
273 addMachineFunctionPass(NVPTXPeepholePass(), PMW);
277Error NVPTXCodeGenPassBuilder::addFastRegAlloc(PassManagerWrapper &PMW) {
278 addMachineFunctionPass(PHIEliminationPass(), PMW);
279 addMachineFunctionPass(TwoAddressInstructionPass(), PMW);
283Error NVPTXCodeGenPassBuilder::addOptimizedRegAlloc(PassManagerWrapper &PMW) {
284 addMachineFunctionPass(ProcessImplicitDefsPass(), PMW);
288 addMachineFunctionPass(UnreachableMachineBlockElimPass(), PMW);
289 addMachineFunctionPass(
290 RequireAnalysisPass<LiveVariablesAnalysis, MachineFunction>(), PMW);
291 addMachineFunctionPass(
292 RequireAnalysisPass<MachineLoopAnalysis, MachineFunction>(), PMW);
293 addMachineFunctionPass(PHIEliminationPass(), PMW);
295 addMachineFunctionPass(TwoAddressInstructionPass(), PMW);
296 addMachineFunctionPass(RegisterCoalescerPass(), PMW);
299 addMachineFunctionPass(MachineSchedulerPass(&TM), PMW);
301 addMachineFunctionPass(StackSlotColoringPass(), PMW);
309void NVPTXCodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
310 addModulePass(NVPTXAsmPrinterBeginPass(), PMW,
true);
313void NVPTXCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
314 addMachineFunctionPass(NVPTXAsmPrinterPass(), PMW);
317void NVPTXCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
318 addModulePass(NVPTXAsmPrinterEndPass(), PMW);
324#define GET_PASS_REGISTRY "NVPTXPassRegistry.def"
327 PB.registerPipelineStartEPCallback(
331 if (Subtarget.hasTargetName())
344 PB.registerFullLinkTimeOptimizationLastEPCallback(
358 auto CGPB = NVPTXCodeGenPassBuilder(*
this, Opt,
PIC);
359 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.