Implement a todo, rewriting all possible scev expressions inside of the
authorChris Lattner <sabre@nondot.org>
Wed, 21 Apr 2004 23:36:08 +0000 (23:36 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 21 Apr 2004 23:36:08 +0000 (23:36 +0000)
loop.  This eliminates the extra add from the previous case, but it's
not clear that this will be a performance win overall.  Tommorows test
results will tell. :)

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

lib/Transforms/Scalar/IndVarSimplify.cpp

index b69e0a181e8cf0e7bba57d799930fc9028309593..dbe39008f49063f340e60815baa289ed7914c6ba 100644 (file)
@@ -444,21 +444,31 @@ void IndVarSimplify::runOnLoop(Loop *L) {
     Changed = true;
   }
 
-  DeleteTriviallyDeadInstructions(DeadInsts);
-
-  // TODO: In the future we could replace all instructions in the loop body with
-  // simpler expressions.  It's not clear how useful this would be though or if
-  // the code expansion cost would be worth it!  We probably shouldn't do this
-  // until we have a way to reuse expressions already in the code.
-#if 0
+  // Now replace all derived expressions in the loop body with simpler
+  // expressions.
   for (unsigned i = 0, e = L->getBlocks().size(); i != e; ++i)
     if (LI->getLoopFor(L->getBlocks()[i]) == L) {  // Not in a subloop...
       BasicBlock *BB = L->getBlocks()[i];
       for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
         if (I->getType()->isInteger() &&      // Is an integer instruction
+            !I->use_empty() &&
             !Rewriter.isInsertedInstruction(I)) {
           SCEVHandle SH = SE->getSCEV(I);
+          Value *V = Rewriter.ExpandCodeFor(SH, I, I->getType());
+          if (V != I) {
+            if (isa<Instruction>(V)) {
+              std::string Name = I->getName();
+              I->setName("");
+              V->setName(Name);
+            }
+            I->replaceAllUsesWith(V);
+            DeadInsts.insert(I);
+            ++NumRemoved;
+            Changed = true;
+          }          
         }
     }
-#endif
+
+
+  DeleteTriviallyDeadInstructions(DeadInsts);
 }