From 9e7d74961bb2e4b965d9f42b20c9a1608422d468 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 21 Oct 2006 06:11:43 +0000 Subject: [PATCH] don't break infinite loops llvm-svn: 31102 --- lib/CodeGen/BranchFolding.cpp | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/lib/CodeGen/BranchFolding.cpp b/lib/CodeGen/BranchFolding.cpp index befcd002219..0752e3c9f73 100644 --- a/lib/CodeGen/BranchFolding.cpp +++ b/lib/CodeGen/BranchFolding.cpp @@ -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.