diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-06-12 14:47:13 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-06-12 14:47:13 +0000 |
commit | 07839219870f1bff1b41c5502fd16b09f549262d (patch) | |
tree | 49e98e83dfaaf02653d8fd965619a3ce14bd1c43 /llvm/lib/Analysis/TargetTransformInfo.cpp | |
parent | 76969eaf3d386df61f4891d439a50b9c471a31e6 (diff) | |
download | bcm5719-llvm-07839219870f1bff1b41c5502fd16b09f549262d.tar.gz bcm5719-llvm-07839219870f1bff1b41c5502fd16b09f549262d.zip |
[CostModel] Treat Identity shuffle masks as zero cost
As discussed on D47985, identity shuffle masks should probably be free.
I've limited this to the case where the input and output types all match - but we could probably accept all cases.
Differential Revision: https://reviews.llvm.org/D47986
llvm-svn: 334506
Diffstat (limited to 'llvm/lib/Analysis/TargetTransformInfo.cpp')
-rw-r--r-- | llvm/lib/Analysis/TargetTransformInfo.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/TargetTransformInfo.cpp b/llvm/lib/Analysis/TargetTransformInfo.cpp index 193e5931993..14ec5ee5107 100644 --- a/llvm/lib/Analysis/TargetTransformInfo.cpp +++ b/llvm/lib/Analysis/TargetTransformInfo.cpp @@ -658,6 +658,22 @@ static bool isZeroEltBroadcastVectorMask(ArrayRef<int> Mask) { return true; } +static bool isIdentityVectorMask(ArrayRef<int> Mask) { + bool IdentityLHS = true; + bool IdentityRHS = true; + unsigned MaskSize = Mask.size(); + + // Example: shufflevector A, B, <0,1,u,3> + // Example: shufflevector A, B, <4,u,6,u> + for (unsigned i = 0; i < MaskSize && (IdentityLHS || IdentityRHS); ++i) { + if (Mask[i] < 0) + continue; + IdentityLHS &= (Mask[i] == i); + IdentityRHS &= (Mask[i] == (i + MaskSize)); + } + return IdentityLHS || IdentityRHS; +} + static bool isAlternateVectorMask(ArrayRef<int> Mask) { bool isAlternate = true; unsigned MaskSize = Mask.size(); @@ -1213,9 +1229,13 @@ int TargetTransformInfo::getInstructionThroughput(const Instruction *I) const { SmallVector<int, 16> Mask = Shuffle->getShuffleMask(); if (NumVecElems == Mask.size()) { + if (isIdentityVectorMask(Mask)) + return 0; + if (isReverseVectorMask(Mask)) return TTIImpl->getShuffleCost(TargetTransformInfo::SK_Reverse, VecTypOp0, 0, nullptr); + if (isAlternateVectorMask(Mask)) return TTIImpl->getShuffleCost(TargetTransformInfo::SK_Alternate, VecTypOp0, 0, nullptr); |