@@ -27526,36 +27526,25 @@ static SDValue scalarizeBinOpOfSplats(SDNode *N, SelectionDAG &DAG,
2752627526 if ((Opcode == ISD::MULHS || Opcode == ISD::MULHU) && !TLI.isTypeLegal(EltVT))
2752727527 return SDValue();
2752827528
27529- SDValue IndexC = DAG.getVectorIdxConstant(Index0, DL);
27530- SDValue X = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Src0, IndexC);
27531- SDValue Y = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Src1, IndexC);
27532- SDValue ScalarBO = DAG.getNode(Opcode, DL, EltVT, X, Y, N->getFlags());
27533-
2753427529 // If all lanes but 1 are undefined, no need to splat the scalar result.
2753527530 // TODO: Keep track of undefs and use that info in the general case.
2753627531 if (N0.getOpcode() == ISD::BUILD_VECTOR && N0.getOpcode() == N1.getOpcode()) {
2753727532 // bo (build_vec ..undef, X, undef...), (build_vec ..undef, Y, undef...) -->
27538- // insert_vector_elt undef, (bo X, Y), index
27539-
27540- SmallVector<SDValue, 16> EltsX, EltsY;
27533+ // build_vec ..undef, (bo X, Y), undef...
27534+ SmallVector<SDValue, 16> EltsX, EltsY, EltsResult;
2754127535 DAG.ExtractVectorElements(Src0, EltsX);
2754227536 DAG.ExtractVectorElements(Src1, EltsY);
2754327537
27544- SmallVector<SDValue, 16> EltsResult;
27545-
27546- unsigned NonUndefElements = 0;
27547- for (auto [X, Y] : zip(EltsX, EltsY)) {
27548- SDValue ScalarBO = DAG.getNode(Opcode, DL, EltVT, X, Y, N->getFlags());
27549- if (!ScalarBO.isUndef())
27550- if (NonUndefElements++ > 1)
27551- break;
27552- EltsResult.push_back(ScalarBO);
27553- }
27554-
27555- if (NonUndefElements == 1)
27556- return DAG.getBuildVector(VT, DL, EltsResult);
27538+ for (auto [X, Y] : zip(EltsX, EltsY))
27539+ EltsResult.push_back(DAG.getNode(Opcode, DL, EltVT, X, Y, N->getFlags()));
27540+ return DAG.getBuildVector(VT, DL, EltsResult);
2755727541 }
2755827542
27543+ SDValue IndexC = DAG.getVectorIdxConstant(Index0, DL);
27544+ SDValue X = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Src0, IndexC);
27545+ SDValue Y = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Src1, IndexC);
27546+ SDValue ScalarBO = DAG.getNode(Opcode, DL, EltVT, X, Y, N->getFlags());
27547+
2755927548 // bo (splat X, Index), (splat Y, Index) --> splat (bo X, Y), Index
2756027549 return DAG.getSplat(VT, DL, ScalarBO);
2756127550}
0 commit comments