1c8ac029dSAditya Nandakumar //===- KnownBitsTest.cpp -------------------------------------------===//
2c8ac029dSAditya Nandakumar //
3c8ac029dSAditya Nandakumar // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4c8ac029dSAditya Nandakumar // See https://llvm.org/LICENSE.txt for license information.
5c8ac029dSAditya Nandakumar // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c8ac029dSAditya Nandakumar //
7c8ac029dSAditya Nandakumar //===----------------------------------------------------------------------===//
8c8ac029dSAditya Nandakumar
9c8ac029dSAditya Nandakumar #include "GISelMITest.h"
10c8ac029dSAditya Nandakumar #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
11c8ac029dSAditya Nandakumar #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
12c8ac029dSAditya Nandakumar
TEST_F(AArch64GISelMITest,TestKnownBitsCst)1358f843a5SMatt Arsenault TEST_F(AArch64GISelMITest, TestKnownBitsCst) {
14c8ac029dSAditya Nandakumar StringRef MIRString = " %3:_(s8) = G_CONSTANT i8 1\n"
15c8ac029dSAditya Nandakumar " %4:_(s8) = COPY %3\n";
1642a84d22SDaniel Sanders setUp(MIRString);
17c8ac029dSAditya Nandakumar if (!TM)
187fc87159SPaul Robinson GTEST_SKIP();
19c8ac029dSAditya Nandakumar unsigned CopyReg = Copies[Copies.size() - 1];
20c8ac029dSAditya Nandakumar MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
21c8ac029dSAditya Nandakumar unsigned SrcReg = FinalCopy->getOperand(1).getReg();
22e55c4f33SDaniel Sanders unsigned DstReg = FinalCopy->getOperand(0).getReg();
23c8ac029dSAditya Nandakumar GISelKnownBits Info(*MF);
24c8ac029dSAditya Nandakumar KnownBits Res = Info.getKnownBits(SrcReg);
25c8ac029dSAditya Nandakumar EXPECT_EQ((uint64_t)1, Res.One.getZExtValue());
26c8ac029dSAditya Nandakumar EXPECT_EQ((uint64_t)0xfe, Res.Zero.getZExtValue());
27b276a9a5SDaniel Sanders
28b276a9a5SDaniel Sanders KnownBits Res2 = Info.getKnownBits(DstReg);
29b276a9a5SDaniel Sanders EXPECT_EQ(Res.One.getZExtValue(), Res2.One.getZExtValue());
30b276a9a5SDaniel Sanders EXPECT_EQ(Res.Zero.getZExtValue(), Res2.Zero.getZExtValue());
31c8ac029dSAditya Nandakumar }
32b276a9a5SDaniel Sanders
TEST_F(AArch64GISelMITest,TestKnownBitsCstWithClass)3358f843a5SMatt Arsenault TEST_F(AArch64GISelMITest, TestKnownBitsCstWithClass) {
34f8032379SDaniel Sanders StringRef MIRString = " %10:gpr32 = MOVi32imm 1\n"
35f8032379SDaniel Sanders " %4:_(s32) = COPY %10\n";
3642a84d22SDaniel Sanders setUp(MIRString);
37f8032379SDaniel Sanders if (!TM)
387fc87159SPaul Robinson GTEST_SKIP();
39f8032379SDaniel Sanders unsigned CopyReg = Copies[Copies.size() - 1];
40f8032379SDaniel Sanders MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
41f8032379SDaniel Sanders unsigned SrcReg = FinalCopy->getOperand(1).getReg();
42f8032379SDaniel Sanders unsigned DstReg = FinalCopy->getOperand(0).getReg();
43f8032379SDaniel Sanders GISelKnownBits Info(*MF);
44f8032379SDaniel Sanders KnownBits Res = Info.getKnownBits(SrcReg);
45f8032379SDaniel Sanders // We can't analyze %3 due to the register class constraint. We will get a
46f8032379SDaniel Sanders // default-constructed KnownBits back.
47f8032379SDaniel Sanders EXPECT_EQ((uint64_t)1, Res.getBitWidth());
48f8032379SDaniel Sanders EXPECT_EQ((uint64_t)0, Res.One.getZExtValue());
49f8032379SDaniel Sanders EXPECT_EQ((uint64_t)0, Res.Zero.getZExtValue());
50f8032379SDaniel Sanders
51f8032379SDaniel Sanders KnownBits Res2 = Info.getKnownBits(DstReg);
52f8032379SDaniel Sanders // We still don't know the values due to the register class constraint but %4
53f8032379SDaniel Sanders // did reveal the size of %3.
54f8032379SDaniel Sanders EXPECT_EQ((uint64_t)32, Res2.getBitWidth());
55f8032379SDaniel Sanders EXPECT_EQ(Res.One.getZExtValue(), Res2.One.getZExtValue());
56f8032379SDaniel Sanders EXPECT_EQ(Res.Zero.getZExtValue(), Res2.Zero.getZExtValue());
57f8032379SDaniel Sanders }
58f8032379SDaniel Sanders
595d87b5d2SQuentin Colombet // Check that we are able to track bits through PHIs
605d87b5d2SQuentin Colombet // and get the intersections of everything we know on each operand.
TEST_F(AArch64GISelMITest,TestKnownBitsCstPHI)6158f843a5SMatt Arsenault TEST_F(AArch64GISelMITest, TestKnownBitsCstPHI) {
625d87b5d2SQuentin Colombet StringRef MIRString = " bb.10:\n"
635d87b5d2SQuentin Colombet " %10:_(s8) = G_CONSTANT i8 3\n"
645d87b5d2SQuentin Colombet " %11:_(s1) = G_IMPLICIT_DEF\n"
655d87b5d2SQuentin Colombet " G_BRCOND %11(s1), %bb.11\n"
665d87b5d2SQuentin Colombet " G_BR %bb.12\n"
675d87b5d2SQuentin Colombet "\n"
685d87b5d2SQuentin Colombet " bb.11:\n"
695d87b5d2SQuentin Colombet " %12:_(s8) = G_CONSTANT i8 2\n"
705d87b5d2SQuentin Colombet " G_BR %bb.12\n"
715d87b5d2SQuentin Colombet "\n"
725d87b5d2SQuentin Colombet " bb.12:\n"
735d87b5d2SQuentin Colombet " %13:_(s8) = PHI %10(s8), %bb.10, %12(s8), %bb.11\n"
745d87b5d2SQuentin Colombet " %14:_(s8) = COPY %13\n";
7542a84d22SDaniel Sanders setUp(MIRString);
765d87b5d2SQuentin Colombet if (!TM)
777fc87159SPaul Robinson GTEST_SKIP();
785d87b5d2SQuentin Colombet Register CopyReg = Copies[Copies.size() - 1];
795d87b5d2SQuentin Colombet MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
805d87b5d2SQuentin Colombet Register SrcReg = FinalCopy->getOperand(1).getReg();
815d87b5d2SQuentin Colombet Register DstReg = FinalCopy->getOperand(0).getReg();
825d87b5d2SQuentin Colombet GISelKnownBits Info(*MF);
835d87b5d2SQuentin Colombet KnownBits Res = Info.getKnownBits(SrcReg);
845d87b5d2SQuentin Colombet EXPECT_EQ((uint64_t)2, Res.One.getZExtValue());
855d87b5d2SQuentin Colombet EXPECT_EQ((uint64_t)0xfc, Res.Zero.getZExtValue());
865d87b5d2SQuentin Colombet
875d87b5d2SQuentin Colombet KnownBits Res2 = Info.getKnownBits(DstReg);
885d87b5d2SQuentin Colombet EXPECT_EQ(Res.One.getZExtValue(), Res2.One.getZExtValue());
895d87b5d2SQuentin Colombet EXPECT_EQ(Res.Zero.getZExtValue(), Res2.Zero.getZExtValue());
905d87b5d2SQuentin Colombet }
915d87b5d2SQuentin Colombet
925d87b5d2SQuentin Colombet // Check that we report we know nothing when we hit a
935d87b5d2SQuentin Colombet // non-generic register.
945d87b5d2SQuentin Colombet // Note: this could be improved though!
TEST_F(AArch64GISelMITest,TestKnownBitsCstPHIToNonGenericReg)9558f843a5SMatt Arsenault TEST_F(AArch64GISelMITest, TestKnownBitsCstPHIToNonGenericReg) {
965d87b5d2SQuentin Colombet StringRef MIRString = " bb.10:\n"
975d87b5d2SQuentin Colombet " %10:gpr32 = MOVi32imm 3\n"
985d87b5d2SQuentin Colombet " %11:_(s1) = G_IMPLICIT_DEF\n"
995d87b5d2SQuentin Colombet " G_BRCOND %11(s1), %bb.11\n"
1005d87b5d2SQuentin Colombet " G_BR %bb.12\n"
1015d87b5d2SQuentin Colombet "\n"
1025d87b5d2SQuentin Colombet " bb.11:\n"
1035d87b5d2SQuentin Colombet " %12:_(s8) = G_CONSTANT i8 2\n"
1045d87b5d2SQuentin Colombet " G_BR %bb.12\n"
1055d87b5d2SQuentin Colombet "\n"
1065d87b5d2SQuentin Colombet " bb.12:\n"
1075d87b5d2SQuentin Colombet " %13:_(s8) = PHI %10, %bb.10, %12(s8), %bb.11\n"
1085d87b5d2SQuentin Colombet " %14:_(s8) = COPY %13\n";
10942a84d22SDaniel Sanders setUp(MIRString);
1105d87b5d2SQuentin Colombet if (!TM)
1117fc87159SPaul Robinson GTEST_SKIP();
1125d87b5d2SQuentin Colombet Register CopyReg = Copies[Copies.size() - 1];
1135d87b5d2SQuentin Colombet MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
1145d87b5d2SQuentin Colombet Register SrcReg = FinalCopy->getOperand(1).getReg();
1155d87b5d2SQuentin Colombet Register DstReg = FinalCopy->getOperand(0).getReg();
1165d87b5d2SQuentin Colombet GISelKnownBits Info(*MF);
1175d87b5d2SQuentin Colombet KnownBits Res = Info.getKnownBits(SrcReg);
1185d87b5d2SQuentin Colombet EXPECT_EQ((uint64_t)0, Res.One.getZExtValue());
1195d87b5d2SQuentin Colombet EXPECT_EQ((uint64_t)0, Res.Zero.getZExtValue());
1205d87b5d2SQuentin Colombet
1215d87b5d2SQuentin Colombet KnownBits Res2 = Info.getKnownBits(DstReg);
1225d87b5d2SQuentin Colombet EXPECT_EQ(Res.One.getZExtValue(), Res2.One.getZExtValue());
1235d87b5d2SQuentin Colombet EXPECT_EQ(Res.Zero.getZExtValue(), Res2.Zero.getZExtValue());
1245d87b5d2SQuentin Colombet }
1255d87b5d2SQuentin Colombet
126e4a9225fSQuentin Colombet // Check that we know nothing when at least one value of a PHI
127e4a9225fSQuentin Colombet // comes from something we cannot analysis.
128e4a9225fSQuentin Colombet // This test is not particularly interesting, it is just
129e4a9225fSQuentin Colombet // here to cover the code that stops the analysis of PHIs
130e4a9225fSQuentin Colombet // earlier. In that case, we would not even look at the
131e4a9225fSQuentin Colombet // second incoming value.
TEST_F(AArch64GISelMITest,TestKnownBitsUnknownPHI)13258f843a5SMatt Arsenault TEST_F(AArch64GISelMITest, TestKnownBitsUnknownPHI) {
133e4a9225fSQuentin Colombet StringRef MIRString =
134e4a9225fSQuentin Colombet " bb.10:\n"
135e4a9225fSQuentin Colombet " %10:_(s64) = COPY %0\n"
136e4a9225fSQuentin Colombet " %11:_(s1) = G_IMPLICIT_DEF\n"
137e4a9225fSQuentin Colombet " G_BRCOND %11(s1), %bb.11\n"
138e4a9225fSQuentin Colombet " G_BR %bb.12\n"
139e4a9225fSQuentin Colombet "\n"
140e4a9225fSQuentin Colombet " bb.11:\n"
141e4a9225fSQuentin Colombet " %12:_(s64) = G_CONSTANT i64 2\n"
142e4a9225fSQuentin Colombet " G_BR %bb.12\n"
143e4a9225fSQuentin Colombet "\n"
144e4a9225fSQuentin Colombet " bb.12:\n"
145e4a9225fSQuentin Colombet " %13:_(s64) = PHI %10(s64), %bb.10, %12(s64), %bb.11\n"
146e4a9225fSQuentin Colombet " %14:_(s64) = COPY %13\n";
14742a84d22SDaniel Sanders setUp(MIRString);
148e4a9225fSQuentin Colombet if (!TM)
1497fc87159SPaul Robinson GTEST_SKIP();
150e4a9225fSQuentin Colombet Register CopyReg = Copies[Copies.size() - 1];
151e4a9225fSQuentin Colombet MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
152e4a9225fSQuentin Colombet Register SrcReg = FinalCopy->getOperand(1).getReg();
153e4a9225fSQuentin Colombet Register DstReg = FinalCopy->getOperand(0).getReg();
154e4a9225fSQuentin Colombet GISelKnownBits Info(*MF);
155e4a9225fSQuentin Colombet KnownBits Res = Info.getKnownBits(SrcReg);
156e4a9225fSQuentin Colombet EXPECT_EQ((uint64_t)0, Res.One.getZExtValue());
157e4a9225fSQuentin Colombet EXPECT_EQ((uint64_t)0, Res.Zero.getZExtValue());
158e4a9225fSQuentin Colombet
159e4a9225fSQuentin Colombet KnownBits Res2 = Info.getKnownBits(DstReg);
160e4a9225fSQuentin Colombet EXPECT_EQ(Res.One.getZExtValue(), Res2.One.getZExtValue());
161e4a9225fSQuentin Colombet EXPECT_EQ(Res.Zero.getZExtValue(), Res2.Zero.getZExtValue());
162e4a9225fSQuentin Colombet }
163e4a9225fSQuentin Colombet
1645d87b5d2SQuentin Colombet // Check that we manage to process PHIs that loop on themselves.
1655d87b5d2SQuentin Colombet // For now, the analysis just stops and assumes it knows nothing,
1665d87b5d2SQuentin Colombet // eventually we could teach it how to properly track phis that
1675d87b5d2SQuentin Colombet // loop back.
TEST_F(AArch64GISelMITest,TestKnownBitsCstPHIWithLoop)16858f843a5SMatt Arsenault TEST_F(AArch64GISelMITest, TestKnownBitsCstPHIWithLoop) {
1695d87b5d2SQuentin Colombet StringRef MIRString =
1705d87b5d2SQuentin Colombet " bb.10:\n"
1715d87b5d2SQuentin Colombet " %10:_(s8) = G_CONSTANT i8 3\n"
1725d87b5d2SQuentin Colombet " %11:_(s1) = G_IMPLICIT_DEF\n"
1735d87b5d2SQuentin Colombet " G_BRCOND %11(s1), %bb.11\n"
1745d87b5d2SQuentin Colombet " G_BR %bb.12\n"
1755d87b5d2SQuentin Colombet "\n"
1765d87b5d2SQuentin Colombet " bb.11:\n"
1775d87b5d2SQuentin Colombet " %12:_(s8) = G_CONSTANT i8 2\n"
1785d87b5d2SQuentin Colombet " G_BR %bb.12\n"
1795d87b5d2SQuentin Colombet "\n"
1805d87b5d2SQuentin Colombet " bb.12:\n"
1815d87b5d2SQuentin Colombet " %13:_(s8) = PHI %10(s8), %bb.10, %12(s8), %bb.11, %14(s8), %bb.12\n"
1825d87b5d2SQuentin Colombet " %14:_(s8) = COPY %13\n"
1835d87b5d2SQuentin Colombet " G_BR %bb.12\n";
18442a84d22SDaniel Sanders setUp(MIRString);
1855d87b5d2SQuentin Colombet if (!TM)
1867fc87159SPaul Robinson GTEST_SKIP();
1875d87b5d2SQuentin Colombet Register CopyReg = Copies[Copies.size() - 1];
1885d87b5d2SQuentin Colombet MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
1895d87b5d2SQuentin Colombet Register SrcReg = FinalCopy->getOperand(1).getReg();
1905d87b5d2SQuentin Colombet Register DstReg = FinalCopy->getOperand(0).getReg();
1915d87b5d2SQuentin Colombet GISelKnownBits Info(*MF);
1925d87b5d2SQuentin Colombet KnownBits Res = Info.getKnownBits(SrcReg);
1935d87b5d2SQuentin Colombet EXPECT_EQ((uint64_t)0, Res.One.getZExtValue());
1945d87b5d2SQuentin Colombet EXPECT_EQ((uint64_t)0, Res.Zero.getZExtValue());
1955d87b5d2SQuentin Colombet
1965d87b5d2SQuentin Colombet KnownBits Res2 = Info.getKnownBits(DstReg);
1975d87b5d2SQuentin Colombet EXPECT_EQ(Res.One.getZExtValue(), Res2.One.getZExtValue());
1985d87b5d2SQuentin Colombet EXPECT_EQ(Res.Zero.getZExtValue(), Res2.Zero.getZExtValue());
1995d87b5d2SQuentin Colombet }
2005d87b5d2SQuentin Colombet
2015bf0023bSQuentin Colombet // Check that we don't try to analysis PHIs progression.
2025bf0023bSQuentin Colombet // Setting a deep enough max depth would allow to effectively simulate
2035bf0023bSQuentin Colombet // what happens in the loop.
2045bf0023bSQuentin Colombet // Thus, with a deep enough depth, we could actually figure out
2055bf0023bSQuentin Colombet // that %14's zero known bits are actually at least what we know
2065bf0023bSQuentin Colombet // for %10, right shifted by one.
2075bf0023bSQuentin Colombet // However, this process is super expensive compile-time wise and
2085bf0023bSQuentin Colombet // we don't want to reach that conclusion while playing with max depth.
2095bf0023bSQuentin Colombet // For now, the analysis just stops and assumes it knows nothing
2105bf0023bSQuentin Colombet // on PHIs, but eventually we could teach it how to properly track
2115bf0023bSQuentin Colombet // phis that loop back without relying on the luck effect of max
2125bf0023bSQuentin Colombet // depth.
TEST_F(AArch64GISelMITest,TestKnownBitsDecreasingCstPHIWithLoop)21358f843a5SMatt Arsenault TEST_F(AArch64GISelMITest, TestKnownBitsDecreasingCstPHIWithLoop) {
2145bf0023bSQuentin Colombet StringRef MIRString = " bb.10:\n"
2155bf0023bSQuentin Colombet " %10:_(s8) = G_CONSTANT i8 5\n"
2165bf0023bSQuentin Colombet " %11:_(s8) = G_CONSTANT i8 1\n"
2175bf0023bSQuentin Colombet "\n"
2185bf0023bSQuentin Colombet " bb.12:\n"
2195bf0023bSQuentin Colombet " %13:_(s8) = PHI %10(s8), %bb.10, %14(s8), %bb.12\n"
2205bf0023bSQuentin Colombet " %14:_(s8) = G_LSHR %13, %11\n"
2215bf0023bSQuentin Colombet " %15:_(s8) = COPY %14\n"
2225bf0023bSQuentin Colombet " G_BR %bb.12\n";
22342a84d22SDaniel Sanders setUp(MIRString);
2245bf0023bSQuentin Colombet if (!TM)
2257fc87159SPaul Robinson GTEST_SKIP();
2265bf0023bSQuentin Colombet Register CopyReg = Copies[Copies.size() - 1];
2275bf0023bSQuentin Colombet MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
2285bf0023bSQuentin Colombet Register SrcReg = FinalCopy->getOperand(1).getReg();
2295bf0023bSQuentin Colombet Register DstReg = FinalCopy->getOperand(0).getReg();
2305bf0023bSQuentin Colombet GISelKnownBits Info(*MF, /*MaxDepth=*/24);
2315bf0023bSQuentin Colombet KnownBits Res = Info.getKnownBits(SrcReg);
2325bf0023bSQuentin Colombet EXPECT_EQ((uint64_t)0, Res.One.getZExtValue());
2335bf0023bSQuentin Colombet // A single iteration on the PHI (%13) gives:
2345bf0023bSQuentin Colombet // %10 has known zero of 0xFA
2355bf0023bSQuentin Colombet // %12 has known zero of 0x80 (we shift right by one so high bit is zero)
2365bf0023bSQuentin Colombet // Therefore, %14's known zero are 0x80 shifted by one 0xC0.
2375bf0023bSQuentin Colombet // If we had simulated the loop we could have more zero bits, basically
2385bf0023bSQuentin Colombet // up to 0xFC (count leading zero of 5, + 1).
2395bf0023bSQuentin Colombet EXPECT_EQ((uint64_t)0xC0, Res.Zero.getZExtValue());
2405bf0023bSQuentin Colombet
2415bf0023bSQuentin Colombet KnownBits Res2 = Info.getKnownBits(DstReg);
2425bf0023bSQuentin Colombet EXPECT_EQ(Res.One.getZExtValue(), Res2.One.getZExtValue());
2435bf0023bSQuentin Colombet EXPECT_EQ(Res.Zero.getZExtValue(), Res2.Zero.getZExtValue());
2445bf0023bSQuentin Colombet }
2455bf0023bSQuentin Colombet
TEST_F(AArch64GISelMITest,TestKnownBitsPtrToIntViceVersa)24658f843a5SMatt Arsenault TEST_F(AArch64GISelMITest, TestKnownBitsPtrToIntViceVersa) {
24755371e69SAditya Nandakumar StringRef MIRString = " %3:_(s16) = G_CONSTANT i16 256\n"
24855371e69SAditya Nandakumar " %4:_(p0) = G_INTTOPTR %3\n"
24955371e69SAditya Nandakumar " %5:_(s32) = G_PTRTOINT %4\n"
25055371e69SAditya Nandakumar " %6:_(s32) = COPY %5\n";
25142a84d22SDaniel Sanders setUp(MIRString);
25255371e69SAditya Nandakumar if (!TM)
2537fc87159SPaul Robinson GTEST_SKIP();
25455371e69SAditya Nandakumar unsigned CopyReg = Copies[Copies.size() - 1];
25555371e69SAditya Nandakumar MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
25655371e69SAditya Nandakumar unsigned SrcReg = FinalCopy->getOperand(1).getReg();
25755371e69SAditya Nandakumar GISelKnownBits Info(*MF);
25855371e69SAditya Nandakumar KnownBits Res = Info.getKnownBits(SrcReg);
25955371e69SAditya Nandakumar EXPECT_EQ(256u, Res.One.getZExtValue());
26055371e69SAditya Nandakumar EXPECT_EQ(0xfffffeffu, Res.Zero.getZExtValue());
26155371e69SAditya Nandakumar }
262d7834556SPetar Avramovic
TEST_F(AArch64GISelMITest,TestKnownBitsAND)263d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsAND) {
264d7834556SPetar Avramovic StringRef MIRString = R"(
265d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF
266fae05692SMatt Arsenault %unknown:_(s8) = G_LOAD %ptr(p0) :: (load (s8))
267d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 52
268d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 10
269d7834556SPetar Avramovic %tmp0:_(s8) = G_AND %unknown, %mask0
270d7834556SPetar Avramovic %val0:_(s8) = G_OR %tmp0, %mask1
271d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 32
272d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 24
273d7834556SPetar Avramovic %tmp1:_(s8) = G_AND %unknown, %mask2
274d7834556SPetar Avramovic %val1:_(s8) = G_OR %tmp1, %mask3
275d7834556SPetar Avramovic %and:_(s8) = G_AND %val0, %val1
276d7834556SPetar Avramovic %copy_and:_(s8) = COPY %and
277d7834556SPetar Avramovic )";
278d7834556SPetar Avramovic
27942a84d22SDaniel Sanders setUp(MIRString);
280d7834556SPetar Avramovic if (!TM)
2817fc87159SPaul Robinson GTEST_SKIP();
282d7834556SPetar Avramovic
283d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1];
284d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
285d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg();
286d7834556SPetar Avramovic GISelKnownBits Info(*MF);
287d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg);
288d7834556SPetar Avramovic // 00??1?10
289d7834556SPetar Avramovic // & 00?11000
290d7834556SPetar Avramovic // = 00??1000
291d7834556SPetar Avramovic EXPECT_EQ(0x08u, Res.One.getZExtValue());
292d7834556SPetar Avramovic EXPECT_EQ(0xC7u, Res.Zero.getZExtValue());
293d7834556SPetar Avramovic }
294d7834556SPetar Avramovic
TEST_F(AArch64GISelMITest,TestKnownBitsOR)295d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsOR) {
296d7834556SPetar Avramovic StringRef MIRString = R"(
297d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF
298fae05692SMatt Arsenault %unknown:_(s8) = G_LOAD %ptr(p0) :: (load (s8))
299d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 52
300d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 10
301d7834556SPetar Avramovic %tmp0:_(s8) = G_AND %unknown, %mask0
302d7834556SPetar Avramovic %val0:_(s8) = G_OR %tmp0, %mask1
303d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 32
304d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 24
305d7834556SPetar Avramovic %tmp1:_(s8) = G_AND %unknown, %mask2
306d7834556SPetar Avramovic %val1:_(s8) = G_OR %tmp1, %mask3
307d7834556SPetar Avramovic %or:_(s8) = G_OR %val0, %val1
308d7834556SPetar Avramovic %copy_or:_(s8) = COPY %or
309d7834556SPetar Avramovic )";
310d7834556SPetar Avramovic
31142a84d22SDaniel Sanders setUp(MIRString);
312d7834556SPetar Avramovic if (!TM)
3137fc87159SPaul Robinson GTEST_SKIP();
314d7834556SPetar Avramovic
315d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1];
316d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
317d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg();
318d7834556SPetar Avramovic GISelKnownBits Info(*MF);
319d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg);
320d7834556SPetar Avramovic // 00??1?10
321d7834556SPetar Avramovic // | 00?11000
322d7834556SPetar Avramovic // = 00?11?10
323d7834556SPetar Avramovic EXPECT_EQ(0x1Au, Res.One.getZExtValue());
324d7834556SPetar Avramovic EXPECT_EQ(0xC1u, Res.Zero.getZExtValue());
325d7834556SPetar Avramovic }
326d7834556SPetar Avramovic
TEST_F(AArch64GISelMITest,TestKnownBitsXOR)32758f843a5SMatt Arsenault TEST_F(AArch64GISelMITest, TestKnownBitsXOR) {
328d7834556SPetar Avramovic StringRef MIRString = R"(
329d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF
330fae05692SMatt Arsenault %unknown:_(s8) = G_LOAD %ptr(p0) :: (load (s8))
331d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 52
332d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 10
333d7834556SPetar Avramovic %tmp0:_(s8) = G_AND %unknown, %mask0
334d7834556SPetar Avramovic %val0:_(s8) = G_OR %tmp0, %mask1
335d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 32
336d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 24
337d7834556SPetar Avramovic %tmp1:_(s8) = G_AND %unknown, %mask2
338d7834556SPetar Avramovic %val1:_(s8) = G_OR %tmp1, %mask3
339d7834556SPetar Avramovic %xor:_(s8) = G_XOR %val0, %val1
340d7834556SPetar Avramovic %copy_xor:_(s8) = COPY %xor
341d7834556SPetar Avramovic )";
342d7834556SPetar Avramovic
34342a84d22SDaniel Sanders setUp(MIRString);
344d7834556SPetar Avramovic if (!TM)
3457fc87159SPaul Robinson GTEST_SKIP();
346d7834556SPetar Avramovic
347d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1];
348d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
349d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg();
350d7834556SPetar Avramovic GISelKnownBits Info(*MF);
351d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg);
352d7834556SPetar Avramovic // Xor KnowBits does not track if we are doing xor of unknown bit with itself
353d7834556SPetar Avramovic // or negated itself.
354d7834556SPetar Avramovic // 00??1?10
355d7834556SPetar Avramovic // ^ 00?11000
356d7834556SPetar Avramovic // = 00??0?10
357d7834556SPetar Avramovic EXPECT_EQ(0x02u, Res.One.getZExtValue());
358d7834556SPetar Avramovic EXPECT_EQ(0xC9u, Res.Zero.getZExtValue());
359d7834556SPetar Avramovic }
360d7834556SPetar Avramovic
TEST_F(AArch64GISelMITest,TestKnownBitsXORConstant)361d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsXORConstant) {
36270fdfed4SAditya Nandakumar StringRef MIRString = " %3:_(s8) = G_CONSTANT i8 4\n"
36370fdfed4SAditya Nandakumar " %4:_(s8) = G_CONSTANT i8 7\n"
36470fdfed4SAditya Nandakumar " %5:_(s8) = G_XOR %3, %4\n"
36570fdfed4SAditya Nandakumar " %6:_(s8) = COPY %5\n";
36642a84d22SDaniel Sanders setUp(MIRString);
36770fdfed4SAditya Nandakumar if (!TM)
3687fc87159SPaul Robinson GTEST_SKIP();
36970fdfed4SAditya Nandakumar unsigned CopyReg = Copies[Copies.size() - 1];
37070fdfed4SAditya Nandakumar MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
37170fdfed4SAditya Nandakumar unsigned SrcReg = FinalCopy->getOperand(1).getReg();
37270fdfed4SAditya Nandakumar GISelKnownBits Info(*MF);
37370fdfed4SAditya Nandakumar KnownBits Res = Info.getKnownBits(SrcReg);
37470fdfed4SAditya Nandakumar EXPECT_EQ(3u, Res.One.getZExtValue());
37570fdfed4SAditya Nandakumar EXPECT_EQ(252u, Res.Zero.getZExtValue());
37670fdfed4SAditya Nandakumar }
377c8ac029dSAditya Nandakumar
TEST_F(AArch64GISelMITest,TestKnownBitsASHR)378d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsASHR) {
379d7834556SPetar Avramovic StringRef MIRString = R"(
380d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF
381fae05692SMatt Arsenault %unknown:_(s8) = G_LOAD %ptr(p0) :: (load (s8))
382d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 38
383d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 202
384d7834556SPetar Avramovic %tmp0:_(s8) = G_AND %unknown, %mask0
385d7834556SPetar Avramovic %val0:_(s8) = G_OR %tmp0, %mask1
386d7834556SPetar Avramovic %cst0:_(s8) = G_CONSTANT i8 2
387d7834556SPetar Avramovic %ashr0:_(s8) = G_ASHR %val0, %cst0
388d7834556SPetar Avramovic %copy_ashr0:_(s8) = COPY %ashr0
389d7834556SPetar Avramovic
390d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 204
391d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 18
392d7834556SPetar Avramovic %tmp1:_(s8) = G_AND %unknown, %mask2
393d7834556SPetar Avramovic %val1:_(s8) = G_OR %tmp1, %mask3
394d7834556SPetar Avramovic %ashr1:_(s8) = G_ASHR %val1, %cst0
395d7834556SPetar Avramovic %copy_ashr1:_(s8) = COPY %ashr1
396d7834556SPetar Avramovic )";
397d7834556SPetar Avramovic
39842a84d22SDaniel Sanders setUp(MIRString);
399d7834556SPetar Avramovic if (!TM)
4007fc87159SPaul Robinson GTEST_SKIP();
401d7834556SPetar Avramovic
402d7834556SPetar Avramovic Register CopyReg0 = Copies[Copies.size() - 2];
403d7834556SPetar Avramovic MachineInstr *FinalCopy0 = MRI->getVRegDef(CopyReg0);
404d7834556SPetar Avramovic Register SrcReg0 = FinalCopy0->getOperand(1).getReg();
405d7834556SPetar Avramovic GISelKnownBits Info(*MF);
406d7834556SPetar Avramovic KnownBits Res0 = Info.getKnownBits(SrcReg0);
407d7834556SPetar Avramovic // 11?01??0 >> 2
408d7834556SPetar Avramovic // = 1111?01?
409d7834556SPetar Avramovic EXPECT_EQ(0xF2u, Res0.One.getZExtValue());
410d7834556SPetar Avramovic EXPECT_EQ(0x04u, Res0.Zero.getZExtValue());
411d7834556SPetar Avramovic
412d7834556SPetar Avramovic Register CopyReg1 = Copies[Copies.size() - 1];
413d7834556SPetar Avramovic MachineInstr *FinalCopy1 = MRI->getVRegDef(CopyReg1);
414d7834556SPetar Avramovic Register SrcReg1 = FinalCopy1->getOperand(1).getReg();
415d7834556SPetar Avramovic KnownBits Res1 = Info.getKnownBits(SrcReg1);
416d7834556SPetar Avramovic // ??01??10 >> 2
417d7834556SPetar Avramovic // = ????01??
418d7834556SPetar Avramovic EXPECT_EQ(0x04u, Res1.One.getZExtValue());
419d7834556SPetar Avramovic EXPECT_EQ(0x08u, Res1.Zero.getZExtValue());
420d7834556SPetar Avramovic }
421d7834556SPetar Avramovic
TEST_F(AArch64GISelMITest,TestKnownBitsLSHR)422d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsLSHR) {
423d7834556SPetar Avramovic StringRef MIRString = R"(
424d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF
425fae05692SMatt Arsenault %unknown:_(s8) = G_LOAD %ptr(p0) :: (load (s8))
426d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 38
427d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 202
428d7834556SPetar Avramovic %tmp0:_(s8) = G_AND %unknown, %mask0
429d7834556SPetar Avramovic %val0:_(s8) = G_OR %tmp0, %mask1
430d7834556SPetar Avramovic %cst0:_(s8) = G_CONSTANT i8 2
431d7834556SPetar Avramovic %lshr0:_(s8) = G_LSHR %val0, %cst0
432d7834556SPetar Avramovic %copy_lshr0:_(s8) = COPY %lshr0
433d7834556SPetar Avramovic
434d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 204
435d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 18
436d7834556SPetar Avramovic %tmp1:_(s8) = G_AND %unknown, %mask2
437d7834556SPetar Avramovic %val1:_(s8) = G_OR %tmp1, %mask3
438d7834556SPetar Avramovic %lshr1:_(s8) = G_LSHR %val1, %cst0
439d7834556SPetar Avramovic %copy_lshr1:_(s8) = COPY %lshr1
440d7834556SPetar Avramovic )";
441d7834556SPetar Avramovic
44242a84d22SDaniel Sanders setUp(MIRString);
443d7834556SPetar Avramovic if (!TM)
4447fc87159SPaul Robinson GTEST_SKIP();
445d7834556SPetar Avramovic
446d7834556SPetar Avramovic Register CopyReg0 = Copies[Copies.size() - 2];
447d7834556SPetar Avramovic MachineInstr *FinalCopy0 = MRI->getVRegDef(CopyReg0);
448d7834556SPetar Avramovic Register SrcReg0 = FinalCopy0->getOperand(1).getReg();
449d7834556SPetar Avramovic GISelKnownBits Info(*MF);
450d7834556SPetar Avramovic KnownBits Res0 = Info.getKnownBits(SrcReg0);
451d7834556SPetar Avramovic // 11?01??0 >> 2
452d7834556SPetar Avramovic // = 0011?01?
453d7834556SPetar Avramovic EXPECT_EQ(0x32u, Res0.One.getZExtValue());
454d7834556SPetar Avramovic EXPECT_EQ(0xC4u, Res0.Zero.getZExtValue());
455d7834556SPetar Avramovic
456d7834556SPetar Avramovic Register CopyReg1 = Copies[Copies.size() - 1];
457d7834556SPetar Avramovic MachineInstr *FinalCopy1 = MRI->getVRegDef(CopyReg1);
458d7834556SPetar Avramovic Register SrcReg1 = FinalCopy1->getOperand(1).getReg();
459d7834556SPetar Avramovic KnownBits Res1 = Info.getKnownBits(SrcReg1);
460d7834556SPetar Avramovic // ??01??10 >> 2
461d7834556SPetar Avramovic // = 00??01??
462d7834556SPetar Avramovic EXPECT_EQ(0x04u, Res1.One.getZExtValue());
463d7834556SPetar Avramovic EXPECT_EQ(0xC8u, Res1.Zero.getZExtValue());
464d7834556SPetar Avramovic }
465d7834556SPetar Avramovic
TEST_F(AArch64GISelMITest,TestKnownBitsSHL)466d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsSHL) {
467d7834556SPetar Avramovic StringRef MIRString = R"(
468d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF
469fae05692SMatt Arsenault %unknown:_(s8) = G_LOAD %ptr(p0) :: (load (s8))
470d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 51
471d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 72
472d7834556SPetar Avramovic %tmp:_(s8) = G_AND %unknown, %mask0
473d7834556SPetar Avramovic %val:_(s8) = G_OR %tmp, %mask1
474d7834556SPetar Avramovic %cst:_(s8) = G_CONSTANT i8 3
475d7834556SPetar Avramovic %shl:_(s8) = G_SHL %val, %cst
476d7834556SPetar Avramovic %copy_shl:_(s8) = COPY %shl
477d7834556SPetar Avramovic )";
478d7834556SPetar Avramovic
47942a84d22SDaniel Sanders setUp(MIRString);
480d7834556SPetar Avramovic if (!TM)
4817fc87159SPaul Robinson GTEST_SKIP();
482d7834556SPetar Avramovic
483d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1];
484d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
485d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg();
486d7834556SPetar Avramovic GISelKnownBits Info(*MF);
487d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg);
488d7834556SPetar Avramovic // 01??10?? << 3
489d7834556SPetar Avramovic // = ?10??000
490d7834556SPetar Avramovic EXPECT_EQ(0x40u, Res.One.getZExtValue());
491d7834556SPetar Avramovic EXPECT_EQ(0x27u, Res.Zero.getZExtValue());
492d7834556SPetar Avramovic }
493d7834556SPetar Avramovic
TEST_F(AArch64GISelMITest,TestKnownBitsADD)494d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsADD) {
495d7834556SPetar Avramovic StringRef MIRString = R"(
496d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF
497fae05692SMatt Arsenault %unknown:_(s16) = G_LOAD %ptr(p0) :: (load (s16))
498d7834556SPetar Avramovic %mask0:_(s16) = G_CONSTANT i16 4642
499d7834556SPetar Avramovic %mask1:_(s16) = G_CONSTANT i16 9536
500d7834556SPetar Avramovic %tmp0:_(s16) = G_AND %unknown, %mask0
501d7834556SPetar Avramovic %val0:_(s16) = G_OR %tmp0, %mask1
502d7834556SPetar Avramovic %mask2:_(s16) = G_CONSTANT i16 4096
503d7834556SPetar Avramovic %mask3:_(s16) = G_CONSTANT i16 371
504d7834556SPetar Avramovic %tmp1:_(s16) = G_AND %unknown, %mask2
505d7834556SPetar Avramovic %val1:_(s16) = G_OR %tmp1, %mask3
506d7834556SPetar Avramovic %add:_(s16) = G_ADD %val0, %val1
507d7834556SPetar Avramovic %copy_add:_(s16) = COPY %add
508d7834556SPetar Avramovic )";
509d7834556SPetar Avramovic
51042a84d22SDaniel Sanders setUp(MIRString);
511d7834556SPetar Avramovic if (!TM)
5127fc87159SPaul Robinson GTEST_SKIP();
513d7834556SPetar Avramovic
514d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1];
515d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
516d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg();
517d7834556SPetar Avramovic GISelKnownBits Info(*MF);
518d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg);
519d7834556SPetar Avramovic // Add KnowBits works out known carry bits first and then calculates result.
520d7834556SPetar Avramovic // 001?01?101?000?0
521d7834556SPetar Avramovic // + 000?000101110011
522d7834556SPetar Avramovic // = 0??????01??10??1
523d7834556SPetar Avramovic EXPECT_EQ(0x0091u, Res.One.getZExtValue());
524d7834556SPetar Avramovic EXPECT_EQ(0x8108u, Res.Zero.getZExtValue());
525d7834556SPetar Avramovic }
526d7834556SPetar Avramovic
TEST_F(AArch64GISelMITest,TestKnownBitsSUB)527d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsSUB) {
528d7834556SPetar Avramovic StringRef MIRString = R"(
529d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF
530fae05692SMatt Arsenault %unknown:_(s16) = G_LOAD %ptr(p0) :: (load (s16))
531d7834556SPetar Avramovic %mask0:_(s16) = G_CONSTANT i16 4642
532d7834556SPetar Avramovic %mask1:_(s16) = G_CONSTANT i16 9536
533d7834556SPetar Avramovic %tmp0:_(s16) = G_AND %unknown, %mask0
534d7834556SPetar Avramovic %val0:_(s16) = G_OR %tmp0, %mask1
535d7834556SPetar Avramovic %mask2:_(s16) = G_CONSTANT i16 4096
536d7834556SPetar Avramovic %mask3:_(s16) = G_CONSTANT i16 371
537d7834556SPetar Avramovic %tmp1:_(s16) = G_AND %unknown, %mask2
538d7834556SPetar Avramovic %val1:_(s16) = G_OR %tmp1, %mask3
539d7834556SPetar Avramovic %sub:_(s16) = G_SUB %val0, %val1
540d7834556SPetar Avramovic %copy_sub:_(s16) = COPY %sub
541d7834556SPetar Avramovic )";
542d7834556SPetar Avramovic
54342a84d22SDaniel Sanders setUp(MIRString);
544d7834556SPetar Avramovic if (!TM)
5457fc87159SPaul Robinson GTEST_SKIP();
546d7834556SPetar Avramovic
547d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1];
548d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
549d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg();
550d7834556SPetar Avramovic GISelKnownBits Info(*MF);
551d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg);
552d7834556SPetar Avramovic // Sub KnowBits for LHS - RHS use Add KnownBits for LHS + ~RHS + 1.
553d7834556SPetar Avramovic EXPECT_EQ(0x01CDu, Res.One.getZExtValue());
554d7834556SPetar Avramovic EXPECT_EQ(0xC810u, Res.Zero.getZExtValue());
555d7834556SPetar Avramovic }
556d7834556SPetar Avramovic
TEST_F(AArch64GISelMITest,TestKnownBitsMUL)557d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsMUL) {
558d7834556SPetar Avramovic StringRef MIRString = R"(
559d7834556SPetar Avramovic %ptr0:_(p0) = G_IMPLICIT_DEF
560fae05692SMatt Arsenault %load0:_(s16) = G_LOAD %ptr0(p0) :: (load (s16))
561d7834556SPetar Avramovic %mask0:_(s16) = G_CONSTANT i16 4
562d7834556SPetar Avramovic %mask1:_(s16) = G_CONSTANT i16 18
563d7834556SPetar Avramovic %tmp:_(s16) = G_AND %load0, %mask0
564d7834556SPetar Avramovic %val0:_(s16) = G_OR %tmp, %mask1
565d7834556SPetar Avramovic %cst:_(s16) = G_CONSTANT i16 12
566d7834556SPetar Avramovic %mul:_(s16) = G_MUL %val0, %cst
567d7834556SPetar Avramovic %copy_mul:_(s16) = COPY %mul
568d7834556SPetar Avramovic )";
569d7834556SPetar Avramovic
57042a84d22SDaniel Sanders setUp(MIRString);
571d7834556SPetar Avramovic if (!TM)
5727fc87159SPaul Robinson GTEST_SKIP();
573d7834556SPetar Avramovic
574d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1];
575d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
576d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg();
577d7834556SPetar Avramovic GISelKnownBits Info(*MF);
578d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg);
579d7834556SPetar Avramovic // Mul KnowBits are conservatively correct, but not guaranteed to be precise.
580d7834556SPetar Avramovic // Precise for trailing bits up to the first unknown bit.
581d7834556SPetar Avramovic // 00010?10 * 00001100 =
582d7834556SPetar Avramovic // 00010?1000
583d7834556SPetar Avramovic // + 00010?10000
584d7834556SPetar Avramovic // = 0000000010??1000
585d7834556SPetar Avramovic // KB 0000000?????1000
586d7834556SPetar Avramovic EXPECT_EQ(0x0008u, Res.One.getZExtValue());
587d7834556SPetar Avramovic EXPECT_EQ(0xFE07u, Res.Zero.getZExtValue());
588d7834556SPetar Avramovic }
589d7834556SPetar Avramovic
TEST_F(AArch64GISelMITest,TestKnownBitsICMP)590d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsICMP) {
591d7834556SPetar Avramovic StringRef MIRString = R"(
592d7834556SPetar Avramovic %cst0:_(s32) = G_CONSTANT i32 0
593d7834556SPetar Avramovic %cst1:_(s32) = G_CONSTANT i32 1
594d7834556SPetar Avramovic %icmp:_(s32) = G_ICMP intpred(ne), %cst0, %cst1
595d7834556SPetar Avramovic %copy_icmp:_(s32) = COPY %icmp
596d7834556SPetar Avramovic )";
597d7834556SPetar Avramovic
59842a84d22SDaniel Sanders setUp(MIRString);
599d7834556SPetar Avramovic if (!TM)
6007fc87159SPaul Robinson GTEST_SKIP();
601d7834556SPetar Avramovic
602d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1];
603d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
604d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg();
605d7834556SPetar Avramovic GISelKnownBits Info(*MF);
606d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg);
607d7834556SPetar Avramovic // For targets that use 0 or 1 as icmp result in large register set high bits
608d7834556SPetar Avramovic // to 0, does not analyze operands/compare predicate.
609d7834556SPetar Avramovic EXPECT_EQ(0x00000000u, Res.One.getZExtValue());
610d7834556SPetar Avramovic EXPECT_EQ(0xFFFFFFFEu, Res.Zero.getZExtValue());
611d7834556SPetar Avramovic }
612d7834556SPetar Avramovic
TEST_F(AArch64GISelMITest,TestKnownBitsFCMP)613d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsFCMP) {
614d7834556SPetar Avramovic StringRef MIRString = R"(
615d7834556SPetar Avramovic %cst0:_(s32) = G_FCONSTANT float 0.0
616d7834556SPetar Avramovic %cst1:_(s32) = G_FCONSTANT float 1.0
617d7834556SPetar Avramovic %fcmp:_(s32) = G_FCMP floatpred(one), %cst0, %cst1
618d7834556SPetar Avramovic %copy_fcmp:_(s32) = COPY %fcmp
619d7834556SPetar Avramovic )";
620d7834556SPetar Avramovic
62142a84d22SDaniel Sanders setUp(MIRString);
622d7834556SPetar Avramovic if (!TM)
6237fc87159SPaul Robinson GTEST_SKIP();
624d7834556SPetar Avramovic
625d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1];
626d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
627d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg();
628d7834556SPetar Avramovic GISelKnownBits Info(*MF);
629d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg);
630d7834556SPetar Avramovic // For targets that use 0 or 1 as fcmp result in large register set high bits
631d7834556SPetar Avramovic // to 0, does not analyze operands/compare predicate.
632d7834556SPetar Avramovic EXPECT_EQ(0x00000000u, Res.One.getZExtValue());
633d7834556SPetar Avramovic EXPECT_EQ(0xFFFFFFFEu, Res.Zero.getZExtValue());
634d7834556SPetar Avramovic }
635d7834556SPetar Avramovic
TEST_F(AArch64GISelMITest,TestKnownBitsSelect)636d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsSelect) {
637d7834556SPetar Avramovic StringRef MIRString = R"(
638d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF
639fae05692SMatt Arsenault %unknown:_(s8) = G_LOAD %ptr(p0) :: (load (s8))
640d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 24
641d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 224
642d7834556SPetar Avramovic %tmp0:_(s8) = G_AND %unknown, %mask0
643d7834556SPetar Avramovic %val0:_(s8) = G_OR %tmp0, %mask1
644d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 146
645d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 36
646d7834556SPetar Avramovic %tmp1:_(s8) = G_AND %unknown, %mask2
647d7834556SPetar Avramovic %val1:_(s8) = G_OR %tmp1, %mask3
648d7834556SPetar Avramovic %cond:_(s1) = G_CONSTANT i1 false
649d7834556SPetar Avramovic %select:_(s8) = G_SELECT %cond, %val0, %val1
650d7834556SPetar Avramovic %copy_select:_(s8) = COPY %select
651d7834556SPetar Avramovic )";
652d7834556SPetar Avramovic
65342a84d22SDaniel Sanders setUp(MIRString);
654d7834556SPetar Avramovic if (!TM)
6557fc87159SPaul Robinson GTEST_SKIP();
656d7834556SPetar Avramovic
657d7834556SPetar Avramovic Register CopyReg = Copies[Copies.size() - 1];
658d7834556SPetar Avramovic MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
659d7834556SPetar Avramovic Register SrcReg = FinalCopy->getOperand(1).getReg();
660d7834556SPetar Avramovic GISelKnownBits Info(*MF);
661d7834556SPetar Avramovic KnownBits Res = Info.getKnownBits(SrcReg);
662d7834556SPetar Avramovic // Select KnownBits takes common bits of LHS and RHS, does not analyze
663d7834556SPetar Avramovic // condition operand.
664d7834556SPetar Avramovic // 111??000
665d7834556SPetar Avramovic // select ?01?01?0
666d7834556SPetar Avramovic // = ??1????0
667d7834556SPetar Avramovic EXPECT_EQ(0x20u, Res.One.getZExtValue());
668d7834556SPetar Avramovic EXPECT_EQ(0x01u, Res.Zero.getZExtValue());
669d7834556SPetar Avramovic }
670d7834556SPetar Avramovic
TEST_F(AArch64GISelMITest,TestKnownBits)67158f843a5SMatt Arsenault TEST_F(AArch64GISelMITest, TestKnownBits) {
672c8ac029dSAditya Nandakumar
673c8ac029dSAditya Nandakumar StringRef MIR = " %3:_(s32) = G_TRUNC %0\n"
674c8ac029dSAditya Nandakumar " %4:_(s32) = G_TRUNC %1\n"
675c8ac029dSAditya Nandakumar " %5:_(s32) = G_CONSTANT i32 5\n"
676c8ac029dSAditya Nandakumar " %6:_(s32) = G_CONSTANT i32 24\n"
677c8ac029dSAditya Nandakumar " %7:_(s32) = G_CONSTANT i32 28\n"
678c8ac029dSAditya Nandakumar " %14:_(p0) = G_INTTOPTR %7\n"
679c8ac029dSAditya Nandakumar " %16:_(s32) = G_PTRTOINT %14\n"
680c8ac029dSAditya Nandakumar " %8:_(s32) = G_SHL %3, %5\n"
681c8ac029dSAditya Nandakumar " %9:_(s32) = G_SHL %4, %5\n"
682c8ac029dSAditya Nandakumar " %10:_(s32) = G_OR %8, %6\n"
683c8ac029dSAditya Nandakumar " %11:_(s32) = G_OR %9, %16\n"
684c8ac029dSAditya Nandakumar " %12:_(s32) = G_MUL %10, %11\n"
685c8ac029dSAditya Nandakumar " %13:_(s32) = COPY %12\n";
68642a84d22SDaniel Sanders setUp(MIR);
687c8ac029dSAditya Nandakumar if (!TM)
6887fc87159SPaul Robinson GTEST_SKIP();
689c8ac029dSAditya Nandakumar unsigned CopyReg = Copies[Copies.size() - 1];
690c8ac029dSAditya Nandakumar MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
691c8ac029dSAditya Nandakumar unsigned SrcReg = FinalCopy->getOperand(1).getReg();
692c8ac029dSAditya Nandakumar GISelKnownBits Info(*MF);
693c8ac029dSAditya Nandakumar KnownBits Known = Info.getKnownBits(SrcReg);
694c8ac029dSAditya Nandakumar EXPECT_FALSE(Known.hasConflict());
695b2576579SSimon Pilgrim EXPECT_EQ(32u, Known.One.getZExtValue());
696b2576579SSimon Pilgrim EXPECT_EQ(95u, Known.Zero.getZExtValue());
697c8ac029dSAditya Nandakumar APInt Zeroes = Info.getKnownZeroes(SrcReg);
698c8ac029dSAditya Nandakumar EXPECT_EQ(Known.Zero, Zeroes);
699c8ac029dSAditya Nandakumar }
700b2b9a237SMatt Arsenault
TEST_F(AArch64GISelMITest,TestSignBitIsZero)70158f843a5SMatt Arsenault TEST_F(AArch64GISelMITest, TestSignBitIsZero) {
70242a84d22SDaniel Sanders setUp();
703b2b9a237SMatt Arsenault if (!TM)
7047fc87159SPaul Robinson GTEST_SKIP();
705b2b9a237SMatt Arsenault
706b2b9a237SMatt Arsenault const LLT S32 = LLT::scalar(32);
70749036dd3SQuentin Colombet auto SignBit = B.buildConstant(S32, 0x80000000);
708b2b9a237SMatt Arsenault auto Zero = B.buildConstant(S32, 0);
709b2b9a237SMatt Arsenault
710b2b9a237SMatt Arsenault GISelKnownBits KnownBits(*MF);
711b2b9a237SMatt Arsenault
712b2b9a237SMatt Arsenault EXPECT_TRUE(KnownBits.signBitIsZero(Zero.getReg(0)));
713b2b9a237SMatt Arsenault EXPECT_FALSE(KnownBits.signBitIsZero(SignBit.getReg(0)));
714b2b9a237SMatt Arsenault }
7150b093f02SMatt Arsenault
TEST_F(AArch64GISelMITest,TestNumSignBitsConstant)71658f843a5SMatt Arsenault TEST_F(AArch64GISelMITest, TestNumSignBitsConstant) {
7170b093f02SMatt Arsenault StringRef MIRString = " %3:_(s8) = G_CONSTANT i8 1\n"
7180b093f02SMatt Arsenault " %4:_(s8) = COPY %3\n"
7190b093f02SMatt Arsenault
7200b093f02SMatt Arsenault " %5:_(s8) = G_CONSTANT i8 -1\n"
7210b093f02SMatt Arsenault " %6:_(s8) = COPY %5\n"
7220b093f02SMatt Arsenault
7230b093f02SMatt Arsenault " %7:_(s8) = G_CONSTANT i8 127\n"
7240b093f02SMatt Arsenault " %8:_(s8) = COPY %7\n"
7250b093f02SMatt Arsenault
7260b093f02SMatt Arsenault " %9:_(s8) = G_CONSTANT i8 32\n"
7270b093f02SMatt Arsenault " %10:_(s8) = COPY %9\n"
7280b093f02SMatt Arsenault
7290b093f02SMatt Arsenault " %11:_(s8) = G_CONSTANT i8 -32\n"
7300b093f02SMatt Arsenault " %12:_(s8) = COPY %11\n";
73142a84d22SDaniel Sanders setUp(MIRString);
7320b093f02SMatt Arsenault if (!TM)
7337fc87159SPaul Robinson GTEST_SKIP();
7340b093f02SMatt Arsenault Register CopyReg1 = Copies[Copies.size() - 5];
7350b093f02SMatt Arsenault Register CopyRegNeg1 = Copies[Copies.size() - 4];
7360b093f02SMatt Arsenault Register CopyReg127 = Copies[Copies.size() - 3];
7370b093f02SMatt Arsenault Register CopyReg32 = Copies[Copies.size() - 2];
7380b093f02SMatt Arsenault Register CopyRegNeg32 = Copies[Copies.size() - 1];
7390b093f02SMatt Arsenault
7400b093f02SMatt Arsenault GISelKnownBits Info(*MF);
7410b093f02SMatt Arsenault EXPECT_EQ(7u, Info.computeNumSignBits(CopyReg1));
7420b093f02SMatt Arsenault EXPECT_EQ(8u, Info.computeNumSignBits(CopyRegNeg1));
7430b093f02SMatt Arsenault EXPECT_EQ(1u, Info.computeNumSignBits(CopyReg127));
7440b093f02SMatt Arsenault EXPECT_EQ(2u, Info.computeNumSignBits(CopyReg32));
7450b093f02SMatt Arsenault EXPECT_EQ(3u, Info.computeNumSignBits(CopyRegNeg32));
7460b093f02SMatt Arsenault }
7470b093f02SMatt Arsenault
TEST_F(AArch64GISelMITest,TestNumSignBitsXOR)748*bf57d2e5Schuongg3 TEST_F(AArch64GISelMITest, TestNumSignBitsXOR) {
749*bf57d2e5Schuongg3 StringRef MIRString = " %c1:_(s8) = G_CONSTANT i8 1\n"
750*bf57d2e5Schuongg3 " %cn1:_(s8) = G_CONSTANT i8 -1\n"
751*bf57d2e5Schuongg3 " %c127:_(s8) = G_CONSTANT i8 127\n"
752*bf57d2e5Schuongg3 " %c32:_(s8) = G_CONSTANT i8 32\n"
753*bf57d2e5Schuongg3 " %cn32:_(s8) = G_CONSTANT i8 -32\n"
754*bf57d2e5Schuongg3
755*bf57d2e5Schuongg3 " %xor1:_(s8) = G_XOR %c1, %cn1\n"
756*bf57d2e5Schuongg3 " %Copy1:_(s8) = COPY %xor1\n"
757*bf57d2e5Schuongg3
758*bf57d2e5Schuongg3 " %xor2:_(s8) = G_XOR %c1, %c32\n"
759*bf57d2e5Schuongg3 " %Copy2:_(s8) = COPY %xor2\n"
760*bf57d2e5Schuongg3
761*bf57d2e5Schuongg3 " %xor3:_(s8) = G_XOR %c32, %c127\n"
762*bf57d2e5Schuongg3 " %Copy3:_(s8) = COPY %xor3\n"
763*bf57d2e5Schuongg3
764*bf57d2e5Schuongg3 " %xor4:_(s8) = G_XOR %cn32, %c127\n"
765*bf57d2e5Schuongg3 " %Copy4:_(s8) = COPY %xor4\n"
766*bf57d2e5Schuongg3
767*bf57d2e5Schuongg3 " %xor5:_(s8) = G_XOR %c127, %cn32\n"
768*bf57d2e5Schuongg3 " %Copy5:_(s8) = COPY %xor5\n";
769*bf57d2e5Schuongg3 setUp(MIRString);
770*bf57d2e5Schuongg3 if (!TM)
771*bf57d2e5Schuongg3 GTEST_SKIP();
772*bf57d2e5Schuongg3 Register Copy1 = Copies[Copies.size() - 5];
773*bf57d2e5Schuongg3 Register Copy2 = Copies[Copies.size() - 4];
774*bf57d2e5Schuongg3 Register Copy3 = Copies[Copies.size() - 3];
775*bf57d2e5Schuongg3 Register Copy4 = Copies[Copies.size() - 2];
776*bf57d2e5Schuongg3 Register Copy5 = Copies[Copies.size() - 1];
777*bf57d2e5Schuongg3
778*bf57d2e5Schuongg3 GISelKnownBits Info(*MF);
779*bf57d2e5Schuongg3 EXPECT_EQ(7u, Info.computeNumSignBits(Copy1));
780*bf57d2e5Schuongg3 EXPECT_EQ(2u, Info.computeNumSignBits(Copy2));
781*bf57d2e5Schuongg3 EXPECT_EQ(1u, Info.computeNumSignBits(Copy3));
782*bf57d2e5Schuongg3 EXPECT_EQ(1u, Info.computeNumSignBits(Copy4));
783*bf57d2e5Schuongg3 EXPECT_EQ(1u, Info.computeNumSignBits(Copy5));
784*bf57d2e5Schuongg3 }
785*bf57d2e5Schuongg3
TEST_F(AArch64GISelMITest,TestNumSignBitsOR)786*bf57d2e5Schuongg3 TEST_F(AArch64GISelMITest, TestNumSignBitsOR) {
787*bf57d2e5Schuongg3 StringRef MIRString = " %c1:_(s8) = G_CONSTANT i8 1\n"
788*bf57d2e5Schuongg3 " %cn1:_(s8) = G_CONSTANT i8 -1\n"
789*bf57d2e5Schuongg3 " %c127:_(s8) = G_CONSTANT i8 127\n"
790*bf57d2e5Schuongg3 " %c32:_(s8) = G_CONSTANT i8 32\n"
791*bf57d2e5Schuongg3 " %cn32:_(s8) = G_CONSTANT i8 -32\n"
792*bf57d2e5Schuongg3
793*bf57d2e5Schuongg3 " %or1:_(s8) = G_OR %c1, %cn1\n"
794*bf57d2e5Schuongg3 " %Copy1:_(s8) = COPY %or1\n"
795*bf57d2e5Schuongg3
796*bf57d2e5Schuongg3 " %or2:_(s8) = G_OR %c1, %c32\n"
797*bf57d2e5Schuongg3 " %Copy2:_(s8) = COPY %or2\n"
798*bf57d2e5Schuongg3
799*bf57d2e5Schuongg3 " %or3:_(s8) = G_OR %c32, %c127\n"
800*bf57d2e5Schuongg3 " %Copy3:_(s8) = COPY %or3\n"
801*bf57d2e5Schuongg3
802*bf57d2e5Schuongg3 " %or4:_(s8) = G_OR %cn32, %c127\n"
803*bf57d2e5Schuongg3 " %Copy4:_(s8) = COPY %or4\n"
804*bf57d2e5Schuongg3
805*bf57d2e5Schuongg3 " %or5:_(s8) = G_OR %c127, %cn32\n"
806*bf57d2e5Schuongg3 " %Copy5:_(s8) = COPY %or5\n";
807*bf57d2e5Schuongg3 setUp(MIRString);
808*bf57d2e5Schuongg3 if (!TM)
809*bf57d2e5Schuongg3 GTEST_SKIP();
810*bf57d2e5Schuongg3 Register Copy1 = Copies[Copies.size() - 5];
811*bf57d2e5Schuongg3 Register Copy2 = Copies[Copies.size() - 4];
812*bf57d2e5Schuongg3 Register Copy3 = Copies[Copies.size() - 3];
813*bf57d2e5Schuongg3 Register Copy4 = Copies[Copies.size() - 2];
814*bf57d2e5Schuongg3 Register Copy5 = Copies[Copies.size() - 1];
815*bf57d2e5Schuongg3
816*bf57d2e5Schuongg3 GISelKnownBits Info(*MF);
817*bf57d2e5Schuongg3 EXPECT_EQ(8u, Info.computeNumSignBits(Copy1));
818*bf57d2e5Schuongg3 EXPECT_EQ(2u, Info.computeNumSignBits(Copy2));
819*bf57d2e5Schuongg3 EXPECT_EQ(1u, Info.computeNumSignBits(Copy3));
820*bf57d2e5Schuongg3 EXPECT_EQ(8u, Info.computeNumSignBits(Copy4));
821*bf57d2e5Schuongg3 EXPECT_EQ(8u, Info.computeNumSignBits(Copy5));
822*bf57d2e5Schuongg3 }
823*bf57d2e5Schuongg3
TEST_F(AArch64GISelMITest,TestNumSignBitsAND)824*bf57d2e5Schuongg3 TEST_F(AArch64GISelMITest, TestNumSignBitsAND) {
825*bf57d2e5Schuongg3 StringRef MIRString = " %c1:_(s8) = G_CONSTANT i8 1\n"
826*bf57d2e5Schuongg3 " %cn1:_(s8) = G_CONSTANT i8 -1\n"
827*bf57d2e5Schuongg3 " %c127:_(s8) = G_CONSTANT i8 127\n"
828*bf57d2e5Schuongg3 " %c32:_(s8) = G_CONSTANT i8 32\n"
829*bf57d2e5Schuongg3 " %cn32:_(s8) = G_CONSTANT i8 -32\n"
830*bf57d2e5Schuongg3
831*bf57d2e5Schuongg3 " %and1:_(s8) = G_AND %c1, %cn1\n"
832*bf57d2e5Schuongg3 " %Copy1:_(s8) = COPY %and1\n"
833*bf57d2e5Schuongg3
834*bf57d2e5Schuongg3 " %and2:_(s8) = G_AND %c1, %c32\n"
835*bf57d2e5Schuongg3 " %Copy2:_(s8) = COPY %and2\n"
836*bf57d2e5Schuongg3
837*bf57d2e5Schuongg3 " %and3:_(s8) = G_AND %c32, %c127\n"
838*bf57d2e5Schuongg3 " %Copy3:_(s8) = COPY %and3\n"
839*bf57d2e5Schuongg3
840*bf57d2e5Schuongg3 " %and4:_(s8) = G_AND %cn32, %c127\n"
841*bf57d2e5Schuongg3 " %Copy4:_(s8) = COPY %and4\n"
842*bf57d2e5Schuongg3
843*bf57d2e5Schuongg3 " %and5:_(s8) = G_AND %c127, %cn32\n"
844*bf57d2e5Schuongg3 " %Copy5:_(s8) = COPY %and5\n";
845*bf57d2e5Schuongg3 setUp(MIRString);
846*bf57d2e5Schuongg3 if (!TM)
847*bf57d2e5Schuongg3 GTEST_SKIP();
848*bf57d2e5Schuongg3 Register Copy1 = Copies[Copies.size() - 5];
849*bf57d2e5Schuongg3 Register Copy2 = Copies[Copies.size() - 4];
850*bf57d2e5Schuongg3 Register Copy3 = Copies[Copies.size() - 3];
851*bf57d2e5Schuongg3 Register Copy4 = Copies[Copies.size() - 2];
852*bf57d2e5Schuongg3 Register Copy5 = Copies[Copies.size() - 1];
853*bf57d2e5Schuongg3
854*bf57d2e5Schuongg3 GISelKnownBits Info(*MF);
855*bf57d2e5Schuongg3 EXPECT_EQ(7u, Info.computeNumSignBits(Copy1));
856*bf57d2e5Schuongg3 EXPECT_EQ(8u, Info.computeNumSignBits(Copy2));
857*bf57d2e5Schuongg3 EXPECT_EQ(2u, Info.computeNumSignBits(Copy3));
858*bf57d2e5Schuongg3 EXPECT_EQ(1u, Info.computeNumSignBits(Copy4));
859*bf57d2e5Schuongg3 EXPECT_EQ(1u, Info.computeNumSignBits(Copy5));
860*bf57d2e5Schuongg3 }
861*bf57d2e5Schuongg3
TEST_F(AArch64GISelMITest,TestNumSignBitsSext)86258f843a5SMatt Arsenault TEST_F(AArch64GISelMITest, TestNumSignBitsSext) {
8630b093f02SMatt Arsenault StringRef MIRString = " %3:_(p0) = G_IMPLICIT_DEF\n"
864fae05692SMatt Arsenault " %4:_(s8) = G_LOAD %3 :: (load (s8))\n"
8650b093f02SMatt Arsenault " %5:_(s32) = G_SEXT %4\n"
8660b093f02SMatt Arsenault " %6:_(s32) = COPY %5\n"
8670b093f02SMatt Arsenault
8680b093f02SMatt Arsenault " %7:_(s8) = G_CONSTANT i8 -1\n"
8690b093f02SMatt Arsenault " %8:_(s32) = G_SEXT %7\n"
8700b093f02SMatt Arsenault " %9:_(s32) = COPY %8\n";
87142a84d22SDaniel Sanders setUp(MIRString);
8720b093f02SMatt Arsenault if (!TM)
8737fc87159SPaul Robinson GTEST_SKIP();
8740b093f02SMatt Arsenault Register CopySextLoad = Copies[Copies.size() - 2];
8750b093f02SMatt Arsenault Register CopySextNeg1 = Copies[Copies.size() - 1];
8760b093f02SMatt Arsenault
8770b093f02SMatt Arsenault GISelKnownBits Info(*MF);
8780b093f02SMatt Arsenault EXPECT_EQ(25u, Info.computeNumSignBits(CopySextLoad));
8790b093f02SMatt Arsenault EXPECT_EQ(32u, Info.computeNumSignBits(CopySextNeg1));
8800b093f02SMatt Arsenault }
8810b093f02SMatt Arsenault
TEST_F(AArch64GISelMITest,TestNumSignBitsSextInReg)8825feca7c9SMatt Arsenault TEST_F(AArch64GISelMITest, TestNumSignBitsSextInReg) {
8835feca7c9SMatt Arsenault StringRef MIRString = R"(
8845feca7c9SMatt Arsenault %ptr:_(p0) = G_IMPLICIT_DEF
885fae05692SMatt Arsenault %load4:_(s32) = G_LOAD %ptr :: (load (s32))
8865feca7c9SMatt Arsenault
8875feca7c9SMatt Arsenault %inreg7:_(s32) = G_SEXT_INREG %load4, 7
8885feca7c9SMatt Arsenault %copy_inreg7:_(s32) = COPY %inreg7
8895feca7c9SMatt Arsenault
8905feca7c9SMatt Arsenault %inreg8:_(s32) = G_SEXT_INREG %load4, 8
8915feca7c9SMatt Arsenault %copy_inreg8:_(s32) = COPY %inreg8
8925feca7c9SMatt Arsenault
8935feca7c9SMatt Arsenault %inreg9:_(s32) = G_SEXT_INREG %load4, 9
8945feca7c9SMatt Arsenault %copy_inreg9:_(s32) = COPY %inreg9
8955feca7c9SMatt Arsenault
8965feca7c9SMatt Arsenault %inreg31:_(s32) = G_SEXT_INREG %load4, 31
8975feca7c9SMatt Arsenault %copy_inreg31:_(s32) = COPY %inreg31
8985feca7c9SMatt Arsenault
899fae05692SMatt Arsenault %load1:_(s8) = G_LOAD %ptr :: (load (s8))
9005feca7c9SMatt Arsenault %sext_load1:_(s32) = G_SEXT %load1
9015feca7c9SMatt Arsenault
9025feca7c9SMatt Arsenault %inreg6_sext:_(s32) = G_SEXT_INREG %sext_load1, 6
9035feca7c9SMatt Arsenault %copy_inreg6_sext:_(s32) = COPY %inreg6_sext
9045feca7c9SMatt Arsenault
9055feca7c9SMatt Arsenault %inreg7_sext:_(s32) = G_SEXT_INREG %sext_load1, 7
9065feca7c9SMatt Arsenault %copy_inreg7_sext:_(s32) = COPY %inreg7_sext
9075feca7c9SMatt Arsenault
9085feca7c9SMatt Arsenault %inreg8_sext:_(s32) = G_SEXT_INREG %sext_load1, 8
9095feca7c9SMatt Arsenault %copy_inreg8_sext:_(s32) = COPY %inreg8_sext
9105feca7c9SMatt Arsenault
9115feca7c9SMatt Arsenault %inreg9_sext:_(s32) = G_SEXT_INREG %sext_load1, 9
9125feca7c9SMatt Arsenault %copy_inreg9_sext:_(s32) = COPY %inreg9_sext
9135feca7c9SMatt Arsenault
9145feca7c9SMatt Arsenault %inreg31_sext:_(s32) = G_SEXT_INREG %sext_load1, 31
9155feca7c9SMatt Arsenault %copy_inreg31_sext:_(s32) = COPY %inreg31_sext
9165feca7c9SMatt Arsenault )";
9175feca7c9SMatt Arsenault
91842a84d22SDaniel Sanders setUp(MIRString);
9195feca7c9SMatt Arsenault if (!TM)
9207fc87159SPaul Robinson GTEST_SKIP();
9215feca7c9SMatt Arsenault
9225feca7c9SMatt Arsenault Register CopyInReg7 = Copies[Copies.size() - 9];
9235feca7c9SMatt Arsenault Register CopyInReg8 = Copies[Copies.size() - 8];
9245feca7c9SMatt Arsenault Register CopyInReg9 = Copies[Copies.size() - 7];
9255feca7c9SMatt Arsenault Register CopyInReg31 = Copies[Copies.size() - 6];
9265feca7c9SMatt Arsenault
9275feca7c9SMatt Arsenault Register CopyInReg6Sext = Copies[Copies.size() - 5];
9285feca7c9SMatt Arsenault Register CopyInReg7Sext = Copies[Copies.size() - 4];
9295feca7c9SMatt Arsenault Register CopyInReg8Sext = Copies[Copies.size() - 3];
9305feca7c9SMatt Arsenault Register CopyInReg9Sext = Copies[Copies.size() - 2];
9315feca7c9SMatt Arsenault Register CopyInReg31Sext = Copies[Copies.size() - 1];
9325feca7c9SMatt Arsenault
9335feca7c9SMatt Arsenault GISelKnownBits Info(*MF);
9345feca7c9SMatt Arsenault EXPECT_EQ(26u, Info.computeNumSignBits(CopyInReg7));
9355feca7c9SMatt Arsenault EXPECT_EQ(25u, Info.computeNumSignBits(CopyInReg8));
9365feca7c9SMatt Arsenault EXPECT_EQ(24u, Info.computeNumSignBits(CopyInReg9));
9375feca7c9SMatt Arsenault EXPECT_EQ(2u, Info.computeNumSignBits(CopyInReg31));
9385feca7c9SMatt Arsenault
9395feca7c9SMatt Arsenault EXPECT_EQ(27u, Info.computeNumSignBits(CopyInReg6Sext));
9405feca7c9SMatt Arsenault EXPECT_EQ(26u, Info.computeNumSignBits(CopyInReg7Sext));
9415feca7c9SMatt Arsenault EXPECT_EQ(25u, Info.computeNumSignBits(CopyInReg8Sext));
9425feca7c9SMatt Arsenault EXPECT_EQ(25u, Info.computeNumSignBits(CopyInReg9Sext));
9435feca7c9SMatt Arsenault EXPECT_EQ(25u, Info.computeNumSignBits(CopyInReg31Sext));
9445feca7c9SMatt Arsenault }
9455feca7c9SMatt Arsenault
TEST_F(AArch64GISelMITest,TestNumSignBitsAssertSext)94626fb0365SJessica Paquette TEST_F(AArch64GISelMITest, TestNumSignBitsAssertSext) {
94726fb0365SJessica Paquette StringRef MIRString = R"(
94826fb0365SJessica Paquette %ptr:_(p0) = G_IMPLICIT_DEF
949fae05692SMatt Arsenault %load4:_(s32) = G_LOAD %ptr :: (load (s32))
95026fb0365SJessica Paquette
95126fb0365SJessica Paquette %assert_sext1:_(s32) = G_ASSERT_SEXT %load4, 1
95226fb0365SJessica Paquette %copy_assert_sext1:_(s32) = COPY %assert_sext1
95326fb0365SJessica Paquette
95426fb0365SJessica Paquette %assert_sext7:_(s32) = G_ASSERT_SEXT %load4, 7
95526fb0365SJessica Paquette %copy_assert_sext7:_(s32) = COPY %assert_sext7
95626fb0365SJessica Paquette
95726fb0365SJessica Paquette %assert_sext8:_(s32) = G_ASSERT_SEXT %load4, 8
95826fb0365SJessica Paquette %copy_assert_sext8:_(s32) = COPY %assert_sext8
95926fb0365SJessica Paquette
96026fb0365SJessica Paquette %assert_sext9:_(s32) = G_ASSERT_SEXT %load4, 9
96126fb0365SJessica Paquette %copy_assert_sext9:_(s32) = COPY %assert_sext9
96226fb0365SJessica Paquette
96326fb0365SJessica Paquette %assert_sext31:_(s32) = G_ASSERT_SEXT %load4, 31
96426fb0365SJessica Paquette %copy_assert_sext31:_(s32) = COPY %assert_sext31
96526fb0365SJessica Paquette
966fae05692SMatt Arsenault %load1:_(s8) = G_LOAD %ptr :: (load (s8))
96726fb0365SJessica Paquette %sext_load1:_(s32) = G_SEXT %load1
96826fb0365SJessica Paquette
96926fb0365SJessica Paquette %assert_sext6_sext:_(s32) = G_ASSERT_SEXT %sext_load1, 6
97026fb0365SJessica Paquette %copy_assert_sext6_sext:_(s32) = COPY %assert_sext6_sext
97126fb0365SJessica Paquette
97226fb0365SJessica Paquette %assert_sext7_sext:_(s32) = G_ASSERT_SEXT %sext_load1, 7
97326fb0365SJessica Paquette %copy_assert_sext7_sext:_(s32) = COPY %assert_sext7_sext
97426fb0365SJessica Paquette
97526fb0365SJessica Paquette %assert_sext8_sext:_(s32) = G_ASSERT_SEXT %sext_load1, 8
97626fb0365SJessica Paquette %copy_assert_sext8_sext:_(s32) = COPY %assert_sext8_sext
97726fb0365SJessica Paquette
97826fb0365SJessica Paquette %assert_sext9_sext:_(s32) = G_ASSERT_SEXT %sext_load1, 9
97926fb0365SJessica Paquette %copy_assert_sext9_sext:_(s32) = COPY %assert_sext9_sext
98026fb0365SJessica Paquette
98126fb0365SJessica Paquette %assert_sext31_sext:_(s32) = G_ASSERT_SEXT %sext_load1, 31
98226fb0365SJessica Paquette %copy_assert_sext31_sext:_(s32) = COPY %assert_sext31_sext
98326fb0365SJessica Paquette )";
98426fb0365SJessica Paquette
98542a84d22SDaniel Sanders setUp(MIRString);
98626fb0365SJessica Paquette if (!TM)
9877fc87159SPaul Robinson GTEST_SKIP();
98826fb0365SJessica Paquette
98926fb0365SJessica Paquette Register CopyInReg1 = Copies[Copies.size() - 10];
99026fb0365SJessica Paquette Register CopyInReg7 = Copies[Copies.size() - 9];
99126fb0365SJessica Paquette Register CopyInReg8 = Copies[Copies.size() - 8];
99226fb0365SJessica Paquette Register CopyInReg9 = Copies[Copies.size() - 7];
99326fb0365SJessica Paquette Register CopyInReg31 = Copies[Copies.size() - 6];
99426fb0365SJessica Paquette
99526fb0365SJessica Paquette Register CopyInReg6Sext = Copies[Copies.size() - 5];
99626fb0365SJessica Paquette Register CopyInReg7Sext = Copies[Copies.size() - 4];
99726fb0365SJessica Paquette Register CopyInReg8Sext = Copies[Copies.size() - 3];
99826fb0365SJessica Paquette Register CopyInReg9Sext = Copies[Copies.size() - 2];
99926fb0365SJessica Paquette Register CopyInReg31Sext = Copies[Copies.size() - 1];
100026fb0365SJessica Paquette
100126fb0365SJessica Paquette GISelKnownBits Info(*MF);
100226fb0365SJessica Paquette EXPECT_EQ(32u, Info.computeNumSignBits(CopyInReg1));
100326fb0365SJessica Paquette EXPECT_EQ(26u, Info.computeNumSignBits(CopyInReg7));
100426fb0365SJessica Paquette EXPECT_EQ(25u, Info.computeNumSignBits(CopyInReg8));
100526fb0365SJessica Paquette EXPECT_EQ(24u, Info.computeNumSignBits(CopyInReg9));
100626fb0365SJessica Paquette EXPECT_EQ(2u, Info.computeNumSignBits(CopyInReg31));
100726fb0365SJessica Paquette
100826fb0365SJessica Paquette EXPECT_EQ(27u, Info.computeNumSignBits(CopyInReg6Sext));
100926fb0365SJessica Paquette EXPECT_EQ(26u, Info.computeNumSignBits(CopyInReg7Sext));
101026fb0365SJessica Paquette EXPECT_EQ(25u, Info.computeNumSignBits(CopyInReg8Sext));
101126fb0365SJessica Paquette EXPECT_EQ(25u, Info.computeNumSignBits(CopyInReg9Sext));
101226fb0365SJessica Paquette EXPECT_EQ(25u, Info.computeNumSignBits(CopyInReg31Sext));
101326fb0365SJessica Paquette }
101426fb0365SJessica Paquette
TEST_F(AArch64GISelMITest,TestNumSignBitsTrunc)101558f843a5SMatt Arsenault TEST_F(AArch64GISelMITest, TestNumSignBitsTrunc) {
10160b093f02SMatt Arsenault StringRef MIRString = " %3:_(p0) = G_IMPLICIT_DEF\n"
1017fae05692SMatt Arsenault " %4:_(s32) = G_LOAD %3 :: (load (s32))\n"
10180b093f02SMatt Arsenault " %5:_(s8) = G_TRUNC %4\n"
10190b093f02SMatt Arsenault " %6:_(s8) = COPY %5\n"
10200b093f02SMatt Arsenault
10210b093f02SMatt Arsenault " %7:_(s32) = G_CONSTANT i32 -1\n"
10220b093f02SMatt Arsenault " %8:_(s8) = G_TRUNC %7\n"
10230b093f02SMatt Arsenault " %9:_(s8) = COPY %8\n"
10240b093f02SMatt Arsenault
10250b093f02SMatt Arsenault " %10:_(s32) = G_CONSTANT i32 7\n"
10260b093f02SMatt Arsenault " %11:_(s8) = G_TRUNC %10\n"
10270b093f02SMatt Arsenault " %12:_(s8) = COPY %11\n";
102842a84d22SDaniel Sanders setUp(MIRString);
10290b093f02SMatt Arsenault if (!TM)
10307fc87159SPaul Robinson GTEST_SKIP();
10310b093f02SMatt Arsenault Register CopyTruncLoad = Copies[Copies.size() - 3];
10320b093f02SMatt Arsenault Register CopyTruncNeg1 = Copies[Copies.size() - 2];
10330b093f02SMatt Arsenault Register CopyTrunc7 = Copies[Copies.size() - 1];
10340b093f02SMatt Arsenault
10350b093f02SMatt Arsenault GISelKnownBits Info(*MF);
10360b093f02SMatt Arsenault EXPECT_EQ(1u, Info.computeNumSignBits(CopyTruncLoad));
10370b093f02SMatt Arsenault EXPECT_EQ(8u, Info.computeNumSignBits(CopyTruncNeg1));
10380b093f02SMatt Arsenault EXPECT_EQ(5u, Info.computeNumSignBits(CopyTrunc7));
10390b093f02SMatt Arsenault }
10402ad5fc1dSMatt Arsenault
TEST_F(AArch64GISelMITest,TestNumSignBitsCmp)1041c5cebf78SAmara Emerson TEST_F(AArch64GISelMITest, TestNumSignBitsCmp) {
1042c5cebf78SAmara Emerson StringRef MIRString =
1043c5cebf78SAmara Emerson " %v1:_(<4 x s32>) = G_IMPLICIT_DEF\n"
1044c5cebf78SAmara Emerson " %v2:_(<4 x s32>) = G_IMPLICIT_DEF\n"
1045c5cebf78SAmara Emerson " %s1:_(s64) = G_IMPLICIT_DEF\n"
1046c5cebf78SAmara Emerson " %s2:_(s64) = G_IMPLICIT_DEF\n"
1047c5cebf78SAmara Emerson " %cmp:_(<4 x s32>) = G_FCMP floatpred(ogt), %v1, %v2\n"
1048c5cebf78SAmara Emerson " %cpy1:_(<4 x s32>) = COPY %cmp\n"
1049c5cebf78SAmara Emerson " %cmp2:_(<4 x s32>) = G_ICMP intpred(eq), %v1, %v2\n"
1050c5cebf78SAmara Emerson " %cpy2:_(<4 x s32>) = COPY %cmp2\n"
1051c5cebf78SAmara Emerson " %cmp3:_(s32) = G_FCMP floatpred(ogt), %s1, %s2\n"
1052c5cebf78SAmara Emerson " %cpy3:_(s32) = COPY %cmp3\n"
1053c5cebf78SAmara Emerson " %cmp4:_(s32) = G_ICMP intpred(eq), %s1, %s2\n"
1054c5cebf78SAmara Emerson " %cpy4:_(s32) = COPY %cmp4\n";
1055c5cebf78SAmara Emerson
1056c5cebf78SAmara Emerson setUp(MIRString);
1057c5cebf78SAmara Emerson if (!TM)
10587fc87159SPaul Robinson GTEST_SKIP();
1059c5cebf78SAmara Emerson Register CopyVecFCMP = Copies[Copies.size() - 4];
1060c5cebf78SAmara Emerson Register CopyVecICMP = Copies[Copies.size() - 3];
1061c5cebf78SAmara Emerson Register CopyScalarFCMP = Copies[Copies.size() - 2];
1062c5cebf78SAmara Emerson Register CopyScalarICMP = Copies[Copies.size() - 1];
1063c5cebf78SAmara Emerson
1064c5cebf78SAmara Emerson GISelKnownBits Info(*MF);
1065c5cebf78SAmara Emerson EXPECT_EQ(32u, Info.computeNumSignBits(CopyVecFCMP));
1066c5cebf78SAmara Emerson EXPECT_EQ(32u, Info.computeNumSignBits(CopyVecICMP));
1067c5cebf78SAmara Emerson EXPECT_EQ(31u, Info.computeNumSignBits(CopyScalarFCMP));
1068c5cebf78SAmara Emerson EXPECT_EQ(31u, Info.computeNumSignBits(CopyScalarICMP));
1069c5cebf78SAmara Emerson }
1070c5cebf78SAmara Emerson
TEST_F(AMDGPUGISelMITest,TestNumSignBitsTrunc)10712ad5fc1dSMatt Arsenault TEST_F(AMDGPUGISelMITest, TestNumSignBitsTrunc) {
10722ad5fc1dSMatt Arsenault StringRef MIRString =
10732ad5fc1dSMatt Arsenault " %3:_(<4 x s32>) = G_IMPLICIT_DEF\n"
10742ad5fc1dSMatt Arsenault " %4:_(s32) = G_IMPLICIT_DEF\n"
1075fae05692SMatt Arsenault " %5:_(s32) = G_AMDGPU_BUFFER_LOAD_UBYTE %3, %4, %4, %4, 0, 0, 0 :: (load (s8))\n"
10762ad5fc1dSMatt Arsenault " %6:_(s32) = COPY %5\n"
10772ad5fc1dSMatt Arsenault
1078fae05692SMatt Arsenault " %7:_(s32) = G_AMDGPU_BUFFER_LOAD_SBYTE %3, %4, %4, %4, 0, 0, 0 :: (load (s8))\n"
10792ad5fc1dSMatt Arsenault " %8:_(s32) = COPY %7\n"
10802ad5fc1dSMatt Arsenault
1081fae05692SMatt Arsenault " %9:_(s32) = G_AMDGPU_BUFFER_LOAD_USHORT %3, %4, %4, %4, 0, 0, 0 :: (load (s16))\n"
10822ad5fc1dSMatt Arsenault " %10:_(s32) = COPY %9\n"
10832ad5fc1dSMatt Arsenault
1084fae05692SMatt Arsenault " %11:_(s32) = G_AMDGPU_BUFFER_LOAD_SSHORT %3, %4, %4, %4, 0, 0, 0 :: (load (s16))\n"
10852ad5fc1dSMatt Arsenault " %12:_(s32) = COPY %11\n";
10862ad5fc1dSMatt Arsenault
108742a84d22SDaniel Sanders setUp(MIRString);
10882ad5fc1dSMatt Arsenault if (!TM)
10897fc87159SPaul Robinson GTEST_SKIP();
10902ad5fc1dSMatt Arsenault
10912ad5fc1dSMatt Arsenault Register CopyLoadUByte = Copies[Copies.size() - 4];
10922ad5fc1dSMatt Arsenault Register CopyLoadSByte = Copies[Copies.size() - 3];
10932ad5fc1dSMatt Arsenault Register CopyLoadUShort = Copies[Copies.size() - 2];
10942ad5fc1dSMatt Arsenault Register CopyLoadSShort = Copies[Copies.size() - 1];
10952ad5fc1dSMatt Arsenault
10962ad5fc1dSMatt Arsenault GISelKnownBits Info(*MF);
10972ad5fc1dSMatt Arsenault
10982ad5fc1dSMatt Arsenault EXPECT_EQ(24u, Info.computeNumSignBits(CopyLoadUByte));
10992ad5fc1dSMatt Arsenault EXPECT_EQ(25u, Info.computeNumSignBits(CopyLoadSByte));
11002ad5fc1dSMatt Arsenault EXPECT_EQ(16u, Info.computeNumSignBits(CopyLoadUShort));
11012ad5fc1dSMatt Arsenault EXPECT_EQ(17u, Info.computeNumSignBits(CopyLoadSShort));
11022ad5fc1dSMatt Arsenault }
110395605b78SMatt Arsenault
TEST_F(AMDGPUGISelMITest,TestTargetKnownAlign)110495605b78SMatt Arsenault TEST_F(AMDGPUGISelMITest, TestTargetKnownAlign) {
110595605b78SMatt Arsenault StringRef MIRString =
110695605b78SMatt Arsenault " %5:_(p4) = G_INTRINSIC intrinsic(@llvm.amdgcn.dispatch.ptr)\n"
110795605b78SMatt Arsenault " %6:_(p4) = COPY %5\n"
110895605b78SMatt Arsenault " %7:_(p4) = G_INTRINSIC intrinsic(@llvm.amdgcn.queue.ptr)\n"
110995605b78SMatt Arsenault " %8:_(p4) = COPY %7\n"
111095605b78SMatt Arsenault " %9:_(p4) = G_INTRINSIC intrinsic(@llvm.amdgcn.kernarg.segment.ptr)\n"
111195605b78SMatt Arsenault " %10:_(p4) = COPY %9\n"
111295605b78SMatt Arsenault " %11:_(p4) = G_INTRINSIC intrinsic(@llvm.amdgcn.implicitarg.ptr)\n"
111395605b78SMatt Arsenault " %12:_(p4) = COPY %11\n"
111495605b78SMatt Arsenault " %13:_(p4) = G_INTRINSIC intrinsic(@llvm.amdgcn.implicit.buffer.ptr)\n"
111595605b78SMatt Arsenault " %14:_(p4) = COPY %13\n";
111695605b78SMatt Arsenault
111742a84d22SDaniel Sanders setUp(MIRString);
111895605b78SMatt Arsenault if (!TM)
11197fc87159SPaul Robinson GTEST_SKIP();
112095605b78SMatt Arsenault
112195605b78SMatt Arsenault Register CopyDispatchPtr = Copies[Copies.size() - 5];
112295605b78SMatt Arsenault Register CopyQueuePtr = Copies[Copies.size() - 4];
112395605b78SMatt Arsenault Register CopyKernargSegmentPtr = Copies[Copies.size() - 3];
112495605b78SMatt Arsenault Register CopyImplicitArgPtr = Copies[Copies.size() - 2];
112595605b78SMatt Arsenault Register CopyImplicitBufferPtr = Copies[Copies.size() - 1];
112695605b78SMatt Arsenault
112795605b78SMatt Arsenault GISelKnownBits Info(*MF);
112895605b78SMatt Arsenault
112995605b78SMatt Arsenault EXPECT_EQ(Align(4), Info.computeKnownAlignment(CopyDispatchPtr));
113095605b78SMatt Arsenault EXPECT_EQ(Align(4), Info.computeKnownAlignment(CopyQueuePtr));
113195605b78SMatt Arsenault EXPECT_EQ(Align(4), Info.computeKnownAlignment(CopyKernargSegmentPtr));
113295605b78SMatt Arsenault EXPECT_EQ(Align(4), Info.computeKnownAlignment(CopyImplicitArgPtr));
113395605b78SMatt Arsenault EXPECT_EQ(Align(4), Info.computeKnownAlignment(CopyImplicitBufferPtr));
113495605b78SMatt Arsenault }
1135c8a282bcSJessica Paquette
TEST_F(AMDGPUGISelMITest,TestIsKnownToBeAPowerOfTwo)1136a427f15dSMatt Arsenault TEST_F(AMDGPUGISelMITest, TestIsKnownToBeAPowerOfTwo) {
1137a427f15dSMatt Arsenault
1138a427f15dSMatt Arsenault StringRef MIRString = R"MIR(
1139a427f15dSMatt Arsenault %zero:_(s32) = G_CONSTANT i32 0
1140a427f15dSMatt Arsenault %one:_(s32) = G_CONSTANT i32 1
1141a427f15dSMatt Arsenault %two:_(s32) = G_CONSTANT i32 2
1142a427f15dSMatt Arsenault %three:_(s32) = G_CONSTANT i32 3
1143a427f15dSMatt Arsenault %five:_(s32) = G_CONSTANT i32 5
1144a427f15dSMatt Arsenault %copy_zero:_(s32) = COPY %zero
1145a427f15dSMatt Arsenault %copy_one:_(s32) = COPY %one
1146a427f15dSMatt Arsenault %copy_two:_(s32) = COPY %two
1147a427f15dSMatt Arsenault %copy_three:_(s32) = COPY %three
1148a427f15dSMatt Arsenault
1149a427f15dSMatt Arsenault %trunc_two:_(s1) = G_TRUNC %two
1150a427f15dSMatt Arsenault %trunc_three:_(s1) = G_TRUNC %three
1151a427f15dSMatt Arsenault %trunc_five:_(s1) = G_TRUNC %five
1152a427f15dSMatt Arsenault
1153a427f15dSMatt Arsenault %copy_trunc_two:_(s1) = COPY %trunc_two
1154a427f15dSMatt Arsenault %copy_trunc_three:_(s1) = COPY %trunc_three
1155a427f15dSMatt Arsenault %copy_trunc_five:_(s1) = COPY %trunc_five
1156a427f15dSMatt Arsenault
1157a427f15dSMatt Arsenault %ptr:_(p1) = G_IMPLICIT_DEF
1158fae05692SMatt Arsenault %shift_amt:_(s32) = G_LOAD %ptr :: (load (s32), addrspace 1)
1159a427f15dSMatt Arsenault
1160a427f15dSMatt Arsenault %shl_1:_(s32) = G_SHL %one, %shift_amt
1161a427f15dSMatt Arsenault %copy_shl_1:_(s32) = COPY %shl_1
1162a427f15dSMatt Arsenault
1163a427f15dSMatt Arsenault %shl_2:_(s32) = G_SHL %two, %shift_amt
1164a427f15dSMatt Arsenault %copy_shl_2:_(s32) = COPY %shl_2
1165a427f15dSMatt Arsenault
1166fae05692SMatt Arsenault %not_sign_mask:_(s32) = G_LOAD %ptr :: (load (s32), addrspace 1)
1167a427f15dSMatt Arsenault %sign_mask:_(s32) = G_CONSTANT i32 -2147483648
1168a427f15dSMatt Arsenault
1169a427f15dSMatt Arsenault %lshr_not_sign_mask:_(s32) = G_LSHR %not_sign_mask, %shift_amt
1170a427f15dSMatt Arsenault %copy_lshr_not_sign_mask:_(s32) = COPY %lshr_not_sign_mask
1171a427f15dSMatt Arsenault
1172a427f15dSMatt Arsenault %lshr_sign_mask:_(s32) = G_LSHR %sign_mask, %shift_amt
1173a427f15dSMatt Arsenault %copy_lshr_sign_mask:_(s32) = COPY %lshr_sign_mask
1174a427f15dSMatt Arsenault
1175a427f15dSMatt Arsenault %or_pow2:_(s32) = G_OR %zero, %two
1176a427f15dSMatt Arsenault %copy_or_pow2:_(s32) = COPY %or_pow2
1177a427f15dSMatt Arsenault
1178a427f15dSMatt Arsenault )MIR";
117942a84d22SDaniel Sanders setUp(MIRString);
1180a427f15dSMatt Arsenault if (!TM)
11817fc87159SPaul Robinson GTEST_SKIP();
1182a427f15dSMatt Arsenault
1183a427f15dSMatt Arsenault GISelKnownBits KB(*MF);
1184a427f15dSMatt Arsenault
1185a427f15dSMatt Arsenault Register CopyZero = Copies[Copies.size() - 12];
1186a427f15dSMatt Arsenault Register CopyOne = Copies[Copies.size() - 11];
1187a427f15dSMatt Arsenault Register CopyTwo = Copies[Copies.size() - 10];
1188a427f15dSMatt Arsenault Register CopyThree = Copies[Copies.size() - 9];
1189a427f15dSMatt Arsenault Register CopyTruncTwo = Copies[Copies.size() - 8];
1190a427f15dSMatt Arsenault Register CopyTruncThree = Copies[Copies.size() - 7];
1191a427f15dSMatt Arsenault Register CopyTruncFive = Copies[Copies.size() - 6];
1192a427f15dSMatt Arsenault
1193a427f15dSMatt Arsenault Register CopyShl1 = Copies[Copies.size() - 5];
1194a427f15dSMatt Arsenault Register CopyShl2 = Copies[Copies.size() - 4];
1195a427f15dSMatt Arsenault
1196a427f15dSMatt Arsenault Register CopyLShrNotSignMask = Copies[Copies.size() - 3];
1197a427f15dSMatt Arsenault Register CopyLShrSignMask = Copies[Copies.size() - 2];
1198a427f15dSMatt Arsenault Register CopyOrPow2 = Copies[Copies.size() - 1];
1199a427f15dSMatt Arsenault
1200a427f15dSMatt Arsenault EXPECT_FALSE(isKnownToBeAPowerOfTwo(CopyZero, *MRI, &KB));
1201a427f15dSMatt Arsenault EXPECT_TRUE(isKnownToBeAPowerOfTwo(CopyOne, *MRI, &KB));
1202a427f15dSMatt Arsenault EXPECT_TRUE(isKnownToBeAPowerOfTwo(CopyTwo, *MRI, &KB));
1203a427f15dSMatt Arsenault EXPECT_FALSE(isKnownToBeAPowerOfTwo(CopyThree, *MRI, &KB));
1204a427f15dSMatt Arsenault
1205a427f15dSMatt Arsenault EXPECT_FALSE(isKnownToBeAPowerOfTwo(CopyTruncTwo, *MRI, &KB));
1206a427f15dSMatt Arsenault EXPECT_TRUE(isKnownToBeAPowerOfTwo(CopyTruncThree, *MRI, &KB));
1207a427f15dSMatt Arsenault EXPECT_TRUE(isKnownToBeAPowerOfTwo(CopyTruncFive, *MRI, &KB));
1208a427f15dSMatt Arsenault
1209a427f15dSMatt Arsenault EXPECT_TRUE(isKnownToBeAPowerOfTwo(CopyShl1, *MRI, &KB));
1210a427f15dSMatt Arsenault EXPECT_FALSE(isKnownToBeAPowerOfTwo(CopyShl2, *MRI, &KB));
1211a427f15dSMatt Arsenault
1212a427f15dSMatt Arsenault EXPECT_FALSE(isKnownToBeAPowerOfTwo(CopyLShrNotSignMask, *MRI, &KB));
1213a427f15dSMatt Arsenault EXPECT_TRUE(isKnownToBeAPowerOfTwo(CopyLShrSignMask, *MRI, &KB));
1214a427f15dSMatt Arsenault EXPECT_TRUE(isKnownToBeAPowerOfTwo(CopyOrPow2, *MRI, &KB));
1215a427f15dSMatt Arsenault }
1216a427f15dSMatt Arsenault
AddRangeMetadata(LLVMContext & Context,MachineInstr * Load)121747f4a07aSDavid Green static void AddRangeMetadata(LLVMContext &Context, MachineInstr *Load) {
121847f4a07aSDavid Green IntegerType *Int8Ty = Type::getInt8Ty(Context);
121947f4a07aSDavid Green
122047f4a07aSDavid Green // Value must be in [0, 2)
122147f4a07aSDavid Green Metadata *LowAndHigh[] = {
122247f4a07aSDavid Green ConstantAsMetadata::get(ConstantInt::get(Int8Ty, 0)),
122347f4a07aSDavid Green ConstantAsMetadata::get(ConstantInt::get(Int8Ty, 2))};
122447f4a07aSDavid Green auto NewMDNode = MDNode::get(Context, LowAndHigh);
122547f4a07aSDavid Green const MachineMemOperand *OldMMO = *Load->memoperands_begin();
122647f4a07aSDavid Green MachineMemOperand *NewMMO =
122747f4a07aSDavid Green Load->getParent()->getParent()->getMachineMemOperand(
122847f4a07aSDavid Green OldMMO->getPointerInfo(), OldMMO->getFlags(), OldMMO->getMemoryType(),
122947f4a07aSDavid Green OldMMO->getAlign(), OldMMO->getAAInfo(), NewMDNode);
123047f4a07aSDavid Green MachineIRBuilder MIB(*Load);
123147f4a07aSDavid Green MIB.buildLoadInstr(Load->getOpcode(), Load->getOperand(0),
123247f4a07aSDavid Green Load->getOperand(1), *NewMMO);
123347f4a07aSDavid Green Load->eraseFromParent();
123447f4a07aSDavid Green }
123547f4a07aSDavid Green
TEST_F(AArch64GISelMITest,TestMetadata)1236c8a282bcSJessica Paquette TEST_F(AArch64GISelMITest, TestMetadata) {
1237c8a282bcSJessica Paquette StringRef MIRString = " %imp:_(p0) = G_IMPLICIT_DEF\n"
1238fae05692SMatt Arsenault " %load:_(s8) = G_LOAD %imp(p0) :: (load (s8))\n"
1239c8a282bcSJessica Paquette " %ext:_(s32) = G_ZEXT %load(s8)\n"
1240c8a282bcSJessica Paquette " %cst:_(s32) = G_CONSTANT i32 1\n"
1241c8a282bcSJessica Paquette " %and:_(s32) = G_AND %ext, %cst\n"
1242c8a282bcSJessica Paquette " %copy:_(s32) = COPY %and(s32)\n";
124342a84d22SDaniel Sanders setUp(MIRString);
1244c8a282bcSJessica Paquette if (!TM)
12457fc87159SPaul Robinson GTEST_SKIP();
1246c8a282bcSJessica Paquette
1247c8a282bcSJessica Paquette Register CopyReg = Copies[Copies.size() - 1];
1248c8a282bcSJessica Paquette MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
1249c8a282bcSJessica Paquette Register SrcReg = FinalCopy->getOperand(1).getReg();
1250c8a282bcSJessica Paquette
1251c8a282bcSJessica Paquette // We need a load with a metadata range for this to break. Fudge the load in
1252c8a282bcSJessica Paquette // the string and replace it with something we can work with.
1253c8a282bcSJessica Paquette MachineInstr *And = MRI->getVRegDef(SrcReg);
1254c8a282bcSJessica Paquette MachineInstr *Ext = MRI->getVRegDef(And->getOperand(1).getReg());
1255c8a282bcSJessica Paquette MachineInstr *Load = MRI->getVRegDef(Ext->getOperand(1).getReg());
125647f4a07aSDavid Green AddRangeMetadata(Context, Load);
1257c8a282bcSJessica Paquette
1258c8a282bcSJessica Paquette GISelKnownBits Info(*MF);
1259c8a282bcSJessica Paquette KnownBits Res = Info.getKnownBits(And->getOperand(1).getReg());
1260c8a282bcSJessica Paquette
1261c8a282bcSJessica Paquette // We don't know what the result of the load is, so we don't know any ones.
1262735f4671SChris Lattner EXPECT_TRUE(Res.One.isZero());
1263c8a282bcSJessica Paquette
1264c8a282bcSJessica Paquette // We know that the value is in [0, 2). So, we don't know if the first bit
1265c8a282bcSJessica Paquette // is 0 or not. However, we do know that every other bit must be 0.
1266c8a282bcSJessica Paquette APInt Mask(Res.getBitWidth(), 1);
1267c8a282bcSJessica Paquette Mask.flipAllBits();
1268c8a282bcSJessica Paquette EXPECT_EQ(Mask.getZExtValue(), Res.Zero.getZExtValue());
1269c8a282bcSJessica Paquette }
12701283dca0SJustin Bogner
TEST_F(AArch64GISelMITest,TestMetadataExt)127147f4a07aSDavid Green TEST_F(AArch64GISelMITest, TestMetadataExt) {
127247f4a07aSDavid Green StringRef MIRString = " %imp:_(p0) = G_IMPLICIT_DEF\n"
127347f4a07aSDavid Green " %load:_(s32) = G_LOAD %imp(p0) :: (load (s8))\n"
127447f4a07aSDavid Green " %copy:_(s32) = COPY %load(s32)\n";
127547f4a07aSDavid Green setUp(MIRString);
127647f4a07aSDavid Green if (!TM)
127747f4a07aSDavid Green GTEST_SKIP();
127847f4a07aSDavid Green
127947f4a07aSDavid Green Register CopyReg = Copies[Copies.size() - 1];
128047f4a07aSDavid Green MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
128147f4a07aSDavid Green Register SrcReg = FinalCopy->getOperand(1).getReg();
128247f4a07aSDavid Green MachineInstr *Load = MRI->getVRegDef(SrcReg);
128347f4a07aSDavid Green AddRangeMetadata(Context, Load);
128447f4a07aSDavid Green
128547f4a07aSDavid Green GISelKnownBits Info(*MF);
128647f4a07aSDavid Green KnownBits Res = Info.getKnownBits(SrcReg);
128747f4a07aSDavid Green EXPECT_TRUE(Res.One.isZero());
128847f4a07aSDavid Green EXPECT_EQ(Res.Zero.getZExtValue(), 0xfeu);
128947f4a07aSDavid Green }
129047f4a07aSDavid Green
TEST_F(AArch64GISelMITest,TestMetadataZExt)129147f4a07aSDavid Green TEST_F(AArch64GISelMITest, TestMetadataZExt) {
129247f4a07aSDavid Green StringRef MIRString = " %imp:_(p0) = G_IMPLICIT_DEF\n"
129347f4a07aSDavid Green " %load:_(s32) = G_ZEXTLOAD %imp(p0) :: (load (s8))\n"
129447f4a07aSDavid Green " %copy:_(s32) = COPY %load(s32)\n";
129547f4a07aSDavid Green setUp(MIRString);
129647f4a07aSDavid Green if (!TM)
129747f4a07aSDavid Green GTEST_SKIP();
129847f4a07aSDavid Green
129947f4a07aSDavid Green Register CopyReg = Copies[Copies.size() - 1];
130047f4a07aSDavid Green MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
130147f4a07aSDavid Green Register SrcReg = FinalCopy->getOperand(1).getReg();
130247f4a07aSDavid Green MachineInstr *Load = MRI->getVRegDef(SrcReg);
130347f4a07aSDavid Green AddRangeMetadata(Context, Load);
130447f4a07aSDavid Green
130547f4a07aSDavid Green GISelKnownBits Info(*MF);
130647f4a07aSDavid Green KnownBits Res = Info.getKnownBits(SrcReg);
130747f4a07aSDavid Green EXPECT_TRUE(Res.One.isZero());
130847f4a07aSDavid Green EXPECT_EQ(Res.Zero.getZExtValue(), 0xfffffffe);
130947f4a07aSDavid Green }
131047f4a07aSDavid Green
TEST_F(AArch64GISelMITest,TestMetadataSExt)131147f4a07aSDavid Green TEST_F(AArch64GISelMITest, TestMetadataSExt) {
131247f4a07aSDavid Green StringRef MIRString = " %imp:_(p0) = G_IMPLICIT_DEF\n"
131347f4a07aSDavid Green " %load:_(s32) = G_SEXTLOAD %imp(p0) :: (load (s8))\n"
131447f4a07aSDavid Green " %copy:_(s32) = COPY %load(s32)\n";
131547f4a07aSDavid Green setUp(MIRString);
131647f4a07aSDavid Green if (!TM)
131747f4a07aSDavid Green GTEST_SKIP();
131847f4a07aSDavid Green
131947f4a07aSDavid Green Register CopyReg = Copies[Copies.size() - 1];
132047f4a07aSDavid Green MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
132147f4a07aSDavid Green Register SrcReg = FinalCopy->getOperand(1).getReg();
132247f4a07aSDavid Green MachineInstr *Load = MRI->getVRegDef(SrcReg);
132347f4a07aSDavid Green AddRangeMetadata(Context, Load);
132447f4a07aSDavid Green
132547f4a07aSDavid Green GISelKnownBits Info(*MF);
132647f4a07aSDavid Green KnownBits Res = Info.getKnownBits(SrcReg);
132747f4a07aSDavid Green EXPECT_TRUE(Res.One.isZero());
132847f4a07aSDavid Green EXPECT_EQ(Res.Zero.getZExtValue(), 0xfffffffe);
132947f4a07aSDavid Green }
133047f4a07aSDavid Green
TEST_F(AArch64GISelMITest,TestKnownBitsExt)13311283dca0SJustin Bogner TEST_F(AArch64GISelMITest, TestKnownBitsExt) {
13321283dca0SJustin Bogner StringRef MIRString = " %c1:_(s16) = G_CONSTANT i16 1\n"
13331283dca0SJustin Bogner " %x:_(s16) = G_IMPLICIT_DEF\n"
13341283dca0SJustin Bogner " %y:_(s16) = G_AND %x, %c1\n"
13351283dca0SJustin Bogner " %anyext:_(s32) = G_ANYEXT %y(s16)\n"
13361283dca0SJustin Bogner " %r1:_(s32) = COPY %anyext\n"
13371283dca0SJustin Bogner " %zext:_(s32) = G_ZEXT %y(s16)\n"
13381283dca0SJustin Bogner " %r2:_(s32) = COPY %zext\n"
13391283dca0SJustin Bogner " %sext:_(s32) = G_SEXT %y(s16)\n"
13401283dca0SJustin Bogner " %r3:_(s32) = COPY %sext\n";
134142a84d22SDaniel Sanders setUp(MIRString);
13421283dca0SJustin Bogner if (!TM)
13437fc87159SPaul Robinson GTEST_SKIP();
13441283dca0SJustin Bogner Register CopyRegAny = Copies[Copies.size() - 3];
13451283dca0SJustin Bogner Register CopyRegZ = Copies[Copies.size() - 2];
13461283dca0SJustin Bogner Register CopyRegS = Copies[Copies.size() - 1];
13471283dca0SJustin Bogner
13481283dca0SJustin Bogner GISelKnownBits Info(*MF);
13491283dca0SJustin Bogner MachineInstr *Copy;
13501283dca0SJustin Bogner Register SrcReg;
13511283dca0SJustin Bogner KnownBits Res;
13521283dca0SJustin Bogner
13531283dca0SJustin Bogner Copy = MRI->getVRegDef(CopyRegAny);
13541283dca0SJustin Bogner SrcReg = Copy->getOperand(1).getReg();
13551283dca0SJustin Bogner Res = Info.getKnownBits(SrcReg);
13561283dca0SJustin Bogner EXPECT_EQ((uint64_t)32, Res.getBitWidth());
13571283dca0SJustin Bogner EXPECT_EQ((uint64_t)0, Res.One.getZExtValue());
13581283dca0SJustin Bogner EXPECT_EQ((uint64_t)0x0000fffe, Res.Zero.getZExtValue());
13591283dca0SJustin Bogner
13601283dca0SJustin Bogner Copy = MRI->getVRegDef(CopyRegZ);
13611283dca0SJustin Bogner SrcReg = Copy->getOperand(1).getReg();
13621283dca0SJustin Bogner Res = Info.getKnownBits(SrcReg);
13631283dca0SJustin Bogner EXPECT_EQ((uint64_t)32, Res.getBitWidth());
13641283dca0SJustin Bogner EXPECT_EQ((uint64_t)0, Res.One.getZExtValue());
13651283dca0SJustin Bogner EXPECT_EQ((uint64_t)0xfffffffe, Res.Zero.getZExtValue());
13661283dca0SJustin Bogner
13671283dca0SJustin Bogner Copy = MRI->getVRegDef(CopyRegS);
13681283dca0SJustin Bogner SrcReg = Copy->getOperand(1).getReg();
13691283dca0SJustin Bogner Res = Info.getKnownBits(SrcReg);
13701283dca0SJustin Bogner EXPECT_EQ((uint64_t)32, Res.getBitWidth());
13711283dca0SJustin Bogner EXPECT_EQ((uint64_t)0, Res.One.getZExtValue());
13721283dca0SJustin Bogner EXPECT_EQ((uint64_t)0xfffffffe, Res.Zero.getZExtValue());
13731283dca0SJustin Bogner }
1374531f7063SMatt Arsenault
TEST_F(AArch64GISelMITest,TestKnownBitsSextInReg)1375f36007e8SJessica Paquette TEST_F(AArch64GISelMITest, TestKnownBitsSextInReg) {
1376f36007e8SJessica Paquette StringRef MIRString = R"(
1377f36007e8SJessica Paquette ; 000...0001
1378f36007e8SJessica Paquette %one:_(s32) = G_CONSTANT i32 1
1379f36007e8SJessica Paquette
1380f36007e8SJessica Paquette ; 000...0010
1381f36007e8SJessica Paquette %two:_(s32) = G_CONSTANT i32 2
1382f36007e8SJessica Paquette
1383f36007e8SJessica Paquette ; 000...1010
1384f36007e8SJessica Paquette %ten:_(s32) = G_CONSTANT i32 10
1385f36007e8SJessica Paquette
1386f36007e8SJessica Paquette ; ???...????
1387f36007e8SJessica Paquette %w0:_(s32) = COPY $w0
1388f36007e8SJessica Paquette
1389f36007e8SJessica Paquette ; ???...?1?
1390f36007e8SJessica Paquette %or:_(s32) = G_OR %w0, %two
1391f36007e8SJessica Paquette
1392f36007e8SJessica Paquette ; All bits are known.
1393f36007e8SJessica Paquette %inreg1:_(s32) = G_SEXT_INREG %one, 1
1394f36007e8SJessica Paquette %copy_inreg1:_(s32) = COPY %inreg1
1395f36007e8SJessica Paquette
1396f36007e8SJessica Paquette ; All bits unknown
1397f36007e8SJessica Paquette %inreg2:_(s32) = G_SEXT_INREG %or, 1
1398f36007e8SJessica Paquette %copy_inreg2:_(s32) = COPY %inreg2
1399f36007e8SJessica Paquette
1400f36007e8SJessica Paquette ; Extending from the only (known) set bit
1401f36007e8SJessica Paquette ; 111...11?
1402f36007e8SJessica Paquette %inreg3:_(s32) = G_SEXT_INREG %or, 2
1403f36007e8SJessica Paquette %copy_inreg3:_(s32) = COPY %inreg3
1404f36007e8SJessica Paquette
1405f36007e8SJessica Paquette ; Extending from a known set bit, overwriting all of the high set bits.
1406f36007e8SJessica Paquette ; 111...1110
1407f36007e8SJessica Paquette %inreg4:_(s32) = G_SEXT_INREG %ten, 2
1408f36007e8SJessica Paquette %copy_inreg4:_(s32) = COPY %inreg4
1409f36007e8SJessica Paquette
1410f36007e8SJessica Paquette )";
141142a84d22SDaniel Sanders setUp(MIRString);
1412f36007e8SJessica Paquette if (!TM)
14137fc87159SPaul Robinson GTEST_SKIP();
1414f36007e8SJessica Paquette GISelKnownBits Info(*MF);
1415f36007e8SJessica Paquette KnownBits Res;
1416f36007e8SJessica Paquette auto GetKB = [&](unsigned Idx) {
1417f36007e8SJessica Paquette Register CopyReg = Copies[Idx];
1418f36007e8SJessica Paquette auto *Copy = MRI->getVRegDef(CopyReg);
1419f36007e8SJessica Paquette return Info.getKnownBits(Copy->getOperand(1).getReg());
1420f36007e8SJessica Paquette };
1421f36007e8SJessica Paquette
1422f36007e8SJessica Paquette // Every bit is known to be a 1.
1423f36007e8SJessica Paquette Res = GetKB(Copies.size() - 4);
1424f36007e8SJessica Paquette EXPECT_EQ(32u, Res.getBitWidth());
1425f36007e8SJessica Paquette EXPECT_TRUE(Res.isAllOnes());
1426f36007e8SJessica Paquette
1427f36007e8SJessica Paquette // All bits are unknown
1428f36007e8SJessica Paquette Res = GetKB(Copies.size() - 3);
1429f36007e8SJessica Paquette EXPECT_EQ(32u, Res.getBitWidth());
1430f36007e8SJessica Paquette EXPECT_TRUE(Res.isUnknown());
1431f36007e8SJessica Paquette
1432f36007e8SJessica Paquette // Extending from the only known set bit
1433f36007e8SJessica Paquette // 111...11?
1434f36007e8SJessica Paquette Res = GetKB(Copies.size() - 2);
1435f36007e8SJessica Paquette EXPECT_EQ(32u, Res.getBitWidth());
1436f36007e8SJessica Paquette EXPECT_EQ(0xFFFFFFFEu, Res.One.getZExtValue());
1437f36007e8SJessica Paquette EXPECT_EQ(0u, Res.Zero.getZExtValue());
1438f36007e8SJessica Paquette
1439f36007e8SJessica Paquette // Extending from a known set bit, overwriting all of the high set bits.
1440f36007e8SJessica Paquette // 111...1110
1441f36007e8SJessica Paquette Res = GetKB(Copies.size() - 1);
1442f36007e8SJessica Paquette EXPECT_EQ(32u, Res.getBitWidth());
1443f36007e8SJessica Paquette EXPECT_EQ(0xFFFFFFFEu, Res.One.getZExtValue());
1444f36007e8SJessica Paquette EXPECT_EQ(1u, Res.Zero.getZExtValue());
1445f36007e8SJessica Paquette }
1446f36007e8SJessica Paquette
TEST_F(AArch64GISelMITest,TestKnownBitsAssertSext)1447e6064a64SJessica Paquette TEST_F(AArch64GISelMITest, TestKnownBitsAssertSext) {
1448e6064a64SJessica Paquette StringRef MIRString = R"(
1449e6064a64SJessica Paquette ; 000...0001
1450e6064a64SJessica Paquette %one:_(s32) = G_CONSTANT i32 1
1451e6064a64SJessica Paquette
1452e6064a64SJessica Paquette ; 000...0010
1453e6064a64SJessica Paquette %two:_(s32) = G_CONSTANT i32 2
1454e6064a64SJessica Paquette
1455e6064a64SJessica Paquette ; 000...1010
1456e6064a64SJessica Paquette %ten:_(s32) = G_CONSTANT i32 10
1457e6064a64SJessica Paquette
1458e6064a64SJessica Paquette ; ???...????
1459e6064a64SJessica Paquette %w0:_(s32) = COPY $w0
1460e6064a64SJessica Paquette
1461e6064a64SJessica Paquette ; ???...?1?
1462e6064a64SJessica Paquette %or:_(s32) = G_OR %w0, %two
1463e6064a64SJessica Paquette
1464e6064a64SJessica Paquette ; All bits are known.
1465e6064a64SJessica Paquette %assert_sext1:_(s32) = G_ASSERT_SEXT %one, 1
1466e6064a64SJessica Paquette %copy_assert_sext1:_(s32) = COPY %assert_sext1
1467e6064a64SJessica Paquette
1468e6064a64SJessica Paquette ; All bits unknown
1469e6064a64SJessica Paquette %assert_sext2:_(s32) = G_ASSERT_SEXT %or, 1
1470e6064a64SJessica Paquette %copy_assert_sext2:_(s32) = COPY %assert_sext2
1471e6064a64SJessica Paquette
1472e6064a64SJessica Paquette ; Extending from the only (known) set bit
1473e6064a64SJessica Paquette ; 111...11?
1474e6064a64SJessica Paquette %assert_sext3:_(s32) = G_ASSERT_SEXT %or, 2
1475e6064a64SJessica Paquette %copy_assert_sext3:_(s32) = COPY %assert_sext3
1476e6064a64SJessica Paquette
1477e6064a64SJessica Paquette ; Extending from a known set bit, overwriting all of the high set bits.
1478e6064a64SJessica Paquette ; 111...1110
1479e6064a64SJessica Paquette %assert_sext4:_(s32) = G_ASSERT_SEXT %ten, 2
1480e6064a64SJessica Paquette %copy_assert_sext4:_(s32) = COPY %assert_sext4
1481e6064a64SJessica Paquette )";
148242a84d22SDaniel Sanders setUp(MIRString);
1483e6064a64SJessica Paquette if (!TM)
14847fc87159SPaul Robinson GTEST_SKIP();
1485e6064a64SJessica Paquette GISelKnownBits Info(*MF);
1486e6064a64SJessica Paquette KnownBits Res;
1487e6064a64SJessica Paquette auto GetKB = [&](unsigned Idx) {
1488e6064a64SJessica Paquette Register CopyReg = Copies[Idx];
1489e6064a64SJessica Paquette auto *Copy = MRI->getVRegDef(CopyReg);
1490e6064a64SJessica Paquette return Info.getKnownBits(Copy->getOperand(1).getReg());
1491e6064a64SJessica Paquette };
1492e6064a64SJessica Paquette
1493e6064a64SJessica Paquette // Every bit is known to be a 1.
1494e6064a64SJessica Paquette Res = GetKB(Copies.size() - 4);
1495e6064a64SJessica Paquette EXPECT_EQ(32u, Res.getBitWidth());
1496e6064a64SJessica Paquette EXPECT_TRUE(Res.isAllOnes());
1497e6064a64SJessica Paquette
1498e6064a64SJessica Paquette // All bits are unknown
1499e6064a64SJessica Paquette Res = GetKB(Copies.size() - 3);
1500e6064a64SJessica Paquette EXPECT_EQ(32u, Res.getBitWidth());
1501e6064a64SJessica Paquette EXPECT_TRUE(Res.isUnknown());
1502e6064a64SJessica Paquette
1503e6064a64SJessica Paquette // Extending from the only known set bit
1504e6064a64SJessica Paquette // 111...11?
1505e6064a64SJessica Paquette Res = GetKB(Copies.size() - 2);
1506e6064a64SJessica Paquette EXPECT_EQ(32u, Res.getBitWidth());
1507e6064a64SJessica Paquette EXPECT_EQ(0xFFFFFFFEu, Res.One.getZExtValue());
1508e6064a64SJessica Paquette EXPECT_EQ(0u, Res.Zero.getZExtValue());
1509e6064a64SJessica Paquette
1510e6064a64SJessica Paquette // Extending from a known set bit, overwriting all of the high set bits.
1511e6064a64SJessica Paquette // 111...1110
1512e6064a64SJessica Paquette Res = GetKB(Copies.size() - 1);
1513e6064a64SJessica Paquette EXPECT_EQ(32u, Res.getBitWidth());
1514e6064a64SJessica Paquette EXPECT_EQ(0xFFFFFFFEu, Res.One.getZExtValue());
1515e6064a64SJessica Paquette EXPECT_EQ(1u, Res.Zero.getZExtValue());
1516e6064a64SJessica Paquette }
1517e6064a64SJessica Paquette
TEST_F(AArch64GISelMITest,TestKnownBitsMergeValues)1518531f7063SMatt Arsenault TEST_F(AArch64GISelMITest, TestKnownBitsMergeValues) {
1519531f7063SMatt Arsenault StringRef MIRString = R"(
1520531f7063SMatt Arsenault %val0:_(s16) = G_CONSTANT i16 35224
1521531f7063SMatt Arsenault %val1:_(s16) = G_CONSTANT i16 17494
1522531f7063SMatt Arsenault %val2:_(s16) = G_CONSTANT i16 4659
1523531f7063SMatt Arsenault %val3:_(s16) = G_CONSTANT i16 43981
1524531f7063SMatt Arsenault %merge:_(s64) = G_MERGE_VALUES %val0, %val1, %val2, %val3
1525531f7063SMatt Arsenault %mergecopy:_(s64) = COPY %merge
1526531f7063SMatt Arsenault )";
152742a84d22SDaniel Sanders setUp(MIRString);
1528531f7063SMatt Arsenault if (!TM)
15297fc87159SPaul Robinson GTEST_SKIP();
1530531f7063SMatt Arsenault
1531531f7063SMatt Arsenault const uint64_t TestVal = UINT64_C(0xabcd123344568998);
1532531f7063SMatt Arsenault Register CopyMerge = Copies[Copies.size() - 1];
1533531f7063SMatt Arsenault
1534531f7063SMatt Arsenault GISelKnownBits Info(*MF);
1535531f7063SMatt Arsenault KnownBits Res = Info.getKnownBits(CopyMerge);
1536531f7063SMatt Arsenault EXPECT_EQ(64u, Res.getBitWidth());
1537531f7063SMatt Arsenault EXPECT_EQ(TestVal, Res.One.getZExtValue());
1538531f7063SMatt Arsenault EXPECT_EQ(~TestVal, Res.Zero.getZExtValue());
1539531f7063SMatt Arsenault }
154092090e8bSMatt Arsenault
TEST_F(AArch64GISelMITest,TestKnownBitsUnmergeValues)154192090e8bSMatt Arsenault TEST_F(AArch64GISelMITest, TestKnownBitsUnmergeValues) {
154292090e8bSMatt Arsenault StringRef MIRString = R"(
154392090e8bSMatt Arsenault %val:_(s64) = G_CONSTANT i64 12379570962110515608
154492090e8bSMatt Arsenault %val0:_(s16), %val1:_(s16), %val2:_(s16), %val3:_(s16) = G_UNMERGE_VALUES %val
154592090e8bSMatt Arsenault %part0:_(s16) = COPY %val0
154692090e8bSMatt Arsenault %part1:_(s16) = COPY %val1
154792090e8bSMatt Arsenault %part2:_(s16) = COPY %val2
154892090e8bSMatt Arsenault %part3:_(s16) = COPY %val3
154992090e8bSMatt Arsenault
155092090e8bSMatt Arsenault )";
155142a84d22SDaniel Sanders setUp(MIRString);
155292090e8bSMatt Arsenault if (!TM)
15537fc87159SPaul Robinson GTEST_SKIP();
155492090e8bSMatt Arsenault
155592090e8bSMatt Arsenault const uint64_t TestVal = UINT64_C(0xabcd123344568998);
155692090e8bSMatt Arsenault GISelKnownBits Info(*MF);
155792090e8bSMatt Arsenault
155892090e8bSMatt Arsenault int Offset = -4;
155992090e8bSMatt Arsenault for (unsigned BitOffset = 0; BitOffset != 64; BitOffset += 16, ++Offset) {
156092090e8bSMatt Arsenault Register Part = Copies[Copies.size() + Offset];
156192090e8bSMatt Arsenault KnownBits PartKnown = Info.getKnownBits(Part);
156292090e8bSMatt Arsenault EXPECT_EQ(16u, PartKnown.getBitWidth());
156392090e8bSMatt Arsenault
156492090e8bSMatt Arsenault uint16_t PartTestVal = static_cast<uint16_t>(TestVal >> BitOffset);
156592090e8bSMatt Arsenault EXPECT_EQ(PartTestVal, PartKnown.One.getZExtValue());
156692090e8bSMatt Arsenault EXPECT_EQ(static_cast<uint16_t>(~PartTestVal), PartKnown.Zero.getZExtValue());
156792090e8bSMatt Arsenault }
156892090e8bSMatt Arsenault }
1569759482ddSMatt Arsenault
TEST_F(AArch64GISelMITest,TestKnownBitsBSwapBitReverse)1570759482ddSMatt Arsenault TEST_F(AArch64GISelMITest, TestKnownBitsBSwapBitReverse) {
1571759482ddSMatt Arsenault StringRef MIRString = R"(
1572759482ddSMatt Arsenault %const:_(s32) = G_CONSTANT i32 287454020
1573759482ddSMatt Arsenault %bswap:_(s32) = G_BSWAP %const
1574759482ddSMatt Arsenault %bitreverse:_(s32) = G_BITREVERSE %const
1575759482ddSMatt Arsenault %copy_bswap:_(s32) = COPY %bswap
1576759482ddSMatt Arsenault %copy_bitreverse:_(s32) = COPY %bitreverse
1577759482ddSMatt Arsenault )";
157842a84d22SDaniel Sanders setUp(MIRString);
1579759482ddSMatt Arsenault if (!TM)
15807fc87159SPaul Robinson GTEST_SKIP();
1581759482ddSMatt Arsenault
15824c55cdb0SAmara Emerson const uint32_t ByteSwappedVal = 0x44332211;
15834c55cdb0SAmara Emerson const uint32_t BitSwappedVal = 0x22cc4488;
1584759482ddSMatt Arsenault
1585759482ddSMatt Arsenault Register CopyBSwap = Copies[Copies.size() - 2];
1586759482ddSMatt Arsenault Register CopyBitReverse = Copies[Copies.size() - 1];
1587759482ddSMatt Arsenault
1588759482ddSMatt Arsenault GISelKnownBits Info(*MF);
1589759482ddSMatt Arsenault
1590759482ddSMatt Arsenault KnownBits BSwapKnown = Info.getKnownBits(CopyBSwap);
1591759482ddSMatt Arsenault EXPECT_EQ(32u, BSwapKnown.getBitWidth());
15924c55cdb0SAmara Emerson EXPECT_EQ(ByteSwappedVal, BSwapKnown.One.getZExtValue());
15934c55cdb0SAmara Emerson EXPECT_EQ(~ByteSwappedVal, BSwapKnown.Zero.getZExtValue());
1594759482ddSMatt Arsenault
1595759482ddSMatt Arsenault KnownBits BitReverseKnown = Info.getKnownBits(CopyBitReverse);
1596759482ddSMatt Arsenault EXPECT_EQ(32u, BitReverseKnown.getBitWidth());
15974c55cdb0SAmara Emerson EXPECT_EQ(BitSwappedVal, BitReverseKnown.One.getZExtValue());
15984c55cdb0SAmara Emerson EXPECT_EQ(~BitSwappedVal, BitReverseKnown.Zero.getZExtValue());
1599759482ddSMatt Arsenault }
160035c94d3fSMatt Arsenault
TEST_F(AArch64GISelMITest,TestKnownBitsUMAX)1601d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsUMAX) {
1602d7834556SPetar Avramovic StringRef MIRString = R"(
1603d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF
1604fae05692SMatt Arsenault %unknown:_(s8) = G_LOAD %ptr(p0) :: (load (s8))
1605d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 10
1606d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 1
1607d7834556SPetar Avramovic %tmp0:_(s8) = G_AND %unknown, %mask0
1608d7834556SPetar Avramovic %val0:_(s8) = G_OR %tmp0, %mask1
1609d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 3
1610d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 12
1611d7834556SPetar Avramovic %tmp1:_(s8) = G_AND %unknown, %mask2
1612d7834556SPetar Avramovic %val1:_(s8) = G_OR %tmp1, %mask3
1613d7834556SPetar Avramovic %umax0:_(s8) = G_UMAX %val0, %val1
1614d7834556SPetar Avramovic %copy_umax0:_(s8) = COPY %umax0
1615d7834556SPetar Avramovic
1616d7834556SPetar Avramovic %mask4:_(s8) = G_CONSTANT i8 14
1617d7834556SPetar Avramovic %mask5:_(s8) = G_CONSTANT i8 2
1618d7834556SPetar Avramovic %tmp3:_(s8) = G_AND %unknown, %mask4
1619d7834556SPetar Avramovic %val3:_(s8) = G_OR %tmp3, %mask5
1620d7834556SPetar Avramovic %mask6:_(s8) = G_CONSTANT i8 4
1621d7834556SPetar Avramovic %mask7:_(s8) = G_CONSTANT i8 11
1622d7834556SPetar Avramovic %tmp4:_(s8) = G_AND %unknown, %mask6
1623d7834556SPetar Avramovic %val4:_(s8) = G_OR %tmp4, %mask7
1624d7834556SPetar Avramovic %umax1:_(s8) = G_UMAX %val3, %val4
1625d7834556SPetar Avramovic %copy_umax1:_(s8) = COPY %umax1
1626d7834556SPetar Avramovic )";
1627d7834556SPetar Avramovic
162842a84d22SDaniel Sanders setUp(MIRString);
1629d7834556SPetar Avramovic if (!TM)
16307fc87159SPaul Robinson GTEST_SKIP();
1631d7834556SPetar Avramovic
1632d7834556SPetar Avramovic Register CopyReg0 = Copies[Copies.size() - 2];
1633d7834556SPetar Avramovic MachineInstr *FinalCopy0 = MRI->getVRegDef(CopyReg0);
1634d7834556SPetar Avramovic Register SrcReg0 = FinalCopy0->getOperand(1).getReg();
1635d7834556SPetar Avramovic GISelKnownBits Info(*MF);
1636d7834556SPetar Avramovic // Compares min/max of LHS and RHS, min uses 0 for unknown bits, max uses 1.
1637d7834556SPetar Avramovic // If min(LHS) >= max(RHS) returns KnownBits for LHS, similar for RHS. If this
1638d7834556SPetar Avramovic // fails tries to calculate individual bits: common bits for both operands and
1639d7834556SPetar Avramovic // a few leading bits in some cases.
1640d7834556SPetar Avramovic // 0000?0?1
1641d7834556SPetar Avramovic // umax 000011??
1642d7834556SPetar Avramovic // = 000011??
1643d7834556SPetar Avramovic KnownBits Res0 = Info.getKnownBits(SrcReg0);
1644d7834556SPetar Avramovic EXPECT_EQ(0x0Cu, Res0.One.getZExtValue());
1645d7834556SPetar Avramovic EXPECT_EQ(0xF0u, Res0.Zero.getZExtValue());
1646d7834556SPetar Avramovic
1647d7834556SPetar Avramovic Register CopyReg1 = Copies[Copies.size() - 1];
1648d7834556SPetar Avramovic MachineInstr *FinalCopy1 = MRI->getVRegDef(CopyReg1);
1649d7834556SPetar Avramovic Register SrcReg1 = FinalCopy1->getOperand(1).getReg();
1650d7834556SPetar Avramovic KnownBits Res1 = Info.getKnownBits(SrcReg1);
1651d7834556SPetar Avramovic // 0000??10
1652d7834556SPetar Avramovic // umax 00001?11
1653d7834556SPetar Avramovic // = 00001?1?
1654d7834556SPetar Avramovic EXPECT_EQ(0x0Au, Res1.One.getZExtValue());
1655d7834556SPetar Avramovic EXPECT_EQ(0xF0u, Res1.Zero.getZExtValue());
1656d7834556SPetar Avramovic }
1657d7834556SPetar Avramovic
TEST_F(AArch64GISelMITest,TestKnownBitsUMax)165835c94d3fSMatt Arsenault TEST_F(AArch64GISelMITest, TestKnownBitsUMax) {
165935c94d3fSMatt Arsenault StringRef MIRString = R"(
166035c94d3fSMatt Arsenault %val:_(s32) = COPY $w0
166135c94d3fSMatt Arsenault %zext:_(s64) = G_ZEXT %val
166235c94d3fSMatt Arsenault %const:_(s64) = G_CONSTANT i64 -256
166335c94d3fSMatt Arsenault %umax:_(s64) = G_UMAX %zext, %const
166435c94d3fSMatt Arsenault %copy_umax:_(s64) = COPY %umax
166535c94d3fSMatt Arsenault )";
166642a84d22SDaniel Sanders setUp(MIRString);
166735c94d3fSMatt Arsenault if (!TM)
16687fc87159SPaul Robinson GTEST_SKIP();
166935c94d3fSMatt Arsenault
167035c94d3fSMatt Arsenault Register CopyUMax = Copies[Copies.size() - 1];
167135c94d3fSMatt Arsenault GISelKnownBits Info(*MF);
167235c94d3fSMatt Arsenault
167335c94d3fSMatt Arsenault KnownBits KnownUmax = Info.getKnownBits(CopyUMax);
167435c94d3fSMatt Arsenault EXPECT_EQ(64u, KnownUmax.getBitWidth());
16755350e1b5SJay Foad EXPECT_EQ(0xffu, KnownUmax.Zero.getZExtValue());
167635c94d3fSMatt Arsenault EXPECT_EQ(0xffffffffffffff00, KnownUmax.One.getZExtValue());
167735c94d3fSMatt Arsenault
16785350e1b5SJay Foad EXPECT_EQ(0xffu, KnownUmax.Zero.getZExtValue());
167935c94d3fSMatt Arsenault EXPECT_EQ(0xffffffffffffff00, KnownUmax.One.getZExtValue());
168035c94d3fSMatt Arsenault }
168173411234SKonstantin Schwarz
TEST_F(AArch64GISelMITest,TestKnownBitsUMIN)1682d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsUMIN) {
1683d7834556SPetar Avramovic StringRef MIRString = R"(
1684d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF
1685fae05692SMatt Arsenault %unknown:_(s8) = G_LOAD %ptr(p0) :: (load (s8))
1686d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 10
1687d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 1
1688d7834556SPetar Avramovic %tmp0:_(s8) = G_AND %unknown, %mask0
1689d7834556SPetar Avramovic %val0:_(s8) = G_OR %tmp0, %mask1
1690d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 3
1691d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 12
1692d7834556SPetar Avramovic %tmp1:_(s8) = G_AND %unknown, %mask2
1693d7834556SPetar Avramovic %val1:_(s8) = G_OR %tmp1, %mask3
1694d7834556SPetar Avramovic %umin:_(s8) = G_UMIN %val0, %val1
1695d7834556SPetar Avramovic %copy_umin:_(s8) = COPY %umin
1696d7834556SPetar Avramovic )";
1697d7834556SPetar Avramovic
169842a84d22SDaniel Sanders setUp(MIRString);
1699d7834556SPetar Avramovic if (!TM)
17007fc87159SPaul Robinson GTEST_SKIP();
1701d7834556SPetar Avramovic
1702d7834556SPetar Avramovic Register CopyReg0 = Copies[Copies.size() - 1];
1703d7834556SPetar Avramovic MachineInstr *FinalCopy0 = MRI->getVRegDef(CopyReg0);
1704d7834556SPetar Avramovic Register SrcReg0 = FinalCopy0->getOperand(1).getReg();
1705d7834556SPetar Avramovic GISelKnownBits Info(*MF);
1706d7834556SPetar Avramovic KnownBits Res0 = Info.getKnownBits(SrcReg0);
1707d7834556SPetar Avramovic // Flips the range of operands: [0, 0xFFFFFFFF] <-> [0xFFFFFFFF, 0],
1708d7834556SPetar Avramovic // uses umax and flips result back.
1709d7834556SPetar Avramovic // 0000?0?1
1710d7834556SPetar Avramovic // umin 000011??
1711d7834556SPetar Avramovic // = 0000?0?1
1712d7834556SPetar Avramovic EXPECT_EQ(0x01u, Res0.One.getZExtValue());
1713d7834556SPetar Avramovic EXPECT_EQ(0xF4u, Res0.Zero.getZExtValue());
1714d7834556SPetar Avramovic }
1715d7834556SPetar Avramovic
TEST_F(AArch64GISelMITest,TestKnownBitsSMAX)1716d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsSMAX) {
1717d7834556SPetar Avramovic StringRef MIRString = R"(
1718d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF
1719fae05692SMatt Arsenault %unknown:_(s8) = G_LOAD %ptr(p0) :: (load (s8))
1720d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 128
1721d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 64
1722d7834556SPetar Avramovic %tmp0:_(s8) = G_AND %unknown, %mask0
1723d7834556SPetar Avramovic %val0:_(s8) = G_OR %tmp0, %mask1
1724d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 1
1725d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 128
1726d7834556SPetar Avramovic %tmp1:_(s8) = G_AND %unknown, %mask2
1727d7834556SPetar Avramovic %val1:_(s8) = G_OR %tmp1, %mask3
1728d7834556SPetar Avramovic %smax:_(s8) = G_SMAX %val0, %val1
1729d7834556SPetar Avramovic %copy_smax:_(s8) = COPY %smax
1730d7834556SPetar Avramovic )";
1731d7834556SPetar Avramovic
173242a84d22SDaniel Sanders setUp(MIRString);
1733d7834556SPetar Avramovic if (!TM)
17347fc87159SPaul Robinson GTEST_SKIP();
1735d7834556SPetar Avramovic
1736d7834556SPetar Avramovic Register CopyReg0 = Copies[Copies.size() - 1];
1737d7834556SPetar Avramovic MachineInstr *FinalCopy0 = MRI->getVRegDef(CopyReg0);
1738d7834556SPetar Avramovic Register SrcReg0 = FinalCopy0->getOperand(1).getReg();
1739d7834556SPetar Avramovic GISelKnownBits Info(*MF);
1740d7834556SPetar Avramovic KnownBits Res0 = Info.getKnownBits(SrcReg0);
1741d7834556SPetar Avramovic // Flips the range of operands: [-0x80000000, 0x7FFFFFFF] <-> [0, 0xFFFFFFFF],
1742d7834556SPetar Avramovic // uses umax and flips result back.
1743d7834556SPetar Avramovic // RHS is negative, LHS is either positive or negative with smaller abs value.
1744d7834556SPetar Avramovic // ?1000000
1745d7834556SPetar Avramovic // smax 1000000?
1746d7834556SPetar Avramovic // = ?1000000
1747d7834556SPetar Avramovic EXPECT_EQ(0x40u, Res0.One.getZExtValue());
1748d7834556SPetar Avramovic EXPECT_EQ(0x3Fu, Res0.Zero.getZExtValue());
1749d7834556SPetar Avramovic }
1750d7834556SPetar Avramovic
TEST_F(AArch64GISelMITest,TestKnownBitsSMIN)1751d7834556SPetar Avramovic TEST_F(AArch64GISelMITest, TestKnownBitsSMIN) {
1752d7834556SPetar Avramovic StringRef MIRString = R"(
1753d7834556SPetar Avramovic %ptr:_(p0) = G_IMPLICIT_DEF
1754fae05692SMatt Arsenault %unknown:_(s8) = G_LOAD %ptr(p0) :: (load (s8))
1755d7834556SPetar Avramovic %mask0:_(s8) = G_CONSTANT i8 128
1756d7834556SPetar Avramovic %mask1:_(s8) = G_CONSTANT i8 64
1757d7834556SPetar Avramovic %tmp0:_(s8) = G_AND %unknown, %mask0
1758d7834556SPetar Avramovic %val0:_(s8) = G_OR %tmp0, %mask1
1759d7834556SPetar Avramovic %mask2:_(s8) = G_CONSTANT i8 1
1760d7834556SPetar Avramovic %mask3:_(s8) = G_CONSTANT i8 128
1761d7834556SPetar Avramovic %tmp1:_(s8) = G_AND %unknown, %mask2
1762d7834556SPetar Avramovic %val1:_(s8) = G_OR %tmp1, %mask3
1763d7834556SPetar Avramovic %smin:_(s8) = G_SMIN %val0, %val1
1764d7834556SPetar Avramovic %copy_smin:_(s8) = COPY %smin
1765d7834556SPetar Avramovic )";
1766d7834556SPetar Avramovic
176742a84d22SDaniel Sanders setUp(MIRString);
1768d7834556SPetar Avramovic if (!TM)
17697fc87159SPaul Robinson GTEST_SKIP();
1770d7834556SPetar Avramovic
1771d7834556SPetar Avramovic Register CopyReg0 = Copies[Copies.size() - 1];
1772d7834556SPetar Avramovic MachineInstr *FinalCopy0 = MRI->getVRegDef(CopyReg0);
1773d7834556SPetar Avramovic Register SrcReg0 = FinalCopy0->getOperand(1).getReg();
1774d7834556SPetar Avramovic GISelKnownBits Info(*MF);
1775d7834556SPetar Avramovic KnownBits Res0 = Info.getKnownBits(SrcReg0);
1776d7834556SPetar Avramovic // Flips the range of operands: [-0x80000000, 0x7FFFFFFF] <-> [0xFFFFFFFF, 0],
1777d7834556SPetar Avramovic // uses umax and flips result back.
1778d7834556SPetar Avramovic // RHS is negative, LHS is either positive or negative with smaller abs value.
1779d7834556SPetar Avramovic // ?1000000
1780d7834556SPetar Avramovic // smin 1000000?
1781d7834556SPetar Avramovic // = 1000000?
1782d7834556SPetar Avramovic EXPECT_EQ(0x80u, Res0.One.getZExtValue());
1783d7834556SPetar Avramovic EXPECT_EQ(0x7Eu, Res0.Zero.getZExtValue());
1784d7834556SPetar Avramovic }
1785d7834556SPetar Avramovic
TEST_F(AArch64GISelMITest,TestInvalidQueries)178673411234SKonstantin Schwarz TEST_F(AArch64GISelMITest, TestInvalidQueries) {
178773411234SKonstantin Schwarz StringRef MIRString = R"(
178873411234SKonstantin Schwarz %src:_(s32) = COPY $w0
178973411234SKonstantin Schwarz %thirty2:_(s32) = G_CONSTANT i32 32
179073411234SKonstantin Schwarz %equalSized:_(s32) = G_SHL %src, %thirty2
179173411234SKonstantin Schwarz %copy1:_(s32) = COPY %equalSized
179273411234SKonstantin Schwarz %thirty3:_(s32) = G_CONSTANT i32 33
179373411234SKonstantin Schwarz %biggerSized:_(s32) = G_SHL %src, %thirty3
179473411234SKonstantin Schwarz %copy2:_(s32) = COPY %biggerSized
179573411234SKonstantin Schwarz )";
179642a84d22SDaniel Sanders setUp(MIRString);
179773411234SKonstantin Schwarz if (!TM)
17987fc87159SPaul Robinson GTEST_SKIP();
179973411234SKonstantin Schwarz
180073411234SKonstantin Schwarz Register EqSizedCopyReg = Copies[Copies.size() - 2];
180173411234SKonstantin Schwarz MachineInstr *EqSizedCopy = MRI->getVRegDef(EqSizedCopyReg);
180273411234SKonstantin Schwarz Register EqSizedShl = EqSizedCopy->getOperand(1).getReg();
180373411234SKonstantin Schwarz
180473411234SKonstantin Schwarz Register BiggerSizedCopyReg = Copies[Copies.size() - 1];
180573411234SKonstantin Schwarz MachineInstr *BiggerSizedCopy = MRI->getVRegDef(BiggerSizedCopyReg);
180673411234SKonstantin Schwarz Register BiggerSizedShl = BiggerSizedCopy->getOperand(1).getReg();
180773411234SKonstantin Schwarz
180873411234SKonstantin Schwarz GISelKnownBits Info(*MF);
180973411234SKonstantin Schwarz KnownBits EqSizeRes = Info.getKnownBits(EqSizedShl);
181073411234SKonstantin Schwarz KnownBits BiggerSizeRes = Info.getKnownBits(BiggerSizedShl);
181173411234SKonstantin Schwarz
181273411234SKonstantin Schwarz
1813f7d1baa4SNikita Popov // Result can be anything, but we should not crash.
1814735f4671SChris Lattner EXPECT_TRUE(EqSizeRes.One.isZero());
1815f7d1baa4SNikita Popov EXPECT_TRUE(EqSizeRes.Zero.isAllOnes());
181673411234SKonstantin Schwarz
1817735f4671SChris Lattner EXPECT_TRUE(BiggerSizeRes.One.isZero());
1818f7d1baa4SNikita Popov EXPECT_TRUE(BiggerSizeRes.Zero.isAllOnes());
181973411234SKonstantin Schwarz }
1820f19971d1SJessica Paquette
TEST_F(AArch64GISelMITest,TestKnownBitsAssertZext)1821f19971d1SJessica Paquette TEST_F(AArch64GISelMITest, TestKnownBitsAssertZext) {
1822f19971d1SJessica Paquette StringRef MIRString = R"(
1823f19971d1SJessica Paquette %copy:_(s64) = COPY $x0
1824f19971d1SJessica Paquette
1825f19971d1SJessica Paquette %assert8:_(s64) = G_ASSERT_ZEXT %copy, 8
1826f19971d1SJessica Paquette %copy_assert8:_(s64) = COPY %assert8
1827f19971d1SJessica Paquette
1828f19971d1SJessica Paquette %assert1:_(s64) = G_ASSERT_ZEXT %copy, 1
1829f19971d1SJessica Paquette %copy_assert1:_(s64) = COPY %assert1
1830f19971d1SJessica Paquette
1831f19971d1SJessica Paquette %assert63:_(s64) = G_ASSERT_ZEXT %copy, 63
1832f19971d1SJessica Paquette %copy_assert63:_(s64) = COPY %assert63
1833f19971d1SJessica Paquette
1834f19971d1SJessica Paquette %assert3:_(s64) = G_ASSERT_ZEXT %copy, 3
1835f19971d1SJessica Paquette %copy_assert3:_(s64) = COPY %assert3
1836f19971d1SJessica Paquette )";
1837f19971d1SJessica Paquette
183842a84d22SDaniel Sanders setUp(MIRString);
1839f19971d1SJessica Paquette if (!TM)
18407fc87159SPaul Robinson GTEST_SKIP();
1841f19971d1SJessica Paquette
1842f19971d1SJessica Paquette Register CopyAssert8 = Copies[Copies.size() - 4];
1843f19971d1SJessica Paquette Register CopyAssert1 = Copies[Copies.size() - 3];
1844f19971d1SJessica Paquette Register CopyAssert63 = Copies[Copies.size() - 2];
1845f19971d1SJessica Paquette Register CopyAssert3 = Copies[Copies.size() - 1];
1846f19971d1SJessica Paquette
1847f19971d1SJessica Paquette GISelKnownBits Info(*MF);
1848f19971d1SJessica Paquette MachineInstr *Copy;
1849f19971d1SJessica Paquette Register SrcReg;
1850f19971d1SJessica Paquette KnownBits Res;
1851f19971d1SJessica Paquette
1852f19971d1SJessica Paquette // Assert zero-extension from an 8-bit value.
1853f19971d1SJessica Paquette Copy = MRI->getVRegDef(CopyAssert8);
1854f19971d1SJessica Paquette SrcReg = Copy->getOperand(1).getReg();
1855f19971d1SJessica Paquette Res = Info.getKnownBits(SrcReg);
1856f19971d1SJessica Paquette EXPECT_EQ(64u, Res.getBitWidth());
1857f19971d1SJessica Paquette EXPECT_EQ(0u, Res.One.getZExtValue());
1858f19971d1SJessica Paquette EXPECT_EQ(0xFFFFFFFFFFFFFF00u, Res.Zero.getZExtValue());
1859f19971d1SJessica Paquette
1860f19971d1SJessica Paquette // Assert zero-extension from a 1-bit value.
1861f19971d1SJessica Paquette Copy = MRI->getVRegDef(CopyAssert1);
1862f19971d1SJessica Paquette SrcReg = Copy->getOperand(1).getReg();
1863f19971d1SJessica Paquette Res = Info.getKnownBits(SrcReg);
1864f19971d1SJessica Paquette EXPECT_EQ(64u, Res.getBitWidth());
1865f19971d1SJessica Paquette EXPECT_EQ(0u, Res.One.getZExtValue());
1866f19971d1SJessica Paquette EXPECT_EQ(0xFFFFFFFFFFFFFFFE, Res.Zero.getZExtValue());
1867f19971d1SJessica Paquette
1868f19971d1SJessica Paquette // Assert zero-extension from a 63-bit value.
1869f19971d1SJessica Paquette Copy = MRI->getVRegDef(CopyAssert63);
1870f19971d1SJessica Paquette SrcReg = Copy->getOperand(1).getReg();
1871f19971d1SJessica Paquette Res = Info.getKnownBits(SrcReg);
1872f19971d1SJessica Paquette EXPECT_EQ(64u, Res.getBitWidth());
1873f19971d1SJessica Paquette EXPECT_EQ(0u, Res.One.getZExtValue());
1874f19971d1SJessica Paquette EXPECT_EQ(0x8000000000000000u, Res.Zero.getZExtValue());
1875f19971d1SJessica Paquette
1876f19971d1SJessica Paquette // Assert zero-extension from a 3-bit value.
1877f19971d1SJessica Paquette Copy = MRI->getVRegDef(CopyAssert3);
1878f19971d1SJessica Paquette SrcReg = Copy->getOperand(1).getReg();
1879f19971d1SJessica Paquette Res = Info.getKnownBits(SrcReg);
1880f19971d1SJessica Paquette EXPECT_EQ(64u, Res.getBitWidth());
1881f19971d1SJessica Paquette EXPECT_EQ(0u, Res.One.getZExtValue());
1882f19971d1SJessica Paquette EXPECT_EQ(0xFFFFFFFFFFFFFFF8u, Res.Zero.getZExtValue());
1883f19971d1SJessica Paquette }
188453ab2d82SBrendon Cahoon
TEST_F(AArch64GISelMITest,TestKnownBitsCTPOP)1885eae4a44cSJon Roelofs TEST_F(AArch64GISelMITest, TestKnownBitsCTPOP) {
1886eae4a44cSJon Roelofs StringRef MIRString = R"(
1887eae4a44cSJon Roelofs %src:_(s32) = COPY $w0
1888eae4a44cSJon Roelofs %unknown:_(s32) = G_CTPOP %src
1889eae4a44cSJon Roelofs %unknown_copy:_(s32) = COPY %unknown
1890eae4a44cSJon Roelofs %constant_4294967295:_(s32) = G_CONSTANT i32 4294967295
1891eae4a44cSJon Roelofs %thirtytwo:_(s32) = G_CTPOP %constant_4294967295
1892eae4a44cSJon Roelofs %thirtytwo_copy:_(s32) = COPY %thirtytwo
1893eae4a44cSJon Roelofs %constant_15:_(s32) = G_CONSTANT i32 15
1894eae4a44cSJon Roelofs %four:_(s32) = G_CTPOP %constant_15
1895eae4a44cSJon Roelofs %four_copy:_(s32) = COPY %four
1896eae4a44cSJon Roelofs %constant_1:_(s32) = G_CONSTANT i32 1
1897eae4a44cSJon Roelofs %one:_(s32) = G_CTPOP %constant_1
1898eae4a44cSJon Roelofs %one_copy:_(s32) = COPY %one
1899eae4a44cSJon Roelofs )";
1900eae4a44cSJon Roelofs setUp(MIRString);
1901eae4a44cSJon Roelofs if (!TM)
19027fc87159SPaul Robinson GTEST_SKIP();
1903eae4a44cSJon Roelofs
1904eae4a44cSJon Roelofs Register UnknownCopy = Copies[Copies.size() - 4];
1905eae4a44cSJon Roelofs Register ThirtytwoCopy = Copies[Copies.size() - 3];
1906eae4a44cSJon Roelofs Register FourCopy = Copies[Copies.size() - 2];
1907eae4a44cSJon Roelofs Register OneCopy = Copies[Copies.size() - 1];
1908eae4a44cSJon Roelofs
1909eae4a44cSJon Roelofs GISelKnownBits Info(*MF);
1910eae4a44cSJon Roelofs MachineInstr *Copy;
1911eae4a44cSJon Roelofs Register SrcReg;
1912eae4a44cSJon Roelofs KnownBits Res;
1913eae4a44cSJon Roelofs
1914eae4a44cSJon Roelofs Copy = MRI->getVRegDef(UnknownCopy);
1915eae4a44cSJon Roelofs SrcReg = Copy->getOperand(1).getReg();
1916eae4a44cSJon Roelofs Res = Info.getKnownBits(SrcReg);
1917eae4a44cSJon Roelofs EXPECT_EQ(32u, Res.getBitWidth());
1918eae4a44cSJon Roelofs EXPECT_EQ(0u, Res.One.getZExtValue());
1919eae4a44cSJon Roelofs EXPECT_EQ(0xFFFFFFC0u, Res.Zero.getZExtValue());
1920eae4a44cSJon Roelofs
1921eae4a44cSJon Roelofs Copy = MRI->getVRegDef(ThirtytwoCopy);
1922eae4a44cSJon Roelofs SrcReg = Copy->getOperand(1).getReg();
1923eae4a44cSJon Roelofs Res = Info.getKnownBits(SrcReg);
1924eae4a44cSJon Roelofs EXPECT_EQ(32u, Res.getBitWidth());
1925eae4a44cSJon Roelofs EXPECT_EQ(0u, Res.One.getZExtValue());
1926eae4a44cSJon Roelofs EXPECT_EQ(0xFFFFFFC0u, Res.Zero.getZExtValue());
1927eae4a44cSJon Roelofs
1928eae4a44cSJon Roelofs Copy = MRI->getVRegDef(FourCopy);
1929eae4a44cSJon Roelofs SrcReg = Copy->getOperand(1).getReg();
1930eae4a44cSJon Roelofs Res = Info.getKnownBits(SrcReg);
1931eae4a44cSJon Roelofs EXPECT_EQ(32u, Res.getBitWidth());
1932eae4a44cSJon Roelofs EXPECT_EQ(0u, Res.One.getZExtValue());
1933eae4a44cSJon Roelofs EXPECT_EQ(0xFFFFFFF8u, Res.Zero.getZExtValue());
1934eae4a44cSJon Roelofs
1935eae4a44cSJon Roelofs Copy = MRI->getVRegDef(OneCopy);
1936eae4a44cSJon Roelofs SrcReg = Copy->getOperand(1).getReg();
1937eae4a44cSJon Roelofs Res = Info.getKnownBits(SrcReg);
1938eae4a44cSJon Roelofs EXPECT_EQ(32u, Res.getBitWidth());
1939eae4a44cSJon Roelofs EXPECT_EQ(0u, Res.One.getZExtValue());
1940eae4a44cSJon Roelofs EXPECT_EQ(0xFFFFFFFEu, Res.Zero.getZExtValue());
1941eae4a44cSJon Roelofs }
1942eae4a44cSJon Roelofs
TEST_F(AMDGPUGISelMITest,TestKnownBitsUBFX)194353ab2d82SBrendon Cahoon TEST_F(AMDGPUGISelMITest, TestKnownBitsUBFX) {
194453ab2d82SBrendon Cahoon StringRef MIRString = " %3:_(s32) = G_IMPLICIT_DEF\n"
194553ab2d82SBrendon Cahoon " %4:_(s32) = G_CONSTANT i32 12\n"
194653ab2d82SBrendon Cahoon " %5:_(s32) = G_CONSTANT i32 8\n"
194753ab2d82SBrendon Cahoon " %6:_(s32) = G_UBFX %3, %4(s32), %5\n"
194853ab2d82SBrendon Cahoon " %ubfx_copy:_(s32) = COPY %6\n"
194953ab2d82SBrendon Cahoon " %7:_(s32) = G_CONSTANT i32 28672\n"
195053ab2d82SBrendon Cahoon " %8:_(s32) = G_UBFX %7, %4(s32), %5\n"
195153ab2d82SBrendon Cahoon " %ubfx_copy_val:_(s32) = COPY %8\n"
195253ab2d82SBrendon Cahoon " %9:_(s32) = G_IMPLICIT_DEF\n"
195353ab2d82SBrendon Cahoon " %10:_(s32) = G_IMPLICIT_DEF\n"
195453ab2d82SBrendon Cahoon " %11:_(s32) = G_UBFX %3, %9(s32), %10\n"
195553ab2d82SBrendon Cahoon " %ubfx_copy_unk:_(s32) = COPY %11\n"
195653ab2d82SBrendon Cahoon " %12:_(s32) = G_UBFX %3, %9(s32), %5\n"
195753ab2d82SBrendon Cahoon " %ubfx_copy_unk_off:_(s32) = COPY %12\n"
195853ab2d82SBrendon Cahoon " %13:_(s32) = G_UBFX %3, %4(s32), %10\n"
195953ab2d82SBrendon Cahoon " %ubfx_copy_unk_width:_(s32) = COPY %13\n";
196053ab2d82SBrendon Cahoon setUp(MIRString);
196153ab2d82SBrendon Cahoon if (!TM)
19627fc87159SPaul Robinson GTEST_SKIP();
196353ab2d82SBrendon Cahoon Register CopyBfxReg = Copies[Copies.size() - 5];
196453ab2d82SBrendon Cahoon Register CopyValBfxReg = Copies[Copies.size() - 4];
196553ab2d82SBrendon Cahoon Register CopyUnkBfxReg = Copies[Copies.size() - 3];
196653ab2d82SBrendon Cahoon Register CopyUnkOffBfxReg = Copies[Copies.size() - 2];
196753ab2d82SBrendon Cahoon Register CopyUnkWidthBfxReg = Copies[Copies.size() - 1];
196853ab2d82SBrendon Cahoon
196953ab2d82SBrendon Cahoon MachineInstr *CopyBfx = MRI->getVRegDef(CopyBfxReg);
197053ab2d82SBrendon Cahoon Register SrcReg = CopyBfx->getOperand(1).getReg();
197153ab2d82SBrendon Cahoon MachineInstr *CopyValBfx = MRI->getVRegDef(CopyValBfxReg);
197253ab2d82SBrendon Cahoon Register ValSrcReg = CopyValBfx->getOperand(1).getReg();
197353ab2d82SBrendon Cahoon MachineInstr *CopyUnkBfx = MRI->getVRegDef(CopyUnkBfxReg);
197453ab2d82SBrendon Cahoon Register UnkSrcReg = CopyUnkBfx->getOperand(1).getReg();
197553ab2d82SBrendon Cahoon MachineInstr *CopyUnkOffBfx = MRI->getVRegDef(CopyUnkOffBfxReg);
197653ab2d82SBrendon Cahoon Register UnkOffSrcReg = CopyUnkOffBfx->getOperand(1).getReg();
197753ab2d82SBrendon Cahoon MachineInstr *CopyUnkWidthBfx = MRI->getVRegDef(CopyUnkWidthBfxReg);
197853ab2d82SBrendon Cahoon Register UnkWidthSrcReg = CopyUnkWidthBfx->getOperand(1).getReg();
197953ab2d82SBrendon Cahoon
198053ab2d82SBrendon Cahoon GISelKnownBits Info(*MF);
198153ab2d82SBrendon Cahoon
198253ab2d82SBrendon Cahoon KnownBits Res1 = Info.getKnownBits(SrcReg);
198353ab2d82SBrendon Cahoon EXPECT_EQ(0u, Res1.One.getZExtValue());
198453ab2d82SBrendon Cahoon EXPECT_EQ(0xffffff00u, Res1.Zero.getZExtValue());
198553ab2d82SBrendon Cahoon
198653ab2d82SBrendon Cahoon KnownBits Res2 = Info.getKnownBits(ValSrcReg);
198753ab2d82SBrendon Cahoon EXPECT_EQ(7u, Res2.One.getZExtValue());
198853ab2d82SBrendon Cahoon EXPECT_EQ(0xfffffff8u, Res2.Zero.getZExtValue());
198953ab2d82SBrendon Cahoon
199053ab2d82SBrendon Cahoon KnownBits Res3 = Info.getKnownBits(UnkSrcReg);
199153ab2d82SBrendon Cahoon EXPECT_EQ(0u, Res3.One.getZExtValue());
199253ab2d82SBrendon Cahoon EXPECT_EQ(0u, Res3.Zero.getZExtValue());
199353ab2d82SBrendon Cahoon
199453ab2d82SBrendon Cahoon KnownBits Res4 = Info.getKnownBits(UnkOffSrcReg);
199553ab2d82SBrendon Cahoon EXPECT_EQ(0u, Res4.One.getZExtValue());
199653ab2d82SBrendon Cahoon EXPECT_EQ(0xffffff00u, Res4.Zero.getZExtValue());
199753ab2d82SBrendon Cahoon
199853ab2d82SBrendon Cahoon KnownBits Res5 = Info.getKnownBits(UnkWidthSrcReg);
199953ab2d82SBrendon Cahoon EXPECT_EQ(0u, Res5.One.getZExtValue());
200053ab2d82SBrendon Cahoon EXPECT_EQ(0xfff00000u, Res5.Zero.getZExtValue());
200153ab2d82SBrendon Cahoon }
200253ab2d82SBrendon Cahoon
TEST_F(AMDGPUGISelMITest,TestKnownBitsSBFX)200353ab2d82SBrendon Cahoon TEST_F(AMDGPUGISelMITest, TestKnownBitsSBFX) {
200453ab2d82SBrendon Cahoon StringRef MIRString = " %3:_(s32) = G_IMPLICIT_DEF\n"
200553ab2d82SBrendon Cahoon " %4:_(s32) = G_CONSTANT i32 8\n"
200653ab2d82SBrendon Cahoon " %5:_(s32) = G_CONSTANT i32 4\n"
200753ab2d82SBrendon Cahoon " %6:_(s32) = G_SBFX %3, %4(s32), %5\n"
200853ab2d82SBrendon Cahoon " %sbfx_copy:_(s32) = COPY %6\n"
200953ab2d82SBrendon Cahoon " %7:_(s32) = G_CONSTANT i32 2047\n"
201053ab2d82SBrendon Cahoon " %8:_(s32) = G_SBFX %7, %4(s32), %5\n"
201153ab2d82SBrendon Cahoon " %sbfx_copy_val:_(s32) = COPY %8\n"
201253ab2d82SBrendon Cahoon " %9:_(s32) = G_CONSTANT i32 2048\n"
201353ab2d82SBrendon Cahoon " %10:_(s32) = G_SBFX %9, %4(s32), %5\n"
201453ab2d82SBrendon Cahoon " %sbfx_copy_neg_val:_(s32) = COPY %10\n"
201553ab2d82SBrendon Cahoon " %11:_(s32) = G_IMPLICIT_DEF\n"
201653ab2d82SBrendon Cahoon " %12:_(s32) = G_SBFX %7, %11(s32), %5\n"
201753ab2d82SBrendon Cahoon " %sbfx_copy_unk_off:_(s32) = COPY %12\n"
201853ab2d82SBrendon Cahoon " %13:_(s32) = G_SBFX %9, %4(s32), %11\n"
201953ab2d82SBrendon Cahoon " %sbfx_copy_unk_width:_(s32) = COPY %13\n";
202053ab2d82SBrendon Cahoon setUp(MIRString);
202153ab2d82SBrendon Cahoon if (!TM)
20227fc87159SPaul Robinson GTEST_SKIP();
202353ab2d82SBrendon Cahoon Register CopyBfxReg = Copies[Copies.size() - 5];
202453ab2d82SBrendon Cahoon Register CopyValBfxReg = Copies[Copies.size() - 4];
202553ab2d82SBrendon Cahoon Register CopyNegValBfxReg = Copies[Copies.size() - 3];
202653ab2d82SBrendon Cahoon Register CopyUnkOffBfxReg = Copies[Copies.size() - 2];
202753ab2d82SBrendon Cahoon Register CopyUnkWidthBfxReg = Copies[Copies.size() - 1];
202853ab2d82SBrendon Cahoon
202953ab2d82SBrendon Cahoon MachineInstr *CopyBfx = MRI->getVRegDef(CopyBfxReg);
203053ab2d82SBrendon Cahoon Register SrcReg = CopyBfx->getOperand(1).getReg();
203153ab2d82SBrendon Cahoon MachineInstr *CopyValBfx = MRI->getVRegDef(CopyValBfxReg);
203253ab2d82SBrendon Cahoon Register ValSrcReg = CopyValBfx->getOperand(1).getReg();
203353ab2d82SBrendon Cahoon MachineInstr *CopyNegValBfx = MRI->getVRegDef(CopyNegValBfxReg);
203453ab2d82SBrendon Cahoon Register NegValSrcReg = CopyNegValBfx->getOperand(1).getReg();
203553ab2d82SBrendon Cahoon MachineInstr *CopyUnkOffBfx = MRI->getVRegDef(CopyUnkOffBfxReg);
203653ab2d82SBrendon Cahoon Register UnkOffSrcReg = CopyUnkOffBfx->getOperand(1).getReg();
203753ab2d82SBrendon Cahoon MachineInstr *CopyUnkWidthBfx = MRI->getVRegDef(CopyUnkWidthBfxReg);
203853ab2d82SBrendon Cahoon Register UnkWidthSrcReg = CopyUnkWidthBfx->getOperand(1).getReg();
203953ab2d82SBrendon Cahoon
204053ab2d82SBrendon Cahoon GISelKnownBits Info(*MF);
204153ab2d82SBrendon Cahoon
204253ab2d82SBrendon Cahoon KnownBits Res1 = Info.getKnownBits(SrcReg);
204353ab2d82SBrendon Cahoon EXPECT_EQ(0u, Res1.One.getZExtValue());
204453ab2d82SBrendon Cahoon EXPECT_EQ(0u, Res1.Zero.getZExtValue());
204553ab2d82SBrendon Cahoon
204653ab2d82SBrendon Cahoon KnownBits Res2 = Info.getKnownBits(ValSrcReg);
204753ab2d82SBrendon Cahoon EXPECT_EQ(7u, Res2.One.getZExtValue());
204853ab2d82SBrendon Cahoon EXPECT_EQ(0xfffffff8u, Res2.Zero.getZExtValue());
204953ab2d82SBrendon Cahoon
205053ab2d82SBrendon Cahoon KnownBits Res3 = Info.getKnownBits(NegValSrcReg);
205153ab2d82SBrendon Cahoon EXPECT_EQ(0xfffffff8u, Res3.One.getZExtValue());
205253ab2d82SBrendon Cahoon EXPECT_EQ(7u, Res3.Zero.getZExtValue());
205353ab2d82SBrendon Cahoon
205453ab2d82SBrendon Cahoon KnownBits Res4 = Info.getKnownBits(UnkOffSrcReg);
205553ab2d82SBrendon Cahoon EXPECT_EQ(0u, Res4.One.getZExtValue());
205653ab2d82SBrendon Cahoon EXPECT_EQ(0u, Res4.Zero.getZExtValue());
205753ab2d82SBrendon Cahoon
205853ab2d82SBrendon Cahoon KnownBits Res5 = Info.getKnownBits(UnkWidthSrcReg);
205953ab2d82SBrendon Cahoon EXPECT_EQ(0u, Res5.One.getZExtValue());
206053ab2d82SBrendon Cahoon EXPECT_EQ(0u, Res5.Zero.getZExtValue());
206153ab2d82SBrendon Cahoon }
206253ab2d82SBrendon Cahoon
TEST_F(AMDGPUGISelMITest,TestNumSignBitsUBFX)206353ab2d82SBrendon Cahoon TEST_F(AMDGPUGISelMITest, TestNumSignBitsUBFX) {
206453ab2d82SBrendon Cahoon StringRef MIRString = " %3:_(s32) = G_IMPLICIT_DEF\n"
206553ab2d82SBrendon Cahoon " %4:_(s32) = G_CONSTANT i32 12\n"
206653ab2d82SBrendon Cahoon " %5:_(s32) = G_CONSTANT i32 8\n"
206753ab2d82SBrendon Cahoon " %6:_(s32) = G_UBFX %3, %4(s32), %5\n"
206853ab2d82SBrendon Cahoon " %ubfx_copy_unk:_(s32) = COPY %6\n"
206953ab2d82SBrendon Cahoon " %7:_(s32) = G_CONSTANT i32 28672\n"
207053ab2d82SBrendon Cahoon " %8:_(s32) = G_UBFX %7, %4(s32), %5\n"
207153ab2d82SBrendon Cahoon " %ubfx_copy_pos:_(s32) = COPY %8\n"
207253ab2d82SBrendon Cahoon " %9:_(s32) = G_CONSTANT i32 -1\n"
207353ab2d82SBrendon Cahoon " %10:_(s32) = G_UBFX %9, %4(s32), %5\n"
207453ab2d82SBrendon Cahoon " %ubfx_copy_neg:_(s32) = COPY %10\n"
207553ab2d82SBrendon Cahoon " %11:_(s32) = G_IMPLICIT_DEF\n"
207653ab2d82SBrendon Cahoon " %12:_(s32) = G_UBFX %7, %11(s32), %5\n"
207753ab2d82SBrendon Cahoon " %ubfx_copy_unk_off:_(s32) = COPY %12\n"
207853ab2d82SBrendon Cahoon " %13:_(s32) = G_UBFX %7, %4(s32), %11\n"
207953ab2d82SBrendon Cahoon " %ubfx_copy_unk_width:_(s32) = COPY %13\n";
208053ab2d82SBrendon Cahoon setUp(MIRString);
208153ab2d82SBrendon Cahoon if (!TM)
20827fc87159SPaul Robinson GTEST_SKIP();
208353ab2d82SBrendon Cahoon Register CopyUnkBfxReg = Copies[Copies.size() - 5];
208453ab2d82SBrendon Cahoon Register CopyPosBfxReg = Copies[Copies.size() - 4];
208553ab2d82SBrendon Cahoon Register CopyNegBfxReg = Copies[Copies.size() - 3];
208653ab2d82SBrendon Cahoon Register CopyUnkOffBfxReg = Copies[Copies.size() - 2];
208753ab2d82SBrendon Cahoon Register CopyUnkWidthBfxReg = Copies[Copies.size() - 1];
208853ab2d82SBrendon Cahoon
208953ab2d82SBrendon Cahoon GISelKnownBits Info(*MF);
209053ab2d82SBrendon Cahoon EXPECT_EQ(24u, Info.computeNumSignBits(CopyUnkBfxReg));
209153ab2d82SBrendon Cahoon EXPECT_EQ(29u, Info.computeNumSignBits(CopyPosBfxReg));
209253ab2d82SBrendon Cahoon EXPECT_EQ(24u, Info.computeNumSignBits(CopyNegBfxReg));
209353ab2d82SBrendon Cahoon EXPECT_EQ(24u, Info.computeNumSignBits(CopyUnkOffBfxReg));
209453ab2d82SBrendon Cahoon EXPECT_EQ(29u, Info.computeNumSignBits(CopyUnkWidthBfxReg));
209553ab2d82SBrendon Cahoon }
209653ab2d82SBrendon Cahoon
TEST_F(AMDGPUGISelMITest,TestNumSignBitsSBFX)209753ab2d82SBrendon Cahoon TEST_F(AMDGPUGISelMITest, TestNumSignBitsSBFX) {
209853ab2d82SBrendon Cahoon StringRef MIRString = " %3:_(s32) = G_CONSTANT i32 -1\n"
209953ab2d82SBrendon Cahoon " %4:_(s32) = G_CONSTANT i32 8\n"
210053ab2d82SBrendon Cahoon " %5:_(s32) = G_CONSTANT i32 4\n"
210153ab2d82SBrendon Cahoon " %6:_(s32) = G_SBFX %3, %4(s32), %5\n"
210253ab2d82SBrendon Cahoon " %sbfx_copy_neg:_(s32) = COPY %6\n"
210353ab2d82SBrendon Cahoon " %7:_(s32) = G_CONSTANT i32 2047\n"
210453ab2d82SBrendon Cahoon " %8:_(s32) = G_SBFX %7, %4(s32), %5\n"
210553ab2d82SBrendon Cahoon " %sbfx_copy_pos:_(s32) = COPY %8\n"
210653ab2d82SBrendon Cahoon " %9:_(s32) = G_CONSTANT i32 2048\n"
210753ab2d82SBrendon Cahoon " %10:_(s32) = G_SBFX %9, %4(s32), %5\n"
210853ab2d82SBrendon Cahoon " %sbfx_copy_hiset:_(s32) = COPY %10\n"
210953ab2d82SBrendon Cahoon " %11:_(s32) = G_IMPLICIT_DEF\n"
211053ab2d82SBrendon Cahoon " %12:_(s32) = G_SBFX %11, %4(s32), %5\n"
211153ab2d82SBrendon Cahoon " %sbfx_copy_unk:_(s32) = COPY %12\n"
211253ab2d82SBrendon Cahoon " %13:_(s32) = G_SBFX %3, %11(s32), %5\n"
211353ab2d82SBrendon Cahoon " %sbfx_copy_unk_off:_(s32) = COPY %13\n";
211453ab2d82SBrendon Cahoon setUp(MIRString);
211553ab2d82SBrendon Cahoon if (!TM)
21167fc87159SPaul Robinson GTEST_SKIP();
211753ab2d82SBrendon Cahoon Register CopyNegBfxReg = Copies[Copies.size() - 5];
211853ab2d82SBrendon Cahoon Register CopyPosBfxReg = Copies[Copies.size() - 4];
211953ab2d82SBrendon Cahoon Register CopyHiSetBfxReg = Copies[Copies.size() - 3];
212053ab2d82SBrendon Cahoon Register CopyUnkValBfxReg = Copies[Copies.size() - 2];
212153ab2d82SBrendon Cahoon Register CopyUnkOffBfxReg = Copies[Copies.size() - 1];
212253ab2d82SBrendon Cahoon
212353ab2d82SBrendon Cahoon GISelKnownBits Info(*MF);
212453ab2d82SBrendon Cahoon EXPECT_EQ(32u, Info.computeNumSignBits(CopyNegBfxReg));
212553ab2d82SBrendon Cahoon EXPECT_EQ(29u, Info.computeNumSignBits(CopyPosBfxReg));
212653ab2d82SBrendon Cahoon EXPECT_EQ(29u, Info.computeNumSignBits(CopyHiSetBfxReg));
212753ab2d82SBrendon Cahoon EXPECT_EQ(1u, Info.computeNumSignBits(CopyUnkValBfxReg));
212853ab2d82SBrendon Cahoon EXPECT_EQ(1u, Info.computeNumSignBits(CopyUnkOffBfxReg));
212953ab2d82SBrendon Cahoon }
213099e8e173SMatt Arsenault
TEST_F(AMDGPUGISelMITest,TestKnownBitsAssertAlign)213199e8e173SMatt Arsenault TEST_F(AMDGPUGISelMITest, TestKnownBitsAssertAlign) {
213299e8e173SMatt Arsenault StringRef MIRString = R"MIR(
213399e8e173SMatt Arsenault %val:_(s64) = COPY $vgpr0_vgpr1
213499e8e173SMatt Arsenault %ptrval:_(p1) = COPY $vgpr0_vgpr1
213599e8e173SMatt Arsenault
213699e8e173SMatt Arsenault %assert_align1:_(s64) = G_ASSERT_ALIGN %val, 1
213799e8e173SMatt Arsenault %copy_assert_align1:_(s64) = COPY %assert_align1
213899e8e173SMatt Arsenault
213999e8e173SMatt Arsenault %assert_align2:_(s64) = G_ASSERT_ALIGN %val, 2
214099e8e173SMatt Arsenault %copy_assert_align2:_(s64) = COPY %assert_align2
214199e8e173SMatt Arsenault
214285cd376fSAmara Emerson %assert_align4:_(s64) = G_ASSERT_ALIGN %val, 4
214385cd376fSAmara Emerson %copy_assert_align4:_(s64) = COPY %assert_align4
214499e8e173SMatt Arsenault
214599e8e173SMatt Arsenault %assert_align8:_(s64) = G_ASSERT_ALIGN %val, 8
214699e8e173SMatt Arsenault %copy_assert_align8:_(s64) = COPY %assert_align8
214799e8e173SMatt Arsenault
214885cd376fSAmara Emerson %assert_align16:_(s64) = G_ASSERT_ALIGN %val, 16
214985cd376fSAmara Emerson %copy_assert_maxalign:_(s64) = COPY %assert_align16
215099e8e173SMatt Arsenault )MIR";
215199e8e173SMatt Arsenault setUp(MIRString);
215299e8e173SMatt Arsenault if (!TM)
21537fc87159SPaul Robinson GTEST_SKIP();
215499e8e173SMatt Arsenault GISelKnownBits Info(*MF);
215599e8e173SMatt Arsenault
215699e8e173SMatt Arsenault KnownBits Res;
215799e8e173SMatt Arsenault auto GetKB = [&](unsigned Idx) {
215899e8e173SMatt Arsenault Register CopyReg = Copies[Idx];
215999e8e173SMatt Arsenault auto *Copy = MRI->getVRegDef(CopyReg);
216099e8e173SMatt Arsenault return Info.getKnownBits(Copy->getOperand(1).getReg());
216199e8e173SMatt Arsenault };
216299e8e173SMatt Arsenault
216399e8e173SMatt Arsenault auto CheckBits = [&](unsigned NumBits, unsigned Idx) {
216499e8e173SMatt Arsenault Res = GetKB(Idx);
216599e8e173SMatt Arsenault EXPECT_EQ(64u, Res.getBitWidth());
2166f8f3db27SKazu Hirata EXPECT_EQ(NumBits - 1, Res.Zero.countr_one());
2167f8f3db27SKazu Hirata EXPECT_EQ(64u, Res.One.countr_zero());
216885cd376fSAmara Emerson EXPECT_EQ(Align(1ull << (NumBits - 1)), Info.computeKnownAlignment(Copies[Idx]));
216999e8e173SMatt Arsenault };
217099e8e173SMatt Arsenault
217185cd376fSAmara Emerson const unsigned NumSetupCopies = 5;
2172885a8703SAmara Emerson CheckBits(1, NumSetupCopies);
2173885a8703SAmara Emerson CheckBits(2, NumSetupCopies + 1);
2174885a8703SAmara Emerson CheckBits(3, NumSetupCopies + 2);
2175885a8703SAmara Emerson CheckBits(4, NumSetupCopies + 3);
2176885a8703SAmara Emerson CheckBits(5, NumSetupCopies + 4);
217799e8e173SMatt Arsenault }
21781416744fSMatt Arsenault
TEST_F(AArch64GISelMITest,TestKnownBitsUADDO)21791416744fSMatt Arsenault TEST_F(AArch64GISelMITest, TestKnownBitsUADDO) {
21801416744fSMatt Arsenault StringRef MIRString = R"(
21811416744fSMatt Arsenault %ptr:_(p0) = G_IMPLICIT_DEF
21821416744fSMatt Arsenault %ld0:_(s32) = G_LOAD %ptr(p0) :: (load (s16))
21831416744fSMatt Arsenault %ld1:_(s32) = G_LOAD %ptr(p0) :: (load (s16))
21841416744fSMatt Arsenault
21851416744fSMatt Arsenault %add:_(s32), %overflow:_(s32) = G_UADDO %ld0, %ld1
21861416744fSMatt Arsenault %copy_overflow:_(s32) = COPY %overflow
21871416744fSMatt Arsenault )";
21881416744fSMatt Arsenault
21891416744fSMatt Arsenault setUp(MIRString);
21901416744fSMatt Arsenault if (!TM)
21917fc87159SPaul Robinson GTEST_SKIP();
21921416744fSMatt Arsenault
21931416744fSMatt Arsenault Register CopyOverflow = Copies[Copies.size() - 1];
21941416744fSMatt Arsenault GISelKnownBits Info(*MF);
21951416744fSMatt Arsenault KnownBits Res = Info.getKnownBits(CopyOverflow);
21961416744fSMatt Arsenault EXPECT_EQ(0u, Res.One.getZExtValue());
2197f8f3db27SKazu Hirata EXPECT_EQ(31u, Res.Zero.countl_one());
21981416744fSMatt Arsenault }
2199