[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