[llvm-commits] CVS: llvm/lib/Transforms/Utils/SimplifyCFG.cpp
Chris Lattner
lattner at cs.uiuc.edu
Tue Aug 2 17:11:28 PDT 2005
Changes in directory llvm/lib/Transforms/Utils:
SimplifyCFG.cpp updated: 1.75 -> 1.76
---
Log message:
Rip some code out of the main SimplifyCFG function into a subfunction and
call it from the only place it is live. No functionality changes.
---
Diffs of the changes: (+72 -78)
SimplifyCFG.cpp | 150 ++++++++++++++++++++++++++------------------------------
1 files changed, 72 insertions(+), 78 deletions(-)
Index: llvm/lib/Transforms/Utils/SimplifyCFG.cpp
diff -u llvm/lib/Transforms/Utils/SimplifyCFG.cpp:1.75 llvm/lib/Transforms/Utils/SimplifyCFG.cpp:1.76
--- llvm/lib/Transforms/Utils/SimplifyCFG.cpp:1.75 Tue Aug 2 18:31:38 2005
+++ llvm/lib/Transforms/Utils/SimplifyCFG.cpp Tue Aug 2 19:11:16 2005
@@ -91,6 +91,66 @@
return false;
}
+/// TryToSimplifyUncondBranchFromEmptyBlock - BB contains an unconditional
+/// branch to Succ, and contains no instructions other than PHI nodes and the
+/// branch. If possible, eliminate BB.
+static bool TryToSimplifyUncondBranchFromEmptyBlock(BasicBlock *BB,
+ BasicBlock *Succ) {
+ // If our successor has PHI nodes, then we need to update them to include
+ // entries for BB's predecessors, not for BB itself. Be careful though,
+ // if this transformation fails (returns true) then we cannot do this
+ // transformation!
+ //
+ if (PropagatePredecessorsForPHIs(BB, Succ)) return false;
+
+ DEBUG(std::cerr << "Killing Trivial BB: \n" << *BB);
+
+ if (isa<PHINode>(&BB->front())) {
+ std::vector<BasicBlock*>
+ OldSuccPreds(pred_begin(Succ), pred_end(Succ));
+
+ // Move all PHI nodes in BB to Succ if they are alive, otherwise
+ // delete them.
+ while (PHINode *PN = dyn_cast<PHINode>(&BB->front()))
+ if (PN->use_empty() /*|| Succ->getSinglePredecessor() == 0*/) {
+ // We can only move the PHI node into Succ if BB dominates Succ.
+ // Since BB only has a single successor (Succ), the PHI nodes
+ // will dominate Succ, unless Succ has multiple predecessors. In
+ // this case, the PHIs are either dead, or have references in dead
+ // blocks. In either case, we can just remove them.
+ if (!PN->use_empty()) // Uses in dead block?
+ PN->replaceAllUsesWith(UndefValue::get(PN->getType()));
+ PN->eraseFromParent(); // Nuke instruction.
+ } else {
+ // The instruction is alive, so this means that Succ must have
+ // *ONLY* had BB as a predecessor, and the PHI node is still valid
+ // now. Simply move it into Succ, because we know that BB
+ // strictly dominated Succ.
+ BB->getInstList().remove(BB->begin());
+ Succ->getInstList().push_front(PN);
+
+ // We need to add new entries for the PHI node to account for
+ // predecessors of Succ that the PHI node does not take into
+ // account. At this point, since we know that BB dominated succ,
+ // this means that we should any newly added incoming edges should
+ // use the PHI node as the value for these edges, because they are
+ // loop back edges.
+ for (unsigned i = 0, e = OldSuccPreds.size(); i != e; ++i)
+ if (OldSuccPreds[i] != BB)
+ PN->addIncoming(PN, OldSuccPreds[i]);
+ }
+ }
+
+ // Everything that jumped to BB now goes to Succ.
+ std::string OldName = BB->getName();
+ BB->replaceAllUsesWith(Succ);
+ BB->eraseFromParent(); // Delete the old basic block.
+
+ if (!OldName.empty() && !Succ->hasName()) // Transfer name if we can
+ Succ->setName(OldName);
+ return true;
+}
+
/// GetIfCondition - Given a basic block (BB) with two predecessors (and
/// presumably PHI nodes in it), check to see if the merge at this block is due
/// to an "if condition". If so, return the boolean condition that determines
@@ -820,7 +880,6 @@
};
}
-
// SimplifyCFG - This function is used to do simplification of a CFG. For
// example, it adjusts branches to branches to eliminate the extra hop, it
// eliminates unreachable basic blocks, and does other "peephole" optimization
@@ -868,73 +927,6 @@
// away...
Changed |= ConstantFoldTerminator(BB);
- // Check to see if this block has no non-phi instructions and only a single
- // successor. If so, replace references to this basic block with references
- // to the successor.
- succ_iterator SI(succ_begin(BB));
- if (SI != succ_end(BB) && ++SI == succ_end(BB)) { // One succ?
- BasicBlock::iterator BBI = BB->begin(); // Skip over phi nodes...
- while (isa<PHINode>(*BBI)) ++BBI;
-
- BasicBlock *Succ = *succ_begin(BB); // There is exactly one successor.
- if (BBI->isTerminator() && // Terminator is the only non-phi instruction!
- Succ != BB) { // Don't hurt infinite loops!
- // If our successor has PHI nodes, then we need to update them to include
- // entries for BB's predecessors, not for BB itself. Be careful though,
- // if this transformation fails (returns true) then we cannot do this
- // transformation!
- //
- if (!PropagatePredecessorsForPHIs(BB, Succ)) {
- DEBUG(std::cerr << "Killing Trivial BB: \n" << *BB);
-
- if (isa<PHINode>(&BB->front())) {
- std::vector<BasicBlock*>
- OldSuccPreds(pred_begin(Succ), pred_end(Succ));
-
- // Move all PHI nodes in BB to Succ if they are alive, otherwise
- // delete them.
- while (PHINode *PN = dyn_cast<PHINode>(&BB->front()))
- if (PN->use_empty() /*|| Succ->getSinglePredecessor() == 0*/) {
- // We can only move the PHI node into Succ if BB dominates Succ.
- // Since BB only has a single successor (Succ), the PHI nodes
- // will dominate Succ, unless Succ has multiple predecessors. In
- // this case, the PHIs are either dead, or have references in dead
- // blocks. In either case, we can just remove them.
- if (!PN->use_empty()) // Uses in dead block?
- PN->replaceAllUsesWith(UndefValue::get(PN->getType()));
- PN->eraseFromParent(); // Nuke instruction.
- } else {
- // The instruction is alive, so this means that Succ must have
- // *ONLY* had BB as a predecessor, and the PHI node is still valid
- // now. Simply move it into Succ, because we know that BB
- // strictly dominated Succ.
- BB->getInstList().remove(BB->begin());
- Succ->getInstList().push_front(PN);
-
- // We need to add new entries for the PHI node to account for
- // predecessors of Succ that the PHI node does not take into
- // account. At this point, since we know that BB dominated succ,
- // this means that we should any newly added incoming edges should
- // use the PHI node as the value for these edges, because they are
- // loop back edges.
- for (unsigned i = 0, e = OldSuccPreds.size(); i != e; ++i)
- if (OldSuccPreds[i] != BB)
- PN->addIncoming(PN, OldSuccPreds[i]);
- }
- }
-
- // Everything that jumped to BB now goes to Succ.
- std::string OldName = BB->getName();
- BB->replaceAllUsesWith(Succ);
- BB->eraseFromParent(); // Delete the old basic block.
-
- if (!OldName.empty() && !Succ->hasName()) // Transfer name if we can
- Succ->setName(OldName);
- return true;
- }
- }
- }
-
// If this is a returning block with only PHI nodes in it, fold the return
// instruction into any unconditional branch predecessors.
//
@@ -1105,7 +1097,17 @@
return SimplifyCFG(BB) || 1;
}
} else if (BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator())) {
- if (BI->isConditional()) {
+ if (BI->isUnconditional()) {
+ BasicBlock::iterator BBI = BB->begin(); // Skip over phi nodes...
+ while (isa<PHINode>(*BBI)) ++BBI;
+
+ BasicBlock *Succ = BI->getSuccessor(0);
+ if (BBI->isTerminator() && // Terminator is the only non-phi instruction!
+ Succ != BB) // Don't hurt infinite loops!
+ if (TryToSimplifyUncondBranchFromEmptyBlock(BB, Succ))
+ return 1;
+
+ } else { // Conditional branch
if (Value *CompVal = isValueEqualityComparison(BI)) {
// If we only have one predecessor, and if it is a branch on this value,
// see if that predecessor totally determines the outcome of this
@@ -1180,15 +1182,7 @@
// If this block ends with a branch instruction, and if there is one
// predecessor, see if the previous block ended with a branch on the same
// condition, which makes this conditional branch redundant.
- pred_iterator PI(pred_begin(BB)), PE(pred_end(BB));
- BasicBlock *OnlyPred = *PI++;
- for (; PI != PE; ++PI)// Search all predecessors, see if they are all same
- if (*PI != OnlyPred) {
- OnlyPred = 0; // There are multiple different predecessors...
- break;
- }
-
- if (OnlyPred)
+ if (BasicBlock *OnlyPred = BB->getSinglePredecessor())
if (BranchInst *PBI = dyn_cast<BranchInst>(OnlyPred->getTerminator()))
if (PBI->isConditional() &&
PBI->getCondition() == BI->getCondition() &&
More information about the llvm-commits
mailing list