1; RUN: llc < %s -asm-verbose=false | FileCheck %s
2
3; Test switch instructions.
4
5target datalayout = "e-p:32:32-i64:64-n32:64-S128"
6target triple = "wasm32-unknown-unknown"
7
8declare void @foo0()
9declare void @foo1()
10declare void @foo2()
11declare void @foo3()
12declare void @foo4()
13declare void @foo5()
14
15; CHECK-LABEL: bar32
16; CHECK: (block $BB0_8)
17; CHECK: (block $BB0_7)
18; CHECK: (block $BB0_6)
19; CHECK: (block $BB0_5)
20; CHECK: (block $BB0_4)
21; CHECK: (block $BB0_3)
22; CHECK: (block $BB0_2)
23; CHECK: (switch {{.*}} $BB0_2 $BB0_2 $BB0_2 $BB0_2 $BB0_2 $BB0_2 $BB0_2 $BB0_2 $BB0_3 $BB0_3 $BB0_3 $BB0_3 $BB0_3 $BB0_3 $BB0_3 $BB0_3 $BB0_4 $BB0_4 $BB0_4 $BB0_4 $BB0_4 $BB0_4 $BB0_5 $BB0_6 $BB0_7)
24; CHECk: BB0_2:
25; CHECK:   (call $foo0)
26; CHECK: BB0_3:
27; CHECK:   (call $foo1)
28; CHECK: BB0_4:
29; CHECK:   (call $foo2)
30; CHECK: BB0_5:
31; CHECK:   (call $foo3)
32; CHECK: BB0_6:
33; CHECK:   (call $foo4)
34; CHECK: BB0_7:
35; CHECK:   (call $foo5)
36; CHECK: BB0_8:
37; CHECK:   (return)
38define void @bar32(i32 %n) {
39entry:
40  switch i32 %n, label %sw.epilog [
41    i32 0, label %sw.bb
42    i32 1, label %sw.bb
43    i32 2, label %sw.bb
44    i32 3, label %sw.bb
45    i32 4, label %sw.bb
46    i32 5, label %sw.bb
47    i32 6, label %sw.bb
48    i32 7, label %sw.bb.1
49    i32 8, label %sw.bb.1
50    i32 9, label %sw.bb.1
51    i32 10, label %sw.bb.1
52    i32 11, label %sw.bb.1
53    i32 12, label %sw.bb.1
54    i32 13, label %sw.bb.1
55    i32 14, label %sw.bb.1
56    i32 15, label %sw.bb.2
57    i32 16, label %sw.bb.2
58    i32 17, label %sw.bb.2
59    i32 18, label %sw.bb.2
60    i32 19, label %sw.bb.2
61    i32 20, label %sw.bb.2
62    i32 21, label %sw.bb.3
63    i32 22, label %sw.bb.4
64    i32 23, label %sw.bb.5
65  ]
66
67sw.bb:                                            ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry
68  tail call void @foo0()
69  br label %sw.epilog
70
71sw.bb.1:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry
72  tail call void @foo1()
73  br label %sw.epilog
74
75sw.bb.2:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry
76  tail call void @foo2()
77  br label %sw.epilog
78
79sw.bb.3:                                          ; preds = %entry
80  tail call void @foo3()
81  br label %sw.epilog
82
83sw.bb.4:                                          ; preds = %entry
84  tail call void @foo4()
85  br label %sw.epilog
86
87sw.bb.5:                                          ; preds = %entry
88  tail call void @foo5()
89  br label %sw.epilog
90
91sw.epilog:                                        ; preds = %entry, %sw.bb.5, %sw.bb.4, %sw.bb.3, %sw.bb.2, %sw.bb.1, %sw.bb
92  ret void
93}
94
95; CHECK-LABEL: bar64
96; CHECK: (block $BB1_8)
97; CHECK: (block $BB1_7)
98; CHECK: (block $BB1_6)
99; CHECK: (block $BB1_5)
100; CHECK: (block $BB1_4)
101; CHECK: (block $BB1_3)
102; CHECK: (block $BB1_2)
103; CHECK: (switch {{.*}} $BB1_2 $BB1_2 $BB1_2 $BB1_2 $BB1_2 $BB1_2 $BB1_2 $BB1_2 $BB1_3 $BB1_3 $BB1_3 $BB1_3 $BB1_3 $BB1_3 $BB1_3 $BB1_3 $BB1_4 $BB1_4 $BB1_4 $BB1_4 $BB1_4 $BB1_4 $BB1_5 $BB1_6 $BB1_7)
104; CHECk: BB1_2:
105; CHECK:   (call $foo0)
106; CHECK: BB1_3:
107; CHECK:   (call $foo1)
108; CHECK: BB1_4:
109; CHECK:   (call $foo2)
110; CHECK: BB1_5:
111; CHECK:   (call $foo3)
112; CHECK: BB1_6:
113; CHECK:   (call $foo4)
114; CHECK: BB1_7:
115; CHECK:   (call $foo5)
116; CHECK: BB1_8:
117; CHECK:   (return)
118define void @bar64(i64 %n) {
119entry:
120  switch i64 %n, label %sw.epilog [
121    i64 0, label %sw.bb
122    i64 1, label %sw.bb
123    i64 2, label %sw.bb
124    i64 3, label %sw.bb
125    i64 4, label %sw.bb
126    i64 5, label %sw.bb
127    i64 6, label %sw.bb
128    i64 7, label %sw.bb.1
129    i64 8, label %sw.bb.1
130    i64 9, label %sw.bb.1
131    i64 10, label %sw.bb.1
132    i64 11, label %sw.bb.1
133    i64 12, label %sw.bb.1
134    i64 13, label %sw.bb.1
135    i64 14, label %sw.bb.1
136    i64 15, label %sw.bb.2
137    i64 16, label %sw.bb.2
138    i64 17, label %sw.bb.2
139    i64 18, label %sw.bb.2
140    i64 19, label %sw.bb.2
141    i64 20, label %sw.bb.2
142    i64 21, label %sw.bb.3
143    i64 22, label %sw.bb.4
144    i64 23, label %sw.bb.5
145  ]
146
147sw.bb:                                            ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry
148  tail call void @foo0()
149  br label %sw.epilog
150
151sw.bb.1:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry
152  tail call void @foo1()
153  br label %sw.epilog
154
155sw.bb.2:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry
156  tail call void @foo2()
157  br label %sw.epilog
158
159sw.bb.3:                                          ; preds = %entry
160  tail call void @foo3()
161  br label %sw.epilog
162
163sw.bb.4:                                          ; preds = %entry
164  tail call void @foo4()
165  br label %sw.epilog
166
167sw.bb.5:                                          ; preds = %entry
168  tail call void @foo5()
169  br label %sw.epilog
170
171sw.epilog:                                        ; preds = %entry, %sw.bb.5, %sw.bb.4, %sw.bb.3, %sw.bb.2, %sw.bb.1, %sw.bb
172  ret void
173}
174