Author: Arthur Eubanks Date: 2021-01-04T11:57:46-08:00 New Revision: e1833e7493aede34aaf9c1a4480848d60dad7f1d
URL: https://github.com/llvm/llvm-project/commit/e1833e7493aede34aaf9c1a4480848d60dad7f1d DIFF: https://github.com/llvm/llvm-project/commit/e1833e7493aede34aaf9c1a4480848d60dad7f1d.diff LOG: [NewPM][AMDGPU] Port amdgpu-unify-metadata And add to AMDGPU opt pipeline. Reviewed By: arsenm Differential Revision: https://reviews.llvm.org/D94023 Added: Modified: llvm/lib/Target/AMDGPU/AMDGPU.h llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp llvm/lib/Target/AMDGPU/AMDGPUUnifyMetadata.cpp llvm/test/CodeGen/AMDGPU/unify-metadata.ll llvm/tools/opt/opt.cpp Removed: ################################################################################ diff --git a/llvm/lib/Target/AMDGPU/AMDGPU.h b/llvm/lib/Target/AMDGPU/AMDGPU.h index c06f9ad66009..ac8b0effbdab 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPU.h +++ b/llvm/lib/Target/AMDGPU/AMDGPU.h @@ -264,6 +264,10 @@ ModulePass* createAMDGPUUnifyMetadataPass(); void initializeAMDGPUUnifyMetadataPass(PassRegistry&); extern char &AMDGPUUnifyMetadataID; +struct AMDGPUUnifyMetadataPass : PassInfoMixin<AMDGPUUnifyMetadataPass> { + 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 index 765ec045d5f1..0e3d6df0d6ae 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp @@ -498,6 +498,10 @@ void AMDGPUTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB, PM.addPass(AMDGPUPropagateAttributesLatePass(*this)); return true; } + if (PassName == "amdgpu-unify-metadata") { + PM.addPass(AMDGPUUnifyMetadataPass()); + return true; + } return false; }); PB.registerPipelineParsingCallback( @@ -547,6 +551,8 @@ void AMDGPUTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB, 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 index f898456203a1..f3c9add70357 100644 --- 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 <algorithm> #include <cassert> @@ -45,6 +46,7 @@ namespace { private: bool runOnModule(Module &M) override; + }; /// Unify version metadata. /// \return true if changes are made. @@ -106,41 +108,42 @@ namespace { 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 index d96583e71f13..ecf18cc18e49 100644 --- 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 index a02b884996e9..eee4f2ae0bb5 100644 --- a/llvm/tools/opt/opt.cpp +++ b/llvm/tools/opt/opt.cpp @@ -469,7 +469,8 @@ static bool shouldPinPassToLegacyPM(StringRef Pass) { "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; _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits