[llvm] [SelectionDAG] Fold subvector inserts into concat operands (PR #200937)
Krzysztof Drewniak via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 9 12:47:11 PDT 2026
================
@@ -29517,16 +29517,40 @@ 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;
+ if (ConcatOpIdx < N0.getNumOperands()) {
----------------
krzysz00 wrote:
Migrated to an assert just in case there's scalable vector weirdness
https://github.com/llvm/llvm-project/pull/200937
More information about the llvm-commits
mailing list