xref: /llvm-project/llvm/unittests/IR/ShuffleVectorInstTest.cpp (revision e22818d5c98a5cb2babc44de8b29abc22d613b15)
11146d40dSSimon Pilgrim //===- llvm/unittest/IR/ShuffleVectorInstTest.cpp - Shuffle unit tests ----===//
21146d40dSSimon Pilgrim //
31146d40dSSimon Pilgrim // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
41146d40dSSimon Pilgrim // See https://llvm.org/LICENSE.txt for license information.
51146d40dSSimon Pilgrim // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61146d40dSSimon Pilgrim //
71146d40dSSimon Pilgrim //===----------------------------------------------------------------------===//
81146d40dSSimon Pilgrim 
91146d40dSSimon Pilgrim #include "llvm/IR/Instructions.h"
101146d40dSSimon Pilgrim #include "gtest/gtest.h"
111146d40dSSimon Pilgrim 
121146d40dSSimon Pilgrim using namespace llvm;
131146d40dSSimon Pilgrim 
141146d40dSSimon Pilgrim namespace {
151146d40dSSimon Pilgrim 
TEST(ShuffleVectorInst,isIdentityMask)161146d40dSSimon Pilgrim TEST(ShuffleVectorInst, isIdentityMask) {
17*e22818d5SAlexey Bataev   ASSERT_TRUE(ShuffleVectorInst::isIdentityMask({0, 1, 2, 3}, 4));
18*e22818d5SAlexey Bataev   ASSERT_TRUE(ShuffleVectorInst::isIdentityMask({0, 1, 2, 3, -1}, 5));
19*e22818d5SAlexey Bataev   ASSERT_TRUE(ShuffleVectorInst::isIdentityMask({0, 1, -1, 3}, 4));
201146d40dSSimon Pilgrim 
21*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isIdentityMask({0, 1, 2, 3}, 3));
22*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isIdentityMask({0, 1, 2, 3, -1}, 4));
23*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isIdentityMask({0, 1, -1, 3}, 3));
24*e22818d5SAlexey Bataev 
25*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isIdentityMask({0, 1, 2, 3}, 5));
26*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isIdentityMask({0, 1, 2, 3, -1}, 6));
27*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isIdentityMask({0, 1, -1, 3}, 5));
28*e22818d5SAlexey Bataev 
29*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isIdentityMask({0, 1, 2, 4}, 4));
30*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isIdentityMask({0, -1, 2, 4}, 4));
311146d40dSSimon Pilgrim }
321146d40dSSimon Pilgrim 
TEST(ShuffleVectorInst,isSelectMask)331146d40dSSimon Pilgrim TEST(ShuffleVectorInst, isSelectMask) {
34*e22818d5SAlexey Bataev   ASSERT_TRUE(ShuffleVectorInst::isSelectMask({0, 5, 6, 3}, 4));
351146d40dSSimon Pilgrim 
36*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isSelectMask({0, 5, 6, 3}, 3));
37*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isSelectMask({0, 5, 6, 3}, 5));
38*e22818d5SAlexey Bataev 
39*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isSelectMask({0, 1, 2, 3}, 4));
401146d40dSSimon Pilgrim }
411146d40dSSimon Pilgrim 
TEST(ShuffleVectorInst,isReverseMask)421146d40dSSimon Pilgrim TEST(ShuffleVectorInst, isReverseMask) {
43*e22818d5SAlexey Bataev   ASSERT_TRUE(ShuffleVectorInst::isReverseMask({3, 2, 1, 0}, 4));
44*e22818d5SAlexey Bataev   ASSERT_TRUE(ShuffleVectorInst::isReverseMask({-1, -1, 1, 0}, 4));
451146d40dSSimon Pilgrim 
46*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isReverseMask({3, 2, 1, 0}, 3));
47*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isReverseMask({-1, -1, 1, 0}, 3));
48*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isReverseMask({3, 2, 1, 0}, 5));
49*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isReverseMask({-1, -1, 1, 0}, 5));
50*e22818d5SAlexey Bataev 
51*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isReverseMask({4, 3, 2, 1}, 4));
521146d40dSSimon Pilgrim }
531146d40dSSimon Pilgrim 
TEST(ShuffleVectorInst,isZeroEltSplatMask)541146d40dSSimon Pilgrim TEST(ShuffleVectorInst, isZeroEltSplatMask) {
55*e22818d5SAlexey Bataev   ASSERT_TRUE(ShuffleVectorInst::isZeroEltSplatMask({0, 0, 0, 0}, 4));
56*e22818d5SAlexey Bataev   ASSERT_TRUE(ShuffleVectorInst::isZeroEltSplatMask({0, -1, 0, -1}, 4));
571146d40dSSimon Pilgrim 
58*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isZeroEltSplatMask({0, 0, 0, 0}, 3));
59*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isZeroEltSplatMask({0, -1, 0, -1}, 3));
60*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isZeroEltSplatMask({0, 0, 0, 0}, 5));
61*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isZeroEltSplatMask({0, -1, 0, -1}, 5));
62*e22818d5SAlexey Bataev 
63*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isZeroEltSplatMask({1, 1, 1, 1}, 4));
641146d40dSSimon Pilgrim }
651146d40dSSimon Pilgrim 
TEST(ShuffleVectorInst,isTransposeMask)661146d40dSSimon Pilgrim TEST(ShuffleVectorInst, isTransposeMask) {
67*e22818d5SAlexey Bataev   ASSERT_TRUE(ShuffleVectorInst::isTransposeMask({0, 4, 2, 6}, 4));
68*e22818d5SAlexey Bataev   ASSERT_TRUE(ShuffleVectorInst::isTransposeMask({1, 5, 3, 7}, 4));
691146d40dSSimon Pilgrim 
70*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isTransposeMask({0, 4, 2, 6}, 3));
71*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isTransposeMask({1, 5, 3, 7}, 3));
72*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isTransposeMask({0, 4, 2, 6}, 5));
73*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isTransposeMask({1, 5, 3, 7}, 5));
74*e22818d5SAlexey Bataev 
75*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isTransposeMask({2, 6, 4, 8}, 4));
761146d40dSSimon Pilgrim }
771146d40dSSimon Pilgrim 
TEST(ShuffleVectorInst,isSpliceMask)781146d40dSSimon Pilgrim TEST(ShuffleVectorInst, isSpliceMask) {
791146d40dSSimon Pilgrim   int Index;
801146d40dSSimon Pilgrim 
81*e22818d5SAlexey Bataev   ASSERT_TRUE(ShuffleVectorInst::isSpliceMask({0, 1, 2, 3}, 4, Index));
821146d40dSSimon Pilgrim   ASSERT_EQ(0, Index);
831146d40dSSimon Pilgrim 
84*e22818d5SAlexey Bataev   ASSERT_TRUE(ShuffleVectorInst::isSpliceMask({1, 2, 3, 4, 5, 6, 7}, 7, Index));
851146d40dSSimon Pilgrim   ASSERT_EQ(1, Index);
861146d40dSSimon Pilgrim 
87*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isSpliceMask({0, 1, 2, 3}, 3, Index));
88*e22818d5SAlexey Bataev   ASSERT_FALSE(
89*e22818d5SAlexey Bataev       ShuffleVectorInst::isSpliceMask({1, 2, 3, 4, 5, 6, 7}, 6, Index));
90*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isSpliceMask({0, 1, 2, 3}, 5, Index));
91*e22818d5SAlexey Bataev   ASSERT_FALSE(
92*e22818d5SAlexey Bataev       ShuffleVectorInst::isSpliceMask({1, 2, 3, 4, 5, 6, 7}, 8, Index));
93*e22818d5SAlexey Bataev 
94*e22818d5SAlexey Bataev   ASSERT_FALSE(ShuffleVectorInst::isSpliceMask({4, 5, 6, 7}, 4, Index));
951146d40dSSimon Pilgrim }
961146d40dSSimon Pilgrim 
TEST(ShuffleVectorInst,isExtractSubvectorMask)971146d40dSSimon Pilgrim TEST(ShuffleVectorInst, isExtractSubvectorMask) {
981146d40dSSimon Pilgrim   int Index;
991146d40dSSimon Pilgrim 
1001146d40dSSimon Pilgrim   ASSERT_TRUE(
1011146d40dSSimon Pilgrim       ShuffleVectorInst::isExtractSubvectorMask({0, 1, 2, 3}, 8, Index));
1021146d40dSSimon Pilgrim   ASSERT_EQ(0, Index);
1031146d40dSSimon Pilgrim 
1041146d40dSSimon Pilgrim   ASSERT_TRUE(
1051146d40dSSimon Pilgrim       ShuffleVectorInst::isExtractSubvectorMask({-1, 3, 4, 5}, 8, Index));
1061146d40dSSimon Pilgrim   ASSERT_EQ(2, Index);
1071146d40dSSimon Pilgrim 
1081146d40dSSimon Pilgrim   ASSERT_FALSE(
1091146d40dSSimon Pilgrim       ShuffleVectorInst::isExtractSubvectorMask({1, 2, 3, -1}, 4, Index));
1101146d40dSSimon Pilgrim }
1111146d40dSSimon Pilgrim 
TEST(ShuffleVectorInst,isInsertSubvectorMask)1121146d40dSSimon Pilgrim TEST(ShuffleVectorInst, isInsertSubvectorMask) {
1131146d40dSSimon Pilgrim   int NumSubElts, Index;
1141146d40dSSimon Pilgrim 
1151146d40dSSimon Pilgrim   ASSERT_TRUE(ShuffleVectorInst::isInsertSubvectorMask(
1161146d40dSSimon Pilgrim       {8, 9, 10, 11, 4, 5, 6, 7}, 8, NumSubElts, Index));
1171146d40dSSimon Pilgrim   ASSERT_EQ(0, Index);
1181146d40dSSimon Pilgrim   ASSERT_EQ(4, NumSubElts);
1191146d40dSSimon Pilgrim 
1201146d40dSSimon Pilgrim   ASSERT_TRUE(
1211146d40dSSimon Pilgrim       ShuffleVectorInst::isInsertSubvectorMask({0, 2}, 2, NumSubElts, Index));
1221146d40dSSimon Pilgrim   ASSERT_EQ(1, Index);
1231146d40dSSimon Pilgrim   ASSERT_EQ(1, NumSubElts);
1241146d40dSSimon Pilgrim }
1251146d40dSSimon Pilgrim 
TEST(ShuffleVectorInst,isReplicationMask)1261146d40dSSimon Pilgrim TEST(ShuffleVectorInst, isReplicationMask) {
1271146d40dSSimon Pilgrim   int ReplicationFactor, VF;
1281146d40dSSimon Pilgrim 
1291146d40dSSimon Pilgrim   ASSERT_TRUE(ShuffleVectorInst::isReplicationMask({0, 0, 1, 1, 2, 2, 3, 3},
1301146d40dSSimon Pilgrim                                                    ReplicationFactor, VF));
1311146d40dSSimon Pilgrim   ASSERT_EQ(2, ReplicationFactor);
1321146d40dSSimon Pilgrim   ASSERT_EQ(4, VF);
1331146d40dSSimon Pilgrim 
1341146d40dSSimon Pilgrim   ASSERT_TRUE(ShuffleVectorInst::isReplicationMask(
1351146d40dSSimon Pilgrim       {0, 0, 0, 1, 1, 1, -1, -1, -1, 3, 3, 3, 4, 4, 4}, ReplicationFactor, VF));
1361146d40dSSimon Pilgrim   ASSERT_EQ(3, ReplicationFactor);
1371146d40dSSimon Pilgrim   ASSERT_EQ(5, VF);
1381146d40dSSimon Pilgrim }
1391146d40dSSimon Pilgrim 
TEST(ShuffleVectorInst,isOneUseSingleSourceMask)1401146d40dSSimon Pilgrim TEST(ShuffleVectorInst, isOneUseSingleSourceMask) {
1411146d40dSSimon Pilgrim   ASSERT_TRUE(
1421146d40dSSimon Pilgrim       ShuffleVectorInst::isOneUseSingleSourceMask({0, 1, 2, 3, 3, 2, 0, 1}, 4));
1431146d40dSSimon Pilgrim   ASSERT_TRUE(
1441146d40dSSimon Pilgrim       ShuffleVectorInst::isOneUseSingleSourceMask({2, 3, 4, 5, 6, 7, 0, 1}, 8));
1451146d40dSSimon Pilgrim 
1461146d40dSSimon Pilgrim   ASSERT_FALSE(ShuffleVectorInst::isOneUseSingleSourceMask(
1471146d40dSSimon Pilgrim       {0, -1, 2, 3, 3, 2, 0, 1}, 4));
1481146d40dSSimon Pilgrim   ASSERT_FALSE(
1491146d40dSSimon Pilgrim       ShuffleVectorInst::isOneUseSingleSourceMask({0, 1, 2, 3, 3, 3, 1, 0}, 4));
1501146d40dSSimon Pilgrim }
1511146d40dSSimon Pilgrim 
TEST(ShuffleVectorInst,isInterleaveMask)152a9d9616cSLuke Lau TEST(ShuffleVectorInst, isInterleaveMask) {
153a9d9616cSLuke Lau   SmallVector<unsigned> StartIndexes;
154a9d9616cSLuke Lau   ASSERT_TRUE(ShuffleVectorInst::isInterleaveMask({0, 4, 1, 5, 2, 6, 3, 7}, 2,
155a9d9616cSLuke Lau                                                   8, StartIndexes));
156a9d9616cSLuke Lau   ASSERT_EQ(StartIndexes, SmallVector<unsigned>({0, 4}));
157a9d9616cSLuke Lau 
158a9d9616cSLuke Lau   ASSERT_FALSE(
159a9d9616cSLuke Lau       ShuffleVectorInst::isInterleaveMask({0, 4, 1, 6, 2, 6, 3, 7}, 2, 8));
160a9d9616cSLuke Lau 
161a9d9616cSLuke Lau   ASSERT_TRUE(ShuffleVectorInst::isInterleaveMask({4, 0, 5, 1, 6, 2, 7, 3}, 2,
162a9d9616cSLuke Lau                                                   8, StartIndexes));
163a9d9616cSLuke Lau   ASSERT_EQ(StartIndexes, SmallVector<unsigned>({4, 0}));
164a9d9616cSLuke Lau 
165a9d9616cSLuke Lau   ASSERT_TRUE(ShuffleVectorInst::isInterleaveMask({4, 0, -1, 1, -1, 2, 7, 3}, 2,
166a9d9616cSLuke Lau                                                   8, StartIndexes));
167a9d9616cSLuke Lau   ASSERT_EQ(StartIndexes, SmallVector<unsigned>({4, 0}));
168a9d9616cSLuke Lau 
169a9d9616cSLuke Lau   ASSERT_TRUE(ShuffleVectorInst::isInterleaveMask({0, 2, 4, 1, 3, 5}, 3, 6,
170a9d9616cSLuke Lau                                                   StartIndexes));
171a9d9616cSLuke Lau   ASSERT_EQ(StartIndexes, SmallVector<unsigned>({0, 2, 4}));
172a9d9616cSLuke Lau 
173a9d9616cSLuke Lau   ASSERT_TRUE(ShuffleVectorInst::isInterleaveMask({4, -1, 0, 5, 3, 1}, 3, 6,
174a9d9616cSLuke Lau                                                   StartIndexes));
175a9d9616cSLuke Lau   ASSERT_EQ(StartIndexes, SmallVector<unsigned>({4, 2, 0}));
176a9d9616cSLuke Lau 
177a9d9616cSLuke Lau   ASSERT_FALSE(
178a9d9616cSLuke Lau       ShuffleVectorInst::isInterleaveMask({8, 2, 12, 4, 9, 3, 13, 5}, 4, 8));
179a9d9616cSLuke Lau }
180a9d9616cSLuke Lau 
1811146d40dSSimon Pilgrim } // end anonymous namespace
182