diff options
| author | David Green <david.green@arm.com> | 2019-08-12 16:54:07 +0000 |
|---|---|---|
| committer | David Green <david.green@arm.com> | 2019-08-12 16:54:07 +0000 |
| commit | 3e39f39ad929f0b6630ecb59b717fd6ae0702c76 (patch) | |
| tree | c346c1de58b46816ceaa988a1f76464d73439ff9 /llvm/lib/Target/ARM | |
| parent | c6802b231f9c156162d9394052a56a06f16a930f (diff) | |
| download | bcm5719-llvm-3e39f39ad929f0b6630ecb59b717fd6ae0702c76.tar.gz bcm5719-llvm-3e39f39ad929f0b6630ecb59b717fd6ae0702c76.zip | |
[ARM] MVE shuffle broadcast costs
A VDUP will perform a vector broadcast in a single instruction. Update the cost
model for MVE accordingly.
Code originally by David Sherwood.
Differential Revision: https://reviews.llvm.org/D63448
llvm-svn: 368589
Diffstat (limited to 'llvm/lib/Target/ARM')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp b/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp index 4e87f254893..f3da1b83765 100644 --- a/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp +++ b/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp @@ -514,6 +514,23 @@ int ARMTTIImpl::getShuffleCost(TTI::ShuffleKind Kind, Type *Tp, int Index, return LT.first * Entry->Cost; } } + if (ST->hasMVEIntegerOps()) { + if (Kind == TTI::SK_Broadcast) { + static const CostTblEntry MVEDupTbl[] = { + // VDUP handles these cases. + {ISD::VECTOR_SHUFFLE, MVT::v4i32, 1}, + {ISD::VECTOR_SHUFFLE, MVT::v8i16, 1}, + {ISD::VECTOR_SHUFFLE, MVT::v16i8, 1}, + {ISD::VECTOR_SHUFFLE, MVT::v4f32, 1}, + {ISD::VECTOR_SHUFFLE, MVT::v8f16, 1}}; + + std::pair<int, MVT> LT = TLI->getTypeLegalizationCost(DL, Tp); + + if (const auto *Entry = CostTableLookup(MVEDupTbl, ISD::VECTOR_SHUFFLE, + LT.second)) + return LT.first * Entry->Cost; + } + } return BaseT::getShuffleCost(Kind, Tp, Index, SubTp); } |

