[llvm] [RISCV] Don't make ISD::ABDS/ABDU legal for v2i32 with P extension. (PR #184753)

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 4 23:42:54 PST 2026


https://github.com/topperc created https://github.com/llvm/llvm-project/pull/184753

We don't have the instructions for this so it causes a cannot select error.

>From 79b382913d42f05cc1a991d307b478a632772e1b Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Wed, 4 Mar 2026 23:41:24 -0800
Subject: [PATCH] [RISCV] Don't make ISD::ABDS/ABDU legal for v2i32 with P
 extension.

We don't have the instructions for this so it causes a cannot select error.
---
 llvm/lib/Target/RISCV/RISCVISelLowering.cpp |  4 +-
 llvm/test/CodeGen/RISCV/rvp-ext-rv64.ll     | 42 ++++++++++++++++++---
 2 files changed, 39 insertions(+), 7 deletions(-)

diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index 446edc21dd3d1..74b70b6642cd9 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -575,7 +575,9 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
     setOperationAction(ISD::SSUBSAT, VTs, Legal);
     setOperationAction(ISD::SSHLSAT, VTs, Legal);
     setOperationAction({ISD::AVGFLOORS, ISD::AVGFLOORU}, VTs, Legal);
-    setOperationAction({ISD::ABDS, ISD::ABDU}, VTs, Legal);
+    for (MVT VT : VTs)
+      if (VT != MVT::v2i32)
+        setOperationAction({ISD::ABDS, ISD::ABDU}, VT, Legal);
     setOperationAction(ISD::SPLAT_VECTOR, VTs, Legal);
     setOperationAction(ISD::BUILD_VECTOR, VTs, Legal);
     setOperationAction(ISD::SCALAR_TO_VECTOR, VTs, Legal);
diff --git a/llvm/test/CodeGen/RISCV/rvp-ext-rv64.ll b/llvm/test/CodeGen/RISCV/rvp-ext-rv64.ll
index 52e0a0afb72d5..038b6384a9a43 100644
--- a/llvm/test/CodeGen/RISCV/rvp-ext-rv64.ll
+++ b/llvm/test/CodeGen/RISCV/rvp-ext-rv64.ll
@@ -374,6 +374,36 @@ define <8 x i8> @test_paaddu_b(<8 x i8> %a, <8 x i8> %b) {
   ret <8 x i8> %res
 }
 
+; Test absolute difference signed for v2i32
+; abds pattern: sub(smax(a,b), smin(a,b))
+define <2 x i32> @test_pdif_w(<2 x i32> %a, <2 x i32> %b) {
+; CHECK-LABEL: test_pdif_w:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    pmin.w a2, a0, a1
+; CHECK-NEXT:    pmax.w a0, a0, a1
+; CHECK-NEXT:    psub.w a0, a0, a2
+; CHECK-NEXT:    ret
+  %min = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %a, <2 x i32> %b)
+  %max = call <2 x i32> @llvm.smax.v2i32(<2 x i32> %a, <2 x i32> %b)
+  %res = sub <2 x i32> %max, %min
+  ret <2 x i32> %res
+}
+
+; Test absolute difference unsigned for v2i32
+; abdu pattern: sub(umax(a,b), umin(a,b))
+define <2 x i32> @test_pdifu_w(<2 x i32> %a, <2 x i32> %b) {
+; CHECK-LABEL: test_pdifu_w:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    pminu.w a2, a0, a1
+; CHECK-NEXT:    pmaxu.w a0, a0, a1
+; CHECK-NEXT:    psub.w a0, a0, a2
+; CHECK-NEXT:    ret
+  %min = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %a, <2 x i32> %b)
+  %max = call <2 x i32> @llvm.umax.v2i32(<2 x i32> %a, <2 x i32> %b)
+  %res = sub <2 x i32> %max, %min
+  ret <2 x i32> %res
+}
+
 ; Test absolute difference signed for v4i16
 ; abds pattern: sub(smax(a,b), smin(a,b))
 define <4 x i16> @test_pdif_h(<4 x i16> %a, <4 x i16> %b) {
@@ -2005,10 +2035,10 @@ define <4 x i16> @test_select_v4i16(i1 %cond, <4 x i16> %a, <4 x i16> %b) {
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    andi a3, a0, 1
 ; CHECK-NEXT:    mv a0, a1
-; CHECK-NEXT:    bnez a3, .LBB161_2
+; CHECK-NEXT:    bnez a3, .LBB163_2
 ; CHECK-NEXT:  # %bb.1:
 ; CHECK-NEXT:    mv a0, a2
-; CHECK-NEXT:  .LBB161_2:
+; CHECK-NEXT:  .LBB163_2:
 ; CHECK-NEXT:    ret
   %res = select i1 %cond, <4 x i16> %a, <4 x i16> %b
   ret <4 x i16> %res
@@ -2019,10 +2049,10 @@ define <8 x i8> @test_select_v8i8(i1 %cond, <8 x i8> %a, <8 x i8> %b) {
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    andi a3, a0, 1
 ; CHECK-NEXT:    mv a0, a1
-; CHECK-NEXT:    bnez a3, .LBB162_2
+; CHECK-NEXT:    bnez a3, .LBB164_2
 ; CHECK-NEXT:  # %bb.1:
 ; CHECK-NEXT:    mv a0, a2
-; CHECK-NEXT:  .LBB162_2:
+; CHECK-NEXT:  .LBB164_2:
 ; CHECK-NEXT:    ret
   %res = select i1 %cond, <8 x i8> %a, <8 x i8> %b
   ret <8 x i8> %res
@@ -2033,10 +2063,10 @@ define <2 x i32> @test_select_v2i32(i1 %cond, <2 x i32> %a, <2 x i32> %b) {
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    andi a3, a0, 1
 ; CHECK-NEXT:    mv a0, a1
-; CHECK-NEXT:    bnez a3, .LBB163_2
+; CHECK-NEXT:    bnez a3, .LBB165_2
 ; CHECK-NEXT:  # %bb.1:
 ; CHECK-NEXT:    mv a0, a2
-; CHECK-NEXT:  .LBB163_2:
+; CHECK-NEXT:  .LBB165_2:
 ; CHECK-NEXT:    ret
   %res = select i1 %cond, <2 x i32> %a, <2 x i32> %b
   ret <2 x i32> %res



More information about the llvm-commits mailing list