summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/TargetTransformInfo.cpp
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2018-06-12 14:47:13 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2018-06-12 14:47:13 +0000
commit07839219870f1bff1b41c5502fd16b09f549262d (patch)
tree49e98e83dfaaf02653d8fd965619a3ce14bd1c43 /llvm/lib/Analysis/TargetTransformInfo.cpp
parent76969eaf3d386df61f4891d439a50b9c471a31e6 (diff)
downloadbcm5719-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.cpp20
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);
OpenPOWER on IntegriCloud