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.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@64810 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/Scalar/IndVarSimplify.cpp b/lib/Transforms/Scalar/IndVarSimplify.cpp
index dc4f10b..4cfe359 100644
--- a/lib/Transforms/Scalar/IndVarSimplify.cpp
+++ b/lib/Transforms/Scalar/IndVarSimplify.cpp
@@ -74,8 +74,8 @@
    static char ID; // Pass identification, replacement for typeid
    IndVarSimplify() : LoopPass(&ID) {}
 
-   bool runOnLoop(Loop *L, LPPassManager &LPM);
-   bool doInitialization(Loop *L, LPPassManager &LPM);
+   virtual bool runOnLoop(Loop *L, LPPassManager &LPM);
+
    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
      AU.addRequired<ScalarEvolution>();
      AU.addRequiredID(LCSSAID);
@@ -88,6 +88,8 @@
 
   private:
 
+    void RewriteNonIntegerIVs(Loop *L);
+
     void EliminatePointerRecurrence(PHINode *PN, BasicBlock *Preheader,
                                     SmallPtrSet<Instruction*, 16> &DeadInsts);
     void LinearFunctionTestReplace(Loop *L, SCEVHandle IterationCount,
@@ -411,16 +413,13 @@
   DeleteTriviallyDeadInstructions(InstructionsToDelete);
 }
 
-bool IndVarSimplify::doInitialization(Loop *L, LPPassManager &LPM) {
-
-  Changed = false;
+void IndVarSimplify::RewriteNonIntegerIVs(Loop *L) {
   // First step.  Check to see if there are any trivial GEP pointer recurrences.
   // If there are, change them into integer recurrences, permitting analysis by
   // the SCEV routines.
   //
   BasicBlock *Header    = L->getHeader();
   BasicBlock *Preheader = L->getLoopPreheader();
-  SE = &LPM.getAnalysis<ScalarEvolution>();
 
   SmallPtrSet<Instruction*, 16> DeadInsts;
   for (BasicBlock::iterator I = Header->begin(); isa<PHINode>(I); ++I) {
@@ -431,10 +430,14 @@
       HandleFloatingPointIV(L, PN, DeadInsts);
   }
 
+  // If the loop previously had a pointer or floating-point IV, ScalarEvolution
+  // may not have been able to compute a trip count. Now that we've done some
+  // re-writing, the trip count may be computable.
+  if (Changed)
+    SE->forgetLoopIterationCount(L);
+
   if (!DeadInsts.empty())
     DeleteTriviallyDeadInstructions(DeadInsts);
-
-  return Changed;
 }
 
 /// getEffectiveIndvarType - Determine the widest type that the
@@ -594,8 +597,12 @@
 bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
   LI = &getAnalysis<LoopInfo>();
   SE = &getAnalysis<ScalarEvolution>();
-
   Changed = false;
+
+  // If there are any floating-point or pointer recurrences, attempt to
+  // transform them to use integer recurrences.
+  RewriteNonIntegerIVs(L);
+
   BasicBlock *Header       = L->getHeader();
   BasicBlock *ExitingBlock = L->getExitingBlock();
   SmallPtrSet<Instruction*, 16> DeadInsts;