[all-commits] [llvm/llvm-project] 28fe9a: [ObjC][ARC] Prevent moving objc_retain calls past ...
Akira Hatanaka via All-commits
all-commits at lists.llvm.org
Mon Jul 5 12:17:04 PDT 2021
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: 28fe9afdba83202ba9e1c1fe4c169ba14a9154f4
https://github.com/llvm/llvm-project/commit/28fe9afdba83202ba9e1c1fe4c169ba14a9154f4
Author: Akira Hatanaka <ahatanaka at apple.com>
Date: 2021-07-05 (Mon, 05 Jul 2021)
Changed paths:
M llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp
M llvm/test/Transforms/ObjCARC/code-motion.ll
Log Message:
-----------
[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
More information about the All-commits
mailing list