From 1363e85df74627530ceede53280613c62a4cdbe3 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 21 Apr 2004 23:36:08 +0000 Subject: [PATCH] Implement a todo, rewriting all possible scev expressions inside of the 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 | 26 ++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/Transforms/Scalar/IndVarSimplify.cpp b/lib/Transforms/Scalar/IndVarSimplify.cpp index b69e0a181e8..dbe39008f49 100644 --- a/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -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(V)) { + std::string Name = I->getName(); + I->setName(""); + V->setName(Name); + } + I->replaceAllUsesWith(V); + DeadInsts.insert(I); + ++NumRemoved; + Changed = true; + } } } -#endif + + + DeleteTriviallyDeadInstructions(DeadInsts); }