1d7834556SPetar Avramovic //===- KnownBitsTest.cpp -------------------------------------------===// 2d7834556SPetar Avramovic // 3d7834556SPetar Avramovic // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4d7834556SPetar Avramovic // See https://llvm.org/LICENSE.txt for license information. 5d7834556SPetar Avramovic // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6d7834556SPetar Avramovic // 7d7834556SPetar Avramovic //===----------------------------------------------------------------------===// 8d7834556SPetar Avramovic 9d7834556SPetar Avramovic #include "GISelMITest.h" 10d7834556SPetar Avramovic #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h" 11d7834556SPetar Avramovic #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" 12d7834556SPetar Avramovic 13d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsBuildVector) { 14d7834556SPetar Avramovic StringRef MIRString = R"( 15d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF 16fae05692SMatt Arsenault %unknown:_(s8) = G_LOAD %ptr(p0) :: (load (s8)) 17d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 24 18d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 224 19d7834556SPetar Avramovic %tmp0:_(s8) = G_AND %unknown, %mask0 20d7834556SPetar Avramovic %val0:_(s8) = G_OR %tmp0, %mask1 21d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 146 22d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 36 23d7834556SPetar Avramovic %tmp1:_(s8) = G_AND %unknown, %mask2 24d7834556SPetar Avramovic %val1:_(s8) = G_OR %tmp1, %mask3 25d7834556SPetar Avramovic %vector:_(<2 x s8>) = G_BUILD_VECTOR %val0, %val1 26d7834556SPetar Avramovic %copy_vector:_(<2 x s8>) = COPY %vector 27d7834556SPetar Avramovic )"; 28d7834556SPetar Avramovic 2942a84d22SDaniel Sanders setUp(MIRString); 30d7834556SPetar Avramovic if (!TM) 31d7834556SPetar Avramovic return; 32d7834556SPetar Avramovic 33d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1]; 34d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg); 35d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg(); 36d7834556SPetar Avramovic GISelKnownBits Info(*MF); 37d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg); 38d7834556SPetar Avramovic // BuildVector KnownBits takes common bits of all elements. 39d7834556SPetar Avramovic // 111??000 40d7834556SPetar Avramovic // common ?01?01?0 41d7834556SPetar Avramovic // = ??1????0 42d7834556SPetar Avramovic EXPECT_EQ(0x20u, Res.One.getZExtValue()); 43d7834556SPetar Avramovic EXPECT_EQ(0x01u, Res.Zero.getZExtValue()); 44d7834556SPetar Avramovic } 45d7834556SPetar Avramovic 46d7834556SPetar Avramovic // Vector KnownBits track bits that are common for all vector scalar elements. 47d7834556SPetar Avramovic // For tests below KnownBits analysis is same as for scalar/pointer types, tests 48d7834556SPetar Avramovic // are mostly copied from KnownBitsTest.cpp using splat vectors and have the 49d7834556SPetar Avramovic // same result. 50d7834556SPetar Avramovic 51d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorCstPHI) { 52d7834556SPetar Avramovic StringRef MIRString = R"( 53d7834556SPetar Avramovic bb.10: 54d7834556SPetar Avramovic %10:_(s8) = G_CONSTANT i8 3 55d7834556SPetar Avramovic %11:_(<2 x s8>) = G_BUILD_VECTOR %10:_(s8), %10:_(s8) 56d7834556SPetar Avramovic %12:_(s1) = G_IMPLICIT_DEF 57d7834556SPetar Avramovic G_BRCOND %12(s1), %bb.11 58d7834556SPetar Avramovic G_BR %bb.12 59d7834556SPetar Avramovic 60d7834556SPetar Avramovic bb.11: 61d7834556SPetar Avramovic %13:_(s8) = G_CONSTANT i8 2 62d7834556SPetar Avramovic %14:_(<2 x s8>) = G_BUILD_VECTOR %13:_(s8), %13:_(s8) 63d7834556SPetar Avramovic G_BR %bb.12 64d7834556SPetar Avramovic 65d7834556SPetar Avramovic bb.12: 66d7834556SPetar Avramovic %15:_(<2 x s8>) = PHI %11(<2 x s8>), %bb.10, %14(<2 x s8>), %bb.11 67d7834556SPetar Avramovic %16:_(<2 x s8>) = COPY %15 68d7834556SPetar Avramovic )"; 69d7834556SPetar Avramovic 7042a84d22SDaniel Sanders setUp(MIRString); 71d7834556SPetar Avramovic if (!TM) 72d7834556SPetar Avramovic return; 73d7834556SPetar Avramovic 74d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1]; 75d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg); 76d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg(); 77d7834556SPetar Avramovic Register DstReg = FinalCopy->getOperand(0).getReg(); 78d7834556SPetar Avramovic GISelKnownBits Info(*MF); 79d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg); 80d7834556SPetar Avramovic EXPECT_EQ((uint64_t)2, Res.One.getZExtValue()); 81d7834556SPetar Avramovic EXPECT_EQ((uint64_t)0xfc, Res.Zero.getZExtValue()); 82d7834556SPetar Avramovic 83d7834556SPetar Avramovic KnownBits Res2 = Info.getKnownBits(DstReg); 84d7834556SPetar Avramovic EXPECT_EQ(Res.One.getZExtValue(), Res2.One.getZExtValue()); 85d7834556SPetar Avramovic EXPECT_EQ(Res.Zero.getZExtValue(), Res2.Zero.getZExtValue()); 86d7834556SPetar Avramovic } 87d7834556SPetar Avramovic 88d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorCstPHIToNonGenericReg) { 89d7834556SPetar Avramovic StringRef MIRString = R"( 90d7834556SPetar Avramovic bb.10: 91d7834556SPetar Avramovic %10:gpr32 = MOVi32imm 771 92d7834556SPetar Avramovic %11:_(s1) = G_IMPLICIT_DEF 93d7834556SPetar Avramovic G_BRCOND %11(s1), %bb.11 94d7834556SPetar Avramovic G_BR %bb.12 95d7834556SPetar Avramovic 96d7834556SPetar Avramovic bb.11: 97d7834556SPetar Avramovic %12:_(s16) = G_CONSTANT i16 2 98d7834556SPetar Avramovic %13:_(<2 x s16>) = G_BUILD_VECTOR %12:_(s16), %12:_(s16) 99d7834556SPetar Avramovic G_BR %bb.12 100d7834556SPetar Avramovic 101d7834556SPetar Avramovic bb.12: 102d7834556SPetar Avramovic %15:_(<2 x s16>) = PHI %10, %bb.10, %13(<2 x s16>), %bb.11 103d7834556SPetar Avramovic %16:_(<2 x s16>) = COPY %15 104d7834556SPetar Avramovic )"; 105d7834556SPetar Avramovic 10642a84d22SDaniel Sanders setUp(MIRString); 107d7834556SPetar Avramovic if (!TM) 108d7834556SPetar Avramovic return; 109d7834556SPetar Avramovic 110d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1]; 111d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg); 112d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg(); 113d7834556SPetar Avramovic Register DstReg = FinalCopy->getOperand(0).getReg(); 114d7834556SPetar Avramovic GISelKnownBits Info(*MF); 115d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg); 116d7834556SPetar Avramovic EXPECT_EQ((uint64_t)0, Res.One.getZExtValue()); 117d7834556SPetar Avramovic EXPECT_EQ((uint64_t)0, Res.Zero.getZExtValue()); 118d7834556SPetar Avramovic 119d7834556SPetar Avramovic KnownBits Res2 = Info.getKnownBits(DstReg); 120d7834556SPetar Avramovic EXPECT_EQ(Res.One.getZExtValue(), Res2.One.getZExtValue()); 121d7834556SPetar Avramovic EXPECT_EQ(Res.Zero.getZExtValue(), Res2.Zero.getZExtValue()); 122d7834556SPetar Avramovic } 123d7834556SPetar Avramovic 124d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorUnknownPHI) { 125d7834556SPetar Avramovic StringRef MIRString = R"( 126d7834556SPetar Avramovic bb.10: 127d7834556SPetar Avramovic %10:_(<2 x s32>) = G_BITCAST %0 128d7834556SPetar Avramovic %11:_(s1) = G_IMPLICIT_DEF 129d7834556SPetar Avramovic G_BRCOND %11(s1), %bb.11 130d7834556SPetar Avramovic G_BR %bb.12 131d7834556SPetar Avramovic 132d7834556SPetar Avramovic bb.11: 133d7834556SPetar Avramovic %12:_(s32) = G_CONSTANT i32 2 134d7834556SPetar Avramovic %13:_(<2 x s32>) = G_BUILD_VECTOR %12:_(s32), %12:_(s32) 135d7834556SPetar Avramovic G_BR %bb.12 136d7834556SPetar Avramovic 137d7834556SPetar Avramovic bb.12: 138d7834556SPetar Avramovic %14:_(<2 x s32>) = PHI %10(<2 x s32>), %bb.10, %13(<2 x s32>), %bb.11 139d7834556SPetar Avramovic %15:_(<2 x s32>) = COPY %14 140d7834556SPetar Avramovic )"; 141d7834556SPetar Avramovic 14242a84d22SDaniel Sanders setUp(MIRString); 143d7834556SPetar Avramovic if (!TM) 144d7834556SPetar Avramovic return; 145d7834556SPetar Avramovic 146d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1]; 147d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg); 148d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg(); 149d7834556SPetar Avramovic Register DstReg = FinalCopy->getOperand(0).getReg(); 150d7834556SPetar Avramovic GISelKnownBits Info(*MF); 151d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg); 152d7834556SPetar Avramovic EXPECT_EQ((uint64_t)0, Res.One.getZExtValue()); 153d7834556SPetar Avramovic EXPECT_EQ((uint64_t)0, Res.Zero.getZExtValue()); 154d7834556SPetar Avramovic 155d7834556SPetar Avramovic KnownBits Res2 = Info.getKnownBits(DstReg); 156d7834556SPetar Avramovic EXPECT_EQ(Res.One.getZExtValue(), Res2.One.getZExtValue()); 157d7834556SPetar Avramovic EXPECT_EQ(Res.Zero.getZExtValue(), Res2.Zero.getZExtValue()); 158d7834556SPetar Avramovic } 159d7834556SPetar Avramovic 160d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorCstPHIWithLoop) { 161d7834556SPetar Avramovic StringRef MIRString = R"( 162d7834556SPetar Avramovic bb.10: 163d7834556SPetar Avramovic %10:_(s8) = G_CONSTANT i8 3 164d7834556SPetar Avramovic %11:_(<2 x s8>) = G_BUILD_VECTOR %10:_(s8), %10:_(s8) 165d7834556SPetar Avramovic %12:_(s1) = G_IMPLICIT_DEF 166d7834556SPetar Avramovic G_BRCOND %12(s1), %bb.11 167d7834556SPetar Avramovic G_BR %bb.12 168d7834556SPetar Avramovic 169d7834556SPetar Avramovic bb.11: 170d7834556SPetar Avramovic %13:_(s8) = G_CONSTANT i8 2 171d7834556SPetar Avramovic %14:_(<2 x s8>) = G_BUILD_VECTOR %13:_(s8), %13:_(s8) 172d7834556SPetar Avramovic G_BR %bb.12 173d7834556SPetar Avramovic 174d7834556SPetar Avramovic bb.12: 175d7834556SPetar Avramovic %15:_(<2 x s8>) = PHI %11(<2 x s8>), %bb.10, %14(<2 x s8>), %bb.11, %16(<2 x s8>), %bb.12 176d7834556SPetar Avramovic %16:_(<2 x s8>) = COPY %15 177d7834556SPetar Avramovic G_BR %bb.12 178d7834556SPetar Avramovic )"; 179d7834556SPetar Avramovic 18042a84d22SDaniel Sanders setUp(MIRString); 181d7834556SPetar Avramovic if (!TM) 182d7834556SPetar Avramovic return; 183d7834556SPetar Avramovic 184d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1]; 185d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg); 186d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg(); 187d7834556SPetar Avramovic Register DstReg = FinalCopy->getOperand(0).getReg(); 188d7834556SPetar Avramovic GISelKnownBits Info(*MF); 189d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg); 190d7834556SPetar Avramovic EXPECT_EQ((uint64_t)0, Res.One.getZExtValue()); 191d7834556SPetar Avramovic EXPECT_EQ((uint64_t)0, Res.Zero.getZExtValue()); 192d7834556SPetar Avramovic 193d7834556SPetar Avramovic KnownBits Res2 = Info.getKnownBits(DstReg); 194d7834556SPetar Avramovic EXPECT_EQ(Res.One.getZExtValue(), Res2.One.getZExtValue()); 195d7834556SPetar Avramovic EXPECT_EQ(Res.Zero.getZExtValue(), Res2.Zero.getZExtValue()); 196d7834556SPetar Avramovic } 197d7834556SPetar Avramovic 198d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorDecreasingCstPHIWithLoop) { 199d7834556SPetar Avramovic StringRef MIRString = R"( 200d7834556SPetar Avramovic bb.10: 201d7834556SPetar Avramovic %10:_(s8) = G_CONSTANT i8 5 202d7834556SPetar Avramovic %11:_(<2 x s8>) = G_BUILD_VECTOR %10:_(s8), %10:_(s8) 203d7834556SPetar Avramovic %12:_(s8) = G_CONSTANT i8 1 204d7834556SPetar Avramovic 205d7834556SPetar Avramovic bb.12: 206d7834556SPetar Avramovic %13:_(<2 x s8>) = PHI %11(<2 x s8>), %bb.10, %14(<2 x s8>), %bb.12 207d7834556SPetar Avramovic %14:_(<2 x s8>) = G_LSHR %13, %12 208d7834556SPetar Avramovic %15:_(<2 x s8>) = COPY %14 209d7834556SPetar Avramovic G_BR %bb.12 210d7834556SPetar Avramovic )"; 211d7834556SPetar Avramovic 21242a84d22SDaniel Sanders setUp(MIRString); 213d7834556SPetar Avramovic if (!TM) 214d7834556SPetar Avramovic return; 215d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1]; 216d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg); 217d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg(); 218d7834556SPetar Avramovic Register DstReg = FinalCopy->getOperand(0).getReg(); 219d7834556SPetar Avramovic GISelKnownBits Info(*MF, /*MaxDepth=*/24); 220d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg); 221d7834556SPetar Avramovic EXPECT_EQ((uint64_t)0, Res.One.getZExtValue()); 222d7834556SPetar Avramovic EXPECT_EQ((uint64_t)0xC0, Res.Zero.getZExtValue()); 223d7834556SPetar Avramovic 224d7834556SPetar Avramovic KnownBits Res2 = Info.getKnownBits(DstReg); 225d7834556SPetar Avramovic EXPECT_EQ(Res.One.getZExtValue(), Res2.One.getZExtValue()); 226d7834556SPetar Avramovic EXPECT_EQ(Res.Zero.getZExtValue(), Res2.Zero.getZExtValue()); 227d7834556SPetar Avramovic } 228d7834556SPetar Avramovic 229d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorAND) { 230d7834556SPetar Avramovic StringRef MIRString = R"( 231d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF 232fae05692SMatt Arsenault %unknown:_(<2 x s8>) = G_LOAD %ptr(p0) :: (load (<2 x s8>)) 233d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 52 234d7834556SPetar Avramovic %mask0_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask0, %mask0 235d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 10 236d7834556SPetar Avramovic %mask1_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask1, %mask1 237d7834556SPetar Avramovic %tmp0:_(<2 x s8>) = G_AND %unknown, %mask0_splat 238d7834556SPetar Avramovic %val0:_(<2 x s8>) = G_OR %tmp0, %mask1_splat 239d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 32 240d7834556SPetar Avramovic %mask2_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask2, %mask2 241d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 24 242d7834556SPetar Avramovic %mask3_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask3, %mask3 243d7834556SPetar Avramovic %tmp1:_(<2 x s8>) = G_AND %unknown, %mask2_splat 244d7834556SPetar Avramovic %val1:_(<2 x s8>) = G_OR %tmp1, %mask3_splat 245d7834556SPetar Avramovic %and:_(<2 x s8>) = G_AND %val0, %val1 246d7834556SPetar Avramovic %copy_and:_(<2 x s8>) = COPY %and 247d7834556SPetar Avramovic )"; 248d7834556SPetar Avramovic 24942a84d22SDaniel Sanders setUp(MIRString); 250d7834556SPetar Avramovic if (!TM) 251d7834556SPetar Avramovic return; 252d7834556SPetar Avramovic 253d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1]; 254d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg); 255d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg(); 256d7834556SPetar Avramovic GISelKnownBits Info(*MF); 257d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg); 258d7834556SPetar Avramovic EXPECT_EQ(0x08u, Res.One.getZExtValue()); 259d7834556SPetar Avramovic EXPECT_EQ(0xC7u, Res.Zero.getZExtValue()); 260d7834556SPetar Avramovic } 261d7834556SPetar Avramovic 262d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorOR) { 263d7834556SPetar Avramovic StringRef MIRString = R"( 264d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF 265fae05692SMatt Arsenault %unknown:_(<2 x s8>) = G_LOAD %ptr(p0) :: (load (<2 x s8>)) 266d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 52 267d7834556SPetar Avramovic %mask0_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask0, %mask0 268d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 10 269d7834556SPetar Avramovic %mask1_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask1, %mask1 270d7834556SPetar Avramovic %tmp0:_(<2 x s8>) = G_AND %unknown, %mask0_splat 271d7834556SPetar Avramovic %val0:_(<2 x s8>) = G_OR %tmp0, %mask1_splat 272d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 32 273d7834556SPetar Avramovic %mask2_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask2, %mask2 274d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 24 275d7834556SPetar Avramovic %mask3_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask3, %mask3 276d7834556SPetar Avramovic %tmp1:_(<2 x s8>) = G_AND %unknown, %mask2_splat 277d7834556SPetar Avramovic %val1:_(<2 x s8>) = G_OR %tmp1, %mask3_splat 278d7834556SPetar Avramovic %or:_(<2 x s8>) = G_OR %val0, %val1 279d7834556SPetar Avramovic %copy_or:_(<2 x s8>) = COPY %or 280d7834556SPetar Avramovic )"; 281d7834556SPetar Avramovic 28242a84d22SDaniel Sanders setUp(MIRString); 283d7834556SPetar Avramovic if (!TM) 284d7834556SPetar Avramovic return; 285d7834556SPetar Avramovic 286d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1]; 287d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg); 288d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg(); 289d7834556SPetar Avramovic GISelKnownBits Info(*MF); 290d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg); 291d7834556SPetar Avramovic EXPECT_EQ(0x1Au, Res.One.getZExtValue()); 292d7834556SPetar Avramovic EXPECT_EQ(0xC1u, Res.Zero.getZExtValue()); 293d7834556SPetar Avramovic } 294d7834556SPetar Avramovic 295d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorXOR) { 296d7834556SPetar Avramovic StringRef MIRString = R"( 297d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF 298fae05692SMatt Arsenault %unknown:_(<2 x s8>) = G_LOAD %ptr(p0) :: (load (<2 x s8>)) 299d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 52 300d7834556SPetar Avramovic %mask0_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask0, %mask0 301d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 10 302d7834556SPetar Avramovic %mask1_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask1, %mask1 303d7834556SPetar Avramovic %tmp0:_(<2 x s8>) = G_AND %unknown, %mask0_splat 304d7834556SPetar Avramovic %val0:_(<2 x s8>) = G_OR %tmp0, %mask1_splat 305d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 32 306d7834556SPetar Avramovic %mask2_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask2, %mask2 307d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 24 308d7834556SPetar Avramovic %mask3_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask3, %mask3 309d7834556SPetar Avramovic %tmp1:_(<2 x s8>) = G_AND %unknown, %mask2_splat 310d7834556SPetar Avramovic %val1:_(<2 x s8>) = G_OR %tmp1, %mask3_splat 311d7834556SPetar Avramovic %xor:_(<2 x s8>) = G_XOR %val0, %val1 312d7834556SPetar Avramovic %copy_xor:_(<2 x s8>) = COPY %xor 313d7834556SPetar Avramovic )"; 314d7834556SPetar Avramovic 31542a84d22SDaniel Sanders setUp(MIRString); 316d7834556SPetar Avramovic if (!TM) 317d7834556SPetar Avramovic return; 318d7834556SPetar Avramovic 319d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1]; 320d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg); 321d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg(); 322d7834556SPetar Avramovic GISelKnownBits Info(*MF); 323d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg); 324d7834556SPetar Avramovic EXPECT_EQ(0x02u, Res.One.getZExtValue()); 325d7834556SPetar Avramovic EXPECT_EQ(0xC9u, Res.Zero.getZExtValue()); 326d7834556SPetar Avramovic } 327d7834556SPetar Avramovic 328d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorXORConstant) { 329d7834556SPetar Avramovic StringRef MIRString = R"( 330d7834556SPetar Avramovic %3:_(s8) = G_CONSTANT i8 4 331d7834556SPetar Avramovic %4:_(<2 x s8>) = G_BUILD_VECTOR %3:_(s8), %3:_(s8) 332d7834556SPetar Avramovic %5:_(s8) = G_CONSTANT i8 7 333d7834556SPetar Avramovic %6:_(<2 x s8>) = G_BUILD_VECTOR %5:_(s8), %5:_(s8) 334d7834556SPetar Avramovic %7:_(<2 x s8>) = G_XOR %4, %6 335d7834556SPetar Avramovic %8:_(<2 x s8>) = COPY %7 336d7834556SPetar Avramovic 337d7834556SPetar Avramovic %9:_(s8) = G_CONSTANT i8 12 338d7834556SPetar Avramovic %10:_(<2 x s8>) = G_BUILD_VECTOR %3:_(s8), %9:_(s8) 339d7834556SPetar Avramovic %11:_(<2 x s8>) = G_XOR %10, %6 340d7834556SPetar Avramovic %12:_(<2 x s8>) = COPY %11 341d7834556SPetar Avramovic )"; 342d7834556SPetar Avramovic 34342a84d22SDaniel Sanders setUp(MIRString); 344d7834556SPetar Avramovic if (!TM) 345d7834556SPetar Avramovic return; 346d7834556SPetar Avramovic 347d7834556SPetar Avramovic GISelKnownBits Info(*MF); 348d7834556SPetar Avramovic Register CopySplatReg = Copies[Copies.size() - 2]; 349d7834556SPetar Avramovic MachineInstr *FinalSplatCopy = MRI->getVRegDef(CopySplatReg); 350d7834556SPetar Avramovic Register SrcSplatReg = FinalSplatCopy->getOperand(1).getReg(); 351d7834556SPetar Avramovic KnownBits ResNonSplat = Info.getKnownBits(SrcSplatReg); 352d7834556SPetar Avramovic EXPECT_EQ(3u, ResNonSplat.One.getZExtValue()); 353d7834556SPetar Avramovic EXPECT_EQ(252u, ResNonSplat.Zero.getZExtValue()); 354d7834556SPetar Avramovic 355d7834556SPetar Avramovic Register CopyNonSplatReg = Copies[Copies.size() - 1]; 356d7834556SPetar Avramovic MachineInstr *FinalNonSplatCopy = MRI->getVRegDef(CopyNonSplatReg); 357d7834556SPetar Avramovic Register SrcNonSplatReg = FinalNonSplatCopy->getOperand(1).getReg(); 358d7834556SPetar Avramovic KnownBits ResSplat = Info.getKnownBits(SrcNonSplatReg); 359d7834556SPetar Avramovic EXPECT_EQ(3u, ResSplat.One.getZExtValue()); 360d7834556SPetar Avramovic EXPECT_EQ(244u, ResSplat.Zero.getZExtValue()); 361d7834556SPetar Avramovic } 362d7834556SPetar Avramovic 363d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorASHR) { 364d7834556SPetar Avramovic StringRef MIRString = R"( 365d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF 366fae05692SMatt Arsenault %unknown:_(<2 x s8>) = G_LOAD %ptr(p0) :: (load (<2 x s8>)) 367d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 38 368d7834556SPetar Avramovic %mask0_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask0, %mask0 369d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 202 370d7834556SPetar Avramovic %mask1_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask1, %mask1 371d7834556SPetar Avramovic %tmp0:_(<2 x s8>) = G_AND %unknown, %mask0_splat 372d7834556SPetar Avramovic %val0:_(<2 x s8>) = G_OR %tmp0, %mask1_splat 373d7834556SPetar Avramovic %cst0:_(s8) = G_CONSTANT i8 2 374d7834556SPetar Avramovic %cst0_splat:_(<2 x s8>) = G_BUILD_VECTOR %cst0, %cst0 375d7834556SPetar Avramovic %ashr0:_(<2 x s8>) = G_ASHR %val0, %cst0_splat 376d7834556SPetar Avramovic %copy_ashr0:_(<2 x s8>) = COPY %ashr0 377d7834556SPetar Avramovic 378d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 204 379d7834556SPetar Avramovic %mask2_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask2, %mask2 380d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 18 381d7834556SPetar Avramovic %mask3_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask3, %mask3 382d7834556SPetar Avramovic %tmp1:_(<2 x s8>) = G_AND %unknown, %mask2_splat 383d7834556SPetar Avramovic %val1:_(<2 x s8>) = G_OR %tmp1, %mask3_splat 384d7834556SPetar Avramovic %ashr1:_(<2 x s8>) = G_ASHR %val1, %cst0_splat 385d7834556SPetar Avramovic %copy_ashr1:_(<2 x s8>) = COPY %ashr1 386d7834556SPetar Avramovic )"; 387d7834556SPetar Avramovic 38842a84d22SDaniel Sanders setUp(MIRString); 389d7834556SPetar Avramovic if (!TM) 390d7834556SPetar Avramovic return; 391d7834556SPetar Avramovic 392d7834556SPetar Avramovic Register CopyReg0 = Copies[Copies.size() - 2]; 393d7834556SPetar Avramovic MachineInstr *FinalCopy0 = MRI->getVRegDef(CopyReg0); 394d7834556SPetar Avramovic Register SrcReg0 = FinalCopy0->getOperand(1).getReg(); 395d7834556SPetar Avramovic GISelKnownBits Info(*MF); 396d7834556SPetar Avramovic KnownBits Res0 = Info.getKnownBits(SrcReg0); 397d7834556SPetar Avramovic EXPECT_EQ(0xF2u, Res0.One.getZExtValue()); 398d7834556SPetar Avramovic EXPECT_EQ(0x04u, Res0.Zero.getZExtValue()); 399d7834556SPetar Avramovic 400d7834556SPetar Avramovic Register CopyReg1 = Copies[Copies.size() - 1]; 401d7834556SPetar Avramovic MachineInstr *FinalCopy1 = MRI->getVRegDef(CopyReg1); 402d7834556SPetar Avramovic Register SrcReg1 = FinalCopy1->getOperand(1).getReg(); 403d7834556SPetar Avramovic KnownBits Res1 = Info.getKnownBits(SrcReg1); 404d7834556SPetar Avramovic EXPECT_EQ(0x04u, Res1.One.getZExtValue()); 405d7834556SPetar Avramovic EXPECT_EQ(0x08u, Res1.Zero.getZExtValue()); 406d7834556SPetar Avramovic } 407d7834556SPetar Avramovic 408d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorLSHR) { 409d7834556SPetar Avramovic StringRef MIRString = R"( 410d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF 411fae05692SMatt Arsenault %unknown:_(<2 x s8>) = G_LOAD %ptr(p0) :: (load (<2 x s8>)) 412d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 38 413d7834556SPetar Avramovic %mask0_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask0, %mask0 414d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 202 415d7834556SPetar Avramovic %mask1_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask1, %mask1 416d7834556SPetar Avramovic %tmp0:_(<2 x s8>) = G_AND %unknown, %mask0_splat 417d7834556SPetar Avramovic %val0:_(<2 x s8>) = G_OR %tmp0, %mask1_splat 418d7834556SPetar Avramovic %cst0:_(s8) = G_CONSTANT i8 2 419d7834556SPetar Avramovic %cst0_splat:_(<2 x s8>) = G_BUILD_VECTOR %cst0, %cst0 420d7834556SPetar Avramovic %lshr0:_(<2 x s8>) = G_LSHR %val0, %cst0_splat 421d7834556SPetar Avramovic %copy_lshr0:_(<2 x s8>) = COPY %lshr0 422d7834556SPetar Avramovic 423d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 204 424d7834556SPetar Avramovic %mask2_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask2, %mask2 425d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 18 426d7834556SPetar Avramovic %mask3_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask3, %mask3 427d7834556SPetar Avramovic %tmp1:_(<2 x s8>) = G_AND %unknown, %mask2_splat 428d7834556SPetar Avramovic %val1:_(<2 x s8>) = G_OR %tmp1, %mask3_splat 429d7834556SPetar Avramovic %lshr1:_(<2 x s8>) = G_LSHR %val1, %cst0_splat 430d7834556SPetar Avramovic %copy_lshr1:_(<2 x s8>) = COPY %lshr1 431d7834556SPetar Avramovic )"; 432d7834556SPetar Avramovic 43342a84d22SDaniel Sanders setUp(MIRString); 434d7834556SPetar Avramovic if (!TM) 435d7834556SPetar Avramovic return; 436d7834556SPetar Avramovic 437d7834556SPetar Avramovic Register CopyReg0 = Copies[Copies.size() - 2]; 438d7834556SPetar Avramovic MachineInstr *FinalCopy0 = MRI->getVRegDef(CopyReg0); 439d7834556SPetar Avramovic Register SrcReg0 = FinalCopy0->getOperand(1).getReg(); 440d7834556SPetar Avramovic GISelKnownBits Info(*MF); 441d7834556SPetar Avramovic KnownBits Res0 = Info.getKnownBits(SrcReg0); 442d7834556SPetar Avramovic EXPECT_EQ(0x32u, Res0.One.getZExtValue()); 443d7834556SPetar Avramovic EXPECT_EQ(0xC4u, Res0.Zero.getZExtValue()); 444d7834556SPetar Avramovic 445d7834556SPetar Avramovic Register CopyReg1 = Copies[Copies.size() - 1]; 446d7834556SPetar Avramovic MachineInstr *FinalCopy1 = MRI->getVRegDef(CopyReg1); 447d7834556SPetar Avramovic Register SrcReg1 = FinalCopy1->getOperand(1).getReg(); 448d7834556SPetar Avramovic KnownBits Res1 = Info.getKnownBits(SrcReg1); 449d7834556SPetar Avramovic EXPECT_EQ(0x04u, Res1.One.getZExtValue()); 450d7834556SPetar Avramovic EXPECT_EQ(0xC8u, Res1.Zero.getZExtValue()); 451d7834556SPetar Avramovic } 452d7834556SPetar Avramovic 453d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorSHL) { 454d7834556SPetar Avramovic StringRef MIRString = R"( 455d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF 456fae05692SMatt Arsenault %unknown:_(<2 x s8>) = G_LOAD %ptr(p0) :: (load (<2 x s8>)) 457d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 51 458d7834556SPetar Avramovic %mask0_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask0, %mask0 459d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 72 460d7834556SPetar Avramovic %mask1_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask1, %mask1 461d7834556SPetar Avramovic %tmp:_(<2 x s8>) = G_AND %unknown, %mask0_splat 462d7834556SPetar Avramovic %val:_(<2 x s8>) = G_OR %tmp, %mask1_splat 463d7834556SPetar Avramovic %cst:_(s8) = G_CONSTANT i8 3 464d7834556SPetar Avramovic %cst_splat:_(<2 x s8>) = G_BUILD_VECTOR %cst, %cst 465d7834556SPetar Avramovic %shl:_(<2 x s8>) = G_SHL %val, %cst_splat 466d7834556SPetar Avramovic %copy_shl:_(<2 x s8>) = COPY %shl 467d7834556SPetar Avramovic )"; 468d7834556SPetar Avramovic 46942a84d22SDaniel Sanders setUp(MIRString); 470d7834556SPetar Avramovic if (!TM) 471d7834556SPetar Avramovic return; 472d7834556SPetar Avramovic 473d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1]; 474d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg); 475d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg(); 476d7834556SPetar Avramovic GISelKnownBits Info(*MF); 477d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg); 478d7834556SPetar Avramovic EXPECT_EQ(0x40u, Res.One.getZExtValue()); 479d7834556SPetar Avramovic EXPECT_EQ(0x27u, Res.Zero.getZExtValue()); 480d7834556SPetar Avramovic } 481d7834556SPetar Avramovic 482d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorADD) { 483d7834556SPetar Avramovic StringRef MIRString = R"( 484d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF 485fae05692SMatt Arsenault %unknown:_(<2 x s16>) = G_LOAD %ptr(p0) :: (load (<2 x s16>)) 486d7834556SPetar Avramovic %mask0:_(s16) = G_CONSTANT i16 4642 487d7834556SPetar Avramovic %mask0_splat:_(<2 x s16>) = G_BUILD_VECTOR %mask0, %mask0 488d7834556SPetar Avramovic %mask1:_(s16) = G_CONSTANT i16 9536 489d7834556SPetar Avramovic %mask1_splat:_(<2 x s16>) = G_BUILD_VECTOR %mask1, %mask1 490d7834556SPetar Avramovic %tmp0:_(<2 x s16>) = G_AND %unknown, %mask0_splat 491d7834556SPetar Avramovic %val0:_(<2 x s16>) = G_OR %tmp0, %mask1_splat 492d7834556SPetar Avramovic %mask2:_(s16) = G_CONSTANT i16 4096 493d7834556SPetar Avramovic %mask2_splat:_(<2 x s16>) = G_BUILD_VECTOR %mask2, %mask2 494d7834556SPetar Avramovic %mask3:_(s16) = G_CONSTANT i16 371 495d7834556SPetar Avramovic %mask3_splat:_(<2 x s16>) = G_BUILD_VECTOR %mask3, %mask3 496d7834556SPetar Avramovic %tmp1:_(<2 x s16>) = G_AND %unknown, %mask2_splat 497d7834556SPetar Avramovic %val1:_(<2 x s16>) = G_OR %tmp1, %mask3_splat 498d7834556SPetar Avramovic %add:_(<2 x s16>) = G_ADD %val0, %val1 499d7834556SPetar Avramovic %copy_add:_(<2 x s16>) = COPY %add 500d7834556SPetar Avramovic )"; 501d7834556SPetar Avramovic 50242a84d22SDaniel Sanders setUp(MIRString); 503d7834556SPetar Avramovic if (!TM) 504d7834556SPetar Avramovic return; 505d7834556SPetar Avramovic 506d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1]; 507d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg); 508d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg(); 509d7834556SPetar Avramovic GISelKnownBits Info(*MF); 510d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg); 511d7834556SPetar Avramovic EXPECT_EQ(0x0091u, Res.One.getZExtValue()); 512d7834556SPetar Avramovic EXPECT_EQ(0x8108u, Res.Zero.getZExtValue()); 513d7834556SPetar Avramovic } 514d7834556SPetar Avramovic 515d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorSUB) { 516d7834556SPetar Avramovic StringRef MIRString = R"( 517d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF 518fae05692SMatt Arsenault %unknown:_(<2 x s16>) = G_LOAD %ptr(p0) :: (load (<2 x s16>)) 519d7834556SPetar Avramovic %mask0:_(s16) = G_CONSTANT i16 4642 520d7834556SPetar Avramovic %mask0_splat:_(<2 x s16>) = G_BUILD_VECTOR %mask0, %mask0 521d7834556SPetar Avramovic %mask1:_(s16) = G_CONSTANT i16 9536 522d7834556SPetar Avramovic %mask1_splat:_(<2 x s16>) = G_BUILD_VECTOR %mask1, %mask1 523d7834556SPetar Avramovic %tmp0:_(<2 x s16>) = G_AND %unknown, %mask0_splat 524d7834556SPetar Avramovic %val0:_(<2 x s16>) = G_OR %tmp0, %mask1_splat 525d7834556SPetar Avramovic %mask2:_(s16) = G_CONSTANT i16 4096 526d7834556SPetar Avramovic %mask2_splat:_(<2 x s16>) = G_BUILD_VECTOR %mask2, %mask2 527d7834556SPetar Avramovic %mask3:_(s16) = G_CONSTANT i16 371 528d7834556SPetar Avramovic %mask3_splat:_(<2 x s16>) = G_BUILD_VECTOR %mask3, %mask3 529d7834556SPetar Avramovic %tmp1:_(<2 x s16>) = G_AND %unknown, %mask2_splat 530d7834556SPetar Avramovic %val1:_(<2 x s16>) = G_OR %tmp1, %mask3_splat 531d7834556SPetar Avramovic %sub:_(<2 x s16>) = G_SUB %val0, %val1 532d7834556SPetar Avramovic %copy_sub:_(<2 x s16>) = COPY %sub 533d7834556SPetar Avramovic )"; 534d7834556SPetar Avramovic 53542a84d22SDaniel Sanders setUp(MIRString); 536d7834556SPetar Avramovic if (!TM) 537d7834556SPetar Avramovic return; 538d7834556SPetar Avramovic 539d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1]; 540d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg); 541d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg(); 542d7834556SPetar Avramovic GISelKnownBits Info(*MF); 543d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg); 544d7834556SPetar Avramovic EXPECT_EQ(0x01CDu, Res.One.getZExtValue()); 545d7834556SPetar Avramovic EXPECT_EQ(0xC810u, Res.Zero.getZExtValue()); 546d7834556SPetar Avramovic } 547d7834556SPetar Avramovic 548d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorMUL) { 549d7834556SPetar Avramovic StringRef MIRString = R"( 550d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF 551fae05692SMatt Arsenault %unknown:_(<2 x s16>) = G_LOAD %ptr(p0) :: (load (<2 x s16>)) 552d7834556SPetar Avramovic %mask0:_(s16) = G_CONSTANT i16 4 553d7834556SPetar Avramovic %mask0_splat:_(<2 x s16>) = G_BUILD_VECTOR %mask0, %mask0 554d7834556SPetar Avramovic %mask1:_(s16) = G_CONSTANT i16 18 555d7834556SPetar Avramovic %mask1_splat:_(<2 x s16>) = G_BUILD_VECTOR %mask1, %mask1 556d7834556SPetar Avramovic %tmp:_(<2 x s16>) = G_AND %unknown, %mask0_splat 557d7834556SPetar Avramovic %val0:_(<2 x s16>) = G_OR %tmp, %mask1_splat 558d7834556SPetar Avramovic %cst:_(s16) = G_CONSTANT i16 12 559d7834556SPetar Avramovic %cst_splat:_(<2 x s16>) = G_BUILD_VECTOR %cst, %cst 560d7834556SPetar Avramovic %mul:_(<2 x s16>) = G_MUL %val0, %cst_splat 561d7834556SPetar Avramovic %copy_mul:_(<2 x s16>) = COPY %mul 562d7834556SPetar Avramovic )"; 563d7834556SPetar Avramovic 56442a84d22SDaniel Sanders setUp(MIRString); 565d7834556SPetar Avramovic if (!TM) 566d7834556SPetar Avramovic return; 567d7834556SPetar Avramovic 568d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1]; 569d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg); 570d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg(); 571d7834556SPetar Avramovic GISelKnownBits Info(*MF); 572d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg); 573d7834556SPetar Avramovic EXPECT_EQ(0x0008u, Res.One.getZExtValue()); 574d7834556SPetar Avramovic EXPECT_EQ(0xFE07u, Res.Zero.getZExtValue()); 575d7834556SPetar Avramovic } 576d7834556SPetar Avramovic 577d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorSelect) { 578d7834556SPetar Avramovic StringRef MIRString = R"( 579d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF 580fae05692SMatt Arsenault %unknown:_(<2 x s8>) = G_LOAD %ptr(p0) :: (load (<2 x s8>)) 581d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 24 582d7834556SPetar Avramovic %mask0_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask0, %mask0 583d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 224 584d7834556SPetar Avramovic %mask1_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask1, %mask1 585d7834556SPetar Avramovic %tmp0:_(<2 x s8>) = G_AND %unknown, %mask0_splat 586d7834556SPetar Avramovic %val0:_(<2 x s8>) = G_OR %tmp0, %mask1_splat 587d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 146 588d7834556SPetar Avramovic %mask2_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask2, %mask2 589d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 36 590d7834556SPetar Avramovic %mask3_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask3, %mask3 591d7834556SPetar Avramovic %tmp1:_(<2 x s8>) = G_AND %unknown, %mask2_splat 592d7834556SPetar Avramovic %val1:_(<2 x s8>) = G_OR %tmp1, %mask3_splat 593d7834556SPetar Avramovic %cond:_(s1) = G_CONSTANT i1 false 594d7834556SPetar Avramovic %cond_splat:_(<2 x s1>) = G_BUILD_VECTOR %cond, %cond 595d7834556SPetar Avramovic %select:_(<2 x s8>) = G_SELECT %cond_splat, %val0, %val1 596d7834556SPetar Avramovic %copy_select:_(<2 x s8>) = COPY %select 597d7834556SPetar Avramovic )"; 598d7834556SPetar Avramovic 59942a84d22SDaniel Sanders setUp(MIRString); 600d7834556SPetar Avramovic if (!TM) 601d7834556SPetar Avramovic return; 602d7834556SPetar Avramovic 603d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1]; 604d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg); 605d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg(); 606d7834556SPetar Avramovic GISelKnownBits Info(*MF); 607d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg); 608d7834556SPetar Avramovic EXPECT_EQ(0x20u, Res.One.getZExtValue()); 609d7834556SPetar Avramovic EXPECT_EQ(0x01u, Res.Zero.getZExtValue()); 610d7834556SPetar Avramovic } 611d7834556SPetar Avramovic 612d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestVectorSignBitIsZero) { 61342a84d22SDaniel Sanders setUp(); 614d7834556SPetar Avramovic if (!TM) 615d7834556SPetar Avramovic return; 616d7834556SPetar Avramovic 617d5e14ba8SSander de Smalen const LLT V2S32 = LLT::fixed_vector(2, 32); 618d7834556SPetar Avramovic // Vector buildConstant makes splat G_BUILD_VECTOR instruction. 619d7834556SPetar Avramovic auto SignBit = B.buildConstant(V2S32, 0x80000000); 620d7834556SPetar Avramovic auto Zero = B.buildConstant(V2S32, 0); 621d7834556SPetar Avramovic 622d7834556SPetar Avramovic const LLT S32 = LLT::scalar(32); 623d7834556SPetar Avramovic auto NonSplat = 624d7834556SPetar Avramovic B.buildBuildVector(V2S32, {B.buildConstant(S32, 1).getReg(0), 625d7834556SPetar Avramovic B.buildConstant(S32, 2).getReg(0)}); 626d7834556SPetar Avramovic auto NonSplat2 = 627d7834556SPetar Avramovic B.buildBuildVector(V2S32, {B.buildConstant(S32, 0x80000000).getReg(0), 628d7834556SPetar Avramovic B.buildConstant(S32, 0x80000004).getReg(0)}); 629d7834556SPetar Avramovic // signBitIsZero is true for elt 0 and false for elt 1 GISelKnownBits takes 630d7834556SPetar Avramovic // common bits so this is false. 631d7834556SPetar Avramovic auto NonSplat3 = 632d7834556SPetar Avramovic B.buildBuildVector(V2S32, {B.buildConstant(S32, 0x80000000).getReg(0), 633d7834556SPetar Avramovic B.buildConstant(S32, 0x8).getReg(0)}); 634d7834556SPetar Avramovic GISelKnownBits KnownBits(*MF); 635d7834556SPetar Avramovic 636d7834556SPetar Avramovic EXPECT_TRUE(KnownBits.signBitIsZero(Zero.getReg(0))); 637d7834556SPetar Avramovic EXPECT_FALSE(KnownBits.signBitIsZero(SignBit.getReg(0))); 638d7834556SPetar Avramovic EXPECT_TRUE(KnownBits.signBitIsZero(NonSplat.getReg(0))); 639d7834556SPetar Avramovic EXPECT_FALSE(KnownBits.signBitIsZero(NonSplat2.getReg(0))); 640d7834556SPetar Avramovic EXPECT_FALSE(KnownBits.signBitIsZero(NonSplat3.getReg(0))); 641d7834556SPetar Avramovic } 642d7834556SPetar Avramovic 643d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestVectorNumSignBitsConstant) { 644d7834556SPetar Avramovic StringRef MIRString = R"( 645d7834556SPetar Avramovic %3:_(s8) = G_CONSTANT i8 1 646d7834556SPetar Avramovic %4:_(<2 x s8>) = G_BUILD_VECTOR %3:_(s8), %3:_(s8) 647d7834556SPetar Avramovic %5:_(<2 x s8>) = COPY %4 648d7834556SPetar Avramovic 649d7834556SPetar Avramovic %6:_(s8) = G_CONSTANT i8 -1 650d7834556SPetar Avramovic %7:_(<2 x s8>) = G_BUILD_VECTOR %6:_(s8), %6:_(s8) 651d7834556SPetar Avramovic %8:_(<2 x s8>) = COPY %7 652d7834556SPetar Avramovic 653d7834556SPetar Avramovic %9:_(s8) = G_CONSTANT i8 127 654d7834556SPetar Avramovic %10:_(<2 x s8>) = G_BUILD_VECTOR %9:_(s8), %9:_(s8) 655d7834556SPetar Avramovic %11:_(<2 x s8>) = COPY %10 656d7834556SPetar Avramovic 657d7834556SPetar Avramovic %12:_(s8) = G_CONSTANT i8 32 658d7834556SPetar Avramovic %13:_(<2 x s8>) = G_BUILD_VECTOR %12:_(s8), %12:_(s8) 659d7834556SPetar Avramovic %14:_(<2 x s8>) = COPY %13 660d7834556SPetar Avramovic 661d7834556SPetar Avramovic %15:_(s8) = G_CONSTANT i8 -32 662d7834556SPetar Avramovic %16:_(<2 x s8>) = G_BUILD_VECTOR %15:_(s8), %15:_(s8) 663d7834556SPetar Avramovic %17:_(<2 x s8>) = COPY %16 664d7834556SPetar Avramovic 665d7834556SPetar Avramovic %18:_(<2 x s8>) = G_BUILD_VECTOR %6:_(s8), %15:_(s8) 666d7834556SPetar Avramovic %19:_(<2 x s8>) = COPY %18 667d7834556SPetar Avramovic 668d7834556SPetar Avramovic %20:_(<2 x s8>) = G_BUILD_VECTOR %12:_(s8), %15:_(s8) 669d7834556SPetar Avramovic %21:_(<2 x s8>) = COPY %20 670d7834556SPetar Avramovic )"; 671d7834556SPetar Avramovic 67242a84d22SDaniel Sanders setUp(MIRString); 673d7834556SPetar Avramovic if (!TM) 674d7834556SPetar Avramovic return; 675d7834556SPetar Avramovic 676d7834556SPetar Avramovic Register CopyReg1 = Copies[Copies.size() - 7]; 677d7834556SPetar Avramovic Register CopyRegNeg1 = Copies[Copies.size() - 6]; 678d7834556SPetar Avramovic Register CopyReg127 = Copies[Copies.size() - 5]; 679d7834556SPetar Avramovic Register CopyReg32 = Copies[Copies.size() - 4]; 680d7834556SPetar Avramovic Register CopyRegNeg32 = Copies[Copies.size() - 3]; 681d7834556SPetar Avramovic Register NonSplatSameSign = Copies[Copies.size() - 2]; 682d7834556SPetar Avramovic Register NonSplatDifferentSign = Copies[Copies.size() - 1]; 683d7834556SPetar Avramovic 684d7834556SPetar Avramovic GISelKnownBits Info(*MF); 685d7834556SPetar Avramovic // If it is known that all elts have same sign looks at common bits and 686d7834556SPetar Avramovic // effectively returns smallest NumSignBits of all the elts. Otherwise returns 687d7834556SPetar Avramovic // default value 1. 688d7834556SPetar Avramovic EXPECT_EQ(7u, Info.computeNumSignBits(CopyReg1)); 689d7834556SPetar Avramovic EXPECT_EQ(8u, Info.computeNumSignBits(CopyRegNeg1)); 690d7834556SPetar Avramovic EXPECT_EQ(1u, Info.computeNumSignBits(CopyReg127)); 691d7834556SPetar Avramovic EXPECT_EQ(2u, Info.computeNumSignBits(CopyReg32)); 692d7834556SPetar Avramovic EXPECT_EQ(3u, Info.computeNumSignBits(CopyRegNeg32)); 693d7834556SPetar Avramovic EXPECT_EQ(3u, Info.computeNumSignBits(NonSplatSameSign)); 694d7834556SPetar Avramovic EXPECT_EQ(1u, Info.computeNumSignBits(NonSplatDifferentSign)); 695d7834556SPetar Avramovic } 696d7834556SPetar Avramovic 697d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestVectorNumSignBitsSext) { 698d7834556SPetar Avramovic StringRef MIRString = R"( 699d7834556SPetar Avramovic %3:_(p0) = G_IMPLICIT_DEF 700fae05692SMatt Arsenault %4:_(<2 x s8>) = G_LOAD %3 :: (load (<2 x s8>)) 701d7834556SPetar Avramovic %5:_(<2 x s32>) = G_SEXT %4 702d7834556SPetar Avramovic %6:_(<2 x s32>) = COPY %5 703d7834556SPetar Avramovic 704d7834556SPetar Avramovic %7:_(s8) = G_CONSTANT i8 -1 705d7834556SPetar Avramovic %8:_(<2 x s8>) = G_BUILD_VECTOR %7:_(s8), %7:_(s8) 706d7834556SPetar Avramovic %9:_(<2 x s32>) = G_SEXT %8 707d7834556SPetar Avramovic %10:_(<2 x s32>) = COPY %9 708d7834556SPetar Avramovic 709d7834556SPetar Avramovic %11:_(s8) = G_CONSTANT i8 -10 710d7834556SPetar Avramovic %12:_(<2 x s8>) = G_BUILD_VECTOR %7:_(s8), %11:_(s8) 711d7834556SPetar Avramovic %13:_(<2 x s32>) = G_SEXT %12 712d7834556SPetar Avramovic %14:_(<2 x s32>) = COPY %13 713d7834556SPetar Avramovic )"; 714d7834556SPetar Avramovic 71542a84d22SDaniel Sanders setUp(MIRString); 716d7834556SPetar Avramovic if (!TM) 717d7834556SPetar Avramovic return; 718d7834556SPetar Avramovic Register CopySextLoad = Copies[Copies.size() - 3]; 719d7834556SPetar Avramovic Register CopySextNeg1 = Copies[Copies.size() - 2]; 720d7834556SPetar Avramovic Register CopySextNonSplat = Copies[Copies.size() - 1]; 721d7834556SPetar Avramovic 722d7834556SPetar Avramovic GISelKnownBits Info(*MF); 723d7834556SPetar Avramovic EXPECT_EQ(25u, Info.computeNumSignBits(CopySextLoad)); 724d7834556SPetar Avramovic EXPECT_EQ(32u, Info.computeNumSignBits(CopySextNeg1)); 725d7834556SPetar Avramovic EXPECT_EQ(28u, Info.computeNumSignBits(CopySextNonSplat)); 726d7834556SPetar Avramovic } 727d7834556SPetar Avramovic 728d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestVectorNumSignBitsSextInReg) { 729d7834556SPetar Avramovic StringRef MIRString = R"( 730d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF 731fae05692SMatt Arsenault %load2x4:_(<2 x s32>) = G_LOAD %ptr :: (load (<2 x s32>)) 732d7834556SPetar Avramovic 733d7834556SPetar Avramovic %inreg7:_(<2 x s32>) = G_SEXT_INREG %load2x4, 7 734d7834556SPetar Avramovic %copy_inreg7:_(<2 x s32>) = COPY %inreg7 735d7834556SPetar Avramovic 736d7834556SPetar Avramovic %inreg8:_(<2 x s32>) = G_SEXT_INREG %load2x4, 8 737d7834556SPetar Avramovic %copy_inreg8:_(<2 x s32>) = COPY %inreg8 738d7834556SPetar Avramovic 739d7834556SPetar Avramovic %inreg9:_(<2 x s32>) = G_SEXT_INREG %load2x4, 9 740d7834556SPetar Avramovic %copy_inreg9:_(<2 x s32>) = COPY %inreg9 741d7834556SPetar Avramovic 742d7834556SPetar Avramovic %inreg31:_(<2 x s32>) = G_SEXT_INREG %load2x4, 31 743d7834556SPetar Avramovic %copy_inreg31:_(<2 x s32>) = COPY %inreg31 744d7834556SPetar Avramovic 745fae05692SMatt Arsenault %load2x1:_(<2 x s8>) = G_LOAD %ptr :: (load (<2 x s8>)) 746d7834556SPetar Avramovic %sext_load2x1:_(<2 x s32>) = G_SEXT %load2x1 747d7834556SPetar Avramovic 748d7834556SPetar Avramovic %inreg6_sext:_(<2 x s32>) = G_SEXT_INREG %sext_load2x1, 6 749d7834556SPetar Avramovic %copy_inreg6_sext:_(<2 x s32>) = COPY %inreg6_sext 750d7834556SPetar Avramovic 751d7834556SPetar Avramovic %inreg7_sext:_(<2 x s32>) = G_SEXT_INREG %sext_load2x1, 7 752d7834556SPetar Avramovic %copy_inreg7_sext:_(<2 x s32>) = COPY %inreg7_sext 753d7834556SPetar Avramovic 754d7834556SPetar Avramovic %inreg8_sext:_(<2 x s32>) = G_SEXT_INREG %sext_load2x1, 8 755d7834556SPetar Avramovic %copy_inreg8_sext:_(<2 x s32>) = COPY %inreg8_sext 756d7834556SPetar Avramovic 757d7834556SPetar Avramovic %inreg9_sext:_(<2 x s32>) = G_SEXT_INREG %sext_load2x1, 9 758d7834556SPetar Avramovic %copy_inreg9_sext:_(<2 x s32>) = COPY %inreg9_sext 759d7834556SPetar Avramovic 760d7834556SPetar Avramovic %inreg31_sext:_(<2 x s32>) = G_SEXT_INREG %sext_load2x1, 31 761d7834556SPetar Avramovic %copy_inreg31_sext:_(<2 x s32>) = COPY %inreg31_sext 762d7834556SPetar Avramovic )"; 763d7834556SPetar Avramovic 76442a84d22SDaniel Sanders setUp(MIRString); 765d7834556SPetar Avramovic if (!TM) 766d7834556SPetar Avramovic return; 767d7834556SPetar Avramovic 768d7834556SPetar Avramovic Register CopyInReg7 = Copies[Copies.size() - 9]; 769d7834556SPetar Avramovic Register CopyInReg8 = Copies[Copies.size() - 8]; 770d7834556SPetar Avramovic Register CopyInReg9 = Copies[Copies.size() - 7]; 771d7834556SPetar Avramovic Register CopyInReg31 = Copies[Copies.size() - 6]; 772d7834556SPetar Avramovic 773d7834556SPetar Avramovic Register CopyInReg6Sext = Copies[Copies.size() - 5]; 774d7834556SPetar Avramovic Register CopyInReg7Sext = Copies[Copies.size() - 4]; 775d7834556SPetar Avramovic Register CopyInReg8Sext = Copies[Copies.size() - 3]; 776d7834556SPetar Avramovic Register CopyInReg9Sext = Copies[Copies.size() - 2]; 777d7834556SPetar Avramovic Register CopyInReg31Sext = Copies[Copies.size() - 1]; 778d7834556SPetar Avramovic 779d7834556SPetar Avramovic GISelKnownBits Info(*MF); 780d7834556SPetar Avramovic EXPECT_EQ(26u, Info.computeNumSignBits(CopyInReg7)); 781d7834556SPetar Avramovic EXPECT_EQ(25u, Info.computeNumSignBits(CopyInReg8)); 782d7834556SPetar Avramovic EXPECT_EQ(24u, Info.computeNumSignBits(CopyInReg9)); 783d7834556SPetar Avramovic EXPECT_EQ(2u, Info.computeNumSignBits(CopyInReg31)); 784d7834556SPetar Avramovic 785d7834556SPetar Avramovic EXPECT_EQ(27u, Info.computeNumSignBits(CopyInReg6Sext)); 786d7834556SPetar Avramovic EXPECT_EQ(26u, Info.computeNumSignBits(CopyInReg7Sext)); 787d7834556SPetar Avramovic EXPECT_EQ(25u, Info.computeNumSignBits(CopyInReg8Sext)); 788d7834556SPetar Avramovic EXPECT_EQ(25u, Info.computeNumSignBits(CopyInReg9Sext)); 789d7834556SPetar Avramovic EXPECT_EQ(25u, Info.computeNumSignBits(CopyInReg31Sext)); 790d7834556SPetar Avramovic } 791d7834556SPetar Avramovic 792d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestNumSignBitsVectorAssertSext) { 793d7834556SPetar Avramovic StringRef MIRString = R"( 794d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF 795fae05692SMatt Arsenault %load2x4:_(<2 x s32>) = G_LOAD %ptr :: (load (<2 x s32>)) 796d7834556SPetar Avramovic 797d7834556SPetar Avramovic %assert_sext1:_(<2 x s32>) = G_ASSERT_SEXT %load2x4, 1 798d7834556SPetar Avramovic %copy_assert_sext1:_(<2 x s32>) = COPY %assert_sext1 799d7834556SPetar Avramovic 800d7834556SPetar Avramovic %assert_sext7:_(<2 x s32>) = G_ASSERT_SEXT %load2x4, 7 801d7834556SPetar Avramovic %copy_assert_sext7:_(<2 x s32>) = COPY %assert_sext7 802d7834556SPetar Avramovic 803d7834556SPetar Avramovic %assert_sext8:_(<2 x s32>) = G_ASSERT_SEXT %load2x4, 8 804d7834556SPetar Avramovic %copy_assert_sext8:_(<2 x s32>) = COPY %assert_sext8 805d7834556SPetar Avramovic 806d7834556SPetar Avramovic %assert_sext9:_(<2 x s32>) = G_ASSERT_SEXT %load2x4, 9 807d7834556SPetar Avramovic %copy_assert_sext9:_(<2 x s32>) = COPY %assert_sext9 808d7834556SPetar Avramovic 809d7834556SPetar Avramovic %assert_sext31:_(<2 x s32>) = G_ASSERT_SEXT %load2x4, 31 810d7834556SPetar Avramovic %copy_assert_sext31:_(<2 x s32>) = COPY %assert_sext31 811d7834556SPetar Avramovic 812fae05692SMatt Arsenault %load2x1:_(<2 x s8>) = G_LOAD %ptr :: (load (<2 x s8>)) 813d7834556SPetar Avramovic %sext_load2x1:_(<2 x s32>) = G_SEXT %load2x1 814d7834556SPetar Avramovic 815d7834556SPetar Avramovic %assert_sext6_sext:_(<2 x s32>) = G_ASSERT_SEXT %sext_load2x1, 6 816d7834556SPetar Avramovic %copy_assert_sext6_sext:_(<2 x s32>) = COPY %assert_sext6_sext 817d7834556SPetar Avramovic 818d7834556SPetar Avramovic %assert_sext7_sext:_(<2 x s32>) = G_ASSERT_SEXT %sext_load2x1, 7 819d7834556SPetar Avramovic %copy_assert_sext7_sext:_(<2 x s32>) = COPY %assert_sext7_sext 820d7834556SPetar Avramovic 821d7834556SPetar Avramovic %assert_sext8_sext:_(<2 x s32>) = G_ASSERT_SEXT %sext_load2x1, 8 822d7834556SPetar Avramovic %copy_assert_sext8_sext:_(<2 x s32>) = COPY %assert_sext8_sext 823d7834556SPetar Avramovic 824d7834556SPetar Avramovic %assert_sext9_sext:_(<2 x s32>) = G_ASSERT_SEXT %sext_load2x1, 9 825d7834556SPetar Avramovic %copy_assert_sext9_sext:_(<2 x s32>) = COPY %assert_sext9_sext 826d7834556SPetar Avramovic 827d7834556SPetar Avramovic %assert_sext31_sext:_(<2 x s32>) = G_ASSERT_SEXT %sext_load2x1, 31 828d7834556SPetar Avramovic %copy_assert_sext31_sext:_(<2 x s32>) = COPY %assert_sext31_sext 829d7834556SPetar Avramovic )"; 830d7834556SPetar Avramovic 83142a84d22SDaniel Sanders setUp(MIRString); 832d7834556SPetar Avramovic if (!TM) 833d7834556SPetar Avramovic return; 834d7834556SPetar Avramovic 835d7834556SPetar Avramovic Register CopyInReg1 = Copies[Copies.size() - 10]; 836d7834556SPetar Avramovic Register CopyInReg7 = Copies[Copies.size() - 9]; 837d7834556SPetar Avramovic Register CopyInReg8 = Copies[Copies.size() - 8]; 838d7834556SPetar Avramovic Register CopyInReg9 = Copies[Copies.size() - 7]; 839d7834556SPetar Avramovic Register CopyInReg31 = Copies[Copies.size() - 6]; 840d7834556SPetar Avramovic 841d7834556SPetar Avramovic Register CopyInReg6Sext = Copies[Copies.size() - 5]; 842d7834556SPetar Avramovic Register CopyInReg7Sext = Copies[Copies.size() - 4]; 843d7834556SPetar Avramovic Register CopyInReg8Sext = Copies[Copies.size() - 3]; 844d7834556SPetar Avramovic Register CopyInReg9Sext = Copies[Copies.size() - 2]; 845d7834556SPetar Avramovic Register CopyInReg31Sext = Copies[Copies.size() - 1]; 846d7834556SPetar Avramovic 847d7834556SPetar Avramovic GISelKnownBits Info(*MF); 848d7834556SPetar Avramovic EXPECT_EQ(32u, Info.computeNumSignBits(CopyInReg1)); 849d7834556SPetar Avramovic EXPECT_EQ(26u, Info.computeNumSignBits(CopyInReg7)); 850d7834556SPetar Avramovic EXPECT_EQ(25u, Info.computeNumSignBits(CopyInReg8)); 851d7834556SPetar Avramovic EXPECT_EQ(24u, Info.computeNumSignBits(CopyInReg9)); 852d7834556SPetar Avramovic EXPECT_EQ(2u, Info.computeNumSignBits(CopyInReg31)); 853d7834556SPetar Avramovic 854d7834556SPetar Avramovic EXPECT_EQ(27u, Info.computeNumSignBits(CopyInReg6Sext)); 855d7834556SPetar Avramovic EXPECT_EQ(26u, Info.computeNumSignBits(CopyInReg7Sext)); 856d7834556SPetar Avramovic EXPECT_EQ(25u, Info.computeNumSignBits(CopyInReg8Sext)); 857d7834556SPetar Avramovic EXPECT_EQ(25u, Info.computeNumSignBits(CopyInReg9Sext)); 858d7834556SPetar Avramovic EXPECT_EQ(25u, Info.computeNumSignBits(CopyInReg31Sext)); 859d7834556SPetar Avramovic } 860d7834556SPetar Avramovic 861d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestVectorNumSignBitsTrunc) { 862d7834556SPetar Avramovic StringRef MIRString = R"( 863d7834556SPetar Avramovic %3:_(p0) = G_IMPLICIT_DEF 864fae05692SMatt Arsenault %4:_(<2 x s32>) = G_LOAD %3 :: (load (<2 x s32>)) 865d7834556SPetar Avramovic %5:_(<2 x s8>) = G_TRUNC %4 866d7834556SPetar Avramovic %6:_(<2 x s8>) = COPY %5 867d7834556SPetar Avramovic 868d7834556SPetar Avramovic %7:_(s32) = G_CONSTANT i32 -1 869d7834556SPetar Avramovic %8:_(<2 x s32>) = G_BUILD_VECTOR %7:_(s32), %7:_(s32) 870d7834556SPetar Avramovic %9:_(<2 x s8>) = G_TRUNC %8 871d7834556SPetar Avramovic %10:_(<2 x s8>) = COPY %9 872d7834556SPetar Avramovic 873d7834556SPetar Avramovic %11:_(s32) = G_CONSTANT i32 7 874d7834556SPetar Avramovic %12:_(<2 x s32>) = G_BUILD_VECTOR %11:_(s32), %11:_(s32) 875d7834556SPetar Avramovic %13:_(<2 x s8>) = G_TRUNC %12 876d7834556SPetar Avramovic %14:_(<2 x s8>) = COPY %13 877d7834556SPetar Avramovic )"; 878d7834556SPetar Avramovic 87942a84d22SDaniel Sanders setUp(MIRString); 880d7834556SPetar Avramovic if (!TM) 881d7834556SPetar Avramovic return; 882d7834556SPetar Avramovic 883d7834556SPetar Avramovic Register CopyTruncLoad = Copies[Copies.size() - 3]; 884d7834556SPetar Avramovic Register CopyTruncNeg1 = Copies[Copies.size() - 2]; 885d7834556SPetar Avramovic Register CopyTrunc7 = Copies[Copies.size() - 1]; 886d7834556SPetar Avramovic 887d7834556SPetar Avramovic GISelKnownBits Info(*MF); 888d7834556SPetar Avramovic EXPECT_EQ(1u, Info.computeNumSignBits(CopyTruncLoad)); 889d7834556SPetar Avramovic EXPECT_EQ(8u, Info.computeNumSignBits(CopyTruncNeg1)); 890d7834556SPetar Avramovic EXPECT_EQ(5u, Info.computeNumSignBits(CopyTrunc7)); 891d7834556SPetar Avramovic } 892d7834556SPetar Avramovic 893d7834556SPetar Avramovic TEST_F(AMDGPUGISelMITest, TestVectorIsKnownToBeAPowerOfTwo) { 894d7834556SPetar Avramovic 895d7834556SPetar Avramovic StringRef MIRString = R"( 896d7834556SPetar Avramovic %zero:_(s32) = G_CONSTANT i32 0 897d7834556SPetar Avramovic %zero_splat:_(<2 x s32>) = G_BUILD_VECTOR %zero:_(s32), %zero:_(s32) 898d7834556SPetar Avramovic %one:_(s32) = G_CONSTANT i32 1 899d7834556SPetar Avramovic %one_splat:_(<2 x s32>) = G_BUILD_VECTOR %one:_(s32), %one:_(s32) 900d7834556SPetar Avramovic %two:_(s32) = G_CONSTANT i32 2 901d7834556SPetar Avramovic %two_splat:_(<2 x s32>) = G_BUILD_VECTOR %two:_(s32), %two:_(s32) 902d7834556SPetar Avramovic %three:_(s32) = G_CONSTANT i32 3 903d7834556SPetar Avramovic %three_splat:_(<2 x s32>) = G_BUILD_VECTOR %three:_(s32), %three:_(s32) 904d7834556SPetar Avramovic %five:_(s32) = G_CONSTANT i32 5 905d7834556SPetar Avramovic %five_splat:_(<2 x s32>) = G_BUILD_VECTOR %five:_(s32), %five:_(s32) 906d7834556SPetar Avramovic %copy_zero_splat:_(<2 x s32>) = COPY %zero_splat 907d7834556SPetar Avramovic %copy_one_splat:_(<2 x s32>) = COPY %one_splat 908d7834556SPetar Avramovic %copy_two_splat:_(<2 x s32>) = COPY %two_splat 909d7834556SPetar Avramovic %copy_three_splat:_(<2 x s32>) = COPY %three_splat 910d7834556SPetar Avramovic 911d7834556SPetar Avramovic %trunc_two_splat:_(<2 x s1>) = G_TRUNC %two_splat 912d7834556SPetar Avramovic %trunc_three_splat:_(<2 x s1>) = G_TRUNC %three_splat 913d7834556SPetar Avramovic %trunc_five_splat:_(<2 x s1>) = G_TRUNC %five_splat 914d7834556SPetar Avramovic 915d7834556SPetar Avramovic %copy_trunc_two_splat:_(<2 x s1>) = COPY %trunc_two_splat 916d7834556SPetar Avramovic %copy_trunc_three_splat:_(<2 x s1>) = COPY %trunc_three_splat 917d7834556SPetar Avramovic %copy_trunc_five_splat:_(<2 x s1>) = COPY %trunc_five_splat 918d7834556SPetar Avramovic 919d7834556SPetar Avramovic %ptr:_(p1) = G_IMPLICIT_DEF 920fae05692SMatt Arsenault %shift_amt:_(<2 x s32>) = G_LOAD %ptr :: (load (<2 x s32>), addrspace 1) 921d7834556SPetar Avramovic 922d7834556SPetar Avramovic %shl_1:_(<2 x s32>) = G_SHL %one_splat, %shift_amt 923d7834556SPetar Avramovic %copy_shl_1:_(<2 x s32>) = COPY %shl_1 924d7834556SPetar Avramovic 925d7834556SPetar Avramovic %shl_2:_(<2 x s32>) = G_SHL %two_splat, %shift_amt 926d7834556SPetar Avramovic %copy_shl_2:_(<2 x s32>) = COPY %shl_2 927d7834556SPetar Avramovic 928fae05692SMatt Arsenault %not_sign_mask:_(<2 x s32>) = G_LOAD %ptr :: (load (<2 x s32>), addrspace 1) 929d7834556SPetar Avramovic %sign_mask:_(s32) = G_CONSTANT i32 -2147483648 930d7834556SPetar Avramovic %sign_mask_splat:_(<2 x s32>) = G_BUILD_VECTOR %sign_mask:_(s32), %sign_mask:_(s32) 931d7834556SPetar Avramovic 932d7834556SPetar Avramovic %lshr_not_sign_mask:_(<2 x s32>) = G_LSHR %not_sign_mask, %shift_amt 933d7834556SPetar Avramovic %copy_lshr_not_sign_mask:_(<2 x s32>) = COPY %lshr_not_sign_mask 934d7834556SPetar Avramovic 935d7834556SPetar Avramovic %lshr_sign_mask:_(<2 x s32>) = G_LSHR %sign_mask_splat, %shift_amt 936d7834556SPetar Avramovic %copy_lshr_sign_mask:_(<2 x s32>) = COPY %lshr_sign_mask 937d7834556SPetar Avramovic 938d7834556SPetar Avramovic %or_pow2:_(<2 x s32>) = G_OR %zero_splat, %two_splat 939d7834556SPetar Avramovic %copy_or_pow2:_(<2 x s32>) = COPY %or_pow2 940d7834556SPetar Avramovic )"; 941d7834556SPetar Avramovic 94242a84d22SDaniel Sanders setUp(MIRString); 943d7834556SPetar Avramovic if (!TM) 944d7834556SPetar Avramovic return; 945d7834556SPetar Avramovic 946d7834556SPetar Avramovic GISelKnownBits KB(*MF); 947d7834556SPetar Avramovic 948d7834556SPetar Avramovic Register CopyZero = Copies[Copies.size() - 12]; 949d7834556SPetar Avramovic Register CopyOne = Copies[Copies.size() - 11]; 950d7834556SPetar Avramovic Register CopyTwo = Copies[Copies.size() - 10]; 951d7834556SPetar Avramovic Register CopyThree = Copies[Copies.size() - 9]; 952d7834556SPetar Avramovic Register CopyTruncTwo = Copies[Copies.size() - 8]; 953d7834556SPetar Avramovic Register CopyTruncThree = Copies[Copies.size() - 7]; 954d7834556SPetar Avramovic Register CopyTruncFive = Copies[Copies.size() - 6]; 955d7834556SPetar Avramovic 956d7834556SPetar Avramovic Register CopyShl1 = Copies[Copies.size() - 5]; 957d7834556SPetar Avramovic Register CopyShl2 = Copies[Copies.size() - 4]; 958d7834556SPetar Avramovic 959d7834556SPetar Avramovic Register CopyLShrNotSignMask = Copies[Copies.size() - 3]; 960d7834556SPetar Avramovic Register CopyLShrSignMask = Copies[Copies.size() - 2]; 961d7834556SPetar Avramovic Register CopyOrPow2 = Copies[Copies.size() - 1]; 962d7834556SPetar Avramovic 963d7834556SPetar Avramovic EXPECT_FALSE(isKnownToBeAPowerOfTwo(CopyZero, *MRI, &KB)); 964d7834556SPetar Avramovic EXPECT_TRUE(isKnownToBeAPowerOfTwo(CopyOne, *MRI, &KB)); 965d7834556SPetar Avramovic EXPECT_TRUE(isKnownToBeAPowerOfTwo(CopyTwo, *MRI, &KB)); 966d7834556SPetar Avramovic EXPECT_FALSE(isKnownToBeAPowerOfTwo(CopyThree, *MRI, &KB)); 967d7834556SPetar Avramovic 968d7834556SPetar Avramovic EXPECT_FALSE(isKnownToBeAPowerOfTwo(CopyTruncTwo, *MRI, &KB)); 969d7834556SPetar Avramovic EXPECT_TRUE(isKnownToBeAPowerOfTwo(CopyTruncThree, *MRI, &KB)); 970d7834556SPetar Avramovic EXPECT_TRUE(isKnownToBeAPowerOfTwo(CopyTruncFive, *MRI, &KB)); 971d7834556SPetar Avramovic // TODO: check for vector(splat) shift amount. 972d7834556SPetar Avramovic EXPECT_FALSE(isKnownToBeAPowerOfTwo(CopyShl1, *MRI, &KB)); 973d7834556SPetar Avramovic EXPECT_FALSE(isKnownToBeAPowerOfTwo(CopyShl2, *MRI, &KB)); 974d7834556SPetar Avramovic 975d7834556SPetar Avramovic EXPECT_FALSE(isKnownToBeAPowerOfTwo(CopyLShrNotSignMask, *MRI, &KB)); 976d7834556SPetar Avramovic EXPECT_FALSE(isKnownToBeAPowerOfTwo(CopyLShrSignMask, *MRI, &KB)); 977d7834556SPetar Avramovic EXPECT_TRUE(isKnownToBeAPowerOfTwo(CopyOrPow2, *MRI, &KB)); 978d7834556SPetar Avramovic } 979d7834556SPetar Avramovic 980d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestVectorMetadata) { 981d7834556SPetar Avramovic StringRef MIRString = R"( 982d7834556SPetar Avramovic %imp:_(p0) = G_IMPLICIT_DEF 983fae05692SMatt Arsenault %load:_(<2 x s8>) = G_LOAD %imp(p0) :: (load (<2 x s8>)) 984d7834556SPetar Avramovic %ext:_(<2 x s32>) = G_ZEXT %load(<2 x s8>) 985d7834556SPetar Avramovic %cst_elt:_(s32) = G_CONSTANT i32 1 986d7834556SPetar Avramovic %cst:_(<2 x s32>) = G_BUILD_VECTOR %cst_elt:_(s32), %cst_elt:_(s32) 987d7834556SPetar Avramovic %and:_(<2 x s32>) = G_AND %ext, %cst 988d7834556SPetar Avramovic %copy:_(<2 x s32>) = COPY %and(<2 x s32>) 989d7834556SPetar Avramovic )"; 990d7834556SPetar Avramovic 99142a84d22SDaniel Sanders setUp(MIRString); 992d7834556SPetar Avramovic if (!TM) 993d7834556SPetar Avramovic return; 994d7834556SPetar Avramovic 995d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1]; 996d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg); 997d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg(); 998d7834556SPetar Avramovic 999d7834556SPetar Avramovic MachineInstr *And = MRI->getVRegDef(SrcReg); 1000d7834556SPetar Avramovic MachineInstr *Ext = MRI->getVRegDef(And->getOperand(1).getReg()); 1001d7834556SPetar Avramovic MachineInstr *Load = MRI->getVRegDef(Ext->getOperand(1).getReg()); 1002d7834556SPetar Avramovic IntegerType *Int8Ty = Type::getInt8Ty(Context); 1003d7834556SPetar Avramovic 1004d7834556SPetar Avramovic Metadata *LowAndHigh[] = { 1005d7834556SPetar Avramovic ConstantAsMetadata::get(ConstantInt::get(Int8Ty, 0)), 1006d7834556SPetar Avramovic ConstantAsMetadata::get(ConstantInt::get(Int8Ty, 2))}; 1007d7834556SPetar Avramovic auto *NewMDNode = MDNode::get(Context, LowAndHigh); 1008d7834556SPetar Avramovic const MachineMemOperand *OldMMO = *Load->memoperands_begin(); 1009d7834556SPetar Avramovic MachineMemOperand NewMMO(OldMMO->getPointerInfo(), OldMMO->getFlags(), 1010d7834556SPetar Avramovic OldMMO->getSizeInBits(), OldMMO->getAlign(), 1011d7834556SPetar Avramovic OldMMO->getAAInfo(), NewMDNode); 1012d7834556SPetar Avramovic MachineIRBuilder MIB(*Load); 1013d7834556SPetar Avramovic MIB.buildLoad(Load->getOperand(0), Load->getOperand(1), NewMMO); 1014d7834556SPetar Avramovic Load->eraseFromParent(); 1015d7834556SPetar Avramovic 1016d7834556SPetar Avramovic GISelKnownBits Info(*MF); 1017d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(And->getOperand(1).getReg()); 1018d7834556SPetar Avramovic 1019d7834556SPetar Avramovic EXPECT_TRUE(Res.One.isNullValue()); 1020d7834556SPetar Avramovic 1021d7834556SPetar Avramovic APInt Mask(Res.getBitWidth(), 1); 1022d7834556SPetar Avramovic Mask.flipAllBits(); 1023d7834556SPetar Avramovic EXPECT_EQ(Mask.getZExtValue(), Res.Zero.getZExtValue()); 1024d7834556SPetar Avramovic } 1025d7834556SPetar Avramovic 1026d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestVectorKnownBitsExt) { 1027d7834556SPetar Avramovic StringRef MIRString = R"( 1028d7834556SPetar Avramovic %c1:_(s16) = G_CONSTANT i16 1 1029d7834556SPetar Avramovic %c1_splat:_(<2 x s16>) = G_BUILD_VECTOR %c1:_(s16), %c1:_(s16) 1030d7834556SPetar Avramovic %x:_(<2 x s16>) = G_IMPLICIT_DEF 1031d7834556SPetar Avramovic %y:_(<2 x s16>) = G_AND %x, %c1_splat 1032d7834556SPetar Avramovic %anyext:_(<2 x s32>) = G_ANYEXT %y(<2 x s16>) 1033d7834556SPetar Avramovic %r1:_(<2 x s32>) = COPY %anyext 1034d7834556SPetar Avramovic %zext:_(<2 x s32>) = G_ZEXT %y(<2 x s16>) 1035d7834556SPetar Avramovic %r2:_(<2 x s32>) = COPY %zext 1036d7834556SPetar Avramovic %sext:_(<2 x s32>) = G_SEXT %y(<2 x s16>) 1037d7834556SPetar Avramovic %r3:_(<2 x s32>) = COPY %sext 1038d7834556SPetar Avramovic )"; 1039d7834556SPetar Avramovic 104042a84d22SDaniel Sanders setUp(MIRString); 1041d7834556SPetar Avramovic if (!TM) 1042d7834556SPetar Avramovic return; 1043d7834556SPetar Avramovic Register CopyRegAny = Copies[Copies.size() - 3]; 1044d7834556SPetar Avramovic Register CopyRegZ = Copies[Copies.size() - 2]; 1045d7834556SPetar Avramovic Register CopyRegS = Copies[Copies.size() - 1]; 1046d7834556SPetar Avramovic 1047d7834556SPetar Avramovic GISelKnownBits Info(*MF); 1048d7834556SPetar Avramovic MachineInstr *Copy; 1049d7834556SPetar Avramovic Register SrcReg; 1050d7834556SPetar Avramovic KnownBits Res; 1051d7834556SPetar Avramovic 1052d7834556SPetar Avramovic Copy = MRI->getVRegDef(CopyRegAny); 1053d7834556SPetar Avramovic SrcReg = Copy->getOperand(1).getReg(); 1054d7834556SPetar Avramovic Res = Info.getKnownBits(SrcReg); 1055d7834556SPetar Avramovic EXPECT_EQ((uint64_t)32, Res.getBitWidth()); 1056d7834556SPetar Avramovic EXPECT_EQ((uint64_t)0, Res.One.getZExtValue()); 1057d7834556SPetar Avramovic EXPECT_EQ((uint64_t)0x0000fffe, Res.Zero.getZExtValue()); 1058d7834556SPetar Avramovic 1059d7834556SPetar Avramovic Copy = MRI->getVRegDef(CopyRegZ); 1060d7834556SPetar Avramovic SrcReg = Copy->getOperand(1).getReg(); 1061d7834556SPetar Avramovic Res = Info.getKnownBits(SrcReg); 1062d7834556SPetar Avramovic EXPECT_EQ((uint64_t)32, Res.getBitWidth()); 1063d7834556SPetar Avramovic EXPECT_EQ((uint64_t)0, Res.One.getZExtValue()); 1064d7834556SPetar Avramovic EXPECT_EQ((uint64_t)0xfffffffe, Res.Zero.getZExtValue()); 1065d7834556SPetar Avramovic 1066d7834556SPetar Avramovic Copy = MRI->getVRegDef(CopyRegS); 1067d7834556SPetar Avramovic SrcReg = Copy->getOperand(1).getReg(); 1068d7834556SPetar Avramovic Res = Info.getKnownBits(SrcReg); 1069d7834556SPetar Avramovic EXPECT_EQ((uint64_t)32, Res.getBitWidth()); 1070d7834556SPetar Avramovic EXPECT_EQ((uint64_t)0, Res.One.getZExtValue()); 1071d7834556SPetar Avramovic EXPECT_EQ((uint64_t)0xfffffffe, Res.Zero.getZExtValue()); 1072d7834556SPetar Avramovic } 1073d7834556SPetar Avramovic 1074d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorSextInReg) { 1075d7834556SPetar Avramovic StringRef MIRString = R"( 1076d7834556SPetar Avramovic ; 000...0001 1077d7834556SPetar Avramovic %one:_(s32) = G_CONSTANT i32 1 1078d7834556SPetar Avramovic %one_splat:_(<2 x s32>) = G_BUILD_VECTOR %one:_(s32), %one:_(s32) 1079d7834556SPetar Avramovic 1080d7834556SPetar Avramovic ; 000...0010 1081d7834556SPetar Avramovic %two:_(s32) = G_CONSTANT i32 2 1082d7834556SPetar Avramovic %two_splat:_(<2 x s32>) = G_BUILD_VECTOR %two:_(s32), %two:_(s32) 1083d7834556SPetar Avramovic 1084d7834556SPetar Avramovic ; 000...1010 1085d7834556SPetar Avramovic %ten:_(s32) = G_CONSTANT i32 10 1086d7834556SPetar Avramovic %ten_splat:_(<2 x s32>) = G_BUILD_VECTOR %ten:_(s32), %ten:_(s32) 1087d7834556SPetar Avramovic 1088d7834556SPetar Avramovic ; ???...???? 1089d7834556SPetar Avramovic %x0:_(<2 x s32>) = COPY $x0 1090d7834556SPetar Avramovic 1091d7834556SPetar Avramovic ; ???...?1? 1092d7834556SPetar Avramovic %or:_(<2 x s32>) = G_OR %x0, %two_splat 1093d7834556SPetar Avramovic 1094d7834556SPetar Avramovic ; All bits are known. 1095d7834556SPetar Avramovic %inreg1:_(<2 x s32>) = G_SEXT_INREG %one_splat, 1 1096d7834556SPetar Avramovic %copy_inreg1:_(<2 x s32>) = COPY %inreg1 1097d7834556SPetar Avramovic 1098d7834556SPetar Avramovic ; All bits unknown 1099d7834556SPetar Avramovic %inreg2:_(<2 x s32>) = G_SEXT_INREG %or, 1 1100d7834556SPetar Avramovic %copy_inreg2:_(<2 x s32>) = COPY %inreg2 1101d7834556SPetar Avramovic 1102d7834556SPetar Avramovic ; Extending from the only (known) set bit 1103d7834556SPetar Avramovic ; 111...11? 1104d7834556SPetar Avramovic %inreg3:_(<2 x s32>) = G_SEXT_INREG %or, 2 1105d7834556SPetar Avramovic %copy_inreg3:_(<2 x s32>) = COPY %inreg3 1106d7834556SPetar Avramovic 1107d7834556SPetar Avramovic ; Extending from a known set bit, overwriting all of the high set bits. 1108d7834556SPetar Avramovic ; 111...1110 1109d7834556SPetar Avramovic %inreg4:_(<2 x s32>) = G_SEXT_INREG %ten_splat, 2 1110d7834556SPetar Avramovic %copy_inreg4:_(<2 x s32>) = COPY %inreg4 1111d7834556SPetar Avramovic 1112d7834556SPetar Avramovic )"; 111342a84d22SDaniel Sanders setUp(MIRString); 1114d7834556SPetar Avramovic if (!TM) 1115d7834556SPetar Avramovic return; 1116d7834556SPetar Avramovic GISelKnownBits Info(*MF); 1117d7834556SPetar Avramovic KnownBits Res; 1118d7834556SPetar Avramovic auto GetKB = [&](unsigned Idx) { 1119d7834556SPetar Avramovic Register CopyReg = Copies[Idx]; 1120d7834556SPetar Avramovic auto *Copy = MRI->getVRegDef(CopyReg); 1121d7834556SPetar Avramovic return Info.getKnownBits(Copy->getOperand(1).getReg()); 1122d7834556SPetar Avramovic }; 1123d7834556SPetar Avramovic 1124d7834556SPetar Avramovic Res = GetKB(Copies.size() - 4); 1125d7834556SPetar Avramovic EXPECT_EQ(32u, Res.getBitWidth()); 1126d7834556SPetar Avramovic EXPECT_TRUE(Res.isAllOnes()); 1127d7834556SPetar Avramovic 1128d7834556SPetar Avramovic Res = GetKB(Copies.size() - 3); 1129d7834556SPetar Avramovic EXPECT_EQ(32u, Res.getBitWidth()); 1130d7834556SPetar Avramovic EXPECT_TRUE(Res.isUnknown()); 1131d7834556SPetar Avramovic 1132d7834556SPetar Avramovic Res = GetKB(Copies.size() - 2); 1133d7834556SPetar Avramovic EXPECT_EQ(32u, Res.getBitWidth()); 1134d7834556SPetar Avramovic EXPECT_EQ(0xFFFFFFFEu, Res.One.getZExtValue()); 1135d7834556SPetar Avramovic EXPECT_EQ(0u, Res.Zero.getZExtValue()); 1136d7834556SPetar Avramovic 1137d7834556SPetar Avramovic Res = GetKB(Copies.size() - 1); 1138d7834556SPetar Avramovic EXPECT_EQ(32u, Res.getBitWidth()); 1139d7834556SPetar Avramovic EXPECT_EQ(0xFFFFFFFEu, Res.One.getZExtValue()); 1140d7834556SPetar Avramovic EXPECT_EQ(1u, Res.Zero.getZExtValue()); 1141d7834556SPetar Avramovic } 1142d7834556SPetar Avramovic 1143d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorAssertSext) { 1144d7834556SPetar Avramovic StringRef MIRString = R"( 1145d7834556SPetar Avramovic ; 000...0001 1146d7834556SPetar Avramovic %one:_(s32) = G_CONSTANT i32 1 1147d7834556SPetar Avramovic %one_splat:_(<2 x s32>) = G_BUILD_VECTOR %one, %one 1148d7834556SPetar Avramovic 1149d7834556SPetar Avramovic ; 000...0010 1150d7834556SPetar Avramovic %two:_(s32) = G_CONSTANT i32 2 1151d7834556SPetar Avramovic %two_splat:_(<2 x s32>) = G_BUILD_VECTOR %two, %two 1152d7834556SPetar Avramovic 1153d7834556SPetar Avramovic ; 000...1010 1154d7834556SPetar Avramovic %ten:_(s32) = G_CONSTANT i32 10 1155d7834556SPetar Avramovic %ten_splat:_(<2 x s32>) = G_BUILD_VECTOR %ten, %ten 1156d7834556SPetar Avramovic 1157d7834556SPetar Avramovic ; ???...???? 1158d7834556SPetar Avramovic %x0:_(<2 x s32>) = COPY $x0 1159d7834556SPetar Avramovic 1160d7834556SPetar Avramovic ; ???...?1? 1161d7834556SPetar Avramovic %or:_(<2 x s32>) = G_OR %x0, %two_splat 1162d7834556SPetar Avramovic 1163d7834556SPetar Avramovic ; All bits are known. 1164d7834556SPetar Avramovic %assert_sext1:_(<2 x s32>) = G_ASSERT_SEXT %one_splat, 1 1165d7834556SPetar Avramovic %copy_assert_sext1:_(<2 x s32>) = COPY %assert_sext1 1166d7834556SPetar Avramovic 1167d7834556SPetar Avramovic ; All bits unknown 1168d7834556SPetar Avramovic %assert_sext2:_(<2 x s32>) = G_ASSERT_SEXT %or, 1 1169d7834556SPetar Avramovic %copy_assert_sext2:_(<2 x s32>) = COPY %assert_sext2 1170d7834556SPetar Avramovic 1171d7834556SPetar Avramovic ; Extending from the only (known) set bit 1172d7834556SPetar Avramovic ; 111...11? 1173d7834556SPetar Avramovic %assert_sext3:_(<2 x s32>) = G_ASSERT_SEXT %or, 2 1174d7834556SPetar Avramovic %copy_assert_sext3:_(<2 x s32>) = COPY %assert_sext3 1175d7834556SPetar Avramovic 1176d7834556SPetar Avramovic ; Extending from a known set bit, overwriting all of the high set bits. 1177d7834556SPetar Avramovic ; 111...1110 1178d7834556SPetar Avramovic %assert_sext4:_(<2 x s32>) = G_ASSERT_SEXT %ten_splat, 2 1179d7834556SPetar Avramovic %copy_assert_sext4:_(<2 x s32>) = COPY %assert_sext4 1180d7834556SPetar Avramovic )"; 118142a84d22SDaniel Sanders setUp(MIRString); 1182d7834556SPetar Avramovic if (!TM) 1183d7834556SPetar Avramovic return; 1184d7834556SPetar Avramovic GISelKnownBits Info(*MF); 1185d7834556SPetar Avramovic KnownBits Res; 1186d7834556SPetar Avramovic auto GetKB = [&](unsigned Idx) { 1187d7834556SPetar Avramovic Register CopyReg = Copies[Idx]; 1188d7834556SPetar Avramovic auto *Copy = MRI->getVRegDef(CopyReg); 1189d7834556SPetar Avramovic return Info.getKnownBits(Copy->getOperand(1).getReg()); 1190d7834556SPetar Avramovic }; 1191d7834556SPetar Avramovic 1192d7834556SPetar Avramovic // Every bit is known to be a 1. 1193d7834556SPetar Avramovic Res = GetKB(Copies.size() - 4); 1194d7834556SPetar Avramovic EXPECT_EQ(32u, Res.getBitWidth()); 1195d7834556SPetar Avramovic EXPECT_TRUE(Res.isAllOnes()); 1196d7834556SPetar Avramovic 1197d7834556SPetar Avramovic // All bits are unknown 1198d7834556SPetar Avramovic Res = GetKB(Copies.size() - 3); 1199d7834556SPetar Avramovic EXPECT_EQ(32u, Res.getBitWidth()); 1200d7834556SPetar Avramovic EXPECT_TRUE(Res.isUnknown()); 1201d7834556SPetar Avramovic 1202d7834556SPetar Avramovic // Extending from the only known set bit 1203d7834556SPetar Avramovic // 111...11? 1204d7834556SPetar Avramovic Res = GetKB(Copies.size() - 2); 1205d7834556SPetar Avramovic EXPECT_EQ(32u, Res.getBitWidth()); 1206d7834556SPetar Avramovic EXPECT_EQ(0xFFFFFFFEu, Res.One.getZExtValue()); 1207d7834556SPetar Avramovic EXPECT_EQ(0u, Res.Zero.getZExtValue()); 1208d7834556SPetar Avramovic 1209d7834556SPetar Avramovic // Extending from a known set bit, overwriting all of the high set bits. 1210d7834556SPetar Avramovic // 111...1110 1211d7834556SPetar Avramovic Res = GetKB(Copies.size() - 1); 1212d7834556SPetar Avramovic EXPECT_EQ(32u, Res.getBitWidth()); 1213d7834556SPetar Avramovic EXPECT_EQ(0xFFFFFFFEu, Res.One.getZExtValue()); 1214d7834556SPetar Avramovic EXPECT_EQ(1u, Res.Zero.getZExtValue()); 1215d7834556SPetar Avramovic } 1216d7834556SPetar Avramovic 1217d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestVectorKnownBitsBSwapBitReverse) { 1218d7834556SPetar Avramovic StringRef MIRString = R"( 1219d7834556SPetar Avramovic %const:_(s32) = G_CONSTANT i32 287454020 1220d7834556SPetar Avramovic %const_splat:_(<2 x s32>) = G_BUILD_VECTOR %const:_(s32), %const:_(s32) 1221d7834556SPetar Avramovic %bswap:_(<2 x s32>) = G_BSWAP %const_splat 1222d7834556SPetar Avramovic %bitreverse:_(<2 x s32>) = G_BITREVERSE %const_splat 1223d7834556SPetar Avramovic %copy_bswap:_(<2 x s32>) = COPY %bswap 1224d7834556SPetar Avramovic %copy_bitreverse:_(<2 x s32>) = COPY %bitreverse 1225d7834556SPetar Avramovic )"; 122642a84d22SDaniel Sanders setUp(MIRString); 1227d7834556SPetar Avramovic if (!TM) 1228d7834556SPetar Avramovic return; 1229d7834556SPetar Avramovic 1230*4c55cdb0SAmara Emerson const uint32_t ByteSwappedVal = 0x44332211; 1231*4c55cdb0SAmara Emerson const uint32_t BitSwappedVal = 0x22cc4488; 1232d7834556SPetar Avramovic 1233d7834556SPetar Avramovic Register CopyBSwap = Copies[Copies.size() - 2]; 1234d7834556SPetar Avramovic Register CopyBitReverse = Copies[Copies.size() - 1]; 1235d7834556SPetar Avramovic 1236d7834556SPetar Avramovic GISelKnownBits Info(*MF); 1237d7834556SPetar Avramovic 1238d7834556SPetar Avramovic KnownBits BSwapKnown = Info.getKnownBits(CopyBSwap); 1239d7834556SPetar Avramovic EXPECT_EQ(32u, BSwapKnown.getBitWidth()); 1240*4c55cdb0SAmara Emerson EXPECT_EQ(ByteSwappedVal, BSwapKnown.One.getZExtValue()); 1241*4c55cdb0SAmara Emerson EXPECT_EQ(~ByteSwappedVal, BSwapKnown.Zero.getZExtValue()); 1242d7834556SPetar Avramovic 1243d7834556SPetar Avramovic KnownBits BitReverseKnown = Info.getKnownBits(CopyBitReverse); 1244d7834556SPetar Avramovic EXPECT_EQ(32u, BitReverseKnown.getBitWidth()); 1245*4c55cdb0SAmara Emerson EXPECT_EQ(BitSwappedVal, BitReverseKnown.One.getZExtValue()); 1246*4c55cdb0SAmara Emerson EXPECT_EQ(~BitSwappedVal, BitReverseKnown.Zero.getZExtValue()); 1247d7834556SPetar Avramovic } 1248d7834556SPetar Avramovic 1249d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorUMAX) { 1250d7834556SPetar Avramovic StringRef MIRString = R"( 1251d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF 1252fae05692SMatt Arsenault %unknown:_(<2 x s8>) = G_LOAD %ptr(p0) :: (load (<2 x s8>)) 1253d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 10 1254d7834556SPetar Avramovic %mask0_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask0, %mask0 1255d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 1 1256d7834556SPetar Avramovic %mask1_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask1, %mask1 1257d7834556SPetar Avramovic %tmp0:_(<2 x s8>) = G_AND %unknown, %mask0_splat 1258d7834556SPetar Avramovic %val0:_(<2 x s8>) = G_OR %tmp0, %mask1_splat 1259d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 3 1260d7834556SPetar Avramovic %mask2_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask2, %mask2 1261d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 12 1262d7834556SPetar Avramovic %mask3_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask3, %mask3 1263d7834556SPetar Avramovic %tmp1:_(<2 x s8>) = G_AND %unknown, %mask2_splat 1264d7834556SPetar Avramovic %val1:_(<2 x s8>) = G_OR %tmp1, %mask3_splat 1265d7834556SPetar Avramovic %umax0:_(<2 x s8>) = G_UMAX %val0, %val1 1266d7834556SPetar Avramovic %copy_umax0:_(<2 x s8>) = COPY %umax0 1267d7834556SPetar Avramovic 1268d7834556SPetar Avramovic %mask4:_(s8) = G_CONSTANT i8 14 1269d7834556SPetar Avramovic %mask4_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask4, %mask4 1270d7834556SPetar Avramovic %mask5:_(s8) = G_CONSTANT i8 2 1271d7834556SPetar Avramovic %mask5_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask5, %mask5 1272d7834556SPetar Avramovic %tmp3:_(<2 x s8>) = G_AND %unknown, %mask4_splat 1273d7834556SPetar Avramovic %val3:_(<2 x s8>) = G_OR %tmp3, %mask5_splat 1274d7834556SPetar Avramovic %mask6:_(s8) = G_CONSTANT i8 4 1275d7834556SPetar Avramovic %mask6_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask6, %mask6 1276d7834556SPetar Avramovic %mask7:_(s8) = G_CONSTANT i8 11 1277d7834556SPetar Avramovic %mask7_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask7, %mask7 1278d7834556SPetar Avramovic %tmp4:_(<2 x s8>) = G_AND %unknown, %mask6_splat 1279d7834556SPetar Avramovic %val4:_(<2 x s8>) = G_OR %tmp4, %mask7_splat 1280d7834556SPetar Avramovic %umax1:_(<2 x s8>) = G_UMAX %val3, %val4 1281d7834556SPetar Avramovic %copy_umax1:_(<2 x s8>) = COPY %umax1 1282d7834556SPetar Avramovic )"; 1283d7834556SPetar Avramovic 128442a84d22SDaniel Sanders setUp(MIRString); 1285d7834556SPetar Avramovic if (!TM) 1286d7834556SPetar Avramovic return; 1287d7834556SPetar Avramovic 1288d7834556SPetar Avramovic Register CopyReg0 = Copies[Copies.size() - 2]; 1289d7834556SPetar Avramovic MachineInstr *FinalCopy0 = MRI->getVRegDef(CopyReg0); 1290d7834556SPetar Avramovic Register SrcReg0 = FinalCopy0->getOperand(1).getReg(); 1291d7834556SPetar Avramovic GISelKnownBits Info(*MF); 1292d7834556SPetar Avramovic KnownBits Res0 = Info.getKnownBits(SrcReg0); 1293d7834556SPetar Avramovic EXPECT_EQ(0x0Cu, Res0.One.getZExtValue()); 1294d7834556SPetar Avramovic EXPECT_EQ(0xF0u, Res0.Zero.getZExtValue()); 1295d7834556SPetar Avramovic 1296d7834556SPetar Avramovic Register CopyReg1 = Copies[Copies.size() - 1]; 1297d7834556SPetar Avramovic MachineInstr *FinalCopy1 = MRI->getVRegDef(CopyReg1); 1298d7834556SPetar Avramovic Register SrcReg1 = FinalCopy1->getOperand(1).getReg(); 1299d7834556SPetar Avramovic KnownBits Res1 = Info.getKnownBits(SrcReg1); 1300d7834556SPetar Avramovic EXPECT_EQ(0x0Au, Res1.One.getZExtValue()); 1301d7834556SPetar Avramovic EXPECT_EQ(0xF0u, Res1.Zero.getZExtValue()); 1302d7834556SPetar Avramovic } 1303d7834556SPetar Avramovic 1304d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestVectorKnownBitsUMax) { 1305d7834556SPetar Avramovic StringRef MIRString = R"( 1306d7834556SPetar Avramovic %val:_(<2 x s32>) = COPY $x0 1307d7834556SPetar Avramovic %zext:_(<2 x s64>) = G_ZEXT %val 1308d7834556SPetar Avramovic %const:_(s64) = G_CONSTANT i64 -256 1309d7834556SPetar Avramovic %const_splat:_(<2 x s64>) = G_BUILD_VECTOR %const:_(s64), %const:_(s64) 1310d7834556SPetar Avramovic %umax:_(<2 x s64>) = G_UMAX %zext, %const_splat 1311d7834556SPetar Avramovic %copy_umax:_(<2 x s64>) = COPY %umax 1312d7834556SPetar Avramovic )"; 1313d7834556SPetar Avramovic 131442a84d22SDaniel Sanders setUp(MIRString); 1315d7834556SPetar Avramovic if (!TM) 1316d7834556SPetar Avramovic return; 1317d7834556SPetar Avramovic 1318d7834556SPetar Avramovic Register CopyUMax = Copies[Copies.size() - 1]; 1319d7834556SPetar Avramovic GISelKnownBits Info(*MF); 1320d7834556SPetar Avramovic 1321d7834556SPetar Avramovic KnownBits KnownUmax = Info.getKnownBits(CopyUMax); 1322d7834556SPetar Avramovic EXPECT_EQ(64u, KnownUmax.getBitWidth()); 1323d7834556SPetar Avramovic EXPECT_EQ(0xffu, KnownUmax.Zero.getZExtValue()); 1324d7834556SPetar Avramovic EXPECT_EQ(0xffffffffffffff00, KnownUmax.One.getZExtValue()); 1325d7834556SPetar Avramovic 1326d7834556SPetar Avramovic EXPECT_EQ(0xffu, KnownUmax.Zero.getZExtValue()); 1327d7834556SPetar Avramovic EXPECT_EQ(0xffffffffffffff00, KnownUmax.One.getZExtValue()); 1328d7834556SPetar Avramovic } 1329d7834556SPetar Avramovic 1330d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorUMIN) { 1331d7834556SPetar Avramovic StringRef MIRString = R"( 1332d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF 1333fae05692SMatt Arsenault %unknown:_(<2 x s8>) = G_LOAD %ptr(p0) :: (load (<2 x s8>)) 1334d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 10 1335d7834556SPetar Avramovic %mask0_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask0, %mask0 1336d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 1 1337d7834556SPetar Avramovic %mask1_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask1, %mask1 1338d7834556SPetar Avramovic %tmp0:_(<2 x s8>) = G_AND %unknown, %mask0_splat 1339d7834556SPetar Avramovic %val0:_(<2 x s8>) = G_OR %tmp0, %mask1_splat 1340d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 3 1341d7834556SPetar Avramovic %mask2_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask2, %mask2 1342d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 12 1343d7834556SPetar Avramovic %mask3_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask3, %mask3 1344d7834556SPetar Avramovic %tmp1:_(<2 x s8>) = G_AND %unknown, %mask2_splat 1345d7834556SPetar Avramovic %val1:_(<2 x s8>) = G_OR %tmp1, %mask3_splat 1346d7834556SPetar Avramovic %umin:_(<2 x s8>) = G_UMIN %val0, %val1 1347d7834556SPetar Avramovic %copy_umin:_(<2 x s8>) = COPY %umin 1348d7834556SPetar Avramovic )"; 1349d7834556SPetar Avramovic 135042a84d22SDaniel Sanders setUp(MIRString); 1351d7834556SPetar Avramovic if (!TM) 1352d7834556SPetar Avramovic return; 1353d7834556SPetar Avramovic 1354d7834556SPetar Avramovic Register CopyReg0 = Copies[Copies.size() - 1]; 1355d7834556SPetar Avramovic MachineInstr *FinalCopy0 = MRI->getVRegDef(CopyReg0); 1356d7834556SPetar Avramovic Register SrcReg0 = FinalCopy0->getOperand(1).getReg(); 1357d7834556SPetar Avramovic GISelKnownBits Info(*MF); 1358d7834556SPetar Avramovic KnownBits Res0 = Info.getKnownBits(SrcReg0); 1359d7834556SPetar Avramovic EXPECT_EQ(0x01u, Res0.One.getZExtValue()); 1360d7834556SPetar Avramovic EXPECT_EQ(0xF4u, Res0.Zero.getZExtValue()); 1361d7834556SPetar Avramovic } 1362d7834556SPetar Avramovic 1363d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorSMAX) { 1364d7834556SPetar Avramovic StringRef MIRString = R"( 1365d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF 1366fae05692SMatt Arsenault %unknown:_(<2 x s8>) = G_LOAD %ptr(p0) :: (load (<2 x s8>)) 1367d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 128 1368d7834556SPetar Avramovic %mask0_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask0, %mask0 1369d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 64 1370d7834556SPetar Avramovic %mask1_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask1, %mask1 1371d7834556SPetar Avramovic %tmp0:_(<2 x s8>) = G_AND %unknown, %mask0_splat 1372d7834556SPetar Avramovic %val0:_(<2 x s8>) = G_OR %tmp0, %mask1_splat 1373d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 1 1374d7834556SPetar Avramovic %mask2_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask2, %mask2 1375d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 128 1376d7834556SPetar Avramovic %mask3_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask3, %mask3 1377d7834556SPetar Avramovic %tmp1:_(<2 x s8>) = G_AND %unknown, %mask2_splat 1378d7834556SPetar Avramovic %val1:_(<2 x s8>) = G_OR %tmp1, %mask3_splat 1379d7834556SPetar Avramovic %smax:_(<2 x s8>) = G_SMAX %val0, %val1 1380d7834556SPetar Avramovic %copy_smax:_(<2 x s8>) = COPY %smax 1381d7834556SPetar Avramovic )"; 1382d7834556SPetar Avramovic 138342a84d22SDaniel Sanders setUp(MIRString); 1384d7834556SPetar Avramovic if (!TM) 1385d7834556SPetar Avramovic return; 1386d7834556SPetar Avramovic 1387d7834556SPetar Avramovic Register CopyReg0 = Copies[Copies.size() - 1]; 1388d7834556SPetar Avramovic MachineInstr *FinalCopy0 = MRI->getVRegDef(CopyReg0); 1389d7834556SPetar Avramovic Register SrcReg0 = FinalCopy0->getOperand(1).getReg(); 1390d7834556SPetar Avramovic GISelKnownBits Info(*MF); 1391d7834556SPetar Avramovic KnownBits Res0 = Info.getKnownBits(SrcReg0); 1392d7834556SPetar Avramovic EXPECT_EQ(0x40u, Res0.One.getZExtValue()); 1393d7834556SPetar Avramovic EXPECT_EQ(0x3Fu, Res0.Zero.getZExtValue()); 1394d7834556SPetar Avramovic } 1395d7834556SPetar Avramovic 1396d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorSMIN) { 1397d7834556SPetar Avramovic StringRef MIRString = R"( 1398d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF 1399fae05692SMatt Arsenault %unknown:_(<2 x s8>) = G_LOAD %ptr(p0) :: (load (<2 x s8>)) 1400d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 128 1401d7834556SPetar Avramovic %mask0_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask0, %mask0 1402d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 64 1403d7834556SPetar Avramovic %mask1_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask1, %mask1 1404d7834556SPetar Avramovic %tmp0:_(<2 x s8>) = G_AND %unknown, %mask0_splat 1405d7834556SPetar Avramovic %val0:_(<2 x s8>) = G_OR %tmp0, %mask1_splat 1406d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 1 1407d7834556SPetar Avramovic %mask2_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask2, %mask2 1408d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 128 1409d7834556SPetar Avramovic %mask3_splat:_(<2 x s8>) = G_BUILD_VECTOR %mask3, %mask3 1410d7834556SPetar Avramovic %tmp1:_(<2 x s8>) = G_AND %unknown, %mask2_splat 1411d7834556SPetar Avramovic %val1:_(<2 x s8>) = G_OR %tmp1, %mask3_splat 1412d7834556SPetar Avramovic %smin:_(<2 x s8>) = G_SMIN %val0, %val1 1413d7834556SPetar Avramovic %copy_smin:_(<2 x s8>) = COPY %smin 1414d7834556SPetar Avramovic )"; 1415d7834556SPetar Avramovic 141642a84d22SDaniel Sanders setUp(MIRString); 1417d7834556SPetar Avramovic if (!TM) 1418d7834556SPetar Avramovic return; 1419d7834556SPetar Avramovic 1420d7834556SPetar Avramovic Register CopyReg0 = Copies[Copies.size() - 1]; 1421d7834556SPetar Avramovic MachineInstr *FinalCopy0 = MRI->getVRegDef(CopyReg0); 1422d7834556SPetar Avramovic Register SrcReg0 = FinalCopy0->getOperand(1).getReg(); 1423d7834556SPetar Avramovic GISelKnownBits Info(*MF); 1424d7834556SPetar Avramovic KnownBits Res0 = Info.getKnownBits(SrcReg0); 1425d7834556SPetar Avramovic EXPECT_EQ(0x80u, Res0.One.getZExtValue()); 1426d7834556SPetar Avramovic EXPECT_EQ(0x7Eu, Res0.Zero.getZExtValue()); 1427d7834556SPetar Avramovic } 1428d7834556SPetar Avramovic 1429d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestVectorInvalidQueries) { 1430d7834556SPetar Avramovic StringRef MIRString = R"( 1431d7834556SPetar Avramovic %src:_(<2 x s32>) = COPY $x0 1432d7834556SPetar Avramovic %thirty2:_(s32) = G_CONSTANT i32 32 1433d7834556SPetar Avramovic %thirty2_splat:_(<2 x s32>) = G_BUILD_VECTOR %thirty2:_(s32), %thirty2:_(s32) 1434d7834556SPetar Avramovic %equalSized:_(<2 x s32>) = G_SHL %src, %thirty2_splat 1435d7834556SPetar Avramovic %copy1:_(<2 x s32>) = COPY %equalSized 1436d7834556SPetar Avramovic %thirty3:_(s32) = G_CONSTANT i32 33 1437d7834556SPetar Avramovic %thirty3_splat:_(<2 x s32>) = G_BUILD_VECTOR %thirty3:_(s32), %thirty3:_(s32) 1438d7834556SPetar Avramovic %biggerSized:_(<2 x s32>) = G_SHL %src, %thirty3_splat 1439d7834556SPetar Avramovic %copy2:_(<2 x s32>) = COPY %biggerSized 1440d7834556SPetar Avramovic )"; 144142a84d22SDaniel Sanders setUp(MIRString); 1442d7834556SPetar Avramovic if (!TM) 1443d7834556SPetar Avramovic return; 1444d7834556SPetar Avramovic 1445d7834556SPetar Avramovic Register EqSizedCopyReg = Copies[Copies.size() - 2]; 1446d7834556SPetar Avramovic MachineInstr *EqSizedCopy = MRI->getVRegDef(EqSizedCopyReg); 1447d7834556SPetar Avramovic Register EqSizedShl = EqSizedCopy->getOperand(1).getReg(); 1448d7834556SPetar Avramovic 1449d7834556SPetar Avramovic Register BiggerSizedCopyReg = Copies[Copies.size() - 1]; 1450d7834556SPetar Avramovic MachineInstr *BiggerSizedCopy = MRI->getVRegDef(BiggerSizedCopyReg); 1451d7834556SPetar Avramovic Register BiggerSizedShl = BiggerSizedCopy->getOperand(1).getReg(); 1452d7834556SPetar Avramovic 1453d7834556SPetar Avramovic GISelKnownBits Info(*MF); 1454d7834556SPetar Avramovic KnownBits EqSizeRes = Info.getKnownBits(EqSizedShl); 1455d7834556SPetar Avramovic KnownBits BiggerSizeRes = Info.getKnownBits(BiggerSizedShl); 1456d7834556SPetar Avramovic 1457d7834556SPetar Avramovic EXPECT_TRUE(EqSizeRes.One.isNullValue()); 1458d7834556SPetar Avramovic EXPECT_TRUE(EqSizeRes.Zero.isNullValue()); 1459d7834556SPetar Avramovic 1460d7834556SPetar Avramovic EXPECT_TRUE(BiggerSizeRes.One.isNullValue()); 1461d7834556SPetar Avramovic EXPECT_TRUE(BiggerSizeRes.Zero.isNullValue()); 1462d7834556SPetar Avramovic } 1463d7834556SPetar Avramovic 1464d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsVectorAssertZext) { 1465d7834556SPetar Avramovic StringRef MIRString = R"( 1466d7834556SPetar Avramovic %copy_x0:_(s64) = COPY $x0 1467d7834556SPetar Avramovic %copy_x1:_(s64) = COPY $x1 1468d7834556SPetar Avramovic %x0_x1:_(<2 x s64>) = G_BUILD_VECTOR %copy_x0, %copy_x1 1469d7834556SPetar Avramovic 1470d7834556SPetar Avramovic %assert8:_(<2 x s64>) = G_ASSERT_ZEXT %x0_x1, 8 1471d7834556SPetar Avramovic %copy_assert8:_(<2 x s64>) = COPY %assert8 1472d7834556SPetar Avramovic 1473d7834556SPetar Avramovic %assert1:_(<2 x s64>) = G_ASSERT_ZEXT %x0_x1, 1 1474d7834556SPetar Avramovic %copy_assert1:_(<2 x s64>) = COPY %assert1 1475d7834556SPetar Avramovic 1476d7834556SPetar Avramovic %assert63:_(<2 x s64>) = G_ASSERT_ZEXT %x0_x1, 63 1477d7834556SPetar Avramovic %copy_assert63:_(<2 x s64>) = COPY %assert63 1478d7834556SPetar Avramovic 1479d7834556SPetar Avramovic %assert3:_(<2 x s64>) = G_ASSERT_ZEXT %x0_x1, 3 1480d7834556SPetar Avramovic %copy_assert3:_(<2 x s64>) = COPY %assert3 1481d7834556SPetar Avramovic )"; 1482d7834556SPetar Avramovic 148342a84d22SDaniel Sanders setUp(MIRString); 1484d7834556SPetar Avramovic if (!TM) 1485d7834556SPetar Avramovic return; 1486d7834556SPetar Avramovic 1487d7834556SPetar Avramovic Register CopyAssert8 = Copies[Copies.size() - 4]; 1488d7834556SPetar Avramovic Register CopyAssert1 = Copies[Copies.size() - 3]; 1489d7834556SPetar Avramovic Register CopyAssert63 = Copies[Copies.size() - 2]; 1490d7834556SPetar Avramovic Register CopyAssert3 = Copies[Copies.size() - 1]; 1491d7834556SPetar Avramovic 1492d7834556SPetar Avramovic GISelKnownBits Info(*MF); 1493d7834556SPetar Avramovic MachineInstr *Copy; 1494d7834556SPetar Avramovic Register SrcReg; 1495d7834556SPetar Avramovic KnownBits Res; 1496d7834556SPetar Avramovic 1497d7834556SPetar Avramovic // Assert zero-extension from an 8-bit value. 1498d7834556SPetar Avramovic Copy = MRI->getVRegDef(CopyAssert8); 1499d7834556SPetar Avramovic SrcReg = Copy->getOperand(1).getReg(); 1500d7834556SPetar Avramovic Res = Info.getKnownBits(SrcReg); 1501d7834556SPetar Avramovic EXPECT_EQ(64u, Res.getBitWidth()); 1502d7834556SPetar Avramovic EXPECT_EQ(0u, Res.One.getZExtValue()); 1503d7834556SPetar Avramovic EXPECT_EQ(0xFFFFFFFFFFFFFF00u, Res.Zero.getZExtValue()); 1504d7834556SPetar Avramovic 1505d7834556SPetar Avramovic // Assert zero-extension from a 1-bit value. 1506d7834556SPetar Avramovic Copy = MRI->getVRegDef(CopyAssert1); 1507d7834556SPetar Avramovic SrcReg = Copy->getOperand(1).getReg(); 1508d7834556SPetar Avramovic Res = Info.getKnownBits(SrcReg); 1509d7834556SPetar Avramovic EXPECT_EQ(64u, Res.getBitWidth()); 1510d7834556SPetar Avramovic EXPECT_EQ(0u, Res.One.getZExtValue()); 1511d7834556SPetar Avramovic EXPECT_EQ(0xFFFFFFFFFFFFFFFE, Res.Zero.getZExtValue()); 1512d7834556SPetar Avramovic 1513d7834556SPetar Avramovic // Assert zero-extension from a 63-bit value. 1514d7834556SPetar Avramovic Copy = MRI->getVRegDef(CopyAssert63); 1515d7834556SPetar Avramovic SrcReg = Copy->getOperand(1).getReg(); 1516d7834556SPetar Avramovic Res = Info.getKnownBits(SrcReg); 1517d7834556SPetar Avramovic EXPECT_EQ(64u, Res.getBitWidth()); 1518d7834556SPetar Avramovic EXPECT_EQ(0u, Res.One.getZExtValue()); 1519d7834556SPetar Avramovic EXPECT_EQ(0x8000000000000000u, Res.Zero.getZExtValue()); 1520d7834556SPetar Avramovic 1521d7834556SPetar Avramovic // Assert zero-extension from a 3-bit value. 1522d7834556SPetar Avramovic Copy = MRI->getVRegDef(CopyAssert3); 1523d7834556SPetar Avramovic SrcReg = Copy->getOperand(1).getReg(); 1524d7834556SPetar Avramovic Res = Info.getKnownBits(SrcReg); 1525d7834556SPetar Avramovic EXPECT_EQ(64u, Res.getBitWidth()); 1526d7834556SPetar Avramovic EXPECT_EQ(0u, Res.One.getZExtValue()); 1527d7834556SPetar Avramovic EXPECT_EQ(0xFFFFFFFFFFFFFFF8u, Res.Zero.getZExtValue()); 1528d7834556SPetar Avramovic } 1529