diff options
author | Vladimir Prus <ghost@cs.msu.su> | 2006-06-08 15:46:18 +0000 |
---|---|---|
committer | Vladimir Prus <ghost@cs.msu.su> | 2006-06-08 15:46:18 +0000 |
commit | dd49dbfe44098eb53b1ac29f017e422147572bbb (patch) | |
tree | 693b5ff41aef2686e5c0c5bdf1abd66bb54ef2d1 | |
parent | 7f3ac4108d3e8ad83ade659665d7346d6e1f3e5e (diff) | |
download | external_llvm-dd49dbfe44098eb53b1ac29f017e422147572bbb.zip external_llvm-dd49dbfe44098eb53b1ac29f017e422147572bbb.tar.gz external_llvm-dd49dbfe44098eb53b1ac29f017e422147572bbb.tar.bz2 |
New method BasicBlock::getFirstNonPHI.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28724 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/BasicBlock.h | 9 | ||||
-rw-r--r-- | lib/VMCore/BasicBlock.cpp | 11 |
2 files changed, 19 insertions, 1 deletions
diff --git a/include/llvm/BasicBlock.h b/include/llvm/BasicBlock.h index 7fcf884..0f7b3e0 100644 --- a/include/llvm/BasicBlock.h +++ b/include/llvm/BasicBlock.h @@ -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. /// diff --git a/lib/VMCore/BasicBlock.cpp b/lib/VMCore/BasicBlock.cpp index ab7798c..c93f558 100644 --- a/lib/VMCore/BasicBlock.cpp +++ b/lib/VMCore/BasicBlock.cpp @@ -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(); |