Reverting r136884 updateUnloop, which crashed a linux builder.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136857 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Andrew Trick
2011-08-04 01:04:37 +00:00
parent e651983e71
commit 0712108d22
3 changed files with 53 additions and 266 deletions

View File

@@ -84,18 +84,62 @@ LPPassManager::LPPassManager(int Depth)
/// Delete loop from the loop queue and loop hierarchy (LoopInfo).
void LPPassManager::deleteLoopFromQueue(Loop *L) {
LI->updateUnloop(L);
if (Loop *ParentLoop = L->getParentLoop()) { // Not a top-level loop.
// Reparent all of the blocks in this loop. Since BBLoop had a parent,
// they are now all in it.
for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
I != E; ++I)
if (LI->getLoopFor(*I) == L) // Don't change blocks in subloops.
LI->changeLoopFor(*I, ParentLoop);
// Remove the loop from its parent loop.
for (Loop::iterator I = ParentLoop->begin(), E = ParentLoop->end();;
++I) {
assert(I != E && "Couldn't find loop");
if (*I == L) {
ParentLoop->removeChildLoop(I);
break;
}
}
// Move all subloops into the parent loop.
while (!L->empty())
ParentLoop->addChildLoop(L->removeChildLoop(L->end()-1));
} else {
// Reparent all of the blocks in this loop. Since BBLoop had no parent,
// they no longer in a loop at all.
for (unsigned i = 0; i != L->getBlocks().size(); ++i) {
// Don't change blocks in subloops.
if (LI->getLoopFor(L->getBlocks()[i]) == L) {
LI->removeBlock(L->getBlocks()[i]);
--i;
}
}
// Remove the loop from the top-level LoopInfo object.
for (LoopInfo::iterator I = LI->begin(), E = LI->end();; ++I) {
assert(I != E && "Couldn't find loop");
if (*I == L) {
LI->removeLoop(I);
break;
}
}
// Move all of the subloops to the top-level.
while (!L->empty())
LI->addTopLevelLoop(L->removeChildLoop(L->end()-1));
}
delete L;
// If L is current loop then skip rest of the passes and let
// runOnFunction remove L from LQ. Otherwise, remove L from LQ now
// and continue applying other passes on CurrentLoop.
if (CurrentLoop == L)
if (CurrentLoop == L) {
skipThisLoop = true;
delete L;
if (skipThisLoop)
return;
}
for (std::deque<Loop *>::iterator I = LQ.begin(),
E = LQ.end(); I != E; ++I) {