[llvm] [RISCV] Fix incorrect fixed vector lowering for VECTOR_DEINTERLEAVE (PR #207254)
Min-Yih Hsu via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 9 09:46:57 PDT 2026
================
@@ -13284,27 +13271,62 @@ SDValue RISCVTargetLowering::lowerVECTOR_DEINTERLEAVE(SDValue Op,
}
// Store with unit-stride store and load it back with segmented load.
+ SDValue Mask, VL;
MVT XLenVT = Subtarget.getXLenVT();
- auto [Mask, VL] = getDefaultScalableVLOps(VecVT, DL, DAG, Subtarget);
- SDValue Passthru = DAG.getUNDEF(ConcatVT);
-
- // Allocate a stack slot.
- Align Alignment = DAG.getReducedAlign(VecVT, /*UseABI=*/false);
- SDValue StackPtr =
- DAG.CreateStackTemporary(ConcatVT.getStoreSize(), Alignment);
auto &MF = DAG.getMachineFunction();
- auto FrameIndex = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
- auto PtrInfo = MachinePointerInfo::getFixedStack(MF, FrameIndex);
+ SDValue Chain = DAG.getEntryNode();
+ Align Alignment = DAG.getReducedAlign(VecVT, /*UseABI=*/false);
+ SDValue StackPtr;
+ MachinePointerInfo PtrInfo;
+ if (IsFixedVector) {
+ // Calculating the stack size.
+ ElementCount ActualConcatEC =
+ VecVT.getVectorElementCount().multiplyCoefficientBy(Factor);
+ EVT ConcatEVT = EVT::getVectorVT(
+ *DAG.getContext(), VecVT.getVectorElementType(), ActualConcatEC);
+ StackPtr = DAG.CreateStackTemporary(ConcatEVT.getStoreSize(), Alignment);
+ auto FrameIndex = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
+ PtrInfo = MachinePointerInfo::getFixedStack(MF, FrameIndex);
+
+ // If this is a fixed vector, instead of using the concat vector, we simply
+ // store each fixed vector operand directly onto the stack, individually.
+ // The reason being that if the fixed vector is (much) small than the
+ // container vector, we will be wasting space on stack.
+ TypeSize VecSize = VecVT.getStoreSize();
+ SDValue BasePtr = StackPtr;
+ MachinePointerInfo PI = PtrInfo;
+ for (auto [Idx, FieldOp] : enumerate(Op->op_values())) {
+ if (Idx) {
+ // Advance the pointer.
+ BasePtr = DAG.getObjectPtrOffset(DL, BasePtr, VecSize);
+ PI = PI.getWithOffset(VecSize);
+ }
+ Chain = DAG.getStore(Chain, DL, FieldOp, BasePtr, PI, Alignment);
----------------
mshockwave wrote:
Done.
https://github.com/llvm/llvm-project/pull/207254
More information about the llvm-commits
mailing list