diff options
author | Nico Weber <nicolasweber@gmx.de> | 2015-07-07 16:42:50 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2015-07-07 16:42:50 +0000 |
commit | feb13e9e09b48f1f92c8310d806b4228d8e3ea22 (patch) | |
tree | 544c0e358aa7edd0b9b484c995ca8533a346996d /llvm/lib/IR/BasicBlock.cpp | |
parent | 3bacc4df8ecae864a58fd2cb9530642a7142575d (diff) | |
download | bcm5719-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.cpp | 51 |
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; } |