move 'MergeBlocksIntoPredecessor' call earlier. Use

getSinglePredecessor to simplify code.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121683 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2010-12-13 05:10:48 +00:00
parent c232a2e559
commit ddb97a2bf1

View File

@@ -1957,6 +1957,13 @@ bool SimplifyCFGOpt::run(BasicBlock *BB) {
// Check for and eliminate duplicate PHI nodes in this block. // Check for and eliminate duplicate PHI nodes in this block.
Changed |= EliminateDuplicatePHINodes(BB); Changed |= EliminateDuplicatePHINodes(BB);
// Merge basic blocks into their predecessor if there is only one distinct
// pred, and if there is only one distinct successor of the predecessor, and
// if there are no PHI nodes.
//
if (MergeBlockIntoPredecessor(BB))
return true;
// If there is a trivial two-entry PHI node in this basic block, and we can // If there is a trivial two-entry PHI node in this basic block, and we can
// eliminate it, do so now. // eliminate it, do so now.
if (PHINode *PN = dyn_cast<PHINode>(BB->begin())) if (PHINode *PN = dyn_cast<PHINode>(BB->begin()))
@@ -2309,33 +2316,15 @@ bool SimplifyCFGOpt::run(BasicBlock *BB) {
} }
} }
// Merge basic blocks into their predecessor if there is only one distinct
// pred, and if there is only one distinct successor of the predecessor, and
// if there are no PHI nodes.
//
if (MergeBlockIntoPredecessor(BB))
return true;
// Otherwise, if this block only has a single predecessor, and if that block // Otherwise, if this block only has a single predecessor, and if that block
// is a conditional branch, see if we can hoist any code from this block up // is a conditional branch, see if we can hoist any code from this block up
// into our predecessor. // into our predecessor.
pred_iterator PI(pred_begin(BB)), PE(pred_end(BB)); if (BasicBlock *OnlyPred = BB->getSinglePredecessor()) {
BasicBlock *OnlyPred = 0;
for (; PI != PE; ++PI) { // Search all predecessors, see if they are all same
if (!OnlyPred)
OnlyPred = *PI;
else if (*PI != OnlyPred) {
OnlyPred = 0; // There are multiple different predecessors...
break;
}
}
if (OnlyPred) {
BranchInst *BI = dyn_cast<BranchInst>(OnlyPred->getTerminator()); BranchInst *BI = dyn_cast<BranchInst>(OnlyPred->getTerminator());
if (BI && BI->isConditional()) { if (BI && BI->isConditional()) {
// Get the other block. // Get the other block.
BasicBlock *OtherBB = BI->getSuccessor(BI->getSuccessor(0) == BB); BasicBlock *OtherBB = BI->getSuccessor(BI->getSuccessor(0) == BB);
PI = pred_begin(OtherBB); pred_iterator PI = pred_begin(OtherBB);
++PI; ++PI;
if (PI == pred_end(OtherBB)) { if (PI == pred_end(OtherBB)) {