xref: /llvm-project/llvm/test/CodeGen/Mips/GlobalISel/llvm-ir/jump_table_and_brjt.ll (revision 6b2fd7aed66d592738f26c76caa8fff95e168598)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc  -O0 -mtriple=mipsel-linux-gnu -global-isel -verify-machineinstrs %s -o -| FileCheck %s -check-prefixes=MIPS32
3; RUN: llc  -O0 -mtriple=mipsel-linux-gnu -global-isel -relocation-model=pic -verify-machineinstrs %s -o -| FileCheck %s -check-prefixes=MIPS32_PIC
4
5define i32 @mod4_0_to_11(i32 %a) {
6; MIPS32-LABEL: mod4_0_to_11:
7; MIPS32:       # %bb.0: # %entry
8; MIPS32-NEXT:    addiu $sp, $sp, -32
9; MIPS32-NEXT:    .cfi_def_cfa_offset 32
10; MIPS32-NEXT:    sw $4, 4($sp) # 4-byte Folded Spill
11; MIPS32-NEXT:    ori $1, $zero, 7
12; MIPS32-NEXT:    ori $2, $zero, 3
13; MIPS32-NEXT:    sw $2, 8($sp) # 4-byte Folded Spill
14; MIPS32-NEXT:    ori $2, $zero, 2
15; MIPS32-NEXT:    sw $2, 12($sp) # 4-byte Folded Spill
16; MIPS32-NEXT:    ori $2, $zero, 1
17; MIPS32-NEXT:    sw $2, 16($sp) # 4-byte Folded Spill
18; MIPS32-NEXT:    ori $2, $zero, 0
19; MIPS32-NEXT:    sw $2, 20($sp) # 4-byte Folded Spill
20; MIPS32-NEXT:    addiu $2, $zero, 65535
21; MIPS32-NEXT:    sw $2, 24($sp) # 4-byte Folded Spill
22; MIPS32-NEXT:    ori $2, $zero, 0
23; MIPS32-NEXT:    subu $2, $4, $2
24; MIPS32-NEXT:    sw $2, 28($sp) # 4-byte Folded Spill
25; MIPS32-NEXT:    sltu $1, $1, $2
26; MIPS32-NEXT:    bnez $1, $BB0_6
27; MIPS32-NEXT:    nop
28; MIPS32-NEXT:  # %bb.1: # %entry
29; MIPS32-NEXT:    lw $2, 28($sp) # 4-byte Folded Reload
30; MIPS32-NEXT:    lui $1, %hi($JTI0_0)
31; MIPS32-NEXT:    sll $2, $2, 2
32; MIPS32-NEXT:    addu $1, $1, $2
33; MIPS32-NEXT:    lw $1, %lo($JTI0_0)($1)
34; MIPS32-NEXT:    jr $1
35; MIPS32-NEXT:    nop
36; MIPS32-NEXT:  $BB0_2: # %sw.bb
37; MIPS32-NEXT:    lw $2, 20($sp) # 4-byte Folded Reload
38; MIPS32-NEXT:    addiu $sp, $sp, 32
39; MIPS32-NEXT:    jr $ra
40; MIPS32-NEXT:    nop
41; MIPS32-NEXT:  $BB0_3: # %sw.bb1
42; MIPS32-NEXT:    lw $2, 16($sp) # 4-byte Folded Reload
43; MIPS32-NEXT:    addiu $sp, $sp, 32
44; MIPS32-NEXT:    jr $ra
45; MIPS32-NEXT:    nop
46; MIPS32-NEXT:  $BB0_4: # %sw.bb2
47; MIPS32-NEXT:    lw $2, 12($sp) # 4-byte Folded Reload
48; MIPS32-NEXT:    addiu $sp, $sp, 32
49; MIPS32-NEXT:    jr $ra
50; MIPS32-NEXT:    nop
51; MIPS32-NEXT:  $BB0_5: # %sw.bb3
52; MIPS32-NEXT:    lw $2, 8($sp) # 4-byte Folded Reload
53; MIPS32-NEXT:    addiu $sp, $sp, 32
54; MIPS32-NEXT:    jr $ra
55; MIPS32-NEXT:    nop
56; MIPS32-NEXT:  $BB0_6: # %sw.default
57; MIPS32-NEXT:    j $BB0_7
58; MIPS32-NEXT:    nop
59; MIPS32-NEXT:  $BB0_7: # %sw.epilog
60; MIPS32-NEXT:    lw $1, 8($sp) # 4-byte Folded Reload
61; MIPS32-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
62; MIPS32-NEXT:    ori $3, $zero, 8
63; MIPS32-NEXT:    subu $2, $2, $3
64; MIPS32-NEXT:    sw $2, 0($sp) # 4-byte Folded Spill
65; MIPS32-NEXT:    sltu $1, $1, $2
66; MIPS32-NEXT:    bnez $1, $BB0_13
67; MIPS32-NEXT:    nop
68; MIPS32-NEXT:  # %bb.8: # %sw.epilog
69; MIPS32-NEXT:    lw $2, 0($sp) # 4-byte Folded Reload
70; MIPS32-NEXT:    lui $1, %hi($JTI0_1)
71; MIPS32-NEXT:    sll $2, $2, 2
72; MIPS32-NEXT:    addu $1, $1, $2
73; MIPS32-NEXT:    lw $1, %lo($JTI0_1)($1)
74; MIPS32-NEXT:    jr $1
75; MIPS32-NEXT:    nop
76; MIPS32-NEXT:  $BB0_9: # %sw.bb4
77; MIPS32-NEXT:    lw $2, 20($sp) # 4-byte Folded Reload
78; MIPS32-NEXT:    addiu $sp, $sp, 32
79; MIPS32-NEXT:    jr $ra
80; MIPS32-NEXT:    nop
81; MIPS32-NEXT:  $BB0_10: # %sw.bb5
82; MIPS32-NEXT:    lw $2, 16($sp) # 4-byte Folded Reload
83; MIPS32-NEXT:    addiu $sp, $sp, 32
84; MIPS32-NEXT:    jr $ra
85; MIPS32-NEXT:    nop
86; MIPS32-NEXT:  $BB0_11: # %sw.bb6
87; MIPS32-NEXT:    lw $2, 12($sp) # 4-byte Folded Reload
88; MIPS32-NEXT:    addiu $sp, $sp, 32
89; MIPS32-NEXT:    jr $ra
90; MIPS32-NEXT:    nop
91; MIPS32-NEXT:  $BB0_12: # %sw.bb7
92; MIPS32-NEXT:    lw $2, 8($sp) # 4-byte Folded Reload
93; MIPS32-NEXT:    addiu $sp, $sp, 32
94; MIPS32-NEXT:    jr $ra
95; MIPS32-NEXT:    nop
96; MIPS32-NEXT:  $BB0_13: # %sw.default8
97; MIPS32-NEXT:    lw $2, 24($sp) # 4-byte Folded Reload
98; MIPS32-NEXT:    addiu $sp, $sp, 32
99; MIPS32-NEXT:    jr $ra
100; MIPS32-NEXT:    nop
101;
102; MIPS32_PIC-LABEL: mod4_0_to_11:
103; MIPS32_PIC:       # %bb.0: # %entry
104; MIPS32_PIC-NEXT:    lui $2, %hi(_gp_disp)
105; MIPS32_PIC-NEXT:    addiu $2, $2, %lo(_gp_disp)
106; MIPS32_PIC-NEXT:    addiu $sp, $sp, -40
107; MIPS32_PIC-NEXT:    .cfi_def_cfa_offset 40
108; MIPS32_PIC-NEXT:    addu $1, $2, $25
109; MIPS32_PIC-NEXT:    sw $1, 8($sp) # 4-byte Folded Spill
110; MIPS32_PIC-NEXT:    sw $4, 12($sp) # 4-byte Folded Spill
111; MIPS32_PIC-NEXT:    ori $1, $zero, 7
112; MIPS32_PIC-NEXT:    ori $2, $zero, 3
113; MIPS32_PIC-NEXT:    sw $2, 16($sp) # 4-byte Folded Spill
114; MIPS32_PIC-NEXT:    ori $2, $zero, 2
115; MIPS32_PIC-NEXT:    sw $2, 20($sp) # 4-byte Folded Spill
116; MIPS32_PIC-NEXT:    ori $2, $zero, 1
117; MIPS32_PIC-NEXT:    sw $2, 24($sp) # 4-byte Folded Spill
118; MIPS32_PIC-NEXT:    ori $2, $zero, 0
119; MIPS32_PIC-NEXT:    sw $2, 28($sp) # 4-byte Folded Spill
120; MIPS32_PIC-NEXT:    addiu $2, $zero, 65535
121; MIPS32_PIC-NEXT:    sw $2, 32($sp) # 4-byte Folded Spill
122; MIPS32_PIC-NEXT:    ori $2, $zero, 0
123; MIPS32_PIC-NEXT:    subu $2, $4, $2
124; MIPS32_PIC-NEXT:    sw $2, 36($sp) # 4-byte Folded Spill
125; MIPS32_PIC-NEXT:    sltu $1, $1, $2
126; MIPS32_PIC-NEXT:    bnez $1, $BB0_6
127; MIPS32_PIC-NEXT:    nop
128; MIPS32_PIC-NEXT:  # %bb.1: # %entry
129; MIPS32_PIC-NEXT:    lw $2, 8($sp) # 4-byte Folded Reload
130; MIPS32_PIC-NEXT:    lw $3, 36($sp) # 4-byte Folded Reload
131; MIPS32_PIC-NEXT:    lw $1, %got($JTI0_0)($2)
132; MIPS32_PIC-NEXT:    sll $3, $3, 2
133; MIPS32_PIC-NEXT:    addu $1, $1, $3
134; MIPS32_PIC-NEXT:    lw $1, %lo($JTI0_0)($1)
135; MIPS32_PIC-NEXT:    addu $1, $1, $2
136; MIPS32_PIC-NEXT:    jr $1
137; MIPS32_PIC-NEXT:    nop
138; MIPS32_PIC-NEXT:  $BB0_2: # %sw.bb
139; MIPS32_PIC-NEXT:    lw $2, 28($sp) # 4-byte Folded Reload
140; MIPS32_PIC-NEXT:    addiu $sp, $sp, 40
141; MIPS32_PIC-NEXT:    jr $ra
142; MIPS32_PIC-NEXT:    nop
143; MIPS32_PIC-NEXT:  $BB0_3: # %sw.bb1
144; MIPS32_PIC-NEXT:    lw $2, 24($sp) # 4-byte Folded Reload
145; MIPS32_PIC-NEXT:    addiu $sp, $sp, 40
146; MIPS32_PIC-NEXT:    jr $ra
147; MIPS32_PIC-NEXT:    nop
148; MIPS32_PIC-NEXT:  $BB0_4: # %sw.bb2
149; MIPS32_PIC-NEXT:    lw $2, 20($sp) # 4-byte Folded Reload
150; MIPS32_PIC-NEXT:    addiu $sp, $sp, 40
151; MIPS32_PIC-NEXT:    jr $ra
152; MIPS32_PIC-NEXT:    nop
153; MIPS32_PIC-NEXT:  $BB0_5: # %sw.bb3
154; MIPS32_PIC-NEXT:    lw $2, 16($sp) # 4-byte Folded Reload
155; MIPS32_PIC-NEXT:    addiu $sp, $sp, 40
156; MIPS32_PIC-NEXT:    jr $ra
157; MIPS32_PIC-NEXT:    nop
158; MIPS32_PIC-NEXT:  $BB0_6: # %sw.default
159; MIPS32_PIC-NEXT:    b $BB0_7
160; MIPS32_PIC-NEXT:    nop
161; MIPS32_PIC-NEXT:  $BB0_7: # %sw.epilog
162; MIPS32_PIC-NEXT:    lw $1, 16($sp) # 4-byte Folded Reload
163; MIPS32_PIC-NEXT:    lw $2, 12($sp) # 4-byte Folded Reload
164; MIPS32_PIC-NEXT:    ori $3, $zero, 8
165; MIPS32_PIC-NEXT:    subu $2, $2, $3
166; MIPS32_PIC-NEXT:    sw $2, 4($sp) # 4-byte Folded Spill
167; MIPS32_PIC-NEXT:    sltu $1, $1, $2
168; MIPS32_PIC-NEXT:    bnez $1, $BB0_13
169; MIPS32_PIC-NEXT:    nop
170; MIPS32_PIC-NEXT:  # %bb.8: # %sw.epilog
171; MIPS32_PIC-NEXT:    lw $2, 8($sp) # 4-byte Folded Reload
172; MIPS32_PIC-NEXT:    lw $3, 4($sp) # 4-byte Folded Reload
173; MIPS32_PIC-NEXT:    lw $1, %got($JTI0_1)($2)
174; MIPS32_PIC-NEXT:    sll $3, $3, 2
175; MIPS32_PIC-NEXT:    addu $1, $1, $3
176; MIPS32_PIC-NEXT:    lw $1, %lo($JTI0_1)($1)
177; MIPS32_PIC-NEXT:    addu $1, $1, $2
178; MIPS32_PIC-NEXT:    jr $1
179; MIPS32_PIC-NEXT:    nop
180; MIPS32_PIC-NEXT:  $BB0_9: # %sw.bb4
181; MIPS32_PIC-NEXT:    lw $2, 28($sp) # 4-byte Folded Reload
182; MIPS32_PIC-NEXT:    addiu $sp, $sp, 40
183; MIPS32_PIC-NEXT:    jr $ra
184; MIPS32_PIC-NEXT:    nop
185; MIPS32_PIC-NEXT:  $BB0_10: # %sw.bb5
186; MIPS32_PIC-NEXT:    lw $2, 24($sp) # 4-byte Folded Reload
187; MIPS32_PIC-NEXT:    addiu $sp, $sp, 40
188; MIPS32_PIC-NEXT:    jr $ra
189; MIPS32_PIC-NEXT:    nop
190; MIPS32_PIC-NEXT:  $BB0_11: # %sw.bb6
191; MIPS32_PIC-NEXT:    lw $2, 20($sp) # 4-byte Folded Reload
192; MIPS32_PIC-NEXT:    addiu $sp, $sp, 40
193; MIPS32_PIC-NEXT:    jr $ra
194; MIPS32_PIC-NEXT:    nop
195; MIPS32_PIC-NEXT:  $BB0_12: # %sw.bb7
196; MIPS32_PIC-NEXT:    lw $2, 16($sp) # 4-byte Folded Reload
197; MIPS32_PIC-NEXT:    addiu $sp, $sp, 40
198; MIPS32_PIC-NEXT:    jr $ra
199; MIPS32_PIC-NEXT:    nop
200; MIPS32_PIC-NEXT:  $BB0_13: # %sw.default8
201; MIPS32_PIC-NEXT:    lw $2, 32($sp) # 4-byte Folded Reload
202; MIPS32_PIC-NEXT:    addiu $sp, $sp, 40
203; MIPS32_PIC-NEXT:    jr $ra
204; MIPS32_PIC-NEXT:    nop
205
206
207entry:
208  switch i32 %a, label %sw.default [
209    i32 0, label %sw.bb
210    i32 4, label %sw.bb
211    i32 1, label %sw.bb1
212    i32 5, label %sw.bb1
213    i32 2, label %sw.bb2
214    i32 6, label %sw.bb2
215    i32 3, label %sw.bb3
216    i32 7, label %sw.bb3
217  ]
218
219sw.bb:                                            ; preds = %entry, %entry
220  ret i32 0
221
222sw.bb1:                                           ; preds = %entry, %entry
223  ret i32 1
224
225sw.bb2:                                           ; preds = %entry, %entry
226  ret i32 2
227
228sw.bb3:                                           ; preds = %entry, %entry
229  ret i32 3
230
231sw.default:                                       ; preds = %entry
232  br label %sw.epilog
233
234sw.epilog:                                        ; preds = %sw.default
235  switch i32 %a, label %sw.default8 [
236    i32 8, label %sw.bb4
237    i32 9, label %sw.bb5
238    i32 10, label %sw.bb6
239    i32 11, label %sw.bb7
240  ]
241
242sw.bb4:                                           ; preds = %sw.epilog
243  ret i32 0
244
245sw.bb5:                                           ; preds = %sw.epilog
246  ret i32 1
247
248sw.bb6:                                           ; preds = %sw.epilog
249  ret i32 2
250
251sw.bb7:                                           ; preds = %sw.epilog
252  ret i32 3
253
254sw.default8:                                      ; preds = %sw.epilog
255  ret i32 -1
256
257}
258