From fb8f9d66249aefe4fe0b302b298175f2f9bb0aaa Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Fri, 8 Aug 2025 07:52:23 -0700 Subject: [PATCH 1/2] Pre-commit test. --- llvm/test/CodeGen/RISCV/rv64zbkb.ll | 32 +++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/llvm/test/CodeGen/RISCV/rv64zbkb.ll b/llvm/test/CodeGen/RISCV/rv64zbkb.ll index f2c41db781067..56dedbd7aa0c3 100644 --- a/llvm/test/CodeGen/RISCV/rv64zbkb.ll +++ b/llvm/test/CodeGen/RISCV/rv64zbkb.ll @@ -495,6 +495,38 @@ define void @pack_lo_packh_hi_packh_3(i8 %0, i8 %1, i8 %2, i8 %3, ptr %p) nounwi ret void } +define i32 @pack_lo_packh_hi_packh_4(i8 zeroext %0, i8 zeroext %1, i8 zeroext %2, i8 zeroext %3, ptr %p) nounwind { +; RV64I-LABEL: pack_lo_packh_hi_packh_4: +; RV64I: # %bb.0: +; RV64I-NEXT: slli a1, a1, 8 +; RV64I-NEXT: slli a2, a2, 16 +; RV64I-NEXT: slliw a3, a3, 24 +; RV64I-NEXT: or a0, a0, a1 +; RV64I-NEXT: or a2, a2, a3 +; RV64I-NEXT: or a0, a0, a2 +; RV64I-NEXT: ret +; +; RV64ZBKB-LABEL: pack_lo_packh_hi_packh_4: +; RV64ZBKB: # %bb.0: +; RV64ZBKB-NEXT: slli a2, a2, 16 +; RV64ZBKB-NEXT: slliw a3, a3, 24 +; RV64ZBKB-NEXT: packh a0, a0, a1 +; RV64ZBKB-NEXT: or a0, a0, a2 +; RV64ZBKB-NEXT: or a0, a0, a3 +; RV64ZBKB-NEXT: ret + %a = zext i8 %0 to i32 + %b = zext i8 %1 to i32 + %c = zext i8 %2 to i32 + %d = zext i8 %3 to i32 + %e = shl i32 %b, 8 + %f = shl i32 %c, 16 + %g = shl i32 %d, 24 + %h = or i32 %a, %e + %i = or i32 %h, %f + %j = or i32 %i, %g + ret i32 %j +} + define void @pack_lo_zext_hi_packh(i16 zeroext %0, i8 zeroext %1, i8 zeroext %2, ptr %p) nounwind { ; RV64I-LABEL: pack_lo_zext_hi_packh: ; RV64I: # %bb.0: From 0d8144c0b2d1b86612efccbdca314ce950bdee69 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Fri, 8 Aug 2025 08:13:45 -0700 Subject: [PATCH 2/2] [RISCV] Add another packh+packw pattern. If the upper 32 bits are demanded, we might have a sext_inreg in the pattern on the byte shifted by 24. We can also match this case since packw sign extends from bit 31. --- llvm/lib/Target/RISCV/RISCVInstrInfoZb.td | 5 +++++ llvm/test/CodeGen/RISCV/rv64zbkb.ll | 6 ++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td index 413ad8b2f9cc9..ee623d3ad5e04 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td @@ -692,6 +692,11 @@ def : Pat<(binop_allwusers (shl GPR:$op1rs1, (XLenVT 24))), (shl (zexti8 (XLenVT GPR:$op1rs2)), (XLenVT 16))), (PACKW GPR:$rs1, (XLenVT (PACKH GPR:$op1rs1, GPR:$op1rs2)))>; + +def : Pat<(i64 (or (or (zexti16 (XLenVT GPR:$rs1)), + (shl (zexti8 (XLenVT GPR:$op1rs2)), (XLenVT 16))), + (sext_inreg (shl GPR:$op1rs1, (XLenVT 24)), i32))), + (PACKW GPR:$rs1, (XLenVT (PACKH GPR:$op1rs1, GPR:$op1rs2)))>; } // Predicates = [HasStdExtZbkb, IsRV64] let Predicates = [HasStdExtZbb, IsRV32] in diff --git a/llvm/test/CodeGen/RISCV/rv64zbkb.ll b/llvm/test/CodeGen/RISCV/rv64zbkb.ll index 56dedbd7aa0c3..4537d187a9857 100644 --- a/llvm/test/CodeGen/RISCV/rv64zbkb.ll +++ b/llvm/test/CodeGen/RISCV/rv64zbkb.ll @@ -508,11 +508,9 @@ define i32 @pack_lo_packh_hi_packh_4(i8 zeroext %0, i8 zeroext %1, i8 zeroext %2 ; ; RV64ZBKB-LABEL: pack_lo_packh_hi_packh_4: ; RV64ZBKB: # %bb.0: -; RV64ZBKB-NEXT: slli a2, a2, 16 -; RV64ZBKB-NEXT: slliw a3, a3, 24 ; RV64ZBKB-NEXT: packh a0, a0, a1 -; RV64ZBKB-NEXT: or a0, a0, a2 -; RV64ZBKB-NEXT: or a0, a0, a3 +; RV64ZBKB-NEXT: packh a1, a3, a2 +; RV64ZBKB-NEXT: packw a0, a0, a1 ; RV64ZBKB-NEXT: ret %a = zext i8 %0 to i32 %b = zext i8 %1 to i32