1; RUN: opt -objc-arc-expand -S < %s | FileCheck %s
2
3target datalayout = "e-p:64:64:64"
4
5declare i8* @llvm.objc.retain(i8*)
6declare i8* @llvm.objc.autorelease(i8*)
7declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
8declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
9declare i8* @llvm.objc.retainAutorelease(i8*)
10declare i8* @llvm.objc.retainAutoreleaseReturnValue(i8*)
11declare i8* @llvm.objc.retainBlock(i8*)
12
13declare void @use_pointer(i8*)
14
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)
18; CHECK: }
19define void @test_retain(i8* %x) nounwind {
20entry:
21  %0 = call i8* @llvm.objc.retain(i8* %x) nounwind
22  call void @use_pointer(i8* %0)
23  ret void
24}
25
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)
29; CHECK: }
30define void @test_retainAutoreleasedReturnValue(i8* %x) nounwind {
31entry:
32  %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %x) nounwind
33  call void @use_pointer(i8* %0)
34  ret void
35}
36
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)
40; CHECK: }
41define void @test_retainAutorelease(i8* %x) nounwind {
42entry:
43  %0 = call i8* @llvm.objc.retainAutorelease(i8* %x) nounwind
44  call void @use_pointer(i8* %0)
45  ret void
46}
47
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)
51; CHECK: }
52define void @test_retainAutoreleaseReturnValue(i8* %x) nounwind {
53entry:
54  %0 = call i8* @llvm.objc.retainAutoreleaseReturnValue(i8* %x) nounwind
55  call void @use_pointer(i8* %0)
56  ret void
57}
58
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)
62; CHECK: }
63define void @test_autorelease(i8* %x) nounwind {
64entry:
65  %0 = call i8* @llvm.objc.autorelease(i8* %x) nounwind
66  call void @use_pointer(i8* %0)
67  ret void
68}
69
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)
73; CHECK: }
74define void @test_autoreleaseReturnValue(i8* %x) nounwind {
75entry:
76  %0 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %x) nounwind
77  call void @use_pointer(i8* %0)
78  ret void
79}
80
81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
82; RetainBlock is not strictly forwarding. Do not touch it. ;
83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
84
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)
88; CHECK: }
89define void @test_retainBlock(i8* %x) nounwind {
90entry:
91  %0 = call i8* @llvm.objc.retainBlock(i8* %x) nounwind
92  call void @use_pointer(i8* %0)
93  ret void
94}
95