summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorAkira Hatanaka <ahatanaka@apple.com>2017-04-05 03:44:09 +0000
committerAkira Hatanaka <ahatanaka@apple.com>2017-04-05 03:44:09 +0000
commit75be84f3c2a5384fb7fb12ff832192c8d6d3ee0f (patch)
tree61678642c82b5fa5ac027f86f03787cd3f01cd41 /llvm/lib/Transforms
parentc8124ee9a310b68f5619bc5f88a1aa9251126b2c (diff)
downloadbcm5719-llvm-75be84f3c2a5384fb7fb12ff832192c8d6d3ee0f.tar.gz
bcm5719-llvm-75be84f3c2a5384fb7fb12ff832192c8d6d3ee0f.zip
[ObjCArc] Do not dereference an invalidated iterator.
Fix a bug in ARC contract pass where an iterator that pointed to a deleted instruction was dereferenced. It appears that tryToContractReleaseIntoStoreStrong was incorrectly assuming that a call to objc_retain would not immediately follow a call to objc_release. rdar://problem/25276306 llvm-svn: 299507
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp1
1 files changed, 1 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp b/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp
index 23c1f5990ba..a86eaaec764 100644
--- a/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp
+++ b/llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp
@@ -394,6 +394,7 @@ void ObjCARCContract::tryToContractReleaseIntoStoreStrong(Instruction *Release,
DEBUG(llvm::dbgs() << " New Store Strong: " << *StoreStrong << "\n");
+ if (&*Iter == Retain) ++Iter;
if (&*Iter == Store) ++Iter;
Store->eraseFromParent();
Release->eraseFromParent();
OpenPOWER on IntegriCloud