[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