diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-06-22 09:45:31 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-06-22 09:45:31 +0000 |
| commit | 9c8f9374b5ae3f087836445dce46e22c238891c0 (patch) | |
| tree | f23a752ef0fc82c332e26e49a2dbafbcdf05e928 /llvm/lib/Target/AArch64 | |
| parent | 7ee5b090defa85a6e34b5f345e076d16d84192e5 (diff) | |
| download | bcm5719-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.cpp | 49 |
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; } |

