blob: 56f194f93f77accf875568304602a5e95d0419b9 [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 Hahnc6c89bf2018-01-16 22:13:15 +00008;CHECK-LABEL: Tail.predBB.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +00009;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1)
Florian Hahnc6c89bf2018-01-16 22:13:15 +000010;CHECK-LABEL: Tail.predBB.split1:
Jun Bum Lim0c990072017-11-03 20:41:16 +000011;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2)
12;CHECK-LABEL: Tail
Florian Hahnc6c89bf2018-01-16 22:13:15 +000013;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ]
14;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]
Jun Bum Lim0c990072017-11-03 20:41:16 +000015;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
Florian Hahnc6c89bf2018-01-16 22:13:15 +000035;CHECK-LABEL: Tail.predBB.split:
Florian Hahnbeda7d52017-12-13 03:05:20 +000036;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 10)
Florian Hahnc6c89bf2018-01-16 22:13:15 +000037;CHECK-LABEL: Tail.predBB.split1:
Florian Hahnbeda7d52017-12-13 03:05:20 +000038;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 %p)
39;CHECK-LABEL: Tail
Florian Hahnc6c89bf2018-01-16 22:13:15 +000040;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]
Florian Hahnbeda7d52017-12-13 03:05:20 +000041;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
Florian Hahnc6c89bf2018-01-16 22:13:15 +000064;CHECK-LABEL: Tail.predBB.split:
Florian Hahnbeda7d52017-12-13 03:05:20 +000065;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 222, i32 %p)
Florian Hahnc6c89bf2018-01-16 22:13:15 +000066;CHECK-LABEL: Tail.predBB.split1:
Florian Hahnbeda7d52017-12-13 03:05:20 +000067;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 333, i32 %p)
68;CHECK-LABEL: Tail
Florian Hahnc6c89bf2018-01-16 22:13:15 +000069;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]
Florian Hahnbeda7d52017-12-13 03:05:20 +000070;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
Florian Hahnc6c89bf2018-01-16 22:13:15 +000093;CHECK-LABEL: Tail.predBB.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +000094;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1)
Florian Hahnc6c89bf2018-01-16 22:13:15 +000095;CHECK-LABEL: Tail.predBB.split1:
Jun Bum Lim0c990072017-11-03 20:41:16 +000096;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 2)
97;CHECK-LABEL: Tail
Florian Hahnc6c89bf2018-01-16 22:13:15 +000098;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ]
99;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]
Jun Bum Lim0c990072017-11-03 20:41:16 +0000100;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
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000120;CHECK-LABEL: Tail.predBB.split:
Florian Hahnbeda7d52017-12-13 03:05:20 +0000121;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 10)
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000122;CHECK-LABEL: Tail.predBB.split1:
Florian Hahnbeda7d52017-12-13 03:05:20 +0000123;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p)
124;CHECK-LABEL: Tail
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000125;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]
Florian Hahnbeda7d52017-12-13 03:05:20 +0000126;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
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000149;CHECK-LABEL: Tail.predBB.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000150;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1)
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000151;CHECK-LABEL: Tail.predBB.split1:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000152;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 %v, i32 2)
153;CHECK-LABEL: Tail
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000154;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ]
155;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]
Jun Bum Lim0c990072017-11-03 20:41:16 +0000156;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
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000176;CHECK-LABEL: Tail.predBB.split:
Florian Hahnbeda7d52017-12-13 03:05:20 +0000177;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p)
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000178;CHECK-LABEL: Tail.predBB.split1:
Florian Hahnbeda7d52017-12-13 03:05:20 +0000179;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p)
180;CHECK-LABEL: Tail
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000181;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]
Florian Hahnbeda7d52017-12-13 03:05:20 +0000182;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
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000207;CHECK-LABEL: Tail.predBB.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000208;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1)
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000209;CHECK-LABEL: Tail.predBB.split1:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000210;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 2)
211;CHECK-LABEL: Tail
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000212;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ]
213;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]
Jun Bum Lim0c990072017-11-03 20:41:16 +0000214;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
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000234;CHECK-LABEL: Tail.predBB.split:
Florian Hahnbeda7d52017-12-13 03:05:20 +0000235;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 10)
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000236;CHECK-LABEL: Tail.predBB.split1:
Florian Hahnbeda7d52017-12-13 03:05:20 +0000237;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 %p)
238;CHECK-LABEL: Tail
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000239;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]
Florian Hahnbeda7d52017-12-13 03:05:20 +0000240;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
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000263;CHECK-LABEL: Tail.predBB.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000264;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1)
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000265;CHECK-LABEL: Tail.predBB.split1:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000266;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2)
267;CHECK-LABEL: Tail
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000268;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ]
269;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]
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 Hahnc6c89bf2018-01-16 22:13:15 +0000290;CHECK-LABEL: Tail.predBB.split:
Florian Hahnbeda7d52017-12-13 03:05:20 +0000291;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 10)
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000292;CHECK-LABEL: Tail.predBB.split1:
Florian Hahnbeda7d52017-12-13 03:05:20 +0000293;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 %v, i32 %p)
294;CHECK-LABEL: Tail
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000295;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]
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
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
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000319;CHECK-LABEL: Tail.predBB.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000320;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1)
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000321;CHECK-LABEL: Tail.predBB.split1:
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 Hahnc6c89bf2018-01-16 22:13:15 +0000324;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ]
325;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]
Jun Bum Lim0c990072017-11-03 20:41:16 +0000326;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
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000346;CHECK-LABEL: Tail.predBB.split:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000347;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1)
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000348;CHECK-LABEL: Tail.predBB.split1:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000349;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 2)
350;CHECK-LABEL: Tail
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000351;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ]
352;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]
Jun Bum Lim0c990072017-11-03 20:41:16 +0000353;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
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000373;CHECK-LABEL: Tail.predBB.split:
Florian Hahn2a266a32017-11-18 18:14:13 +0000374;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 2)
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000375;CHECK-LABEL: Tail.predBB.split1:
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 Hahnc6c89bf2018-01-16 22:13:15 +0000378;CHECK: %p = phi i32 [ 2, %Tail.predBB.split ], [ 1, %Tail.predBB.split1 ]
379;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]
Jun Bum Lim0c990072017-11-03 20:41:16 +0000380;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
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000400;CHECK-LABEL: Tail.predBB.split
Florian Hahn2a266a32017-11-18 18:14:13 +0000401;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 2)
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000402;CHECK-LABEL: Tail.predBB.split1:
Florian Hahn2a266a32017-11-18 18:14:13 +0000403;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1)
404;CHECK-LABEL: Tail
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000405;CHECK: %p = phi i32 [ 2, %Tail.predBB.split ], [ 1, %Tail.predBB.split1 ]
406;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]
Florian Hahn2a266a32017-11-18 18:14:13 +0000407;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
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000424;CHECK-NOT: Tail.predBB.split:
425;CHECK-NOT: Tail.predBB.split1:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000426;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
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000448;CHECK-NOT: Tail.predBB.split:
449;CHECK-NOT: Tail.predBB.split1:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000450;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
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000473;CHECK-NOT: Tail.predBB.split:
474;CHECK-NOT: Tail.predBB.split1:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000475;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
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000498;CHECK-NOT: Tail.predBB.split:
499;CHECK-NOT: Tail.predBB.split1:
Jun Bum Lim0c990072017-11-03 20:41:16 +0000500;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
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000522;CHECK-LABEL: Tail.predBB.split:
Florian Hahnbeda7d52017-12-13 03:05:20 +0000523;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 10)
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000524;CHECK-LABEL: Tail.predBB.split1:
Florian Hahnbeda7d52017-12-13 03:05:20 +0000525;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 %p)
526;CHECK-LABEL: Tail
Florian Hahnc6c89bf2018-01-16 22:13:15 +0000527;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ]
Florian Hahnbeda7d52017-12-13 03:05:20 +0000528;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)