From 6563371bad878cb9737970fea6162044a0370df8 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 9 Dec 2008 07:52:59 +0000 Subject: [PATCH] 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 --- lib/Analysis/MemoryDependenceAnalysis.cpp | 45 +++++++++++++---------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/lib/Analysis/MemoryDependenceAnalysis.cpp b/lib/Analysis/MemoryDependenceAnalysis.cpp index e29781af4b9..5a7c7b79ad2 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 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