mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-28 19:25:00 +00:00
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:
@@ -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)) {
|
||||||
|
Reference in New Issue
Block a user