[llvm] [RISCV] Use pli.b and pli.h in RISCVMatInt with P extension on RV32. (PR #172803)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 17 23:06:09 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-risc-v
Author: Craig Topper (topperc)
<details>
<summary>Changes</summary>
On RV32, we don't need to check that the upper and lower 32 bits match.
---
Full diff: https://github.com/llvm/llvm-project/pull/172803.diff
3 Files Affected:
- (modified) llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp (+1-1)
- (modified) llvm/test/CodeGen/RISCV/rv32p.ll (+16)
- (modified) llvm/test/CodeGen/RISCV/rv64p.ll (+42)
``````````diff
diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp
index 3bbd2d2b3a0fd..325e3a03db6c0 100644
--- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp
+++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp
@@ -87,7 +87,7 @@ static void generateInstSeqImpl(int64_t Val, const MCSubtargetInfo &STI,
int16_t Bit15To0 = Bit31To0;
int8_t Bit15To8 = Bit15To0 >> 8;
int8_t Bit7To0 = Bit15To0;
- if (Bit63To32 == Bit31To0) {
+ if (!IsRV64 || Bit63To32 == Bit31To0) {
if (IsRV64 && isInt<10>(Bit63To32)) {
Res.emplace_back(RISCV::PLI_W, Bit63To32);
return;
diff --git a/llvm/test/CodeGen/RISCV/rv32p.ll b/llvm/test/CodeGen/RISCV/rv32p.ll
index 4fa9a572d609d..c9111a1a24f98 100644
--- a/llvm/test/CodeGen/RISCV/rv32p.ll
+++ b/llvm/test/CodeGen/RISCV/rv32p.ll
@@ -35,6 +35,22 @@ define i32 @li_imm() {
ret i32 -1
}
+define i32 @pli_b_i32(ptr %p) {
+; CHECK-LABEL: pli_b_i32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: pli.b a0, 5
+; CHECK-NEXT: ret
+ ret i32 u0x05050505
+}
+
+define i32 @pli_h_i32(ptr %p) {
+; CHECK-LABEL: pli_h_i32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: pli.h a0, -64
+; CHECK-NEXT: ret
+ ret i32 u0xffc0ffc0
+}
+
define void @pli_b_store_i32(ptr %p) {
; CHECK-LABEL: pli_b_store_i32:
; CHECK: # %bb.0:
diff --git a/llvm/test/CodeGen/RISCV/rv64p.ll b/llvm/test/CodeGen/RISCV/rv64p.ll
index bff9771299a88..22dba6501f68c 100644
--- a/llvm/test/CodeGen/RISCV/rv64p.ll
+++ b/llvm/test/CodeGen/RISCV/rv64p.ll
@@ -48,6 +48,48 @@ define i64 @li_imm() {
ret i64 -1
}
+define i32 @pli_b_i32() {
+; CHECK-LABEL: pli_b_i32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: lui a0, 20560
+; CHECK-NEXT: addi a0, a0, 1285
+; CHECK-NEXT: ret
+ ret i32 u0x05050505
+}
+
+define i64 @pli_b_i64() {
+; CHECK-LABEL: pli_b_i64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: pli.b a0, -128
+; CHECK-NEXT: ret
+ ret i64 u0x8080808080808080
+}
+
+define i32 @pli_h_i32() {
+; CHECK-LABEL: pli_h_i32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: lui a0, 1047840
+; CHECK-NEXT: addi a0, a0, -47
+; CHECK-NEXT: ret
+ ret i32 u0xffd1ffd1
+}
+
+define i64 @pli_h_i64() {
+; CHECK-LABEL: pli_h_i64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: pli.h a0, 291
+; CHECK-NEXT: ret
+ ret i64 u0x0123012301230123
+}
+
+define i64 @pli_w_i64() {
+; CHECK-LABEL: pli_w_i64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: pli.w a0, -292
+; CHECK-NEXT: ret
+ ret i64 u0xfffffedcfffffedc
+}
+
define void @pli_b_store_i32(ptr %p) {
; CHECK-LABEL: pli_b_store_i32:
; CHECK: # %bb.0:
``````````
</details>
https://github.com/llvm/llvm-project/pull/172803
More information about the llvm-commits
mailing list