[llvm] 0228fac - [RISCV][P-Ext] Add RISCVISD::WADD/WSUB. (#210862)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 21 01:25:31 PDT 2026
Author: Craig Topper
Date: 2026-07-21T16:25:26+08:00
New Revision: 0228facbd558a55e7db6646572d857d1b0cf9596
URL: https://github.com/llvm/llvm-project/commit/0228facbd558a55e7db6646572d857d1b0cf9596
DIFF: https://github.com/llvm/llvm-project/commit/0228facbd558a55e7db6646572d857d1b0cf9596.diff
LOG: [RISCV][P-Ext] Add RISCVISD::WADD/WSUB. (#210862)
Added:
Modified:
llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
llvm/lib/Target/RISCV/RISCVInstrInfoP.td
llvm/test/CodeGen/RISCV/rv32p.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
index 8d9c2d519274c..ae341a3a78f7c 100644
--- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
@@ -1892,6 +1892,8 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
case ISD::SMUL_LOHI:
case ISD::UMUL_LOHI:
case RISCVISD::WMULSU:
+ case RISCVISD::WADD:
+ case RISCVISD::WSUB:
case RISCVISD::WADDU:
case RISCVISD::WSUBU: {
assert(Subtarget->hasStdExtP() && !Subtarget->is64Bit() && VT == MVT::i32 &&
@@ -1910,6 +1912,12 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
case RISCVISD::WMULSU:
Opc = RISCV::WMULSU;
break;
+ case RISCVISD::WADD:
+ Opc = RISCV::WADD;
+ break;
+ case RISCVISD::WSUB:
+ Opc = RISCV::WSUB;
+ break;
case RISCVISD::WADDU:
Opc = RISCV::WADDU;
break;
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index 29027fc96c455..45f292a4dbb47 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -22553,6 +22553,13 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
SDValue Op1 = N->getOperand(2);
SDValue Op2 = N->getOperand(3);
+ // (WADDA lo, sra(lo, 31), rs1, 0) -> (WSUB lo, rs1)
+ if (isNullConstant(Op2) && isI32SignExtended(Op0Lo, Op0Hi)) {
+ SDValue Result = DAG.getNode(
+ RISCVISD::WADD, DL, DAG.getVTList(MVT::i32, MVT::i32), Op0Lo, Op1);
+ return DCI.CombineTo(N, Result.getValue(0), Result.getValue(1));
+ }
+
// Fold a chained accumulate into the free second source slot.
if (isNullConstant(Op2) && Op0Lo.getNode() == Op0Hi.getNode() &&
Op0Lo.getResNo() == 0 && Op0Hi.getResNo() == 1 && Op0Lo.hasOneUse() &&
@@ -22584,6 +22591,13 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
SDValue Op1 = N->getOperand(2);
SDValue Op2 = N->getOperand(3);
+ // (WSUBA lo, sra(lo, 31), 0, rs2) -> (WSUB lo, rs2)
+ if (isNullConstant(Op1) && isI32SignExtended(Op0Lo, Op0Hi)) {
+ SDValue Result = DAG.getNode(
+ RISCVISD::WSUB, DL, DAG.getVTList(MVT::i32, MVT::i32), Op0Lo, Op2);
+ return DCI.CombineTo(N, Result.getValue(0), Result.getValue(1));
+ }
+
// (WSUBA (WADDA lo, hi, a, 0), 0, b) -> (WSUBA lo, hi, a, b)
if (isNullConstant(Op1) && Op0Lo.getOpcode() == RISCVISD::WADDA &&
Op0Lo.getNode() == Op0Hi.getNode() && Op0Lo.getResNo() == 0 &&
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoP.td b/llvm/lib/Target/RISCV/RISCVInstrInfoP.td
index ea9692985180f..38900e2100bf9 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoP.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoP.td
@@ -1830,6 +1830,8 @@ def riscv_wsuba : RVSDNode<"WSUBA", SDT_RISCVWideningAddSubAccumulate>;
def riscv_waddu : RVSDNode<"WADDU", SDTIntBinHiLoOp, [SDNPCommutative]>;
def riscv_wsubu : RVSDNode<"WSUBU", SDTIntBinHiLoOp>;
+def riscv_wadd : RVSDNode<"WADD", SDTIntBinHiLoOp, [SDNPCommutative]>;
+def riscv_wsub : RVSDNode<"WSUB", SDTIntBinHiLoOp>;
def riscv_wmulsu : RVSDNode<"WMULSU", SDTIntBinHiLoOp>;
diff --git a/llvm/test/CodeGen/RISCV/rv32p.ll b/llvm/test/CodeGen/RISCV/rv32p.ll
index 63cdf8ee0ded1..9c8acdc1a7351 100644
--- a/llvm/test/CodeGen/RISCV/rv32p.ll
+++ b/llvm/test/CodeGen/RISCV/rv32p.ll
@@ -1784,6 +1784,28 @@ define i64 @wsubu(i32 %a, i32 %b) nounwind {
ret i64 %
diff
}
+define i64 @wadd(i32 %a, i32 %b) nounwind {
+; CHECK-LABEL: wadd:
+; CHECK: # %bb.0:
+; CHECK-NEXT: wadd a0, a0, a1
+; CHECK-NEXT: ret
+ %ext_a = sext i32 %a to i64
+ %ext_b = sext i32 %b to i64
+ %sum = add i64 %ext_a, %ext_b
+ ret i64 %sum
+}
+
+define i64 @wsub(i32 %a, i32 %b) nounwind {
+; CHECK-LABEL: wsub:
+; CHECK: # %bb.0:
+; CHECK-NEXT: wsub a0, a0, a1
+; CHECK-NEXT: ret
+ %ext_a = sext i32 %a to i64
+ %ext_b = sext i32 %b to i64
+ %
diff = sub i64 %ext_a, %ext_b
+ ret i64 %
diff
+}
+
define i64 @wsub_from_neg_const(i32 %a) nounwind {
; CHECK-LABEL: wsub_from_neg_const:
; CHECK: # %bb.0:
More information about the llvm-commits
mailing list