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