Skip to content

Commit bf09636

Browse files
committed
[RISCV] Add (shl (zext GPR:), uimm5:) pattern for -riscv-experimental-rv64-legal-i32.
1 parent d235cb0 commit bf09636

File tree

2 files changed

+15
-20
lines changed

2 files changed

+15
-20
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2050,6 +2050,11 @@ def : Pat<(i32 (and GPR:$rs, TrailingOnesMask:$mask)),
20502050

20512051
let Predicates = [IsRV64, NotHasStdExtZba] in {
20522052
def : Pat<(zext GPR:$src), (SRLI (SLLI GPR:$src, 32), 32)>;
2053+
2054+
// If we're shifting a 32-bit zero extended value left by 0-31 bits, use 2
2055+
// shifts instead of 3. This can occur when unsigned is used to index an array.
2056+
def : Pat<(shl (zext GPR:$rs), uimm5:$shamt),
2057+
(SRLI (SLLI GPR:$rs, 32), (ImmSubFrom32 uimm5:$shamt))>;
20532058
}
20542059

20552060
//===----------------------------------------------------------------------===//

llvm/test/CodeGen/RISCV/rv64-legal-i32/rv64zba.ll

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ define i128 @slliuw_3(i32 signext %0, ptr %1) {
5050
; RV64I: # %bb.0:
5151
; RV64I-NEXT: addi a0, a0, 1
5252
; RV64I-NEXT: slli a0, a0, 32
53-
; RV64I-NEXT: srli a0, a0, 32
54-
; RV64I-NEXT: slli a0, a0, 4
53+
; RV64I-NEXT: srli a0, a0, 28
5554
; RV64I-NEXT: add a1, a1, a0
5655
; RV64I-NEXT: ld a0, 0(a1)
5756
; RV64I-NEXT: ld a1, 8(a1)
@@ -1514,8 +1513,7 @@ define signext i32 @srliw_1_sh2add(ptr %0, i32 signext %1) {
15141513
; RV64I: # %bb.0:
15151514
; RV64I-NEXT: srliw a1, a1, 1
15161515
; RV64I-NEXT: slli a1, a1, 32
1517-
; RV64I-NEXT: srli a1, a1, 32
1518-
; RV64I-NEXT: slli a1, a1, 2
1516+
; RV64I-NEXT: srli a1, a1, 30
15191517
; RV64I-NEXT: add a0, a0, a1
15201518
; RV64I-NEXT: lw a0, 0(a0)
15211519
; RV64I-NEXT: ret
@@ -1539,8 +1537,7 @@ define i64 @srliw_1_sh3add(ptr %0, i32 signext %1) {
15391537
; RV64I: # %bb.0:
15401538
; RV64I-NEXT: srliw a1, a1, 1
15411539
; RV64I-NEXT: slli a1, a1, 32
1542-
; RV64I-NEXT: srli a1, a1, 32
1543-
; RV64I-NEXT: slli a1, a1, 3
1540+
; RV64I-NEXT: srli a1, a1, 29
15441541
; RV64I-NEXT: add a0, a0, a1
15451542
; RV64I-NEXT: ld a0, 0(a0)
15461543
; RV64I-NEXT: ret
@@ -1564,8 +1561,7 @@ define i64 @srliw_2_sh3add(ptr %0, i32 signext %1) {
15641561
; RV64I: # %bb.0:
15651562
; RV64I-NEXT: srliw a1, a1, 2
15661563
; RV64I-NEXT: slli a1, a1, 32
1567-
; RV64I-NEXT: srli a1, a1, 32
1568-
; RV64I-NEXT: slli a1, a1, 3
1564+
; RV64I-NEXT: srli a1, a1, 29
15691565
; RV64I-NEXT: add a0, a0, a1
15701566
; RV64I-NEXT: ld a0, 0(a0)
15711567
; RV64I-NEXT: ret
@@ -1589,8 +1585,7 @@ define signext i16 @srliw_2_sh1add(ptr %0, i32 signext %1) {
15891585
; RV64I: # %bb.0:
15901586
; RV64I-NEXT: srliw a1, a1, 2
15911587
; RV64I-NEXT: slli a1, a1, 32
1592-
; RV64I-NEXT: srli a1, a1, 32
1593-
; RV64I-NEXT: slli a1, a1, 1
1588+
; RV64I-NEXT: srli a1, a1, 31
15941589
; RV64I-NEXT: add a0, a0, a1
15951590
; RV64I-NEXT: lh a0, 0(a0)
15961591
; RV64I-NEXT: ret
@@ -1615,8 +1610,7 @@ define signext i32 @srliw_3_sh2add(ptr %0, i32 signext %1) {
16151610
; RV64I: # %bb.0:
16161611
; RV64I-NEXT: srliw a1, a1, 3
16171612
; RV64I-NEXT: slli a1, a1, 32
1618-
; RV64I-NEXT: srli a1, a1, 32
1619-
; RV64I-NEXT: slli a1, a1, 2
1613+
; RV64I-NEXT: srli a1, a1, 30
16201614
; RV64I-NEXT: add a0, a0, a1
16211615
; RV64I-NEXT: lw a0, 0(a0)
16221616
; RV64I-NEXT: ret
@@ -1640,8 +1634,7 @@ define i64 @srliw_4_sh3add(ptr %0, i32 signext %1) {
16401634
; RV64I: # %bb.0:
16411635
; RV64I-NEXT: srliw a1, a1, 4
16421636
; RV64I-NEXT: slli a1, a1, 32
1643-
; RV64I-NEXT: srli a1, a1, 32
1644-
; RV64I-NEXT: slli a1, a1, 3
1637+
; RV64I-NEXT: srli a1, a1, 29
16451638
; RV64I-NEXT: add a0, a0, a1
16461639
; RV64I-NEXT: ld a0, 0(a0)
16471640
; RV64I-NEXT: ret
@@ -1770,8 +1763,7 @@ define signext i16 @shl_2_sh1add(ptr %0, i32 signext %1) {
17701763
; RV64I: # %bb.0:
17711764
; RV64I-NEXT: slli a1, a1, 2
17721765
; RV64I-NEXT: slli a1, a1, 32
1773-
; RV64I-NEXT: srli a1, a1, 32
1774-
; RV64I-NEXT: slli a1, a1, 1
1766+
; RV64I-NEXT: srli a1, a1, 31
17751767
; RV64I-NEXT: add a0, a0, a1
17761768
; RV64I-NEXT: lh a0, 0(a0)
17771769
; RV64I-NEXT: ret
@@ -1795,8 +1787,7 @@ define signext i32 @shl_16_sh2add(ptr %0, i32 signext %1) {
17951787
; RV64I: # %bb.0:
17961788
; RV64I-NEXT: slli a1, a1, 16
17971789
; RV64I-NEXT: slli a1, a1, 32
1798-
; RV64I-NEXT: srli a1, a1, 32
1799-
; RV64I-NEXT: slli a1, a1, 2
1790+
; RV64I-NEXT: srli a1, a1, 30
18001791
; RV64I-NEXT: add a0, a0, a1
18011792
; RV64I-NEXT: lw a0, 0(a0)
18021793
; RV64I-NEXT: ret
@@ -1820,8 +1811,7 @@ define i64 @shl_31_sh3add(ptr %0, i32 signext %1) {
18201811
; RV64I: # %bb.0:
18211812
; RV64I-NEXT: slli a1, a1, 31
18221813
; RV64I-NEXT: slli a1, a1, 32
1823-
; RV64I-NEXT: srli a1, a1, 32
1824-
; RV64I-NEXT: slli a1, a1, 3
1814+
; RV64I-NEXT: srli a1, a1, 29
18251815
; RV64I-NEXT: add a0, a0, a1
18261816
; RV64I-NEXT: ld a0, 0(a0)
18271817
; RV64I-NEXT: ret

0 commit comments

Comments
 (0)