[llvm-commits] [llvm] r60872 - in /llvm/trunk: include/llvm/BasicBlock.h lib/VMCore/BasicBlock.cpp
Torok Edwin
edwintorok at gmail.com
Thu Dec 11 02:36:16 PST 2008
Author: edwin
Date: Thu Dec 11 04:36:07 2008
New Revision: 60872
URL: http://llvm.org/viewvc/llvm-project?rev=60872&view=rev
Log:
introduce BasicBlock::getUniquePredecessor()
Modified:
llvm/trunk/include/llvm/BasicBlock.h
llvm/trunk/lib/VMCore/BasicBlock.cpp
Modified: llvm/trunk/include/llvm/BasicBlock.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/BasicBlock.h?rev=60872&r1=60871&r2=60872&view=diff
==============================================================================
--- llvm/trunk/include/llvm/BasicBlock.h (original)
+++ llvm/trunk/include/llvm/BasicBlock.h Thu Dec 11 04:36:07 2008
@@ -134,6 +134,16 @@
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
///
Modified: llvm/trunk/lib/VMCore/BasicBlock.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/BasicBlock.cpp?rev=60872&r1=60871&r2=60872&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/BasicBlock.cpp (original)
+++ llvm/trunk/lib/VMCore/BasicBlock.cpp Thu Dec 11 04:36:07 2008
@@ -169,6 +169,25 @@
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
More information about the llvm-commits
mailing list