blob: 8c16a4657308371da1b3c48c8bd4ecd75cf7a7d9 [file] [log] [blame]
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +00001; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -disable-block-placement -verify-machineinstrs -fast-isel=false -machine-sink-split-probability-threshold=0 -cgp-freq-ratio-to-skip-merge=1000 | FileCheck %s
Dan Gohman950a13c2015-09-16 16:51:30 +00002
3; Test the CFG stackifier pass.
4
Dan Gohman2e644382016-05-10 17:39:48 +00005; Explicitly disable fast-isel, since it gets implicitly enabled in the
6; optnone test.
7
Dan Gohman0c6f5ac2016-01-07 03:19:23 +00008target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
Sam Clegga5908002018-05-10 17:49:11 +00009target triple = "wasm32-unknown-unknown"
Dan Gohman950a13c2015-09-16 16:51:30 +000010
11declare void @something()
12
13; Test that loops are made contiguous, even in the presence of split backedges.
14
Dan Gohmane51c0582015-10-06 00:27:55 +000015; CHECK-LABEL: test0:
16; CHECK: loop
Dan Gohman442bfce2016-02-16 16:22:41 +000017; CHECK-NEXT: block
Dan Gohman12de0b92016-05-17 20:19:47 +000018; CHECK: i32.lt_s
Dan Gohman8fe7e862015-12-14 22:51:54 +000019; CHECK-NEXT: br_if
Dan Gohman442bfce2016-02-16 16:22:41 +000020; CHECK-NEXT: return
Heejin Ahnace7a082019-04-23 21:17:03 +000021; CHECK-NEXT: .LBB{{[0-9]+}}_3:
Dan Gohman442bfce2016-02-16 16:22:41 +000022; CHECK-NEXT: end_block
Reid Klecknerbb865232016-08-15 18:51:42 +000023; CHECK-NEXT: i32.const
24; CHECK-NEXT: i32.add
Dan Gohman442bfce2016-02-16 16:22:41 +000025; CHECK-NEXT: call
26; CHECK-NEXT: br
Heejin Ahnace7a082019-04-23 21:17:03 +000027; CHECK-NEXT: .LBB{{[0-9]+}}_4:
Dan Gohman442bfce2016-02-16 16:22:41 +000028; CHECK-NEXT: end_loop
Dan Gohman950a13c2015-09-16 16:51:30 +000029define void @test0(i32 %n) {
30entry:
31 br label %header
32
33header:
34 %i = phi i32 [ 0, %entry ], [ %i.next, %back ]
35 %i.next = add i32 %i, 1
36
37 %c = icmp slt i32 %i.next, %n
38 br i1 %c, label %back, label %exit
39
40exit:
41 ret void
42
43back:
44 call void @something()
45 br label %header
46}
47
48; Same as test0, but the branch condition is reversed.
49
Dan Gohmane51c0582015-10-06 00:27:55 +000050; CHECK-LABEL: test1:
51; CHECK: loop
Dan Gohman442bfce2016-02-16 16:22:41 +000052; CHECK-NEXT: block
Dan Gohman12de0b92016-05-17 20:19:47 +000053; CHECK: i32.lt_s
Dan Gohman8fe7e862015-12-14 22:51:54 +000054; CHECK-NEXT: br_if
Dan Gohman442bfce2016-02-16 16:22:41 +000055; CHECK-NEXT: return
Heejin Ahnace7a082019-04-23 21:17:03 +000056; CHECK-NEXT: .LBB{{[0-9]+}}_3:
Dan Gohman442bfce2016-02-16 16:22:41 +000057; CHECK-NEXT: end_block
Reid Klecknerbb865232016-08-15 18:51:42 +000058; CHECK-NEXT: i32.const
59; CHECK-NEXT: i32.add
Dan Gohman442bfce2016-02-16 16:22:41 +000060; CHECK-NEXT: call
61; CHECK-NEXT: br
Heejin Ahnace7a082019-04-23 21:17:03 +000062; CHECK-NEXT: .LBB{{[0-9]+}}_4:
Dan Gohman442bfce2016-02-16 16:22:41 +000063; CHECK-NEXT: end_loop
Dan Gohman950a13c2015-09-16 16:51:30 +000064define void @test1(i32 %n) {
65entry:
66 br label %header
67
68header:
69 %i = phi i32 [ 0, %entry ], [ %i.next, %back ]
70 %i.next = add i32 %i, 1
71
72 %c = icmp sge i32 %i.next, %n
73 br i1 %c, label %exit, label %back
74
75exit:
76 ret void
77
78back:
79 call void @something()
80 br label %header
81}
82
83; Test that a simple loop is handled as expected.
84
Dan Gohmane51c0582015-10-06 00:27:55 +000085; CHECK-LABEL: test2:
Dan Gohman8f59cf72016-01-06 18:29:35 +000086; CHECK-NOT: local
Dan Gohman2726b882016-10-06 22:29:32 +000087; CHECK: block {{$}}
Dan Gohman06b49582016-02-08 21:50:13 +000088; CHECK: br_if 0, {{[^,]+}}{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +000089; CHECK: .LBB{{[0-9]+}}_{{[0-9]+}}:
Dan Gohman12de0b92016-05-17 20:19:47 +000090; CHECK: loop
91; CHECK: br_if 0, $pop{{[0-9]+}}{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +000092; CHECK: .LBB{{[0-9]+}}_{{[0-9]+}}:
Dan Gohman12de0b92016-05-17 20:19:47 +000093; CHECK: end_loop
94; CHECK: end_block
Dan Gohmane51c0582015-10-06 00:27:55 +000095; CHECK: return{{$}}
Dan Gohman950a13c2015-09-16 16:51:30 +000096define void @test2(double* nocapture %p, i32 %n) {
97entry:
98 %cmp.4 = icmp sgt i32 %n, 0
99 br i1 %cmp.4, label %for.body.preheader, label %for.end
100
101for.body.preheader:
102 br label %for.body
103
104for.body:
105 %i.05 = phi i32 [ %inc, %for.body ], [ 0, %for.body.preheader ]
106 %arrayidx = getelementptr inbounds double, double* %p, i32 %i.05
107 %0 = load double, double* %arrayidx, align 8
108 %mul = fmul double %0, 3.200000e+00
109 store double %mul, double* %arrayidx, align 8
110 %inc = add nuw nsw i32 %i.05, 1
111 %exitcond = icmp eq i32 %inc, %n
112 br i1 %exitcond, label %for.end.loopexit, label %for.body
113
114for.end.loopexit:
115 br label %for.end
116
117for.end:
118 ret void
119}
120
Dan Gohmane51c0582015-10-06 00:27:55 +0000121; CHECK-LABEL: doublediamond:
Dan Gohman2726b882016-10-06 22:29:32 +0000122; CHECK: block {{$}}
123; CHECK-NEXT: block {{$}}
Dan Gohman06b49582016-02-08 21:50:13 +0000124; CHECK: br_if 0, ${{[^,]+}}{{$}}
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000125; CHECK: br 1{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000126; CHECK: .LBB{{[0-9]+}}_2:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000127; CHECK-NEXT: end_block{{$}}
Dan Gohman2726b882016-10-06 22:29:32 +0000128; CHECK: block {{$}}
Dan Gohman06b49582016-02-08 21:50:13 +0000129; CHECK: br_if 0, ${{[^,]+}}{{$}}
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000130; CHECK: br 1{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000131; CHECK: .LBB{{[0-9]+}}_4:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000132; CHECK-NEXT: end_block{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000133; CHECK: .LBB{{[0-9]+}}_5:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000134; CHECK-NEXT: end_block{{$}}
Dan Gohmanb6fd39a2016-01-19 16:59:23 +0000135; CHECK: i32.const $push{{[0-9]+}}=, 0{{$}}
136; CHECK-NEXT: return $pop{{[0-9]+}}{{$}}
Dan Gohman950a13c2015-09-16 16:51:30 +0000137define i32 @doublediamond(i32 %a, i32 %b, i32* %p) {
138entry:
139 %c = icmp eq i32 %a, 0
140 %d = icmp eq i32 %b, 0
141 store volatile i32 0, i32* %p
142 br i1 %c, label %true, label %false
143true:
144 store volatile i32 1, i32* %p
145 br label %exit
146false:
147 store volatile i32 2, i32* %p
148 br i1 %d, label %ft, label %ff
149ft:
150 store volatile i32 3, i32* %p
151 br label %exit
152ff:
153 store volatile i32 4, i32* %p
154 br label %exit
155exit:
156 store volatile i32 5, i32* %p
157 ret i32 0
158}
159
Dan Gohmane51c0582015-10-06 00:27:55 +0000160; CHECK-LABEL: triangle:
Dan Gohman2726b882016-10-06 22:29:32 +0000161; CHECK: block {{$}}
Dan Gohman06b49582016-02-08 21:50:13 +0000162; CHECK: br_if 0, $1{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000163; CHECK: .LBB{{[0-9]+}}_2:
Dan Gohmanc9623db2016-08-18 17:51:27 +0000164; CHECK: return
Dan Gohman950a13c2015-09-16 16:51:30 +0000165define i32 @triangle(i32* %p, i32 %a) {
166entry:
167 %c = icmp eq i32 %a, 0
168 store volatile i32 0, i32* %p
169 br i1 %c, label %true, label %exit
170true:
171 store volatile i32 1, i32* %p
172 br label %exit
173exit:
174 store volatile i32 2, i32* %p
175 ret i32 0
176}
177
Dan Gohmane51c0582015-10-06 00:27:55 +0000178; CHECK-LABEL: diamond:
Dan Gohman2726b882016-10-06 22:29:32 +0000179; CHECK: block {{$}}
180; CHECK: block {{$}}
Dan Gohman06b49582016-02-08 21:50:13 +0000181; CHECK: br_if 0, $1{{$}}
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000182; CHECK: br 1{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000183; CHECK: .LBB{{[0-9]+}}_2:
184; CHECK: .LBB{{[0-9]+}}_3:
Dan Gohmanb6fd39a2016-01-19 16:59:23 +0000185; CHECK: i32.const $push{{[0-9]+}}=, 0{{$}}
186; CHECK-NEXT: return $pop{{[0-9]+}}{{$}}
Dan Gohman950a13c2015-09-16 16:51:30 +0000187define i32 @diamond(i32* %p, i32 %a) {
188entry:
189 %c = icmp eq i32 %a, 0
190 store volatile i32 0, i32* %p
191 br i1 %c, label %true, label %false
192true:
193 store volatile i32 1, i32* %p
194 br label %exit
195false:
196 store volatile i32 2, i32* %p
197 br label %exit
198exit:
199 store volatile i32 3, i32* %p
200 ret i32 0
201}
202
Dan Gohmane51c0582015-10-06 00:27:55 +0000203; CHECK-LABEL: single_block:
Dan Gohman950a13c2015-09-16 16:51:30 +0000204; CHECK-NOT: br
Dan Gohman81719f82015-11-25 16:55:01 +0000205; CHECK: return $pop{{[0-9]+}}{{$}}
Dan Gohman950a13c2015-09-16 16:51:30 +0000206define i32 @single_block(i32* %p) {
207entry:
208 store volatile i32 0, i32* %p
209 ret i32 0
210}
211
Dan Gohmane51c0582015-10-06 00:27:55 +0000212; CHECK-LABEL: minimal_loop:
Dan Gohman950a13c2015-09-16 16:51:30 +0000213; CHECK-NOT: br
Heejin Ahnace7a082019-04-23 21:17:03 +0000214; CHECK: .LBB{{[0-9]+}}_1:
Dan Gohman2726b882016-10-06 22:29:32 +0000215; CHECK: loop i32
Dan Gohman7f1bdb22016-10-06 22:08:28 +0000216; CHECK: i32.store 0($0), $pop{{[0-9]+}}{{$}}
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000217; CHECK: br 0{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000218; CHECK: .LBB{{[0-9]+}}_2:
Dan Gohman2726b882016-10-06 22:29:32 +0000219define i32 @minimal_loop(i32* %p) {
Dan Gohman950a13c2015-09-16 16:51:30 +0000220entry:
221 store volatile i32 0, i32* %p
222 br label %loop
223loop:
224 store volatile i32 1, i32* %p
225 br label %loop
226}
227
Dan Gohmane51c0582015-10-06 00:27:55 +0000228; CHECK-LABEL: simple_loop:
Dan Gohman950a13c2015-09-16 16:51:30 +0000229; CHECK-NOT: br
Heejin Ahnace7a082019-04-23 21:17:03 +0000230; CHECK: .LBB{{[0-9]+}}_1:
Dan Gohman2726b882016-10-06 22:29:32 +0000231; CHECK: loop {{$}}
Dan Gohman06b49582016-02-08 21:50:13 +0000232; CHECK: br_if 0, $pop{{[0-9]+}}{{$}}
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000233; CHECK-NEXT: end_loop{{$}}
Dan Gohmanb6fd39a2016-01-19 16:59:23 +0000234; CHECK: i32.const $push{{[0-9]+}}=, 0{{$}}
235; CHECK-NEXT: return $pop{{[0-9]+}}{{$}}
Dan Gohman950a13c2015-09-16 16:51:30 +0000236define i32 @simple_loop(i32* %p, i32 %a) {
237entry:
238 %c = icmp eq i32 %a, 0
239 store volatile i32 0, i32* %p
240 br label %loop
241loop:
242 store volatile i32 1, i32* %p
243 br i1 %c, label %loop, label %exit
244exit:
245 store volatile i32 2, i32* %p
246 ret i32 0
247}
248
Dan Gohmane51c0582015-10-06 00:27:55 +0000249; CHECK-LABEL: doubletriangle:
Dan Gohman2726b882016-10-06 22:29:32 +0000250; CHECK: block {{$}}
Dan Gohman06b49582016-02-08 21:50:13 +0000251; CHECK: br_if 0, $0{{$}}
Dan Gohman2726b882016-10-06 22:29:32 +0000252; CHECK: block {{$}}
Dan Gohman06b49582016-02-08 21:50:13 +0000253; CHECK: br_if 0, $1{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000254; CHECK: .LBB{{[0-9]+}}_3:
255; CHECK: .LBB{{[0-9]+}}_4:
Dan Gohmanc9623db2016-08-18 17:51:27 +0000256; CHECK: return
Dan Gohman950a13c2015-09-16 16:51:30 +0000257define i32 @doubletriangle(i32 %a, i32 %b, i32* %p) {
258entry:
259 %c = icmp eq i32 %a, 0
260 %d = icmp eq i32 %b, 0
261 store volatile i32 0, i32* %p
262 br i1 %c, label %true, label %exit
263true:
264 store volatile i32 2, i32* %p
265 br i1 %d, label %tt, label %tf
266tt:
267 store volatile i32 3, i32* %p
268 br label %tf
269tf:
270 store volatile i32 4, i32* %p
271 br label %exit
272exit:
273 store volatile i32 5, i32* %p
274 ret i32 0
275}
276
Dan Gohmane51c0582015-10-06 00:27:55 +0000277; CHECK-LABEL: ifelse_earlyexits:
Dan Gohman2726b882016-10-06 22:29:32 +0000278; CHECK: block {{$}}
279; CHECK: block {{$}}
Dan Gohman06b49582016-02-08 21:50:13 +0000280; CHECK: br_if 0, $0{{$}}
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000281; CHECK: br 1{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000282; CHECK: .LBB{{[0-9]+}}_2:
Dan Gohman06b49582016-02-08 21:50:13 +0000283; CHECK: br_if 0, $1{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000284; CHECK: .LBB{{[0-9]+}}_4:
Dan Gohmanb6fd39a2016-01-19 16:59:23 +0000285; CHECK: i32.const $push{{[0-9]+}}=, 0{{$}}
286; CHECK-NEXT: return $pop{{[0-9]+}}{{$}}
Dan Gohman950a13c2015-09-16 16:51:30 +0000287define i32 @ifelse_earlyexits(i32 %a, i32 %b, i32* %p) {
288entry:
289 %c = icmp eq i32 %a, 0
290 %d = icmp eq i32 %b, 0
291 store volatile i32 0, i32* %p
292 br i1 %c, label %true, label %false
293true:
294 store volatile i32 1, i32* %p
295 br label %exit
296false:
297 store volatile i32 2, i32* %p
298 br i1 %d, label %ft, label %exit
299ft:
300 store volatile i32 3, i32* %p
301 br label %exit
302exit:
303 store volatile i32 4, i32* %p
304 ret i32 0
305}
Dan Gohmane3e4a5f2015-10-02 21:11:36 +0000306
Dan Gohman32807932015-11-23 16:19:56 +0000307; CHECK-LABEL: doublediamond_in_a_loop:
Heejin Ahnace7a082019-04-23 21:17:03 +0000308; CHECK: .LBB{{[0-9]+}}_1:
Dan Gohman2726b882016-10-06 22:29:32 +0000309; CHECK: loop i32{{$}}
310; CHECK: block {{$}}
Dan Gohman06b49582016-02-08 21:50:13 +0000311; CHECK: br_if 0, $0{{$}}
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000312; CHECK: br 1{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000313; CHECK: .LBB{{[0-9]+}}_3:
Dan Gohman0cfb5f82016-05-10 04:24:02 +0000314; CHECK: end_block{{$}}
Dan Gohman2726b882016-10-06 22:29:32 +0000315; CHECK: block {{$}}
Dan Gohman06b49582016-02-08 21:50:13 +0000316; CHECK: br_if 0, $1{{$}}
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000317; CHECK: br 1{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000318; CHECK: .LBB{{[0-9]+}}_5:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000319; CHECK: br 0{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000320; CHECK: .LBB{{[0-9]+}}_6:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000321; CHECK-NEXT: end_loop{{$}}
Dan Gohman2726b882016-10-06 22:29:32 +0000322define i32 @doublediamond_in_a_loop(i32 %a, i32 %b, i32* %p) {
Dan Gohman32807932015-11-23 16:19:56 +0000323entry:
324 br label %header
325header:
326 %c = icmp eq i32 %a, 0
327 %d = icmp eq i32 %b, 0
328 store volatile i32 0, i32* %p
329 br i1 %c, label %true, label %false
330true:
331 store volatile i32 1, i32* %p
332 br label %exit
333false:
334 store volatile i32 2, i32* %p
335 br i1 %d, label %ft, label %ff
336ft:
337 store volatile i32 3, i32* %p
338 br label %exit
339ff:
340 store volatile i32 4, i32* %p
341 br label %exit
342exit:
343 store volatile i32 5, i32* %p
344 br label %header
345}
346
Dan Gohmane3e4a5f2015-10-02 21:11:36 +0000347; Test that nested loops are handled.
348
Dan Gohman8fe7e862015-12-14 22:51:54 +0000349; CHECK-LABEL: test3:
350; CHECK: loop
351; CHECK-NEXT: br_if
Dan Gohmana4730cf2016-01-07 18:49:53 +0000352; CHECK-NEXT: .LBB{{[0-9]+}}_{{[0-9]+}}:
Dan Gohman8fe7e862015-12-14 22:51:54 +0000353; CHECK-NEXT: loop
Dan Gohmane3e4a5f2015-10-02 21:11:36 +0000354declare void @bar()
Simon Pilgrim918d0c22019-03-15 11:13:26 +0000355define void @test3(i32 %w, i32 %x) {
Dan Gohmane3e4a5f2015-10-02 21:11:36 +0000356entry:
357 br i1 undef, label %outer.ph, label %exit
358
359outer.ph:
360 br label %outer
361
362outer:
Simon Pilgrim918d0c22019-03-15 11:13:26 +0000363 %tobool = icmp eq i32 %x, 0
Dan Gohmane3e4a5f2015-10-02 21:11:36 +0000364 br i1 %tobool, label %inner, label %unreachable
365
366unreachable:
367 unreachable
368
369inner:
Simon Pilgrim918d0c22019-03-15 11:13:26 +0000370 %c = icmp eq i32 %x, %w
Dan Gohmane3e4a5f2015-10-02 21:11:36 +0000371 br i1 %c, label %if.end, label %inner
372
373exit:
374 ret void
375
376if.end:
377 call void @bar()
378 br label %outer
379}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000380
381; Test switch lowering and block placement.
382
383; CHECK-LABEL: test4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000384; CHECK-NEXT: .functype test4 (i32) -> (){{$}}
Dan Gohman2726b882016-10-06 22:29:32 +0000385; CHECK: block {{$}}
386; CHECK-NEXT: block {{$}}
Heejin Ahnb9f282d2019-04-23 21:30:30 +0000387; CHECK: br_if 0, $pop{{[0-9]+}}{{$}}
388; CHECK: br 1{{$}}
389; CHECK-NEXT: .LBB{{[0-9]+}}_2:
390; CHECK-NEXT: end_block{{$}}
391; CHECK-NEXT: br_table $0, 0, 0, 0, 0, 0, 0{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000392; CHECK-NEXT: .LBB{{[0-9]+}}_3:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000393; CHECK-NEXT: end_block{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000394; CHECK-NEXT: return{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000395define void @test4(i32 %t) {
396entry:
397 switch i32 %t, label %default [
398 i32 0, label %bb2
399 i32 2, label %bb2
400 i32 4, label %bb1
401 i32 622, label %bb0
402 ]
403
404bb0:
405 ret void
406
407bb1:
408 ret void
409
410bb2:
411 ret void
412
413default:
414 ret void
415}
416
417; Test a case where the BLOCK needs to be placed before the LOOP in the
418; same basic block.
419
420; CHECK-LABEL: test5:
Heejin Ahnace7a082019-04-23 21:17:03 +0000421; CHECK: .LBB{{[0-9]+}}_1:
Dan Gohman2726b882016-10-06 22:29:32 +0000422; CHECK-NEXT: block {{$}}
423; CHECK-NEXT: loop {{$}}
Dan Gohman3a643e82016-10-06 22:10:23 +0000424; CHECK: br_if 1, {{[^,]+}}{{$}}
Dan Gohman06b49582016-02-08 21:50:13 +0000425; CHECK: br_if 0, {{[^,]+}}{{$}}
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000426; CHECK-NEXT: end_loop{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000427; CHECK: return{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000428; CHECK-NEXT: .LBB{{[0-9]+}}_4:
Dan Gohman8fe7e862015-12-14 22:51:54 +0000429; CHECK: return{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000430define void @test5(i1 %p, i1 %q) {
431entry:
432 br label %header
433
434header:
435 store volatile i32 0, i32* null
436 br i1 %p, label %more, label %alt
437
438more:
439 store volatile i32 1, i32* null
440 br i1 %q, label %header, label %return
441
442alt:
443 store volatile i32 2, i32* null
444 ret void
445
446return:
447 store volatile i32 3, i32* null
448 ret void
449}
450
451; Test an interesting case of a loop with multiple exits, which
452; aren't to layout successors of the loop, and one of which is to a successors
453; which has another predecessor.
454
455; CHECK-LABEL: test6:
Heejin Ahnace7a082019-04-23 21:17:03 +0000456; CHECK: .LBB{{[0-9]+}}_1:
Dan Gohman2726b882016-10-06 22:29:32 +0000457; CHECK-NEXT: block {{$}}
458; CHECK-NEXT: block {{$}}
459; CHECK-NEXT: loop {{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000460; CHECK-NOT: block
Dan Gohman06b49582016-02-08 21:50:13 +0000461; CHECK: br_if 2, {{[^,]+}}{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000462; CHECK-NOT: block
Dan Gohman3a643e82016-10-06 22:10:23 +0000463; CHECK: br_if 1, {{[^,]+}}{{$}}
464; CHECK-NOT: block
Dan Gohman06b49582016-02-08 21:50:13 +0000465; CHECK: br_if 0, {{[^,]+}}{{$}}
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000466; CHECK-NEXT: end_loop{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000467; CHECK-NOT: block
468; CHECK: return{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000469; CHECK-NEXT: .LBB{{[0-9]+}}_5:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000470; CHECK-NEXT: end_block{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000471; CHECK-NOT: block
Heejin Ahnace7a082019-04-23 21:17:03 +0000472; CHECK: .LBB{{[0-9]+}}_6:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000473; CHECK-NEXT: end_block{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000474; CHECK-NOT: block
475; CHECK: return{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000476define void @test6(i1 %p, i1 %q) {
477entry:
478 br label %header
479
480header:
481 store volatile i32 0, i32* null
482 br i1 %p, label %more, label %second
483
484more:
485 store volatile i32 1, i32* null
486 br i1 %q, label %evenmore, label %first
487
488evenmore:
489 store volatile i32 1, i32* null
490 br i1 %q, label %header, label %return
491
492return:
493 store volatile i32 2, i32* null
494 ret void
495
496first:
497 store volatile i32 3, i32* null
498 br label %second
499
500second:
501 store volatile i32 4, i32* null
502 ret void
503}
504
505; Test a case where there are multiple backedges and multiple loop exits
506; that end in unreachable.
507
508; CHECK-LABEL: test7:
Heejin Ahnace7a082019-04-23 21:17:03 +0000509; CHECK: .LBB{{[0-9]+}}_1:
Dan Gohman2726b882016-10-06 22:29:32 +0000510; CHECK-NEXT: loop {{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000511; CHECK-NOT: block
Dan Gohman2726b882016-10-06 22:29:32 +0000512; CHECK: block {{$}}
Dan Gohman06b49582016-02-08 21:50:13 +0000513; CHECK: br_if 0, {{[^,]+}}{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000514; CHECK-NOT: block
Dan Gohman06b49582016-02-08 21:50:13 +0000515; CHECK: br_if 1, {{[^,]+}}{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000516; CHECK-NOT: block
517; CHECK: unreachable
Heejin Ahnace7a082019-04-23 21:17:03 +0000518; CHECK-NEXT: .LBB{{[0-9]+}}_4:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000519; CHECK-NEXT: end_block{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000520; CHECK-NOT: block
Dan Gohman06b49582016-02-08 21:50:13 +0000521; CHECK: br_if 0, {{[^,]+}}{{$}}
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000522; CHECK-NEXT: end_loop{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000523; CHECK-NOT: block
524; CHECK: unreachable
Dan Gohman8fe7e862015-12-14 22:51:54 +0000525define void @test7(i1 %tobool2, i1 %tobool9) {
526entry:
527 store volatile i32 0, i32* null
528 br label %loop
529
530loop:
531 store volatile i32 1, i32* null
532 br i1 %tobool2, label %l1, label %l0
533
534l0:
535 store volatile i32 2, i32* null
536 br i1 %tobool9, label %loop, label %u0
537
538l1:
539 store volatile i32 3, i32* null
540 br i1 %tobool9, label %loop, label %u1
541
542u0:
543 store volatile i32 4, i32* null
544 unreachable
545
546u1:
547 store volatile i32 5, i32* null
548 unreachable
549}
550
551; Test an interesting case using nested loops and switches.
552
553; CHECK-LABEL: test8:
Heejin Ahnace7a082019-04-23 21:17:03 +0000554; CHECK: .LBB{{[0-9]+}}_1:
Dan Gohman2726b882016-10-06 22:29:32 +0000555; CHECK-NEXT: loop i32{{$}}
Dan Gohmane5d3c152016-01-20 05:55:09 +0000556; CHECK-NEXT: i32.const $push{{[^,]+}}, 0{{$}}
Dan Gohman06b49582016-02-08 21:50:13 +0000557; CHECK-NEXT: br_if 0, {{[^,]+}}{{$}}
Dan Gohman0cfb5f82016-05-10 04:24:02 +0000558; CHECK-NEXT: br 0{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000559; CHECK-NEXT: .LBB{{[0-9]+}}_2:
Dan Gohman0cfb5f82016-05-10 04:24:02 +0000560; CHECK-NEXT: end_loop{{$}}
Dan Gohman2726b882016-10-06 22:29:32 +0000561define i32 @test8() {
Dan Gohman8fe7e862015-12-14 22:51:54 +0000562bb:
563 br label %bb1
564
565bb1:
566 br i1 undef, label %bb2, label %bb3
567
568bb2:
569 switch i8 undef, label %bb1 [
570 i8 44, label %bb2
571 ]
572
573bb3:
574 switch i8 undef, label %bb1 [
575 i8 44, label %bb2
576 ]
577}
578
579; Test an interesting case using nested loops that share a bottom block.
580
581; CHECK-LABEL: test9:
Heejin Ahnace7a082019-04-23 21:17:03 +0000582; CHECK: .LBB{{[0-9]+}}_1:
Dan Gohman2726b882016-10-06 22:29:32 +0000583; CHECK-NEXT: block {{$}}
584; CHECK-NEXT: loop {{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000585; CHECK-NOT: block
Dan Gohman06b49582016-02-08 21:50:13 +0000586; CHECK: br_if 1, {{[^,]+}}{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000587; CHECK-NEXT: .LBB{{[0-9]+}}_2:
Dan Gohman2726b882016-10-06 22:29:32 +0000588; CHECK-NEXT: loop {{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000589; CHECK-NOT: block
Dan Gohman2726b882016-10-06 22:29:32 +0000590; CHECK: block {{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000591; CHECK-NOT: block
Dan Gohman06b49582016-02-08 21:50:13 +0000592; CHECK: br_if 0, {{[^,]+}}{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000593; CHECK-NOT: block
Dan Gohman3a643e82016-10-06 22:10:23 +0000594; CHECK: br_if 2, {{[^,]+}}{{$}}
Dan Gohmand85ab7f2016-02-18 06:32:53 +0000595; CHECK-NEXT: br 1{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000596; CHECK-NEXT: .LBB{{[0-9]+}}_4:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000597; CHECK-NEXT: end_block{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000598; CHECK-NOT: block
Dan Gohman3a643e82016-10-06 22:10:23 +0000599; CHECK: br_if 1, {{[^,]+}}{{$}}
Dan Gohmand85ab7f2016-02-18 06:32:53 +0000600; CHECK-NEXT: br 0{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000601; CHECK-NEXT: .LBB{{[0-9]+}}_5:
Dan Gohman8fe7e862015-12-14 22:51:54 +0000602; CHECK-NOT: block
Dan Gohman3a643e82016-10-06 22:10:23 +0000603; CHECK: end_block
604; CHECK-NOT: block
Dan Gohman8fe7e862015-12-14 22:51:54 +0000605; CHECK: return{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000606declare i1 @a()
607define void @test9() {
608entry:
609 store volatile i32 0, i32* null
610 br label %header
611
612header:
613 store volatile i32 1, i32* null
614 %call4 = call i1 @a()
615 br i1 %call4, label %header2, label %end
616
617header2:
618 store volatile i32 2, i32* null
619 %call = call i1 @a()
620 br i1 %call, label %if.then, label %if.else
621
622if.then:
623 store volatile i32 3, i32* null
624 %call3 = call i1 @a()
625 br i1 %call3, label %header2, label %header
626
627if.else:
628 store volatile i32 4, i32* null
629 %call2 = call i1 @a()
630 br i1 %call2, label %header2, label %header
631
632end:
633 store volatile i32 5, i32* null
634 ret void
635}
636
637; Test an interesting case involving nested loops sharing a loop bottom,
638; and loop exits to a block with unreachable.
639
640; CHECK-LABEL: test10:
Heejin Ahnace7a082019-04-23 21:17:03 +0000641; CHECK: .LBB{{[0-9]+}}_1:
Dan Gohman2726b882016-10-06 22:29:32 +0000642; CHECK-NEXT: loop {{$}}
Heejin Ahnb9f282d2019-04-23 21:30:30 +0000643; CHECK: br_if 0, {{[^,]+}}{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000644; CHECK: .LBB{{[0-9]+}}_3:
Dan Gohman2726b882016-10-06 22:29:32 +0000645; CHECK-NEXT: block {{$}}
646; CHECK-NEXT: loop {{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000647; CHECK: .LBB{{[0-9]+}}_4:
Dan Gohman2726b882016-10-06 22:29:32 +0000648; CHECK-NEXT: loop {{$}}
Heejin Ahnb9f282d2019-04-23 21:30:30 +0000649; CHECK: br_if 0, {{[^,]+}}{{$}}
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000650; CHECK-NEXT: end_loop{{$}}
Heejin Ahnb9f282d2019-04-23 21:30:30 +0000651; CHECK-NEXT: block {{$}}
652; CHECK: br_if 0, {{[^,]+}}{{$}}
653; CHECK: br 3{{$}}
654; CHECK-NEXT: .LBB{{[0-9]+}}_7:
655; CHECK-NEXT: end_block{{$}}
656; CHECK: block {{$}}
657; CHECK-NEXT: br_table $0, 0, 3, 1, 2, 0
658; CHECK-NEXT: .LBB{{[0-9]+}}_8:
659; CHECK-NEXT: end_block{{$}}
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000660; CHECK-NEXT: end_loop{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000661; CHECK-NEXT: return{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000662; CHECK-NEXT: .LBB{{[0-9]+}}_9:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000663; CHECK-NEXT: end_block{{$}}
Heejin Ahnb9f282d2019-04-23 21:30:30 +0000664; CHECK: br 0{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000665; CHECK-NEXT: .LBB{{[0-9]+}}_10:
Heejin Ahnb9f282d2019-04-23 21:30:30 +0000666; CHECK-NEXT: end_loop{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000667define void @test10() {
668bb0:
669 br label %bb1
670
671bb1:
672 %tmp = phi i32 [ 2, %bb0 ], [ 3, %bb3 ]
673 %tmp3 = phi i32 [ undef, %bb0 ], [ %tmp11, %bb3 ]
674 %tmp4 = icmp eq i32 %tmp3, 0
675 br i1 %tmp4, label %bb4, label %bb2
676
677bb2:
678 br label %bb3
679
680bb3:
681 %tmp11 = phi i32 [ 1, %bb5 ], [ 0, %bb2 ]
682 br label %bb1
683
684bb4:
685 %tmp6 = phi i32 [ %tmp9, %bb5 ], [ 4, %bb1 ]
686 %tmp7 = phi i32 [ %tmp6, %bb5 ], [ %tmp, %bb1 ]
687 br label %bb5
688
689bb5:
690 %tmp9 = phi i32 [ %tmp6, %bb5 ], [ %tmp7, %bb4 ]
691 switch i32 %tmp9, label %bb2 [
692 i32 0, label %bb5
693 i32 1, label %bb6
694 i32 3, label %bb4
695 i32 4, label %bb3
696 ]
697
698bb6:
699 ret void
700}
701
702; Test a CFG DAG with interesting merging.
703
704; CHECK-LABEL: test11:
Dan Gohman2726b882016-10-06 22:29:32 +0000705; CHECK: block {{$}}
706; CHECK-NEXT: block {{$}}
707; CHECK-NEXT: block {{$}}
708; CHECK-NEXT: block {{$}}
Dan Gohman06b49582016-02-08 21:50:13 +0000709; CHECK: br_if 0, {{[^,]+}}{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000710; CHECK-NOT: block
Dan Gohman2726b882016-10-06 22:29:32 +0000711; CHECK: block {{$}}
Dan Gohmanc9623db2016-08-18 17:51:27 +0000712; CHECK-NEXT: i32.const
Dan Gohman06b49582016-02-08 21:50:13 +0000713; CHECK-NEXT: br_if 0, {{[^,]+}}{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000714; CHECK-NOT: block
Dan Gohman06b49582016-02-08 21:50:13 +0000715; CHECK: br_if 2, {{[^,]+}}{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000716; CHECK-NEXT: .LBB{{[0-9]+}}_3:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000717; CHECK-NEXT: end_block{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000718; CHECK-NOT: block
719; CHECK: return{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000720; CHECK-NEXT: .LBB{{[0-9]+}}_4:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000721; CHECK-NEXT: end_block{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000722; CHECK-NOT: block
Dan Gohman06b49582016-02-08 21:50:13 +0000723; CHECK: br_if 1, {{[^,]+}}{{$}}
Dan Gohman442bfce2016-02-16 16:22:41 +0000724; CHECK-NOT: block
725; CHECK: br_if 2, {{[^,]+}}{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000726; CHECK-NEXT: .LBB{{[0-9]+}}_6:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000727; CHECK-NEXT: end_block{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000728; CHECK-NOT: block
729; CHECK: return{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000730; CHECK-NEXT: .LBB{{[0-9]+}}_7:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000731; CHECK-NEXT: end_block{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000732; CHECK-NOT: block
733; CHECK: return{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000734; CHECK-NEXT: .LBB{{[0-9]+}}_8:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000735; CHECK-NEXT: end_block{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000736; CHECK-NOT: block
737; CHECK: return{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000738define void @test11() {
739bb0:
740 store volatile i32 0, i32* null
741 br i1 undef, label %bb1, label %bb4
742bb1:
743 store volatile i32 1, i32* null
744 br i1 undef, label %bb3, label %bb2
745bb2:
746 store volatile i32 2, i32* null
747 br i1 undef, label %bb3, label %bb7
748bb3:
749 store volatile i32 3, i32* null
750 ret void
751bb4:
752 store volatile i32 4, i32* null
753 br i1 undef, label %bb8, label %bb5
754bb5:
755 store volatile i32 5, i32* null
756 br i1 undef, label %bb6, label %bb7
757bb6:
758 store volatile i32 6, i32* null
759 ret void
760bb7:
761 store volatile i32 7, i32* null
762 ret void
763bb8:
764 store volatile i32 8, i32* null
765 ret void
766}
767
768; CHECK-LABEL: test12:
Heejin Ahnace7a082019-04-23 21:17:03 +0000769; CHECK: .LBB{{[0-9]+}}_1:
Dan Gohman2726b882016-10-06 22:29:32 +0000770; CHECK-NEXT: loop {{$}}
Dan Gohman2726b882016-10-06 22:29:32 +0000771; CHECK-NEXT: block {{$}}
Heejin Ahnb9f282d2019-04-23 21:30:30 +0000772; CHECK-NEXT: block {{$}}
773; CHECK-NEXT: block {{$}}
774; CHECK: br_if 0, {{[^,]+}}{{$}}
775; CHECK: br_if 2, {{[^,]+}}{{$}}
776; CHECK: br_if 1, {{[^,]+}}{{$}}
777; CHECK-NEXT: br 2{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000778; CHECK-NEXT: .LBB{{[0-9]+}}_4:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000779; CHECK-NEXT: end_block{{$}}
Heejin Ahnb9f282d2019-04-23 21:30:30 +0000780; CHECK-NEXT: br_table $2, 1, 0, 0, 0, 1, 1{{$}}
781; CHECK-NEXT: .LBB{{[0-9]+}}_5:
Dan Gohman3a643e82016-10-06 22:10:23 +0000782; CHECK-NEXT: end_block{{$}}
Dan Gohman442bfce2016-02-16 16:22:41 +0000783; CHECK-NEXT: return{{$}}
Heejin Ahnb9f282d2019-04-23 21:30:30 +0000784; CHECK-NEXT: .LBB{{[0-9]+}}_6:
785; CHECK-NEXT: end_block{{$}}
786; CHECK: br 0{{$}}
787; CHECK-NEXT: .LBB{{[0-9]+}}_7:
788; CHECK-NEXT: end_loop{{$}}
Dan Gohman8fe7e862015-12-14 22:51:54 +0000789define void @test12(i8* %arg) {
790bb:
791 br label %bb1
792
793bb1:
794 %tmp = phi i32 [ 0, %bb ], [ %tmp5, %bb4 ]
795 %tmp2 = getelementptr i8, i8* %arg, i32 %tmp
796 %tmp3 = load i8, i8* %tmp2
797 switch i8 %tmp3, label %bb7 [
798 i8 42, label %bb4
799 i8 76, label %bb4
800 i8 108, label %bb4
801 i8 104, label %bb4
802 ]
803
804bb4:
805 %tmp5 = add i32 %tmp, 1
806 br label %bb1
807
808bb7:
809 ret void
810}
Dan Gohmanb3aa1ec2015-12-16 19:06:41 +0000811
812; A block can be "branched to" from another even if it is also reachable via
813; fallthrough from the other. This would normally be optimized away, so use
814; optnone to disable optimizations to test this case.
815
816; CHECK-LABEL: test13:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000817; CHECK: block {{$}}
Dan Gohman2726b882016-10-06 22:29:32 +0000818; CHECK-NEXT: block {{$}}
Dan Gohman442bfce2016-02-16 16:22:41 +0000819; CHECK: br_if 0, $pop0{{$}}
Dan Gohman2726b882016-10-06 22:29:32 +0000820; CHECK: block {{$}}
Dan Gohman442bfce2016-02-16 16:22:41 +0000821; CHECK: br_if 0, $pop3{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000822; CHECK: .LBB{{[0-9]+}}_3:
Dan Gohman442bfce2016-02-16 16:22:41 +0000823; CHECK-NEXT: end_block{{$}}
824; CHECK: br_if 1, $pop{{[0-9]+}}{{$}}
825; CHECK-NEXT: br 1{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000826; CHECK-NEXT: .LBB{{[0-9]+}}_4:
Dan Gohman442bfce2016-02-16 16:22:41 +0000827; CHECK-NEXT: end_block{{$}}
Dan Gohmanb3aa1ec2015-12-16 19:06:41 +0000828; CHECK-NEXT: return{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000829; CHECK-NEXT: .LBB{{[0-9]+}}_5:
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000830; CHECK-NEXT: end_block{{$}}
Dan Gohmanb3aa1ec2015-12-16 19:06:41 +0000831; CHECK-NEXT: unreachable{{$}}
Dan Gohmanb3aa1ec2015-12-16 19:06:41 +0000832define void @test13() noinline optnone {
833bb:
834 br i1 undef, label %bb5, label %bb2
835bb1:
836 unreachable
837bb2:
838 br i1 undef, label %bb3, label %bb4
839bb3:
840 br label %bb4
841bb4:
842 %tmp = phi i1 [ false, %bb2 ], [ false, %bb3 ]
843 br i1 %tmp, label %bb1, label %bb1
844bb5:
845 ret void
846}
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000847
848; Test a case with a single-block loop that has another loop
849; as a successor. The end_loop for the first loop should go
850; before the loop for the second.
851
852; CHECK-LABEL: test14:
Heejin Ahnace7a082019-04-23 21:17:03 +0000853; CHECK: .LBB{{[0-9]+}}_1:{{$}}
Dan Gohman2726b882016-10-06 22:29:32 +0000854; CHECK-NEXT: loop {{$}}
Dan Gohmanb6fd39a2016-01-19 16:59:23 +0000855; CHECK-NEXT: i32.const $push0=, 0{{$}}
Dan Gohman06b49582016-02-08 21:50:13 +0000856; CHECK-NEXT: br_if 0, $pop0{{$}}
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000857; CHECK-NEXT: end_loop{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000858; CHECK-NEXT: .LBB{{[0-9]+}}_3:{{$}}
Dan Gohman2726b882016-10-06 22:29:32 +0000859; CHECK-NEXT: loop {{$}}
Dan Gohmanb6fd39a2016-01-19 16:59:23 +0000860; CHECK-NEXT: i32.const $push1=, 0{{$}}
Dan Gohman06b49582016-02-08 21:50:13 +0000861; CHECK-NEXT: br_if 0, $pop1{{$}}
Dan Gohman1d68e80f2016-01-12 19:14:46 +0000862; CHECK-NEXT: end_loop{{$}}
863; CHECK-NEXT: return{{$}}
864define void @test14() {
865bb:
866 br label %bb1
867
868bb1:
869 %tmp = bitcast i1 undef to i1
870 br i1 %tmp, label %bb3, label %bb1
871
872bb3:
873 br label %bb4
874
875bb4:
876 br i1 undef, label %bb7, label %bb48
877
878bb7:
879 br i1 undef, label %bb12, label %bb12
880
881bb12:
882 br i1 undef, label %bb17, label %bb17
883
884bb17:
885 br i1 undef, label %bb22, label %bb22
886
887bb22:
888 br i1 undef, label %bb27, label %bb27
889
890bb27:
891 br i1 undef, label %bb30, label %bb30
892
893bb30:
894 br i1 undef, label %bb35, label %bb35
895
896bb35:
897 br i1 undef, label %bb38, label %bb38
898
899bb38:
900 br i1 undef, label %bb48, label %bb48
901
902bb48:
903 %tmp49 = bitcast i1 undef to i1
904 br i1 %tmp49, label %bb3, label %bb50
905
906bb50:
907 ret void
908}
Dan Gohmana187ab22016-02-12 21:19:25 +0000909
910; Test that a block boundary which ends one block, begins another block, and
911; also begins a loop, has the markers placed in the correct order.
912
913; CHECK-LABEL: test15:
914; CHECK: block
Dan Gohmana187ab22016-02-12 21:19:25 +0000915; CHECK-NEXT: block
Dan Gohman442bfce2016-02-16 16:22:41 +0000916; CHECK: br_if 0, $pop{{.*}}{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000917; CHECK: .LBB{{[0-9]+}}_2:
Dan Gohman2726b882016-10-06 22:29:32 +0000918; CHECK-NEXT: block {{$}}
919; CHECK-NEXT: block {{$}}
920; CHECK-NEXT: loop {{$}}
Dan Gohman442bfce2016-02-16 16:22:41 +0000921; CHECK: br_if 1, $pop{{.*}}{{$}}
Dan Gohmand85ab7f2016-02-18 06:32:53 +0000922; CHECK: br_if 0, ${{.*}}{{$}}
923; CHECK-NEXT: br 2{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000924; CHECK-NEXT: .LBB{{[0-9]+}}_4:
Dan Gohman442bfce2016-02-16 16:22:41 +0000925; CHECK-NEXT: end_loop{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000926; CHECK: .LBB{{[0-9]+}}_5:
Dan Gohman442bfce2016-02-16 16:22:41 +0000927; CHECK-NEXT: end_block{{$}}
928; CHECK: br_if 1, $pop{{.*}}{{$}}
929; CHECK: return{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000930; CHECK: .LBB{{[0-9]+}}_7:
Dan Gohman442bfce2016-02-16 16:22:41 +0000931; CHECK-NEXT: end_block{{$}}
Heejin Ahnace7a082019-04-23 21:17:03 +0000932; CHECK: .LBB{{[0-9]+}}_8:
Dan Gohmand85ab7f2016-02-18 06:32:53 +0000933; CHECK-NEXT: end_block{{$}}
Dan Gohman442bfce2016-02-16 16:22:41 +0000934; CHECK-NEXT: return{{$}}
Dan Gohmana187ab22016-02-12 21:19:25 +0000935%0 = type { i8, i32 }
936declare void @test15_callee0()
937declare void @test15_callee1()
938define void @test15() {
939bb:
940 %tmp1 = icmp eq i8 1, 0
941 br i1 %tmp1, label %bb2, label %bb14
942
943bb2:
944 %tmp3 = phi %0** [ %tmp6, %bb5 ], [ null, %bb ]
945 %tmp4 = icmp eq i32 0, 11
946 br i1 %tmp4, label %bb5, label %bb8
947
948bb5:
949 %tmp = bitcast i8* null to %0**
950 %tmp6 = getelementptr %0*, %0** %tmp3, i32 1
951 %tmp7 = icmp eq %0** %tmp6, null
952 br i1 %tmp7, label %bb10, label %bb2
953
954bb8:
955 %tmp9 = icmp eq %0** null, undef
956 br label %bb10
957
958bb10:
959 %tmp11 = phi %0** [ null, %bb8 ], [ %tmp, %bb5 ]
960 %tmp12 = icmp eq %0** null, %tmp11
961 br i1 %tmp12, label %bb15, label %bb13
962
963bb13:
964 call void @test15_callee0()
965 ret void
966
967bb14:
968 call void @test15_callee1()
969 ret void
970
971bb15:
972 ret void
973}