aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/MemoryDependenceAnalysis.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-12-09 07:52:59 +0000
committerChris Lattner <sabre@nondot.org>2008-12-09 07:52:59 +0000
commit6563371bad878cb9737970fea6162044a0370df8 (patch)
treef5d474a9415708a1582bbd36b8791c6a738a79aa /lib/Analysis/MemoryDependenceAnalysis.cpp
parent9863c3f507913f17de0fd707e27fde9dc35f6ca6 (diff)
restructure the top level non-local ptr dep query to handle
the first block of a query specially. This makes the "complete query caching" subsystem more effective, avoiding predecessor queries. This speeds up GVN another 4%. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60752 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/MemoryDependenceAnalysis.cpp')
-rw-r--r--lib/Analysis/MemoryDependenceAnalysis.cpp45
1 files changed, 26 insertions, 19 deletions
diff --git a/lib/Analysis/MemoryDependenceAnalysis.cpp b/lib/Analysis/MemoryDependenceAnalysis.cpp
index e29781af4b..5a7c7b79ad 100644
--- a/lib/Analysis/MemoryDependenceAnalysis.cpp
+++ b/lib/Analysis/MemoryDependenceAnalysis.cpp
@@ -490,12 +490,8 @@ getNonLocalPointerDependency(Value *Pointer, bool isLoad, BasicBlock *FromBB,
// While we have blocks to analyze, get their values.
SmallPtrSet<BasicBlock*, 64> Visited;
-
- for (BasicBlock **PI = PredCache->GetPreds(FromBB); *PI; ++PI) {
- // TODO: PHI TRANSLATE.
- getNonLocalPointerDepFromBB(Pointer, PointeeSize, isLoad, *PI,
- Result, Visited);
- }
+ getNonLocalPointerDepFromBB(Pointer, PointeeSize, isLoad, FromBB,
+ Result, Visited);
}
/// GetNonLocalInfoForBlock - Compute the memdep value for BB with
@@ -611,23 +607,34 @@ getNonLocalPointerDepFromBB(Value *Pointer, uint64_t PointeeSize,
// revisit blocks after we insert info for them.
unsigned NumSortedEntries = Cache->size();
+ // SkipFirstBlock - If this is the very first block that we're processing, we
+ // don't want to skip or thing about its body, because the client was supposed
+ // to do a local dependence query. Instead, just start processing it by
+ // adding its predecessors to the worklist and iterating.
+ bool SkipFirstBlock = Visited.empty();
+
while (!Worklist.empty()) {
BasicBlock *BB = Worklist.pop_back_val();
- // Analyze the dependency of *Pointer in FromBB. See if we already have
- // been here.
- if (!Visited.insert(BB))
- continue;
+ // Skip the first block if we have it.
+ if (SkipFirstBlock) {
+ SkipFirstBlock = false;
+ } else {
+ // Analyze the dependency of *Pointer in FromBB. See if we already have
+ // been here.
+ if (!Visited.insert(BB))
+ continue;
- // Get the dependency info for Pointer in BB. If we have cached
- // information, we will use it, otherwise we compute it.
- MemDepResult Dep = GetNonLocalInfoForBlock(Pointer, PointeeSize, isLoad,
- BB, Cache, NumSortedEntries);
-
- // If we got a Def or Clobber, add this to the list of results.
- if (!Dep.isNonLocal()) {
- Result.push_back(NonLocalDepEntry(BB, Dep));
- continue;
+ // Get the dependency info for Pointer in BB. If we have cached
+ // information, we will use it, otherwise we compute it.
+ MemDepResult Dep = GetNonLocalInfoForBlock(Pointer, PointeeSize, isLoad,
+ BB, Cache, NumSortedEntries);
+
+ // If we got a Def or Clobber, add this to the list of results.
+ if (!Dep.isNonLocal()) {
+ Result.push_back(NonLocalDepEntry(BB, Dep));
+ continue;
+ }
}
// Otherwise, we have to process all the predecessors of this block to scan