summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AArch64
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2018-06-22 09:45:31 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2018-06-22 09:45:31 +0000
commit9c8f9374b5ae3f087836445dce46e22c238891c0 (patch)
treef23a752ef0fc82c332e26e49a2dbafbcdf05e928 /llvm/lib/Target/AArch64
parent7ee5b090defa85a6e34b5f345e076d16d84192e5 (diff)
downloadbcm5719-llvm-9c8f9374b5ae3f087836445dce46e22c238891c0.tar.gz
bcm5719-llvm-9c8f9374b5ae3f087836445dce46e22c238891c0.zip
[CostModel][AArch64] Add some initial costs for SK_Select and SK_PermuteSingleSrc
AArch64 was only setting costs for SK_Transpose, which meant that many of the simpler shuffles (e.g. SK_Select and SK_PermuteSingleSrc for larger vector elements) was being severely overestimated by the default shuffle expansion. This patch adds costs to help improve SLP performance and avoid a regression in reductions introduced by D48174. I'm not very knowledgeable about AArch64 shuffle lowering so I've kept the extra costs to a minimum - someone who knows this code can add extra costs which should improve vectorization a lot more. Differential Revision: https://reviews.llvm.org/D48172 llvm-svn: 335329
Diffstat (limited to 'llvm/lib/Target/AArch64')
-rw-r--r--llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp49
1 files changed, 32 insertions, 17 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
index 7eb4c1c9667..42639edb4a0 100644
--- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
@@ -937,25 +937,40 @@ int AArch64TTIImpl::getArithmeticReductionCost(unsigned Opcode, Type *ValTy,
int AArch64TTIImpl::getShuffleCost(TTI::ShuffleKind Kind, Type *Tp, int Index,
Type *SubTp) {
-
- // Transpose shuffle kinds can be performed with 'trn1/trn2' and 'zip1/zip2'
- // instructions.
- if (Kind == TTI::SK_Transpose) {
- static const CostTblEntry TransposeTbl[] = {
- {ISD::VECTOR_SHUFFLE, MVT::v8i8, 1},
- {ISD::VECTOR_SHUFFLE, MVT::v16i8, 1},
- {ISD::VECTOR_SHUFFLE, MVT::v4i16, 1},
- {ISD::VECTOR_SHUFFLE, MVT::v8i16, 1},
- {ISD::VECTOR_SHUFFLE, MVT::v2i32, 1},
- {ISD::VECTOR_SHUFFLE, MVT::v4i32, 1},
- {ISD::VECTOR_SHUFFLE, MVT::v2i64, 1},
- {ISD::VECTOR_SHUFFLE, MVT::v2f32, 1},
- {ISD::VECTOR_SHUFFLE, MVT::v4f32, 1},
- {ISD::VECTOR_SHUFFLE, MVT::v2f64, 1},
+ if (Kind == TTI::SK_Transpose || Kind == TTI::SK_Select ||
+ Kind == TTI::SK_PermuteSingleSrc) {
+ static const CostTblEntry ShuffleTbl[] = {
+ // Transpose shuffle kinds can be performed with 'trn1/trn2' and
+ // 'zip1/zip2' instructions.
+ { TTI::SK_Transpose, MVT::v8i8, 1 },
+ { TTI::SK_Transpose, MVT::v16i8, 1 },
+ { TTI::SK_Transpose, MVT::v4i16, 1 },
+ { TTI::SK_Transpose, MVT::v8i16, 1 },
+ { TTI::SK_Transpose, MVT::v2i32, 1 },
+ { TTI::SK_Transpose, MVT::v4i32, 1 },
+ { TTI::SK_Transpose, MVT::v2i64, 1 },
+ { TTI::SK_Transpose, MVT::v2f32, 1 },
+ { TTI::SK_Transpose, MVT::v4f32, 1 },
+ { TTI::SK_Transpose, MVT::v2f64, 1 },
+ // Select shuffle kinds.
+ // TODO: handle vXi8/vXi16.
+ { TTI::SK_Select, MVT::v2i32, 1 }, // mov.
+ { TTI::SK_Select, MVT::v4i32, 2 }, // rev+trn (or similar).
+ { TTI::SK_Select, MVT::v2i64, 1 }, // mov.
+ { TTI::SK_Select, MVT::v2f32, 1 }, // mov.
+ { TTI::SK_Select, MVT::v4f32, 2 }, // rev+trn (or similar).
+ { TTI::SK_Select, MVT::v2f64, 1 }, // mov.
+ // PermuteSingleSrc shuffle kinds.
+ // TODO: handle vXi8/vXi16.
+ { TTI::SK_PermuteSingleSrc, MVT::v2i32, 1 }, // mov.
+ { TTI::SK_PermuteSingleSrc, MVT::v4i32, 3 }, // perfectshuffle worst case.
+ { TTI::SK_PermuteSingleSrc, MVT::v2i64, 1 }, // mov.
+ { TTI::SK_PermuteSingleSrc, MVT::v2f32, 1 }, // mov.
+ { TTI::SK_PermuteSingleSrc, MVT::v4f32, 3 }, // perfectshuffle worst case.
+ { TTI::SK_PermuteSingleSrc, MVT::v2f64, 1 }, // mov.
};
std::pair<int, MVT> LT = TLI->getTypeLegalizationCost(DL, Tp);
- if (const auto *Entry =
- CostTableLookup(TransposeTbl, ISD::VECTOR_SHUFFLE, LT.second))
+ if (const auto *Entry = CostTableLookup(ShuffleTbl, Kind, LT.second))
return LT.first * Entry->Cost;
}
OpenPOWER on IntegriCloud