diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2021-07-29 20:15:26 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2021-07-29 20:15:26 +0000 |
| commit | 344a3780b2e33f6ca763666c380202b18aab72a3 (patch) | |
| tree | f0b203ee6eb71d7fdd792373e3c81eb18d6934dd /llvm/lib/Target/AMDGPU/AMDGPUAnnotateUniformValues.cpp | |
| parent | b60736ec1405bb0a8dd40989f67ef4c93da068ab (diff) | |
vendor/llvm-project/llvmorg-13-init-16847-g88e66fa60ae5vendor/llvm-project/llvmorg-12.0.1-rc2-0-ge7dac564cd0evendor/llvm-project/llvmorg-12.0.1-0-gfed41342a82f
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUAnnotateUniformValues.cpp')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUAnnotateUniformValues.cpp | 65 |
1 files changed, 12 insertions, 53 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAnnotateUniformValues.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAnnotateUniformValues.cpp index c2a4d67ea98e..7d6845b287bc 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUAnnotateUniformValues.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUAnnotateUniformValues.cpp @@ -14,10 +14,8 @@ #include "AMDGPU.h" #include "Utils/AMDGPUBaseInfo.h" -#include "llvm/ADT/SetVector.h" #include "llvm/Analysis/LegacyDivergenceAnalysis.h" -#include "llvm/Analysis/LoopInfo.h" -#include "llvm/Analysis/MemoryDependenceAnalysis.h" +#include "llvm/Analysis/MemorySSA.h" #include "llvm/IR/InstVisitor.h" #include "llvm/InitializePasses.h" @@ -30,8 +28,7 @@ namespace { class AMDGPUAnnotateUniformValues : public FunctionPass, public InstVisitor<AMDGPUAnnotateUniformValues> { LegacyDivergenceAnalysis *DA; - MemoryDependenceResults *MDR; - LoopInfo *LI; + MemorySSA *MSSA; DenseMap<Value*, GetElementPtrInst*> noClobberClones; bool isEntryFunc; @@ -46,8 +43,7 @@ public: } void getAnalysisUsage(AnalysisUsage &AU) const override { AU.addRequired<LegacyDivergenceAnalysis>(); - AU.addRequired<MemoryDependenceWrapperPass>(); - AU.addRequired<LoopInfoWrapperPass>(); + AU.addRequired<MemorySSAWrapperPass>(); AU.setPreservesAll(); } @@ -61,8 +57,7 @@ public: INITIALIZE_PASS_BEGIN(AMDGPUAnnotateUniformValues, DEBUG_TYPE, "Add AMDGPU uniform metadata", false, false) INITIALIZE_PASS_DEPENDENCY(LegacyDivergenceAnalysis) -INITIALIZE_PASS_DEPENDENCY(MemoryDependenceWrapperPass) -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) +INITIALIZE_PASS_DEPENDENCY(MemorySSAWrapperPass) INITIALIZE_PASS_END(AMDGPUAnnotateUniformValues, DEBUG_TYPE, "Add AMDGPU uniform metadata", false, false) @@ -75,49 +70,14 @@ static void setNoClobberMetadata(Instruction *I) { I->setMetadata("amdgpu.noclobber", MDNode::get(I->getContext(), {})); } -static void DFS(BasicBlock *Root, SetVector<BasicBlock*> & Set) { - for (auto I : predecessors(Root)) - if (Set.insert(I)) - DFS(I, Set); -} - bool AMDGPUAnnotateUniformValues::isClobberedInFunction(LoadInst * Load) { - // 1. get Loop for the Load->getparent(); - // 2. if it exists, collect all the BBs from the most outer - // loop and check for the writes. If NOT - start DFS over all preds. - // 3. Start DFS over all preds from the most outer loop header. - SetVector<BasicBlock *> Checklist; - BasicBlock *Start = Load->getParent(); - Checklist.insert(Start); - const Value *Ptr = Load->getPointerOperand(); - const Loop *L = LI->getLoopFor(Start); - if (L) { - const Loop *P = L; - do { - L = P; - P = P->getParentLoop(); - } while (P); - Checklist.insert(L->block_begin(), L->block_end()); - Start = L->getHeader(); - } - - DFS(Start, Checklist); - for (auto &BB : Checklist) { - BasicBlock::iterator StartIt = (!L && (BB == Load->getParent())) ? - BasicBlock::iterator(Load) : BB->end(); - auto Q = MDR->getPointerDependencyFrom( - MemoryLocation::getBeforeOrAfter(Ptr), true, StartIt, BB, Load); - if (Q.isClobber() || Q.isUnknown() || - // Store defines the load and thus clobbers it. - (Q.isDef() && Q.getInst()->mayWriteToMemory())) - return true; - } - return false; + const MemoryAccess *MA = MSSA->getWalker()->getClobberingMemoryAccess(Load); + return !MSSA->isLiveOnEntryDef(MA); } void AMDGPUAnnotateUniformValues::visitBranchInst(BranchInst &I) { if (DA->isUniform(&I)) - setUniformMetadata(I.getParent()->getTerminator()); + setUniformMetadata(&I); } void AMDGPUAnnotateUniformValues::visitLoadInst(LoadInst &I) { @@ -154,9 +114,9 @@ void AMDGPUAnnotateUniformValues::visitLoadInst(LoadInst &I) { Value *Idx = Constant::getIntegerValue( Type::getInt32Ty(Ptr->getContext()), APInt(64, 0)); // Insert GEP at the entry to make it dominate all uses - PtrI = GetElementPtrInst::Create( - Ptr->getType()->getPointerElementType(), Ptr, - ArrayRef<Value*>(Idx), Twine(""), F->getEntryBlock().getFirstNonPHI()); + PtrI = GetElementPtrInst::Create(I.getType(), Ptr, + ArrayRef<Value *>(Idx), Twine(""), + F->getEntryBlock().getFirstNonPHI()); } I.replaceUsesOfWith(Ptr, PtrI); } @@ -177,9 +137,8 @@ bool AMDGPUAnnotateUniformValues::runOnFunction(Function &F) { if (skipFunction(F)) return false; - DA = &getAnalysis<LegacyDivergenceAnalysis>(); - MDR = &getAnalysis<MemoryDependenceWrapperPass>().getMemDep(); - LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); + DA = &getAnalysis<LegacyDivergenceAnalysis>(); + MSSA = &getAnalysis<MemorySSAWrapperPass>().getMSSA(); isEntryFunc = AMDGPU::isEntryFunctionCC(F.getCallingConv()); visit(F); |
