diff options
| author | Dan Gohman <gohman@apple.com> | 2009-02-17 20:49:49 +0000 | 
|---|---|---|
| committer | Dan Gohman <gohman@apple.com> | 2009-02-17 20:49:49 +0000 | 
| commit | 4330034160a3eb6e2cdb7590c797121554fab904 (patch) | |
| tree | d4590a627df76ddb8fdc49fd7428e1e259e26393 /llvm/lib/Analysis | |
| parent | 24f31a0e59873421311bbe0b16198b4e3ad0cd91 (diff) | |
| download | bcm5719-llvm-4330034160a3eb6e2cdb7590c797121554fab904.tar.gz bcm5719-llvm-4330034160a3eb6e2cdb7590c797121554fab904.zip  | |
Add a method to ScalarEvolution for telling it when a loop has been
modified in a way that may effect the trip count calculation. Change
IndVars to use this method when it rewrites pointer or floating-point
induction variables instead of using a doInitialization method to
sneak these changes in before ScalarEvolution has a chance to see
the loop. This eliminates the need for LoopPass to depend on
ScalarEvolution.
llvm-svn: 64810
Diffstat (limited to 'llvm/lib/Analysis')
| -rw-r--r-- | llvm/lib/Analysis/LoopPass.cpp | 3 | ||||
| -rw-r--r-- | llvm/lib/Analysis/ScalarEvolution.cpp | 16 | 
2 files changed, 16 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/LoopPass.cpp b/llvm/lib/Analysis/LoopPass.cpp index da9ac2749a0..c45c2ef4c0b 100644 --- a/llvm/lib/Analysis/LoopPass.cpp +++ b/llvm/lib/Analysis/LoopPass.cpp @@ -14,7 +14,6 @@  //===----------------------------------------------------------------------===//  #include "llvm/Analysis/LoopPass.h" -#include "llvm/Analysis/ScalarEvolution.h"  using namespace llvm;  //===----------------------------------------------------------------------===// @@ -173,8 +172,6 @@ void LPPassManager::getAnalysisUsage(AnalysisUsage &Info) const {    // LPPassManager needs LoopInfo. In the long term LoopInfo class will     // become part of LPPassManager.    Info.addRequired<LoopInfo>(); -  // Used by IndVar doInitialization. -  Info.addRequired<ScalarEvolution>();    Info.setPreservesAll();  } diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 4e0dba7e04b..54f27653542 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -1453,6 +1453,11 @@ namespace {      /// an analyzable loop-invariant iteration count.      bool hasLoopInvariantIterationCount(const Loop *L); +    /// forgetLoopIterationCount - This method should be called by the +    /// client when it has changed a loop in a way that may effect +    /// ScalarEvolution's ability to compute a trip count. +    void forgetLoopIterationCount(const Loop *L); +      /// getIterationCount - If the specified loop has a predictable iteration      /// count, return it.  Note that it is not valid to call this method on a      /// loop without a loop-invariant iteration count. @@ -1931,6 +1936,13 @@ SCEVHandle ScalarEvolutionsImpl::getIterationCount(const Loop *L) {    return I->second;  } +/// forgetLoopIterationCount - This method should be called by the +/// client when it has changed a loop in a way that may effect +/// ScalarEvolution's ability to compute a trip count. +void ScalarEvolutionsImpl::forgetLoopIterationCount(const Loop *L) { +  IterationCounts.erase(L); +} +  /// ComputeIterationCount - Compute the number of times the specified loop  /// will iterate.  SCEVHandle ScalarEvolutionsImpl::ComputeIterationCount(const Loop *L) { @@ -3091,6 +3103,10 @@ bool ScalarEvolution::hasLoopInvariantIterationCount(const Loop *L) const {    return !isa<SCEVCouldNotCompute>(getIterationCount(L));  } +void ScalarEvolution::forgetLoopIterationCount(const Loop *L) { +  return ((ScalarEvolutionsImpl*)Impl)->forgetLoopIterationCount(L); +} +  SCEVHandle ScalarEvolution::getSCEVAtScope(Value *V, const Loop *L) const {    return ((ScalarEvolutionsImpl*)Impl)->getSCEVAtScope(getSCEV(V), L);  }  | 

