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. :)

llvm-svn: 13103
This commit is contained in:
Chris Lattner 2004-04-21 23:36:08 +00:00
parent fb9a299f68
commit af532f27e7
1 changed files with 18 additions and 8 deletions

View 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);
}