[llvm] [RISCV][P-ext] Improve the codegen for unzip-like shuffle and buildvector (PR #208763)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 10 09:41:32 PDT 2026
================
@@ -4691,30 +4734,43 @@ static SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG,
SDLoc DL(Op);
if (Subtarget.isRV32() && Subtarget.hasStdExtP()) {
- if (VT != MVT::v4i8)
- return SDValue();
+ if (SDValue V = lowerBuildVectorAsRV32PNarrowingShift(Op, DAG))
+ return V;
- // <4 x i8> BUILD_VECTOR a, b, c, d -> PACK(PPACK.DH pair(a, c), pair(b, d))
- SDValue Val0 =
- DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, MVT::v4i8, Op->getOperand(0));
- SDValue Val1 =
- DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, MVT::v4i8, Op->getOperand(1));
- SDValue Val2 =
- DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, MVT::v4i8, Op->getOperand(2));
- SDValue Val3 =
- DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, MVT::v4i8, Op->getOperand(3));
- SDValue PPairDB =
- DAG.getNode(RISCVISD::PPAIRE_DB, DL, {MVT::v4i8, MVT::v4i8},
- {Val0, Val2, Val1, Val3});
+ if (VT == MVT::v2i16) {
+ SDValue Lo = DAG.getAnyExtOrTrunc(Op->getOperand(0), DL, MVT::i32);
+ SDValue Hi = DAG.getAnyExtOrTrunc(Op->getOperand(1), DL, MVT::i32);
+ return DAG.getBitcast(
+ MVT::v2i16,
+ SDValue(DAG.getMachineNode(RISCV::PACK, DL, MVT::i32, {Lo, Hi}), 0));
----------------
topperc wrote:
We shouldn't be using getMachineNode from lowering.
https://github.com/llvm/llvm-project/pull/208763
More information about the llvm-commits
mailing list