diff options
author | Bill Wendling <isanbard@gmail.com> | 2010-03-31 23:26:26 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2010-03-31 23:26:26 +0000 |
commit | 9e9cca424cf0374259706cbedec89507bf89bdcf (patch) | |
tree | 78ea2144efd5698c5fb3b04794b4ddb8e21056c6 | |
parent | f8df814869368edd3f74bc81dca202f0d2a55b66 (diff) |
Revert r100056. It was causing a failure on MSVC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100062 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/MachineBasicBlock.cpp | 58 |
1 files changed, 35 insertions, 23 deletions
diff --git a/lib/CodeGen/MachineBasicBlock.cpp b/lib/CodeGen/MachineBasicBlock.cpp index bd0ccb40f5..fbe4fc2f46 100644 --- a/lib/CodeGen/MachineBasicBlock.cpp +++ b/lib/CodeGen/MachineBasicBlock.cpp @@ -23,7 +23,6 @@ #include "llvm/Target/TargetMachine.h" #include "llvm/Assembly/Writer.h" #include "llvm/ADT/SmallString.h" -#include "llvm/ADT/SmallPtrSet.h" #include "llvm/Support/Debug.h" #include "llvm/Support/LeakDetector.h" #include "llvm/Support/raw_ostream.h" @@ -460,41 +459,54 @@ bool MachineBasicBlock::CorrectExtraCFGEdges(MachineBasicBlock *DestA, // conditional branch followed by an unconditional branch. DestA is the // 'true' destination and DestB is the 'false' destination. - bool Changed = false; + bool MadeChange = false; + bool AddedFallThrough = false; MachineFunction::iterator FallThru = llvm::next(MachineFunction::iterator(this)); - - if (DestA == 0 && DestB == 0) { - // Block falls through to successor. - DestA = FallThru; - DestB = FallThru; - } else if (DestA != 0 && DestB == 0) { - if (isCond) - // Block ends in conditional jump that falls through to successor. + + if (isCond) { + // If this block ends with a conditional branch that falls through to its + // successor, set DestB as the successor. + if (DestB == 0 && FallThru != getParent()->end()) { DestB = FallThru; + AddedFallThrough = true; + } } else { - assert(DestA && DestB && isCond && - "CFG in a bad state. Cannot correct CFG edges"); + // If this is an unconditional branch with no explicit dest, it must just be + // a fallthrough into DestA. + if (DestA == 0 && FallThru != getParent()->end()) { + DestA = FallThru; + AddedFallThrough = true; + } } - - // Remove superfluous edges. I.e., those which aren't destinations of this - // basic block, duplicate edges, or landing pads. - SmallPtrSet<const MachineBasicBlock*, 8> SeenMBBs; + MachineBasicBlock::succ_iterator SI = succ_begin(); + MachineBasicBlock *OrigDestA = DestA, *OrigDestB = DestB; while (SI != succ_end()) { const MachineBasicBlock *MBB = *SI; - if (!SeenMBBs.insert(MBB) || - (MBB != DestA && MBB != DestB && !MBB->isLandingPad())) { - // This is a superfluous edge, remove it. - SI = removeSuccessor(SI); - Changed = true; - } else { + if (MBB == DestA) { + DestA = 0; + ++SI; + } else if (MBB == DestB) { + DestB = 0; + ++SI; + } else if (MBB->isLandingPad() && + MBB != OrigDestA && MBB != OrigDestB) { ++SI; + } else { + // Otherwise, this is a superfluous edge, remove it. + SI = removeSuccessor(SI); + MadeChange = true; } } - return Changed; + if (!AddedFallThrough) + assert(DestA == 0 && DestB == 0 && "MachineCFG is missing edges!"); + else if (isCond) + assert(DestA == 0 && "MachineCFG is missing edges!"); + + return MadeChange; } /// findDebugLoc - find the next valid DebugLoc starting at MBBI, skipping |