diff options
author | Chris Lattner <sabre@nondot.org> | 2004-04-21 23:36:08 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-04-21 23:36:08 +0000 |
commit | 1363e85df74627530ceede53280613c62a4cdbe3 (patch) | |
tree | 4b8ae4e77a7a998106cf91858afe5d9a1faa236a /lib/Transforms | |
parent | 4e5f03602c8f990f8ed35574535a29fcd44c8890 (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.cpp | 26 |
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); } |