diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-10-25 10:52:36 +0000 | 
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-10-25 10:52:36 +0000 | 
| commit | 071e82218f505396535b2d4abcf008117feb5685 (patch) | |
| tree | 47618e9e3f2bfa8d42f9cb7844287f390258d0fa /llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp | |
| parent | 2a9c7280886f3a0a60833bd41888a5bd07880d8b (diff) | |
| download | bcm5719-llvm-071e82218f505396535b2d4abcf008117feb5685.tar.gz bcm5719-llvm-071e82218f505396535b2d4abcf008117feb5685.zip  | |
[TTI] Add generic SK_Broadcast shuffle costs
I noticed while fixing PR39368 that we don't have generic shuffle costs for broadcast style shuffles.
This patch adds SK_BROADCAST handling, but exposes ARM/AARCH64 lack of handling of this type, which I've added a fix for at the same time.
Differential Revision: https://reviews.llvm.org/D53570
llvm-svn: 345253
Diffstat (limited to 'llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp | 25 | 
1 files changed, 22 insertions, 3 deletions
diff --git a/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp b/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp index 39a72f0edeb..a07c1e83a3f 100644 --- a/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp +++ b/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp @@ -400,10 +400,29 @@ int ARMTTIImpl::getAddressComputationCost(Type *Ty, ScalarEvolution *SE,  int ARMTTIImpl::getShuffleCost(TTI::ShuffleKind Kind, Type *Tp, int Index,                                 Type *SubTp) { -  // We only handle costs of reverse and select shuffles for now. -  if (Kind != TTI::SK_Reverse && Kind != TTI::SK_Select) -    return BaseT::getShuffleCost(Kind, Tp, Index, SubTp); +  if (Kind == TTI::SK_Broadcast) { +    static const CostTblEntry NEONDupTbl[] = { +        // VDUP handles these cases. +        {ISD::VECTOR_SHUFFLE, MVT::v2i32, 1}, +        {ISD::VECTOR_SHUFFLE, MVT::v2f32, 1}, +        {ISD::VECTOR_SHUFFLE, MVT::v2i64, 1}, +        {ISD::VECTOR_SHUFFLE, MVT::v2f64, 1}, +        {ISD::VECTOR_SHUFFLE, MVT::v4i16, 1}, +        {ISD::VECTOR_SHUFFLE, MVT::v8i8,  1}, + +        {ISD::VECTOR_SHUFFLE, MVT::v4i32, 1}, +        {ISD::VECTOR_SHUFFLE, MVT::v4f32, 1}, +        {ISD::VECTOR_SHUFFLE, MVT::v8i16, 1}, +        {ISD::VECTOR_SHUFFLE, MVT::v16i8, 1}}; +    std::pair<int, MVT> LT = TLI->getTypeLegalizationCost(DL, Tp); + +    if (const auto *Entry = CostTableLookup(NEONDupTbl, ISD::VECTOR_SHUFFLE, +                                            LT.second)) +      return LT.first * Entry->Cost; + +    return BaseT::getShuffleCost(Kind, Tp, Index, SubTp); +  }    if (Kind == TTI::SK_Reverse) {      static const CostTblEntry NEONShuffleTbl[] = {          // Reverse shuffle cost one instruction if we are shuffling within a  | 

