@@ -15742,8 +15742,7 @@ static SDValue getSToVPermuted(SDValue OrigSToV, SelectionDAG &DAG,
1574215742static bool isShuffleMaskInRange(const SmallVectorImpl<int> &ShuffV,
1574315743 int HalfVec, int LHSLastElementDefined,
1574415744 int RHSLastElementDefined) {
15745- for (int I : seq<int>(0, ShuffV.size())) {
15746- int Index = ShuffV[I];
15745+ for (int Index : ShuffV) {
1574715746 if (Index < 0) // Skip explicitly undefined mask indices.
1574815747 continue;
1574915748 // Handle first input vector of the vector_shuffle.
@@ -15776,7 +15775,9 @@ static SDValue generateSToVPermutedForVecShuffle(
1577615775 // because elements 1 and higher of a scalar_to_vector are undefined.
1577715776 // It is also not 4 because the original scalar_to_vector is wider and
1577815777 // actually contains two i32 elements.
15779- LastElt = ScalarSize / (ShuffleEltWidth + 1) + FirstElt;
15778+ LastElt = (uint64_t) ScalarSize > ShuffleEltWidth
15779+ ? ScalarSize / ShuffleEltWidth - 1 + FirstElt
15780+ : FirstElt;
1578015781 SDValue SToVPermuted = getSToVPermuted(SToVNode, DAG, Subtarget);
1578115782 if (SToVPermuted.getValueType() != VecShuffOperandType)
1578215783 SToVPermuted = DAG.getBitcast(VecShuffOperandType, SToVPermuted);
@@ -15856,22 +15857,26 @@ SDValue PPCTargetLowering::combineVectorShuffle(ShuffleVectorSDNode *SVN,
1585615857 // than 64 bits since for 64-bit elements, all instructions already put
1585715858 // the value into element zero. Since scalar size of LHS and RHS may differ
1585815859 // after isScalarToVec, this should be checked using their own sizes.
15860+ int LHSScalarSize = 0;
15861+ int RHSScalarSize = 0;
1585915862 if (SToVLHS) {
15860- int LHSScalarSize = SToVLHS.getValueType().getScalarSizeInBits();
15863+ LHSScalarSize = SToVLHS.getValueType().getScalarSizeInBits();
1586115864 if (!IsLittleEndian && LHSScalarSize >= 64)
1586215865 return Res;
15863- LHS = generateSToVPermutedForVecShuffle(
15864- LHSScalarSize, ShuffleEltWidth, LHSNumValidElts, LHSFirstElt,
15865- LHSLastElt, LHS, SToVLHS, DAG, Subtarget);
1586615866 }
1586715867 if (SToVRHS) {
15868- int RHSScalarSize = SToVRHS.getValueType().getScalarSizeInBits();
15868+ RHSScalarSize = SToVRHS.getValueType().getScalarSizeInBits();
1586915869 if (!IsLittleEndian && RHSScalarSize >= 64)
1587015870 return Res;
15871+ }
15872+ if (LHSScalarSize != 0)
15873+ LHS = generateSToVPermutedForVecShuffle(
15874+ LHSScalarSize, ShuffleEltWidth, LHSNumValidElts, LHSFirstElt,
15875+ LHSLastElt, LHS, SToVLHS, DAG, Subtarget);
15876+ if (RHSScalarSize != 0)
1587115877 RHS = generateSToVPermutedForVecShuffle(
1587215878 RHSScalarSize, ShuffleEltWidth, RHSNumValidElts, RHSFirstElt,
1587315879 RHSLastElt, RHS, SToVRHS, DAG, Subtarget);
15874- }
1587515880
1587615881 if (!isShuffleMaskInRange(ShuffV, HalfVec, LHSLastElt, RHSLastElt))
1587715882 return Res;
0 commit comments