[llvm-commits] [llvm] r50384 - /llvm/trunk/lib/Transforms/Scalar/DeadLoopElimination.cpp
Owen Anderson
resistor at mac.com
Mon Apr 28 17:45:16 PDT 2008
Author: resistor
Date: Mon Apr 28 19:45:15 2008
New Revision: 50384
URL: http://llvm.org/viewvc/llvm-project?rev=50384&view=rev
Log:
Add some more comments.
Modified:
llvm/trunk/lib/Transforms/Scalar/DeadLoopElimination.cpp
Modified: llvm/trunk/lib/Transforms/Scalar/DeadLoopElimination.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadLoopElimination.cpp?rev=50384&r1=50383&r2=50384&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/DeadLoopElimination.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/DeadLoopElimination.cpp Mon Apr 28 19:45:15 2008
@@ -162,6 +162,12 @@
L->getUniqueExitBlocks(exitBlocks);
BasicBlock* exitBlock = exitBlocks[0];
+ // Because we're deleting a large chunk of code at once, the sequence in which
+ // we remove things is very important to avoid invalidation issues. Don't
+ // mess with this unless you have good reason and know what you're doing.
+
+ // Move simple loop-invariant expressions out of the loop, since they
+ // might be needed by the exit phis.
for (Loop::block_iterator LI = L->block_begin(), LE = L->block_end();
LI != LE; ++LI)
for (BasicBlock::iterator BI = (*LI)->begin(), BE = (*LI)->end();
@@ -171,6 +177,7 @@
I->moveBefore(preheader->getTerminator());
}
+ // Connect the preheader directly to the exit block.
TerminatorInst* TI = preheader->getTerminator();
if (BranchInst* BI = dyn_cast<BranchInst>(TI)) {
if (BI->isUnconditional())
@@ -180,9 +187,12 @@
else
BI->setSuccessor(1, exitBlock);
} else {
+ // FIXME: Support switches
return false;
}
+ // Rewrite phis in the exit block to get their inputs from
+ // the preheader instead of the exiting block.
BasicBlock::iterator BI = exitBlock->begin();
while (PHINode* P = dyn_cast<PHINode>(BI)) {
unsigned i = P->getBasicBlockIndex(exitingBlock);
@@ -190,9 +200,12 @@
BI++;
}
+ // Update lots of internal structures...
DominatorTree& DT = getAnalysis<DominatorTree>();
for (Loop::block_iterator LI = L->block_begin(), LE = L->block_end();
LI != LE; ++LI) {
+ // Move all of the block's children to be children of the preheader, which
+ // allows us to remove the domtree entry for the block.
SmallPtrSet<DomTreeNode*, 8> childNodes;
childNodes.insert(DT[*LI]->begin(), DT[*LI]->end());
for (SmallPtrSet<DomTreeNode*, 8>::iterator DI = childNodes.begin(),
@@ -201,6 +214,8 @@
DT.eraseNode(*LI);
+ // Drop all references between the instructions and the block so
+ // that we don't have reference counting problems later.
for (BasicBlock::iterator BI = (*LI)->begin(), BE = (*LI)->end();
BI != BE; ++BI) {
BI->dropAllReferences();
@@ -209,6 +224,8 @@
(*LI)->dropAllReferences();
}
+ // Erase the instructions and the blocks without having to worry
+ // about ordering because we already dropped the references.
for (Loop::block_iterator LI = L->block_begin(), LE = L->block_end();
LI != LE; ++LI) {
for (BasicBlock::iterator BI = (*LI)->begin(), BE = (*LI)->end();
@@ -220,6 +237,8 @@
(*LI)->eraseFromParent();
}
+ // Finally, the blocks from loopinfo. This has to happen late because
+ // otherwise our loop iterators won't work.
LoopInfo& loopInfo = getAnalysis<LoopInfo>();
SmallPtrSet<BasicBlock*, 8> blocks;
blocks.insert(L->block_begin(), L->block_end());
@@ -227,6 +246,8 @@
E = blocks.end(); I != E; ++I)
loopInfo.removeBlock(*I);
+ // The last step is to inform the loop pass manager that we've
+ // eliminated this loop.
LPM.deleteLoopFromQueue(L);
NumDeleted++;
More information about the llvm-commits
mailing list