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 @@ -264,6 +264,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 @@ -498,6 +498,10 @@ PM.addPass(AMDGPUPropagateAttributesLatePass(*this)); return true; } + if (PassName == "amdgpu-unify-metadata") { + PM.addPass(AMDGPUUnifyMetadataPass()); + return true; + } return false; }); PB.registerPipelineParsingCallback( @@ -547,6 +551,8 @@ if (Level == PassBuilder::OptimizationLevel::O0) return; + PM.addPass(AMDGPUUnifyMetadataPass()); + if (InternalizeSymbols) { PM.addPass(InternalizePass(mustPreserveGV)); } 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. diff --git a/llvm/tools/opt/opt.cpp b/llvm/tools/opt/opt.cpp --- a/llvm/tools/opt/opt.cpp +++ b/llvm/tools/opt/opt.cpp @@ -469,7 +469,8 @@ "amdgpu-promote-alloca-to-vector", "amdgpu-lower-kernel-attributes", "amdgpu-propagate-attributes-early", - "amdgpu-propagate-attributes-late"}; + "amdgpu-propagate-attributes-late", + "amdgpu-unify-metadata"}; for (const auto &P : PassNameExactToIgnore) if (Pass == P) return false;