aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/IR/InstructionsTest.cpp
diff options
context:
space:
mode:
authorAlexey Bataev <a.bataev@outlook.com>2023-08-21 13:01:03 -0700
committerAlexey Bataev <a.bataev@outlook.com>2023-09-28 11:03:21 -0700
commitc88c281cf1ac1a01c55231b93826d7c8ae83985b (patch)
tree7fc0c529850f06ffe168d1d00cadab73a9090c86 /llvm/unittests/IR/InstructionsTest.cpp
parent6ca47eb49ded6281e887fbdb26323deea45df44e (diff)
downloadllvm-c88c281cf1ac1a01c55231b93826d7c8ae83985b.zip
llvm-c88c281cf1ac1a01c55231b93826d7c8ae83985b.tar.gz
llvm-c88c281cf1ac1a01c55231b93826d7c8ae83985b.tar.bz2
[IR]Add NumSrcElts param to is..Mask static function in ShuffleVectorInst.
Need to add NumSrcElts param to is..Mask functions in ShuffleVectorInstruction class for better mask analysis. Mask.size() not always matches the sizes of the permuted vector(s). Allows to better estimate the cost in SLP and fix uses of the functions in other cases. Differential Revision: https://reviews.llvm.org/D158449
Diffstat (limited to 'llvm/unittests/IR/InstructionsTest.cpp')
-rw-r--r--llvm/unittests/IR/InstructionsTest.cpp178
1 files changed, 124 insertions, 54 deletions
diff --git a/llvm/unittests/IR/InstructionsTest.cpp b/llvm/unittests/IR/InstructionsTest.cpp
index 637c692..20b8529 100644
--- a/llvm/unittests/IR/InstructionsTest.cpp
+++ b/llvm/unittests/IR/InstructionsTest.cpp
@@ -1024,71 +1024,141 @@ TEST(InstructionsTest, ShuffleMaskQueries) {
Constant *C7 = ConstantInt::get(Int32Ty, 7);
Constant *Identity = ConstantVector::get({C0, CU, C2, C3, C4});
- EXPECT_TRUE(ShuffleVectorInst::isIdentityMask(Identity));
- EXPECT_FALSE(ShuffleVectorInst::isSelectMask(Identity)); // identity is distinguished from select
- EXPECT_FALSE(ShuffleVectorInst::isReverseMask(Identity));
- EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(Identity)); // identity is always single source
- EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(Identity));
- EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(Identity));
+ EXPECT_TRUE(ShuffleVectorInst::isIdentityMask(
+ Identity, cast<FixedVectorType>(Identity->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isSelectMask(
+ Identity,
+ cast<FixedVectorType>(Identity->getType())
+ ->getNumElements())); // identity is distinguished from select
+ EXPECT_FALSE(ShuffleVectorInst::isReverseMask(
+ Identity, cast<FixedVectorType>(Identity->getType())->getNumElements()));
+ EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(
+ Identity, cast<FixedVectorType>(Identity->getType())
+ ->getNumElements())); // identity is always single source
+ EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(
+ Identity, cast<FixedVectorType>(Identity->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(
+ Identity, cast<FixedVectorType>(Identity->getType())->getNumElements()));
Constant *Select = ConstantVector::get({CU, C1, C5});
- EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(Select));
- EXPECT_TRUE(ShuffleVectorInst::isSelectMask(Select));
- EXPECT_FALSE(ShuffleVectorInst::isReverseMask(Select));
- EXPECT_FALSE(ShuffleVectorInst::isSingleSourceMask(Select));
- EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(Select));
- EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(Select));
-
+ EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(
+ Select, cast<FixedVectorType>(Select->getType())->getNumElements()));
+ EXPECT_TRUE(ShuffleVectorInst::isSelectMask(
+ Select, cast<FixedVectorType>(Select->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isReverseMask(
+ Select, cast<FixedVectorType>(Select->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isSingleSourceMask(
+ Select, cast<FixedVectorType>(Select->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(
+ Select, cast<FixedVectorType>(Select->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(
+ Select, cast<FixedVectorType>(Select->getType())->getNumElements()));
+
Constant *Reverse = ConstantVector::get({C3, C2, C1, CU});
- EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(Reverse));
- EXPECT_FALSE(ShuffleVectorInst::isSelectMask(Reverse));
- EXPECT_TRUE(ShuffleVectorInst::isReverseMask(Reverse));
- EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(Reverse)); // reverse is always single source
- EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(Reverse));
- EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(Reverse));
+ EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(
+ Reverse, cast<FixedVectorType>(Reverse->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isSelectMask(
+ Reverse, cast<FixedVectorType>(Reverse->getType())->getNumElements()));
+ EXPECT_TRUE(ShuffleVectorInst::isReverseMask(
+ Reverse, cast<FixedVectorType>(Reverse->getType())->getNumElements()));
+ EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(
+ Reverse, cast<FixedVectorType>(Reverse->getType())
+ ->getNumElements())); // reverse is always single source
+ EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(
+ Reverse, cast<FixedVectorType>(Reverse->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(
+ Reverse, cast<FixedVectorType>(Reverse->getType())->getNumElements()));
Constant *SingleSource = ConstantVector::get({C2, C2, C0, CU});
- EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(SingleSource));
- EXPECT_FALSE(ShuffleVectorInst::isSelectMask(SingleSource));
- EXPECT_FALSE(ShuffleVectorInst::isReverseMask(SingleSource));
- EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(SingleSource));
- EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(SingleSource));
- EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(SingleSource));
+ EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(
+ SingleSource,
+ cast<FixedVectorType>(SingleSource->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isSelectMask(
+ SingleSource,
+ cast<FixedVectorType>(SingleSource->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isReverseMask(
+ SingleSource,
+ cast<FixedVectorType>(SingleSource->getType())->getNumElements()));
+ EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(
+ SingleSource,
+ cast<FixedVectorType>(SingleSource->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(
+ SingleSource,
+ cast<FixedVectorType>(SingleSource->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(
+ SingleSource,
+ cast<FixedVectorType>(SingleSource->getType())->getNumElements()));
Constant *ZeroEltSplat = ConstantVector::get({C0, C0, CU, C0});
- EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(ZeroEltSplat));
- EXPECT_FALSE(ShuffleVectorInst::isSelectMask(ZeroEltSplat));
- EXPECT_FALSE(ShuffleVectorInst::isReverseMask(ZeroEltSplat));
- EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(ZeroEltSplat)); // 0-splat is always single source
- EXPECT_TRUE(ShuffleVectorInst::isZeroEltSplatMask(ZeroEltSplat));
- EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(ZeroEltSplat));
+ EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(
+ ZeroEltSplat,
+ cast<FixedVectorType>(ZeroEltSplat->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isSelectMask(
+ ZeroEltSplat,
+ cast<FixedVectorType>(ZeroEltSplat->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isReverseMask(
+ ZeroEltSplat,
+ cast<FixedVectorType>(ZeroEltSplat->getType())->getNumElements()));
+ EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(
+ ZeroEltSplat, cast<FixedVectorType>(ZeroEltSplat->getType())
+ ->getNumElements())); // 0-splat is always single source
+ EXPECT_TRUE(ShuffleVectorInst::isZeroEltSplatMask(
+ ZeroEltSplat,
+ cast<FixedVectorType>(ZeroEltSplat->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(
+ ZeroEltSplat,
+ cast<FixedVectorType>(ZeroEltSplat->getType())->getNumElements()));
Constant *Transpose = ConstantVector::get({C0, C4, C2, C6});
- EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(Transpose));
- EXPECT_FALSE(ShuffleVectorInst::isSelectMask(Transpose));
- EXPECT_FALSE(ShuffleVectorInst::isReverseMask(Transpose));
- EXPECT_FALSE(ShuffleVectorInst::isSingleSourceMask(Transpose));
- EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(Transpose));
- EXPECT_TRUE(ShuffleVectorInst::isTransposeMask(Transpose));
+ EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(
+ Transpose,
+ cast<FixedVectorType>(Transpose->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isSelectMask(
+ Transpose,
+ cast<FixedVectorType>(Transpose->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isReverseMask(
+ Transpose,
+ cast<FixedVectorType>(Transpose->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isSingleSourceMask(
+ Transpose,
+ cast<FixedVectorType>(Transpose->getType())->getNumElements()));
+ EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(
+ Transpose,
+ cast<FixedVectorType>(Transpose->getType())->getNumElements()));
+ EXPECT_TRUE(ShuffleVectorInst::isTransposeMask(
+ Transpose,
+ cast<FixedVectorType>(Transpose->getType())->getNumElements()));
// More tests to make sure the logic is/stays correct...
- EXPECT_TRUE(ShuffleVectorInst::isIdentityMask(ConstantVector::get({CU, C1, CU, C3})));
- EXPECT_TRUE(ShuffleVectorInst::isIdentityMask(ConstantVector::get({C4, CU, C6, CU})));
-
- EXPECT_TRUE(ShuffleVectorInst::isSelectMask(ConstantVector::get({C4, C1, C6, CU})));
- EXPECT_TRUE(ShuffleVectorInst::isSelectMask(ConstantVector::get({CU, C1, C6, C3})));
-
- EXPECT_TRUE(ShuffleVectorInst::isReverseMask(ConstantVector::get({C7, C6, CU, C4})));
- EXPECT_TRUE(ShuffleVectorInst::isReverseMask(ConstantVector::get({C3, CU, C1, CU})));
-
- EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(ConstantVector::get({C7, C5, CU, C7})));
- EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(ConstantVector::get({C3, C0, CU, C3})));
-
- EXPECT_TRUE(ShuffleVectorInst::isZeroEltSplatMask(ConstantVector::get({C4, CU, CU, C4})));
- EXPECT_TRUE(ShuffleVectorInst::isZeroEltSplatMask(ConstantVector::get({CU, C0, CU, C0})));
-
- EXPECT_TRUE(ShuffleVectorInst::isTransposeMask(ConstantVector::get({C1, C5, C3, C7})));
- EXPECT_TRUE(ShuffleVectorInst::isTransposeMask(ConstantVector::get({C1, C3})));
+ EXPECT_TRUE(ShuffleVectorInst::isIdentityMask(
+ ConstantVector::get({CU, C1, CU, C3}), 4));
+ EXPECT_TRUE(ShuffleVectorInst::isIdentityMask(
+ ConstantVector::get({C4, CU, C6, CU}), 4));
+
+ EXPECT_TRUE(ShuffleVectorInst::isSelectMask(
+ ConstantVector::get({C4, C1, C6, CU}), 4));
+ EXPECT_TRUE(ShuffleVectorInst::isSelectMask(
+ ConstantVector::get({CU, C1, C6, C3}), 4));
+
+ EXPECT_TRUE(ShuffleVectorInst::isReverseMask(
+ ConstantVector::get({C7, C6, CU, C4}), 4));
+ EXPECT_TRUE(ShuffleVectorInst::isReverseMask(
+ ConstantVector::get({C3, CU, C1, CU}), 4));
+
+ EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(
+ ConstantVector::get({C7, C5, CU, C7}), 4));
+ EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(
+ ConstantVector::get({C3, C0, CU, C3}), 4));
+
+ EXPECT_TRUE(ShuffleVectorInst::isZeroEltSplatMask(
+ ConstantVector::get({C4, CU, CU, C4}), 4));
+ EXPECT_TRUE(ShuffleVectorInst::isZeroEltSplatMask(
+ ConstantVector::get({CU, C0, CU, C0}), 4));
+
+ EXPECT_TRUE(ShuffleVectorInst::isTransposeMask(
+ ConstantVector::get({C1, C5, C3, C7}), 4));
+ EXPECT_TRUE(
+ ShuffleVectorInst::isTransposeMask(ConstantVector::get({C1, C3}), 2));
// Nothing special about the values here - just re-using inputs to reduce code.
Constant *V0 = ConstantVector::get({C0, C1, C2, C3});