|
11 | 11 | ; RUN: | FileCheck -check-prefixes=RV32,ZICOND,ZICOND32 %s |
12 | 12 | ; RUN: llc -mtriple=riscv64 -mattr=+zicond -verify-machineinstrs < %s \ |
13 | 13 | ; RUN: | FileCheck -check-prefixes=ZICOND,ZICOND64 %s |
| 14 | +; RUN: llc -mtriple=riscv64 -mattr=+c,+conditional-cmv-fusion \ |
| 15 | +; RUN: -verify-machineinstrs < %s | FileCheck -check-prefixes=CMV-FUSION %s |
14 | 16 |
|
15 | 17 | ; InstCombine canonicalizes (c ? x | y : x) to (x | (c ? y : 0)) similar for |
16 | 18 | ; other binary operations using their identity value as the constant. |
@@ -55,6 +57,16 @@ define signext i32 @and_select_all_ones_i32(i1 zeroext %c, i32 signext %x, i32 s |
55 | 57 | ; ZICOND-NEXT: and a1, a2, a1 |
56 | 58 | ; ZICOND-NEXT: or a0, a1, a0 |
57 | 59 | ; ZICOND-NEXT: ret |
| 60 | +; |
| 61 | +; CMV-FUSION-LABEL: and_select_all_ones_i32: |
| 62 | +; CMV-FUSION: # %bb.0: |
| 63 | +; CMV-FUSION-NEXT: and a1, a1, a2 |
| 64 | +; CMV-FUSION-NEXT: bnez a0, .LBB0_2 |
| 65 | +; CMV-FUSION-NEXT: # %bb.1: |
| 66 | +; CMV-FUSION-NEXT: mv a1, a2 |
| 67 | +; CMV-FUSION-NEXT: .LBB0_2: |
| 68 | +; CMV-FUSION-NEXT: mv a0, a1 |
| 69 | +; CMV-FUSION-NEXT: ret |
58 | 70 | %a = select i1 %c, i32 %x, i32 -1 |
59 | 71 | %b = and i32 %a, %y |
60 | 72 | ret i32 %b |
@@ -104,6 +116,16 @@ define signext i32 @and_select_all_ones_i32_cmp(i32 signext %x, i32 signext %y, |
104 | 116 | ; ZICOND-NEXT: czero.eqz a1, a1, a2 |
105 | 117 | ; ZICOND-NEXT: or a0, a0, a1 |
106 | 118 | ; ZICOND-NEXT: ret |
| 119 | +; |
| 120 | +; CMV-FUSION-LABEL: and_select_all_ones_i32_cmp: |
| 121 | +; CMV-FUSION: # %bb.0: |
| 122 | +; CMV-FUSION-NEXT: and a0, a0, a1 |
| 123 | +; CMV-FUSION-NEXT: li a3, 4 |
| 124 | +; CMV-FUSION-NEXT: beq a2, a3, .LBB1_2 |
| 125 | +; CMV-FUSION-NEXT: # %bb.1: |
| 126 | +; CMV-FUSION-NEXT: mv a0, a1 |
| 127 | +; CMV-FUSION-NEXT: .LBB1_2: |
| 128 | +; CMV-FUSION-NEXT: ret |
107 | 129 | %c = icmp eq i32 %z, 4 |
108 | 130 | %a = select i1 %c, i32 %x, i32 -1 |
109 | 131 | %b = and i32 %a, %y |
@@ -152,6 +174,16 @@ define signext i32 @and_select_all_ones_i32_cmp2(i32 signext %x, i32 signext %y, |
152 | 174 | ; ZICOND-NEXT: czero.nez a1, a1, a2 |
153 | 175 | ; ZICOND-NEXT: or a0, a0, a1 |
154 | 176 | ; ZICOND-NEXT: ret |
| 177 | +; |
| 178 | +; CMV-FUSION-LABEL: and_select_all_ones_i32_cmp2: |
| 179 | +; CMV-FUSION: # %bb.0: |
| 180 | +; CMV-FUSION-NEXT: and a0, a0, a1 |
| 181 | +; CMV-FUSION-NEXT: li a3, 4 |
| 182 | +; CMV-FUSION-NEXT: blt a2, a3, .LBB2_2 |
| 183 | +; CMV-FUSION-NEXT: # %bb.1: |
| 184 | +; CMV-FUSION-NEXT: mv a0, a1 |
| 185 | +; CMV-FUSION-NEXT: .LBB2_2: |
| 186 | +; CMV-FUSION-NEXT: ret |
155 | 187 | %c = icmp slt i32 %z, 4 |
156 | 188 | %a = select i1 %c, i32 %x, i32 -1 |
157 | 189 | %b = and i32 %a, %y |
@@ -197,6 +229,16 @@ define i64 @and_select_all_ones_i64(i1 zeroext %c, i64 %x, i64 %y) { |
197 | 229 | ; ZICOND64-NEXT: and a1, a2, a1 |
198 | 230 | ; ZICOND64-NEXT: or a0, a1, a0 |
199 | 231 | ; ZICOND64-NEXT: ret |
| 232 | +; |
| 233 | +; CMV-FUSION-LABEL: and_select_all_ones_i64: |
| 234 | +; CMV-FUSION: # %bb.0: |
| 235 | +; CMV-FUSION-NEXT: and a1, a1, a2 |
| 236 | +; CMV-FUSION-NEXT: beqz a0, .LBB3_2 |
| 237 | +; CMV-FUSION-NEXT: # %bb.1: |
| 238 | +; CMV-FUSION-NEXT: mv a1, a2 |
| 239 | +; CMV-FUSION-NEXT: .LBB3_2: |
| 240 | +; CMV-FUSION-NEXT: mv a0, a1 |
| 241 | +; CMV-FUSION-NEXT: ret |
200 | 242 | %a = select i1 %c, i64 -1, i64 %x |
201 | 243 | %b = and i64 %y, %a |
202 | 244 | ret i64 %b |
@@ -249,6 +291,16 @@ define i64 @and_select_all_ones_i64_cmp(i64 %x, i64 %y, i64 %z) { |
249 | 291 | ; ZICOND64-NEXT: czero.eqz a1, a1, a2 |
250 | 292 | ; ZICOND64-NEXT: or a0, a0, a1 |
251 | 293 | ; ZICOND64-NEXT: ret |
| 294 | +; |
| 295 | +; CMV-FUSION-LABEL: and_select_all_ones_i64_cmp: |
| 296 | +; CMV-FUSION: # %bb.0: |
| 297 | +; CMV-FUSION-NEXT: and a0, a0, a1 |
| 298 | +; CMV-FUSION-NEXT: li a3, 4 |
| 299 | +; CMV-FUSION-NEXT: beq a2, a3, .LBB4_2 |
| 300 | +; CMV-FUSION-NEXT: # %bb.1: |
| 301 | +; CMV-FUSION-NEXT: mv a0, a1 |
| 302 | +; CMV-FUSION-NEXT: .LBB4_2: |
| 303 | +; CMV-FUSION-NEXT: ret |
252 | 304 | %c = icmp eq i64 %z, 4 |
253 | 305 | %a = select i1 %c, i64 %x, i64 -1 |
254 | 306 | %b = and i64 %a, %y |
@@ -319,6 +371,16 @@ define i64 @and_select_all_ones_i64_cmp2(i64 %x, i64 %y, i64 %z) { |
319 | 371 | ; ZICOND64-NEXT: czero.nez a1, a1, a2 |
320 | 372 | ; ZICOND64-NEXT: or a0, a0, a1 |
321 | 373 | ; ZICOND64-NEXT: ret |
| 374 | +; |
| 375 | +; CMV-FUSION-LABEL: and_select_all_ones_i64_cmp2: |
| 376 | +; CMV-FUSION: # %bb.0: |
| 377 | +; CMV-FUSION-NEXT: and a0, a0, a1 |
| 378 | +; CMV-FUSION-NEXT: li a3, 4 |
| 379 | +; CMV-FUSION-NEXT: blt a2, a3, .LBB5_2 |
| 380 | +; CMV-FUSION-NEXT: # %bb.1: |
| 381 | +; CMV-FUSION-NEXT: mv a0, a1 |
| 382 | +; CMV-FUSION-NEXT: .LBB5_2: |
| 383 | +; CMV-FUSION-NEXT: ret |
322 | 384 | %c = icmp slt i64 %z, 4 |
323 | 385 | %a = select i1 %c, i64 %x, i64 -1 |
324 | 386 | %b = and i64 %a, %y |
@@ -360,6 +422,16 @@ define signext i32 @or_select_all_zeros_i32(i1 zeroext %c, i32 signext %x, i32 s |
360 | 422 | ; ZICOND-NEXT: czero.eqz a0, a1, a0 |
361 | 423 | ; ZICOND-NEXT: or a0, a2, a0 |
362 | 424 | ; ZICOND-NEXT: ret |
| 425 | +; |
| 426 | +; CMV-FUSION-LABEL: or_select_all_zeros_i32: |
| 427 | +; CMV-FUSION: # %bb.0: |
| 428 | +; CMV-FUSION-NEXT: or a1, a1, a2 |
| 429 | +; CMV-FUSION-NEXT: bnez a0, .LBB6_2 |
| 430 | +; CMV-FUSION-NEXT: # %bb.1: |
| 431 | +; CMV-FUSION-NEXT: mv a1, a2 |
| 432 | +; CMV-FUSION-NEXT: .LBB6_2: |
| 433 | +; CMV-FUSION-NEXT: mv a0, a1 |
| 434 | +; CMV-FUSION-NEXT: ret |
363 | 435 | %a = select i1 %c, i32 %x, i32 0 |
364 | 436 | %b = or i32 %y, %a |
365 | 437 | ret i32 %b |
@@ -410,6 +482,16 @@ define i64 @or_select_all_zeros_i64(i1 zeroext %c, i64 %x, i64 %y) { |
410 | 482 | ; ZICOND64-NEXT: czero.nez a0, a1, a0 |
411 | 483 | ; ZICOND64-NEXT: or a0, a0, a2 |
412 | 484 | ; ZICOND64-NEXT: ret |
| 485 | +; |
| 486 | +; CMV-FUSION-LABEL: or_select_all_zeros_i64: |
| 487 | +; CMV-FUSION: # %bb.0: |
| 488 | +; CMV-FUSION-NEXT: or a1, a1, a2 |
| 489 | +; CMV-FUSION-NEXT: beqz a0, .LBB7_2 |
| 490 | +; CMV-FUSION-NEXT: # %bb.1: |
| 491 | +; CMV-FUSION-NEXT: mv a1, a2 |
| 492 | +; CMV-FUSION-NEXT: .LBB7_2: |
| 493 | +; CMV-FUSION-NEXT: mv a0, a1 |
| 494 | +; CMV-FUSION-NEXT: ret |
413 | 495 | %a = select i1 %c, i64 0, i64 %x |
414 | 496 | %b = or i64 %a, %y |
415 | 497 | ret i64 %b |
@@ -450,6 +532,16 @@ define signext i32 @xor_select_all_zeros_i32(i1 zeroext %c, i32 signext %x, i32 |
450 | 532 | ; ZICOND-NEXT: czero.nez a0, a1, a0 |
451 | 533 | ; ZICOND-NEXT: xor a0, a2, a0 |
452 | 534 | ; ZICOND-NEXT: ret |
| 535 | +; |
| 536 | +; CMV-FUSION-LABEL: xor_select_all_zeros_i32: |
| 537 | +; CMV-FUSION: # %bb.0: |
| 538 | +; CMV-FUSION-NEXT: xor a1, a1, a2 |
| 539 | +; CMV-FUSION-NEXT: beqz a0, .LBB8_2 |
| 540 | +; CMV-FUSION-NEXT: # %bb.1: |
| 541 | +; CMV-FUSION-NEXT: mv a1, a2 |
| 542 | +; CMV-FUSION-NEXT: .LBB8_2: |
| 543 | +; CMV-FUSION-NEXT: mv a0, a1 |
| 544 | +; CMV-FUSION-NEXT: ret |
453 | 545 | %a = select i1 %c, i32 0, i32 %x |
454 | 546 | %b = xor i32 %y, %a |
455 | 547 | ret i32 %b |
@@ -500,6 +592,16 @@ define i64 @xor_select_all_zeros_i64(i1 zeroext %c, i64 %x, i64 %y) { |
500 | 592 | ; ZICOND64-NEXT: czero.eqz a0, a1, a0 |
501 | 593 | ; ZICOND64-NEXT: xor a0, a0, a2 |
502 | 594 | ; ZICOND64-NEXT: ret |
| 595 | +; |
| 596 | +; CMV-FUSION-LABEL: xor_select_all_zeros_i64: |
| 597 | +; CMV-FUSION: # %bb.0: |
| 598 | +; CMV-FUSION-NEXT: xor a1, a1, a2 |
| 599 | +; CMV-FUSION-NEXT: bnez a0, .LBB9_2 |
| 600 | +; CMV-FUSION-NEXT: # %bb.1: |
| 601 | +; CMV-FUSION-NEXT: mv a1, a2 |
| 602 | +; CMV-FUSION-NEXT: .LBB9_2: |
| 603 | +; CMV-FUSION-NEXT: mv a0, a1 |
| 604 | +; CMV-FUSION-NEXT: ret |
503 | 605 | %a = select i1 %c, i64 %x, i64 0 |
504 | 606 | %b = xor i64 %a, %y |
505 | 607 | ret i64 %b |
@@ -546,6 +648,16 @@ define signext i32 @add_select_all_zeros_i32(i1 zeroext %c, i32 signext %x, i32 |
546 | 648 | ; ZICOND64-NEXT: czero.nez a0, a1, a0 |
547 | 649 | ; ZICOND64-NEXT: addw a0, a2, a0 |
548 | 650 | ; ZICOND64-NEXT: ret |
| 651 | +; |
| 652 | +; CMV-FUSION-LABEL: add_select_all_zeros_i32: |
| 653 | +; CMV-FUSION: # %bb.0: |
| 654 | +; CMV-FUSION-NEXT: addw a1, a1, a2 |
| 655 | +; CMV-FUSION-NEXT: beqz a0, .LBB10_2 |
| 656 | +; CMV-FUSION-NEXT: # %bb.1: |
| 657 | +; CMV-FUSION-NEXT: mv a1, a2 |
| 658 | +; CMV-FUSION-NEXT: .LBB10_2: |
| 659 | +; CMV-FUSION-NEXT: mv a0, a1 |
| 660 | +; CMV-FUSION-NEXT: ret |
549 | 661 | %a = select i1 %c, i32 0, i32 %x |
550 | 662 | %b = add i32 %y, %a |
551 | 663 | ret i32 %b |
@@ -600,6 +712,16 @@ define i64 @add_select_all_zeros_i64(i1 zeroext %c, i64 %x, i64 %y) { |
600 | 712 | ; ZICOND64-NEXT: czero.eqz a0, a1, a0 |
601 | 713 | ; ZICOND64-NEXT: add a0, a0, a2 |
602 | 714 | ; ZICOND64-NEXT: ret |
| 715 | +; |
| 716 | +; CMV-FUSION-LABEL: add_select_all_zeros_i64: |
| 717 | +; CMV-FUSION: # %bb.0: |
| 718 | +; CMV-FUSION-NEXT: add a1, a1, a2 |
| 719 | +; CMV-FUSION-NEXT: bnez a0, .LBB11_2 |
| 720 | +; CMV-FUSION-NEXT: # %bb.1: |
| 721 | +; CMV-FUSION-NEXT: mv a1, a2 |
| 722 | +; CMV-FUSION-NEXT: .LBB11_2: |
| 723 | +; CMV-FUSION-NEXT: mv a0, a1 |
| 724 | +; CMV-FUSION-NEXT: ret |
603 | 725 | %a = select i1 %c, i64 %x, i64 0 |
604 | 726 | %b = add i64 %a, %y |
605 | 727 | ret i64 %b |
@@ -646,6 +768,16 @@ define signext i32 @sub_select_all_zeros_i32(i1 zeroext %c, i32 signext %x, i32 |
646 | 768 | ; ZICOND64-NEXT: czero.nez a0, a1, a0 |
647 | 769 | ; ZICOND64-NEXT: subw a0, a2, a0 |
648 | 770 | ; ZICOND64-NEXT: ret |
| 771 | +; |
| 772 | +; CMV-FUSION-LABEL: sub_select_all_zeros_i32: |
| 773 | +; CMV-FUSION: # %bb.0: |
| 774 | +; CMV-FUSION-NEXT: subw a1, a2, a1 |
| 775 | +; CMV-FUSION-NEXT: beqz a0, .LBB12_2 |
| 776 | +; CMV-FUSION-NEXT: # %bb.1: |
| 777 | +; CMV-FUSION-NEXT: mv a1, a2 |
| 778 | +; CMV-FUSION-NEXT: .LBB12_2: |
| 779 | +; CMV-FUSION-NEXT: mv a0, a1 |
| 780 | +; CMV-FUSION-NEXT: ret |
649 | 781 | %a = select i1 %c, i32 0, i32 %x |
650 | 782 | %b = sub i32 %y, %a |
651 | 783 | ret i32 %b |
@@ -700,6 +832,16 @@ define i64 @sub_select_all_zeros_i64(i1 zeroext %c, i64 %x, i64 %y) { |
700 | 832 | ; ZICOND64-NEXT: czero.eqz a0, a1, a0 |
701 | 833 | ; ZICOND64-NEXT: sub a0, a2, a0 |
702 | 834 | ; ZICOND64-NEXT: ret |
| 835 | +; |
| 836 | +; CMV-FUSION-LABEL: sub_select_all_zeros_i64: |
| 837 | +; CMV-FUSION: # %bb.0: |
| 838 | +; CMV-FUSION-NEXT: sub a1, a2, a1 |
| 839 | +; CMV-FUSION-NEXT: bnez a0, .LBB13_2 |
| 840 | +; CMV-FUSION-NEXT: # %bb.1: |
| 841 | +; CMV-FUSION-NEXT: mv a1, a2 |
| 842 | +; CMV-FUSION-NEXT: .LBB13_2: |
| 843 | +; CMV-FUSION-NEXT: mv a0, a1 |
| 844 | +; CMV-FUSION-NEXT: ret |
703 | 845 | %a = select i1 %c, i64 %x, i64 0 |
704 | 846 | %b = sub i64 %y, %a |
705 | 847 | ret i64 %b |
|
0 commit comments