@@ -15742,8 +15742,7 @@ static SDValue getSToVPermuted(SDValue OrigSToV, SelectionDAG &DAG,
15742
15742
static bool isShuffleMaskInRange(const SmallVectorImpl<int> &ShuffV,
15743
15743
int HalfVec, int LHSLastElementDefined,
15744
15744
int RHSLastElementDefined) {
15745
- for (int I : seq<int>(0, ShuffV.size())) {
15746
- int Index = ShuffV[I];
15745
+ for (int Index : ShuffV) {
15747
15746
if (Index < 0) // Skip explicitly undefined mask indices.
15748
15747
continue;
15749
15748
// Handle first input vector of the vector_shuffle.
@@ -15776,7 +15775,9 @@ static SDValue generateSToVPermutedForVecShuffle(
15776
15775
// because elements 1 and higher of a scalar_to_vector are undefined.
15777
15776
// It is also not 4 because the original scalar_to_vector is wider and
15778
15777
// actually contains two i32 elements.
15779
- LastElt = ScalarSize / (ShuffleEltWidth + 1) + FirstElt;
15778
+ LastElt = (uint64_t) ScalarSize > ShuffleEltWidth
15779
+ ? ScalarSize / ShuffleEltWidth - 1 + FirstElt
15780
+ : FirstElt;
15780
15781
SDValue SToVPermuted = getSToVPermuted(SToVNode, DAG, Subtarget);
15781
15782
if (SToVPermuted.getValueType() != VecShuffOperandType)
15782
15783
SToVPermuted = DAG.getBitcast(VecShuffOperandType, SToVPermuted);
@@ -15856,22 +15857,26 @@ SDValue PPCTargetLowering::combineVectorShuffle(ShuffleVectorSDNode *SVN,
15856
15857
// than 64 bits since for 64-bit elements, all instructions already put
15857
15858
// the value into element zero. Since scalar size of LHS and RHS may differ
15858
15859
// after isScalarToVec, this should be checked using their own sizes.
15860
+ int LHSScalarSize = 0;
15861
+ int RHSScalarSize = 0;
15859
15862
if (SToVLHS) {
15860
- int LHSScalarSize = SToVLHS.getValueType().getScalarSizeInBits();
15863
+ LHSScalarSize = SToVLHS.getValueType().getScalarSizeInBits();
15861
15864
if (!IsLittleEndian && LHSScalarSize >= 64)
15862
15865
return Res;
15863
- LHS = generateSToVPermutedForVecShuffle(
15864
- LHSScalarSize, ShuffleEltWidth, LHSNumValidElts, LHSFirstElt,
15865
- LHSLastElt, LHS, SToVLHS, DAG, Subtarget);
15866
15866
}
15867
15867
if (SToVRHS) {
15868
- int RHSScalarSize = SToVRHS.getValueType().getScalarSizeInBits();
15868
+ RHSScalarSize = SToVRHS.getValueType().getScalarSizeInBits();
15869
15869
if (!IsLittleEndian && RHSScalarSize >= 64)
15870
15870
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)
15871
15877
RHS = generateSToVPermutedForVecShuffle(
15872
15878
RHSScalarSize, ShuffleEltWidth, RHSNumValidElts, RHSFirstElt,
15873
15879
RHSLastElt, RHS, SToVRHS, DAG, Subtarget);
15874
- }
15875
15880
15876
15881
if (!isShuffleMaskInRange(ShuffV, HalfVec, LHSLastElt, RHSLastElt))
15877
15882
return Res;
0 commit comments