[llvm] [RISCV][P-ext] Move v2i16 and v4i8 extract_subvector handling to tablegen. NFC (PR #208863)

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 10 17:18:20 PDT 2026


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

None

>From dad60ecc6c8ba0463031d5238a195294ccf080de Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Fri, 10 Jul 2026 17:16:26 -0700
Subject: [PATCH] [RISCV][P-ext] Move v2i16 and v4i8 extract_subvector handling
 to tablegen. NFC

---
 llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp | 18 +++---------------
 llvm/lib/Target/RISCV/RISCVInstrInfoP.td    | 10 ++++++++++
 2 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
index df0a34ea27685..f58d947390f68 100644
--- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
@@ -3112,25 +3112,13 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
   }
   case ISD::EXTRACT_SUBVECTOR:
   case RISCVISD::TUPLE_EXTRACT: {
+    if (Subtarget->hasStdExtP())
+      break;
+
     SDValue V = Node->getOperand(0);
     auto Idx = Node->getConstantOperandVal(1);
     MVT InVT = V.getSimpleValueType();
 
-    // Handle P-extension extract_subvector for v2i16 from v4i16 and v4i8 from
-    // v8i8
-    if (Subtarget->hasStdExtP() && !Subtarget->is64Bit() &&
-        ((InVT == MVT::v4i16 && VT == MVT::v2i16) ||
-         (InVT == MVT::v8i8 && VT == MVT::v4i8))) {
-      unsigned NumElts = VT.getVectorNumElements();
-      if (Idx != 0 && Idx != NumElts)
-        break;
-
-      unsigned SubRegIdx = Idx == 0 ? RISCV::sub_gpr_even : RISCV::sub_gpr_odd;
-      SDValue Extract = CurDAG->getTargetExtractSubreg(SubRegIdx, DL, VT, V);
-      ReplaceNode(Node, Extract.getNode());
-      return;
-    }
-
     SDLoc DL(V);
 
     const RISCVTargetLowering &TLI = *Subtarget->getTargetLowering();
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoP.td b/llvm/lib/Target/RISCV/RISCVInstrInfoP.td
index 7fa7c96ca99ca..1b2a652259ca2 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoP.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoP.td
@@ -2539,6 +2539,16 @@ let append Predicates = [IsRV32] in {
             (EXTRACT_SUBREG GPRPair:$vec, sub_gpr_even)>;
   def : Pat<(i32 (extractelt (v2i32 GPRPair:$vec), (i32 1))),
             (EXTRACT_SUBREG GPRPair:$vec, sub_gpr_odd)>;
+
+  def : Pat<(v2i16 (extract_subvector (v4i16 GPRPair:$vec), (i32 0))),
+            (EXTRACT_SUBREG GPRPair:$vec, sub_gpr_even)>;
+  def : Pat<(v2i16 (extract_subvector (v4i16 GPRPair:$vec), (i32 2))),
+            (EXTRACT_SUBREG GPRPair:$vec, sub_gpr_odd)>;
+
+  def : Pat<(v4i8 (extract_subvector (v8i8 GPRPair:$vec), (i32 0))),
+            (EXTRACT_SUBREG GPRPair:$vec, sub_gpr_even)>;
+  def : Pat<(v4i8 (extract_subvector (v8i8 GPRPair:$vec), (i32 4))),
+            (EXTRACT_SUBREG GPRPair:$vec, sub_gpr_odd)>;
 } // append Predicates = [IsRV32]
 
 let append Predicates = [IsRV64] in {



More information about the llvm-commits mailing list