mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
0cc046d72c
that release the retained object This patch fixes what looks like a longstanding bug in ARC optimizer where it reverses the order of objc_retain calls and objc_release calls that retain and release the same object. The code in ARC optimizer that is responsible for code motion takes the following steps: 1. Traverse the CFG bottom-up and determine how far up objc_release calls can be moved. Determine the insertion points for the objc_release calls, but don't actually move them. 2. Traverse the CFG top-down and determine how far down objc_retain calls can be moved. Determine the insertion points for the objc_retain calls, but don't actually move them. 3. Try to move the objc_retain and objc_release calls if they can't be removed. The problem is that the insertion points for the objc_retain calls are determined in step 2 without taking into consideration the insertion points for objc_release calls determined in step 1, so the order of an objc_retain call and an objc_release call can be reversed, which is incorrect, even though each step is correct in isolation. To fix this bug, this patch teaches the top-down traversal step to take into consideration the insertion points for objc_release calls determined in the bottom-up traversal step. Code motion for an objc_retain call is disabled if there is a possibility that it can be moved past an objc_release call that releases the retained object. rdar://79292791 Differential Revision: https://reviews.llvm.org/D104953 |
||
---|---|---|
.. | ||
ARCRuntimeEntryPoints.h | ||
BlotMapVector.h | ||
CMakeLists.txt | ||
DependencyAnalysis.cpp | ||
DependencyAnalysis.h | ||
ObjCARC.cpp | ||
ObjCARC.h | ||
ObjCARCAPElim.cpp | ||
ObjCARCContract.cpp | ||
ObjCARCExpand.cpp | ||
ObjCARCOpts.cpp | ||
ProvenanceAnalysis.cpp | ||
ProvenanceAnalysis.h | ||
ProvenanceAnalysisEvaluator.cpp | ||
PtrState.cpp | ||
PtrState.h |