diff --git a/llvm/lib/Target/NVPTX/NVPTX.h b/llvm/lib/Target/NVPTX/NVPTX.h index 881ea984f0c18..b851f31e866bf 100644 --- a/llvm/lib/Target/NVPTX/NVPTX.h +++ b/llvm/lib/Target/NVPTX/NVPTX.h @@ -50,7 +50,7 @@ FunctionPass *createNVVMIntrRangePass(); ModulePass *createNVVMReflectPass(unsigned int SmVersion); MachineFunctionPass *createNVPTXPrologEpilogPass(); MachineFunctionPass *createNVPTXReplaceImageHandlesPass(); -FunctionPass *createNVPTXImageOptimizerPass(); +FunctionPass *createNVPTXImageOptimizerLegacyPass(); ModulePass *createNVPTXLowerArgsPass(); ModulePass *createNVPTXPromoteParamAlignPass(); FunctionPass *createNVPTXLowerAllocaPass(); @@ -143,6 +143,12 @@ class NVPTXISelDAGToDAGPass : public SelectionDAGISelPass { NVPTXISelDAGToDAGPass(NVPTXTargetMachine &TM, CodeGenOptLevel OptLevel); }; +class NVPTXImageOptimizerPass + : public OptionalPassInfoMixin { +public: + PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM); +}; + namespace NVPTX { enum DrvInterface { NVCL, diff --git a/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp b/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp index 12648a91a7bee..ab15e34b6f3e3 100644 --- a/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp @@ -25,34 +25,20 @@ using namespace llvm; namespace { -class NVPTXImageOptimizer : public FunctionPass { -private: - static char ID; - SmallVector InstrToDelete; +class NVPTXImageOptimizer { + SmallVector InstrToDelete; public: - NVPTXImageOptimizer(); - - bool runOnFunction(Function &F) override; - - StringRef getPassName() const override { return "NVPTX Image Optimizer"; } + bool run(Function &F); private: bool replaceIsTypeP(Instruction &I, PTXOpaqueType Expected); Value *cleanupValue(Value *V); void replaceWith(Instruction *From, ConstantInt *To); }; -} - -char NVPTXImageOptimizer::ID = 0; - -NVPTXImageOptimizer::NVPTXImageOptimizer() - : FunctionPass(ID) {} - -bool NVPTXImageOptimizer::runOnFunction(Function &F) { - if (skipFunction(F)) - return false; +} // namespace +bool NVPTXImageOptimizer::run(Function &F) { bool Changed = false; InstrToDelete.clear(); @@ -118,6 +104,32 @@ Value *NVPTXImageOptimizer::cleanupValue(Value *V) { return V; } -FunctionPass *llvm::createNVPTXImageOptimizerPass() { - return new NVPTXImageOptimizer(); +namespace { +class NVPTXImageOptimizerLegacyPass : public FunctionPass { +public: + static char ID; + NVPTXImageOptimizerLegacyPass() : FunctionPass(ID) {} + + bool runOnFunction(Function &F) override { + if (skipFunction(F)) + return false; + return NVPTXImageOptimizer().run(F); + } + + StringRef getPassName() const override { return "NVPTX Image Optimizer"; } +}; +} // namespace + +char NVPTXImageOptimizerLegacyPass::ID = 0; + +FunctionPass *llvm::createNVPTXImageOptimizerLegacyPass() { + return new NVPTXImageOptimizerLegacyPass(); +} + +PreservedAnalyses NVPTXImageOptimizerPass::run(Function &F, + FunctionAnalysisManager &FAM) { + // The transform replaces conditional branches with unconditional ones, so + // the CFG is not preserved. + return NVPTXImageOptimizer().run(F) ? PreservedAnalyses::none() + : PreservedAnalyses::all(); } diff --git a/llvm/lib/Target/NVPTX/NVPTXPassRegistry.def b/llvm/lib/Target/NVPTX/NVPTXPassRegistry.def index aac7162397744..3a026a39bdceb 100644 --- a/llvm/lib/Target/NVPTX/NVPTXPassRegistry.def +++ b/llvm/lib/Target/NVPTX/NVPTXPassRegistry.def @@ -43,6 +43,7 @@ FUNCTION_PASS("nvptx-copy-byval-args", NVPTXCopyByValArgsPass()) FUNCTION_PASS("nvptx-mark-kernel-ptrs-global", NVPTXMarkKernelPtrsGlobalPass()) FUNCTION_PASS("nvptx-tag-invariant-loads", NVPTXTagInvariantLoadsPass()) FUNCTION_PASS("nvptx-ir-peephole", NVPTXIRPeepholePass()) +FUNCTION_PASS("nvptx-image-optimizer", NVPTXImageOptimizerPass()) #undef FUNCTION_PASS #ifndef MACHINE_FUNCTION_PASS diff --git a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp index ea2c7aa8b27ed..fe6bcbf69cbf3 100644 --- a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp @@ -342,7 +342,7 @@ void NVPTXPassConfig::addIRPasses() { addPass(createNVVMReflectPass(ST.getSmVersion())); if (getOptLevel() != CodeGenOptLevel::None) - addPass(createNVPTXImageOptimizerPass()); + addPass(createNVPTXImageOptimizerLegacyPass()); addPass(createNVPTXAssignValidGlobalNamesPass()); addPass(createGenericToNVVMLegacyPass());