xref: /llvm-project/llvm/test/Transforms/ObjCARC/expand.ll (revision 01e4f41b43b57dee751146fde9992c660bd7c714)
1; RUN: opt -passes=objc-arc-expand -S < %s | FileCheck %s
2
3target datalayout = "e-p:64:64:64"
4
5declare ptr @llvm.objc.retain(ptr)
6declare ptr @llvm.objc.autorelease(ptr)
7declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)
8declare ptr @llvm.objc.autoreleaseReturnValue(ptr)
9declare ptr @llvm.objc.retainAutorelease(ptr)
10declare ptr @llvm.objc.retainAutoreleaseReturnValue(ptr)
11declare ptr @llvm.objc.retainBlock(ptr)
12
13declare void @use_pointer(ptr)
14
15; CHECK: define void @test_retain(ptr %x) [[NUW:#[0-9]+]] {
16; CHECK: call ptr @llvm.objc.retain(ptr %x)
17; CHECK: call void @use_pointer(ptr %x)
18; CHECK: }
19define void @test_retain(ptr %x) nounwind {
20entry:
21  %0 = call ptr @llvm.objc.retain(ptr %x) nounwind
22  call void @use_pointer(ptr %0)
23  ret void
24}
25
26; CHECK: define void @test_retainAutoreleasedReturnValue(ptr %x) [[NUW]] {
27; CHECK: call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %x)
28; CHECK: call void @use_pointer(ptr %x)
29; CHECK: }
30define void @test_retainAutoreleasedReturnValue(ptr %x) nounwind {
31entry:
32  %0 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %x) nounwind
33  call void @use_pointer(ptr %0)
34  ret void
35}
36
37; CHECK: define void @test_retainAutorelease(ptr %x) [[NUW]] {
38; CHECK: call ptr @llvm.objc.retainAutorelease(ptr %x)
39; CHECK: call void @use_pointer(ptr %x)
40; CHECK: }
41define void @test_retainAutorelease(ptr %x) nounwind {
42entry:
43  %0 = call ptr @llvm.objc.retainAutorelease(ptr %x) nounwind
44  call void @use_pointer(ptr %0)
45  ret void
46}
47
48; CHECK: define void @test_retainAutoreleaseReturnValue(ptr %x) [[NUW]] {
49; CHECK: call ptr @llvm.objc.retainAutoreleaseReturnValue(ptr %x)
50; CHECK: call void @use_pointer(ptr %x)
51; CHECK: }
52define void @test_retainAutoreleaseReturnValue(ptr %x) nounwind {
53entry:
54  %0 = call ptr @llvm.objc.retainAutoreleaseReturnValue(ptr %x) nounwind
55  call void @use_pointer(ptr %0)
56  ret void
57}
58
59; CHECK: define void @test_autorelease(ptr %x) [[NUW]] {
60; CHECK: call ptr @llvm.objc.autorelease(ptr %x)
61; CHECK: call void @use_pointer(ptr %x)
62; CHECK: }
63define void @test_autorelease(ptr %x) nounwind {
64entry:
65  %0 = call ptr @llvm.objc.autorelease(ptr %x) nounwind
66  call void @use_pointer(ptr %0)
67  ret void
68}
69
70; CHECK: define void @test_autoreleaseReturnValue(ptr %x) [[NUW]] {
71; CHECK: call ptr @llvm.objc.autoreleaseReturnValue(ptr %x)
72; CHECK: call void @use_pointer(ptr %x)
73; CHECK: }
74define void @test_autoreleaseReturnValue(ptr %x) nounwind {
75entry:
76  %0 = call ptr @llvm.objc.autoreleaseReturnValue(ptr %x) nounwind
77  call void @use_pointer(ptr %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(ptr %x) [[NUW]] {
86; CHECK: call ptr @llvm.objc.retainBlock(ptr %x)
87; CHECK: call void @use_pointer(ptr %0)
88; CHECK: }
89define void @test_retainBlock(ptr %x) nounwind {
90entry:
91  %0 = call ptr @llvm.objc.retainBlock(ptr %x) nounwind
92  call void @use_pointer(ptr %0)
93  ret void
94}
95