[llvm] [PowerPC] Fix vector_shuffle combines when inputs are scalar_to_vector of differing types. (PR #80784)
zhijian lin via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 10 13:51:58 PDT 2024
================
@@ -15371,33 +15381,52 @@ SDValue PPCTargetLowering::combineVectorShuffle(ShuffleVectorSDNode *SVN,
// the value into element zero. Since scalar size of LHS and RHS may differ
// after isScalarToVec, this should be checked using their own sizes.
if (SToVLHS) {
- if (!IsLittleEndian && SToVLHS.getValueType().getScalarSizeInBits() >= 64)
+ int LHSScalarSize = SToVLHS.getValueType().getScalarSizeInBits();
+ if (!IsLittleEndian && LHSScalarSize >= 64)
return Res;
// Set up the values for the shuffle vector fixup.
- LHSMaxIdx = NumEltsOut / NumEltsIn;
+ LHSNumValidElts =
+ LHSScalarSize / LHS.getValueType().getScalarSizeInBits();
+ // The last element that comes from the LHS. For example:
+ // (shuff (s_to_v i32), (bitcast (s_to_v i64), v4i32), ...)
+ // The last element that comes from the LHS is actually 0, not 3
+ // because elements 1 and higher of a scalar_to_vector are undefined.
+ LHSLastElt = LHSScalarSize / (ShuffleEltWidth + 1);
SToVLHS = getSToVPermuted(SToVLHS, DAG, Subtarget);
if (SToVLHS.getValueType() != LHS.getValueType())
SToVLHS = DAG.getBitcast(LHS.getValueType(), SToVLHS);
LHS = SToVLHS;
}
if (SToVRHS) {
- if (!IsLittleEndian && SToVRHS.getValueType().getScalarSizeInBits() >= 64)
+ int RHSScalarSize = SToVRHS.getValueType().getScalarSizeInBits();
+ if (!IsLittleEndian && RHSScalarSize >= 64)
return Res;
- RHSMinIdx = NumEltsOut;
- RHSMaxIdx = NumEltsOut / NumEltsIn + RHSMinIdx;
+ RHSNumValidElts =
+ RHSScalarSize / RHS.getValueType().getScalarSizeInBits();
+ // The last element that comes from the RHS. For example:
+ // (shuff (s_to_v i32), (bitcast (s_to_v i64), v4i32), ...)
+ // The last element that comes from the RHS is actually 5, not 7
+ // because elements 1 and higher of a scalar_to_vector are undefined.
+ // It is also not 4 because the original scalar_to_vector is wider and
+ // actually contains two i32 elements.
+ RHSLastElt = RHSScalarSize / (ShuffleEltWidth + 1) + RHSFirstElt;
----------------
diggerlin wrote:
most of code
```
if (SToVLHS) {
...
}
```
as same with
```
if (SToVRHS) {
...
}
```
can you add a help function or lambda function to simply the code ?
https://github.com/llvm/llvm-project/pull/80784
More information about the llvm-commits
mailing list