Mercurial > hg > CbC > CbC_llvm
comparison clang/test/CodeGenObjC/arc-rv-attr.m @ 221:79ff65ed7e25
LLVM12 Original
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 15 Jun 2021 19:15:29 +0900 |
parents | |
children | c4bab56944e8 |
comparison
equal
deleted
inserted
replaced
220:42394fc6a535 | 221:79ff65ed7e25 |
---|---|
1 // RUN: %clang_cc1 -triple arm64-apple-ios9 -fobjc-runtime=ios-9.0 -fobjc-arc -O -disable-llvm-passes -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK | |
2 | |
3 @class A; | |
4 | |
5 A *makeA(void); | |
6 | |
7 void test_assign() { | |
8 __unsafe_unretained id x; | |
9 x = makeA(); | |
10 } | |
11 // CHECK-LABEL: define{{.*}} void @test_assign() | |
12 // CHECK: [[X:%.*]] = alloca i8* | |
13 // CHECK: [[T0:%.*]] = call [[A:.*]]* @makeA() [ "clang.arc.attachedcall"(i64 1) ] | |
14 // CHECK-NEXT: call void (...) @llvm.objc.clang.arc.noop.use({{.*}} [[T0]]) | |
15 // CHECK-NEXT: [[T1:%.*]] = bitcast [[A]]* [[T0]] to i8* | |
16 // CHECK-NEXT: store i8* [[T1]], i8** [[X]] | |
17 // CHECK-NEXT: bitcast | |
18 // CHECK-NEXT: lifetime.end | |
19 // CHECK-NEXT: ret void | |
20 | |
21 void test_assign_assign() { | |
22 __unsafe_unretained id x, y; | |
23 x = y = makeA(); | |
24 } | |
25 // CHECK-LABEL: define{{.*}} void @test_assign_assign() | |
26 // CHECK: [[X:%.*]] = alloca i8* | |
27 // CHECK: [[Y:%.*]] = alloca i8* | |
28 // CHECK: [[T0:%.*]] = call [[A]]* @makeA() [ "clang.arc.attachedcall"(i64 1) ] | |
29 // CHECK-NEXT: call void (...) @llvm.objc.clang.arc.noop.use({{.*}} [[T0]]) | |
30 // CHECK-NEXT: [[T1:%.*]] = bitcast [[A]]* [[T0]] to i8* | |
31 // CHECK-NEXT: store i8* [[T1]], i8** [[Y]] | |
32 // CHECK-NEXT: store i8* [[T1]], i8** [[X]] | |
33 // CHECK-NEXT: bitcast | |
34 // CHECK-NEXT: lifetime.end | |
35 // CHECK-NEXT: bitcast | |
36 // CHECK-NEXT: lifetime.end | |
37 // CHECK-NEXT: ret void | |
38 | |
39 void test_strong_assign_assign() { | |
40 __strong id x; | |
41 __unsafe_unretained id y; | |
42 x = y = makeA(); | |
43 } | |
44 // CHECK-LABEL: define{{.*}} void @test_strong_assign_assign() | |
45 // CHECK: [[X:%.*]] = alloca i8* | |
46 // CHECK: [[Y:%.*]] = alloca i8* | |
47 // CHECK: [[T0:%.*]] = call [[A]]* @makeA() [ "clang.arc.attachedcall"(i64 0) ] | |
48 // CHECK-NEXT: call void (...) @llvm.objc.clang.arc.noop.use({{.*}} [[T0]]) | |
49 // CHECK-NEXT: [[T1:%.*]] = bitcast [[A]]* [[T0]] to i8* | |
50 // CHECK-NEXT: store i8* [[T1]], i8** [[Y]] | |
51 // CHECK-NEXT: [[OLD:%.*]] = load i8*, i8** [[X]] | |
52 // CHECK-NEXT: store i8* [[T1]], i8** [[X]] | |
53 // CHECK-NEXT: call void @llvm.objc.release(i8* [[OLD]] | |
54 // CHECK-NEXT: bitcast | |
55 // CHECK-NEXT: lifetime.end | |
56 // CHECK-NEXT: [[T0:%.*]] = load i8*, i8** [[X]] | |
57 // CHECK-NEXT: call void @llvm.objc.release(i8* [[T0]]) | |
58 // CHECK-NEXT: bitcast | |
59 // CHECK-NEXT: lifetime.end | |
60 // CHECK-NEXT: ret void | |
61 | |
62 void test_assign_strong_assign() { | |
63 __unsafe_unretained id x; | |
64 __strong id y; | |
65 x = y = makeA(); | |
66 } | |
67 // CHECK-LABEL: define{{.*}} void @test_assign_strong_assign() | |
68 // CHECK: [[X:%.*]] = alloca i8* | |
69 // CHECK: [[Y:%.*]] = alloca i8* | |
70 // CHECK: [[T0:%.*]] = call [[A]]* @makeA() [ "clang.arc.attachedcall"(i64 0) ] | |
71 // CHECK-NEXT: call void (...) @llvm.objc.clang.arc.noop.use({{.*}} [[T0]]) | |
72 // CHECK-NEXT: [[T1:%.*]] = bitcast [[A]]* [[T0]] to i8* | |
73 // CHECK-NEXT: [[OLD:%.*]] = load i8*, i8** [[Y]] | |
74 // CHECK-NEXT: store i8* [[T1]], i8** [[Y]] | |
75 // CHECK-NEXT: call void @llvm.objc.release(i8* [[OLD]] | |
76 // CHECK-NEXT: store i8* [[T1]], i8** [[X]] | |
77 // CHECK-NEXT: [[T0:%.*]] = load i8*, i8** [[Y]] | |
78 // CHECK-NEXT: call void @llvm.objc.release(i8* [[T0]]) | |
79 // CHECK-NEXT: bitcast | |
80 // CHECK-NEXT: lifetime.end | |
81 // CHECK-NEXT: bitcast | |
82 // CHECK-NEXT: lifetime.end | |
83 // CHECK-NEXT: ret void | |
84 | |
85 void test_init() { | |
86 __unsafe_unretained id x = makeA(); | |
87 } | |
88 // CHECK-LABEL: define{{.*}} void @test_init() | |
89 // CHECK: [[X:%.*]] = alloca i8* | |
90 // CHECK: [[T0:%.*]] = call [[A]]* @makeA() [ "clang.arc.attachedcall"(i64 1) ] | |
91 // CHECK-NEXT: call void (...) @llvm.objc.clang.arc.noop.use({{.*}} [[T0]]) | |
92 // CHECK-NEXT: [[T1:%.*]] = bitcast [[A]]* [[T0]] to i8* | |
93 // CHECK-NEXT: store i8* [[T1]], i8** [[X]] | |
94 // CHECK-NEXT: bitcast | |
95 // CHECK-NEXT: lifetime.end | |
96 // CHECK-NEXT: ret void | |
97 | |
98 void test_init_assignment() { | |
99 __unsafe_unretained id x; | |
100 __unsafe_unretained id y = x = makeA(); | |
101 } | |
102 // CHECK-LABEL: define{{.*}} void @test_init_assignment() | |
103 // CHECK: [[X:%.*]] = alloca i8* | |
104 // CHECK: [[Y:%.*]] = alloca i8* | |
105 // CHECK: [[T0:%.*]] = call [[A]]* @makeA() [ "clang.arc.attachedcall"(i64 1) ] | |
106 // CHECK-NEXT: call void (...) @llvm.objc.clang.arc.noop.use({{.*}} [[T0]]) | |
107 // CHECK-NEXT: [[T1:%.*]] = bitcast [[A]]* [[T0]] to i8* | |
108 // CHECK-NEXT: store i8* [[T1]], i8** [[X]] | |
109 // CHECK-NEXT: store i8* [[T1]], i8** [[Y]] | |
110 // CHECK-NEXT: bitcast | |
111 // CHECK-NEXT: lifetime.end | |
112 // CHECK-NEXT: bitcast | |
113 // CHECK-NEXT: lifetime.end | |
114 // CHECK-NEXT: ret void | |
115 | |
116 void test_strong_init_assignment() { | |
117 __unsafe_unretained id x; | |
118 __strong id y = x = makeA(); | |
119 } | |
120 // CHECK-LABEL: define{{.*}} void @test_strong_init_assignment() | |
121 // CHECK: [[X:%.*]] = alloca i8* | |
122 // CHECK: [[Y:%.*]] = alloca i8* | |
123 // CHECK: [[T0:%.*]] = call [[A]]* @makeA() [ "clang.arc.attachedcall"(i64 0) ] | |
124 // CHECK-NEXT: call void (...) @llvm.objc.clang.arc.noop.use({{.*}} [[T0]]) | |
125 // CHECK-NEXT: [[T1:%.*]] = bitcast [[A]]* [[T0]] to i8* | |
126 // CHECK-NEXT: store i8* [[T1]], i8** [[X]] | |
127 // CHECK-NEXT: store i8* [[T1]], i8** [[Y]] | |
128 // CHECK-NEXT: [[T0:%.*]] = load i8*, i8** [[Y]] | |
129 // CHECK-NEXT: call void @llvm.objc.release(i8* [[T0]]) | |
130 // CHECK-NEXT: bitcast | |
131 // CHECK-NEXT: lifetime.end | |
132 // CHECK-NEXT: bitcast | |
133 // CHECK-NEXT: lifetime.end | |
134 // CHECK-NEXT: ret void | |
135 | |
136 void test_init_strong_assignment() { | |
137 __strong id x; | |
138 __unsafe_unretained id y = x = makeA(); | |
139 } | |
140 // CHECK-LABEL: define{{.*}} void @test_init_strong_assignment() | |
141 // CHECK: [[X:%.*]] = alloca i8* | |
142 // CHECK: [[Y:%.*]] = alloca i8* | |
143 // CHECK: [[T0:%.*]] = call [[A]]* @makeA() [ "clang.arc.attachedcall"(i64 0) ] | |
144 // CHECK-NEXT: call void (...) @llvm.objc.clang.arc.noop.use({{.*}} [[T0]]) | |
145 // CHECK-NEXT: [[T1:%.*]] = bitcast [[A]]* [[T0]] to i8* | |
146 // CHECK-NEXT: [[OLD:%.*]] = load i8*, i8** [[X]] | |
147 // CHECK-NEXT: store i8* [[T1]], i8** [[X]] | |
148 // CHECK-NEXT: call void @llvm.objc.release(i8* [[OLD]]) | |
149 // CHECK-NEXT: store i8* [[T1]], i8** [[Y]] | |
150 // CHECK-NEXT: bitcast | |
151 // CHECK-NEXT: lifetime.end | |
152 // CHECK-NEXT: [[T0:%.*]] = load i8*, i8** [[X]] | |
153 // CHECK-NEXT: call void @llvm.objc.release(i8* [[T0]]) | |
154 // CHECK-NEXT: bitcast | |
155 // CHECK-NEXT: lifetime.end | |
156 // CHECK-NEXT: ret void | |
157 | |
158 void test_ignored() { | |
159 makeA(); | |
160 } | |
161 // CHECK-LABEL: define{{.*}} void @test_ignored() | |
162 // CHECK: [[T0:%.*]] = call [[A]]* @makeA() [ "clang.arc.attachedcall"(i64 1) ] | |
163 // CHECK-NEXT: call void (...) @llvm.objc.clang.arc.noop.use({{.*}} [[T0]]) | |
164 // CHECK-NEXT: ret void | |
165 | |
166 void test_cast_to_void() { | |
167 (void) makeA(); | |
168 } | |
169 // CHECK-LABEL: define{{.*}} void @test_cast_to_void() | |
170 // CHECK: [[T0:%.*]] = call [[A]]* @makeA() [ "clang.arc.attachedcall"(i64 1) ] | |
171 // CHECK-NEXT: call void (...) @llvm.objc.clang.arc.noop.use({{.*}} [[T0]]) | |
172 // CHECK-NEXT: ret void | |
173 | |
174 // This is always at the end of the module. | |
175 | |
176 // CHECK-OPTIMIZED: !llvm.module.flags = !{!0, | |
177 // CHECK-OPTIMIZED: !0 = !{i32 1, !"clang.arc.retainAutoreleasedReturnValueMarker", !"mov{{.*}}marker for objc_retainAutoreleaseReturnValue"} |