blob: e41a81f4b21b4e1c0c4e3d8da06bb51df5e14249 [file] [log] [blame]
Jun Bum Lim0c990072017-11-03 20:41:16 +00001; RUN: opt < %s -callsite-splitting -S | FileCheck %s
2; RUN: opt < %s -passes='function(callsite-splitting)' -S | FileCheck %s
3
4target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
5target triple = "aarch64-linaro-linux-gnueabi"
6
7;CHECK-LABEL: @test_eq_eq
8;CHECK-LABEL: Tail.predBB1.split:
9;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1)
10;CHECK-LABEL: Tail.predBB2.split:
11;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2)
12;CHECK-LABEL: Tail
13;CHECK: %p = phi i32 [ 1, %Tail.predBB1.split ], [ 2, %Tail.predBB2.split ]
14;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB1.split ], [ %[[CALL2]], %Tail.predBB2.split ]
15;CHECK: ret i32 %[[MERGED]]
16define i32 @test_eq_eq(i32* %a, i32 %v) {
17Header:
18 %tobool1 = icmp eq i32* %a, null
19 br i1 %tobool1, label %Tail, label %TBB
20
21TBB:
22 %cmp = icmp eq i32 %v, 1
23 br i1 %cmp, label %Tail, label %End
24
25Tail:
26 %p = phi i32[1,%Header], [2, %TBB]
27 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
28 ret i32 %r
29
30End:
31 ret i32 %v
32}
33
Florian Hahnbeda7d52017-12-13 03:05:20 +000034;CHECK-LABEL: @test_eq_eq_eq
35;CHECK-LABEL: Tail.predBB1.split:
36;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 10)
37;CHECK-LABEL: Tail.predBB2.split:
38;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 %p)
39;CHECK-LABEL: Tail
40;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB1.split ], [ %[[CALL2]], %Tail.predBB2.split ]
41;CHECK: ret i32 %[[MERGED]]
42define i32 @test_eq_eq_eq(i32* %a, i32 %v, i32 %p) {
43Header:
44 %tobool1 = icmp eq i32* %a, null
45 br i1 %tobool1, label %Header2, label %End
46
47Header2:
48 %tobool2 = icmp eq i32 %p, 10
49 br i1 %tobool2, label %Tail, label %TBB
50
51TBB:
52 %cmp = icmp eq i32 %v, 1
53 br i1 %cmp, label %Tail, label %End
54
55Tail:
56 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
57 ret i32 %r
58
59End:
60 ret i32 %v
61}
62
63;CHECK-LABEL: @test_eq_eq_eq_constrain_same_i32_arg
64;CHECK-LABEL: Tail.predBB1.split:
65;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 222, i32 %p)
66;CHECK-LABEL: Tail.predBB2.split:
67;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 333, i32 %p)
68;CHECK-LABEL: Tail
69;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB1.split ], [ %[[CALL2]], %Tail.predBB2.split ]
70;CHECK: ret i32 %[[MERGED]]
71define i32 @test_eq_eq_eq_constrain_same_i32_arg(i32* %a, i32 %v, i32 %p) {
72Header:
73 %tobool1 = icmp eq i32 %v, 111
74 br i1 %tobool1, label %Header2, label %End
75
76Header2:
77 %tobool2 = icmp eq i32 %v, 222
78 br i1 %tobool2, label %Tail, label %TBB
79
80TBB:
81 %cmp = icmp eq i32 %v, 333
82 br i1 %cmp, label %Tail, label %End
83
84Tail:
85 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
86 ret i32 %r
87
88End:
89 ret i32 %v
90}
91
Jun Bum Lim0c990072017-11-03 20:41:16 +000092;CHECK-LABEL: @test_ne_eq
93;CHECK-LABEL: Tail.predBB1.split:
94;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1)
95;CHECK-LABEL: Tail.predBB2.split:
96;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 2)
97;CHECK-LABEL: Tail
98;CHECK: %p = phi i32 [ 1, %Tail.predBB1.split ], [ 2, %Tail.predBB2.split ]
99;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB1.split ], [ %[[CALL2]], %Tail.predBB2.split ]
100;CHECK: ret i32 %[[MERGED]]
101define i32 @test_ne_eq(i32* %a, i32 %v) {
102Header:
103 %tobool1 = icmp ne i32* %a, null
104 br i1 %tobool1, label %Tail, label %TBB
105
106TBB:
107 %cmp = icmp eq i32 %v, 1
108 br i1 %cmp, label %Tail, label %End
109
110Tail:
111 %p = phi i32[1,%Header], [2, %TBB]
112 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
113 ret i32 %r
114
115End:
116 ret i32 %v
117}
118
Florian Hahnbeda7d52017-12-13 03:05:20 +0000119;CHECK-LABEL: @test_ne_eq_ne
120;CHECK-LABEL: Tail.predBB1.split:
121;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 10)
122;CHECK-LABEL: Tail.predBB2.split:
123;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p)
124;CHECK-LABEL: Tail
125;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB1.split ], [ %[[CALL2]], %Tail.predBB2.split ]
126;CHECK: ret i32 %[[MERGED]]
127define i32 @test_ne_eq_ne(i32* %a, i32 %v, i32 %p) {
128Header:
129 %tobool1 = icmp ne i32* %a, null
130 br i1 %tobool1, label %Header2, label %End
131
132Header2:
133 %tobool2 = icmp eq i32 %p, 10
134 br i1 %tobool2, label %Tail, label %TBB
135
136TBB:
137 %cmp = icmp ne i32 %v, 1
138 br i1 %cmp, label %Tail, label %End
139
140Tail:
141 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
142 ret i32 %r
143
144End:
145 ret i32 %v
146}
147
Jun Bum Lim0c990072017-11-03 20:41:16 +0000148;CHECK-LABEL: @test_ne_ne
149;CHECK-LABEL: Tail.predBB1.split:
150;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1)
151;CHECK-LABEL: Tail.predBB2.split:
152;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 %v, i32 2)
153;CHECK-LABEL: Tail
154;CHECK: %p = phi i32 [ 1, %Tail.predBB1.split ], [ 2, %Tail.predBB2.split ]
155;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB1.split ], [ %[[CALL2]], %Tail.predBB2.split ]
156;CHECK: ret i32 %[[MERGED]]
157define i32 @test_ne_ne(i32* %a, i32 %v) {
158Header:
159 %tobool1 = icmp ne i32* %a, null
160 br i1 %tobool1, label %Tail, label %TBB
161
162TBB:
163 %cmp = icmp ne i32 %v, 1
164 br i1 %cmp, label %Tail, label %End
165
166Tail:
167 %p = phi i32[1,%Header], [2, %TBB]
168 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
169 ret i32 %r
170
171End:
172 ret i32 %v
173}
174
Florian Hahnbeda7d52017-12-13 03:05:20 +0000175;CHECK-LABEL: @test_ne_ne_ne_constrain_same_pointer_arg
176;CHECK-LABEL: Tail.predBB1.split:
177;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p)
178;CHECK-LABEL: Tail.predBB2.split:
179;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p)
180;CHECK-LABEL: Tail
181;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB1.split ], [ %[[CALL2]], %Tail.predBB2.split ]
182;CHECK: ret i32 %[[MERGED]]
183define i32 @test_ne_ne_ne_constrain_same_pointer_arg(i32* %a, i32 %v, i32 %p, i32* %a2, i32* %a3) {
184Header:
185 %tobool1 = icmp ne i32* %a, null
186 br i1 %tobool1, label %Header2, label %End
187
188Header2:
189 %tobool2 = icmp ne i32* %a, %a2
190 br i1 %tobool2, label %Tail, label %TBB
191
192TBB:
193 %cmp = icmp ne i32* %a, %a3
194 br i1 %cmp, label %Tail, label %End
195
196Tail:
197 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
198 ret i32 %r
199
200End:
201 ret i32 %v
202}
203
204
205
Jun Bum Lim0c990072017-11-03 20:41:16 +0000206;CHECK-LABEL: @test_eq_eq_untaken
207;CHECK-LABEL: Tail.predBB1.split:
208;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1)
209;CHECK-LABEL: Tail.predBB2.split:
210;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 2)
211;CHECK-LABEL: Tail
212;CHECK: %p = phi i32 [ 1, %Tail.predBB1.split ], [ 2, %Tail.predBB2.split ]
213;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB1.split ], [ %[[CALL2]], %Tail.predBB2.split ]
214;CHECK: ret i32 %[[MERGED]]
215define i32 @test_eq_eq_untaken(i32* %a, i32 %v) {
216Header:
217 %tobool1 = icmp eq i32* %a, null
218 br i1 %tobool1, label %TBB, label %Tail
219
220TBB:
221 %cmp = icmp eq i32 %v, 1
222 br i1 %cmp, label %Tail, label %End
223
224Tail:
225 %p = phi i32[1,%Header], [2, %TBB]
226 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
227 ret i32 %r
228
229End:
230 ret i32 %v
231}
232
Florian Hahnbeda7d52017-12-13 03:05:20 +0000233;CHECK-LABEL: @test_eq_eq_eq_untaken
234;CHECK-LABEL: Tail.predBB1.split:
235;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 10)
236;CHECK-LABEL: Tail.predBB2.split:
237;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 %p)
238;CHECK-LABEL: Tail
239;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB1.split ], [ %[[CALL2]], %Tail.predBB2.split ]
240;CHECK: ret i32 %[[MERGED]]
241define i32 @test_eq_eq_eq_untaken(i32* %a, i32 %v, i32 %p) {
242Header:
243 %tobool1 = icmp eq i32* %a, null
244 br i1 %tobool1, label %End, label %Header2
245
246Header2:
247 %tobool2 = icmp eq i32 %p, 10
248 br i1 %tobool2, label %Tail, label %TBB
249
250TBB:
251 %cmp = icmp eq i32 %v, 1
252 br i1 %cmp, label %Tail, label %End
253
254Tail:
255 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
256 ret i32 %r
257
258End:
259 ret i32 %v
260}
261
Jun Bum Lim0c990072017-11-03 20:41:16 +0000262;CHECK-LABEL: @test_ne_eq_untaken
263;CHECK-LABEL: Tail.predBB1.split:
264;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1)
265;CHECK-LABEL: Tail.predBB2.split:
266;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2)
267;CHECK-LABEL: Tail
268;CHECK: %p = phi i32 [ 1, %Tail.predBB1.split ], [ 2, %Tail.predBB2.split ]
269;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB1.split ], [ %[[CALL2]], %Tail.predBB2.split ]
270;CHECK: ret i32 %[[MERGED]]
271define i32 @test_ne_eq_untaken(i32* %a, i32 %v) {
272Header:
273 %tobool1 = icmp ne i32* %a, null
274 br i1 %tobool1, label %TBB, label %Tail
275
276TBB:
277 %cmp = icmp eq i32 %v, 1
278 br i1 %cmp, label %Tail, label %End
279
280Tail:
281 %p = phi i32[1,%Header], [2, %TBB]
282 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
283 ret i32 %r
284
285End:
286 ret i32 %v
287}
288
Florian Hahnbeda7d52017-12-13 03:05:20 +0000289;CHECK-LABEL: @test_ne_eq_ne_untaken
290;CHECK-LABEL: Tail.predBB1.split:
291;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 10)
292;CHECK-LABEL: Tail.predBB2.split:
293;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 %v, i32 %p)
294;CHECK-LABEL: Tail
295;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB1.split ], [ %[[CALL2]], %Tail.predBB2.split ]
296;CHECK: ret i32 %[[MERGED]]
297define i32 @test_ne_eq_ne_untaken(i32* %a, i32 %v, i32 %p) {
298Header:
299 %tobool1 = icmp ne i32* %a, null
300 br i1 %tobool1, label %End, label %Header2
301
302Header2:
303 %tobool2 = icmp eq i32 %p, 10
304 br i1 %tobool2, label %Tail, label %TBB
305
306TBB:
307 %cmp = icmp ne i32 %v, 1
308 br i1 %cmp, label %Tail, label %End
309
310Tail:
311 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
312 ret i32 %r
313
314End:
315 ret i32 %v
316}
317
Jun Bum Lim0c990072017-11-03 20:41:16 +0000318;CHECK-LABEL: @test_ne_ne_untaken
319;CHECK-LABEL: Tail.predBB1.split:
320;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1)
321;CHECK-LABEL: Tail.predBB2.split:
322;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2)
323;CHECK-LABEL: Tail
324;CHECK: %p = phi i32 [ 1, %Tail.predBB1.split ], [ 2, %Tail.predBB2.split ]
325;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB1.split ], [ %[[CALL2]], %Tail.predBB2.split ]
326;CHECK: ret i32 %[[MERGED]]
327define i32 @test_ne_ne_untaken(i32* %a, i32 %v) {
328Header:
329 %tobool1 = icmp ne i32* %a, null
330 br i1 %tobool1, label %TBB, label %Tail
331
332TBB:
333 %cmp = icmp ne i32 %v, 1
334 br i1 %cmp, label %End, label %Tail
335
336Tail:
337 %p = phi i32[1,%Header], [2, %TBB]
338 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
339 ret i32 %r
340
341End:
342 ret i32 %v
343}
344
345;CHECK-LABEL: @test_nonconst_const_phi
346;CHECK-LABEL: Tail.predBB1.split:
347;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1)
348;CHECK-LABEL: Tail.predBB2.split:
349;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 2)
350;CHECK-LABEL: Tail
351;CHECK: %p = phi i32 [ 1, %Tail.predBB1.split ], [ 2, %Tail.predBB2.split ]
352;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB1.split ], [ %[[CALL2]], %Tail.predBB2.split ]
353;CHECK: ret i32 %[[MERGED]]
354define i32 @test_nonconst_const_phi(i32* %a, i32* %b, i32 %v) {
355Header:
356 %tobool1 = icmp eq i32* %a, %b
357 br i1 %tobool1, label %Tail, label %TBB
358
359TBB:
360 %cmp = icmp eq i32 %v, 1
361 br i1 %cmp, label %Tail, label %End
362
363Tail:
364 %p = phi i32[1,%Header], [2, %TBB]
365 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
366 ret i32 %r
367
368End:
369 ret i32 %v
370}
371
372;CHECK-LABEL: @test_nonconst_nonconst_phi
373;CHECK-LABEL: Tail.predBB1.split:
Florian Hahn2a266a32017-11-18 18:14:13 +0000374;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 2)
Jun Bum Lim0c990072017-11-03 20:41:16 +0000375;CHECK-LABEL: Tail.predBB2.split:
Florian Hahn2a266a32017-11-18 18:14:13 +0000376;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1)
Jun Bum Lim0c990072017-11-03 20:41:16 +0000377;CHECK-LABEL: Tail
Florian Hahn2a266a32017-11-18 18:14:13 +0000378;CHECK: %p = phi i32 [ 2, %Tail.predBB1.split ], [ 1, %Tail.predBB2.split ]
Jun Bum Lim0c990072017-11-03 20:41:16 +0000379;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB1.split ], [ %[[CALL2]], %Tail.predBB2.split ]
380;CHECK: ret i32 %[[MERGED]]
381define i32 @test_nonconst_nonconst_phi(i32* %a, i32* %b, i32 %v, i32 %v2) {
382Header:
383 %tobool1 = icmp eq i32* %a, %b
384 br i1 %tobool1, label %Tail, label %TBB
385
386TBB:
387 %cmp = icmp eq i32 %v, %v2
388 br i1 %cmp, label %Tail, label %End
389
390Tail:
391 %p = phi i32[1,%Header], [2, %TBB]
392 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
393 ret i32 %r
394
395End:
396 ret i32 %v
397}
398
Florian Hahn2a266a32017-11-18 18:14:13 +0000399;CHECK-LABEL: @test_cfg_no_or_phi
400;CHECK-LABEL: Tail.predBB1.split
401;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 2)
402;CHECK-LABEL: Tail.predBB2.split:
403;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1)
404;CHECK-LABEL: Tail
405;CHECK: %p = phi i32 [ 2, %Tail.predBB1.split ], [ 1, %Tail.predBB2.split ]
406;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB1.split ], [ %[[CALL2]], %Tail.predBB2.split ]
407;CHECK: ret i32 %[[MERGED]]
408define i32 @test_cfg_no_or_phi(i32* %a, i32 %v) {
409entry:
410 br i1 undef, label %TBB0, label %TBB1
411TBB0:
412 br i1 undef, label %Tail, label %End
413TBB1:
414 br i1 undef, label %Tail, label %End
415Tail:
416 %p = phi i32[1,%TBB0], [2, %TBB1]
417 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
418 ret i32 %r
419End:
420 ret i32 %v
421}
422
Jun Bum Lim0c990072017-11-03 20:41:16 +0000423;CHECK-LABEL: @test_nonconst_nonconst_phi_noncost
424;CHECK-NOT: Tail.predBB1.split:
425;CHECK-NOT: Tail.predBB2.split:
426;CHECK-LABEL: Tail:
427;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
428;CHECK: ret i32 %r
429define i32 @test_nonconst_nonconst_phi_noncost(i32* %a, i32* %b, i32 %v, i32 %v2) {
430Header:
431 %tobool1 = icmp eq i32* %a, %b
432 br i1 %tobool1, label %Tail, label %TBB
433
434TBB:
435 %cmp = icmp eq i32 %v, %v2
436 br i1 %cmp, label %Tail, label %End
437
438Tail:
439 %p = phi i32[%v,%Header], [%v2, %TBB]
440 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
441 ret i32 %r
442
443End:
444 ret i32 %v
445}
446
447;CHECK-LABEL: @test_fisrtnonphi
448;CHECK-NOT: Tail.predBB1.split:
449;CHECK-NOT: Tail.predBB2.split:
450;CHECK-LABEL: Tail:
451;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
452;CHECK: ret i32 %r
453define i32 @test_fisrtnonphi(i32* %a, i32 %v) {
454Header:
455 %tobool1 = icmp eq i32* %a, null
456 br i1 %tobool1, label %Tail, label %TBB
457
458TBB:
459 %cmp = icmp eq i32 %v, 1
460 br i1 %cmp, label %Tail, label %End
461
462Tail:
463 %p = phi i32[1,%Header], [2, %TBB]
464 store i32 %v, i32* %a
465 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
466 ret i32 %r
467
468End:
469 ret i32 %v
470}
471
472;CHECK-LABEL: @test_3preds_constphi
473;CHECK-NOT: Tail.predBB1.split:
474;CHECK-NOT: Tail.predBB2.split:
475;CHECK-LABEL: Tail:
476;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
477;CHECK: ret i32 %r
478define i32 @test_3preds_constphi(i32* %a, i32 %v, i1 %c1, i1 %c2, i1 %c3) {
479Header:
480 br i1 %c1, label %Tail, label %TBB1
481
482TBB1:
483 br i1 %c2, label %Tail, label %TBB2
484
485TBB2:
486 br i1 %c3, label %Tail, label %End
487
488Tail:
489 %p = phi i32[1,%Header], [2, %TBB1], [3, %TBB2]
490 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
491 ret i32 %r
492
493End:
494 ret i32 %v
495}
496
497;CHECK-LABEL: @test_indirectbr_phi
498;CHECK-NOT: Tail.predBB1.split:
499;CHECK-NOT: Tail.predBB2.split:
500;CHECK-LABEL: Tail:
501;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
502;CHECK: ret i32 %r
503define i32 @test_indirectbr_phi(i8* %address, i32* %a, i32* %b, i32 %v) {
504Header:
505 %indirect.goto.dest = select i1 undef, i8* blockaddress(@test_indirectbr_phi, %End), i8* %address
506 indirectbr i8* %indirect.goto.dest, [label %TBB, label %Tail]
507
508TBB:
509 %indirect.goto.dest2 = select i1 undef, i8* blockaddress(@test_indirectbr_phi, %End), i8* %address
510 indirectbr i8* %indirect.goto.dest2, [label %Tail, label %End]
511
512Tail:
513 %p = phi i32[1,%Header], [2, %TBB]
514 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
515 ret i32 %r
516
517End:
518 ret i32 %v
519}
520
Florian Hahnbeda7d52017-12-13 03:05:20 +0000521;CHECK-LABEL: @test_unreachable
522;CHECK-LABEL: Tail.predBB1.split:
523;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 10)
524;CHECK-LABEL: Tail.predBB2.split:
525;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 %p)
526;CHECK-LABEL: Tail
527;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB1.split ], [ %[[CALL2]], %Tail.predBB2.split ]
528;CHECK: ret i32 %[[MERGED]]
529define i32 @test_unreachable(i32* %a, i32 %v, i32 %p) {
530Entry:
531 br label %End
532Header:
533 %tobool2 = icmp eq i32 %p, 10
534 br i1 %tobool2, label %Tail, label %TBB
535TBB:
536 %cmp = icmp eq i32 %v, 1
537 br i1 %cmp, label %Tail, label %Header
538Tail:
539 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
540 ret i32 %r
541End:
542 ret i32 %v
543}
544
Jun Bum Lim0c990072017-11-03 20:41:16 +0000545define i32 @callee(i32* %a, i32 %v, i32 %p) {
546entry:
547 %c = icmp ne i32* %a, null
548 br i1 %c, label %BB1, label %BB2
549
550BB1:
551 call void @dummy(i32* %a, i32 %p)
552 br label %End
553
554BB2:
555 call void @dummy2(i32 %v, i32 %p)
556 br label %End
557
558End:
559 ret i32 %p
560}
561
562declare void @dummy(i32*, i32)
563declare void @dummy2(i32, i32)