xref: /llvm-project/llvm/test/CodeGen/RISCV/xcvbi.ll (revision 97982a8c605fac7c86d02e641a6cd7898b3ca343)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -O0 -mtriple=riscv32 -mattr=+xcvbi -verify-machineinstrs < %s \
3; RUN:   | FileCheck %s --check-prefixes=CHECK_NOPT
4; RUN: llc -O3 -mtriple=riscv32 -mattr=+xcvbi -verify-machineinstrs < %s \
5; RUN:   | FileCheck %s --check-prefixes=CHECK_OPT
6
7define i32 @beqimm(i32 %a) {
8; CHECK_NOPT-LABEL: beqimm:
9; CHECK_NOPT:       # %bb.0:
10; CHECK_NOPT-NEXT:    cv.beqimm a0, 5, .LBB0_2
11; CHECK_NOPT-NEXT:    j .LBB0_1
12; CHECK_NOPT-NEXT:  .LBB0_1: # %f
13; CHECK_NOPT-NEXT:    li a0, 0
14; CHECK_NOPT-NEXT:    ret
15; CHECK_NOPT-NEXT:  .LBB0_2: # %t
16; CHECK_NOPT-NEXT:    li a0, 1
17; CHECK_NOPT-NEXT:    ret
18;
19; CHECK_OPT-LABEL: beqimm:
20; CHECK_OPT:       # %bb.0:
21; CHECK_OPT-NEXT:    cv.bneimm a0, 5, .LBB0_2
22; CHECK_OPT-NEXT:  # %bb.1: # %t
23; CHECK_OPT-NEXT:    li a0, 1
24; CHECK_OPT-NEXT:    ret
25; CHECK_OPT-NEXT:  .LBB0_2: # %f
26; CHECK_OPT-NEXT:    li a0, 0
27; CHECK_OPT-NEXT:    ret
28  %1 = icmp eq i32 %a, 5
29  br i1 %1, label %t, label %f
30f:
31  ret i32 0
32t:
33  ret i32 1
34}
35
36define i32 @bneimm(i32 %a) {
37; CHECK_NOPT-LABEL: bneimm:
38; CHECK_NOPT:       # %bb.0:
39; CHECK_NOPT-NEXT:    cv.bneimm a0, 5, .LBB1_2
40; CHECK_NOPT-NEXT:    j .LBB1_1
41; CHECK_NOPT-NEXT:  .LBB1_1: # %f
42; CHECK_NOPT-NEXT:    li a0, 0
43; CHECK_NOPT-NEXT:    ret
44; CHECK_NOPT-NEXT:  .LBB1_2: # %t
45; CHECK_NOPT-NEXT:    li a0, 1
46; CHECK_NOPT-NEXT:    ret
47;
48; CHECK_OPT-LABEL: bneimm:
49; CHECK_OPT:       # %bb.0:
50; CHECK_OPT-NEXT:    cv.beqimm a0, 5, .LBB1_2
51; CHECK_OPT-NEXT:  # %bb.1: # %t
52; CHECK_OPT-NEXT:    li a0, 1
53; CHECK_OPT-NEXT:    ret
54; CHECK_OPT-NEXT:  .LBB1_2: # %f
55; CHECK_OPT-NEXT:    li a0, 0
56; CHECK_OPT-NEXT:    ret
57  %1 = icmp ne i32 %a, 5
58  br i1 %1, label %t, label %f
59f:
60  ret i32 0
61t:
62  ret i32 1
63}
64
65define i32 @select_beqimm_1(i32 %a, i32 %x, i32 %y) {
66; CHECK_NOPT-LABEL: select_beqimm_1:
67; CHECK_NOPT:       # %bb.0: # %entry
68; CHECK_NOPT-NEXT:    addi sp, sp, -16
69; CHECK_NOPT-NEXT:    .cfi_def_cfa_offset 16
70; CHECK_NOPT-NEXT:    sw a1, 8(sp) # 4-byte Folded Spill
71; CHECK_NOPT-NEXT:    sw a2, 12(sp) # 4-byte Folded Spill
72; CHECK_NOPT-NEXT:    cv.beqimm a0, -16, .LBB2_2
73; CHECK_NOPT-NEXT:  # %bb.1: # %entry
74; CHECK_NOPT-NEXT:    lw a0, 8(sp) # 4-byte Folded Reload
75; CHECK_NOPT-NEXT:    sw a0, 12(sp) # 4-byte Folded Spill
76; CHECK_NOPT-NEXT:  .LBB2_2: # %entry
77; CHECK_NOPT-NEXT:    lw a0, 12(sp) # 4-byte Folded Reload
78; CHECK_NOPT-NEXT:    addi sp, sp, 16
79; CHECK_NOPT-NEXT:    .cfi_def_cfa_offset 0
80; CHECK_NOPT-NEXT:    ret
81;
82; CHECK_OPT-LABEL: select_beqimm_1:
83; CHECK_OPT:       # %bb.0: # %entry
84; CHECK_OPT-NEXT:    cv.beqimm a0, -16, .LBB2_2
85; CHECK_OPT-NEXT:  # %bb.1: # %entry
86; CHECK_OPT-NEXT:    mv a2, a1
87; CHECK_OPT-NEXT:  .LBB2_2: # %entry
88; CHECK_OPT-NEXT:    mv a0, a2
89; CHECK_OPT-NEXT:    ret
90entry:
91  %cmp.not = icmp eq i32 %a, -16
92  %cond = select i1 %cmp.not, i32 %y, i32 %x
93  ret i32 %cond
94}
95
96define i32 @select_beqimm_2(i32 %a, i32 %x, i32 %y) {
97; CHECK_NOPT-LABEL: select_beqimm_2:
98; CHECK_NOPT:       # %bb.0: # %entry
99; CHECK_NOPT-NEXT:    addi sp, sp, -16
100; CHECK_NOPT-NEXT:    .cfi_def_cfa_offset 16
101; CHECK_NOPT-NEXT:    sw a1, 8(sp) # 4-byte Folded Spill
102; CHECK_NOPT-NEXT:    sw a2, 12(sp) # 4-byte Folded Spill
103; CHECK_NOPT-NEXT:    cv.beqimm a0, 0, .LBB3_2
104; CHECK_NOPT-NEXT:  # %bb.1: # %entry
105; CHECK_NOPT-NEXT:    lw a0, 8(sp) # 4-byte Folded Reload
106; CHECK_NOPT-NEXT:    sw a0, 12(sp) # 4-byte Folded Spill
107; CHECK_NOPT-NEXT:  .LBB3_2: # %entry
108; CHECK_NOPT-NEXT:    lw a0, 12(sp) # 4-byte Folded Reload
109; CHECK_NOPT-NEXT:    addi sp, sp, 16
110; CHECK_NOPT-NEXT:    .cfi_def_cfa_offset 0
111; CHECK_NOPT-NEXT:    ret
112;
113; CHECK_OPT-LABEL: select_beqimm_2:
114; CHECK_OPT:       # %bb.0: # %entry
115; CHECK_OPT-NEXT:    cv.beqimm a0, 0, .LBB3_2
116; CHECK_OPT-NEXT:  # %bb.1: # %entry
117; CHECK_OPT-NEXT:    mv a2, a1
118; CHECK_OPT-NEXT:  .LBB3_2: # %entry
119; CHECK_OPT-NEXT:    mv a0, a2
120; CHECK_OPT-NEXT:    ret
121entry:
122  %cmp.not = icmp eq i32 %a, 0
123  %cond = select i1 %cmp.not, i32 %y, i32 %x
124  ret i32 %cond
125}
126
127define i32 @select_beqimm_3(i32 %a, i32 %x, i32 %y) {
128; CHECK_NOPT-LABEL: select_beqimm_3:
129; CHECK_NOPT:       # %bb.0: # %entry
130; CHECK_NOPT-NEXT:    addi sp, sp, -16
131; CHECK_NOPT-NEXT:    .cfi_def_cfa_offset 16
132; CHECK_NOPT-NEXT:    sw a1, 8(sp) # 4-byte Folded Spill
133; CHECK_NOPT-NEXT:    sw a2, 12(sp) # 4-byte Folded Spill
134; CHECK_NOPT-NEXT:    cv.beqimm a0, 15, .LBB4_2
135; CHECK_NOPT-NEXT:  # %bb.1: # %entry
136; CHECK_NOPT-NEXT:    lw a0, 8(sp) # 4-byte Folded Reload
137; CHECK_NOPT-NEXT:    sw a0, 12(sp) # 4-byte Folded Spill
138; CHECK_NOPT-NEXT:  .LBB4_2: # %entry
139; CHECK_NOPT-NEXT:    lw a0, 12(sp) # 4-byte Folded Reload
140; CHECK_NOPT-NEXT:    addi sp, sp, 16
141; CHECK_NOPT-NEXT:    .cfi_def_cfa_offset 0
142; CHECK_NOPT-NEXT:    ret
143;
144; CHECK_OPT-LABEL: select_beqimm_3:
145; CHECK_OPT:       # %bb.0: # %entry
146; CHECK_OPT-NEXT:    cv.beqimm a0, 15, .LBB4_2
147; CHECK_OPT-NEXT:  # %bb.1: # %entry
148; CHECK_OPT-NEXT:    mv a2, a1
149; CHECK_OPT-NEXT:  .LBB4_2: # %entry
150; CHECK_OPT-NEXT:    mv a0, a2
151; CHECK_OPT-NEXT:    ret
152entry:
153  %cmp.not = icmp eq i32 %a, 15
154  %cond = select i1 %cmp.not, i32 %y, i32 %x
155  ret i32 %cond
156}
157
158define i32 @select_no_beqimm_1(i32 %a, i32 %x, i32 %y) {
159; CHECK_NOPT-LABEL: select_no_beqimm_1:
160; CHECK_NOPT:       # %bb.0: # %entry
161; CHECK_NOPT-NEXT:    addi sp, sp, -16
162; CHECK_NOPT-NEXT:    .cfi_def_cfa_offset 16
163; CHECK_NOPT-NEXT:    sw a1, 8(sp) # 4-byte Folded Spill
164; CHECK_NOPT-NEXT:    li a1, -17
165; CHECK_NOPT-NEXT:    sw a2, 12(sp) # 4-byte Folded Spill
166; CHECK_NOPT-NEXT:    beq a0, a1, .LBB5_2
167; CHECK_NOPT-NEXT:  # %bb.1: # %entry
168; CHECK_NOPT-NEXT:    lw a0, 8(sp) # 4-byte Folded Reload
169; CHECK_NOPT-NEXT:    sw a0, 12(sp) # 4-byte Folded Spill
170; CHECK_NOPT-NEXT:  .LBB5_2: # %entry
171; CHECK_NOPT-NEXT:    lw a0, 12(sp) # 4-byte Folded Reload
172; CHECK_NOPT-NEXT:    addi sp, sp, 16
173; CHECK_NOPT-NEXT:    .cfi_def_cfa_offset 0
174; CHECK_NOPT-NEXT:    ret
175;
176; CHECK_OPT-LABEL: select_no_beqimm_1:
177; CHECK_OPT:       # %bb.0: # %entry
178; CHECK_OPT-NEXT:    li a3, -17
179; CHECK_OPT-NEXT:    beq a0, a3, .LBB5_2
180; CHECK_OPT-NEXT:  # %bb.1: # %entry
181; CHECK_OPT-NEXT:    mv a2, a1
182; CHECK_OPT-NEXT:  .LBB5_2: # %entry
183; CHECK_OPT-NEXT:    mv a0, a2
184; CHECK_OPT-NEXT:    ret
185entry:
186  %cmp.not = icmp eq i32 %a, -17
187  %cond = select i1 %cmp.not, i32 %y, i32 %x
188  ret i32 %cond
189}
190
191define i32 @select_no_beqimm_2(i32 %a, i32 %x, i32 %y) {
192; CHECK_NOPT-LABEL: select_no_beqimm_2:
193; CHECK_NOPT:       # %bb.0: # %entry
194; CHECK_NOPT-NEXT:    addi sp, sp, -16
195; CHECK_NOPT-NEXT:    .cfi_def_cfa_offset 16
196; CHECK_NOPT-NEXT:    sw a1, 8(sp) # 4-byte Folded Spill
197; CHECK_NOPT-NEXT:    li a1, 16
198; CHECK_NOPT-NEXT:    sw a2, 12(sp) # 4-byte Folded Spill
199; CHECK_NOPT-NEXT:    beq a0, a1, .LBB6_2
200; CHECK_NOPT-NEXT:  # %bb.1: # %entry
201; CHECK_NOPT-NEXT:    lw a0, 8(sp) # 4-byte Folded Reload
202; CHECK_NOPT-NEXT:    sw a0, 12(sp) # 4-byte Folded Spill
203; CHECK_NOPT-NEXT:  .LBB6_2: # %entry
204; CHECK_NOPT-NEXT:    lw a0, 12(sp) # 4-byte Folded Reload
205; CHECK_NOPT-NEXT:    addi sp, sp, 16
206; CHECK_NOPT-NEXT:    .cfi_def_cfa_offset 0
207; CHECK_NOPT-NEXT:    ret
208;
209; CHECK_OPT-LABEL: select_no_beqimm_2:
210; CHECK_OPT:       # %bb.0: # %entry
211; CHECK_OPT-NEXT:    li a3, 16
212; CHECK_OPT-NEXT:    beq a0, a3, .LBB6_2
213; CHECK_OPT-NEXT:  # %bb.1: # %entry
214; CHECK_OPT-NEXT:    mv a2, a1
215; CHECK_OPT-NEXT:  .LBB6_2: # %entry
216; CHECK_OPT-NEXT:    mv a0, a2
217; CHECK_OPT-NEXT:    ret
218entry:
219  %cmp.not = icmp eq i32 %a, 16
220  %cond = select i1 %cmp.not, i32 %y, i32 %x
221  ret i32 %cond
222}
223
224define i32 @select_bneimm_1(i32 %a, i32 %x, i32 %y) {
225; CHECK_NOPT-LABEL: select_bneimm_1:
226; CHECK_NOPT:       # %bb.0: # %entry
227; CHECK_NOPT-NEXT:    addi sp, sp, -16
228; CHECK_NOPT-NEXT:    .cfi_def_cfa_offset 16
229; CHECK_NOPT-NEXT:    sw a1, 8(sp) # 4-byte Folded Spill
230; CHECK_NOPT-NEXT:    sw a2, 12(sp) # 4-byte Folded Spill
231; CHECK_NOPT-NEXT:    cv.bneimm a0, 0, .LBB7_2
232; CHECK_NOPT-NEXT:  # %bb.1: # %entry
233; CHECK_NOPT-NEXT:    lw a0, 8(sp) # 4-byte Folded Reload
234; CHECK_NOPT-NEXT:    sw a0, 12(sp) # 4-byte Folded Spill
235; CHECK_NOPT-NEXT:  .LBB7_2: # %entry
236; CHECK_NOPT-NEXT:    lw a0, 12(sp) # 4-byte Folded Reload
237; CHECK_NOPT-NEXT:    addi sp, sp, 16
238; CHECK_NOPT-NEXT:    .cfi_def_cfa_offset 0
239; CHECK_NOPT-NEXT:    ret
240;
241; CHECK_OPT-LABEL: select_bneimm_1:
242; CHECK_OPT:       # %bb.0: # %entry
243; CHECK_OPT-NEXT:    cv.bneimm a0, 0, .LBB7_2
244; CHECK_OPT-NEXT:  # %bb.1: # %entry
245; CHECK_OPT-NEXT:    mv a2, a1
246; CHECK_OPT-NEXT:  .LBB7_2: # %entry
247; CHECK_OPT-NEXT:    mv a0, a2
248; CHECK_OPT-NEXT:    ret
249entry:
250  %cmp.not = icmp ne i32 %a, 0
251  %cond = select i1 %cmp.not, i32 %y, i32 %x
252  ret i32 %cond
253}
254
255