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:
parent
7ca2ddfbb8
commit
b4e635cfc4
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user