Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / WebAssembly / switch.ll
blob717ddcda6f321ba3537568fbed3e98f6510c7cc5
1 ; RUN: llc < %s --mtriple=wasm32-unknown-unknown -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -disable-block-placement -verify-machineinstrs | FileCheck %s
2 ; RUN: llc < %s --mtriple=wasm64-unknown-unknown -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -disable-block-placement -verify-machineinstrs | FileCheck %s
4 ; Test switch instructions. Block placement is disabled because it reorders
5 ; the blocks in a way that isn't interesting here.
7 declare void @foo0()
8 declare void @foo1()
9 declare void @foo2()
10 declare void @foo3()
11 declare void @foo4()
12 declare void @foo5()
14 ; CHECK-LABEL: bar32:
15 ; CHECK:      block   {{$}}
16 ; CHECK:      block   {{$}}
17 ; CHECK:      block   {{$}}
18 ; CHECK:      block   {{$}}
19 ; CHECK:      block   {{$}}
20 ; CHECK:      block   {{$}}
21 ; CHECK:      block   {{$}}
22 ; CHECK-NEXT: br_table {{[^,]+}}, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 4, 5, 6{{$}}
23 ; CHECK:      .LBB{{[0-9]+}}_1:
24 ; CHECK:        call foo0{{$}}
25 ; CHECK:      .LBB{{[0-9]+}}_2:
26 ; CHECK:        call foo1{{$}}
27 ; CHECK:      .LBB{{[0-9]+}}_3:
28 ; CHECK:        call foo2{{$}}
29 ; CHECK:      .LBB{{[0-9]+}}_4:
30 ; CHECK:        call foo3{{$}}
31 ; CHECK:      .LBB{{[0-9]+}}_5:
32 ; CHECK:        call foo4{{$}}
33 ; CHECK:      .LBB{{[0-9]+}}_6:
34 ; CHECK:        call foo5{{$}}
35 ; CHECK:      .LBB{{[0-9]+}}_7:
36 ; CHECK:        return{{$}}
37 define void @bar32(i32 %n) {
38 entry:
39   switch i32 %n, label %sw.epilog [
40     i32 0, label %sw.bb
41     i32 1, label %sw.bb
42     i32 2, label %sw.bb
43     i32 3, label %sw.bb
44     i32 4, label %sw.bb
45     i32 5, label %sw.bb
46     i32 6, label %sw.bb
47     i32 7, label %sw.bb.1
48     i32 8, label %sw.bb.1
49     i32 9, label %sw.bb.1
50     i32 10, label %sw.bb.1
51     i32 11, label %sw.bb.1
52     i32 12, label %sw.bb.1
53     i32 13, label %sw.bb.1
54     i32 14, label %sw.bb.1
55     i32 15, label %sw.bb.2
56     i32 16, label %sw.bb.2
57     i32 17, label %sw.bb.2
58     i32 18, label %sw.bb.2
59     i32 19, label %sw.bb.2
60     i32 20, label %sw.bb.2
61     i32 21, label %sw.bb.3
62     i32 22, label %sw.bb.4
63     i32 23, label %sw.bb.5
64   ]
66 sw.bb:                                            ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry
67   tail call void @foo0()
68   br label %sw.epilog
70 sw.bb.1:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry
71   tail call void @foo1()
72   br label %sw.epilog
74 sw.bb.2:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry
75   tail call void @foo2()
76   br label %sw.epilog
78 sw.bb.3:                                          ; preds = %entry
79   tail call void @foo3()
80   br label %sw.epilog
82 sw.bb.4:                                          ; preds = %entry
83   tail call void @foo4()
84   br label %sw.epilog
86 sw.bb.5:                                          ; preds = %entry
87   tail call void @foo5()
88   br label %sw.epilog
90 sw.epilog:                                        ; preds = %entry, %sw.bb.5, %sw.bb.4, %sw.bb.3, %sw.bb.2, %sw.bb.1, %sw.bb
91   ret void
94 ; CHECK-LABEL: bar64:
95 ; CHECK:      block   {{$}}
96 ; CHECK:      i64.const
97 ; CHECK:      i64.gt_u
98 ; CHECK:      br_if 0
99 ; CHECK:      block   {{$}}
100 ; CHECK:      block   {{$}}
101 ; CHECK:      block   {{$}}
102 ; CHECK:      block   {{$}}
103 ; CHECK:      block   {{$}}
104 ; CHECK:      block   {{$}}
105 ; CHECK:      i32.wrap_i64
106 ; CHECK-NEXT: br_table {{[^,]+}}, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 4, 5, 0{{$}}
107 ; CHECK:      .LBB{{[0-9]+}}_2:
108 ; CHECK:        call foo0{{$}}
109 ; CHECK:      .LBB{{[0-9]+}}_3:
110 ; CHECK:        call foo1{{$}}
111 ; CHECK:      .LBB{{[0-9]+}}_4:
112 ; CHECK:        call foo2{{$}}
113 ; CHECK:      .LBB{{[0-9]+}}_5:
114 ; CHECK:        call foo3{{$}}
115 ; CHECK:      .LBB{{[0-9]+}}_6:
116 ; CHECK:        call foo4{{$}}
117 ; CHECK:      .LBB{{[0-9]+}}_7:
118 ; CHECK:        call foo5{{$}}
119 ; CHECK:      .LBB{{[0-9]+}}_8:
120 ; CHECK:        return{{$}}
121 define void @bar64(i64 %n) {
122 entry:
123   switch i64 %n, label %sw.epilog [
124     i64 0, label %sw.bb
125     i64 1, label %sw.bb
126     i64 2, label %sw.bb
127     i64 3, label %sw.bb
128     i64 4, label %sw.bb
129     i64 5, label %sw.bb
130     i64 6, label %sw.bb
131     i64 7, label %sw.bb.1
132     i64 8, label %sw.bb.1
133     i64 9, label %sw.bb.1
134     i64 10, label %sw.bb.1
135     i64 11, label %sw.bb.1
136     i64 12, label %sw.bb.1
137     i64 13, label %sw.bb.1
138     i64 14, label %sw.bb.1
139     i64 15, label %sw.bb.2
140     i64 16, label %sw.bb.2
141     i64 17, label %sw.bb.2
142     i64 18, label %sw.bb.2
143     i64 19, label %sw.bb.2
144     i64 20, label %sw.bb.2
145     i64 21, label %sw.bb.3
146     i64 22, label %sw.bb.4
147     i64 23, label %sw.bb.5
148   ]
150 sw.bb:                                            ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry
151   tail call void @foo0()
152   br label %sw.epilog
154 sw.bb.1:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry
155   tail call void @foo1()
156   br label %sw.epilog
158 sw.bb.2:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry
159   tail call void @foo2()
160   br label %sw.epilog
162 sw.bb.3:                                          ; preds = %entry
163   tail call void @foo3()
164   br label %sw.epilog
166 sw.bb.4:                                          ; preds = %entry
167   tail call void @foo4()
168   br label %sw.epilog
170 sw.bb.5:                                          ; preds = %entry
171   tail call void @foo5()
172   br label %sw.epilog
174 sw.epilog:                                        ; preds = %entry, %sw.bb.5, %sw.bb.4, %sw.bb.3, %sw.bb.2, %sw.bb.1, %sw.bb
175   ret void
178 ; CHECK-LABEL: truncated:
179 ; CHECK:        block
180 ; CHECK:        block
181 ; CHECK:        block
182 ; CHECK:        i32.wrap_i64
183 ; CHECK-NEXT:   br_table {{[^,]+}}, 0, 1, 2{{$}}
184 ; CHECK:      .LBB{{[0-9]+}}_1
185 ; CHECK:        end_block
186 ; CHECK:        call foo0{{$}}
187 ; CHECK:        return{{$}}
188 ; CHECK:      .LBB{{[0-9]+}}_2
189 ; CHECK:        end_block
190 ; CHECK:        call foo1{{$}}
191 ; CHECK:        return{{$}}
192 ; CHECK:      .LBB{{[0-9]+}}_3
193 ; CHECK:        end_block
194 ; CHECK:        call foo2{{$}}
195 ; CHECK:        return{{$}}
196 ; CHECK:        end_function
197 define void @truncated(i64 %n) {
198 entry:
199   %m = trunc i64 %n to i32
200   switch i32 %m, label %default [
201     i32 0, label %bb1
202     i32 1, label %bb2
203   ]
205 bb1:
206   tail call void @foo0()
207   ret void
209 bb2:
210   tail call void @foo1()
211   ret void
213 default:
214   tail call void @foo2()
215   ret void