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