Skip to content

[RISCV] Add packw+packh isel pattern for unaligned loads on RV64. #152095

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions llvm/lib/Target/RISCV/RISCVInstrInfoZb.td
Original file line number Diff line number Diff line change
Expand Up @@ -661,6 +661,13 @@ def : Pat<(binop_allwusers<or> (shl GPR:$rs2, (i64 16)),
def : Pat<(i64 (or (sext_inreg (shl GPR:$rs2, (i64 16)), i32),
(zexti16 (i64 GPR:$rs1)))),
(PACKW GPR:$rs1, GPR:$rs2)>;

// Match a packh for the high half with a zero extended value in the low half.
// If the low half also happens to be a packh, it can be matched separately.
Copy link
Member

@lenary lenary Aug 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(no longer a suggestion - I think I'm wrong)

// If the low half also happens to be a packw, it can be matched separately.

Copy link
Member

@lenary lenary Aug 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think?

def : Pat<(or (or (shl (zexti8 (XLenVT GPR:$op1rs2)), (XLenVT 24)),
(shl (zexti8 (XLenVT GPR:$op1rs1)), (XLenVT 16))),
(XLenVT GPR:$rs1)),
(PACKW GPR:$rs1, (XLenVT (PACKH GPR:$op1rs1, GPR:$op1rs2)))>;
} // Predicates = [HasStdExtZbkb, IsRV64]

let Predicates = [HasStdExtZbb, IsRV32] in
Expand Down
20 changes: 9 additions & 11 deletions llvm/test/CodeGen/RISCV/unaligned-load-store.ll
Original file line number Diff line number Diff line change
Expand Up @@ -204,18 +204,16 @@ define i64 @load_i64(ptr %p) {
; RV64IZBKB-NEXT: lbu a2, 5(a0)
; RV64IZBKB-NEXT: lbu a3, 6(a0)
; RV64IZBKB-NEXT: lbu a4, 7(a0)
; RV64IZBKB-NEXT: lbu a5, 0(a0)
; RV64IZBKB-NEXT: lbu a6, 1(a0)
; RV64IZBKB-NEXT: lbu a7, 2(a0)
; RV64IZBKB-NEXT: lbu a0, 3(a0)
; RV64IZBKB-NEXT: lbu a5, 1(a0)
; RV64IZBKB-NEXT: lbu a6, 2(a0)
; RV64IZBKB-NEXT: lbu a7, 3(a0)
; RV64IZBKB-NEXT: lbu a0, 0(a0)
; RV64IZBKB-NEXT: packh a3, a3, a4
; RV64IZBKB-NEXT: packh a1, a1, a2
; RV64IZBKB-NEXT: packh a2, a3, a4
; RV64IZBKB-NEXT: packh a3, a5, a6
; RV64IZBKB-NEXT: packh a0, a7, a0
; RV64IZBKB-NEXT: slli a2, a2, 16
; RV64IZBKB-NEXT: slli a0, a0, 16
; RV64IZBKB-NEXT: or a1, a2, a1
; RV64IZBKB-NEXT: or a0, a0, a3
; RV64IZBKB-NEXT: packh a2, a6, a7
; RV64IZBKB-NEXT: packh a0, a0, a5
; RV64IZBKB-NEXT: packw a1, a1, a3
; RV64IZBKB-NEXT: packw a0, a0, a2
; RV64IZBKB-NEXT: pack a0, a0, a1
; RV64IZBKB-NEXT: ret
;
Expand Down