diff options
author | Dan Gohman <gohman@apple.com> | 2008-08-22 21:28:19 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2008-08-22 21:28:19 +0000 |
commit | 3c8f36fd03d046ee2a8700c60b5a52887d9f07b9 (patch) | |
tree | f27cf9c08928d2450c01adcbb61f9b8aa5774e64 /lib/CodeGen/SelectionDAG/FastISel.cpp | |
parent | 70f24c62ad6314a742a101ef9de046f5e788cb7f (diff) |
Reapply r55191 and r55192.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55205 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/FastISel.cpp')
-rw-r--r-- | lib/CodeGen/SelectionDAG/FastISel.cpp | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/lib/CodeGen/SelectionDAG/FastISel.cpp b/lib/CodeGen/SelectionDAG/FastISel.cpp index 1462472ea4..fb4de574a8 100644 --- a/lib/CodeGen/SelectionDAG/FastISel.cpp +++ b/lib/CodeGen/SelectionDAG/FastISel.cpp @@ -145,6 +145,8 @@ BasicBlock::iterator FastISel::SelectInstructions(BasicBlock::iterator Begin, BasicBlock::iterator End, DenseMap<const Value*, unsigned> &ValueMap, + std::map<const BasicBlock*, + MachineBasicBlock *> &MBBMap, MachineBasicBlock *mbb) { MBB = mbb; BasicBlock::iterator I = Begin; @@ -195,19 +197,24 @@ FastISel::SelectInstructions(BasicBlock::iterator Begin, case Instruction::Br: { BranchInst *BI = cast<BranchInst>(I); - // For now, check for and handle just the most trivial case: an - // unconditional fall-through branch. if (BI->isUnconditional()) { - MachineFunction::iterator NextMBB = + MachineFunction::iterator NextMBB = next(MachineFunction::iterator(MBB)); - if (NextMBB != MF.end() && - NextMBB->getBasicBlock() == BI->getSuccessor(0)) { - MBB->addSuccessor(NextMBB); - break; + BasicBlock *LLVMSucc = BI->getSuccessor(0); + MachineBasicBlock *MSucc = MBBMap[LLVMSucc]; + + if (NextMBB != MF.end() && MSucc == NextMBB) { + // The unconditional fall-through case, which needs no instructions. + } else { + // The unconditional branch case. + TII.InsertBranch(*MBB, MSucc, NULL, SmallVector<MachineOperand, 0>()); } + MBB->addSuccessor(MSucc); + break; } - // Something more complicated. Halt "fast" selection and bail. + // Conditional branches are not handed yet. + // Halt "fast" selection and bail. return I; } |