mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
c2ea8c4219
This caused miscompiles of Chromium tests for iOS due clobbering of live registers. See discussion on the code review for details. > Background: > > This fixes 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 adds operand bundle "clang.arc.attachedcall" to calls, > which indicates the call is implicitly followed by a marker > instruction and an implicit retainRV/claimRV call that consumes the > call result. In addition, it emits a call to > @llvm.objc.clang.arc.noop.use, which consumes the call result, to > prevent the middle-end passes from changing the return type of the > called function. 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 calls > with the operand bundle in the IR and removes the inserted calls after > processing the function. > > - ARC contract pass emits retainRV/claimRV calls after the call with the > operand bundle. It doesn't remove the operand bundle on the call since > the backend needs it to emit the marker instruction. The retainRV and > 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 an autoreleaseRV call in the callee if > nothing in the callee prevents it from being paired up with the > retainRV/claimRV call in the caller. It then inserts a release call if > claimRV is attached to the call since autoreleaseRV+claimRV is > equivalent to a release. If it cannot find an autoreleaseRV call, it > tries to transfer the operand bundle to a function call in the callee. > This is important since the ARC optimizer can remove the autoreleaseRV > returning the callee result, which makes it impossible to pair it up > with the retainRV/claimRV call in the caller. If that fails, it simply > emits a retain call in the IR if retainRV is attached to the call and > does nothing if claimRV is attached to it. > > - SCCP refrains from replacing the return value of a call with a > constant value if the call has the operand bundle. This ensures the > call always has at least one user (the call to > @llvm.objc.clang.arc.noop.use). > > - This patch also fixes a bug in replaceUsesOfNonProtoConstant where > multiple operand bundles of the same kind were being added to a call. > > Future work: > > - Use the operand bundle on x86-64. > > - Fix the auto upgrader to convert call+retainRV/claimRV pairs into > calls with the operand bundles. > > rdar://71443534 > > Differential Revision: https://reviews.llvm.org/D92808 This reverts commit ed4718eccb12bd42214ca4fb17d196d49561c0c7. |
||
---|---|---|
.. | ||
2006-06-27-struct-ret.ll | ||
2007-02-07-FuncRename.ll | ||
2007-10-18-VarargsReturn.ll | ||
2007-12-20-ParamAttrs.ll | ||
2008-01-16-VarargsParamAttrs.ll | ||
2008-06-23-DeadAfterLive.ll | ||
2009-03-17-MRE-Invoke.ll | ||
2010-04-30-DbgInfo.ll | ||
2013-05-17-VarargsAndBlockAddress.ll | ||
aggregates.ll | ||
allocsize.ll | ||
basictest.ll | ||
byref.ll | ||
call_profile.ll | ||
canon.ll | ||
comdat.ll | ||
dbginfo-preserve-dbgloc.ll | ||
dbginfo-update-dbgval-local.ll | ||
dbginfo-update-dbgval.ll | ||
dbginfo.ll | ||
dead_vaargs.ll | ||
deadexternal.ll | ||
deadretval2.ll | ||
deadretval.ll | ||
func_metadata.ll | ||
funclet.ll | ||
keepalive.ll | ||
linkage.ll | ||
multdeadretval.ll | ||
musttail-caller.ll | ||
naked_functions.ll | ||
nonzero-address-spaces.ll | ||
operandbundle.ll | ||
preserve-used-ret.ll | ||
returned.ll | ||
variadic_safety.ll |