blob: cd2edb1e33559d1a4db30d99d1dc7281c6c11418 [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
Florian Hahnb4e3bad2018-02-14 13:59:12 +00008
9;CHECK-LABEL: Header:
10;CHECK: br i1 %tobool1, label %Header.split, label %TBB
11;CHECK-LABEL: Header.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +000012;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1)
Florian Hahnb4e3bad2018-02-14 13:59:12 +000013;CHECK-LABEL: TBB:
14;CHECK: br i1 %cmp, label %TBB.split, label %End
15;CHECK-LABEL: TBB.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +000016;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2)
17;CHECK-LABEL: Tail
Florian Hahnb4e3bad2018-02-14 13:59:12 +000018;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
Jun Bum Lim0c990072017-11-03 20:41:16 +000019;CHECK: ret i32 %[[MERGED]]
20define i32 @test_eq_eq(i32* %a, i32 %v) {
21Header:
22 %tobool1 = icmp eq i32* %a, null
23 br i1 %tobool1, label %Tail, label %TBB
24
25TBB:
26 %cmp = icmp eq i32 %v, 1
27 br i1 %cmp, label %Tail, label %End
28
29Tail:
30 %p = phi i32[1,%Header], [2, %TBB]
31 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
32 ret i32 %r
33
34End:
35 ret i32 %v
36}
37
Florian Hahnbeda7d52017-12-13 03:05:20 +000038;CHECK-LABEL: @test_eq_eq_eq
Florian Hahnb4e3bad2018-02-14 13:59:12 +000039;CHECK-LABEL: Header2.split:
Florian Hahn505091a2018-11-14 10:04:30 +000040;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 10)
Florian Hahnb4e3bad2018-02-14 13:59:12 +000041;CHECK-LABEL: TBB.split:
Florian Hahn505091a2018-11-14 10:04:30 +000042;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 %p)
Florian Hahnbeda7d52017-12-13 03:05:20 +000043;CHECK-LABEL: Tail
Florian Hahnb4e3bad2018-02-14 13:59:12 +000044;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]
Florian Hahnbeda7d52017-12-13 03:05:20 +000045;CHECK: ret i32 %[[MERGED]]
46define i32 @test_eq_eq_eq(i32* %a, i32 %v, i32 %p) {
47Header:
48 %tobool1 = icmp eq i32* %a, null
49 br i1 %tobool1, label %Header2, label %End
50
51Header2:
52 %tobool2 = icmp eq i32 %p, 10
53 br i1 %tobool2, label %Tail, label %TBB
54
55TBB:
56 %cmp = icmp eq i32 %v, 1
57 br i1 %cmp, label %Tail, label %End
58
59Tail:
60 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
61 ret i32 %r
62
63End:
64 ret i32 %v
65}
66
67;CHECK-LABEL: @test_eq_eq_eq_constrain_same_i32_arg
Florian Hahnb4e3bad2018-02-14 13:59:12 +000068;CHECK-LABEL: Header2.split:
Florian Hahnbeda7d52017-12-13 03:05:20 +000069;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 222, i32 %p)
Florian Hahnb4e3bad2018-02-14 13:59:12 +000070;CHECK-LABEL: TBB.split:
Florian Hahnbeda7d52017-12-13 03:05:20 +000071;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 333, i32 %p)
72;CHECK-LABEL: Tail
Florian Hahnb4e3bad2018-02-14 13:59:12 +000073;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]
Florian Hahnbeda7d52017-12-13 03:05:20 +000074;CHECK: ret i32 %[[MERGED]]
75define i32 @test_eq_eq_eq_constrain_same_i32_arg(i32* %a, i32 %v, i32 %p) {
76Header:
77 %tobool1 = icmp eq i32 %v, 111
78 br i1 %tobool1, label %Header2, label %End
79
80Header2:
81 %tobool2 = icmp eq i32 %v, 222
82 br i1 %tobool2, label %Tail, label %TBB
83
84TBB:
85 %cmp = icmp eq i32 %v, 333
86 br i1 %cmp, label %Tail, label %End
87
88Tail:
89 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
90 ret i32 %r
91
92End:
93 ret i32 %v
94}
95
Jun Bum Lim0c990072017-11-03 20:41:16 +000096;CHECK-LABEL: @test_ne_eq
Florian Hahnb4e3bad2018-02-14 13:59:12 +000097;CHECK-LABEL: Header.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +000098;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1)
Florian Hahnb4e3bad2018-02-14 13:59:12 +000099;CHECK-LABEL: TBB.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000100;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 2)
101;CHECK-LABEL: Tail
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000102;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
Jun Bum Lim0c990072017-11-03 20:41:16 +0000103;CHECK: ret i32 %[[MERGED]]
104define i32 @test_ne_eq(i32* %a, i32 %v) {
105Header:
106 %tobool1 = icmp ne i32* %a, null
107 br i1 %tobool1, label %Tail, label %TBB
108
109TBB:
110 %cmp = icmp eq i32 %v, 1
111 br i1 %cmp, label %Tail, label %End
112
113Tail:
114 %p = phi i32[1,%Header], [2, %TBB]
115 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
116 ret i32 %r
117
118End:
119 ret i32 %v
120}
121
Florian Hahnbeda7d52017-12-13 03:05:20 +0000122;CHECK-LABEL: @test_ne_eq_ne
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000123;CHECK-LABEL: Header2.split:
Florian Hahnbeda7d52017-12-13 03:05:20 +0000124;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 10)
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000125;CHECK-LABEL: TBB.split:
Florian Hahn505091a2018-11-14 10:04:30 +0000126;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 %p)
Florian Hahnbeda7d52017-12-13 03:05:20 +0000127;CHECK-LABEL: Tail
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000128;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]
Florian Hahnbeda7d52017-12-13 03:05:20 +0000129;CHECK: ret i32 %[[MERGED]]
130define i32 @test_ne_eq_ne(i32* %a, i32 %v, i32 %p) {
131Header:
132 %tobool1 = icmp ne i32* %a, null
Florian Hahn505091a2018-11-14 10:04:30 +0000133 br i1 %tobool1, label %Header2, label %TBB
Florian Hahnbeda7d52017-12-13 03:05:20 +0000134
135Header2:
136 %tobool2 = icmp eq i32 %p, 10
137 br i1 %tobool2, label %Tail, label %TBB
138
139TBB:
140 %cmp = icmp ne i32 %v, 1
141 br i1 %cmp, label %Tail, label %End
142
143Tail:
144 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
145 ret i32 %r
146
147End:
148 ret i32 %v
149}
150
Jun Bum Lim0c990072017-11-03 20:41:16 +0000151;CHECK-LABEL: @test_ne_ne
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000152;CHECK-LABEL: Header.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000153;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1)
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000154;CHECK-LABEL: TBB.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000155;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 %v, i32 2)
156;CHECK-LABEL: Tail
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000157;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
Jun Bum Lim0c990072017-11-03 20:41:16 +0000158;CHECK: ret i32 %[[MERGED]]
159define i32 @test_ne_ne(i32* %a, i32 %v) {
160Header:
161 %tobool1 = icmp ne i32* %a, null
162 br i1 %tobool1, label %Tail, label %TBB
163
164TBB:
165 %cmp = icmp ne i32 %v, 1
166 br i1 %cmp, label %Tail, label %End
167
168Tail:
169 %p = phi i32[1,%Header], [2, %TBB]
170 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
171 ret i32 %r
172
173End:
174 ret i32 %v
175}
176
Florian Hahnbeda7d52017-12-13 03:05:20 +0000177;CHECK-LABEL: @test_ne_ne_ne_constrain_same_pointer_arg
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000178;CHECK-LABEL: Header2.split:
Florian Hahnbeda7d52017-12-13 03:05:20 +0000179;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p)
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000180;CHECK-LABEL: TBB.split:
Florian Hahn505091a2018-11-14 10:04:30 +0000181;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 %p)
Florian Hahnbeda7d52017-12-13 03:05:20 +0000182;CHECK-LABEL: Tail
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000183;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]
Florian Hahnbeda7d52017-12-13 03:05:20 +0000184;CHECK: ret i32 %[[MERGED]]
185define i32 @test_ne_ne_ne_constrain_same_pointer_arg(i32* %a, i32 %v, i32 %p, i32* %a2, i32* %a3) {
186Header:
187 %tobool1 = icmp ne i32* %a, null
Florian Hahn505091a2018-11-14 10:04:30 +0000188 br i1 %tobool1, label %Header2, label %TBB
Florian Hahnbeda7d52017-12-13 03:05:20 +0000189
190Header2:
191 %tobool2 = icmp ne i32* %a, %a2
192 br i1 %tobool2, label %Tail, label %TBB
193
194TBB:
195 %cmp = icmp ne i32* %a, %a3
196 br i1 %cmp, label %Tail, label %End
197
198Tail:
199 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
200 ret i32 %r
201
202End:
203 ret i32 %v
204}
205
206
207
Jun Bum Lim0c990072017-11-03 20:41:16 +0000208;CHECK-LABEL: @test_eq_eq_untaken
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000209;CHECK-LABEL: Header.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000210;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1)
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000211;CHECK-LABEL: TBB.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000212;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 2)
213;CHECK-LABEL: Tail
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000214;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
Jun Bum Lim0c990072017-11-03 20:41:16 +0000215;CHECK: ret i32 %[[MERGED]]
216define i32 @test_eq_eq_untaken(i32* %a, i32 %v) {
217Header:
218 %tobool1 = icmp eq i32* %a, null
219 br i1 %tobool1, label %TBB, label %Tail
220
221TBB:
222 %cmp = icmp eq i32 %v, 1
223 br i1 %cmp, label %Tail, label %End
224
225Tail:
226 %p = phi i32[1,%Header], [2, %TBB]
227 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
228 ret i32 %r
229
230End:
231 ret i32 %v
232}
233
Florian Hahnbeda7d52017-12-13 03:05:20 +0000234;CHECK-LABEL: @test_eq_eq_eq_untaken
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000235;CHECK-LABEL: Header2.split:
Florian Hahnbeda7d52017-12-13 03:05:20 +0000236;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 10)
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000237;CHECK-LABEL: TBB.split:
Florian Hahn505091a2018-11-14 10:04:30 +0000238;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 %p)
Florian Hahnbeda7d52017-12-13 03:05:20 +0000239;CHECK-LABEL: Tail
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000240;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]
Florian Hahnbeda7d52017-12-13 03:05:20 +0000241;CHECK: ret i32 %[[MERGED]]
242define i32 @test_eq_eq_eq_untaken(i32* %a, i32 %v, i32 %p) {
243Header:
244 %tobool1 = icmp eq i32* %a, null
Florian Hahn505091a2018-11-14 10:04:30 +0000245 br i1 %tobool1, label %TBB, label %Header2
Florian Hahnbeda7d52017-12-13 03:05:20 +0000246
247Header2:
248 %tobool2 = icmp eq i32 %p, 10
249 br i1 %tobool2, label %Tail, label %TBB
250
251TBB:
252 %cmp = icmp eq i32 %v, 1
253 br i1 %cmp, label %Tail, label %End
254
255Tail:
256 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
257 ret i32 %r
258
259End:
260 ret i32 %v
261}
262
Jun Bum Lim0c990072017-11-03 20:41:16 +0000263;CHECK-LABEL: @test_ne_eq_untaken
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000264;CHECK-LABEL: Header.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000265;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1)
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000266;CHECK-LABEL: TBB.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000267;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2)
268;CHECK-LABEL: Tail
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000269;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
Jun Bum Lim0c990072017-11-03 20:41:16 +0000270;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
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000290;CHECK-LABEL: Header2.split:
Florian Hahnbeda7d52017-12-13 03:05:20 +0000291;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 10)
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000292;CHECK-LABEL: TBB.split:
Florian Hahn505091a2018-11-14 10:04:30 +0000293;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 %p)
Florian Hahnbeda7d52017-12-13 03:05:20 +0000294;CHECK-LABEL: Tail
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000295;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]
Florian Hahnbeda7d52017-12-13 03:05:20 +0000296;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
Florian Hahn505091a2018-11-14 10:04:30 +0000300 br i1 %tobool1, label %TBB, label %Header2
Florian Hahnbeda7d52017-12-13 03:05:20 +0000301
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
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000319;CHECK-LABEL: Header.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000320;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1)
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000321;CHECK-LABEL: TBB.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000322;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2)
323;CHECK-LABEL: Tail
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000324;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
Jun Bum Lim0c990072017-11-03 20:41:16 +0000325;CHECK: ret i32 %[[MERGED]]
326define i32 @test_ne_ne_untaken(i32* %a, i32 %v) {
327Header:
328 %tobool1 = icmp ne i32* %a, null
329 br i1 %tobool1, label %TBB, label %Tail
330
331TBB:
332 %cmp = icmp ne i32 %v, 1
333 br i1 %cmp, label %End, label %Tail
334
335Tail:
336 %p = phi i32[1,%Header], [2, %TBB]
337 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
338 ret i32 %r
339
340End:
341 ret i32 %v
342}
343
344;CHECK-LABEL: @test_nonconst_const_phi
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000345;CHECK-LABEL: Header.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000346;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1)
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000347;CHECK-LABEL: TBB.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000348;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 2)
349;CHECK-LABEL: Tail
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000350;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
Jun Bum Lim0c990072017-11-03 20:41:16 +0000351;CHECK: ret i32 %[[MERGED]]
352define i32 @test_nonconst_const_phi(i32* %a, i32* %b, i32 %v) {
353Header:
354 %tobool1 = icmp eq i32* %a, %b
355 br i1 %tobool1, label %Tail, label %TBB
356
357TBB:
358 %cmp = icmp eq i32 %v, 1
359 br i1 %cmp, label %Tail, label %End
360
361Tail:
362 %p = phi i32[1,%Header], [2, %TBB]
363 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
364 ret i32 %r
365
366End:
367 ret i32 %v
368}
369
370;CHECK-LABEL: @test_nonconst_nonconst_phi
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000371;CHECK-LABEL: Header.split:
372;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1)
373;CHECK-LABEL: TBB.split:
374;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 2)
Jun Bum Lim0c990072017-11-03 20:41:16 +0000375;CHECK-LABEL: Tail
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000376;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL2]], %TBB.split ], [ %[[CALL1]], %Header.split ]
Jun Bum Lim0c990072017-11-03 20:41:16 +0000377;CHECK: ret i32 %[[MERGED]]
378define i32 @test_nonconst_nonconst_phi(i32* %a, i32* %b, i32 %v, i32 %v2) {
379Header:
380 %tobool1 = icmp eq i32* %a, %b
381 br i1 %tobool1, label %Tail, label %TBB
382
383TBB:
384 %cmp = icmp eq i32 %v, %v2
385 br i1 %cmp, label %Tail, label %End
386
387Tail:
388 %p = phi i32[1,%Header], [2, %TBB]
389 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
390 ret i32 %r
391
392End:
393 ret i32 %v
394}
395
Florian Hahn2a266a32017-11-18 18:14:13 +0000396;CHECK-LABEL: @test_cfg_no_or_phi
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000397;CHECK-LABEL: TBB0.split
398;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1)
399;CHECK-LABEL: TBB1.split:
400;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 2)
Florian Hahn2a266a32017-11-18 18:14:13 +0000401;CHECK-LABEL: Tail
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000402;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL2]], %TBB1.split ], [ %[[CALL1]], %TBB0.split ]
Florian Hahn2a266a32017-11-18 18:14:13 +0000403;CHECK: ret i32 %[[MERGED]]
404define i32 @test_cfg_no_or_phi(i32* %a, i32 %v) {
405entry:
406 br i1 undef, label %TBB0, label %TBB1
407TBB0:
408 br i1 undef, label %Tail, label %End
409TBB1:
410 br i1 undef, label %Tail, label %End
411Tail:
412 %p = phi i32[1,%TBB0], [2, %TBB1]
413 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
414 ret i32 %r
415End:
416 ret i32 %v
417}
418
Jun Bum Lim0c990072017-11-03 20:41:16 +0000419;CHECK-LABEL: @test_nonconst_nonconst_phi_noncost
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000420;CHECK-NOT: Header.split:
421;CHECK-NOT: TBB.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000422;CHECK-LABEL: Tail:
423;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
424;CHECK: ret i32 %r
425define i32 @test_nonconst_nonconst_phi_noncost(i32* %a, i32* %b, i32 %v, i32 %v2) {
426Header:
427 %tobool1 = icmp eq i32* %a, %b
428 br i1 %tobool1, label %Tail, label %TBB
429
430TBB:
431 %cmp = icmp eq i32 %v, %v2
432 br i1 %cmp, label %Tail, label %End
433
434Tail:
435 %p = phi i32[%v,%Header], [%v2, %TBB]
436 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
437 ret i32 %r
438
439End:
440 ret i32 %v
441}
442
Jun Bum Lim0c990072017-11-03 20:41:16 +0000443;CHECK-LABEL: @test_3preds_constphi
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000444;CHECK-NOT: Header.split:
445;CHECK-NOT: TBB.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000446;CHECK-LABEL: Tail:
447;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
448;CHECK: ret i32 %r
449define i32 @test_3preds_constphi(i32* %a, i32 %v, i1 %c1, i1 %c2, i1 %c3) {
450Header:
451 br i1 %c1, label %Tail, label %TBB1
452
453TBB1:
454 br i1 %c2, label %Tail, label %TBB2
455
456TBB2:
457 br i1 %c3, label %Tail, label %End
458
459Tail:
460 %p = phi i32[1,%Header], [2, %TBB1], [3, %TBB2]
461 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
462 ret i32 %r
463
464End:
465 ret i32 %v
466}
467
468;CHECK-LABEL: @test_indirectbr_phi
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000469;CHECK-NOT: Header.split:
470;CHECK-NOT: TBB.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000471;CHECK-LABEL: Tail:
472;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
473;CHECK: ret i32 %r
474define i32 @test_indirectbr_phi(i8* %address, i32* %a, i32* %b, i32 %v) {
475Header:
476 %indirect.goto.dest = select i1 undef, i8* blockaddress(@test_indirectbr_phi, %End), i8* %address
477 indirectbr i8* %indirect.goto.dest, [label %TBB, label %Tail]
478
479TBB:
480 %indirect.goto.dest2 = select i1 undef, i8* blockaddress(@test_indirectbr_phi, %End), i8* %address
481 indirectbr i8* %indirect.goto.dest2, [label %Tail, label %End]
482
483Tail:
484 %p = phi i32[1,%Header], [2, %TBB]
485 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
486 ret i32 %r
487
488End:
489 ret i32 %v
490}
491
Florian Hahn505091a2018-11-14 10:04:30 +0000492;CHECK-LABEL: @test_cond_no_effect
493;CHECK-NOT: Header.split:
494;CHECK-NOT: TBB.split:
495;CHECK-LABEL: Tail:
496;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 0)
497;CHECK: ret i32 %r
498define i32 @test_cond_no_effect(i32* %a, i32 %v) {
499Entry:
500 %tobool1 = icmp eq i32* %a, null
501 br i1 %tobool1, label %Header, label %End
502
503Header:
504 br i1 undef, label %Tail, label %TBB
505
506TBB:
507 br i1 undef, label %Tail, label %End
508
509Tail:
510 %r = call i32 @callee(i32* %a, i32 %v, i32 0)
511 ret i32 %r
512
513End:
514 ret i32 %v
515}
516
Florian Hahnbeda7d52017-12-13 03:05:20 +0000517;CHECK-LABEL: @test_unreachable
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000518;CHECK-LABEL: Header.split:
Florian Hahnbeda7d52017-12-13 03:05:20 +0000519;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 10)
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000520;CHECK-LABEL: TBB.split:
Florian Hahnbeda7d52017-12-13 03:05:20 +0000521;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 %p)
522;CHECK-LABEL: Tail
Florian Hahnb4e3bad2018-02-14 13:59:12 +0000523;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
Florian Hahnbeda7d52017-12-13 03:05:20 +0000524;CHECK: ret i32 %[[MERGED]]
525define i32 @test_unreachable(i32* %a, i32 %v, i32 %p) {
526Entry:
527 br label %End
528Header:
529 %tobool2 = icmp eq i32 %p, 10
530 br i1 %tobool2, label %Tail, label %TBB
531TBB:
532 %cmp = icmp eq i32 %v, 1
533 br i1 %cmp, label %Tail, label %Header
534Tail:
535 %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
536 ret i32 %r
537End:
538 ret i32 %v
539}
540
Jun Bum Lim0c990072017-11-03 20:41:16 +0000541define i32 @callee(i32* %a, i32 %v, i32 %p) {
542entry:
543 %c = icmp ne i32* %a, null
544 br i1 %c, label %BB1, label %BB2
545
546BB1:
547 call void @dummy(i32* %a, i32 %p)
548 br label %End
549
550BB2:
551 call void @dummy2(i32 %v, i32 %p)
552 br label %End
553
554End:
555 ret i32 %p
556}
557
558declare void @dummy(i32*, i32)
559declare void @dummy2(i32, i32)
Xin Tong8edff272018-04-23 20:09:08 +0000560
561; Make sure we remove the non-nullness on constant paramater.
562;
563;CHECK-LABEL: @caller2
564;CHECK-LABEL: Top1.split:
565;CHECK: call i32 @callee(i32* inttoptr (i64 4643 to i32*)
566define void @caller2(i32 %c, i32* %a_elt, i32* %b_elt) {
567entry:
568 br label %Top0
569
570Top0:
571 %tobool1 = icmp eq i32* %a_elt, inttoptr (i64 4643 to i32*)
572 br i1 %tobool1, label %Top1, label %NextCond
573
574Top1:
575 %tobool2 = icmp ne i32* %a_elt, null
576 br i1 %tobool2, label %CallSiteBB, label %NextCond
577
578NextCond:
579 %cmp = icmp ne i32* %b_elt, null
580 br i1 %cmp, label %CallSiteBB, label %End
581
582CallSiteBB:
583 call i32 @callee(i32* %a_elt, i32 %c, i32 %c)
584 br label %End
585
586End:
587 ret void
588}