If the loop executes a constant number of times, try a bit harder to replace
authorChris Lattner <sabre@nondot.org>
Sat, 17 Apr 2004 18:44:09 +0000 (18:44 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 17 Apr 2004 18:44:09 +0000 (18:44 +0000)
exit values.

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

lib/Transforms/Scalar/IndVarSimplify.cpp

index fa81f81f7435043d09ee438df62f8170c4202099..d5eb668107d272c1f21565cfec8262374c1a74fb 100644 (file)
@@ -276,6 +276,8 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L) {
   BasicBlock::iterator InsertPt = BlockToInsertInto->begin();
   while (isa<PHINode>(InsertPt)) ++InsertPt;
 
+  bool HasConstantItCount = isa<SCEVConstant>(SE->getIterationCount(L));
+
   std::set<Instruction*> InstructionsToDelete;
   
   for (unsigned i = 0, e = L->getBlocks().size(); i != e; ++i)
@@ -284,7 +286,8 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L) {
       for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
         if (I->getType()->isInteger()) {      // Is an integer instruction
           SCEVHandle SH = SE->getSCEV(I);
-          if (SH->hasComputableLoopEvolution(L)) {   // Varies predictably
+          if (SH->hasComputableLoopEvolution(L) ||    // Varies predictably
+              HasConstantItCount) {
             // Find out if this predictably varying value is actually used
             // outside of the loop.  "extra" as opposed to "intra".
             std::vector<User*> ExtraLoopUsers;
@@ -296,7 +299,7 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L) {
               // Okay, this instruction has a user outside of the current loop
               // and varies predictably in this loop.  Evaluate the value it
               // contains when the loop exits, and insert code for it.
-              SCEVHandle ExitValue = SE->getSCEVAtScope(I,L->getParentLoop());
+              SCEVHandle ExitValue = SE->getSCEVAtScope(I, L->getParentLoop());
               if (!isa<SCEVCouldNotCompute>(ExitValue)) {
                 Changed = true;
                 ++NumReplaced;