[SLP] Compute a shuffle mask for SK_InsertSubvector (#85408)
This is the third of a series of small patches to compute shuffle masks for the couple of cases where we call getShuffleCost without one. My goal is to add an invariant that all calls to getShuffleCost for fixed length vectors have a mask. After this change, there is one SK_InsertSubvector case left. I excluded it from this patch just because I thought it worthy of individual attention and review. --------- Co-authored-by: Alexey Bataev <a.bataev@gmx.com>
This commit is contained in:
parent
92b56011e6
commit
45e41f9686
@ -4295,9 +4295,12 @@ BoUpSLP::LoadsState BoUpSLP::canVectorizeLoads(
|
||||
llvm_unreachable(
|
||||
"Expected only consecutive, strided or masked gather loads.");
|
||||
}
|
||||
SmallVector<int> ShuffleMask(VL.size());
|
||||
for (int Idx : seq<int>(0, VL.size()))
|
||||
ShuffleMask[Idx] = Idx / VF == I ? VL.size() + Idx % VF : Idx;
|
||||
VecLdCost +=
|
||||
TTI.getShuffleCost(TTI ::SK_InsertSubvector, VecTy,
|
||||
std::nullopt, CostKind, I * VF, SubVecTy);
|
||||
ShuffleMask, CostKind, I * VF, SubVecTy);
|
||||
}
|
||||
// If masked gather cost is higher - better to vectorize, so
|
||||
// consider it as a gather node. It will be better estimated
|
||||
@ -7401,7 +7404,7 @@ getShuffleCost(const TargetTransformInfo &TTI, TTI::ShuffleKind Kind,
|
||||
Index + NumSrcElts <= static_cast<int>(Mask.size()))
|
||||
return TTI.getShuffleCost(
|
||||
TTI::SK_InsertSubvector,
|
||||
FixedVectorType::get(Tp->getElementType(), Mask.size()), std::nullopt,
|
||||
FixedVectorType::get(Tp->getElementType(), Mask.size()), Mask,
|
||||
TTI::TCK_RecipThroughput, Index, Tp);
|
||||
}
|
||||
return TTI.getShuffleCost(Kind, Tp, Mask, CostKind, Index, SubTp, Args);
|
||||
@ -7674,9 +7677,13 @@ class BoUpSLP::ShuffleCostEstimator : public BaseShuffleAnalysis {
|
||||
}
|
||||
if (NeedInsertSubvectorAnalysis) {
|
||||
// Add the cost for the subvectors insert.
|
||||
for (int I = VF, E = VL.size(); I < E; I += VF)
|
||||
SmallVector<int> ShuffleMask(VL.size());
|
||||
for (int I = VF, E = VL.size(); I < E; I += VF) {
|
||||
for (int Idx : seq<int>(0, E))
|
||||
ShuffleMask[Idx] = Idx / VF == I ? E + Idx % VF : Idx;
|
||||
GatherCost += TTI.getShuffleCost(TTI::SK_InsertSubvector, VecTy,
|
||||
std::nullopt, CostKind, I, LoadTy);
|
||||
ShuffleMask, CostKind, I, LoadTy);
|
||||
}
|
||||
}
|
||||
GatherCost -= ScalarsCost;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user