[llvm] [RISCV] Use ri.vunzip2{a,b} for e64 fixed length deinterleave(2) shuffles (PR #137217)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Thu May 22 11:01:29 PDT 2025
================
@@ -5062,9 +5062,27 @@ static SDValue lowerVZIP(unsigned Opc, SDValue Op0, SDValue Op1,
Op1 = convertToScalableVector(ContainerVT, Op1, DAG, Subtarget);
}
- auto [Mask, VL] = getDefaultVLOps(IntVT, ContainerVT, DL, DAG, Subtarget);
- SDValue Passthru = DAG.getUNDEF(ContainerVT);
- SDValue Res = DAG.getNode(Opc, DL, ContainerVT, Op0, Op1, Passthru, Mask, VL);
+ MVT InnerVT = ContainerVT;
+ auto [Mask, VL] = getDefaultVLOps(IntVT, InnerVT, DL, DAG, Subtarget);
+ if (Op1.isUndef() && ContainerVT.bitsGT(getLMUL1VT(ContainerVT)) &&
+ (RISCVISD::RI_VUNZIP2A_VL == Opc || RISCVISD::RI_VUNZIP2B_VL == Opc)) {
+ InnerVT = ContainerVT.getHalfNumVectorElementsVT();
+ VL = DAG.getConstant(VT.getVectorNumElements() / 2, DL,
+ Subtarget.getXLenVT());
+ Mask = getAllOnesMask(InnerVT, VL, DL, DAG);
+ unsigned HighIdx = InnerVT.getVectorElementCount().getKnownMinValue();
+ Op1 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, InnerVT, Op0,
+ DAG.getVectorIdxConstant(HighIdx, DL));
+ Op0 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, InnerVT, Op0,
+ DAG.getVectorIdxConstant(0, DL));
+ }
+
+ SDValue Passthru = DAG.getUNDEF(InnerVT);
+ SDValue Res = DAG.getNode(Opc, DL, InnerVT, Op0, Op1, Passthru, Mask, VL);
+ if (InnerVT.bitsLT(ContainerVT))
+ Res = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, ContainerVT,
----------------
topperc wrote:
getInsertSubvector?
https://github.com/llvm/llvm-project/pull/137217
More information about the llvm-commits
mailing list