@@ -27535,8 +27535,24 @@ static SDValue scalarizeBinOpOfSplats(SDNode *N, SelectionDAG &DAG,
27535
27535
if (N0.getOpcode() == ISD::BUILD_VECTOR && N0.getOpcode() == N1.getOpcode()) {
27536
27536
// bo (build_vec ..undef, X, undef...), (build_vec ..undef, Y, undef...) -->
27537
27537
// insert_vector_elt undef, (bo X, Y), index
27538
- return DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, VT, DAG.getUNDEF(VT),
27539
- ScalarBO, IndexC);
27538
+
27539
+ SmallVector<SDValue, 16> EltsX, EltsY;
27540
+ DAG.ExtractVectorElements(Src0, EltsX);
27541
+ DAG.ExtractVectorElements(Src1, EltsY);
27542
+
27543
+ SmallVector<SDValue, 16> EltsResult;
27544
+
27545
+ unsigned NonUndefElements = 0;
27546
+ for (auto [X, Y] : zip(EltsX, EltsY)) {
27547
+ SDValue ScalarBO = DAG.getNode(Opcode, DL, EltVT, X, Y, N->getFlags());
27548
+ if (!ScalarBO.isUndef())
27549
+ if (NonUndefElements++ > 1)
27550
+ break;
27551
+ EltsResult.push_back(ScalarBO);
27552
+ }
27553
+
27554
+ if (NonUndefElements == 1)
27555
+ return DAG.getBuildVector(VT, DL, EltsResult);
27540
27556
}
27541
27557
27542
27558
// bo (splat X, Index), (splat Y, Index) --> splat (bo X, Y), Index
0 commit comments