[llvm] [RISCV] Lower SEW<=32 vector_deinterleave(2) via vunzip2{a, b} (PR #136463)
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 22 08:49:20 PDT 2025
================
@@ -11510,12 +11522,27 @@ SDValue RISCVTargetLowering::lowerVECTOR_DEINTERLEAVE(SDValue Op,
return DAG.getMergeValues(Res, DL);
}
- // TODO: Remove the e64 restriction once the fractional LMUL lowering
- // is improved to always beat the vnsrl lowering below.
- if (Subtarget.hasVendorXRivosVizip() && Factor == 2 &&
- VecVT.getVectorElementType().getSizeInBits() == 64) {
+ if (Subtarget.hasVendorXRivosVizip() && Factor == 2) {
+ MVT VT = Op->getSimpleValueType(0);
SDValue V1 = Op->getOperand(0);
SDValue V2 = Op->getOperand(1);
+
+ // For fractional LMUL, check if we can use a higher LMUL
+ // instruction to avoid a vslidedown.
+ if (SDValue Src = foldConcatVector(V1, V2);
+ Src && getLMUL1VT(VT).bitsGT(VT)) {
+ EVT NewVT = VT.getDoubleNumVectorElementsVT();
----------------
preames wrote:
It should be? The original storage is still {LoSubVec, HiSubVec, tail elements}, so doubling gets everything in the non-tail. I feel like I might be missing something in your question though, so if I am, feel free to push back.
https://github.com/llvm/llvm-project/pull/136463
More information about the llvm-commits
mailing list