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
This commit is contained in:
Chris Lattner 2008-12-09 07:52:59 +00:00
parent 9863c3f507
commit 6563371bad

View File

@ -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,
getNonLocalPointerDepFromBB(Pointer, PointeeSize, isLoad, FromBB,
Result, Visited);
}
}
/// GetNonLocalInfoForBlock - Compute the memdep value for BB with
@ -611,9 +607,19 @@ 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();
// 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))
@ -629,6 +635,7 @@ getNonLocalPointerDepFromBB(Value *Pointer, uint64_t PointeeSize,
Result.push_back(NonLocalDepEntry(BB, Dep));
continue;
}
}
// Otherwise, we have to process all the predecessors of this block to scan
// them as well.