OSDN Git Service

When ScalarEvolution is told to forget the trip count for a loop, have
authorDan Gohman <gohman@apple.com>
Sat, 2 May 2009 17:43:35 +0000 (17:43 +0000)
committerDan Gohman <gohman@apple.com>
Sat, 2 May 2009 17:43:35 +0000 (17:43 +0000)
it also forget any SCEVs associated with loop-header PHIs in the loop,
as they may be dependent on trip count information.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@70633 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/ScalarEvolution.h
lib/Analysis/ScalarEvolution.cpp

index 6ef0b35..a0a7c1e 100644 (file)
@@ -333,6 +333,11 @@ namespace llvm {
     /// expression cannot be evaluated, return UnknownValue itself.
     SCEVHandle getSCEVAtScope(SCEV *S, const Loop *L);
 
+    /// forgetLoopPHIs - Delete the memoized SCEVs associated with the
+    /// PHI nodes in the given loop. This is used when the trip count of
+    /// the loop may have changed.
+    void forgetLoopPHIs(const Loop *L);
+
   public:
     static char ID; // Pass identification, replacement for typeid
     ScalarEvolution();
index d458399..a6d3954 100644 (file)
@@ -2111,9 +2111,7 @@ ScalarEvolution::getBackedgeTakenInfo(const Loop *L) {
     // conservative estimates made without the benefit
     // of trip count information.
     if (ItCount.hasAnyInfo())
-      for (BasicBlock::iterator I = L->getHeader()->begin();
-           PHINode *PN = dyn_cast<PHINode>(I); ++I)
-        deleteValueFromRecords(PN);
+      forgetLoopPHIs(L);
   }
   return Pair.first->second;
 }
@@ -2124,6 +2122,16 @@ ScalarEvolution::getBackedgeTakenInfo(const Loop *L) {
 /// is deleted.
 void ScalarEvolution::forgetLoopBackedgeTakenCount(const Loop *L) {
   BackedgeTakenCounts.erase(L);
+  forgetLoopPHIs(L);
+}
+
+/// forgetLoopPHIs - Delete the memoized SCEVs associated with the
+/// PHI nodes in the given loop. This is used when the trip count of
+/// the loop may have changed.
+void ScalarEvolution::forgetLoopPHIs(const Loop *L) {
+  for (BasicBlock::iterator I = L->getHeader()->begin();
+       PHINode *PN = dyn_cast<PHINode>(I); ++I)
+    deleteValueFromRecords(PN);
 }
 
 /// ComputeBackedgeTakenCount - Compute the number of times the backedge