xref: /aosp_15_r20/external/llvm/test/CodeGen/WebAssembly/switch.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -disable-block-placement -verify-machineinstrs | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Test switch instructions. Block placement is disabled because it reorders
4*9880d681SAndroid Build Coastguard Worker; the blocks in a way that isn't interesting here.
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
7*9880d681SAndroid Build Coastguard Workertarget triple = "wasm32-unknown-unknown"
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdeclare void @foo0()
10*9880d681SAndroid Build Coastguard Workerdeclare void @foo1()
11*9880d681SAndroid Build Coastguard Workerdeclare void @foo2()
12*9880d681SAndroid Build Coastguard Workerdeclare void @foo3()
13*9880d681SAndroid Build Coastguard Workerdeclare void @foo4()
14*9880d681SAndroid Build Coastguard Workerdeclare void @foo5()
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bar32:
17*9880d681SAndroid Build Coastguard Worker; CHECK: block{{$}}
18*9880d681SAndroid Build Coastguard Worker; CHECK: block{{$}}
19*9880d681SAndroid Build Coastguard Worker; CHECK: block{{$}}
20*9880d681SAndroid Build Coastguard Worker; CHECK: block{{$}}
21*9880d681SAndroid Build Coastguard Worker; CHECK: block{{$}}
22*9880d681SAndroid Build Coastguard Worker; CHECK: block{{$}}
23*9880d681SAndroid Build Coastguard Worker; CHECK: block{{$}}
24*9880d681SAndroid Build Coastguard Worker; CHECK: 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{{$}}
25*9880d681SAndroid Build Coastguard Worker; CHECK: .LBB0_2:
26*9880d681SAndroid Build Coastguard Worker; CHECK:   call foo0@FUNCTION{{$}}
27*9880d681SAndroid Build Coastguard Worker; CHECK: .LBB0_3:
28*9880d681SAndroid Build Coastguard Worker; CHECK:   call foo1@FUNCTION{{$}}
29*9880d681SAndroid Build Coastguard Worker; CHECK: .LBB0_4:
30*9880d681SAndroid Build Coastguard Worker; CHECK:   call foo2@FUNCTION{{$}}
31*9880d681SAndroid Build Coastguard Worker; CHECK: .LBB0_5:
32*9880d681SAndroid Build Coastguard Worker; CHECK:   call foo3@FUNCTION{{$}}
33*9880d681SAndroid Build Coastguard Worker; CHECK: .LBB0_6:
34*9880d681SAndroid Build Coastguard Worker; CHECK:   call foo4@FUNCTION{{$}}
35*9880d681SAndroid Build Coastguard Worker; CHECK: .LBB0_7:
36*9880d681SAndroid Build Coastguard Worker; CHECK:   call foo5@FUNCTION{{$}}
37*9880d681SAndroid Build Coastguard Worker; CHECK: .LBB0_8:
38*9880d681SAndroid Build Coastguard Worker; CHECK:   return{{$}}
39*9880d681SAndroid Build Coastguard Workerdefine void @bar32(i32 %n) {
40*9880d681SAndroid Build Coastguard Workerentry:
41*9880d681SAndroid Build Coastguard Worker  switch i32 %n, label %sw.epilog [
42*9880d681SAndroid Build Coastguard Worker    i32 0, label %sw.bb
43*9880d681SAndroid Build Coastguard Worker    i32 1, label %sw.bb
44*9880d681SAndroid Build Coastguard Worker    i32 2, label %sw.bb
45*9880d681SAndroid Build Coastguard Worker    i32 3, label %sw.bb
46*9880d681SAndroid Build Coastguard Worker    i32 4, label %sw.bb
47*9880d681SAndroid Build Coastguard Worker    i32 5, label %sw.bb
48*9880d681SAndroid Build Coastguard Worker    i32 6, label %sw.bb
49*9880d681SAndroid Build Coastguard Worker    i32 7, label %sw.bb.1
50*9880d681SAndroid Build Coastguard Worker    i32 8, label %sw.bb.1
51*9880d681SAndroid Build Coastguard Worker    i32 9, label %sw.bb.1
52*9880d681SAndroid Build Coastguard Worker    i32 10, label %sw.bb.1
53*9880d681SAndroid Build Coastguard Worker    i32 11, label %sw.bb.1
54*9880d681SAndroid Build Coastguard Worker    i32 12, label %sw.bb.1
55*9880d681SAndroid Build Coastguard Worker    i32 13, label %sw.bb.1
56*9880d681SAndroid Build Coastguard Worker    i32 14, label %sw.bb.1
57*9880d681SAndroid Build Coastguard Worker    i32 15, label %sw.bb.2
58*9880d681SAndroid Build Coastguard Worker    i32 16, label %sw.bb.2
59*9880d681SAndroid Build Coastguard Worker    i32 17, label %sw.bb.2
60*9880d681SAndroid Build Coastguard Worker    i32 18, label %sw.bb.2
61*9880d681SAndroid Build Coastguard Worker    i32 19, label %sw.bb.2
62*9880d681SAndroid Build Coastguard Worker    i32 20, label %sw.bb.2
63*9880d681SAndroid Build Coastguard Worker    i32 21, label %sw.bb.3
64*9880d681SAndroid Build Coastguard Worker    i32 22, label %sw.bb.4
65*9880d681SAndroid Build Coastguard Worker    i32 23, label %sw.bb.5
66*9880d681SAndroid Build Coastguard Worker  ]
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workersw.bb:                                            ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry
69*9880d681SAndroid Build Coastguard Worker  tail call void @foo0()
70*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workersw.bb.1:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry
73*9880d681SAndroid Build Coastguard Worker  tail call void @foo1()
74*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Workersw.bb.2:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry
77*9880d681SAndroid Build Coastguard Worker  tail call void @foo2()
78*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workersw.bb.3:                                          ; preds = %entry
81*9880d681SAndroid Build Coastguard Worker  tail call void @foo3()
82*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Workersw.bb.4:                                          ; preds = %entry
85*9880d681SAndroid Build Coastguard Worker  tail call void @foo4()
86*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workersw.bb.5:                                          ; preds = %entry
89*9880d681SAndroid Build Coastguard Worker  tail call void @foo5()
90*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Workersw.epilog:                                        ; preds = %entry, %sw.bb.5, %sw.bb.4, %sw.bb.3, %sw.bb.2, %sw.bb.1, %sw.bb
93*9880d681SAndroid Build Coastguard Worker  ret void
94*9880d681SAndroid Build Coastguard Worker}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bar64:
97*9880d681SAndroid Build Coastguard Worker; CHECK: block{{$}}
98*9880d681SAndroid Build Coastguard Worker; CHECK: block{{$}}
99*9880d681SAndroid Build Coastguard Worker; CHECK: block{{$}}
100*9880d681SAndroid Build Coastguard Worker; CHECK: block{{$}}
101*9880d681SAndroid Build Coastguard Worker; CHECK: block{{$}}
102*9880d681SAndroid Build Coastguard Worker; CHECK: block{{$}}
103*9880d681SAndroid Build Coastguard Worker; CHECK: block{{$}}
104*9880d681SAndroid Build Coastguard Worker; CHECK: 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{{$}}
105*9880d681SAndroid Build Coastguard Worker; CHECK: .LBB1_2:
106*9880d681SAndroid Build Coastguard Worker; CHECK:   call foo0@FUNCTION{{$}}
107*9880d681SAndroid Build Coastguard Worker; CHECK: .LBB1_3:
108*9880d681SAndroid Build Coastguard Worker; CHECK:   call foo1@FUNCTION{{$}}
109*9880d681SAndroid Build Coastguard Worker; CHECK: .LBB1_4:
110*9880d681SAndroid Build Coastguard Worker; CHECK:   call foo2@FUNCTION{{$}}
111*9880d681SAndroid Build Coastguard Worker; CHECK: .LBB1_5:
112*9880d681SAndroid Build Coastguard Worker; CHECK:   call foo3@FUNCTION{{$}}
113*9880d681SAndroid Build Coastguard Worker; CHECK: .LBB1_6:
114*9880d681SAndroid Build Coastguard Worker; CHECK:   call foo4@FUNCTION{{$}}
115*9880d681SAndroid Build Coastguard Worker; CHECK: .LBB1_7:
116*9880d681SAndroid Build Coastguard Worker; CHECK:   call foo5@FUNCTION{{$}}
117*9880d681SAndroid Build Coastguard Worker; CHECK: .LBB1_8:
118*9880d681SAndroid Build Coastguard Worker; CHECK:   return{{$}}
119*9880d681SAndroid Build Coastguard Workerdefine void @bar64(i64 %n) {
120*9880d681SAndroid Build Coastguard Workerentry:
121*9880d681SAndroid Build Coastguard Worker  switch i64 %n, label %sw.epilog [
122*9880d681SAndroid Build Coastguard Worker    i64 0, label %sw.bb
123*9880d681SAndroid Build Coastguard Worker    i64 1, label %sw.bb
124*9880d681SAndroid Build Coastguard Worker    i64 2, label %sw.bb
125*9880d681SAndroid Build Coastguard Worker    i64 3, label %sw.bb
126*9880d681SAndroid Build Coastguard Worker    i64 4, label %sw.bb
127*9880d681SAndroid Build Coastguard Worker    i64 5, label %sw.bb
128*9880d681SAndroid Build Coastguard Worker    i64 6, label %sw.bb
129*9880d681SAndroid Build Coastguard Worker    i64 7, label %sw.bb.1
130*9880d681SAndroid Build Coastguard Worker    i64 8, label %sw.bb.1
131*9880d681SAndroid Build Coastguard Worker    i64 9, label %sw.bb.1
132*9880d681SAndroid Build Coastguard Worker    i64 10, label %sw.bb.1
133*9880d681SAndroid Build Coastguard Worker    i64 11, label %sw.bb.1
134*9880d681SAndroid Build Coastguard Worker    i64 12, label %sw.bb.1
135*9880d681SAndroid Build Coastguard Worker    i64 13, label %sw.bb.1
136*9880d681SAndroid Build Coastguard Worker    i64 14, label %sw.bb.1
137*9880d681SAndroid Build Coastguard Worker    i64 15, label %sw.bb.2
138*9880d681SAndroid Build Coastguard Worker    i64 16, label %sw.bb.2
139*9880d681SAndroid Build Coastguard Worker    i64 17, label %sw.bb.2
140*9880d681SAndroid Build Coastguard Worker    i64 18, label %sw.bb.2
141*9880d681SAndroid Build Coastguard Worker    i64 19, label %sw.bb.2
142*9880d681SAndroid Build Coastguard Worker    i64 20, label %sw.bb.2
143*9880d681SAndroid Build Coastguard Worker    i64 21, label %sw.bb.3
144*9880d681SAndroid Build Coastguard Worker    i64 22, label %sw.bb.4
145*9880d681SAndroid Build Coastguard Worker    i64 23, label %sw.bb.5
146*9880d681SAndroid Build Coastguard Worker  ]
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Workersw.bb:                                            ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry
149*9880d681SAndroid Build Coastguard Worker  tail call void @foo0()
150*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workersw.bb.1:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry
153*9880d681SAndroid Build Coastguard Worker  tail call void @foo1()
154*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workersw.bb.2:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry
157*9880d681SAndroid Build Coastguard Worker  tail call void @foo2()
158*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Workersw.bb.3:                                          ; preds = %entry
161*9880d681SAndroid Build Coastguard Worker  tail call void @foo3()
162*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Workersw.bb.4:                                          ; preds = %entry
165*9880d681SAndroid Build Coastguard Worker  tail call void @foo4()
166*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Workersw.bb.5:                                          ; preds = %entry
169*9880d681SAndroid Build Coastguard Worker  tail call void @foo5()
170*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workersw.epilog:                                        ; preds = %entry, %sw.bb.5, %sw.bb.4, %sw.bb.3, %sw.bb.2, %sw.bb.1, %sw.bb
173*9880d681SAndroid Build Coastguard Worker  ret void
174*9880d681SAndroid Build Coastguard Worker}
175