return OpCost;
}
- TTI::ShuffleKind improveShuffleKindFromMask(TTI::ShuffleKind Kind,
- ArrayRef<int> Mask) const {
- int Limit = Mask.size() * 2;
- if (Mask.empty() ||
- // Extra check required by isSingleSourceMaskImpl function (called by
- // ShuffleVectorInst::isSingleSourceMask).
- any_of(Mask, [Limit](int I) { return I >= Limit; }))
- return Kind;
- switch (Kind) {
- case TTI::SK_PermuteSingleSrc:
- if (ShuffleVectorInst::isReverseMask(Mask))
- return TTI::SK_Reverse;
- if (ShuffleVectorInst::isZeroEltSplatMask(Mask))
- return TTI::SK_Broadcast;
- break;
- case TTI::SK_PermuteTwoSrc:
- if (ShuffleVectorInst::isSelectMask(Mask))
- return TTI::SK_Select;
- if (ShuffleVectorInst::isTransposeMask(Mask))
- return TTI::SK_Transpose;
- break;
- case TTI::SK_Select:
- case TTI::SK_Reverse:
- case TTI::SK_Broadcast:
- case TTI::SK_Transpose:
- case TTI::SK_InsertSubvector:
- case TTI::SK_ExtractSubvector:
- break;
- }
- return Kind;
- }
-
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp,
ArrayRef<int> Mask, int Index,
VectorType *SubTp) {
- switch (improveShuffleKindFromMask(Kind, Mask)) {
+ switch (Kind) {
case TTI::SK_Broadcast:
return getBroadcastShuffleOverhead(cast<FixedVectorType>(Tp));
case TTI::SK_Select:
VectorType *Tp,
ArrayRef<int> Mask, int Index,
VectorType *SubTp) {
- Kind = improveShuffleKindFromMask(Kind, Mask);
if (Kind == TTI::SK_Broadcast || Kind == TTI::SK_Transpose ||
Kind == TTI::SK_Select || Kind == TTI::SK_PermuteSingleSrc ||
Kind == TTI::SK_Reverse) {
InstructionCost GCNTTIImpl::getShuffleCost(TTI::ShuffleKind Kind,
VectorType *VT, ArrayRef<int> Mask,
int Index, VectorType *SubTp) {
- Kind = improveShuffleKindFromMask(Kind, Mask);
if (ST->hasVOP3PInsts()) {
if (cast<FixedVectorType>(VT)->getNumElements() == 2 &&
DL.getTypeSizeInBits(VT->getElementType()) == 16) {
InstructionCost ARMTTIImpl::getShuffleCost(TTI::ShuffleKind Kind,
VectorType *Tp, ArrayRef<int> Mask,
int Index, VectorType *SubTp) {
- Kind = improveShuffleKindFromMask(Kind, Mask);
if (ST->hasNEON()) {
if (Kind == TTI::SK_Broadcast) {
static const CostTblEntry NEONDupTbl[] = {
VectorType *Tp,
ArrayRef<int> Mask, int Index,
VectorType *SubTp) {
- Kind = improveShuffleKindFromMask(Kind, Mask);
if (ST->hasVector()) {
unsigned NumVectors = getNumVectorRegs(Tp);
// 64-bit packed integer vectors (v2i32) are widened to type v4i32.
std::pair<int, MVT> LT = TLI->getTypeLegalizationCost(DL, BaseTp);
- Kind = improveShuffleKindFromMask(Kind, Mask);
// Treat Transpose as 2-op shuffles - there's no difference in lowering.
if (Kind == TTI::SK_Transpose)
Kind = TTI::SK_PermuteTwoSrc;
}
int FoundLane = findLaneForValue(VTE->Scalars, VTE->ReuseShuffleIndices, V);
Mask[I] = (Entries.front() == VTE ? 0 : VF) + FoundLane;
+ // Extra check required by isSingleSourceMaskImpl function (called by
+ // ShuffleVectorInst::isSingleSourceMask).
+ if (Mask[I] >= 2 * E)
+ return None;
}
- switch (Entries.size()) {
- case 1:
+ if (Entries.size() == 1) {
+ if (ShuffleVectorInst::isReverseMask(Mask))
+ return TargetTransformInfo::SK_Reverse;
return TargetTransformInfo::SK_PermuteSingleSrc;
- case 2:
+ }
+ if (Entries.size() == 2) {
+ if (ShuffleVectorInst::isSelectMask(Mask))
+ return TargetTransformInfo::SK_Select;
+ if (ShuffleVectorInst::isTransposeMask(Mask))
+ return TargetTransformInfo::SK_Transpose;
return TargetTransformInfo::SK_PermuteTwoSrc;
- default:
- break;
}
return None;
}
; YAML-NEXT: Function: fextr
; YAML-NEXT: Args:
; YAML-NEXT: - String: 'Stores SLP vectorized with cost '
-; YAML-NEXT: - Cost: '-4'
+; YAML-NEXT: - Cost: '-1'
; YAML-NEXT: - String: ' and with tree size '
; YAML-NEXT: - TreeSize: '4'