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