xref: /llvm-project/llvm/test/CodeGen/LoongArch/jump-table.ll (revision 2b6c23461d85b59b4abb8d738b1d4ab574bbe437)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 -mattr=+d --min-jump-table-entries=5 < %s \
3; RUN:   | FileCheck %s --check-prefix=LA32
4; RUN: llc --mtriple=loongarch64 -mattr=+d --min-jump-table-entries=5 < %s \
5; RUN:   | FileCheck %s --check-prefix=LA64
6; RUN: llc --mtriple=loongarch32 -mattr=+d --min-jump-table-entries=4 < %s \
7; RUN:   | FileCheck %s --check-prefix=LA32-JT
8; RUN: llc --mtriple=loongarch64 -mattr=+d --min-jump-table-entries=4 < %s \
9; RUN:   | FileCheck %s --check-prefix=LA64-JT
10
11;; The default mininum number of entries to use a jump table is 4.
12;;
13;; Note: The parameter `--min-jump-table-entries` will have no effect once we
14;; have set the default value using `setMinimumJumpTableEntries`.
15
16define void @switch_4_arms(i32 %in, ptr %out) nounwind {
17; LA32-LABEL: switch_4_arms:
18; LA32:       # %bb.0: # %entry
19; LA32-NEXT:    ori $a2, $zero, 2
20; LA32-NEXT:    blt $a2, $a0, .LBB0_4
21; LA32-NEXT:  # %bb.1: # %entry
22; LA32-NEXT:    ori $a2, $zero, 1
23; LA32-NEXT:    beq $a0, $a2, .LBB0_7
24; LA32-NEXT:  # %bb.2: # %entry
25; LA32-NEXT:    ori $a2, $zero, 2
26; LA32-NEXT:    bne $a0, $a2, .LBB0_10
27; LA32-NEXT:  # %bb.3: # %bb2
28; LA32-NEXT:    ori $a0, $zero, 3
29; LA32-NEXT:    b .LBB0_9
30; LA32-NEXT:  .LBB0_4: # %entry
31; LA32-NEXT:    ori $a2, $zero, 3
32; LA32-NEXT:    beq $a0, $a2, .LBB0_8
33; LA32-NEXT:  # %bb.5: # %entry
34; LA32-NEXT:    ori $a2, $zero, 4
35; LA32-NEXT:    bne $a0, $a2, .LBB0_10
36; LA32-NEXT:  # %bb.6: # %bb4
37; LA32-NEXT:    ori $a0, $zero, 1
38; LA32-NEXT:    b .LBB0_9
39; LA32-NEXT:  .LBB0_7: # %bb1
40; LA32-NEXT:    ori $a0, $zero, 4
41; LA32-NEXT:    b .LBB0_9
42; LA32-NEXT:  .LBB0_8: # %bb3
43; LA32-NEXT:    ori $a0, $zero, 2
44; LA32-NEXT:  .LBB0_9: # %exit
45; LA32-NEXT:    st.w $a0, $a1, 0
46; LA32-NEXT:  .LBB0_10: # %exit
47; LA32-NEXT:    ret
48;
49; LA64-LABEL: switch_4_arms:
50; LA64:       # %bb.0: # %entry
51; LA64-NEXT:    addi.w $a0, $a0, 0
52; LA64-NEXT:    ori $a2, $zero, 2
53; LA64-NEXT:    blt $a2, $a0, .LBB0_4
54; LA64-NEXT:  # %bb.1: # %entry
55; LA64-NEXT:    ori $a2, $zero, 1
56; LA64-NEXT:    beq $a0, $a2, .LBB0_7
57; LA64-NEXT:  # %bb.2: # %entry
58; LA64-NEXT:    ori $a2, $zero, 2
59; LA64-NEXT:    bne $a0, $a2, .LBB0_10
60; LA64-NEXT:  # %bb.3: # %bb2
61; LA64-NEXT:    ori $a0, $zero, 3
62; LA64-NEXT:    b .LBB0_9
63; LA64-NEXT:  .LBB0_4: # %entry
64; LA64-NEXT:    ori $a2, $zero, 3
65; LA64-NEXT:    beq $a0, $a2, .LBB0_8
66; LA64-NEXT:  # %bb.5: # %entry
67; LA64-NEXT:    ori $a2, $zero, 4
68; LA64-NEXT:    bne $a0, $a2, .LBB0_10
69; LA64-NEXT:  # %bb.6: # %bb4
70; LA64-NEXT:    ori $a0, $zero, 1
71; LA64-NEXT:    b .LBB0_9
72; LA64-NEXT:  .LBB0_7: # %bb1
73; LA64-NEXT:    ori $a0, $zero, 4
74; LA64-NEXT:    b .LBB0_9
75; LA64-NEXT:  .LBB0_8: # %bb3
76; LA64-NEXT:    ori $a0, $zero, 2
77; LA64-NEXT:  .LBB0_9: # %exit
78; LA64-NEXT:    st.w $a0, $a1, 0
79; LA64-NEXT:  .LBB0_10: # %exit
80; LA64-NEXT:    ret
81;
82; LA32-JT-LABEL: switch_4_arms:
83; LA32-JT:       # %bb.0: # %entry
84; LA32-JT-NEXT:    addi.w $a0, $a0, -1
85; LA32-JT-NEXT:    ori $a2, $zero, 3
86; LA32-JT-NEXT:    bltu $a2, $a0, .LBB0_7
87; LA32-JT-NEXT:  # %bb.1: # %entry
88; LA32-JT-NEXT:    pcalau12i $a2, %pc_hi20(.LJTI0_0)
89; LA32-JT-NEXT:    addi.w $a2, $a2, %pc_lo12(.LJTI0_0)
90; LA32-JT-NEXT:    alsl.w $a0, $a0, $a2, 2
91; LA32-JT-NEXT:    ld.w $a0, $a0, 0
92; LA32-JT-NEXT:    jr $a0
93; LA32-JT-NEXT:  .LBB0_2: # %bb1
94; LA32-JT-NEXT:    ori $a0, $zero, 4
95; LA32-JT-NEXT:    b .LBB0_6
96; LA32-JT-NEXT:  .LBB0_3: # %bb3
97; LA32-JT-NEXT:    ori $a0, $zero, 2
98; LA32-JT-NEXT:    b .LBB0_6
99; LA32-JT-NEXT:  .LBB0_4: # %bb4
100; LA32-JT-NEXT:    ori $a0, $zero, 1
101; LA32-JT-NEXT:    b .LBB0_6
102; LA32-JT-NEXT:  .LBB0_5: # %bb2
103; LA32-JT-NEXT:    ori $a0, $zero, 3
104; LA32-JT-NEXT:  .LBB0_6: # %exit
105; LA32-JT-NEXT:    st.w $a0, $a1, 0
106; LA32-JT-NEXT:  .LBB0_7: # %exit
107; LA32-JT-NEXT:    ret
108;
109; LA64-JT-LABEL: switch_4_arms:
110; LA64-JT:       # %bb.0: # %entry
111; LA64-JT-NEXT:    addi.w $a0, $a0, 0
112; LA64-JT-NEXT:    addi.d $a0, $a0, -1
113; LA64-JT-NEXT:    ori $a2, $zero, 3
114; LA64-JT-NEXT:    bltu $a2, $a0, .LBB0_7
115; LA64-JT-NEXT:  # %bb.1: # %entry
116; LA64-JT-NEXT:    slli.d $a0, $a0, 3
117; LA64-JT-NEXT:    pcalau12i $a2, %pc_hi20(.LJTI0_0)
118; LA64-JT-NEXT:    addi.d $a2, $a2, %pc_lo12(.LJTI0_0)
119; LA64-JT-NEXT:    ldx.d $a0, $a0, $a2
120; LA64-JT-NEXT:    jr $a0
121; LA64-JT-NEXT:  .LBB0_2: # %bb1
122; LA64-JT-NEXT:    ori $a0, $zero, 4
123; LA64-JT-NEXT:    b .LBB0_6
124; LA64-JT-NEXT:  .LBB0_3: # %bb3
125; LA64-JT-NEXT:    ori $a0, $zero, 2
126; LA64-JT-NEXT:    b .LBB0_6
127; LA64-JT-NEXT:  .LBB0_4: # %bb4
128; LA64-JT-NEXT:    ori $a0, $zero, 1
129; LA64-JT-NEXT:    b .LBB0_6
130; LA64-JT-NEXT:  .LBB0_5: # %bb2
131; LA64-JT-NEXT:    ori $a0, $zero, 3
132; LA64-JT-NEXT:  .LBB0_6: # %exit
133; LA64-JT-NEXT:    st.w $a0, $a1, 0
134; LA64-JT-NEXT:  .LBB0_7: # %exit
135; LA64-JT-NEXT:    ret
136entry:
137  switch i32 %in, label %exit [
138    i32 1, label %bb1
139    i32 2, label %bb2
140    i32 3, label %bb3
141    i32 4, label %bb4
142  ]
143bb1:
144  store i32 4, ptr %out
145  br label %exit
146bb2:
147  store i32 3, ptr %out
148  br label %exit
149bb3:
150  store i32 2, ptr %out
151  br label %exit
152bb4:
153  store i32 1, ptr %out
154  br label %exit
155exit:
156  ret void
157}
158