diff options
| author | Akira Hatanaka <ahatanaka@apple.com> | 2017-04-05 03:44:09 +0000 |
|---|---|---|
| committer | Akira Hatanaka <ahatanaka@apple.com> | 2017-04-05 03:44:09 +0000 |
| commit | 75be84f3c2a5384fb7fb12ff832192c8d6d3ee0f (patch) | |
| tree | 61678642c82b5fa5ac027f86f03787cd3f01cd41 /llvm/lib/Transforms | |
| parent | c8124ee9a310b68f5619bc5f88a1aa9251126b2c (diff) | |
| download | bcm5719-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.cpp | 1 |
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(); |

