don't break infinite loops

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31102 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2006-10-21 06:11:43 +00:00
parent 7c4fe259f8
commit 4bc135e93b

View File

@ -499,7 +499,7 @@ void BranchFolder::OptimizeBlock(MachineFunction::iterator MBB) {
// If this branch is the only thing in its block, see if we can forward
// other blocks across it.
if (CurTBB && CurCond.empty() && CurFBB == 0 &&
TII->isBranch(MBB->begin()->getOpcode())) {
TII->isBranch(MBB->begin()->getOpcode()) && CurTBB != &*MBB) {
// This block may contain just an unconditional branch. Because there can
// be 'non-branch terminators' in the block, try removing the branch and
// then seeing if the block is empty.
@ -526,15 +526,28 @@ void BranchFolder::OptimizeBlock(MachineFunction::iterator MBB) {
}
// Iterate through all the predecessors, revectoring each in-turn.
while (!MBB->pred_empty())
ReplaceUsesOfBlockWith(*(MBB->pred_end()-1), MBB, CurTBB, TII);
MachineBasicBlock::pred_iterator PI = MBB->pred_begin();
bool DidChange = false;
bool HasBranchToSelf = false;
while (PI != MBB->pred_end()) {
if (*PI == &*MBB) {
// If this block has an uncond branch to itself, leave it.
++PI;
HasBranchToSelf = true;
} else {
DidChange = true;
ReplaceUsesOfBlockWith(*PI, MBB, CurTBB, TII);
}
}
// Change any jumptables to go to the new MBB.
MBB->getParent()->getJumpTableInfo()->ReplaceMBBInJumpTables(MBB,
CurTBB);
++NumBranchOpts;
MadeChange = true;
return;
if (DidChange) {
++NumBranchOpts;
MadeChange = true;
if (!HasBranchToSelf) return;
}
}
// Add the branch back if the block is more than just an uncond branch.