diff --git a/llvm/lib/Target/NVPTX/NVPTX.h b/llvm/lib/Target/NVPTX/NVPTX.h --- a/llvm/lib/Target/NVPTX/NVPTX.h +++ b/llvm/lib/Target/NVPTX/NVPTX.h @@ -38,7 +38,7 @@ FunctionPass *createNVPTXISelDag(NVPTXTargetMachine &TM, llvm::CodeGenOpt::Level OptLevel); ModulePass *createNVPTXAssignValidGlobalNamesPass(); -ModulePass *createGenericToNVVMPass(); +ModulePass *createGenericToNVVMLegacyPass(); FunctionPass *createNVVMIntrRangePass(unsigned int SmVersion); FunctionPass *createNVVMReflectPass(unsigned int SmVersion); MachineFunctionPass *createNVPTXPrologEpilogPass(); @@ -67,6 +67,10 @@ unsigned SmVersion; }; +struct GenericToNVVMPass : PassInfoMixin { + PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); +}; + namespace NVPTX { enum DrvInterface { NVCL, diff --git a/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp b/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp --- a/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp @@ -29,19 +29,13 @@ using namespace llvm; namespace llvm { -void initializeGenericToNVVMPass(PassRegistry &); +void initializeGenericToNVVMLegacyPassPass(PassRegistry &); } namespace { -class GenericToNVVM : public ModulePass { +class GenericToNVVM { public: - static char ID; - - GenericToNVVM() : ModulePass(ID) {} - - bool runOnModule(Module &M) override; - - void getAnalysisUsage(AnalysisUsage &AU) const override {} + bool runOnModule(Module &M); private: Value *remapConstant(Module *M, Function *F, Constant *C, @@ -59,15 +53,6 @@ }; } // end namespace -char GenericToNVVM::ID = 0; - -ModulePass *llvm::createGenericToNVVMPass() { return new GenericToNVVM(); } - -INITIALIZE_PASS( - GenericToNVVM, "generic-to-nvvm", - "Ensure that the global variables are in the global address space", false, - false) - bool GenericToNVVM::runOnModule(Module &M) { // Create a clone of each global variable that has the default address space. // The clone is created with the global address space specifier, and the pair @@ -293,3 +278,34 @@ llvm_unreachable("GenericToNVVM encountered an unsupported ConstantExpr"); } } + +namespace { +class GenericToNVVMLegacyPass : public ModulePass { +public: + static char ID; + + GenericToNVVMLegacyPass() : ModulePass(ID) {} + + bool runOnModule(Module &M) override; +}; +} // namespace + +char GenericToNVVMLegacyPass::ID = 0; + +ModulePass *llvm::createGenericToNVVMLegacyPass() { + return new GenericToNVVMLegacyPass(); +} + +INITIALIZE_PASS( + GenericToNVVMLegacyPass, "generic-to-nvvm", + "Ensure that the global variables are in the global address space", false, + false) + +bool GenericToNVVMLegacyPass::runOnModule(Module &M) { + return GenericToNVVM().runOnModule(M); +} + +PreservedAnalyses GenericToNVVMPass::run(Module &M, ModuleAnalysisManager &AM) { + return GenericToNVVM().runOnModule(M) ? PreservedAnalyses::none() + : PreservedAnalyses::all(); +} diff --git a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp --- a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp @@ -64,7 +64,7 @@ namespace llvm { -void initializeGenericToNVVMPass(PassRegistry&); +void initializeGenericToNVVMLegacyPassPass(PassRegistry &); void initializeNVPTXAllocaHoistingPass(PassRegistry &); void initializeNVPTXAssignValidGlobalNamesPass(PassRegistry&); void initializeNVPTXAtomicLowerPass(PassRegistry &); @@ -89,7 +89,7 @@ // but it's very NVPTX-specific. initializeNVVMReflectPass(PR); initializeNVVMIntrRangePass(PR); - initializeGenericToNVVMPass(PR); + initializeGenericToNVVMLegacyPassPass(PR); initializeNVPTXAllocaHoistingPass(PR); initializeNVPTXAssignValidGlobalNamesPass(PR); initializeNVPTXAtomicLowerPass(PR); @@ -246,6 +246,16 @@ return false; }); + PB.registerPipelineParsingCallback( + [](StringRef PassName, ModulePassManager &PM, + ArrayRef) { + if (PassName == "generic-to-nvvm") { + PM.addPass(GenericToNVVMPass()); + return true; + } + return false; + }); + PB.registerPipelineStartEPCallback( [this](ModulePassManager &PM, OptimizationLevel Level) { FunctionPassManager FPM; @@ -348,7 +358,7 @@ if (getOptLevel() != CodeGenOpt::None) addPass(createNVPTXImageOptimizerPass()); addPass(createNVPTXAssignValidGlobalNamesPass()); - addPass(createGenericToNVVMPass()); + addPass(createGenericToNVVMLegacyPass()); // NVPTXLowerArgs is required for correctness and should be run right // before the address space inference passes. diff --git a/llvm/test/CodeGen/NVPTX/generic-to-nvvm-ir.ll b/llvm/test/CodeGen/NVPTX/generic-to-nvvm-ir.ll --- a/llvm/test/CodeGen/NVPTX/generic-to-nvvm-ir.ll +++ b/llvm/test/CodeGen/NVPTX/generic-to-nvvm-ir.ll @@ -1,6 +1,7 @@ ; Verify functionality of NVPTXGenericToNVVM.cpp pass. ; ; RUN: opt < %s -march nvptx64 -S -generic-to-nvvm | FileCheck %s +; RUN: opt < %s -march nvptx64 -S -passes='generic-to-nvvm' | FileCheck %s target datalayout = "e-i64:64-v16:16-v32:32-n16:32:64" target triple = "nvptx64-nvidia-cuda"