diff options
author | Chris Lattner <sabre@nondot.org> | 2008-12-09 06:28:49 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-12-09 06:28:49 +0000 |
commit | 4012fdda13710d21b415a79475adc2bbb6628527 (patch) | |
tree | b742046467c6060cad10a74c0c20a7180f9de633 /lib/Analysis/MemoryDependenceAnalysis.cpp | |
parent | 312b9a17e6e2af826f95722cbb4e31afaa9f2933 (diff) |
use hte new pred cache to speed up the new non-local memdep
queries. This speeds up GVN using the new queries (not yet
checked in) by just over 10%.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60743 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/MemoryDependenceAnalysis.cpp')
-rw-r--r-- | lib/Analysis/MemoryDependenceAnalysis.cpp | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/lib/Analysis/MemoryDependenceAnalysis.cpp b/lib/Analysis/MemoryDependenceAnalysis.cpp index c42633bac1..94395027f2 100644 --- a/lib/Analysis/MemoryDependenceAnalysis.cpp +++ b/lib/Analysis/MemoryDependenceAnalysis.cpp @@ -21,7 +21,7 @@ #include "llvm/Function.h" #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/ADT/Statistic.h" -#include "llvm/Support/CFG.h" +#include "llvm/Support/PredIteratorCache.h" #include "llvm/Support/Debug.h" #include "llvm/Target/TargetData.h" using namespace llvm; @@ -45,6 +45,25 @@ char MemoryDependenceAnalysis::ID = 0; static RegisterPass<MemoryDependenceAnalysis> X("memdep", "Memory Dependence Analysis", false, true); +MemoryDependenceAnalysis::MemoryDependenceAnalysis() +: FunctionPass(&ID), PredCache(0) { +} +MemoryDependenceAnalysis::~MemoryDependenceAnalysis() { +} + +/// Clean up memory in between runs +void MemoryDependenceAnalysis::releaseMemory() { + LocalDeps.clear(); + NonLocalDeps.clear(); + NonLocalPointerDeps.clear(); + ReverseLocalDeps.clear(); + ReverseNonLocalDeps.clear(); + ReverseNonLocalPtrDeps.clear(); + PredCache->clear(); +} + + + /// getAnalysisUsage - Does not modify anything. It uses Alias Analysis. /// void MemoryDependenceAnalysis::getAnalysisUsage(AnalysisUsage &AU) const { @@ -56,6 +75,8 @@ void MemoryDependenceAnalysis::getAnalysisUsage(AnalysisUsage &AU) const { bool MemoryDependenceAnalysis::runOnFunction(Function &) { AA = &getAnalysis<AliasAnalysis>(); TD = &getAnalysis<TargetData>(); + if (PredCache == 0) + PredCache.reset(new PredIteratorCache()); return false; } @@ -468,8 +489,7 @@ getNonLocalPointerDependency(Value *Pointer, bool isLoad, BasicBlock *FromBB, // 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) { + for (BasicBlock **PI = PredCache->GetPreds(FromBB); *PI; ++PI) { // TODO: PHI TRANSLATE. getNonLocalPointerDepInternal(Pointer, PointeeSize, isLoad, *PI, Result, Visited); @@ -592,7 +612,7 @@ getNonLocalPointerDepInternal(Value *Pointer, uint64_t PointeeSize, // Otherwise, we have to process all the predecessors of this block to scan // them as well. - for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) { + for (BasicBlock **PI = PredCache->GetPreds(BB); *PI; ++PI) { // TODO: PHI TRANSLATE. Worklist.push_back(*PI); } |