@@ -27535,8 +27535,24 @@ static SDValue scalarizeBinOpOfSplats(SDNode *N, SelectionDAG &DAG,
2753527535 if (N0.getOpcode() == ISD::BUILD_VECTOR && N0.getOpcode() == N1.getOpcode()) {
2753627536 // bo (build_vec ..undef, X, undef...), (build_vec ..undef, Y, undef...) -->
2753727537 // 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);
2754027556 }
2754127557
2754227558 // bo (splat X, Index), (splat Y, Index) --> splat (bo X, Y), Index
0 commit comments