diff options
| author | Saleem Abdulrasool <compnerd@compnerd.org> | 2017-10-24 00:09:10 +0000 | 
|---|---|---|
| committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2017-10-24 00:09:10 +0000 | 
| commit | 619b3269fdaffbcb298c4d7b33cda7109a2082d6 (patch) | |
| tree | c5f75291d6ed989795f57eabeb6c9a7acb5ac999 /llvm/lib/Transforms | |
| parent | 3d64d6ee54041e110c94a3bacc8ae1dc8114c9df (diff) | |
| download | bcm5719-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.cpp | 12 | 
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. | 

