[llvm] [LoongArch] Split 256-bit build_vector to avoid using LASX element insertion (PR #154918)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 3 06:15:09 PDT 2025
================
@@ -2647,6 +2646,43 @@ static SDValue lowerBUILD_VECTORAsBroadCastLoad(BuildVectorSDNode *BVOp,
return SDValue();
}
+// Sequentially insert elements from Ops into Vector, from low to high indices.
+// Note: Ops can have fewer elements than Vector.
+static void fillVector(ArrayRef<SDValue> Ops, SelectionDAG &DAG, SDLoc DL,
+ const LoongArchSubtarget &Subtarget, SDValue &Vector,
+ EVT ResTy) {
+ assert(Ops.size() <= ResTy.getVectorNumElements());
+
+ SDValue Op0 = Ops[0];
+ if (!Op0.isUndef())
+ Vector = DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, ResTy, Op0);
+ for (unsigned i = 1; i < Ops.size(); ++i) {
+ SDValue Opi = Ops[i];
+ if (Opi.isUndef())
+ continue;
+ Vector = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, ResTy, Vector, Opi,
+ DAG.getConstant(i, DL, Subtarget.getGRLenVT()));
+ }
+}
+
+// Build a ResTy subvector from Node, taking NumElts elements starting at index
+// 'first'.
+static SDValue fillSubVectorFromBuildVector(BuildVectorSDNode *Node,
+ SelectionDAG &DAG, SDLoc DL,
+ const LoongArchSubtarget &Subtarget,
+ EVT ResTy, unsigned first) {
+ unsigned NumElts = ResTy.getVectorNumElements();
+
+ assert(first >= 0 &&
----------------
zhaoqi5 wrote:
Thank you for catching this. This assert `first >= 0` can be safely removed. I am currently on National Day holiday and unable to submit the patch. It would be very helpful if you could contribute the fix. If you are unavailable, I will be pleased to submit it once I am back.
https://github.com/llvm/llvm-project/pull/154918
More information about the llvm-commits
mailing list