We need to update PHIs containing the exiting block, not the exit block. We really...
authorOwen Anderson <resistor@mac.com>
Tue, 6 May 2008 20:55:16 +0000 (20:55 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 6 May 2008 20:55:16 +0000 (20:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50770 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopDeletion.cpp

index 763060c092ca4ef7645d0264d4f9a6e1e1fff216..1ea2f6ac9ea35500e622171f3fd87bed1c033f9c 100644 (file)
@@ -192,8 +192,9 @@ bool LoopDeletion::runOnLoop(Loop* L, LPPassManager& LPM) {
     return false;
   
   // Now that we know the removal is safe, remove the loop by changing the
-  // branch from the preheader to go to the single exiting block.  
+  // branch from the preheader to go to the single exit block.  
   BasicBlock* exitBlock = exitBlocks[0];
+  BasicBlock* exitingBlock = exitingBlocks[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
@@ -218,7 +219,7 @@ bool LoopDeletion::runOnLoop(Loop* L, LPPassManager& LPM) {
   // the preheader instead of the exiting block.
   BasicBlock::iterator BI = exitBlock->begin();
   while (PHINode* P = dyn_cast<PHINode>(BI)) {
-    P->replaceUsesOfWith(exitBlock, preheader);
+    P->replaceUsesOfWith(exitingBlock, preheader);
     BI++;
   }
   
@@ -253,8 +254,12 @@ bool LoopDeletion::runOnLoop(Loop* L, LPPassManager& LPM) {
   // NOTE: This iteration is safe because erasing the block does not remove its
   // entry from the loop's block list.  We do that in the next section.
   for (Loop::block_iterator LI = L->block_begin(), LE = L->block_end();
-       LI != LE; ++LI)
+       LI != LE; ++LI) {
+    for (Value::use_iterator UI = (*LI)->use_begin(), UE = (*LI)->use_end();
+         UI != UE; ++UI)
+      (*UI)->dump();
     (*LI)->eraseFromParent();
+  }
   
   // Finally, the blocks from loopinfo.  This has to happen late because
   // otherwise our loop iterators won't work.