From 4d302f6911f510153a026274b21eb9fb2c260903 Mon Sep 17 00:00:00 2001 From: Alexander Timofeev Date: Thu, 13 Sep 2018 09:06:56 +0000 Subject: [PATCH] [AMDGPU] Load divergence predicate refactoring Differential revision: https://reviews.llvm.org/D51931 Reviewers: rampitec llvm-svn: 342120 --- llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp | 25 +++++++++++++++++++++++++ llvm/lib/Target/AMDGPU/SMInstructions.td | 9 +-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp index d689d92..97d4db4 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp @@ -102,6 +102,7 @@ private: bool isNoNanSrc(SDValue N) const; bool isInlineImmediate(const SDNode *N) const; bool isVGPRImm(const SDNode *N) const; + bool isUniformLoad(const SDNode *N) const; bool isUniformBr(const SDNode *N) const; MachineSDNode *buildSMovImm64(SDLoc &DL, uint64_t Val, EVT VT) const; @@ -2117,6 +2118,30 @@ bool AMDGPUDAGToDAGISel::isVGPRImm(const SDNode * N) const { return !AllUsesAcceptSReg && (Limit < 10); } +bool AMDGPUDAGToDAGISel::isUniformLoad(const SDNode * N) const { + auto Ld = cast(N); + + return Ld->getAlignment() >= 4 && + ( + ( + ( + Ld->getAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS || + Ld->getAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS_32BIT + ) + && + !N->isDivergent() + ) + || + ( + Subtarget->getScalarizeGlobalBehavior() && + Ld->getAddressSpace() == AMDGPUAS::GLOBAL_ADDRESS && + !Ld->isVolatile() && + !N->isDivergent() && + static_cast( + getTargetLowering())->isMemOpHasNoClobberedMemOperand(N) + ) + ); +} void AMDGPUDAGToDAGISel::PostprocessISelDAG() { const AMDGPUTargetLowering& Lowering = diff --git a/llvm/lib/Target/AMDGPU/SMInstructions.td b/llvm/lib/Target/AMDGPU/SMInstructions.td index 4e8ecfb..bd983cd 100644 --- a/llvm/lib/Target/AMDGPU/SMInstructions.td +++ b/llvm/lib/Target/AMDGPU/SMInstructions.td @@ -379,14 +379,7 @@ defm S_DCACHE_DISCARD_X2 : SM_Pseudo_Discards <"s_dcache_discard_x2">; //===----------------------------------------------------------------------===// -def smrd_load : PatFrag <(ops node:$ptr), (load node:$ptr), [{ - auto Ld = cast(N); - return Ld->getAlignment() >= 4 && - ((((Ld->getAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS) || (Ld->getAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS_32BIT)) && !N->isDivergent()) || - (Subtarget->getScalarizeGlobalBehavior() && Ld->getAddressSpace() == AMDGPUAS::GLOBAL_ADDRESS && - !Ld->isVolatile() && !N->isDivergent() && - static_cast(getTargetLowering())->isMemOpHasNoClobberedMemOperand(N))); -}]>; +def smrd_load : PatFrag <(ops node:$ptr), (load node:$ptr), [{ return isUniformLoad(N);}]>; def SMRDImm : ComplexPattern; def SMRDImm32 : ComplexPattern; -- 2.7.4