mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
f6c9646a94
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
60 lines
1.8 KiB
LLVM
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 = !{}
|