Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / RISCV / min-max.ll
blob0115b48b7124c9c562fe963ceed922c7bdc0ae57
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=riscv32 | FileCheck %s --check-prefixes=NOZBB,RV32I
3 ; RUN: llc < %s -mtriple=riscv64 | FileCheck %s --check-prefixes=NOZBB,RV64I
4 ; RUN: llc < %s -mtriple=riscv32 -mattr=+zbb | \
5 ; RUN:   FileCheck %s --check-prefixes=ZBB,RV32ZBB
6 ; RUN: llc < %s -mtriple=riscv64 -mattr=+zbb | \
7 ; RUN:   FileCheck %s --check-prefixes=ZBB,RV64ZBB
9 ; Basic tests.
11 declare i8 @llvm.smax.i8(i8 %a, i8 %b) readnone
13 define signext i8 @smax_i8(i8 signext %a, i8 signext %b) {
14 ; NOZBB-LABEL: smax_i8:
15 ; NOZBB:       # %bb.0:
16 ; NOZBB-NEXT:    blt a1, a0, .LBB0_2
17 ; NOZBB-NEXT:  # %bb.1:
18 ; NOZBB-NEXT:    mv a0, a1
19 ; NOZBB-NEXT:  .LBB0_2:
20 ; NOZBB-NEXT:    ret
22 ; ZBB-LABEL: smax_i8:
23 ; ZBB:       # %bb.0:
24 ; ZBB-NEXT:    max a0, a0, a1
25 ; ZBB-NEXT:    ret
26   %c = call i8 @llvm.smax.i8(i8 %a, i8 %b)
27   ret i8 %c
30 declare i16 @llvm.smax.i16(i16 %a, i16 %b) readnone
32 define signext i16 @smax_i16(i16 signext %a, i16 signext %b) {
33 ; NOZBB-LABEL: smax_i16:
34 ; NOZBB:       # %bb.0:
35 ; NOZBB-NEXT:    blt a1, a0, .LBB1_2
36 ; NOZBB-NEXT:  # %bb.1:
37 ; NOZBB-NEXT:    mv a0, a1
38 ; NOZBB-NEXT:  .LBB1_2:
39 ; NOZBB-NEXT:    ret
41 ; ZBB-LABEL: smax_i16:
42 ; ZBB:       # %bb.0:
43 ; ZBB-NEXT:    max a0, a0, a1
44 ; ZBB-NEXT:    ret
45   %c = call i16 @llvm.smax.i16(i16 %a, i16 %b)
46   ret i16 %c
49 declare i32 @llvm.smax.i32(i32 %a, i32 %b) readnone
51 define signext i32 @smax_i32(i32 signext %a, i32 signext %b) {
52 ; NOZBB-LABEL: smax_i32:
53 ; NOZBB:       # %bb.0:
54 ; NOZBB-NEXT:    blt a1, a0, .LBB2_2
55 ; NOZBB-NEXT:  # %bb.1:
56 ; NOZBB-NEXT:    mv a0, a1
57 ; NOZBB-NEXT:  .LBB2_2:
58 ; NOZBB-NEXT:    ret
60 ; ZBB-LABEL: smax_i32:
61 ; ZBB:       # %bb.0:
62 ; ZBB-NEXT:    max a0, a0, a1
63 ; ZBB-NEXT:    ret
64   %c = call i32 @llvm.smax.i32(i32 %a, i32 %b)
65   ret i32 %c
68 declare i64 @llvm.smax.i64(i64 %a, i64 %b) readnone
70 define i64 @smax_i64(i64 %a, i64 %b) {
71 ; RV32I-LABEL: smax_i64:
72 ; RV32I:       # %bb.0:
73 ; RV32I-NEXT:    beq a1, a3, .LBB3_2
74 ; RV32I-NEXT:  # %bb.1:
75 ; RV32I-NEXT:    slt a4, a3, a1
76 ; RV32I-NEXT:    beqz a4, .LBB3_3
77 ; RV32I-NEXT:    j .LBB3_4
78 ; RV32I-NEXT:  .LBB3_2:
79 ; RV32I-NEXT:    sltu a4, a2, a0
80 ; RV32I-NEXT:    bnez a4, .LBB3_4
81 ; RV32I-NEXT:  .LBB3_3:
82 ; RV32I-NEXT:    mv a0, a2
83 ; RV32I-NEXT:    mv a1, a3
84 ; RV32I-NEXT:  .LBB3_4:
85 ; RV32I-NEXT:    ret
87 ; RV64I-LABEL: smax_i64:
88 ; RV64I:       # %bb.0:
89 ; RV64I-NEXT:    blt a1, a0, .LBB3_2
90 ; RV64I-NEXT:  # %bb.1:
91 ; RV64I-NEXT:    mv a0, a1
92 ; RV64I-NEXT:  .LBB3_2:
93 ; RV64I-NEXT:    ret
95 ; RV32ZBB-LABEL: smax_i64:
96 ; RV32ZBB:       # %bb.0:
97 ; RV32ZBB-NEXT:    beq a1, a3, .LBB3_2
98 ; RV32ZBB-NEXT:  # %bb.1:
99 ; RV32ZBB-NEXT:    slt a4, a3, a1
100 ; RV32ZBB-NEXT:    beqz a4, .LBB3_3
101 ; RV32ZBB-NEXT:    j .LBB3_4
102 ; RV32ZBB-NEXT:  .LBB3_2:
103 ; RV32ZBB-NEXT:    sltu a4, a2, a0
104 ; RV32ZBB-NEXT:    bnez a4, .LBB3_4
105 ; RV32ZBB-NEXT:  .LBB3_3:
106 ; RV32ZBB-NEXT:    mv a0, a2
107 ; RV32ZBB-NEXT:    mv a1, a3
108 ; RV32ZBB-NEXT:  .LBB3_4:
109 ; RV32ZBB-NEXT:    ret
111 ; RV64ZBB-LABEL: smax_i64:
112 ; RV64ZBB:       # %bb.0:
113 ; RV64ZBB-NEXT:    max a0, a0, a1
114 ; RV64ZBB-NEXT:    ret
115   %c = call i64 @llvm.smax.i64(i64 %a, i64 %b)
116   ret i64 %c
119 declare i8 @llvm.smin.i8(i8 %a, i8 %b) readnone
121 define signext i8 @smin_i8(i8 signext %a, i8 signext %b) {
122 ; NOZBB-LABEL: smin_i8:
123 ; NOZBB:       # %bb.0:
124 ; NOZBB-NEXT:    blt a0, a1, .LBB4_2
125 ; NOZBB-NEXT:  # %bb.1:
126 ; NOZBB-NEXT:    mv a0, a1
127 ; NOZBB-NEXT:  .LBB4_2:
128 ; NOZBB-NEXT:    ret
130 ; ZBB-LABEL: smin_i8:
131 ; ZBB:       # %bb.0:
132 ; ZBB-NEXT:    min a0, a0, a1
133 ; ZBB-NEXT:    ret
134   %c = call i8 @llvm.smin.i8(i8 %a, i8 %b)
135   ret i8 %c
138 declare i16 @llvm.smin.i16(i16 %a, i16 %b) readnone
140 define signext i16 @smin_i16(i16 signext %a, i16 signext %b) {
141 ; NOZBB-LABEL: smin_i16:
142 ; NOZBB:       # %bb.0:
143 ; NOZBB-NEXT:    blt a0, a1, .LBB5_2
144 ; NOZBB-NEXT:  # %bb.1:
145 ; NOZBB-NEXT:    mv a0, a1
146 ; NOZBB-NEXT:  .LBB5_2:
147 ; NOZBB-NEXT:    ret
149 ; ZBB-LABEL: smin_i16:
150 ; ZBB:       # %bb.0:
151 ; ZBB-NEXT:    min a0, a0, a1
152 ; ZBB-NEXT:    ret
153   %c = call i16 @llvm.smin.i16(i16 %a, i16 %b)
154   ret i16 %c
157 declare i32 @llvm.smin.i32(i32 %a, i32 %b) readnone
159 define signext i32 @smin_i32(i32 signext %a, i32 signext %b) {
160 ; NOZBB-LABEL: smin_i32:
161 ; NOZBB:       # %bb.0:
162 ; NOZBB-NEXT:    blt a0, a1, .LBB6_2
163 ; NOZBB-NEXT:  # %bb.1:
164 ; NOZBB-NEXT:    mv a0, a1
165 ; NOZBB-NEXT:  .LBB6_2:
166 ; NOZBB-NEXT:    ret
168 ; ZBB-LABEL: smin_i32:
169 ; ZBB:       # %bb.0:
170 ; ZBB-NEXT:    min a0, a0, a1
171 ; ZBB-NEXT:    ret
172   %c = call i32 @llvm.smin.i32(i32 %a, i32 %b)
173   ret i32 %c
176 declare i64 @llvm.smin.i64(i64 %a, i64 %b) readnone
178 define i64 @smin_i64(i64 %a, i64 %b) {
179 ; RV32I-LABEL: smin_i64:
180 ; RV32I:       # %bb.0:
181 ; RV32I-NEXT:    beq a1, a3, .LBB7_2
182 ; RV32I-NEXT:  # %bb.1:
183 ; RV32I-NEXT:    slt a4, a1, a3
184 ; RV32I-NEXT:    beqz a4, .LBB7_3
185 ; RV32I-NEXT:    j .LBB7_4
186 ; RV32I-NEXT:  .LBB7_2:
187 ; RV32I-NEXT:    sltu a4, a0, a2
188 ; RV32I-NEXT:    bnez a4, .LBB7_4
189 ; RV32I-NEXT:  .LBB7_3:
190 ; RV32I-NEXT:    mv a0, a2
191 ; RV32I-NEXT:    mv a1, a3
192 ; RV32I-NEXT:  .LBB7_4:
193 ; RV32I-NEXT:    ret
195 ; RV64I-LABEL: smin_i64:
196 ; RV64I:       # %bb.0:
197 ; RV64I-NEXT:    blt a0, a1, .LBB7_2
198 ; RV64I-NEXT:  # %bb.1:
199 ; RV64I-NEXT:    mv a0, a1
200 ; RV64I-NEXT:  .LBB7_2:
201 ; RV64I-NEXT:    ret
203 ; RV32ZBB-LABEL: smin_i64:
204 ; RV32ZBB:       # %bb.0:
205 ; RV32ZBB-NEXT:    beq a1, a3, .LBB7_2
206 ; RV32ZBB-NEXT:  # %bb.1:
207 ; RV32ZBB-NEXT:    slt a4, a1, a3
208 ; RV32ZBB-NEXT:    beqz a4, .LBB7_3
209 ; RV32ZBB-NEXT:    j .LBB7_4
210 ; RV32ZBB-NEXT:  .LBB7_2:
211 ; RV32ZBB-NEXT:    sltu a4, a0, a2
212 ; RV32ZBB-NEXT:    bnez a4, .LBB7_4
213 ; RV32ZBB-NEXT:  .LBB7_3:
214 ; RV32ZBB-NEXT:    mv a0, a2
215 ; RV32ZBB-NEXT:    mv a1, a3
216 ; RV32ZBB-NEXT:  .LBB7_4:
217 ; RV32ZBB-NEXT:    ret
219 ; RV64ZBB-LABEL: smin_i64:
220 ; RV64ZBB:       # %bb.0:
221 ; RV64ZBB-NEXT:    min a0, a0, a1
222 ; RV64ZBB-NEXT:    ret
223   %c = call i64 @llvm.smin.i64(i64 %a, i64 %b)
224   ret i64 %c
227 declare i8 @llvm.umax.i8(i8 %a, i8 %b) readnone
229 define i8 @umax_i8(i8 zeroext %a, i8 zeroext %b) {
230 ; NOZBB-LABEL: umax_i8:
231 ; NOZBB:       # %bb.0:
232 ; NOZBB-NEXT:    bltu a1, a0, .LBB8_2
233 ; NOZBB-NEXT:  # %bb.1:
234 ; NOZBB-NEXT:    mv a0, a1
235 ; NOZBB-NEXT:  .LBB8_2:
236 ; NOZBB-NEXT:    ret
238 ; ZBB-LABEL: umax_i8:
239 ; ZBB:       # %bb.0:
240 ; ZBB-NEXT:    maxu a0, a0, a1
241 ; ZBB-NEXT:    ret
242   %c = call i8 @llvm.umax.i8(i8 %a, i8 %b)
243   ret i8 %c
246 declare i16 @llvm.umax.i16(i16 %a, i16 %b) readnone
248 define i16 @umax_i16(i16 zeroext %a, i16 zeroext %b) {
249 ; NOZBB-LABEL: umax_i16:
250 ; NOZBB:       # %bb.0:
251 ; NOZBB-NEXT:    bltu a1, a0, .LBB9_2
252 ; NOZBB-NEXT:  # %bb.1:
253 ; NOZBB-NEXT:    mv a0, a1
254 ; NOZBB-NEXT:  .LBB9_2:
255 ; NOZBB-NEXT:    ret
257 ; ZBB-LABEL: umax_i16:
258 ; ZBB:       # %bb.0:
259 ; ZBB-NEXT:    maxu a0, a0, a1
260 ; ZBB-NEXT:    ret
261   %c = call i16 @llvm.umax.i16(i16 %a, i16 %b)
262   ret i16 %c
265 declare i32 @llvm.umax.i32(i32 %a, i32 %b) readnone
267 define signext i32 @umax_i32(i32 signext %a, i32 signext %b) {
268 ; NOZBB-LABEL: umax_i32:
269 ; NOZBB:       # %bb.0:
270 ; NOZBB-NEXT:    bltu a1, a0, .LBB10_2
271 ; NOZBB-NEXT:  # %bb.1:
272 ; NOZBB-NEXT:    mv a0, a1
273 ; NOZBB-NEXT:  .LBB10_2:
274 ; NOZBB-NEXT:    ret
276 ; ZBB-LABEL: umax_i32:
277 ; ZBB:       # %bb.0:
278 ; ZBB-NEXT:    maxu a0, a0, a1
279 ; ZBB-NEXT:    ret
280   %c = call i32 @llvm.umax.i32(i32 %a, i32 %b)
281   ret i32 %c
284 declare i64 @llvm.umax.i64(i64 %a, i64 %b) readnone
286 define i64 @umax_i64(i64 %a, i64 %b) {
287 ; RV32I-LABEL: umax_i64:
288 ; RV32I:       # %bb.0:
289 ; RV32I-NEXT:    beq a1, a3, .LBB11_2
290 ; RV32I-NEXT:  # %bb.1:
291 ; RV32I-NEXT:    sltu a4, a3, a1
292 ; RV32I-NEXT:    beqz a4, .LBB11_3
293 ; RV32I-NEXT:    j .LBB11_4
294 ; RV32I-NEXT:  .LBB11_2:
295 ; RV32I-NEXT:    sltu a4, a2, a0
296 ; RV32I-NEXT:    bnez a4, .LBB11_4
297 ; RV32I-NEXT:  .LBB11_3:
298 ; RV32I-NEXT:    mv a0, a2
299 ; RV32I-NEXT:    mv a1, a3
300 ; RV32I-NEXT:  .LBB11_4:
301 ; RV32I-NEXT:    ret
303 ; RV64I-LABEL: umax_i64:
304 ; RV64I:       # %bb.0:
305 ; RV64I-NEXT:    bltu a1, a0, .LBB11_2
306 ; RV64I-NEXT:  # %bb.1:
307 ; RV64I-NEXT:    mv a0, a1
308 ; RV64I-NEXT:  .LBB11_2:
309 ; RV64I-NEXT:    ret
311 ; RV32ZBB-LABEL: umax_i64:
312 ; RV32ZBB:       # %bb.0:
313 ; RV32ZBB-NEXT:    beq a1, a3, .LBB11_2
314 ; RV32ZBB-NEXT:  # %bb.1:
315 ; RV32ZBB-NEXT:    sltu a4, a3, a1
316 ; RV32ZBB-NEXT:    beqz a4, .LBB11_3
317 ; RV32ZBB-NEXT:    j .LBB11_4
318 ; RV32ZBB-NEXT:  .LBB11_2:
319 ; RV32ZBB-NEXT:    sltu a4, a2, a0
320 ; RV32ZBB-NEXT:    bnez a4, .LBB11_4
321 ; RV32ZBB-NEXT:  .LBB11_3:
322 ; RV32ZBB-NEXT:    mv a0, a2
323 ; RV32ZBB-NEXT:    mv a1, a3
324 ; RV32ZBB-NEXT:  .LBB11_4:
325 ; RV32ZBB-NEXT:    ret
327 ; RV64ZBB-LABEL: umax_i64:
328 ; RV64ZBB:       # %bb.0:
329 ; RV64ZBB-NEXT:    maxu a0, a0, a1
330 ; RV64ZBB-NEXT:    ret
331   %c = call i64 @llvm.umax.i64(i64 %a, i64 %b)
332   ret i64 %c
335 declare i8 @llvm.umin.i8(i8 %a, i8 %b) readnone
337 define zeroext i8 @umin_i8(i8 zeroext %a, i8 zeroext %b) {
338 ; NOZBB-LABEL: umin_i8:
339 ; NOZBB:       # %bb.0:
340 ; NOZBB-NEXT:    bltu a0, a1, .LBB12_2
341 ; NOZBB-NEXT:  # %bb.1:
342 ; NOZBB-NEXT:    mv a0, a1
343 ; NOZBB-NEXT:  .LBB12_2:
344 ; NOZBB-NEXT:    ret
346 ; ZBB-LABEL: umin_i8:
347 ; ZBB:       # %bb.0:
348 ; ZBB-NEXT:    minu a0, a0, a1
349 ; ZBB-NEXT:    ret
350   %c = call i8 @llvm.umin.i8(i8 %a, i8 %b)
351   ret i8 %c
354 declare i16 @llvm.umin.i16(i16 %a, i16 %b) readnone
356 define zeroext i16 @umin_i16(i16 zeroext %a, i16 zeroext %b) {
357 ; NOZBB-LABEL: umin_i16:
358 ; NOZBB:       # %bb.0:
359 ; NOZBB-NEXT:    bltu a0, a1, .LBB13_2
360 ; NOZBB-NEXT:  # %bb.1:
361 ; NOZBB-NEXT:    mv a0, a1
362 ; NOZBB-NEXT:  .LBB13_2:
363 ; NOZBB-NEXT:    ret
365 ; ZBB-LABEL: umin_i16:
366 ; ZBB:       # %bb.0:
367 ; ZBB-NEXT:    minu a0, a0, a1
368 ; ZBB-NEXT:    ret
369   %c = call i16 @llvm.umin.i16(i16 %a, i16 %b)
370   ret i16 %c
373 declare i32 @llvm.umin.i32(i32 %a, i32 %b) readnone
375 define signext i32 @umin_i32(i32 signext %a, i32 signext %b) {
376 ; NOZBB-LABEL: umin_i32:
377 ; NOZBB:       # %bb.0:
378 ; NOZBB-NEXT:    bltu a0, a1, .LBB14_2
379 ; NOZBB-NEXT:  # %bb.1:
380 ; NOZBB-NEXT:    mv a0, a1
381 ; NOZBB-NEXT:  .LBB14_2:
382 ; NOZBB-NEXT:    ret
384 ; ZBB-LABEL: umin_i32:
385 ; ZBB:       # %bb.0:
386 ; ZBB-NEXT:    minu a0, a0, a1
387 ; ZBB-NEXT:    ret
388   %c = call i32 @llvm.umin.i32(i32 %a, i32 %b)
389   ret i32 %c
392 declare i64 @llvm.umin.i64(i64 %a, i64 %b) readnone
394 define i64 @umin_i64(i64 %a, i64 %b) {
395 ; RV32I-LABEL: umin_i64:
396 ; RV32I:       # %bb.0:
397 ; RV32I-NEXT:    beq a1, a3, .LBB15_2
398 ; RV32I-NEXT:  # %bb.1:
399 ; RV32I-NEXT:    sltu a4, a1, a3
400 ; RV32I-NEXT:    beqz a4, .LBB15_3
401 ; RV32I-NEXT:    j .LBB15_4
402 ; RV32I-NEXT:  .LBB15_2:
403 ; RV32I-NEXT:    sltu a4, a0, a2
404 ; RV32I-NEXT:    bnez a4, .LBB15_4
405 ; RV32I-NEXT:  .LBB15_3:
406 ; RV32I-NEXT:    mv a0, a2
407 ; RV32I-NEXT:    mv a1, a3
408 ; RV32I-NEXT:  .LBB15_4:
409 ; RV32I-NEXT:    ret
411 ; RV64I-LABEL: umin_i64:
412 ; RV64I:       # %bb.0:
413 ; RV64I-NEXT:    bltu a0, a1, .LBB15_2
414 ; RV64I-NEXT:  # %bb.1:
415 ; RV64I-NEXT:    mv a0, a1
416 ; RV64I-NEXT:  .LBB15_2:
417 ; RV64I-NEXT:    ret
419 ; RV32ZBB-LABEL: umin_i64:
420 ; RV32ZBB:       # %bb.0:
421 ; RV32ZBB-NEXT:    beq a1, a3, .LBB15_2
422 ; RV32ZBB-NEXT:  # %bb.1:
423 ; RV32ZBB-NEXT:    sltu a4, a1, a3
424 ; RV32ZBB-NEXT:    beqz a4, .LBB15_3
425 ; RV32ZBB-NEXT:    j .LBB15_4
426 ; RV32ZBB-NEXT:  .LBB15_2:
427 ; RV32ZBB-NEXT:    sltu a4, a0, a2
428 ; RV32ZBB-NEXT:    bnez a4, .LBB15_4
429 ; RV32ZBB-NEXT:  .LBB15_3:
430 ; RV32ZBB-NEXT:    mv a0, a2
431 ; RV32ZBB-NEXT:    mv a1, a3
432 ; RV32ZBB-NEXT:  .LBB15_4:
433 ; RV32ZBB-NEXT:    ret
435 ; RV64ZBB-LABEL: umin_i64:
436 ; RV64ZBB:       # %bb.0:
437 ; RV64ZBB-NEXT:    minu a0, a0, a1
438 ; RV64ZBB-NEXT:    ret
439   %c = call i64 @llvm.umin.i64(i64 %a, i64 %b)
440   ret i64 %c
443 ; Tests with the same operand used twice. These should fold away.
445 define signext i32 @smin_same_op_i32(i32 signext %a) {
446 ; NOZBB-LABEL: smin_same_op_i32:
447 ; NOZBB:       # %bb.0:
448 ; NOZBB-NEXT:    ret
450 ; ZBB-LABEL: smin_same_op_i32:
451 ; ZBB:       # %bb.0:
452 ; ZBB-NEXT:    ret
453   %c = call i32 @llvm.smin.i32(i32 %a, i32 %a)
454   ret i32 %c
457 define signext i32 @smax_same_op_i32(i32 signext %a) {
458 ; NOZBB-LABEL: smax_same_op_i32:
459 ; NOZBB:       # %bb.0:
460 ; NOZBB-NEXT:    ret
462 ; ZBB-LABEL: smax_same_op_i32:
463 ; ZBB:       # %bb.0:
464 ; ZBB-NEXT:    ret
465   %c = call i32 @llvm.smax.i32(i32 %a, i32 %a)
466   ret i32 %c
469 define signext i32 @umin_same_op_i32(i32 signext %a) {
470 ; NOZBB-LABEL: umin_same_op_i32:
471 ; NOZBB:       # %bb.0:
472 ; NOZBB-NEXT:    ret
474 ; ZBB-LABEL: umin_same_op_i32:
475 ; ZBB:       # %bb.0:
476 ; ZBB-NEXT:    ret
477   %c = call i32 @llvm.umin.i32(i32 %a, i32 %a)
478   ret i32 %c
481 define signext i32 @umax_same_op_i32(i32 signext %a) {
482 ; NOZBB-LABEL: umax_same_op_i32:
483 ; NOZBB:       # %bb.0:
484 ; NOZBB-NEXT:    ret
486 ; ZBB-LABEL: umax_same_op_i32:
487 ; ZBB:       # %bb.0:
488 ; ZBB-NEXT:    ret
489   %c = call i32 @llvm.umax.i32(i32 %a, i32 %a)
490   ret i32 %c
493 ; Tests with undef operands. These should fold to undef for RV32 or 0 for RV64.
495 define signext i32 @smin_undef_i32() {
496 ; RV32I-LABEL: smin_undef_i32:
497 ; RV32I:       # %bb.0:
498 ; RV32I-NEXT:    ret
500 ; RV64I-LABEL: smin_undef_i32:
501 ; RV64I:       # %bb.0:
502 ; RV64I-NEXT:    li a0, 0
503 ; RV64I-NEXT:    ret
505 ; RV32ZBB-LABEL: smin_undef_i32:
506 ; RV32ZBB:       # %bb.0:
507 ; RV32ZBB-NEXT:    ret
509 ; RV64ZBB-LABEL: smin_undef_i32:
510 ; RV64ZBB:       # %bb.0:
511 ; RV64ZBB-NEXT:    li a0, 0
512 ; RV64ZBB-NEXT:    ret
513   %c = call i32 @llvm.smin.i32(i32 undef, i32 undef)
514   ret i32 %c
517 define signext i32 @smax_undef_i32() {
518 ; RV32I-LABEL: smax_undef_i32:
519 ; RV32I:       # %bb.0:
520 ; RV32I-NEXT:    ret
522 ; RV64I-LABEL: smax_undef_i32:
523 ; RV64I:       # %bb.0:
524 ; RV64I-NEXT:    li a0, 0
525 ; RV64I-NEXT:    ret
527 ; RV32ZBB-LABEL: smax_undef_i32:
528 ; RV32ZBB:       # %bb.0:
529 ; RV32ZBB-NEXT:    ret
531 ; RV64ZBB-LABEL: smax_undef_i32:
532 ; RV64ZBB:       # %bb.0:
533 ; RV64ZBB-NEXT:    li a0, 0
534 ; RV64ZBB-NEXT:    ret
535   %c = call i32 @llvm.smax.i32(i32 undef, i32 undef)
536   ret i32 %c
539 define signext i32 @umin_undef_i32() {
540 ; RV32I-LABEL: umin_undef_i32:
541 ; RV32I:       # %bb.0:
542 ; RV32I-NEXT:    ret
544 ; RV64I-LABEL: umin_undef_i32:
545 ; RV64I:       # %bb.0:
546 ; RV64I-NEXT:    li a0, 0
547 ; RV64I-NEXT:    ret
549 ; RV32ZBB-LABEL: umin_undef_i32:
550 ; RV32ZBB:       # %bb.0:
551 ; RV32ZBB-NEXT:    ret
553 ; RV64ZBB-LABEL: umin_undef_i32:
554 ; RV64ZBB:       # %bb.0:
555 ; RV64ZBB-NEXT:    li a0, 0
556 ; RV64ZBB-NEXT:    ret
557   %c = call i32 @llvm.umin.i32(i32 undef, i32 undef)
558   ret i32 %c
561 define signext i32 @umax_undef_i32() {
562 ; RV32I-LABEL: umax_undef_i32:
563 ; RV32I:       # %bb.0:
564 ; RV32I-NEXT:    ret
566 ; RV64I-LABEL: umax_undef_i32:
567 ; RV64I:       # %bb.0:
568 ; RV64I-NEXT:    li a0, 0
569 ; RV64I-NEXT:    ret
571 ; RV32ZBB-LABEL: umax_undef_i32:
572 ; RV32ZBB:       # %bb.0:
573 ; RV32ZBB-NEXT:    ret
575 ; RV64ZBB-LABEL: umax_undef_i32:
576 ; RV64ZBB:       # %bb.0:
577 ; RV64ZBB-NEXT:    li a0, 0
578 ; RV64ZBB-NEXT:    ret
579   %c = call i32 @llvm.umax.i32(i32 undef, i32 undef)
580   ret i32 %c
583 define signext i32 @smax_i32_pos_constant(i32 signext %a) {
584 ; NOZBB-LABEL: smax_i32_pos_constant:
585 ; NOZBB:       # %bb.0:
586 ; NOZBB-NEXT:    li a1, 10
587 ; NOZBB-NEXT:    blt a1, a0, .LBB24_2
588 ; NOZBB-NEXT:  # %bb.1:
589 ; NOZBB-NEXT:    li a0, 10
590 ; NOZBB-NEXT:  .LBB24_2:
591 ; NOZBB-NEXT:    ret
593 ; ZBB-LABEL: smax_i32_pos_constant:
594 ; ZBB:       # %bb.0:
595 ; ZBB-NEXT:    li a1, 10
596 ; ZBB-NEXT:    max a0, a0, a1
597 ; ZBB-NEXT:    ret
598   %c = call i32 @llvm.smax.i32(i32 %a, i32 10)
599   ret i32 %c
602 define signext i32 @smax_i32_pos_constant_trailing_zeros(i32 signext %a) {
603 ; NOZBB-LABEL: smax_i32_pos_constant_trailing_zeros:
604 ; NOZBB:       # %bb.0:
605 ; NOZBB-NEXT:    andi a0, a0, -8
606 ; NOZBB-NEXT:    li a1, 16
607 ; NOZBB-NEXT:    blt a1, a0, .LBB25_2
608 ; NOZBB-NEXT:  # %bb.1:
609 ; NOZBB-NEXT:    li a0, 16
610 ; NOZBB-NEXT:  .LBB25_2:
611 ; NOZBB-NEXT:    ret
613 ; ZBB-LABEL: smax_i32_pos_constant_trailing_zeros:
614 ; ZBB:       # %bb.0:
615 ; ZBB-NEXT:    andi a0, a0, -8
616 ; ZBB-NEXT:    li a1, 16
617 ; ZBB-NEXT:    max a0, a0, a1
618 ; ZBB-NEXT:    ret
619   %b = and i32 %a, -8
620   %c = call i32 @llvm.smax.i32(i32 %b, i32 16)
621   %d = and i32 %c, -4
622   ret i32 %d
625 define signext i32 @smin_i32_negone(i32 signext %a) {
626 ; NOZBB-LABEL: smin_i32_negone:
627 ; NOZBB:       # %bb.0:
628 ; NOZBB-NEXT:    slti a1, a0, -1
629 ; NOZBB-NEXT:    addi a1, a1, -1
630 ; NOZBB-NEXT:    or a0, a1, a0
631 ; NOZBB-NEXT:    ret
633 ; ZBB-LABEL: smin_i32_negone:
634 ; ZBB:       # %bb.0:
635 ; ZBB-NEXT:    li a1, -1
636 ; ZBB-NEXT:    min a0, a0, a1
637 ; ZBB-NEXT:    ret
638   %c = call i32 @llvm.smin.i32(i32 %a, i32 -1)
639   ret i32 %c
642 define i64 @smin_i64_negone(i64 %a) {
643 ; RV32I-LABEL: smin_i64_negone:
644 ; RV32I:       # %bb.0:
645 ; RV32I-NEXT:    slti a2, a1, 0
646 ; RV32I-NEXT:    addi a2, a2, -1
647 ; RV32I-NEXT:    or a0, a2, a0
648 ; RV32I-NEXT:    slti a2, a1, -1
649 ; RV32I-NEXT:    addi a2, a2, -1
650 ; RV32I-NEXT:    or a1, a2, a1
651 ; RV32I-NEXT:    ret
653 ; RV64I-LABEL: smin_i64_negone:
654 ; RV64I:       # %bb.0:
655 ; RV64I-NEXT:    slti a1, a0, -1
656 ; RV64I-NEXT:    addi a1, a1, -1
657 ; RV64I-NEXT:    or a0, a1, a0
658 ; RV64I-NEXT:    ret
660 ; RV32ZBB-LABEL: smin_i64_negone:
661 ; RV32ZBB:       # %bb.0:
662 ; RV32ZBB-NEXT:    li a2, -1
663 ; RV32ZBB-NEXT:    min a2, a1, a2
664 ; RV32ZBB-NEXT:    slti a1, a1, 0
665 ; RV32ZBB-NEXT:    addi a1, a1, -1
666 ; RV32ZBB-NEXT:    or a0, a1, a0
667 ; RV32ZBB-NEXT:    mv a1, a2
668 ; RV32ZBB-NEXT:    ret
670 ; RV64ZBB-LABEL: smin_i64_negone:
671 ; RV64ZBB:       # %bb.0:
672 ; RV64ZBB-NEXT:    li a1, -1
673 ; RV64ZBB-NEXT:    min a0, a0, a1
674 ; RV64ZBB-NEXT:    ret
675   %c = call i64 @llvm.smin.i64(i64 %a, i64 -1)
676   ret i64 %c
679 define i64 @umax_i64_one(i64 %a, i64 %b) {
680 ; RV32I-LABEL: umax_i64_one:
681 ; RV32I:       # %bb.0:
682 ; RV32I-NEXT:    mv a2, a0
683 ; RV32I-NEXT:    beqz a1, .LBB28_3
684 ; RV32I-NEXT:  # %bb.1:
685 ; RV32I-NEXT:    beqz a1, .LBB28_4
686 ; RV32I-NEXT:  .LBB28_2:
687 ; RV32I-NEXT:    ret
688 ; RV32I-NEXT:  .LBB28_3:
689 ; RV32I-NEXT:    li a0, 1
690 ; RV32I-NEXT:    bnez a1, .LBB28_2
691 ; RV32I-NEXT:  .LBB28_4:
692 ; RV32I-NEXT:    seqz a0, a2
693 ; RV32I-NEXT:    add a0, a2, a0
694 ; RV32I-NEXT:    ret
696 ; RV64I-LABEL: umax_i64_one:
697 ; RV64I:       # %bb.0:
698 ; RV64I-NEXT:    seqz a1, a0
699 ; RV64I-NEXT:    add a0, a0, a1
700 ; RV64I-NEXT:    ret
702 ; RV32ZBB-LABEL: umax_i64_one:
703 ; RV32ZBB:       # %bb.0:
704 ; RV32ZBB-NEXT:    mv a2, a0
705 ; RV32ZBB-NEXT:    li a3, 1
706 ; RV32ZBB-NEXT:    beqz a1, .LBB28_3
707 ; RV32ZBB-NEXT:  # %bb.1:
708 ; RV32ZBB-NEXT:    beqz a1, .LBB28_4
709 ; RV32ZBB-NEXT:  .LBB28_2:
710 ; RV32ZBB-NEXT:    ret
711 ; RV32ZBB-NEXT:  .LBB28_3:
712 ; RV32ZBB-NEXT:    li a0, 1
713 ; RV32ZBB-NEXT:    bnez a1, .LBB28_2
714 ; RV32ZBB-NEXT:  .LBB28_4:
715 ; RV32ZBB-NEXT:    maxu a0, a2, a3
716 ; RV32ZBB-NEXT:    ret
718 ; RV64ZBB-LABEL: umax_i64_one:
719 ; RV64ZBB:       # %bb.0:
720 ; RV64ZBB-NEXT:    li a1, 1
721 ; RV64ZBB-NEXT:    maxu a0, a0, a1
722 ; RV64ZBB-NEXT:    ret
723   %c = call i64 @llvm.umax.i64(i64 %a, i64 1)
724   ret i64 %c