diff --git a/llvm/lib/Target/AMDGPU/AMDGPU.h b/llvm/lib/Target/AMDGPU/AMDGPU.h --- a/llvm/lib/Target/AMDGPU/AMDGPU.h +++ b/llvm/lib/Target/AMDGPU/AMDGPU.h @@ -246,6 +246,10 @@ void initializeAMDGPUUnifyMetadataPass(PassRegistry&); extern char &AMDGPUUnifyMetadataID; +struct AMDGPUUnifyMetadataPass : PassInfoMixin { + PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); +}; + void initializeSIOptimizeExecMaskingPreRAPass(PassRegistry&); extern char &SIOptimizeExecMaskingPreRAID; diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp --- a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp @@ -491,6 +491,15 @@ void AMDGPUTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB, bool DebugPassManager) { + PB.registerPipelineParsingCallback( + [](StringRef PassName, ModulePassManager &PM, + ArrayRef) { + if (PassName == "amdgpu-unify-metadata") { + PM.addPass(AMDGPUUnifyMetadataPass()); + return true; + } + return false; + }); PB.registerPipelineParsingCallback( [this](StringRef PassName, FunctionPassManager &PM, ArrayRef) { @@ -532,6 +541,8 @@ if (Level == PassBuilder::OptimizationLevel::O0) return; + PM.addPass(AMDGPUUnifyMetadataPass()); + if (InternalizeSymbols) { PM.addPass(InternalizePass(mustPreserveGV)); PM.addPass(GlobalDCEPass()); diff --git a/llvm/lib/Target/AMDGPU/AMDGPUUnifyMetadata.cpp b/llvm/lib/Target/AMDGPU/AMDGPUUnifyMetadata.cpp --- a/llvm/lib/Target/AMDGPU/AMDGPUUnifyMetadata.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUUnifyMetadata.cpp @@ -17,6 +17,7 @@ #include "llvm/IR/Constants.h" #include "llvm/IR/Metadata.h" #include "llvm/IR/Module.h" +#include "llvm/IR/PassManager.h" #include "llvm/Pass.h" #include #include @@ -45,6 +46,7 @@ private: bool runOnModule(Module &M) override; + }; /// Unify version metadata. /// \return true if changes are made. @@ -106,41 +108,42 @@ return true; } -}; -} // end anonymous namespace + bool unifyMetadataImpl(Module &M) { + const char *Vers[] = {kOCLMD::SpirVer, kOCLMD::OCLVer}; + const char *Exts[] = {kOCLMD::UsedExt, kOCLMD::UsedOptCoreFeat, + kOCLMD::CompilerOptions, kOCLMD::LLVMIdent}; -char AMDGPUUnifyMetadata::ID = 0; + bool Changed = false; -char &llvm::AMDGPUUnifyMetadataID = AMDGPUUnifyMetadata::ID; + for (auto &I : Vers) + Changed |= unifyVersionMD(M, I, true); -INITIALIZE_PASS(AMDGPUUnifyMetadata, "amdgpu-unify-metadata", - "Unify multiple OpenCL metadata due to linking", - false, false) + for (auto &I : Exts) + Changed |= unifyExtensionMD(M, I); -ModulePass* llvm::createAMDGPUUnifyMetadataPass() { - return new AMDGPUUnifyMetadata(); -} + return Changed; + } -bool AMDGPUUnifyMetadata::runOnModule(Module &M) { - const char* Vers[] = { - kOCLMD::SpirVer, - kOCLMD::OCLVer - }; - const char* Exts[] = { - kOCLMD::UsedExt, - kOCLMD::UsedOptCoreFeat, - kOCLMD::CompilerOptions, - kOCLMD::LLVMIdent - }; + } // end anonymous namespace - bool Changed = false; + char AMDGPUUnifyMetadata::ID = 0; - for (auto &I : Vers) - Changed |= unifyVersionMD(M, I, true); + char &llvm::AMDGPUUnifyMetadataID = AMDGPUUnifyMetadata::ID; - for (auto &I : Exts) - Changed |= unifyExtensionMD(M, I); + INITIALIZE_PASS(AMDGPUUnifyMetadata, "amdgpu-unify-metadata", + "Unify multiple OpenCL metadata due to linking", false, false) - return Changed; -} + ModulePass *llvm::createAMDGPUUnifyMetadataPass() { + return new AMDGPUUnifyMetadata(); + } + + bool AMDGPUUnifyMetadata::runOnModule(Module &M) { + return unifyMetadataImpl(M); + } + + PreservedAnalyses AMDGPUUnifyMetadataPass::run(Module &M, + ModuleAnalysisManager &AM) { + return unifyMetadataImpl(M) ? PreservedAnalyses::none() + : PreservedAnalyses::all(); + } diff --git a/llvm/test/CodeGen/AMDGPU/unify-metadata.ll b/llvm/test/CodeGen/AMDGPU/unify-metadata.ll --- a/llvm/test/CodeGen/AMDGPU/unify-metadata.ll +++ b/llvm/test/CodeGen/AMDGPU/unify-metadata.ll @@ -1,4 +1,5 @@ ; RUN: opt -mtriple=amdgcn--amdhsa -amdgpu-unify-metadata -S < %s | FileCheck -check-prefix=ALL %s +; RUN: opt -mtriple=amdgcn--amdhsa -passes=amdgpu-unify-metadata -S < %s | FileCheck -check-prefix=ALL %s ; This test check that we have a singe metadata value after linking several ; modules for records such as opencl.ocl.version, llvm.ident and similar.