aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2010-03-31 23:26:26 +0000
committerBill Wendling <isanbard@gmail.com>2010-03-31 23:26:26 +0000
commit9e9cca424cf0374259706cbedec89507bf89bdcf (patch)
tree78ea2144efd5698c5fb3b04794b4ddb8e21056c6
parentf8df814869368edd3f74bc81dca202f0d2a55b66 (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.cpp58
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