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