summaryrefslogtreecommitdiffstats
path: root/llvm/lib/IR/BasicBlock.cpp
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2015-07-07 16:42:50 +0000
committerNico Weber <nicolasweber@gmx.de>2015-07-07 16:42:50 +0000
commitfeb13e9e09b48f1f92c8310d806b4228d8e3ea22 (patch)
tree544c0e358aa7edd0b9b484c995ca8533a346996d /llvm/lib/IR/BasicBlock.cpp
parent3bacc4df8ecae864a58fd2cb9530642a7142575d (diff)
downloadbcm5719-llvm-feb13e9e09b48f1f92c8310d806b4228d8e3ea22.tar.gz
bcm5719-llvm-feb13e9e09b48f1f92c8310d806b4228d8e3ea22.zip
Revert r241570, it caused PR24053
llvm-svn: 241602
Diffstat (limited to 'llvm/lib/IR/BasicBlock.cpp')
-rw-r--r--llvm/lib/IR/BasicBlock.cpp51
1 files changed, 29 insertions, 22 deletions
diff --git a/llvm/lib/IR/BasicBlock.cpp b/llvm/lib/IR/BasicBlock.cpp
index 0a0449434a7..77cb10d5b6b 100644
--- a/llvm/lib/IR/BasicBlock.cpp
+++ b/llvm/lib/IR/BasicBlock.cpp
@@ -163,40 +163,47 @@ CallInst *BasicBlock::getTerminatingMustTailCall() {
}
Instruction* BasicBlock::getFirstNonPHI() {
- for (Instruction &I : *this)
- if (!isa<PHINode>(I))
- return &I;
- return nullptr;
+ BasicBlock::iterator i = begin();
+ // All valid basic blocks should have a terminator,
+ // which is not a PHINode. If we have an invalid basic
+ // block we'll get an assertion failure when dereferencing
+ // a past-the-end iterator.
+ while (isa<PHINode>(i)) ++i;
+ return &*i;
}
Instruction* BasicBlock::getFirstNonPHIOrDbg() {
- for (Instruction &I : *this)
- if (!isa<PHINode>(I) && !isa<DbgInfoIntrinsic>(I))
- return &I;
- return nullptr;
+ BasicBlock::iterator i = begin();
+ // All valid basic blocks should have a terminator,
+ // which is not a PHINode. If we have an invalid basic
+ // block we'll get an assertion failure when dereferencing
+ // a past-the-end iterator.
+ while (isa<PHINode>(i) || isa<DbgInfoIntrinsic>(i)) ++i;
+ return &*i;
}
Instruction* BasicBlock::getFirstNonPHIOrDbgOrLifetime() {
- for (Instruction &I : *this) {
- if (isa<PHINode>(I) || isa<DbgInfoIntrinsic>(I))
+ // All valid basic blocks should have a terminator,
+ // which is not a PHINode. If we have an invalid basic
+ // block we'll get an assertion failure when dereferencing
+ // a past-the-end iterator.
+ BasicBlock::iterator i = begin();
+ for (;; ++i) {
+ if (isa<PHINode>(i) || isa<DbgInfoIntrinsic>(i))
continue;
- if (auto *II = dyn_cast<IntrinsicInst>(&I))
- if (II->getIntrinsicID() == Intrinsic::lifetime_start ||
- II->getIntrinsicID() == Intrinsic::lifetime_end)
- continue;
-
- return &I;
+ const IntrinsicInst *II = dyn_cast<IntrinsicInst>(i);
+ if (!II)
+ break;
+ if (II->getIntrinsicID() != Intrinsic::lifetime_start &&
+ II->getIntrinsicID() != Intrinsic::lifetime_end)
+ break;
}
- return nullptr;
+ return &*i;
}
BasicBlock::iterator BasicBlock::getFirstInsertionPt() {
- Instruction *FirstNonPHI = getFirstNonPHI();
- if (!FirstNonPHI)
- return end();
-
- iterator InsertPt = FirstNonPHI;
+ iterator InsertPt = getFirstNonPHI();
if (isa<LandingPadInst>(InsertPt)) ++InsertPt;
return InsertPt;
}
OpenPOWER on IntegriCloud