annotate llvm/test/Transforms/ObjCARC/cfg-hazards.ll @ 201:a96fbbdf2d0f

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 04 Jun 2021 21:07:06 +0900
parents 0572611fdcc8
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 ; RUN: opt -S -objc-arc < %s | FileCheck %s
anatofuz
parents:
diff changeset
2 ; rdar://9503416
anatofuz
parents:
diff changeset
3
anatofuz
parents:
diff changeset
4 ; Detect loop boundaries and don't move retains and releases
anatofuz
parents:
diff changeset
5 ; across them.
anatofuz
parents:
diff changeset
6
anatofuz
parents:
diff changeset
7 declare void @use_pointer(i8*)
anatofuz
parents:
diff changeset
8 declare i8* @llvm.objc.retain(i8*)
anatofuz
parents:
diff changeset
9 declare void @llvm.objc.release(i8*)
anatofuz
parents:
diff changeset
10 declare void @callee()
anatofuz
parents:
diff changeset
11 declare void @block_callee(void ()*)
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 ; CHECK-LABEL: define void @test0(
anatofuz
parents:
diff changeset
14 ; CHECK: call i8* @llvm.objc.retain
anatofuz
parents:
diff changeset
15 ; CHECK: for.body:
anatofuz
parents:
diff changeset
16 ; CHECK-NOT: @objc
anatofuz
parents:
diff changeset
17 ; CHECK: for.end:
anatofuz
parents:
diff changeset
18 ; CHECK: call void @llvm.objc.release
anatofuz
parents:
diff changeset
19 ; CHECK: }
anatofuz
parents:
diff changeset
20 define void @test0(i8* %digits) {
anatofuz
parents:
diff changeset
21 entry:
anatofuz
parents:
diff changeset
22 %tmp1 = call i8* @llvm.objc.retain(i8* %digits) nounwind
anatofuz
parents:
diff changeset
23 call void @use_pointer(i8* %digits)
anatofuz
parents:
diff changeset
24 br label %for.body
anatofuz
parents:
diff changeset
25
anatofuz
parents:
diff changeset
26 for.body: ; preds = %for.body, %entry
anatofuz
parents:
diff changeset
27 %upcDigitIndex.01 = phi i64 [ 2, %entry ], [ %inc, %for.body ]
anatofuz
parents:
diff changeset
28 call void @use_pointer(i8* %digits)
anatofuz
parents:
diff changeset
29 %inc = add i64 %upcDigitIndex.01, 1
anatofuz
parents:
diff changeset
30 %cmp = icmp ult i64 %inc, 12
anatofuz
parents:
diff changeset
31 br i1 %cmp, label %for.body, label %for.end
anatofuz
parents:
diff changeset
32
anatofuz
parents:
diff changeset
33 for.end: ; preds = %for.body
anatofuz
parents:
diff changeset
34 call void @llvm.objc.release(i8* %digits) nounwind, !clang.imprecise_release !0
anatofuz
parents:
diff changeset
35 ret void
anatofuz
parents:
diff changeset
36 }
anatofuz
parents:
diff changeset
37
anatofuz
parents:
diff changeset
38 ; CHECK-LABEL: define void @test1(
anatofuz
parents:
diff changeset
39 ; CHECK: call i8* @llvm.objc.retain
anatofuz
parents:
diff changeset
40 ; CHECK: for.body:
anatofuz
parents:
diff changeset
41 ; CHECK-NOT: @objc
anatofuz
parents:
diff changeset
42 ; CHECK: for.end:
anatofuz
parents:
diff changeset
43 ; CHECK: void @llvm.objc.release
anatofuz
parents:
diff changeset
44 ; CHECK: }
anatofuz
parents:
diff changeset
45 define void @test1(i8* %digits) {
anatofuz
parents:
diff changeset
46 entry:
anatofuz
parents:
diff changeset
47 %tmp1 = call i8* @llvm.objc.retain(i8* %digits) nounwind
anatofuz
parents:
diff changeset
48 br label %for.body
anatofuz
parents:
diff changeset
49
anatofuz
parents:
diff changeset
50 for.body: ; preds = %for.body, %entry
anatofuz
parents:
diff changeset
51 %upcDigitIndex.01 = phi i64 [ 2, %entry ], [ %inc, %for.body ]
anatofuz
parents:
diff changeset
52 call void @use_pointer(i8* %digits)
anatofuz
parents:
diff changeset
53 call void @use_pointer(i8* %digits)
anatofuz
parents:
diff changeset
54 %inc = add i64 %upcDigitIndex.01, 1
anatofuz
parents:
diff changeset
55 %cmp = icmp ult i64 %inc, 12
anatofuz
parents:
diff changeset
56 br i1 %cmp, label %for.body, label %for.end
anatofuz
parents:
diff changeset
57
anatofuz
parents:
diff changeset
58 for.end: ; preds = %for.body
anatofuz
parents:
diff changeset
59 call void @llvm.objc.release(i8* %digits) nounwind, !clang.imprecise_release !0
anatofuz
parents:
diff changeset
60 ret void
anatofuz
parents:
diff changeset
61 }
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 ; CHECK-LABEL: define void @test2(
anatofuz
parents:
diff changeset
64 ; CHECK: call i8* @llvm.objc.retain
anatofuz
parents:
diff changeset
65 ; CHECK: for.body:
anatofuz
parents:
diff changeset
66 ; CHECK-NOT: @objc
anatofuz
parents:
diff changeset
67 ; CHECK: for.end:
anatofuz
parents:
diff changeset
68 ; CHECK: void @llvm.objc.release
anatofuz
parents:
diff changeset
69 ; CHECK: }
anatofuz
parents:
diff changeset
70 define void @test2(i8* %digits) {
anatofuz
parents:
diff changeset
71 entry:
anatofuz
parents:
diff changeset
72 %tmp1 = call i8* @llvm.objc.retain(i8* %digits) nounwind
anatofuz
parents:
diff changeset
73 br label %for.body
anatofuz
parents:
diff changeset
74
anatofuz
parents:
diff changeset
75 for.body: ; preds = %for.body, %entry
anatofuz
parents:
diff changeset
76 %upcDigitIndex.01 = phi i64 [ 2, %entry ], [ %inc, %for.body ]
anatofuz
parents:
diff changeset
77 call void @use_pointer(i8* %digits)
anatofuz
parents:
diff changeset
78 %inc = add i64 %upcDigitIndex.01, 1
anatofuz
parents:
diff changeset
79 %cmp = icmp ult i64 %inc, 12
anatofuz
parents:
diff changeset
80 br i1 %cmp, label %for.body, label %for.end
anatofuz
parents:
diff changeset
81
anatofuz
parents:
diff changeset
82 for.end: ; preds = %for.body
anatofuz
parents:
diff changeset
83 call void @use_pointer(i8* %digits)
anatofuz
parents:
diff changeset
84 call void @llvm.objc.release(i8* %digits) nounwind, !clang.imprecise_release !0
anatofuz
parents:
diff changeset
85 ret void
anatofuz
parents:
diff changeset
86 }
anatofuz
parents:
diff changeset
87
anatofuz
parents:
diff changeset
88 ; Delete nested retain+release pairs around loops.
anatofuz
parents:
diff changeset
89
anatofuz
parents:
diff changeset
90 ; CHECK: define void @test3(i8* %a) #0 {
anatofuz
parents:
diff changeset
91 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
92 ; CHECK-NEXT: tail call i8* @llvm.objc.retain(i8* %a) [[NUW:#[0-9]+]]
anatofuz
parents:
diff changeset
93 ; CHECK-NEXT: br label %loop
anatofuz
parents:
diff changeset
94 ; CHECK-NOT: @llvm.objc.
anatofuz
parents:
diff changeset
95 ; CHECK: exit:
anatofuz
parents:
diff changeset
96 ; CHECK-NEXT: call void @llvm.objc.release(i8* %a)
anatofuz
parents:
diff changeset
97 ; CHECK-NEXT: ret void
anatofuz
parents:
diff changeset
98 ; CHECK-NEXT: }
anatofuz
parents:
diff changeset
99 define void @test3(i8* %a) nounwind {
anatofuz
parents:
diff changeset
100 entry:
anatofuz
parents:
diff changeset
101 %outer = call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
102 %inner = call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
103 br label %loop
anatofuz
parents:
diff changeset
104
anatofuz
parents:
diff changeset
105 loop:
anatofuz
parents:
diff changeset
106 call void @callee()
anatofuz
parents:
diff changeset
107 store i8 0, i8* %a
anatofuz
parents:
diff changeset
108 br i1 undef, label %loop, label %exit
anatofuz
parents:
diff changeset
109
anatofuz
parents:
diff changeset
110 exit:
anatofuz
parents:
diff changeset
111 call void @llvm.objc.release(i8* %a) nounwind
anatofuz
parents:
diff changeset
112 call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
anatofuz
parents:
diff changeset
113 ret void
anatofuz
parents:
diff changeset
114 }
anatofuz
parents:
diff changeset
115
anatofuz
parents:
diff changeset
116 ; CHECK: define void @test4(i8* %a) #0 {
anatofuz
parents:
diff changeset
117 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
118 ; CHECK-NEXT: tail call i8* @llvm.objc.retain(i8* %a) [[NUW]]
anatofuz
parents:
diff changeset
119 ; CHECK-NEXT: br label %loop
anatofuz
parents:
diff changeset
120 ; CHECK-NOT: @llvm.objc.
anatofuz
parents:
diff changeset
121 ; CHECK: exit:
anatofuz
parents:
diff changeset
122 ; CHECK-NEXT: call void @llvm.objc.release(i8* %a)
anatofuz
parents:
diff changeset
123 ; CHECK-NEXT: ret void
anatofuz
parents:
diff changeset
124 ; CHECK-NEXT: }
anatofuz
parents:
diff changeset
125 define void @test4(i8* %a) nounwind {
anatofuz
parents:
diff changeset
126 entry:
anatofuz
parents:
diff changeset
127 %outer = call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
128 %inner = call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
129 br label %loop
anatofuz
parents:
diff changeset
130
anatofuz
parents:
diff changeset
131 loop:
anatofuz
parents:
diff changeset
132 br label %more
anatofuz
parents:
diff changeset
133
anatofuz
parents:
diff changeset
134 more:
anatofuz
parents:
diff changeset
135 call void @callee()
anatofuz
parents:
diff changeset
136 call void @callee()
anatofuz
parents:
diff changeset
137 store i8 0, i8* %a
anatofuz
parents:
diff changeset
138 br i1 undef, label %loop, label %exit
anatofuz
parents:
diff changeset
139
anatofuz
parents:
diff changeset
140 exit:
anatofuz
parents:
diff changeset
141 call void @llvm.objc.release(i8* %a) nounwind
anatofuz
parents:
diff changeset
142 call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
anatofuz
parents:
diff changeset
143 ret void
anatofuz
parents:
diff changeset
144 }
anatofuz
parents:
diff changeset
145
anatofuz
parents:
diff changeset
146 ; CHECK: define void @test5(i8* %a) #0 {
anatofuz
parents:
diff changeset
147 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
148 ; CHECK-NEXT: tail call i8* @llvm.objc.retain(i8* %a) [[NUW]]
anatofuz
parents:
diff changeset
149 ; CHECK-NEXT: call void @callee()
anatofuz
parents:
diff changeset
150 ; CHECK-NEXT: br label %loop
anatofuz
parents:
diff changeset
151 ; CHECK-NOT: @llvm.objc.
anatofuz
parents:
diff changeset
152 ; CHECK: exit:
anatofuz
parents:
diff changeset
153 ; CHECK-NEXT: call void @use_pointer(i8* %a)
anatofuz
parents:
diff changeset
154 ; CHECK-NEXT: call void @llvm.objc.release(i8* %a)
anatofuz
parents:
diff changeset
155 ; CHECK-NEXT: ret void
anatofuz
parents:
diff changeset
156 ; CHECK-NEXT: }
anatofuz
parents:
diff changeset
157 define void @test5(i8* %a) nounwind {
anatofuz
parents:
diff changeset
158 entry:
anatofuz
parents:
diff changeset
159 %outer = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
160 %inner = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
161 call void @callee()
anatofuz
parents:
diff changeset
162 br label %loop
anatofuz
parents:
diff changeset
163
anatofuz
parents:
diff changeset
164 loop:
anatofuz
parents:
diff changeset
165 br i1 undef, label %true, label %more
anatofuz
parents:
diff changeset
166
anatofuz
parents:
diff changeset
167 true:
anatofuz
parents:
diff changeset
168 br label %more
anatofuz
parents:
diff changeset
169
anatofuz
parents:
diff changeset
170 more:
anatofuz
parents:
diff changeset
171 br i1 undef, label %exit, label %loop
anatofuz
parents:
diff changeset
172
anatofuz
parents:
diff changeset
173 exit:
anatofuz
parents:
diff changeset
174 call void @use_pointer(i8* %a)
anatofuz
parents:
diff changeset
175 call void @llvm.objc.release(i8* %a) nounwind
anatofuz
parents:
diff changeset
176 call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
anatofuz
parents:
diff changeset
177 ret void
anatofuz
parents:
diff changeset
178 }
anatofuz
parents:
diff changeset
179
anatofuz
parents:
diff changeset
180 ; CHECK: define void @test6(i8* %a) #0 {
anatofuz
parents:
diff changeset
181 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
182 ; CHECK-NEXT: tail call i8* @llvm.objc.retain(i8* %a) [[NUW]]
anatofuz
parents:
diff changeset
183 ; CHECK-NEXT: br label %loop
anatofuz
parents:
diff changeset
184 ; CHECK-NOT: @llvm.objc.
anatofuz
parents:
diff changeset
185 ; CHECK: exit:
anatofuz
parents:
diff changeset
186 ; CHECK-NEXT: call void @use_pointer(i8* %a)
anatofuz
parents:
diff changeset
187 ; CHECK-NEXT: call void @llvm.objc.release(i8* %a)
anatofuz
parents:
diff changeset
188 ; CHECK-NEXT: ret void
anatofuz
parents:
diff changeset
189 ; CHECK-NEXT: }
anatofuz
parents:
diff changeset
190 define void @test6(i8* %a) nounwind {
anatofuz
parents:
diff changeset
191 entry:
anatofuz
parents:
diff changeset
192 %outer = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
193 %inner = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
194 br label %loop
anatofuz
parents:
diff changeset
195
anatofuz
parents:
diff changeset
196 loop:
anatofuz
parents:
diff changeset
197 br i1 undef, label %true, label %more
anatofuz
parents:
diff changeset
198
anatofuz
parents:
diff changeset
199 true:
anatofuz
parents:
diff changeset
200 call void @callee()
anatofuz
parents:
diff changeset
201 br label %more
anatofuz
parents:
diff changeset
202
anatofuz
parents:
diff changeset
203 more:
anatofuz
parents:
diff changeset
204 br i1 undef, label %exit, label %loop
anatofuz
parents:
diff changeset
205
anatofuz
parents:
diff changeset
206 exit:
anatofuz
parents:
diff changeset
207 call void @use_pointer(i8* %a)
anatofuz
parents:
diff changeset
208 call void @llvm.objc.release(i8* %a) nounwind
anatofuz
parents:
diff changeset
209 call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
anatofuz
parents:
diff changeset
210 ret void
anatofuz
parents:
diff changeset
211 }
anatofuz
parents:
diff changeset
212
anatofuz
parents:
diff changeset
213 ; CHECK: define void @test7(i8* %a) #0 {
anatofuz
parents:
diff changeset
214 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
215 ; CHECK-NEXT: tail call i8* @llvm.objc.retain(i8* %a) [[NUW]]
anatofuz
parents:
diff changeset
216 ; CHECK-NEXT: call void @callee()
anatofuz
parents:
diff changeset
217 ; CHECK-NEXT: br label %loop
anatofuz
parents:
diff changeset
218 ; CHECK-NOT: @llvm.objc.
anatofuz
parents:
diff changeset
219 ; CHECK: exit:
anatofuz
parents:
diff changeset
220 ; CHECK-NEXT: call void @llvm.objc.release(i8* %a)
anatofuz
parents:
diff changeset
221 ; CHECK-NEXT: ret void
anatofuz
parents:
diff changeset
222 ; CHECK-NEXT: }
anatofuz
parents:
diff changeset
223 define void @test7(i8* %a) nounwind {
anatofuz
parents:
diff changeset
224 entry:
anatofuz
parents:
diff changeset
225 %outer = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
226 %inner = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
227 call void @callee()
anatofuz
parents:
diff changeset
228 br label %loop
anatofuz
parents:
diff changeset
229
anatofuz
parents:
diff changeset
230 loop:
anatofuz
parents:
diff changeset
231 br i1 undef, label %true, label %more
anatofuz
parents:
diff changeset
232
anatofuz
parents:
diff changeset
233 true:
anatofuz
parents:
diff changeset
234 call void @use_pointer(i8* %a)
anatofuz
parents:
diff changeset
235 br label %more
anatofuz
parents:
diff changeset
236
anatofuz
parents:
diff changeset
237 more:
anatofuz
parents:
diff changeset
238 br i1 undef, label %exit, label %loop
anatofuz
parents:
diff changeset
239
anatofuz
parents:
diff changeset
240 exit:
anatofuz
parents:
diff changeset
241 call void @llvm.objc.release(i8* %a) nounwind
anatofuz
parents:
diff changeset
242 call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
anatofuz
parents:
diff changeset
243 ret void
anatofuz
parents:
diff changeset
244 }
anatofuz
parents:
diff changeset
245
anatofuz
parents:
diff changeset
246 ; CHECK: define void @test8(i8* %a) #0 {
anatofuz
parents:
diff changeset
247 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
248 ; CHECK-NEXT: tail call i8* @llvm.objc.retain(i8* %a) [[NUW]]
anatofuz
parents:
diff changeset
249 ; CHECK-NEXT: br label %loop
anatofuz
parents:
diff changeset
250 ; CHECK-NOT: @llvm.objc.
anatofuz
parents:
diff changeset
251 ; CHECK: exit:
anatofuz
parents:
diff changeset
252 ; CHECK-NEXT: call void @llvm.objc.release(i8* %a)
anatofuz
parents:
diff changeset
253 ; CHECK-NEXT: ret void
anatofuz
parents:
diff changeset
254 ; CHECK-NEXT: }
anatofuz
parents:
diff changeset
255 define void @test8(i8* %a) nounwind {
anatofuz
parents:
diff changeset
256 entry:
anatofuz
parents:
diff changeset
257 %outer = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
258 %inner = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
259 br label %loop
anatofuz
parents:
diff changeset
260
anatofuz
parents:
diff changeset
261 loop:
anatofuz
parents:
diff changeset
262 br i1 undef, label %true, label %more
anatofuz
parents:
diff changeset
263
anatofuz
parents:
diff changeset
264 true:
anatofuz
parents:
diff changeset
265 call void @callee()
anatofuz
parents:
diff changeset
266 call void @use_pointer(i8* %a)
anatofuz
parents:
diff changeset
267 br label %more
anatofuz
parents:
diff changeset
268
anatofuz
parents:
diff changeset
269 more:
anatofuz
parents:
diff changeset
270 br i1 undef, label %exit, label %loop
anatofuz
parents:
diff changeset
271
anatofuz
parents:
diff changeset
272 exit:
anatofuz
parents:
diff changeset
273 call void @llvm.objc.release(i8* %a) nounwind
anatofuz
parents:
diff changeset
274 call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
anatofuz
parents:
diff changeset
275 ret void
anatofuz
parents:
diff changeset
276 }
anatofuz
parents:
diff changeset
277
anatofuz
parents:
diff changeset
278 ; CHECK: define void @test9(i8* %a) #0 {
anatofuz
parents:
diff changeset
279 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
280 ; CHECK-NEXT: br label %loop
anatofuz
parents:
diff changeset
281 ; CHECK-NOT: @llvm.objc.
anatofuz
parents:
diff changeset
282 ; CHECK: exit:
anatofuz
parents:
diff changeset
283 ; CHECK-NEXT: ret void
anatofuz
parents:
diff changeset
284 ; CHECK-NEXT: }
anatofuz
parents:
diff changeset
285 define void @test9(i8* %a) nounwind {
anatofuz
parents:
diff changeset
286 entry:
anatofuz
parents:
diff changeset
287 %outer = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
288 %inner = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
289 br label %loop
anatofuz
parents:
diff changeset
290
anatofuz
parents:
diff changeset
291 loop:
anatofuz
parents:
diff changeset
292 br i1 undef, label %true, label %more
anatofuz
parents:
diff changeset
293
anatofuz
parents:
diff changeset
294 true:
anatofuz
parents:
diff changeset
295 call void @use_pointer(i8* %a)
anatofuz
parents:
diff changeset
296 br label %more
anatofuz
parents:
diff changeset
297
anatofuz
parents:
diff changeset
298 more:
anatofuz
parents:
diff changeset
299 br i1 undef, label %exit, label %loop
anatofuz
parents:
diff changeset
300
anatofuz
parents:
diff changeset
301 exit:
anatofuz
parents:
diff changeset
302 call void @llvm.objc.release(i8* %a) nounwind
anatofuz
parents:
diff changeset
303 call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
anatofuz
parents:
diff changeset
304 ret void
anatofuz
parents:
diff changeset
305 }
anatofuz
parents:
diff changeset
306
anatofuz
parents:
diff changeset
307 ; CHECK: define void @test10(i8* %a) #0 {
anatofuz
parents:
diff changeset
308 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
309 ; CHECK-NEXT: br label %loop
anatofuz
parents:
diff changeset
310 ; CHECK-NOT: @llvm.objc.
anatofuz
parents:
diff changeset
311 ; CHECK: exit:
anatofuz
parents:
diff changeset
312 ; CHECK-NEXT: ret void
anatofuz
parents:
diff changeset
313 ; CHECK-NEXT: }
anatofuz
parents:
diff changeset
314 define void @test10(i8* %a) nounwind {
anatofuz
parents:
diff changeset
315 entry:
anatofuz
parents:
diff changeset
316 %outer = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
317 %inner = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
318 br label %loop
anatofuz
parents:
diff changeset
319
anatofuz
parents:
diff changeset
320 loop:
anatofuz
parents:
diff changeset
321 br i1 undef, label %true, label %more
anatofuz
parents:
diff changeset
322
anatofuz
parents:
diff changeset
323 true:
anatofuz
parents:
diff changeset
324 call void @callee()
anatofuz
parents:
diff changeset
325 br label %more
anatofuz
parents:
diff changeset
326
anatofuz
parents:
diff changeset
327 more:
anatofuz
parents:
diff changeset
328 br i1 undef, label %exit, label %loop
anatofuz
parents:
diff changeset
329
anatofuz
parents:
diff changeset
330 exit:
anatofuz
parents:
diff changeset
331 call void @llvm.objc.release(i8* %a) nounwind
anatofuz
parents:
diff changeset
332 call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
anatofuz
parents:
diff changeset
333 ret void
anatofuz
parents:
diff changeset
334 }
anatofuz
parents:
diff changeset
335
anatofuz
parents:
diff changeset
336 ; CHECK: define void @test11(i8* %a) #0 {
anatofuz
parents:
diff changeset
337 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
338 ; CHECK-NEXT: br label %loop
anatofuz
parents:
diff changeset
339 ; CHECK-NOT: @llvm.objc.
anatofuz
parents:
diff changeset
340 ; CHECK: exit:
anatofuz
parents:
diff changeset
341 ; CHECK-NEXT: ret void
anatofuz
parents:
diff changeset
342 ; CHECK-NEXT: }
anatofuz
parents:
diff changeset
343 define void @test11(i8* %a) nounwind {
anatofuz
parents:
diff changeset
344 entry:
anatofuz
parents:
diff changeset
345 %outer = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
346 %inner = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
347 br label %loop
anatofuz
parents:
diff changeset
348
anatofuz
parents:
diff changeset
349 loop:
anatofuz
parents:
diff changeset
350 br i1 undef, label %true, label %more
anatofuz
parents:
diff changeset
351
anatofuz
parents:
diff changeset
352 true:
anatofuz
parents:
diff changeset
353 br label %more
anatofuz
parents:
diff changeset
354
anatofuz
parents:
diff changeset
355 more:
anatofuz
parents:
diff changeset
356 br i1 undef, label %exit, label %loop
anatofuz
parents:
diff changeset
357
anatofuz
parents:
diff changeset
358 exit:
anatofuz
parents:
diff changeset
359 call void @llvm.objc.release(i8* %a) nounwind
anatofuz
parents:
diff changeset
360 call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
anatofuz
parents:
diff changeset
361 ret void
anatofuz
parents:
diff changeset
362 }
anatofuz
parents:
diff changeset
363
anatofuz
parents:
diff changeset
364 ; Don't delete anything if they're not balanced.
anatofuz
parents:
diff changeset
365
anatofuz
parents:
diff changeset
366 ; CHECK: define void @test12(i8* %a) #0 {
anatofuz
parents:
diff changeset
367 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
368 ; CHECK-NEXT: %outer = tail call i8* @llvm.objc.retain(i8* %a) [[NUW]]
anatofuz
parents:
diff changeset
369 ; CHECK-NEXT: %inner = tail call i8* @llvm.objc.retain(i8* %a) [[NUW]]
anatofuz
parents:
diff changeset
370 ; CHECK-NEXT: br label %loop
anatofuz
parents:
diff changeset
371 ; CHECK-NOT: @llvm.objc.
anatofuz
parents:
diff changeset
372 ; CHECK: exit:
anatofuz
parents:
diff changeset
373 ; CHECK-NEXT: call void @llvm.objc.release(i8* %a) [[NUW]]
anatofuz
parents:
diff changeset
374 ; CHECK-NEXT: call void @llvm.objc.release(i8* %a) [[NUW]], !clang.imprecise_release !0
anatofuz
parents:
diff changeset
375 ; CHECK-NEXT: ret void
anatofuz
parents:
diff changeset
376 ; CHECK-NEXT: }
anatofuz
parents:
diff changeset
377 define void @test12(i8* %a) nounwind {
anatofuz
parents:
diff changeset
378 entry:
anatofuz
parents:
diff changeset
379 %outer = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
380 %inner = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
381 br label %loop
anatofuz
parents:
diff changeset
382
anatofuz
parents:
diff changeset
383 loop:
anatofuz
parents:
diff changeset
384 br i1 undef, label %true, label %more
anatofuz
parents:
diff changeset
385
anatofuz
parents:
diff changeset
386 true:
anatofuz
parents:
diff changeset
387 ret void
anatofuz
parents:
diff changeset
388
anatofuz
parents:
diff changeset
389 more:
anatofuz
parents:
diff changeset
390 br i1 undef, label %exit, label %loop
anatofuz
parents:
diff changeset
391
anatofuz
parents:
diff changeset
392 exit:
anatofuz
parents:
diff changeset
393 call void @llvm.objc.release(i8* %a) nounwind
anatofuz
parents:
diff changeset
394 call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
anatofuz
parents:
diff changeset
395 ret void
anatofuz
parents:
diff changeset
396 }
anatofuz
parents:
diff changeset
397
anatofuz
parents:
diff changeset
398 ; Do not improperly pair retains in a for loop with releases outside of a for
anatofuz
parents:
diff changeset
399 ; loop when the proper pairing is disguised by a separate provenance represented
anatofuz
parents:
diff changeset
400 ; by an alloca.
anatofuz
parents:
diff changeset
401 ; rdar://12969722
anatofuz
parents:
diff changeset
402
anatofuz
parents:
diff changeset
403 ; CHECK: define void @test13(i8* %a) [[NUW]] {
anatofuz
parents:
diff changeset
404 ; CHECK: entry:
anatofuz
parents:
diff changeset
405 ; CHECK: tail call i8* @llvm.objc.retain(i8* %a) [[NUW]]
anatofuz
parents:
diff changeset
406 ; CHECK: loop:
anatofuz
parents:
diff changeset
407 ; CHECK: tail call i8* @llvm.objc.retain(i8* %a) [[NUW]]
anatofuz
parents:
diff changeset
408 ; CHECK: call void @block_callee
anatofuz
parents:
diff changeset
409 ; CHECK: call void @llvm.objc.release(i8* %reloaded_a) [[NUW]]
anatofuz
parents:
diff changeset
410 ; CHECK: exit:
anatofuz
parents:
diff changeset
411 ; CHECK: call void @llvm.objc.release(i8* %a) [[NUW]]
anatofuz
parents:
diff changeset
412 ; CHECK: }
anatofuz
parents:
diff changeset
413 define void @test13(i8* %a) nounwind {
anatofuz
parents:
diff changeset
414 entry:
anatofuz
parents:
diff changeset
415 %block = alloca i8*
anatofuz
parents:
diff changeset
416 %a1 = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
417 br label %loop
anatofuz
parents:
diff changeset
418
anatofuz
parents:
diff changeset
419 loop:
anatofuz
parents:
diff changeset
420 %a2 = tail call i8* @llvm.objc.retain(i8* %a) nounwind
anatofuz
parents:
diff changeset
421 store i8* %a, i8** %block, align 8
anatofuz
parents:
diff changeset
422 %casted_block = bitcast i8** %block to void ()*
anatofuz
parents:
diff changeset
423 call void @block_callee(void ()* %casted_block)
anatofuz
parents:
diff changeset
424 %reloaded_a = load i8*, i8** %block, align 8
anatofuz
parents:
diff changeset
425 call void @llvm.objc.release(i8* %reloaded_a) nounwind, !clang.imprecise_release !0
anatofuz
parents:
diff changeset
426 br i1 undef, label %loop, label %exit
anatofuz
parents:
diff changeset
427
anatofuz
parents:
diff changeset
428 exit:
anatofuz
parents:
diff changeset
429 call void @llvm.objc.release(i8* %a) nounwind, !clang.imprecise_release !0
anatofuz
parents:
diff changeset
430 ret void
anatofuz
parents:
diff changeset
431 }
anatofuz
parents:
diff changeset
432
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
433 ; The retain call in the entry block shouldn't be moved to the loop body.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
434
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
435 ; CHECK: define void @test14(i8* %[[VAL0:.*]],
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
436 ; CHECK: %[[V1:.*]] = tail call i8* @llvm.objc.retain(i8* %[[VAL0]])
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
437 ; CHECK: %[[CMP:.*]] = icmp eq i8* %[[VAL0]], null
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
438 ; CHECK: br i1 %[[CMP]], label %{{.*}}, label %{{.*}}
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
439
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
440 define void @test14(i8* %val0, i8 %val1) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
441 entry:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
442 %v1 = tail call i8* @llvm.objc.retain(i8* %val0)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
443 %cmp = icmp eq i8* %val0, null
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
444 br i1 %cmp, label %if.end27, label %if.then
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
445
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
446 if.then:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
447 %tobool = icmp eq i8 %val1, 1
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
448 br label %for.body
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
449
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
450 for.cond:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
451 %cmp6 = icmp eq i8 %val1, 2
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
452 br i1 %cmp6, label %for.body, label %for.end.loopexit
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
453
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
454 for.body:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
455 call void @callee()
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
456 %tobool9 = icmp eq i8 %val1, 0
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
457 br i1 %tobool9, label %for.cond, label %if.then10
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
458
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
459 if.then10:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
460 br label %for.end
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
461
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
462 for.end.loopexit:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
463 br label %for.end
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
464
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
465 for.end:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
466 call void @callee()
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
467 call void @use_pointer(i8* %v1)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
468 br label %if.end27
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
469
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
470 if.end27:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
471 call void @llvm.objc.release(i8* %v1) #0, !clang.imprecise_release !0
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
472 ret void
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
473 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
474
150
anatofuz
parents:
diff changeset
475 ; CHECK: attributes [[NUW]] = { nounwind }
anatofuz
parents:
diff changeset
476
anatofuz
parents:
diff changeset
477 !0 = !{}