xref: /llvm-project/llvm/test/CodeGen/RISCV/switch-width.ll (revision 9e1ad3cff6a855fdfdc1d91323e2021726da04ea)
1*4c4c5511SPhilip Reames; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*4c4c5511SPhilip Reames; RUN: llc < %s -O2 -mtriple=riscv64 | FileCheck %s
3*4c4c5511SPhilip Reames
4*4c4c5511SPhilip Reamesdefine i32 @native_i64(i64 %a)  {
5*4c4c5511SPhilip Reames; CHECK-LABEL: native_i64:
6*4c4c5511SPhilip Reames; CHECK:       # %bb.0: # %entry
7*4c4c5511SPhilip Reames; CHECK-NEXT:    li a1, -1
8*4c4c5511SPhilip Reames; CHECK-NEXT:    beq a0, a1, .LBB0_3
9*4c4c5511SPhilip Reames; CHECK-NEXT:  # %bb.1: # %entry
10*4c4c5511SPhilip Reames; CHECK-NEXT:    li a1, 1
11*4c4c5511SPhilip Reames; CHECK-NEXT:    bne a0, a1, .LBB0_4
12*4c4c5511SPhilip Reames; CHECK-NEXT:  # %bb.2: # %sw.bb0
13*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, 0
14*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
15*4c4c5511SPhilip Reames; CHECK-NEXT:  .LBB0_3: # %sw.bb1
16*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, 1
17*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
18*4c4c5511SPhilip Reames; CHECK-NEXT:  .LBB0_4: # %sw.default
19*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, -1
20*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
21*4c4c5511SPhilip Reamesentry:
22*4c4c5511SPhilip Reames  switch i64 %a, label %sw.default [
23*4c4c5511SPhilip Reames  i64 1, label %sw.bb0
24*4c4c5511SPhilip Reames  i64 -1, label %sw.bb1
25*4c4c5511SPhilip Reames  ]
26*4c4c5511SPhilip Reames
27*4c4c5511SPhilip Reamessw.bb0:
28*4c4c5511SPhilip Reames  br label %return
29*4c4c5511SPhilip Reames
30*4c4c5511SPhilip Reamessw.bb1:
31*4c4c5511SPhilip Reames  br label %return
32*4c4c5511SPhilip Reames
33*4c4c5511SPhilip Reamessw.default:
34*4c4c5511SPhilip Reames  br label %return
35*4c4c5511SPhilip Reames
36*4c4c5511SPhilip Reamesreturn:
37*4c4c5511SPhilip Reames  %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ]
38*4c4c5511SPhilip Reames  ret i32 %retval
39*4c4c5511SPhilip Reames}
40*4c4c5511SPhilip Reames
41*4c4c5511SPhilip Reamesdefine i32 @native_i32(i32 %a)  {
42*4c4c5511SPhilip Reames; CHECK-LABEL: native_i32:
43*4c4c5511SPhilip Reames; CHECK:       # %bb.0: # %entry
44*4c4c5511SPhilip Reames; CHECK-NEXT:    sext.w a0, a0
45*4c4c5511SPhilip Reames; CHECK-NEXT:    li a1, -1
46*4c4c5511SPhilip Reames; CHECK-NEXT:    beq a0, a1, .LBB1_3
47*4c4c5511SPhilip Reames; CHECK-NEXT:  # %bb.1: # %entry
48*4c4c5511SPhilip Reames; CHECK-NEXT:    li a1, 1
49*4c4c5511SPhilip Reames; CHECK-NEXT:    bne a0, a1, .LBB1_4
50*4c4c5511SPhilip Reames; CHECK-NEXT:  # %bb.2: # %sw.bb0
51*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, 0
52*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
53*4c4c5511SPhilip Reames; CHECK-NEXT:  .LBB1_3: # %sw.bb1
54*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, 1
55*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
56*4c4c5511SPhilip Reames; CHECK-NEXT:  .LBB1_4: # %sw.default
57*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, -1
58*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
59*4c4c5511SPhilip Reamesentry:
60*4c4c5511SPhilip Reames  switch i32 %a, label %sw.default [
61*4c4c5511SPhilip Reames  i32 1, label %sw.bb0
62*4c4c5511SPhilip Reames  i32 -1, label %sw.bb1
63*4c4c5511SPhilip Reames  ]
64*4c4c5511SPhilip Reames
65*4c4c5511SPhilip Reamessw.bb0:
66*4c4c5511SPhilip Reames  br label %return
67*4c4c5511SPhilip Reames
68*4c4c5511SPhilip Reamessw.bb1:
69*4c4c5511SPhilip Reames  br label %return
70*4c4c5511SPhilip Reames
71*4c4c5511SPhilip Reamessw.default:
72*4c4c5511SPhilip Reames  br label %return
73*4c4c5511SPhilip Reames
74*4c4c5511SPhilip Reamesreturn:
75*4c4c5511SPhilip Reames  %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ]
76*4c4c5511SPhilip Reames  ret i32 %retval
77*4c4c5511SPhilip Reames}
78*4c4c5511SPhilip Reames
79*4c4c5511SPhilip Reamesdefine i32 @trunc_i32(i64 %a)  {
80*4c4c5511SPhilip Reames; CHECK-LABEL: trunc_i32:
81*4c4c5511SPhilip Reames; CHECK:       # %bb.0: # %entry
82*4c4c5511SPhilip Reames; CHECK-NEXT:    sext.w a0, a0
83*4c4c5511SPhilip Reames; CHECK-NEXT:    li a1, -1
84*4c4c5511SPhilip Reames; CHECK-NEXT:    beq a0, a1, .LBB2_3
85*4c4c5511SPhilip Reames; CHECK-NEXT:  # %bb.1: # %entry
86*4c4c5511SPhilip Reames; CHECK-NEXT:    li a1, 1
87*4c4c5511SPhilip Reames; CHECK-NEXT:    bne a0, a1, .LBB2_4
88*4c4c5511SPhilip Reames; CHECK-NEXT:  # %bb.2: # %sw.bb0
89*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, 0
90*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
91*4c4c5511SPhilip Reames; CHECK-NEXT:  .LBB2_3: # %sw.bb1
92*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, 1
93*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
94*4c4c5511SPhilip Reames; CHECK-NEXT:  .LBB2_4: # %sw.default
95*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, -1
96*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
97*4c4c5511SPhilip Reamesentry:
98*4c4c5511SPhilip Reames  %trunc = trunc i64 %a to i32
99*4c4c5511SPhilip Reames  switch i32 %trunc, label %sw.default [
100*4c4c5511SPhilip Reames  i32 1, label %sw.bb0
101*4c4c5511SPhilip Reames  i32 -1, label %sw.bb1
102*4c4c5511SPhilip Reames  ]
103*4c4c5511SPhilip Reames
104*4c4c5511SPhilip Reamessw.bb0:
105*4c4c5511SPhilip Reames  br label %return
106*4c4c5511SPhilip Reames
107*4c4c5511SPhilip Reamessw.bb1:
108*4c4c5511SPhilip Reames  br label %return
109*4c4c5511SPhilip Reames
110*4c4c5511SPhilip Reamessw.default:
111*4c4c5511SPhilip Reames  br label %return
112*4c4c5511SPhilip Reames
113*4c4c5511SPhilip Reamesreturn:
114*4c4c5511SPhilip Reames  %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ]
115*4c4c5511SPhilip Reames  ret i32 %retval
116*4c4c5511SPhilip Reames}
117*4c4c5511SPhilip Reames
118*4c4c5511SPhilip Reamesdefine i32 @trunc_i17(i64 %a)  {
119*4c4c5511SPhilip Reames; CHECK-LABEL: trunc_i17:
120*4c4c5511SPhilip Reames; CHECK:       # %bb.0: # %entry
121*4c4c5511SPhilip Reames; CHECK-NEXT:    lui a1, 32
122*4c4c5511SPhilip Reames; CHECK-NEXT:    addiw a1, a1, -1
123*4c4c5511SPhilip Reames; CHECK-NEXT:    and a0, a0, a1
124*4c4c5511SPhilip Reames; CHECK-NEXT:    beq a0, a1, .LBB3_3
125*4c4c5511SPhilip Reames; CHECK-NEXT:  # %bb.1: # %entry
126*4c4c5511SPhilip Reames; CHECK-NEXT:    li a1, 1
127*4c4c5511SPhilip Reames; CHECK-NEXT:    bne a0, a1, .LBB3_4
128*4c4c5511SPhilip Reames; CHECK-NEXT:  # %bb.2: # %sw.bb0
129*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, 0
130*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
131*4c4c5511SPhilip Reames; CHECK-NEXT:  .LBB3_3: # %sw.bb1
132*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, 1
133*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
134*4c4c5511SPhilip Reames; CHECK-NEXT:  .LBB3_4: # %sw.default
135*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, -1
136*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
137*4c4c5511SPhilip Reamesentry:
138*4c4c5511SPhilip Reames  %trunc = trunc i64 %a to i17
139*4c4c5511SPhilip Reames  switch i17 %trunc, label %sw.default [
140*4c4c5511SPhilip Reames  i17 1, label %sw.bb0
141*4c4c5511SPhilip Reames  i17 -1, label %sw.bb1
142*4c4c5511SPhilip Reames  ]
143*4c4c5511SPhilip Reames
144*4c4c5511SPhilip Reamessw.bb0:
145*4c4c5511SPhilip Reames  br label %return
146*4c4c5511SPhilip Reames
147*4c4c5511SPhilip Reamessw.bb1:
148*4c4c5511SPhilip Reames  br label %return
149*4c4c5511SPhilip Reames
150*4c4c5511SPhilip Reamessw.default:
151*4c4c5511SPhilip Reames  br label %return
152*4c4c5511SPhilip Reames
153*4c4c5511SPhilip Reamesreturn:
154*4c4c5511SPhilip Reames  %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ]
155*4c4c5511SPhilip Reames  ret i32 %retval
156*4c4c5511SPhilip Reames}
157*4c4c5511SPhilip Reames
158*4c4c5511SPhilip Reamesdefine i32 @trunc_i16(i64 %a)  {
159*4c4c5511SPhilip Reames; CHECK-LABEL: trunc_i16:
160*4c4c5511SPhilip Reames; CHECK:       # %bb.0: # %entry
161*4c4c5511SPhilip Reames; CHECK-NEXT:    lui a1, 16
162*4c4c5511SPhilip Reames; CHECK-NEXT:    addiw a1, a1, -1
163*4c4c5511SPhilip Reames; CHECK-NEXT:    and a0, a0, a1
164*4c4c5511SPhilip Reames; CHECK-NEXT:    beq a0, a1, .LBB4_3
165*4c4c5511SPhilip Reames; CHECK-NEXT:  # %bb.1: # %entry
166*4c4c5511SPhilip Reames; CHECK-NEXT:    li a1, 1
167*4c4c5511SPhilip Reames; CHECK-NEXT:    bne a0, a1, .LBB4_4
168*4c4c5511SPhilip Reames; CHECK-NEXT:  # %bb.2: # %sw.bb0
169*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, 0
170*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
171*4c4c5511SPhilip Reames; CHECK-NEXT:  .LBB4_3: # %sw.bb1
172*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, 1
173*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
174*4c4c5511SPhilip Reames; CHECK-NEXT:  .LBB4_4: # %sw.default
175*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, -1
176*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
177*4c4c5511SPhilip Reamesentry:
178*4c4c5511SPhilip Reames  %trunc = trunc i64 %a to i16
179*4c4c5511SPhilip Reames  switch i16 %trunc, label %sw.default [
180*4c4c5511SPhilip Reames  i16 1, label %sw.bb0
181*4c4c5511SPhilip Reames  i16 -1, label %sw.bb1
182*4c4c5511SPhilip Reames  ]
183*4c4c5511SPhilip Reames
184*4c4c5511SPhilip Reamessw.bb0:
185*4c4c5511SPhilip Reames  br label %return
186*4c4c5511SPhilip Reames
187*4c4c5511SPhilip Reamessw.bb1:
188*4c4c5511SPhilip Reames  br label %return
189*4c4c5511SPhilip Reames
190*4c4c5511SPhilip Reamessw.default:
191*4c4c5511SPhilip Reames  br label %return
192*4c4c5511SPhilip Reames
193*4c4c5511SPhilip Reamesreturn:
194*4c4c5511SPhilip Reames  %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ]
195*4c4c5511SPhilip Reames  ret i32 %retval
196*4c4c5511SPhilip Reames}
197*4c4c5511SPhilip Reames
198*4c4c5511SPhilip Reames
199*4c4c5511SPhilip Reamesdefine i32 @trunc_i12(i64 %a)  {
200*4c4c5511SPhilip Reames; CHECK-LABEL: trunc_i12:
201*4c4c5511SPhilip Reames; CHECK:       # %bb.0: # %entry
202*4c4c5511SPhilip Reames; CHECK-NEXT:    lui a1, 1
203*4c4c5511SPhilip Reames; CHECK-NEXT:    addiw a1, a1, -1
204*4c4c5511SPhilip Reames; CHECK-NEXT:    and a0, a0, a1
205*4c4c5511SPhilip Reames; CHECK-NEXT:    beq a0, a1, .LBB5_3
206*4c4c5511SPhilip Reames; CHECK-NEXT:  # %bb.1: # %entry
207*4c4c5511SPhilip Reames; CHECK-NEXT:    li a1, 1
208*4c4c5511SPhilip Reames; CHECK-NEXT:    bne a0, a1, .LBB5_4
209*4c4c5511SPhilip Reames; CHECK-NEXT:  # %bb.2: # %sw.bb0
210*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, 0
211*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
212*4c4c5511SPhilip Reames; CHECK-NEXT:  .LBB5_3: # %sw.bb1
213*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, 1
214*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
215*4c4c5511SPhilip Reames; CHECK-NEXT:  .LBB5_4: # %sw.default
216*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, -1
217*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
218*4c4c5511SPhilip Reamesentry:
219*4c4c5511SPhilip Reames  %trunc = trunc i64 %a to i12
220*4c4c5511SPhilip Reames  switch i12 %trunc, label %sw.default [
221*4c4c5511SPhilip Reames  i12 1, label %sw.bb0
222*4c4c5511SPhilip Reames  i12 -1, label %sw.bb1
223*4c4c5511SPhilip Reames  ]
224*4c4c5511SPhilip Reames
225*4c4c5511SPhilip Reamessw.bb0:
226*4c4c5511SPhilip Reames  br label %return
227*4c4c5511SPhilip Reames
228*4c4c5511SPhilip Reamessw.bb1:
229*4c4c5511SPhilip Reames  br label %return
230*4c4c5511SPhilip Reames
231*4c4c5511SPhilip Reamessw.default:
232*4c4c5511SPhilip Reames  br label %return
233*4c4c5511SPhilip Reames
234*4c4c5511SPhilip Reamesreturn:
235*4c4c5511SPhilip Reames  %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ]
236*4c4c5511SPhilip Reames  ret i32 %retval
237*4c4c5511SPhilip Reames}
238*4c4c5511SPhilip Reames
239*4c4c5511SPhilip Reamesdefine i32 @trunc_i11(i64 %a)  {
240*4c4c5511SPhilip Reames; CHECK-LABEL: trunc_i11:
241*4c4c5511SPhilip Reames; CHECK:       # %bb.0: # %entry
242*4c4c5511SPhilip Reames; CHECK-NEXT:    andi a0, a0, 2047
243*4c4c5511SPhilip Reames; CHECK-NEXT:    li a1, 2047
244*4c4c5511SPhilip Reames; CHECK-NEXT:    beq a0, a1, .LBB6_3
245*4c4c5511SPhilip Reames; CHECK-NEXT:  # %bb.1: # %entry
246*4c4c5511SPhilip Reames; CHECK-NEXT:    li a1, 1
247*4c4c5511SPhilip Reames; CHECK-NEXT:    bne a0, a1, .LBB6_4
248*4c4c5511SPhilip Reames; CHECK-NEXT:  # %bb.2: # %sw.bb0
249*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, 0
250*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
251*4c4c5511SPhilip Reames; CHECK-NEXT:  .LBB6_3: # %sw.bb1
252*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, 1
253*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
254*4c4c5511SPhilip Reames; CHECK-NEXT:  .LBB6_4: # %sw.default
255*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, -1
256*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
257*4c4c5511SPhilip Reamesentry:
258*4c4c5511SPhilip Reames  %trunc = trunc i64 %a to i11
259*4c4c5511SPhilip Reames  switch i11 %trunc, label %sw.default [
260*4c4c5511SPhilip Reames  i11 1, label %sw.bb0
261*4c4c5511SPhilip Reames  i11 -1, label %sw.bb1
262*4c4c5511SPhilip Reames  ]
263*4c4c5511SPhilip Reames
264*4c4c5511SPhilip Reamessw.bb0:
265*4c4c5511SPhilip Reames  br label %return
266*4c4c5511SPhilip Reames
267*4c4c5511SPhilip Reamessw.bb1:
268*4c4c5511SPhilip Reames  br label %return
269*4c4c5511SPhilip Reames
270*4c4c5511SPhilip Reamessw.default:
271*4c4c5511SPhilip Reames  br label %return
272*4c4c5511SPhilip Reames
273*4c4c5511SPhilip Reamesreturn:
274*4c4c5511SPhilip Reames  %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ]
275*4c4c5511SPhilip Reames  ret i32 %retval
276*4c4c5511SPhilip Reames}
277*4c4c5511SPhilip Reames
278*4c4c5511SPhilip Reames
279*4c4c5511SPhilip Reamesdefine i32 @trunc_i10(i64 %a)  {
280*4c4c5511SPhilip Reames; CHECK-LABEL: trunc_i10:
281*4c4c5511SPhilip Reames; CHECK:       # %bb.0: # %entry
282*4c4c5511SPhilip Reames; CHECK-NEXT:    andi a0, a0, 1023
283*4c4c5511SPhilip Reames; CHECK-NEXT:    li a1, 1023
284*4c4c5511SPhilip Reames; CHECK-NEXT:    beq a0, a1, .LBB7_3
285*4c4c5511SPhilip Reames; CHECK-NEXT:  # %bb.1: # %entry
286*4c4c5511SPhilip Reames; CHECK-NEXT:    li a1, 1
287*4c4c5511SPhilip Reames; CHECK-NEXT:    bne a0, a1, .LBB7_4
288*4c4c5511SPhilip Reames; CHECK-NEXT:  # %bb.2: # %sw.bb0
289*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, 0
290*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
291*4c4c5511SPhilip Reames; CHECK-NEXT:  .LBB7_3: # %sw.bb1
292*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, 1
293*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
294*4c4c5511SPhilip Reames; CHECK-NEXT:  .LBB7_4: # %sw.default
295*4c4c5511SPhilip Reames; CHECK-NEXT:    li a0, -1
296*4c4c5511SPhilip Reames; CHECK-NEXT:    ret
297*4c4c5511SPhilip Reamesentry:
298*4c4c5511SPhilip Reames  %trunc = trunc i64 %a to i10
299*4c4c5511SPhilip Reames  switch i10 %trunc, label %sw.default [
300*4c4c5511SPhilip Reames  i10 1, label %sw.bb0
301*4c4c5511SPhilip Reames  i10 -1, label %sw.bb1
302*4c4c5511SPhilip Reames  ]
303*4c4c5511SPhilip Reames
304*4c4c5511SPhilip Reamessw.bb0:
305*4c4c5511SPhilip Reames  br label %return
306*4c4c5511SPhilip Reames
307*4c4c5511SPhilip Reamessw.bb1:
308*4c4c5511SPhilip Reames  br label %return
309*4c4c5511SPhilip Reames
310*4c4c5511SPhilip Reamessw.default:
311*4c4c5511SPhilip Reames  br label %return
312*4c4c5511SPhilip Reames
313*4c4c5511SPhilip Reamesreturn:
314*4c4c5511SPhilip Reames  %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ]
315*4c4c5511SPhilip Reames  ret i32 %retval
316*4c4c5511SPhilip Reames}
317