don't call MergeBasicBlockIntoOnlyPred on a block whose only

predecessor is itself.  This doesn't make sense, and this is
a dead infinite loop anyway.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60210 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2008-11-28 19:54:49 +00:00
parent c6dbe7fbad
commit f5102a0f08
3 changed files with 30 additions and 10 deletions
+11 -9
View File
@@ -205,16 +205,18 @@ void CodeGenPrepare::EliminateMostlyEmptyBlock(BasicBlock *BB) {
// If the destination block has a single pred, then this is a trivial edge,
// just collapse it.
if (BasicBlock *SinglePred = DestBB->getSinglePredecessor()) {
// Remember if SinglePred was the entry block of the function. If so, we
// will need to move BB back to the entry position.
bool isEntry = SinglePred == &SinglePred->getParent()->getEntryBlock();
MergeBasicBlockIntoOnlyPred(DestBB);
if (SinglePred != DestBB) {
// Remember if SinglePred was the entry block of the function. If so, we
// will need to move BB back to the entry position.
bool isEntry = SinglePred == &SinglePred->getParent()->getEntryBlock();
MergeBasicBlockIntoOnlyPred(DestBB);
if (isEntry && BB != &BB->getParent()->getEntryBlock())
BB->moveBefore(&BB->getParent()->getEntryBlock());
DOUT << "AFTER:\n" << *DestBB << "\n\n\n";
return;
if (isEntry && BB != &BB->getParent()->getEntryBlock())
BB->moveBefore(&BB->getParent()->getEntryBlock());
DOUT << "AFTER:\n" << *DestBB << "\n\n\n";
return;
}
}
// Otherwise, we have multiple predecessors of BB. Update the PHIs in DestBB