[all-commits] [llvm/llvm-project] 53176c: [ObjC][ARC] Annotate calls with attributes instead...
Akira Hatanaka via All-commits
all-commits at lists.llvm.org
Mon Jan 25 12:01:51 PST 2021
Branch: refs/heads/master
Home: https://github.com/llvm/llvm-project
Commit: 53176c168061d6f26dcf3ce4fa59288b7d67255e
https://github.com/llvm/llvm-project/commit/53176c168061d6f26dcf3ce4fa59288b7d67255e
Author: Akira Hatanaka <ahatanaka at apple.com>
Date: 2021-01-25 (Mon, 25 Jan 2021)
Changed paths:
M clang/lib/CodeGen/CGObjC.cpp
A clang/test/CodeGenObjC/arc-rv-attr.m
M clang/test/CodeGenObjC/arc-unsafeclaim.m
A llvm/include/llvm/Analysis/ObjCARCRVAttr.h
M llvm/lib/IR/AutoUpgrade.cpp
M llvm/lib/IR/Instruction.cpp
M llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
M llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
M llvm/lib/Transforms/ObjCARC/ARCRuntimeEntryPoints.h
M llvm/lib/Transforms/ObjCARC/ObjCARC.cpp
M llvm/lib/Transforms/ObjCARC/ObjCARC.h
M llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp
M llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp
M llvm/lib/Transforms/ObjCARC/PtrState.cpp
M llvm/lib/Transforms/ObjCARC/PtrState.h
M llvm/lib/Transforms/Utils/InlineFunction.cpp
M llvm/test/CodeGen/AArch64/call-rv-marker.ll
M llvm/test/Transforms/DeadArgElim/deadretval.ll
A llvm/test/Transforms/Inline/inline-retainRV-call.ll
M llvm/test/Transforms/ObjCARC/contract-marker-funclet.ll
A llvm/test/Transforms/ObjCARC/contract-rv-attr.ll
M llvm/test/Transforms/ObjCARC/rv.ll
Log Message:
-----------
[ObjC][ARC] Annotate calls with attributes instead of emitting retainRV
or claimRV calls in the IR
Background:
This patch makes changes to the front-end and middle-end that are
needed to fix a longstanding problem where llvm breaks ARC's autorelease
optimization (see the link below) by separating calls from the marker
instructions or retainRV/claimRV calls. The backend changes are in
https://reviews.llvm.org/D92569.
https://clang.llvm.org/docs/AutomaticReferenceCounting.html#arc-runtime-objc-autoreleasereturnvalue
What this patch does to fix the problem:
- The front-end annotates calls with attribute "clang.arc.rv"="retain"
or "clang.arc.rv"="claim", which indicates the call is implicitly
followed by a marker instruction and a retainRV/claimRV call that
consumes the call result. This is currently done only when the target
is arm64 and the optimization level is higher than -O0.
- ARC optimizer temporarily emits retainRV/claimRV calls after the
annotated calls in the IR and removes the inserted calls after
processing the function.
- ARC contract pass emits retainRV/claimRV calls after the annotated
calls. It doesn't remove the attribute on the call since the backend
needs it to emit the marker instruction. The retainRV/claimRV calls
are emitted late in the pipeline to prevent optimization passes from
transforming the IR in a way that makes it harder for the ARC
middle-end passes to figure out the def-use relationship between the
call and the retainRV/claimRV calls (which is the cause of PR31925).
- The function inliner removes the autoreleaseRV call in the callee that
returns the result if nothing in the callee prevents it from being
paired up with the calls annotated with "clang.arc.rv"="retain/claim"
in the caller. If the call is annotated with "claim", a release call
is inserted since autoreleaseRV+claimRV is equivalent to a release. If
it cannot find an autoreleaseRV call, it tries to transfer the
attributes to a function call in the callee. This is important since
ARC optimizer can remove the autoreleaseRV call returning the callee
result, which makes it impossible to pair it up with the retainRV or
claimRV call in the caller. If that fails, it simply emits a retain
call in the IR if the call is annotated with "retain" and does nothing
if it's annotated with "claim".
- This patch teaches dead argument elimination pass not to change the
return type of a function if any of the calls to the function are
annotated with attribute "clang.arc.rv". This is necessary since the
pass can incorrectly determine nothing in the IR uses the function
return, which can happen since the front-end no longer explicitly
emits retainRV/claimRV calls in the IR, and change its return type to
'void'.
Future work:
- Use the attribute on x86-64.
- Fix the auto upgrader to convert call+retainRV/claimRV pairs into
calls annotated with the attributes.
rdar://71443534
Differential Revision: https://reviews.llvm.org/D92808
More information about the All-commits
mailing list