aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/Analysis/MemoryDependenceAnalysis.cpp35
-rw-r--r--lib/Transforms/Scalar/GVN.cpp2
2 files changed, 34 insertions, 3 deletions
diff --git a/lib/Analysis/MemoryDependenceAnalysis.cpp b/lib/Analysis/MemoryDependenceAnalysis.cpp
index edbf933..538a394 100644
--- a/lib/Analysis/MemoryDependenceAnalysis.cpp
+++ b/lib/Analysis/MemoryDependenceAnalysis.cpp
@@ -135,6 +135,13 @@ void MemoryDependenceAnalysis::nonLocalHelper(Instruction* query,
DenseMap<BasicBlock*, Value*>& resp) {
// Set of blocks that we've already visited in our DFS
SmallPtrSet<BasicBlock*, 4> visited;
+ // If we're updating a dirtied cache entry, we don't need to reprocess
+ // already computed entries.
+ for (DenseMap<BasicBlock*, Value*>::iterator I = resp.begin(),
+ E = resp.end(); I != E; ++I)
+ if (I->second != Dirty)
+ visited.insert(I->first);
+
// Current stack of the DFS
SmallVector<BasicBlock*, 4> stack;
stack.push_back(block);
@@ -211,8 +218,28 @@ void MemoryDependenceAnalysis::nonLocalHelper(Instruction* query,
void MemoryDependenceAnalysis::getNonLocalDependency(Instruction* query,
DenseMap<BasicBlock*, Value*>& resp) {
if (depGraphNonLocal.count(query)) {
- resp = depGraphNonLocal[query];
+ DenseMap<BasicBlock*, Value*>& cached = depGraphNonLocal[query];
NumCacheNonlocal++;
+
+ SmallVector<BasicBlock*, 4> dirtied;
+ for (DenseMap<BasicBlock*, Value*>::iterator I = cached.begin(),
+ E = cached.end(); I != E; ++I)
+ if (I->second == Dirty)
+ dirtied.push_back(I->first);
+
+ for (SmallVector<BasicBlock*, 4>::iterator I = dirtied.begin(),
+ E = dirtied.end(); I != E; ++I) {
+ Instruction* localDep = getDependency(query, 0, *I);
+ if (localDep != NonLocal)
+ cached[*I] = localDep;
+ else {
+ cached.erase(*I);
+ nonLocalHelper(query, *I, cached);
+ }
+ }
+
+ resp = cached;
+
return;
} else
NumUncacheNonlocal++;
@@ -430,7 +457,11 @@ void MemoryDependenceAnalysis::removeInstruction(Instruction* rem) {
SmallPtrSet<Instruction*, 4>& set = reverseDepNonLocal[rem];
for (SmallPtrSet<Instruction*, 4>::iterator I = set.begin(), E = set.end();
I != E; ++I)
- depGraphNonLocal.erase(*I);
+ for (DenseMap<BasicBlock*, Value*>::iterator DI =
+ depGraphNonLocal[*I].begin(), DE = depGraphNonLocal[*I].end();
+ DI != DE; ++DI)
+ if (DI->second == rem)
+ DI->second = Dirty;
reverseDepNonLocal.erase(rem);
}
diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp
index c6b50a4..d9cff01 100644
--- a/lib/Transforms/Scalar/GVN.cpp
+++ b/lib/Transforms/Scalar/GVN.cpp
@@ -834,7 +834,7 @@ bool GVN::processNonLocalLoad(LoadInst* L,
return false;
} else if (I->second == MemoryDependenceAnalysis::NonLocal) {
continue;
- }else if (StoreInst* S = dyn_cast<StoreInst>(I->second)) {
+ } else if (StoreInst* S = dyn_cast<StoreInst>(I->second)) {
if (S->getPointerOperand() == L->getPointerOperand())
repl[I->first] = S->getOperand(0);
else