aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVladimir Prus <ghost@cs.msu.su>2006-06-08 15:46:18 +0000
committerVladimir Prus <ghost@cs.msu.su>2006-06-08 15:46:18 +0000
commitdd49dbfe44098eb53b1ac29f017e422147572bbb (patch)
tree693b5ff41aef2686e5c0c5bdf1abd66bb54ef2d1
parent7f3ac4108d3e8ad83ade659665d7346d6e1f3e5e (diff)
downloadexternal_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.h9
-rw-r--r--lib/VMCore/BasicBlock.cpp11
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();