summaryrefslogtreecommitdiff
path: root/llvm/lib/Target/AMDGPU/AMDGPUAnnotateUniformValues.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2021-07-29 20:15:26 +0000
committerDimitry Andric <dim@FreeBSD.org>2021-07-29 20:15:26 +0000
commit344a3780b2e33f6ca763666c380202b18aab72a3 (patch)
treef0b203ee6eb71d7fdd792373e3c81eb18d6934dd /llvm/lib/Target/AMDGPU/AMDGPUAnnotateUniformValues.cpp
parentb60736ec1405bb0a8dd40989f67ef4c93da068ab (diff)
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUAnnotateUniformValues.cpp')
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPUAnnotateUniformValues.cpp65
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);