1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3 ; RUN: | FileCheck %s -check-prefix=RV32I
5 define i32 @icmp_eq(i32 %a, i32 %b) nounwind {
6 ; RV32I-LABEL: icmp_eq:
8 ; RV32I-NEXT: xor a0, a0, a1
9 ; RV32I-NEXT: seqz a0, a0
11 %1 = icmp eq i32 %a, %b
12 %2 = zext i1 %1 to i32
16 define i32 @icmp_eq_constant(i32 %a) nounwind {
17 ; RV32I-LABEL: icmp_eq_constant:
19 ; RV32I-NEXT: addi a0, a0, -42
20 ; RV32I-NEXT: seqz a0, a0
22 %1 = icmp eq i32 %a, 42
23 %2 = zext i1 %1 to i32
27 define i32 @icmp_eq_constant_2049(i32 %a) nounwind {
28 ; RV32I-LABEL: icmp_eq_constant_2049:
30 ; RV32I-NEXT: lui a1, 1
31 ; RV32I-NEXT: addi a1, a1, -2047
32 ; RV32I-NEXT: xor a0, a0, a1
33 ; RV32I-NEXT: seqz a0, a0
35 %1 = icmp eq i32 %a, 2049
36 %2 = zext i1 %1 to i32
40 define i32 @icmp_eq_constant_2048(i32 %a) nounwind {
41 ; RV32I-LABEL: icmp_eq_constant_2048:
43 ; RV32I-NEXT: addi a0, a0, -2048
44 ; RV32I-NEXT: seqz a0, a0
46 %1 = icmp eq i32 %a, 2048
47 %2 = zext i1 %1 to i32
51 define i32 @icmp_eq_constant_neg_2048(i32 %a) nounwind {
52 ; RV32I-LABEL: icmp_eq_constant_neg_2048:
54 ; RV32I-NEXT: li a1, -2048
55 ; RV32I-NEXT: xor a0, a0, a1
56 ; RV32I-NEXT: seqz a0, a0
58 %1 = icmp eq i32 %a, -2048
59 %2 = zext i1 %1 to i32
63 define i32 @icmp_eq_constant_neg_2047(i32 %a) nounwind {
64 ; RV32I-LABEL: icmp_eq_constant_neg_2047:
66 ; RV32I-NEXT: addi a0, a0, 2047
67 ; RV32I-NEXT: seqz a0, a0
69 %1 = icmp eq i32 %a, -2047
70 %2 = zext i1 %1 to i32
74 define i32 @icmp_eqz(i32 %a) nounwind {
75 ; RV32I-LABEL: icmp_eqz:
77 ; RV32I-NEXT: seqz a0, a0
79 %1 = icmp eq i32 %a, 0
80 %2 = zext i1 %1 to i32
84 define i32 @icmp_ne(i32 %a, i32 %b) nounwind {
85 ; RV32I-LABEL: icmp_ne:
87 ; RV32I-NEXT: xor a0, a0, a1
88 ; RV32I-NEXT: snez a0, a0
90 %1 = icmp ne i32 %a, %b
91 %2 = zext i1 %1 to i32
95 define i32 @icmp_ne_constant(i32 %a) nounwind {
96 ; RV32I-LABEL: icmp_ne_constant:
98 ; RV32I-NEXT: addi a0, a0, -42
99 ; RV32I-NEXT: snez a0, a0
101 %1 = icmp ne i32 %a, 42
102 %2 = zext i1 %1 to i32
106 define i32 @icmp_ne_constant_2049(i32 %a) nounwind {
107 ; RV32I-LABEL: icmp_ne_constant_2049:
109 ; RV32I-NEXT: lui a1, 1
110 ; RV32I-NEXT: addi a1, a1, -2047
111 ; RV32I-NEXT: xor a0, a0, a1
112 ; RV32I-NEXT: snez a0, a0
114 %1 = icmp ne i32 %a, 2049
115 %2 = zext i1 %1 to i32
119 define i32 @icmp_ne_constant_2048(i32 %a) nounwind {
120 ; RV32I-LABEL: icmp_ne_constant_2048:
122 ; RV32I-NEXT: addi a0, a0, -2048
123 ; RV32I-NEXT: snez a0, a0
125 %1 = icmp ne i32 %a, 2048
126 %2 = zext i1 %1 to i32
130 define i32 @icmp_ne_constant_neg_2048(i32 %a) nounwind {
131 ; RV32I-LABEL: icmp_ne_constant_neg_2048:
133 ; RV32I-NEXT: li a1, -2048
134 ; RV32I-NEXT: xor a0, a0, a1
135 ; RV32I-NEXT: snez a0, a0
137 %1 = icmp ne i32 %a, -2048
138 %2 = zext i1 %1 to i32
142 define i32 @icmp_ne_constant_neg_2047(i32 %a) nounwind {
143 ; RV32I-LABEL: icmp_ne_constant_neg_2047:
145 ; RV32I-NEXT: addi a0, a0, 2047
146 ; RV32I-NEXT: snez a0, a0
148 %1 = icmp ne i32 %a, -2047
149 %2 = zext i1 %1 to i32
153 define i32 @icmp_nez(i32 %a) nounwind {
154 ; RV32I-LABEL: icmp_nez:
156 ; RV32I-NEXT: snez a0, a0
158 %1 = icmp ne i32 %a, 0
159 %2 = zext i1 %1 to i32
163 define i32 @icmp_ugt(i32 %a, i32 %b) nounwind {
164 ; RV32I-LABEL: icmp_ugt:
166 ; RV32I-NEXT: sltu a0, a1, a0
168 %1 = icmp ugt i32 %a, %b
169 %2 = zext i1 %1 to i32
173 define i32 @icmp_ugt_constant_zero(i32 %a) nounwind {
174 ; RV32I-LABEL: icmp_ugt_constant_zero:
176 ; RV32I-NEXT: snez a0, a0
178 %1 = icmp ugt i32 %a, 0
179 %2 = zext i1 %1 to i32
183 define i32 @icmp_ugt_constant_2047(i32 %a) nounwind {
184 ; RV32I-LABEL: icmp_ugt_constant_2047:
186 ; RV32I-NEXT: li a1, 2047
187 ; RV32I-NEXT: sltu a0, a1, a0
189 %1 = icmp ugt i32 %a, 2047
190 %2 = zext i1 %1 to i32
194 define i32 @icmp_ugt_constant_2046(i32 %a) nounwind {
195 ; RV32I-LABEL: icmp_ugt_constant_2046:
197 ; RV32I-NEXT: sltiu a0, a0, 2047
198 ; RV32I-NEXT: xori a0, a0, 1
200 %1 = icmp ugt i32 %a, 2046
201 %2 = zext i1 %1 to i32
205 define i32 @icmp_ugt_constant_neg_2049(i32 %a) nounwind {
206 ; RV32I-LABEL: icmp_ugt_constant_neg_2049:
208 ; RV32I-NEXT: sltiu a0, a0, -2048
209 ; RV32I-NEXT: xori a0, a0, 1
211 ; 4294965247 signed extend is -2049
212 %1 = icmp ugt i32 %a, 4294965247
213 %2 = zext i1 %1 to i32
217 define i32 @icmp_ugt_constant_neg_2050(i32 %a) nounwind {
218 ; RV32I-LABEL: icmp_ugt_constant_neg_2050:
220 ; RV32I-NEXT: lui a1, 1048575
221 ; RV32I-NEXT: addi a1, a1, 2046
222 ; RV32I-NEXT: sltu a0, a1, a0
224 ; 4294965246 signed extend is -2050
225 %1 = icmp ugt i32 %a, 4294965246
226 %2 = zext i1 %1 to i32
230 define i32 @icmp_uge(i32 %a, i32 %b) nounwind {
231 ; RV32I-LABEL: icmp_uge:
233 ; RV32I-NEXT: sltu a0, a0, a1
234 ; RV32I-NEXT: xori a0, a0, 1
236 %1 = icmp uge i32 %a, %b
237 %2 = zext i1 %1 to i32
241 define i32 @icmp_uge_constant_zero(i32 %a) nounwind {
242 ; RV32I-LABEL: icmp_uge_constant_zero:
244 ; RV32I-NEXT: li a0, 1
246 %1 = icmp uge i32 %a, 0
247 %2 = zext i1 %1 to i32
251 define i32 @icmp_uge_constant_2047(i32 %a) nounwind {
252 ; RV32I-LABEL: icmp_uge_constant_2047:
254 ; RV32I-NEXT: sltiu a0, a0, 2047
255 ; RV32I-NEXT: xori a0, a0, 1
257 %1 = icmp uge i32 %a, 2047
258 %2 = zext i1 %1 to i32
262 define i32 @icmp_uge_constant_2048(i32 %a) nounwind {
263 ; RV32I-LABEL: icmp_uge_constant_2048:
265 ; RV32I-NEXT: li a1, 2047
266 ; RV32I-NEXT: sltu a0, a1, a0
268 %1 = icmp uge i32 %a, 2048
269 %2 = zext i1 %1 to i32
273 define i32 @icmp_uge_constant_neg_2048(i32 %a) nounwind {
274 ; RV32I-LABEL: icmp_uge_constant_neg_2048:
276 ; RV32I-NEXT: sltiu a0, a0, -2048
277 ; RV32I-NEXT: xori a0, a0, 1
279 ; 4294965248 signed extend is -2048
280 %1 = icmp uge i32 %a, 4294965248
281 %2 = zext i1 %1 to i32
285 define i32 @icmp_uge_constant_neg_2049(i32 %a) nounwind {
286 ; RV32I-LABEL: icmp_uge_constant_neg_2049:
288 ; RV32I-NEXT: lui a1, 1048575
289 ; RV32I-NEXT: addi a1, a1, 2046
290 ; RV32I-NEXT: sltu a0, a1, a0
292 ; 4294965247 signed extend is -2049
293 %1 = icmp uge i32 %a, 4294965247
294 %2 = zext i1 %1 to i32
298 define i32 @icmp_ult(i32 %a, i32 %b) nounwind {
299 ; RV32I-LABEL: icmp_ult:
301 ; RV32I-NEXT: sltu a0, a0, a1
303 %1 = icmp ult i32 %a, %b
304 %2 = zext i1 %1 to i32
308 define i32 @icmp_ult_constant_zero(i32 %a) nounwind {
309 ; RV32I-LABEL: icmp_ult_constant_zero:
311 ; RV32I-NEXT: li a0, 0
313 %1 = icmp ult i32 %a, 0
314 %2 = zext i1 %1 to i32
318 define i32 @icmp_ult_constant_2047(i32 %a) nounwind {
319 ; RV32I-LABEL: icmp_ult_constant_2047:
321 ; RV32I-NEXT: sltiu a0, a0, 2047
323 %1 = icmp ult i32 %a, 2047
324 %2 = zext i1 %1 to i32
328 define i32 @icmp_ult_constant_2048(i32 %a) nounwind {
329 ; RV32I-LABEL: icmp_ult_constant_2048:
331 ; RV32I-NEXT: srli a0, a0, 11
332 ; RV32I-NEXT: seqz a0, a0
334 %1 = icmp ult i32 %a, 2048
335 %2 = zext i1 %1 to i32
339 define i32 @icmp_ult_constant_neg_2048(i32 %a) nounwind {
340 ; RV32I-LABEL: icmp_ult_constant_neg_2048:
342 ; RV32I-NEXT: sltiu a0, a0, -2048
344 ; 4294965248 signed extend is -2048
345 %1 = icmp ult i32 %a, 4294965248
346 %2 = zext i1 %1 to i32
350 define i32 @icmp_ult_constant_neg_2049(i32 %a) nounwind {
351 ; RV32I-LABEL: icmp_ult_constant_neg_2049:
353 ; RV32I-NEXT: lui a1, 1048575
354 ; RV32I-NEXT: addi a1, a1, 2047
355 ; RV32I-NEXT: sltu a0, a0, a1
357 ; 4294965247 signed extend is -2049
358 %1 = icmp ult i32 %a, 4294965247
359 %2 = zext i1 %1 to i32
363 define i32 @icmp_ule(i32 %a, i32 %b) nounwind {
364 ; RV32I-LABEL: icmp_ule:
366 ; RV32I-NEXT: sltu a0, a1, a0
367 ; RV32I-NEXT: xori a0, a0, 1
369 %1 = icmp ule i32 %a, %b
370 %2 = zext i1 %1 to i32
374 define i32 @icmp_ule_constant_zero(i32 %a) nounwind {
375 ; RV32I-LABEL: icmp_ule_constant_zero:
377 ; RV32I-NEXT: seqz a0, a0
379 %1 = icmp ule i32 %a, 0
380 %2 = zext i1 %1 to i32
384 define i32 @icmp_ule_constant_2046(i32 %a) nounwind {
385 ; RV32I-LABEL: icmp_ule_constant_2046:
387 ; RV32I-NEXT: sltiu a0, a0, 2047
389 %1 = icmp ule i32 %a, 2046
390 %2 = zext i1 %1 to i32
394 define i32 @icmp_ule_constant_2047(i32 %a) nounwind {
395 ; RV32I-LABEL: icmp_ule_constant_2047:
397 ; RV32I-NEXT: srli a0, a0, 11
398 ; RV32I-NEXT: seqz a0, a0
400 %1 = icmp ule i32 %a, 2047
401 %2 = zext i1 %1 to i32
405 define i32 @icmp_ule_constant_neg_2049(i32 %a) nounwind {
406 ; RV32I-LABEL: icmp_ule_constant_neg_2049:
408 ; RV32I-NEXT: sltiu a0, a0, -2048
410 ; 4294965247 signed extend is -2049
411 %1 = icmp ule i32 %a, 4294965247
412 %2 = zext i1 %1 to i32
416 define i32 @icmp_ule_constant_neg_2050(i32 %a) nounwind {
417 ; RV32I-LABEL: icmp_ule_constant_neg_2050:
419 ; RV32I-NEXT: lui a1, 1048575
420 ; RV32I-NEXT: addi a1, a1, 2047
421 ; RV32I-NEXT: sltu a0, a0, a1
423 ; 4294965246 signed extend is -2050
424 %1 = icmp ule i32 %a, 4294965246
425 %2 = zext i1 %1 to i32
429 define i32 @icmp_sgt(i32 %a, i32 %b) nounwind {
430 ; RV32I-LABEL: icmp_sgt:
432 ; RV32I-NEXT: slt a0, a1, a0
434 %1 = icmp sgt i32 %a, %b
435 %2 = zext i1 %1 to i32
439 define i32 @icmp_sgt_constant_zero(i32 %a) nounwind {
440 ; RV32I-LABEL: icmp_sgt_constant_zero:
442 ; RV32I-NEXT: sgtz a0, a0
444 %1 = icmp sgt i32 %a, 0
445 %2 = zext i1 %1 to i32
449 define i32 @icmp_sgt_constant_2046(i32 %a) nounwind {
450 ; RV32I-LABEL: icmp_sgt_constant_2046:
452 ; RV32I-NEXT: slti a0, a0, 2047
453 ; RV32I-NEXT: xori a0, a0, 1
455 %1 = icmp sgt i32 %a, 2046
456 %2 = zext i1 %1 to i32
460 define i32 @icmp_sgt_constant_2047(i32 %a) nounwind {
461 ; RV32I-LABEL: icmp_sgt_constant_2047:
463 ; RV32I-NEXT: li a1, 2047
464 ; RV32I-NEXT: slt a0, a1, a0
466 %1 = icmp sgt i32 %a, 2047
467 %2 = zext i1 %1 to i32
471 define i32 @icmp_sgt_constant_neg_2049(i32 %a) nounwind {
472 ; RV32I-LABEL: icmp_sgt_constant_neg_2049:
474 ; RV32I-NEXT: slti a0, a0, -2048
475 ; RV32I-NEXT: xori a0, a0, 1
477 %1 = icmp sgt i32 %a, -2049
478 %2 = zext i1 %1 to i32
482 define i32 @icmp_sgt_constant_neg_2050(i32 %a) nounwind {
483 ; RV32I-LABEL: icmp_sgt_constant_neg_2050:
485 ; RV32I-NEXT: lui a1, 1048575
486 ; RV32I-NEXT: addi a1, a1, 2046
487 ; RV32I-NEXT: slt a0, a1, a0
489 %1 = icmp sgt i32 %a, -2050
490 %2 = zext i1 %1 to i32
494 define i32 @icmp_sge(i32 %a, i32 %b) nounwind {
495 ; RV32I-LABEL: icmp_sge:
497 ; RV32I-NEXT: slt a0, a0, a1
498 ; RV32I-NEXT: xori a0, a0, 1
500 %1 = icmp sge i32 %a, %b
501 %2 = zext i1 %1 to i32
505 define i32 @icmp_sge_constant_zero(i32 %a) nounwind {
506 ; RV32I-LABEL: icmp_sge_constant_zero:
508 ; RV32I-NEXT: not a0, a0
509 ; RV32I-NEXT: srli a0, a0, 31
511 %1 = icmp sge i32 %a, 0
512 %2 = zext i1 %1 to i32
516 define i32 @icmp_sge_constant_2047(i32 %a) nounwind {
517 ; RV32I-LABEL: icmp_sge_constant_2047:
519 ; RV32I-NEXT: slti a0, a0, 2047
520 ; RV32I-NEXT: xori a0, a0, 1
522 %1 = icmp sge i32 %a, 2047
523 %2 = zext i1 %1 to i32
527 define i32 @icmp_sge_constant_2048(i32 %a) nounwind {
528 ; RV32I-LABEL: icmp_sge_constant_2048:
530 ; RV32I-NEXT: li a1, 2047
531 ; RV32I-NEXT: slt a0, a1, a0
533 %1 = icmp sge i32 %a, 2048
534 %2 = zext i1 %1 to i32
538 define i32 @icmp_sge_constant_neg_2047(i32 %a) nounwind {
539 ; RV32I-LABEL: icmp_sge_constant_neg_2047:
541 ; RV32I-NEXT: slti a0, a0, -2047
542 ; RV32I-NEXT: xori a0, a0, 1
544 %1 = icmp sge i32 %a, -2047
545 %2 = zext i1 %1 to i32
549 define i32 @icmp_sge_constant_neg_2048(i32 %a) nounwind {
550 ; RV32I-LABEL: icmp_sge_constant_neg_2048:
552 ; RV32I-NEXT: not a0, a0
553 ; RV32I-NEXT: srli a0, a0, 31
555 %1 = icmp sge i32 %a, 0
556 %2 = zext i1 %1 to i32
560 define i32 @icmp_slt(i32 %a, i32 %b) nounwind {
561 ; RV32I-LABEL: icmp_slt:
563 ; RV32I-NEXT: slt a0, a0, a1
565 %1 = icmp slt i32 %a, %b
566 %2 = zext i1 %1 to i32
570 define i32 @icmp_slt_constant_zero(i32 %a) nounwind {
571 ; RV32I-LABEL: icmp_slt_constant_zero:
573 ; RV32I-NEXT: srli a0, a0, 31
575 %1 = icmp slt i32 %a, 0
576 %2 = zext i1 %1 to i32
580 define i32 @icmp_slt_constant_2047(i32 %a) nounwind {
581 ; RV32I-LABEL: icmp_slt_constant_2047:
583 ; RV32I-NEXT: slti a0, a0, 2047
585 %1 = icmp slt i32 %a, 2047
586 %2 = zext i1 %1 to i32
590 define i32 @icmp_slt_constant_2048(i32 %a) nounwind {
591 ; RV32I-LABEL: icmp_slt_constant_2048:
593 ; RV32I-NEXT: lui a1, 1
594 ; RV32I-NEXT: addi a1, a1, -2048
595 ; RV32I-NEXT: slt a0, a0, a1
597 %1 = icmp slt i32 %a, 2048
598 %2 = zext i1 %1 to i32
602 define i32 @icmp_slt_constant_neg_2048(i32 %a) nounwind {
603 ; RV32I-LABEL: icmp_slt_constant_neg_2048:
605 ; RV32I-NEXT: slti a0, a0, -2048
607 %1 = icmp slt i32 %a, -2048
608 %2 = zext i1 %1 to i32
612 define i32 @icmp_slt_constant_neg_2049(i32 %a) nounwind {
613 ; RV32I-LABEL: icmp_slt_constant_neg_2049:
615 ; RV32I-NEXT: lui a1, 1048575
616 ; RV32I-NEXT: addi a1, a1, 2047
617 ; RV32I-NEXT: slt a0, a0, a1
619 %1 = icmp slt i32 %a, -2049
620 %2 = zext i1 %1 to i32
624 define i32 @icmp_sle(i32 %a, i32 %b) nounwind {
625 ; RV32I-LABEL: icmp_sle:
627 ; RV32I-NEXT: slt a0, a1, a0
628 ; RV32I-NEXT: xori a0, a0, 1
630 %1 = icmp sle i32 %a, %b
631 %2 = zext i1 %1 to i32
635 define i32 @icmp_sle_constant_zero(i32 %a) nounwind {
636 ; RV32I-LABEL: icmp_sle_constant_zero:
638 ; RV32I-NEXT: slti a0, a0, 1
640 %1 = icmp sle i32 %a, 0
641 %2 = zext i1 %1 to i32
645 define i32 @icmp_sle_constant_2046(i32 %a) nounwind {
646 ; RV32I-LABEL: icmp_sle_constant_2046:
648 ; RV32I-NEXT: slti a0, a0, 2047
650 %1 = icmp sle i32 %a, 2046
651 %2 = zext i1 %1 to i32
655 define i32 @icmp_sle_constant_2047(i32 %a) nounwind {
656 ; RV32I-LABEL: icmp_sle_constant_2047:
658 ; RV32I-NEXT: lui a1, 1
659 ; RV32I-NEXT: addi a1, a1, -2048
660 ; RV32I-NEXT: slt a0, a0, a1
662 %1 = icmp sle i32 %a, 2047
663 %2 = zext i1 %1 to i32
667 define i32 @icmp_sle_constant_neg_2049(i32 %a) nounwind {
668 ; RV32I-LABEL: icmp_sle_constant_neg_2049:
670 ; RV32I-NEXT: slti a0, a0, -2048
672 %1 = icmp sle i32 %a, -2049
673 %2 = zext i1 %1 to i32
677 define i32 @icmp_sle_constant_neg_2050(i32 %a) nounwind {
678 ; RV32I-LABEL: icmp_sle_constant_neg_2050:
680 ; RV32I-NEXT: lui a1, 1048575
681 ; RV32I-NEXT: addi a1, a1, 2047
682 ; RV32I-NEXT: slt a0, a0, a1
684 %1 = icmp sle i32 %a, -2050
685 %2 = zext i1 %1 to i32