1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00
Pete Cooper f6c9646a94 Change the objc ARC optimizer to use the new objc.* intrinsics
We're moving ARC optimisation and ARC emission in clang away from runtime methods
and towards intrinsics.  This is the part which actually uses the intrinsics in the ARC
optimizer when both analyzing the existing calls and emitting new ones.

Differential Revision: https://reviews.llvm.org/D55348

Reviewers: ahatanak
llvm-svn: 349534
2018-12-18 20:32:49 +00:00

60 lines
1.8 KiB
LLVM

; RUN: opt -S -objc-arc < %s | FileCheck %s
; rdar://10210274
%0 = type opaque
declare i8* @llvm.objc.retain(i8*)
declare void @llvm.objc.release(i8*)
declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
; Don't delete the autorelease.
; CHECK-LABEL: define %0* @test0(
; CHECK: @llvm.objc.retain
; CHECK: .lr.ph:
; CHECK-NOT: @llvm.objc.r
; CHECK: @llvm.objc.autoreleaseReturnValue
; CHECK-NOT: @llvm.objc.
; CHECK: }
define %0* @test0(%0* %buffer) nounwind {
%1 = bitcast %0* %buffer to i8*
%2 = tail call i8* @llvm.objc.retain(i8* %1) nounwind
br i1 undef, label %.lr.ph, label %._crit_edge
.lr.ph: ; preds = %.lr.ph, %0
br i1 false, label %.lr.ph, label %._crit_edge
._crit_edge: ; preds = %.lr.ph, %0
%3 = tail call i8* @llvm.objc.retain(i8* %1) nounwind
tail call void @llvm.objc.release(i8* %1) nounwind, !clang.imprecise_release !0
%4 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %1) nounwind
ret %0* %buffer
}
; Do delete the autorelease, even with the retain in a different block.
; CHECK-LABEL: define %0* @test1(
; CHECK-NOT: @objc
; CHECK: }
define %0* @test1() nounwind {
%buffer = call %0* @foo()
%1 = bitcast %0* %buffer to i8*
%2 = tail call i8* @llvm.objc.retain(i8* %1) nounwind
br i1 undef, label %.lr.ph, label %._crit_edge
.lr.ph: ; preds = %.lr.ph, %0
br i1 false, label %.lr.ph, label %._crit_edge
._crit_edge: ; preds = %.lr.ph, %0
%3 = tail call i8* @llvm.objc.retain(i8* %1) nounwind
tail call void @llvm.objc.release(i8* %1) nounwind, !clang.imprecise_release !0
%4 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %1) nounwind
ret %0* %buffer
}
declare %0* @foo()
!0 = !{}