aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-04-21 23:36:08 +0000
committerChris Lattner <sabre@nondot.org>2004-04-21 23:36:08 +0000
commit1363e85df74627530ceede53280613c62a4cdbe3 (patch)
tree4b8ae4e77a7a998106cf91858afe5d9a1faa236a /lib/Transforms
parent4e5f03602c8f990f8ed35574535a29fcd44c8890 (diff)
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
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/Scalar/IndVarSimplify.cpp26
1 files changed, 18 insertions, 8 deletions
diff --git a/lib/Transforms/Scalar/IndVarSimplify.cpp b/lib/Transforms/Scalar/IndVarSimplify.cpp
index b69e0a181e..dbe39008f4 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<Instruction>(V)) {
+ std::string Name = I->getName();
+ I->setName("");
+ V->setName(Name);
+ }
+ I->replaceAllUsesWith(V);
+ DeadInsts.insert(I);
+ ++NumRemoved;
+ Changed = true;
+ }
}
}
-#endif
+
+
+ DeleteTriviallyDeadInstructions(DeadInsts);
}