aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/MemoryDependenceAnalysis.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-12-07 02:56:57 +0000
committerChris Lattner <sabre@nondot.org>2008-12-07 02:56:57 +0000
commit9a193fd8ae630478123938e12b56f84c5b2227b9 (patch)
tree5eab23bac19c19acf1d8ba37a6232fb31fb41f2c /lib/Analysis/MemoryDependenceAnalysis.cpp
parent7ebcf0324668b7c6ba48832d5d8df95689a8d837 (diff)
Some internal refactoring to make it easier to cache results.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60650 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/MemoryDependenceAnalysis.cpp')
-rw-r--r--lib/Analysis/MemoryDependenceAnalysis.cpp43
1 files changed, 26 insertions, 17 deletions
diff --git a/lib/Analysis/MemoryDependenceAnalysis.cpp b/lib/Analysis/MemoryDependenceAnalysis.cpp
index 9ac06c9ed7..d74797c7cc 100644
--- a/lib/Analysis/MemoryDependenceAnalysis.cpp
+++ b/lib/Analysis/MemoryDependenceAnalysis.cpp
@@ -437,53 +437,62 @@ MemoryDependenceAnalysis::getNonLocalDependency(Instruction *QueryInst) {
void MemoryDependenceAnalysis::
getNonLocalPointerDependency(Value *Pointer, bool isLoad, BasicBlock *FromBB,
SmallVectorImpl<NonLocalDepEntry> &Result) {
+ Result.clear();
+
// We know that the pointer value is live into FromBB find the def/clobbers
// from presecessors.
- SmallVector<std::pair<BasicBlock*, Value*>, 32> Worklist;
-
- for (pred_iterator PI = pred_begin(FromBB), E = pred_end(FromBB); PI != E;
- ++PI)
- // TODO: PHI TRANSLATE.
- Worklist.push_back(std::make_pair(*PI, Pointer));
const Type *EltTy = cast<PointerType>(Pointer->getType())->getElementType();
uint64_t PointeeSize = TD->getTypeStoreSize(EltTy);
// While we have blocks to analyze, get their values.
SmallPtrSet<BasicBlock*, 64> Visited;
+
+ for (pred_iterator PI = pred_begin(FromBB), E = pred_end(FromBB); PI != E;
+ ++PI) {
+ // TODO: PHI TRANSLATE.
+ getNonLocalPointerDepInternal(Pointer, PointeeSize, isLoad, *PI,
+ Result, Visited);
+ }
+}
+
+void MemoryDependenceAnalysis::
+getNonLocalPointerDepInternal(Value *Pointer, uint64_t PointeeSize,
+ bool isLoad, BasicBlock *StartBB,
+ SmallVectorImpl<NonLocalDepEntry> &Result,
+ SmallPtrSet<BasicBlock*, 64> &Visited) {
+ SmallVector<BasicBlock*, 32> Worklist;
+ Worklist.push_back(StartBB);
+
while (!Worklist.empty()) {
- FromBB = Worklist.back().first;
- Pointer = Worklist.back().second;
- Worklist.pop_back();
+ BasicBlock *BB = Worklist.pop_back_val();
// Analyze the dependency of *Pointer in FromBB. See if we already have
// been here.
- if (!Visited.insert(FromBB))
+ if (!Visited.insert(BB))
continue;
// FIXME: CACHE!
MemDepResult Dep =
- getPointerDependencyFrom(Pointer, PointeeSize, isLoad,
- FromBB->end(), FromBB);
+ getPointerDependencyFrom(Pointer, PointeeSize, isLoad, BB->end(), BB);
// If we got a Def or Clobber, add this to the list of results.
if (!Dep.isNonLocal()) {
- Result.push_back(NonLocalDepEntry(FromBB, Dep));
+ Result.push_back(NonLocalDepEntry(BB, Dep));
continue;
}
// Otherwise, we have to process all the predecessors of this block to scan
// them as well.
- for (pred_iterator PI = pred_begin(FromBB), E = pred_end(FromBB); PI != E;
- ++PI)
+ for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
// TODO: PHI TRANSLATE.
- Worklist.push_back(std::make_pair(*PI, Pointer));
+ Worklist.push_back(*PI);
+ }
}
}
-
/// removeInstruction - Remove an instruction from the dependence analysis,
/// updating the dependence of instructions that previously depended on it.
/// This method attempts to keep the cache coherent using the reverse map.