OSDN Git Service

New method BasicBlock::getFirstNonPHI.
authorVladimir Prus <ghost@cs.msu.su>
Thu, 8 Jun 2006 15:46:18 +0000 (15:46 +0000)
committerVladimir Prus <ghost@cs.msu.su>
Thu, 8 Jun 2006 15:46:18 +0000 (15:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28724 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/BasicBlock.h
lib/VMCore/BasicBlock.cpp

index 7fcf884..0f7b3e0 100644 (file)
@@ -91,7 +91,14 @@ public:
   ///
   TerminatorInst *getTerminator();
   const TerminatorInst *const getTerminator() const;
-
+  
+  /// Returns a pointer to the first instructon in this block that is not a 
+  /// PHINode instruction. When adding instruction to the beginning of the
+  /// basic block, they should be added before the returned value, not before
+  /// the first instruction, which might be PHI.
+  /// Returns 0 is there's no non-PHI instruction.
+  Instruction* getFirstNonPHI();
+  
   /// removeFromParent - This method unlinks 'this' from the containing
   /// function, but does not delete it.
   ///
index ab7798c..c93f558 100644 (file)
@@ -121,6 +121,17 @@ const TerminatorInst *const BasicBlock::getTerminator() const {
   return dyn_cast<TerminatorInst>(&InstList.back());
 }
 
+Instruction* BasicBlock::getFirstNonPHI()
+{
+    BasicBlock::iterator i = begin(), e = end();
+    // All valid basic blocks should have a terminator,
+    // which is not a PHINode. If we have invalid basic
+    // block we'll get assert when dereferencing past-the-end
+    // iterator.
+    while (isa<PHINode>(i)) ++i;
+    return &*i;
+}
+
 void BasicBlock::dropAllReferences() {
   for(iterator I = begin(), E = end(); I != E; ++I)
     I->dropAllReferences();