From 0c0387c7a5e979d2dbf791404c7398856895f8fb Mon Sep 17 00:00:00 2001 From: Pavel Kopyl Date: Thu, 16 Mar 2023 21:53:14 +0100 Subject: [PATCH] [NVPTX] Port GenericToNVVM to the new PM. Differential Revision: https://reviews.llvm.org/D146345 --- llvm/lib/Target/NVPTX/NVPTX.h | 6 +++- llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp | 52 +++++++++++++++++---------- llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp | 16 +++++++-- llvm/test/CodeGen/NVPTX/generic-to-nvvm-ir.ll | 1 + 4 files changed, 53 insertions(+), 22 deletions(-) diff --git a/llvm/lib/Target/NVPTX/NVPTX.h b/llvm/lib/Target/NVPTX/NVPTX.h index 9518442..521a784 100644 --- a/llvm/lib/Target/NVPTX/NVPTX.h +++ b/llvm/lib/Target/NVPTX/NVPTX.h @@ -38,7 +38,7 @@ enum CondCodes { 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 @@ private: 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 index d892023..4f03e47 100644 --- 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 @@ private: }; } // 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 @@ Value *GenericToNVVM::remapConstantExpr(Module *M, Function *F, ConstantExpr *C, 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 index 5ff9b4d..3d1e4fc 100644 --- a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp @@ -64,7 +64,7 @@ static cl::opt UseShortPointersOpt( namespace llvm { -void initializeGenericToNVVMPass(PassRegistry&); +void initializeGenericToNVVMLegacyPassPass(PassRegistry &); void initializeNVPTXAllocaHoistingPass(PassRegistry &); void initializeNVPTXAssignValidGlobalNamesPass(PassRegistry&); void initializeNVPTXAtomicLowerPass(PassRegistry &); @@ -89,7 +89,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeNVPTXTarget() { // but it's very NVPTX-specific. initializeNVVMReflectPass(PR); initializeNVVMIntrRangePass(PR); - initializeGenericToNVVMPass(PR); + initializeGenericToNVVMLegacyPassPass(PR); initializeNVPTXAllocaHoistingPass(PR); initializeNVPTXAssignValidGlobalNamesPass(PR); initializeNVPTXAtomicLowerPass(PR); @@ -246,6 +246,16 @@ void NVPTXTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) { 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 @@ void NVPTXPassConfig::addIRPasses() { 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 index 51344b4..daed7c1 100644 --- 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" -- 2.7.4