8e49fd120e57f343e77d5e39edfb9f47ecf19368
[oota-llvm.git] / test / CodeGen / WebAssembly / switch.ll
1 ; RUN: llc < %s -asm-verbose=false | FileCheck %s
2
3 ; Test switch instructions.
4
5 target datalayout = "e-p:32:32-i64:64-n32:64-S128"
6 target triple = "wasm32-unknown-unknown"
7
8 declare void @foo0()
9 declare void @foo1()
10 declare void @foo2()
11 declare void @foo3()
12 declare void @foo4()
13 declare 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{{$}}
38 define void @bar32(i32 %n) {
39 entry:
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
67 sw.bb:                                            ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry
68   tail call void @foo0()
69   br label %sw.epilog
70
71 sw.bb.1:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry
72   tail call void @foo1()
73   br label %sw.epilog
74
75 sw.bb.2:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry
76   tail call void @foo2()
77   br label %sw.epilog
78
79 sw.bb.3:                                          ; preds = %entry
80   tail call void @foo3()
81   br label %sw.epilog
82
83 sw.bb.4:                                          ; preds = %entry
84   tail call void @foo4()
85   br label %sw.epilog
86
87 sw.bb.5:                                          ; preds = %entry
88   tail call void @foo5()
89   br label %sw.epilog
90
91 sw.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{{$}}
118 define void @bar64(i64 %n) {
119 entry:
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
147 sw.bb:                                            ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry
148   tail call void @foo0()
149   br label %sw.epilog
150
151 sw.bb.1:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry
152   tail call void @foo1()
153   br label %sw.epilog
154
155 sw.bb.2:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry
156   tail call void @foo2()
157   br label %sw.epilog
158
159 sw.bb.3:                                          ; preds = %entry
160   tail call void @foo3()
161   br label %sw.epilog
162
163 sw.bb.4:                                          ; preds = %entry
164   tail call void @foo4()
165   br label %sw.epilog
166
167 sw.bb.5:                                          ; preds = %entry
168   tail call void @foo5()
169   br label %sw.epilog
170
171 sw.epilog:                                        ; preds = %entry, %sw.bb.5, %sw.bb.4, %sw.bb.3, %sw.bb.2, %sw.bb.1, %sw.bb
172   ret void
173 }