1 ; RUN: opt -objc-arc-expand -S < %s | FileCheck %s
3 target datalayout = "e-p:64:64:64"
5 declare i8* @llvm.objc.retain(i8*)
6 declare i8* @llvm.objc.autorelease(i8*)
7 declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
8 declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
9 declare i8* @llvm.objc.retainAutorelease(i8*)
10 declare i8* @llvm.objc.retainAutoreleaseReturnValue(i8*)
11 declare i8* @llvm.objc.retainBlock(i8*)
13 declare void @use_pointer(i8*)
15 ; CHECK: define void @test_retain(i8* %x) [[NUW:#[0-9]+]] {
16 ; CHECK: call i8* @llvm.objc.retain(i8* %x)
17 ; CHECK: call void @use_pointer(i8* %x)
19 define void @test_retain(i8* %x) nounwind {
21 %0 = call i8* @llvm.objc.retain(i8* %x) nounwind
22 call void @use_pointer(i8* %0)
26 ; CHECK: define void @test_retainAutoreleasedReturnValue(i8* %x) [[NUW]] {
27 ; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %x)
28 ; CHECK: call void @use_pointer(i8* %x)
30 define void @test_retainAutoreleasedReturnValue(i8* %x) nounwind {
32 %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %x) nounwind
33 call void @use_pointer(i8* %0)
37 ; CHECK: define void @test_retainAutorelease(i8* %x) [[NUW]] {
38 ; CHECK: call i8* @llvm.objc.retainAutorelease(i8* %x)
39 ; CHECK: call void @use_pointer(i8* %x)
41 define void @test_retainAutorelease(i8* %x) nounwind {
43 %0 = call i8* @llvm.objc.retainAutorelease(i8* %x) nounwind
44 call void @use_pointer(i8* %0)
48 ; CHECK: define void @test_retainAutoreleaseReturnValue(i8* %x) [[NUW]] {
49 ; CHECK: call i8* @llvm.objc.retainAutoreleaseReturnValue(i8* %x)
50 ; CHECK: call void @use_pointer(i8* %x)
52 define void @test_retainAutoreleaseReturnValue(i8* %x) nounwind {
54 %0 = call i8* @llvm.objc.retainAutoreleaseReturnValue(i8* %x) nounwind
55 call void @use_pointer(i8* %0)
59 ; CHECK: define void @test_autorelease(i8* %x) [[NUW]] {
60 ; CHECK: call i8* @llvm.objc.autorelease(i8* %x)
61 ; CHECK: call void @use_pointer(i8* %x)
63 define void @test_autorelease(i8* %x) nounwind {
65 %0 = call i8* @llvm.objc.autorelease(i8* %x) nounwind
66 call void @use_pointer(i8* %0)
70 ; CHECK: define void @test_autoreleaseReturnValue(i8* %x) [[NUW]] {
71 ; CHECK: call i8* @llvm.objc.autoreleaseReturnValue(i8* %x)
72 ; CHECK: call void @use_pointer(i8* %x)
74 define void @test_autoreleaseReturnValue(i8* %x) nounwind {
76 %0 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
77 call void @use_pointer(i8* %0)
81 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
82 ; RetainBlock is not strictly forwarding. Do not touch it. ;
83 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
85 ; CHECK: define void @test_retainBlock(i8* %x) [[NUW]] {
86 ; CHECK: call i8* @llvm.objc.retainBlock(i8* %x)
87 ; CHECK: call void @use_pointer(i8* %0)
89 define void @test_retainBlock(i8* %x) nounwind {
91 %0 = call i8* @llvm.objc.retainBlock(i8* %x) nounwind
92 call void @use_pointer(i8* %0)