From c88c281cf1ac1a01c55231b93826d7c8ae83985b Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Mon, 21 Aug 2023 13:01:03 -0700 Subject: [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 --- llvm/unittests/IR/InstructionsTest.cpp | 178 +++++++++++++++++++++++---------- 1 file changed, 124 insertions(+), 54 deletions(-) (limited to 'llvm/unittests/IR/InstructionsTest.cpp') 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(Identity->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isSelectMask( + Identity, + cast(Identity->getType()) + ->getNumElements())); // identity is distinguished from select + EXPECT_FALSE(ShuffleVectorInst::isReverseMask( + Identity, cast(Identity->getType())->getNumElements())); + EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask( + Identity, cast(Identity->getType()) + ->getNumElements())); // identity is always single source + EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask( + Identity, cast(Identity->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isTransposeMask( + Identity, cast(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(Select->getType())->getNumElements())); + EXPECT_TRUE(ShuffleVectorInst::isSelectMask( + Select, cast(Select->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isReverseMask( + Select, cast(Select->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isSingleSourceMask( + Select, cast(Select->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask( + Select, cast(Select->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isTransposeMask( + Select, cast(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(Reverse->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isSelectMask( + Reverse, cast(Reverse->getType())->getNumElements())); + EXPECT_TRUE(ShuffleVectorInst::isReverseMask( + Reverse, cast(Reverse->getType())->getNumElements())); + EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask( + Reverse, cast(Reverse->getType()) + ->getNumElements())); // reverse is always single source + EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask( + Reverse, cast(Reverse->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isTransposeMask( + Reverse, cast(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(SingleSource->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isSelectMask( + SingleSource, + cast(SingleSource->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isReverseMask( + SingleSource, + cast(SingleSource->getType())->getNumElements())); + EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask( + SingleSource, + cast(SingleSource->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask( + SingleSource, + cast(SingleSource->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isTransposeMask( + SingleSource, + cast(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(ZeroEltSplat->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isSelectMask( + ZeroEltSplat, + cast(ZeroEltSplat->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isReverseMask( + ZeroEltSplat, + cast(ZeroEltSplat->getType())->getNumElements())); + EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask( + ZeroEltSplat, cast(ZeroEltSplat->getType()) + ->getNumElements())); // 0-splat is always single source + EXPECT_TRUE(ShuffleVectorInst::isZeroEltSplatMask( + ZeroEltSplat, + cast(ZeroEltSplat->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isTransposeMask( + ZeroEltSplat, + cast(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(Transpose->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isSelectMask( + Transpose, + cast(Transpose->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isReverseMask( + Transpose, + cast(Transpose->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isSingleSourceMask( + Transpose, + cast(Transpose->getType())->getNumElements())); + EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask( + Transpose, + cast(Transpose->getType())->getNumElements())); + EXPECT_TRUE(ShuffleVectorInst::isTransposeMask( + Transpose, + cast(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}); -- cgit v1.1