summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2017-10-24 00:09:10 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2017-10-24 00:09:10 +0000
commit619b3269fdaffbcb298c4d7b33cda7109a2082d6 (patch)
treec5f75291d6ed989795f57eabeb6c9a7acb5ac999 /llvm/lib/Transforms
parent3d64d6ee54041e110c94a3bacc8ae1dc8114c9df (diff)
downloadbcm5719-llvm-619b3269fdaffbcb298c4d7b33cda7109a2082d6.tar.gz
bcm5719-llvm-619b3269fdaffbcb298c4d7b33cda7109a2082d6.zip
ObjCARC: do not increment past the end of the BB
The `BasicBlock::getFirstInsertionPt` call may return `std::end` for the BB. Dereferencing the end iterator results in an assertion failure "(!NodePtr->isKnownSentinel()), function operator*". Ensure that the returned iterator is valid before dereferencing it. If the end is returned, move one position backward to get a valid insertion point. llvm-svn: 316401
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/ObjCARC/PtrState.cpp12
1 files changed, 8 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/ObjCARC/PtrState.cpp b/llvm/lib/Transforms/ObjCARC/PtrState.cpp
index d13e941044f..c512ff584a1 100644
--- a/llvm/lib/Transforms/ObjCARC/PtrState.cpp
+++ b/llvm/lib/Transforms/ObjCARC/PtrState.cpp
@@ -250,10 +250,14 @@ void BottomUpPtrState::HandlePotentialUse(BasicBlock *BB, Instruction *Inst,
// If this is an invoke instruction, we're scanning it as part of
// one of its successor blocks, since we can't insert code after it
// in its own block, and we don't want to split critical edges.
- if (isa<InvokeInst>(Inst))
- InsertReverseInsertPt(&*BB->getFirstInsertionPt());
- else
- InsertReverseInsertPt(&*++Inst->getIterator());
+ BasicBlock::iterator InsertAfter;
+ if (isa<InvokeInst>(Inst)) {
+ const auto IP = BB->getFirstInsertionPt();
+ InsertAfter = IP == BB->end() ? std::prev(BB->end()) : IP;
+ } else {
+ InsertAfter = std::next(Inst->getIterator());
+ }
+ InsertReverseInsertPt(&*InsertAfter);
};
// Check for possible direct uses.
OpenPOWER on IntegriCloud