[llvm] [VectorCombine] Add special handling for truncating shuffles (PR #70013)
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 24 03:23:56 PDT 2023
================
@@ -1472,21 +1472,27 @@ bool VectorCombine::foldShuffleFromReductions(Instruction &I) {
dyn_cast<FixedVectorType>(Shuffle->getOperand(0)->getType());
if (!ShuffleInputType)
return false;
- int NumInputElts = ShuffleInputType->getNumElements();
+ unsigned int NumInputElts = ShuffleInputType->getNumElements();
// Find the mask from sorting the lanes into order. This is most likely to
// become a identity or concat mask. Undef elements are pushed to the end.
SmallVector<int> ConcatMask;
Shuffle->getShuffleMask(ConcatMask);
sort(ConcatMask, [](int X, int Y) { return (unsigned)X < (unsigned)Y; });
+ // In the case of a truncating shuffle it's possible for the mask
+ // to have an index greater than the size of the resulting vector.
+ // This requires special handling.
+ bool IsTruncatingShuffle = VecType->getNumElements() < NumInputElts;
bool UsesSecondVec =
- any_of(ConcatMask, [&](int M) { return M >= NumInputElts; });
+ any_of(ConcatMask, [&](int M) { return M >= (int)NumInputElts; });
InstructionCost OldCost = TTI.getShuffleCost(
UsesSecondVec ? TTI::SK_PermuteTwoSrc : TTI::SK_PermuteSingleSrc,
- UsesSecondVec ? VecType : ShuffleInputType, Shuffle->getShuffleMask());
+ (UsesSecondVec && !IsTruncatingShuffle) ? VecType : ShuffleInputType,
----------------
alexey-bataev wrote:
Outline this logic and store the result in a variable
https://github.com/llvm/llvm-project/pull/70013
More information about the llvm-commits
mailing list