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