1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 12:12:47 +01:00
llvm-mirror/lib/Transforms/ObjCARC
Akira Hatanaka 0cc046d72c [ObjC][ARC] Prevent moving objc_retain calls past objc_release calls
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
2021-07-05 12:16:15 -07:00
..
ARCRuntimeEntryPoints.h [ObjC][ARC] Use operand bundle 'clang.arc.attachedcall' instead of 2021-03-04 11:22:30 -08:00
BlotMapVector.h
CMakeLists.txt llvmbuildectomy - replace llvm-build by plain cmake 2020-11-13 10:35:24 +01:00
DependencyAnalysis.cpp [Transforms] Use range-based for loops (NFC) 2021-02-08 22:33:53 -08:00
DependencyAnalysis.h [ObjC][ARC] Add and use a function which finds and returns the single 2020-11-13 14:02:58 -08:00
ObjCARC.cpp Move ObjCARCUtil.h back to llvm/Analysis 2021-03-08 16:35:24 -08:00
ObjCARC.h Move ObjCARCUtil.h back to llvm/Analysis 2021-03-08 16:35:24 -08:00
ObjCARCAPElim.cpp Port -objc-arc-apelim to NPM 2020-10-26 20:01:46 -07:00
ObjCARCContract.cpp Move ObjCARCUtil.h back to llvm/Analysis 2021-03-08 16:35:24 -08:00
ObjCARCExpand.cpp Port -objc-arc-expand to NPM 2020-10-26 20:05:10 -07:00
ObjCARCOpts.cpp [ObjC][ARC] Prevent moving objc_retain calls past objc_release calls 2021-07-05 12:16:15 -07:00
ProvenanceAnalysis.cpp [NFC][AA] Prepare to convert AliasResult to class with PartialAlias offset. 2021-04-09 12:54:22 +03:00
ProvenanceAnalysis.h Remove unused parameter 2020-11-02 17:40:06 -08:00
ProvenanceAnalysisEvaluator.cpp [NFC] Reduce include files dependency and AA header cleanup (part 2). 2020-12-17 14:04:48 +03:00
PtrState.cpp Move ObjCARCUtil.h back to llvm/Analysis 2021-03-08 16:35:24 -08:00
PtrState.h [ObjC][ARC] Use operand bundle 'clang.arc.attachedcall' instead of 2021-03-04 11:22:30 -08:00