[llvm] [SelectionDAG] Fold subvector inserts into concat operands (PR #200937)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 10 06:34:00 PDT 2026
================
@@ -29503,16 +29503,38 @@ SDValue DAGCombiner::visitINSERT_SUBVECTOR(SDNode *N) {
}
}
- // If the input vector is a concatenation, and the insert replaces
- // one of the pieces, we can optimize into a single concat_vectors.
- if (N0.getOpcode() == ISD::CONCAT_VECTORS && N0.hasOneUse() &&
- N0.getOperand(0).getValueType() == N1.getValueType() &&
- N0.getOperand(0).getValueType().isScalableVector() ==
- N1.getValueType().isScalableVector()) {
- unsigned Factor = N1.getValueType().getVectorMinNumElements();
- SmallVector<SDValue, 8> Ops(N0->ops());
- Ops[InsIdx / Factor] = N1;
- return DAG.getNode(ISD::CONCAT_VECTORS, SDLoc(N), VT, Ops);
+ // If the input vector is a concatenation and the insert is wholly contained
+ // in one of its operands, push the insertion into that operand.
+ if (N0.getOpcode() == ISD::CONCAT_VECTORS && N0.hasOneUse()) {
+ EVT ConcatOpVT = N0.getOperand(0).getValueType();
+ EVT InsVT = N1.getValueType();
+ unsigned Factor = ConcatOpVT.getVectorMinNumElements();
+ unsigned ConcatOpIdx = InsIdx / Factor;
+ unsigned RelativeIdx = InsIdx - ConcatOpIdx * Factor;
+ assert(ConcatOpIdx < N0.getNumOperands() && "have enoug concat operands");
+
+ // If the insert replaces a whole concat operand, optimize into a single
+ // concat_vectors.
+ if (RelativeIdx == 0 && ConcatOpVT == InsVT &&
+ ConcatOpVT.isScalableVector() == InsVT.isScalableVector()) {
----------------
RKSimon wrote:
why test for ConcatOpVT.isScalableVector() == InsVT.isScalableVector() is you've already tested ConcatOpVT == InsVT ?
https://github.com/llvm/llvm-project/pull/200937
More information about the llvm-commits
mailing list