[llvm] [LoongArch] Split 256-bit build_vector to avoid using LASX element insertion (PR #154918)
David Spickett via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 3 08:12:22 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 &&
----------------
DavidSpickett wrote:
Done - https://github.com/llvm/llvm-project/commit/b4f54bf548839ebe3308b1979b448403c2ba2a81
Enjoy the holiday!
https://github.com/llvm/llvm-project/pull/154918
More information about the llvm-commits
mailing list