introduce BasicBlock::getUniquePredecessor()

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60872 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Torok Edwin 2008-12-11 10:36:07 +00:00
parent e1d44b59ee
commit 87f1e7796d
2 changed files with 29 additions and 0 deletions

View File

@ -134,6 +134,16 @@ public:
return const_cast<BasicBlock*>(this)->getSinglePredecessor();
}
/// getUniquePredecessor - If this basic block has a unique predecessor block,
/// return the block, otherwise return a null pointer.
/// Note that unique predecessor doesn't mean single edge, there can be
/// multiple edges from the unique predecessor to this block (for example in
/// case of a switch statement with multiple cases having same destination).
BasicBlock *getUniquePredecessor();
const BasicBlock *getUniquePredecessor() const {
return const_cast<BasicBlock*>(this)->getUniquePredecessor();
}
//===--------------------------------------------------------------------===//
/// Instruction iterator methods
///

View File

@ -169,6 +169,25 @@ BasicBlock *BasicBlock::getSinglePredecessor() {
return (PI == E) ? ThePred : 0 /*multiple preds*/;
}
/// getUniquePredecessor - If this basic block has a unique predecessor block,
/// return the block, otherwise return a null pointer.
/// Note that unique predecessor doesn't mean single edge, there can be
/// multiple edges from the unique predecessor to this block (for example in
/// case of a switch statement with multiple cases having same destination).
BasicBlock *BasicBlock::getUniquePredecessor() {
pred_iterator PI = pred_begin(this), E = pred_end(this);
if (PI == E) return 0; // No preds.
BasicBlock *PredBB = *PI;
++PI;
for (;PI != E; ++PI) {
if (*PI != PredBB)
return 0;
// same predecessor appears multiple times in predecessor list,
// this is ok
}
return PredBB;
}
/// removePredecessor - This method is used to notify a BasicBlock that the
/// specified Predecessor of the block is no longer able to reach it. This is
/// actually not used to update the Predecessor list, but is actually used to