1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00

Fix a bug where we could corrupt a parent loop's header info if we unrolled

a nested loop.  This fixes Transforms/LoopUnroll/2005-03-06-BadLoopInfoUpdate.ll
and PR532

llvm-svn: 20493
This commit is contained in:
Chris Lattner 2005-03-06 20:57:32 +00:00
parent 7ca2ddfbb8
commit b4e635cfc4

View File

@ -283,16 +283,27 @@ bool LoopUnroll::visitLoop(Loop *L) {
// Preheader.
Preheader->replaceAllUsesWith(LoopExit);
Function *F = LoopExit->getParent();
if (Parent) {
// Otherwise, if this is a sub-loop, and the preheader was the loop header
// of the parent loop, move the exit block to be the new parent loop header.
if (Parent->getHeader() == Preheader) {
assert(Parent->contains(LoopExit) &&
"Exit block isn't contained in parent?");
Parent->moveToHeader(LoopExit);
}
} else {
// If the preheader was the entry block of this function, move the exit
// block to be the new entry of the function.
if (Preheader == &F->front())
F->getBasicBlockList().splice(F->begin(),
F->getBasicBlockList(), LoopExit);
}
// Remove BB and LoopExit from our analyses.
LI->removeBlock(Preheader);
LI->removeBlock(BB);
// 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.
F->getBasicBlockList().erase(Preheader);
F->getBasicBlockList().erase(BB);