|
11 | 11 | ; RUN: | FileCheck -check-prefixes=SHORT_FORWARD,SFB-NOZICOND,SFB-NOZICOND-C %s
|
12 | 12 | ; RUN: llc -mtriple=riscv64 -mattr=+short-forward-branch-opt,+zicond -verify-machineinstrs < %s \
|
13 | 13 | ; RUN: | FileCheck -check-prefixes=SHORT_FORWARD,SFB-ZICOND %s
|
| 14 | +; RUN: llc -mtriple=riscv32 -mattr=+experimental-xqcicm,+experimental-xqcics,+experimental-xqcicli,+zca,+short-forward-branch-opt,+conditional-cmv-fusion -verify-machineinstrs < %s \ |
| 15 | +; RUN: | FileCheck %s --check-prefixes=RV32IXQCI |
14 | 16 |
|
15 | 17 | ; The conditional move optimization in sifive-p450 requires that only a
|
16 | 18 | ; single c.mv instruction appears in the branch shadow.
|
@@ -42,6 +44,14 @@ define signext i32 @test1(i32 signext %x, i32 signext %y, i32 signext %z) {
|
42 | 44 | ; SHORT_FORWARD-NEXT: xor a0, a0, a1
|
43 | 45 | ; SHORT_FORWARD-NEXT: .LBB0_2:
|
44 | 46 | ; SHORT_FORWARD-NEXT: ret
|
| 47 | +; |
| 48 | +; RV32IXQCI-LABEL: test1: |
| 49 | +; RV32IXQCI: # %bb.0: |
| 50 | +; RV32IXQCI-NEXT: bnez a2, .LBB0_2 |
| 51 | +; RV32IXQCI-NEXT: # %bb.1: |
| 52 | +; RV32IXQCI-NEXT: xor a0, a0, a1 |
| 53 | +; RV32IXQCI-NEXT: .LBB0_2: |
| 54 | +; RV32IXQCI-NEXT: ret |
45 | 55 | %c = icmp eq i32 %z, 0
|
46 | 56 | %a = xor i32 %x, %y
|
47 | 57 | %b = select i1 %c, i32 %a, i32 %x
|
@@ -73,6 +83,14 @@ define signext i32 @test2(i32 signext %x, i32 signext %y, i32 signext %z) {
|
73 | 83 | ; SHORT_FORWARD-NEXT: xor a0, a0, a1
|
74 | 84 | ; SHORT_FORWARD-NEXT: .LBB1_2:
|
75 | 85 | ; SHORT_FORWARD-NEXT: ret
|
| 86 | +; |
| 87 | +; RV32IXQCI-LABEL: test2: |
| 88 | +; RV32IXQCI: # %bb.0: |
| 89 | +; RV32IXQCI-NEXT: beqz a2, .LBB1_2 |
| 90 | +; RV32IXQCI-NEXT: # %bb.1: |
| 91 | +; RV32IXQCI-NEXT: xor a0, a0, a1 |
| 92 | +; RV32IXQCI-NEXT: .LBB1_2: |
| 93 | +; RV32IXQCI-NEXT: ret |
76 | 94 | %c = icmp eq i32 %z, 0
|
77 | 95 | %a = xor i32 %x, %y
|
78 | 96 | %b = select i1 %c, i32 %x, i32 %a
|
@@ -120,6 +138,19 @@ define signext i32 @test3(i32 signext %v, i32 signext %w, i32 signext %x, i32 si
|
120 | 138 | ; SHORT_FORWARD-NEXT: .LBB2_4:
|
121 | 139 | ; SHORT_FORWARD-NEXT: addw a0, a0, a2
|
122 | 140 | ; SHORT_FORWARD-NEXT: ret
|
| 141 | +; |
| 142 | +; RV32IXQCI-LABEL: test3: |
| 143 | +; RV32IXQCI: # %bb.0: |
| 144 | +; RV32IXQCI-NEXT: beqz a4, .LBB2_2 |
| 145 | +; RV32IXQCI-NEXT: # %bb.1: |
| 146 | +; RV32IXQCI-NEXT: xor a0, a0, a1 |
| 147 | +; RV32IXQCI-NEXT: .LBB2_2: |
| 148 | +; RV32IXQCI-NEXT: beqz a4, .LBB2_4 |
| 149 | +; RV32IXQCI-NEXT: # %bb.3: |
| 150 | +; RV32IXQCI-NEXT: xor a2, a2, a3 |
| 151 | +; RV32IXQCI-NEXT: .LBB2_4: |
| 152 | +; RV32IXQCI-NEXT: add a0, a0, a2 |
| 153 | +; RV32IXQCI-NEXT: ret |
123 | 154 | %c = icmp eq i32 %z, 0
|
124 | 155 | %a = xor i32 %v, %w
|
125 | 156 | %b = select i1 %c, i32 %v, i32 %a
|
@@ -167,6 +198,12 @@ define signext i32 @test4(i32 signext %x, i32 signext %y, i32 signext %z) {
|
167 | 198 | ; SFB-ZICOND-NEXT: li a0, 3
|
168 | 199 | ; SFB-ZICOND-NEXT: czero.nez a0, a0, a2
|
169 | 200 | ; SFB-ZICOND-NEXT: ret
|
| 201 | +; |
| 202 | +; RV32IXQCI-LABEL: test4: |
| 203 | +; RV32IXQCI: # %bb.0: |
| 204 | +; RV32IXQCI-NEXT: li a0, 0 |
| 205 | +; RV32IXQCI-NEXT: qc.lieqi a0, a2, 0, 3 |
| 206 | +; RV32IXQCI-NEXT: ret |
170 | 207 | %c = icmp eq i32 %z, 0
|
171 | 208 | %a = select i1 %c, i32 3, i32 0
|
172 | 209 | ret i32 %a
|
@@ -199,6 +236,15 @@ define i16 @select_xor_1(i16 %A, i8 %cond) {
|
199 | 236 | ; SHORT_FORWARD-NEXT: xori a0, a0, 43
|
200 | 237 | ; SHORT_FORWARD-NEXT: .LBB4_2: # %entry
|
201 | 238 | ; SHORT_FORWARD-NEXT: ret
|
| 239 | +; |
| 240 | +; RV32IXQCI-LABEL: select_xor_1: |
| 241 | +; RV32IXQCI: # %bb.0: # %entry |
| 242 | +; RV32IXQCI-NEXT: andi a1, a1, 1 |
| 243 | +; RV32IXQCI-NEXT: beqz a1, .LBB4_2 |
| 244 | +; RV32IXQCI-NEXT: # %bb.1: # %entry |
| 245 | +; RV32IXQCI-NEXT: xori a0, a0, 43 |
| 246 | +; RV32IXQCI-NEXT: .LBB4_2: # %entry |
| 247 | +; RV32IXQCI-NEXT: ret |
202 | 248 | entry:
|
203 | 249 | %and = and i8 %cond, 1
|
204 | 250 | %cmp10 = icmp eq i8 %and, 0
|
@@ -236,6 +282,15 @@ define i16 @select_xor_1b(i16 %A, i8 %cond) {
|
236 | 282 | ; SHORT_FORWARD-NEXT: xori a0, a0, 43
|
237 | 283 | ; SHORT_FORWARD-NEXT: .LBB5_2: # %entry
|
238 | 284 | ; SHORT_FORWARD-NEXT: ret
|
| 285 | +; |
| 286 | +; RV32IXQCI-LABEL: select_xor_1b: |
| 287 | +; RV32IXQCI: # %bb.0: # %entry |
| 288 | +; RV32IXQCI-NEXT: andi a1, a1, 1 |
| 289 | +; RV32IXQCI-NEXT: beqz a1, .LBB5_2 |
| 290 | +; RV32IXQCI-NEXT: # %bb.1: # %entry |
| 291 | +; RV32IXQCI-NEXT: xori a0, a0, 43 |
| 292 | +; RV32IXQCI-NEXT: .LBB5_2: # %entry |
| 293 | +; RV32IXQCI-NEXT: ret |
239 | 294 | entry:
|
240 | 295 | %and = and i8 %cond, 1
|
241 | 296 | %cmp10 = icmp ne i8 %and, 1
|
@@ -289,6 +344,15 @@ define i32 @select_xor_2(i32 %A, i32 %B, i8 %cond) {
|
289 | 344 | ; SFB-ZICOND-NEXT: xor a0, a1, a0
|
290 | 345 | ; SFB-ZICOND-NEXT: .LBB6_2: # %entry
|
291 | 346 | ; SFB-ZICOND-NEXT: ret
|
| 347 | +; |
| 348 | +; RV32IXQCI-LABEL: select_xor_2: |
| 349 | +; RV32IXQCI: # %bb.0: # %entry |
| 350 | +; RV32IXQCI-NEXT: andi a2, a2, 1 |
| 351 | +; RV32IXQCI-NEXT: beqz a2, .LBB6_2 |
| 352 | +; RV32IXQCI-NEXT: # %bb.1: # %entry |
| 353 | +; RV32IXQCI-NEXT: xor a0, a0, a1 |
| 354 | +; RV32IXQCI-NEXT: .LBB6_2: # %entry |
| 355 | +; RV32IXQCI-NEXT: ret |
292 | 356 | entry:
|
293 | 357 | %and = and i8 %cond, 1
|
294 | 358 | %cmp10 = icmp eq i8 %and, 0
|
@@ -344,6 +408,15 @@ define i32 @select_xor_2b(i32 %A, i32 %B, i8 %cond) {
|
344 | 408 | ; SFB-ZICOND-NEXT: xor a0, a1, a0
|
345 | 409 | ; SFB-ZICOND-NEXT: .LBB7_2: # %entry
|
346 | 410 | ; SFB-ZICOND-NEXT: ret
|
| 411 | +; |
| 412 | +; RV32IXQCI-LABEL: select_xor_2b: |
| 413 | +; RV32IXQCI: # %bb.0: # %entry |
| 414 | +; RV32IXQCI-NEXT: andi a2, a2, 1 |
| 415 | +; RV32IXQCI-NEXT: beqz a2, .LBB7_2 |
| 416 | +; RV32IXQCI-NEXT: # %bb.1: # %entry |
| 417 | +; RV32IXQCI-NEXT: xor a0, a0, a1 |
| 418 | +; RV32IXQCI-NEXT: .LBB7_2: # %entry |
| 419 | +; RV32IXQCI-NEXT: ret |
347 | 420 | entry:
|
348 | 421 | %and = and i8 %cond, 1
|
349 | 422 | %cmp10 = icmp ne i8 %and, 1
|
@@ -397,6 +470,15 @@ define i32 @select_or(i32 %A, i32 %B, i8 %cond) {
|
397 | 470 | ; SFB-ZICOND-NEXT: or a0, a1, a0
|
398 | 471 | ; SFB-ZICOND-NEXT: .LBB8_2: # %entry
|
399 | 472 | ; SFB-ZICOND-NEXT: ret
|
| 473 | +; |
| 474 | +; RV32IXQCI-LABEL: select_or: |
| 475 | +; RV32IXQCI: # %bb.0: # %entry |
| 476 | +; RV32IXQCI-NEXT: andi a2, a2, 1 |
| 477 | +; RV32IXQCI-NEXT: beqz a2, .LBB8_2 |
| 478 | +; RV32IXQCI-NEXT: # %bb.1: # %entry |
| 479 | +; RV32IXQCI-NEXT: or a0, a0, a1 |
| 480 | +; RV32IXQCI-NEXT: .LBB8_2: # %entry |
| 481 | +; RV32IXQCI-NEXT: ret |
400 | 482 | entry:
|
401 | 483 | %and = and i8 %cond, 1
|
402 | 484 | %cmp10 = icmp eq i8 %and, 0
|
@@ -452,6 +534,15 @@ define i32 @select_or_b(i32 %A, i32 %B, i8 %cond) {
|
452 | 534 | ; SFB-ZICOND-NEXT: or a0, a1, a0
|
453 | 535 | ; SFB-ZICOND-NEXT: .LBB9_2: # %entry
|
454 | 536 | ; SFB-ZICOND-NEXT: ret
|
| 537 | +; |
| 538 | +; RV32IXQCI-LABEL: select_or_b: |
| 539 | +; RV32IXQCI: # %bb.0: # %entry |
| 540 | +; RV32IXQCI-NEXT: andi a2, a2, 1 |
| 541 | +; RV32IXQCI-NEXT: beqz a2, .LBB9_2 |
| 542 | +; RV32IXQCI-NEXT: # %bb.1: # %entry |
| 543 | +; RV32IXQCI-NEXT: or a0, a0, a1 |
| 544 | +; RV32IXQCI-NEXT: .LBB9_2: # %entry |
| 545 | +; RV32IXQCI-NEXT: ret |
455 | 546 | entry:
|
456 | 547 | %and = and i8 %cond, 1
|
457 | 548 | %cmp10 = icmp ne i8 %and, 1
|
@@ -505,6 +596,15 @@ define i32 @select_or_1(i32 %A, i32 %B, i32 %cond) {
|
505 | 596 | ; SFB-ZICOND-NEXT: or a0, a1, a0
|
506 | 597 | ; SFB-ZICOND-NEXT: .LBB10_2: # %entry
|
507 | 598 | ; SFB-ZICOND-NEXT: ret
|
| 599 | +; |
| 600 | +; RV32IXQCI-LABEL: select_or_1: |
| 601 | +; RV32IXQCI: # %bb.0: # %entry |
| 602 | +; RV32IXQCI-NEXT: andi a2, a2, 1 |
| 603 | +; RV32IXQCI-NEXT: beqz a2, .LBB10_2 |
| 604 | +; RV32IXQCI-NEXT: # %bb.1: # %entry |
| 605 | +; RV32IXQCI-NEXT: or a0, a0, a1 |
| 606 | +; RV32IXQCI-NEXT: .LBB10_2: # %entry |
| 607 | +; RV32IXQCI-NEXT: ret |
508 | 608 | entry:
|
509 | 609 | %and = and i32 %cond, 1
|
510 | 610 | %cmp10 = icmp eq i32 %and, 0
|
@@ -560,6 +660,15 @@ define i32 @select_or_1b(i32 %A, i32 %B, i32 %cond) {
|
560 | 660 | ; SFB-ZICOND-NEXT: or a0, a1, a0
|
561 | 661 | ; SFB-ZICOND-NEXT: .LBB11_2: # %entry
|
562 | 662 | ; SFB-ZICOND-NEXT: ret
|
| 663 | +; |
| 664 | +; RV32IXQCI-LABEL: select_or_1b: |
| 665 | +; RV32IXQCI: # %bb.0: # %entry |
| 666 | +; RV32IXQCI-NEXT: andi a2, a2, 1 |
| 667 | +; RV32IXQCI-NEXT: beqz a2, .LBB11_2 |
| 668 | +; RV32IXQCI-NEXT: # %bb.1: # %entry |
| 669 | +; RV32IXQCI-NEXT: or a0, a0, a1 |
| 670 | +; RV32IXQCI-NEXT: .LBB11_2: # %entry |
| 671 | +; RV32IXQCI-NEXT: ret |
563 | 672 | entry:
|
564 | 673 | %and = and i32 %cond, 1
|
565 | 674 | %cmp10 = icmp ne i32 %and, 1
|
|
0 commit comments