diff options
author | Alexey Bataev <a.bataev@outlook.com> | 2023-08-21 13:01:03 -0700 |
---|---|---|
committer | Alexey Bataev <a.bataev@outlook.com> | 2023-09-28 11:03:21 -0700 |
commit | c88c281cf1ac1a01c55231b93826d7c8ae83985b (patch) | |
tree | 7fc0c529850f06ffe168d1d00cadab73a9090c86 /llvm/unittests/IR/InstructionsTest.cpp | |
parent | 6ca47eb49ded6281e887fbdb26323deea45df44e (diff) | |
download | llvm-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.cpp | 178 |
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}); |