If the preheader of the loop was the entry block of the function, make sure
authorChris Lattner <sabre@nondot.org>
Sun, 18 Apr 2004 17:38:42 +0000 (17:38 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 18 Apr 2004 17:38:42 +0000 (17:38 +0000)
that the exit block of the loop becomes the new entry block of the function.

This was causing a verifier assertion on 252.eon.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13039 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopUnroll.cpp

index 266afbbe9b349ade600d8972cfd0fdd33a9d8901..90de9e946daa38bc13a24ef1ec6f48f8c753017a 100644 (file)
@@ -300,10 +300,15 @@ bool LoopUnroll::visitLoop(Loop *L) {
     ChangeExitBlocksFromTo(LI->begin(), LI->end(),
                            Preheader, LoopExit);
 
+  // If the preheader was the entry block of this function, move the exit block
+  // to be the new entry of the loop.
+  Function *F = LoopExit->getParent();
+  if (Preheader == &F->front())
+    F->getBasicBlockList().splice(F->begin(), F->getBasicBlockList(), LoopExit);
 
   // Actually delete the blocks now.
-  LoopExit->getParent()->getBasicBlockList().erase(Preheader);
-  LoopExit->getParent()->getBasicBlockList().erase(BB);
+  F->getBasicBlockList().erase(Preheader);
+  F->getBasicBlockList().erase(BB);
 
   ++NumUnrolled;
   return true;