182 lines · cpp
1//===- llvm/unittest/IR/ShuffleVectorInstTest.cpp - Shuffle unit tests ----===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/IR/Instructions.h"10#include "gtest/gtest.h"11 12using namespace llvm;13 14namespace {15 16TEST(ShuffleVectorInst, isIdentityMask) {17 ASSERT_TRUE(ShuffleVectorInst::isIdentityMask({0, 1, 2, 3}, 4));18 ASSERT_TRUE(ShuffleVectorInst::isIdentityMask({0, 1, 2, 3, -1}, 5));19 ASSERT_TRUE(ShuffleVectorInst::isIdentityMask({0, 1, -1, 3}, 4));20 21 ASSERT_FALSE(ShuffleVectorInst::isIdentityMask({0, 1, 2, 3}, 3));22 ASSERT_FALSE(ShuffleVectorInst::isIdentityMask({0, 1, 2, 3, -1}, 4));23 ASSERT_FALSE(ShuffleVectorInst::isIdentityMask({0, 1, -1, 3}, 3));24 25 ASSERT_FALSE(ShuffleVectorInst::isIdentityMask({0, 1, 2, 3}, 5));26 ASSERT_FALSE(ShuffleVectorInst::isIdentityMask({0, 1, 2, 3, -1}, 6));27 ASSERT_FALSE(ShuffleVectorInst::isIdentityMask({0, 1, -1, 3}, 5));28 29 ASSERT_FALSE(ShuffleVectorInst::isIdentityMask({0, 1, 2, 4}, 4));30 ASSERT_FALSE(ShuffleVectorInst::isIdentityMask({0, -1, 2, 4}, 4));31}32 33TEST(ShuffleVectorInst, isSelectMask) {34 ASSERT_TRUE(ShuffleVectorInst::isSelectMask({0, 5, 6, 3}, 4));35 36 ASSERT_FALSE(ShuffleVectorInst::isSelectMask({0, 5, 6, 3}, 3));37 ASSERT_FALSE(ShuffleVectorInst::isSelectMask({0, 5, 6, 3}, 5));38 39 ASSERT_FALSE(ShuffleVectorInst::isSelectMask({0, 1, 2, 3}, 4));40}41 42TEST(ShuffleVectorInst, isReverseMask) {43 ASSERT_TRUE(ShuffleVectorInst::isReverseMask({3, 2, 1, 0}, 4));44 ASSERT_TRUE(ShuffleVectorInst::isReverseMask({-1, -1, 1, 0}, 4));45 46 ASSERT_FALSE(ShuffleVectorInst::isReverseMask({3, 2, 1, 0}, 3));47 ASSERT_FALSE(ShuffleVectorInst::isReverseMask({-1, -1, 1, 0}, 3));48 ASSERT_FALSE(ShuffleVectorInst::isReverseMask({3, 2, 1, 0}, 5));49 ASSERT_FALSE(ShuffleVectorInst::isReverseMask({-1, -1, 1, 0}, 5));50 51 ASSERT_FALSE(ShuffleVectorInst::isReverseMask({4, 3, 2, 1}, 4));52}53 54TEST(ShuffleVectorInst, isZeroEltSplatMask) {55 ASSERT_TRUE(ShuffleVectorInst::isZeroEltSplatMask({0, 0, 0, 0}, 4));56 ASSERT_TRUE(ShuffleVectorInst::isZeroEltSplatMask({0, -1, 0, -1}, 4));57 58 ASSERT_FALSE(ShuffleVectorInst::isZeroEltSplatMask({0, 0, 0, 0}, 3));59 ASSERT_FALSE(ShuffleVectorInst::isZeroEltSplatMask({0, -1, 0, -1}, 3));60 ASSERT_FALSE(ShuffleVectorInst::isZeroEltSplatMask({0, 0, 0, 0}, 5));61 ASSERT_FALSE(ShuffleVectorInst::isZeroEltSplatMask({0, -1, 0, -1}, 5));62 63 ASSERT_FALSE(ShuffleVectorInst::isZeroEltSplatMask({1, 1, 1, 1}, 4));64}65 66TEST(ShuffleVectorInst, isTransposeMask) {67 ASSERT_TRUE(ShuffleVectorInst::isTransposeMask({0, 4, 2, 6}, 4));68 ASSERT_TRUE(ShuffleVectorInst::isTransposeMask({1, 5, 3, 7}, 4));69 70 ASSERT_FALSE(ShuffleVectorInst::isTransposeMask({0, 4, 2, 6}, 3));71 ASSERT_FALSE(ShuffleVectorInst::isTransposeMask({1, 5, 3, 7}, 3));72 ASSERT_FALSE(ShuffleVectorInst::isTransposeMask({0, 4, 2, 6}, 5));73 ASSERT_FALSE(ShuffleVectorInst::isTransposeMask({1, 5, 3, 7}, 5));74 75 ASSERT_FALSE(ShuffleVectorInst::isTransposeMask({2, 6, 4, 8}, 4));76}77 78TEST(ShuffleVectorInst, isSpliceMask) {79 int Index;80 81 ASSERT_TRUE(ShuffleVectorInst::isSpliceMask({0, 1, 2, 3}, 4, Index));82 ASSERT_EQ(0, Index);83 84 ASSERT_TRUE(ShuffleVectorInst::isSpliceMask({1, 2, 3, 4, 5, 6, 7}, 7, Index));85 ASSERT_EQ(1, Index);86 87 ASSERT_FALSE(ShuffleVectorInst::isSpliceMask({0, 1, 2, 3}, 3, Index));88 ASSERT_FALSE(89 ShuffleVectorInst::isSpliceMask({1, 2, 3, 4, 5, 6, 7}, 6, Index));90 ASSERT_FALSE(ShuffleVectorInst::isSpliceMask({0, 1, 2, 3}, 5, Index));91 ASSERT_FALSE(92 ShuffleVectorInst::isSpliceMask({1, 2, 3, 4, 5, 6, 7}, 8, Index));93 94 ASSERT_FALSE(ShuffleVectorInst::isSpliceMask({4, 5, 6, 7}, 4, Index));95}96 97TEST(ShuffleVectorInst, isExtractSubvectorMask) {98 int Index;99 100 ASSERT_TRUE(101 ShuffleVectorInst::isExtractSubvectorMask({0, 1, 2, 3}, 8, Index));102 ASSERT_EQ(0, Index);103 104 ASSERT_TRUE(105 ShuffleVectorInst::isExtractSubvectorMask({-1, 3, 4, 5}, 8, Index));106 ASSERT_EQ(2, Index);107 108 ASSERT_FALSE(109 ShuffleVectorInst::isExtractSubvectorMask({1, 2, 3, -1}, 4, Index));110}111 112TEST(ShuffleVectorInst, isInsertSubvectorMask) {113 int NumSubElts, Index;114 115 ASSERT_TRUE(ShuffleVectorInst::isInsertSubvectorMask(116 {8, 9, 10, 11, 4, 5, 6, 7}, 8, NumSubElts, Index));117 ASSERT_EQ(0, Index);118 ASSERT_EQ(4, NumSubElts);119 120 ASSERT_TRUE(121 ShuffleVectorInst::isInsertSubvectorMask({0, 2}, 2, NumSubElts, Index));122 ASSERT_EQ(1, Index);123 ASSERT_EQ(1, NumSubElts);124}125 126TEST(ShuffleVectorInst, isReplicationMask) {127 int ReplicationFactor, VF;128 129 ASSERT_TRUE(ShuffleVectorInst::isReplicationMask({0, 0, 1, 1, 2, 2, 3, 3},130 ReplicationFactor, VF));131 ASSERT_EQ(2, ReplicationFactor);132 ASSERT_EQ(4, VF);133 134 ASSERT_TRUE(ShuffleVectorInst::isReplicationMask(135 {0, 0, 0, 1, 1, 1, -1, -1, -1, 3, 3, 3, 4, 4, 4}, ReplicationFactor, VF));136 ASSERT_EQ(3, ReplicationFactor);137 ASSERT_EQ(5, VF);138}139 140TEST(ShuffleVectorInst, isOneUseSingleSourceMask) {141 ASSERT_TRUE(142 ShuffleVectorInst::isOneUseSingleSourceMask({0, 1, 2, 3, 3, 2, 0, 1}, 4));143 ASSERT_TRUE(144 ShuffleVectorInst::isOneUseSingleSourceMask({2, 3, 4, 5, 6, 7, 0, 1}, 8));145 146 ASSERT_FALSE(ShuffleVectorInst::isOneUseSingleSourceMask(147 {0, -1, 2, 3, 3, 2, 0, 1}, 4));148 ASSERT_FALSE(149 ShuffleVectorInst::isOneUseSingleSourceMask({0, 1, 2, 3, 3, 3, 1, 0}, 4));150}151 152TEST(ShuffleVectorInst, isInterleaveMask) {153 SmallVector<unsigned> StartIndexes;154 ASSERT_TRUE(ShuffleVectorInst::isInterleaveMask({0, 4, 1, 5, 2, 6, 3, 7}, 2,155 8, StartIndexes));156 ASSERT_EQ(StartIndexes, SmallVector<unsigned>({0, 4}));157 158 ASSERT_FALSE(159 ShuffleVectorInst::isInterleaveMask({0, 4, 1, 6, 2, 6, 3, 7}, 2, 8));160 161 ASSERT_TRUE(ShuffleVectorInst::isInterleaveMask({4, 0, 5, 1, 6, 2, 7, 3}, 2,162 8, StartIndexes));163 ASSERT_EQ(StartIndexes, SmallVector<unsigned>({4, 0}));164 165 ASSERT_TRUE(ShuffleVectorInst::isInterleaveMask({4, 0, -1, 1, -1, 2, 7, 3}, 2,166 8, StartIndexes));167 ASSERT_EQ(StartIndexes, SmallVector<unsigned>({4, 0}));168 169 ASSERT_TRUE(ShuffleVectorInst::isInterleaveMask({0, 2, 4, 1, 3, 5}, 3, 6,170 StartIndexes));171 ASSERT_EQ(StartIndexes, SmallVector<unsigned>({0, 2, 4}));172 173 ASSERT_TRUE(ShuffleVectorInst::isInterleaveMask({4, -1, 0, 5, 3, 1}, 3, 6,174 StartIndexes));175 ASSERT_EQ(StartIndexes, SmallVector<unsigned>({4, 2, 0}));176 177 ASSERT_FALSE(178 ShuffleVectorInst::isInterleaveMask({8, 2, 12, 4, 9, 3, 13, 5}, 4, 8));179}180 181} // end anonymous namespace182