diff options
author | Stanislav Mekhanoshin <Stanislav.Mekhanoshin@amd.com> | 2017-04-12 20:48:56 +0000 |
---|---|---|
committer | Stanislav Mekhanoshin <Stanislav.Mekhanoshin@amd.com> | 2017-04-12 20:48:56 +0000 |
commit | c90347d7604f0a036e74c55db8cf117886ae9df6 (patch) | |
tree | 642c8823531a186b7e195152fbe508f82e9514b6 /llvm/lib/Target/AMDGPU/AMDGPULowerIntrinsics.cpp | |
parent | 04aee46779f062ed45245b9b675d1b3bd4224ae3 (diff) | |
download | bcm5719-llvm-c90347d7604f0a036e74c55db8cf117886ae9df6.tar.gz bcm5719-llvm-c90347d7604f0a036e74c55db8cf117886ae9df6.zip |
[AMDGPU] Generate range metadata for workitem id
If workgroup size is known inform llvm about range returned by local
id and local size queries.
Differential Revision: https://reviews.llvm.org/D31804
llvm-svn: 300102
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPULowerIntrinsics.cpp')
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPULowerIntrinsics.cpp | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPULowerIntrinsics.cpp b/llvm/lib/Target/AMDGPU/AMDGPULowerIntrinsics.cpp index 5721ea41e3b..dcb6670621e 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPULowerIntrinsics.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPULowerIntrinsics.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "AMDGPU.h" +#include "AMDGPUSubtarget.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" @@ -23,10 +24,16 @@ namespace { const unsigned MaxStaticSize = 1024; class AMDGPULowerIntrinsics : public ModulePass { +private: + const TargetMachine *TM; + + bool makeLIDRangeMetadata(Function &F) const; + public: static char ID; - AMDGPULowerIntrinsics() : ModulePass(ID) { } + AMDGPULowerIntrinsics(const TargetMachine *TM = nullptr) + : ModulePass(ID), TM(TM) { } bool runOnModule(Module &M) override; StringRef getPassName() const override { return "AMDGPU Lower Intrinsics"; @@ -39,8 +46,8 @@ char AMDGPULowerIntrinsics::ID = 0; char &llvm::AMDGPULowerIntrinsicsID = AMDGPULowerIntrinsics::ID; -INITIALIZE_PASS(AMDGPULowerIntrinsics, DEBUG_TYPE, - "Lower intrinsics", false, false) +INITIALIZE_TM_PASS(AMDGPULowerIntrinsics, DEBUG_TYPE, + "Lower intrinsics", false, false) // TODO: Should refine based on estimated number of accesses (e.g. does it // require splitting based on alignment) @@ -96,6 +103,23 @@ static bool expandMemIntrinsicUses(Function &F) { return Changed; } +bool AMDGPULowerIntrinsics::makeLIDRangeMetadata(Function &F) const { + if (!TM) + return false; + + bool Changed = false; + const AMDGPUSubtarget &ST = TM->getSubtarget<AMDGPUSubtarget>(F); + + for (auto *U : F.users()) { + auto *CI = dyn_cast<CallInst>(U); + if (!CI) + continue; + + Changed |= ST.makeLIDRangeMetadata(CI); + } + return Changed; +} + bool AMDGPULowerIntrinsics::runOnModule(Module &M) { bool Changed = false; @@ -110,6 +134,19 @@ bool AMDGPULowerIntrinsics::runOnModule(Module &M) { if (expandMemIntrinsicUses(F)) Changed = true; break; + + case Intrinsic::amdgcn_workitem_id_x: + case Intrinsic::r600_read_tidig_x: + case Intrinsic::amdgcn_workitem_id_y: + case Intrinsic::r600_read_tidig_y: + case Intrinsic::amdgcn_workitem_id_z: + case Intrinsic::r600_read_tidig_z: + case Intrinsic::r600_read_local_size_x: + case Intrinsic::r600_read_local_size_y: + case Intrinsic::r600_read_local_size_z: + Changed |= makeLIDRangeMetadata(F); + break; + default: break; } @@ -118,6 +155,6 @@ bool AMDGPULowerIntrinsics::runOnModule(Module &M) { return Changed; } -ModulePass *llvm::createAMDGPULowerIntrinsicsPass() { - return new AMDGPULowerIntrinsics(); +ModulePass *llvm::createAMDGPULowerIntrinsicsPass(const TargetMachine *TM) { + return new AMDGPULowerIntrinsics(TM); } |