diff options
Diffstat (limited to 'llvm/unittests/CodeGen')
| -rw-r--r-- | llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp b/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp index f7b037866e0..e6c92f39e44 100644 --- a/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp @@ -133,3 +133,81 @@ TEST_F(GISelMITest, TestSignBitIsZero) { EXPECT_TRUE(KnownBits.signBitIsZero(Zero.getReg(0))); EXPECT_FALSE(KnownBits.signBitIsZero(SignBit.getReg(0))); } + +TEST_F(GISelMITest, TestNumSignBitsConstant) { + StringRef MIRString = " %3:_(s8) = G_CONSTANT i8 1\n" + " %4:_(s8) = COPY %3\n" + + " %5:_(s8) = G_CONSTANT i8 -1\n" + " %6:_(s8) = COPY %5\n" + + " %7:_(s8) = G_CONSTANT i8 127\n" + " %8:_(s8) = COPY %7\n" + + " %9:_(s8) = G_CONSTANT i8 32\n" + " %10:_(s8) = COPY %9\n" + + " %11:_(s8) = G_CONSTANT i8 -32\n" + " %12:_(s8) = COPY %11\n"; + setUp(MIRString); + if (!TM) + return; + Register CopyReg1 = Copies[Copies.size() - 5]; + Register CopyRegNeg1 = Copies[Copies.size() - 4]; + Register CopyReg127 = Copies[Copies.size() - 3]; + Register CopyReg32 = Copies[Copies.size() - 2]; + Register CopyRegNeg32 = Copies[Copies.size() - 1]; + + GISelKnownBits Info(*MF); + EXPECT_EQ(7u, Info.computeNumSignBits(CopyReg1)); + EXPECT_EQ(8u, Info.computeNumSignBits(CopyRegNeg1)); + EXPECT_EQ(1u, Info.computeNumSignBits(CopyReg127)); + EXPECT_EQ(2u, Info.computeNumSignBits(CopyReg32)); + EXPECT_EQ(3u, Info.computeNumSignBits(CopyRegNeg32)); +} + +TEST_F(GISelMITest, TestNumSignBitsSext) { + StringRef MIRString = " %3:_(p0) = G_IMPLICIT_DEF\n" + " %4:_(s8) = G_LOAD %3 :: (load 1)\n" + " %5:_(s32) = G_SEXT %4\n" + " %6:_(s32) = COPY %5\n" + + " %7:_(s8) = G_CONSTANT i8 -1\n" + " %8:_(s32) = G_SEXT %7\n" + " %9:_(s32) = COPY %8\n"; + setUp(MIRString); + if (!TM) + return; + Register CopySextLoad = Copies[Copies.size() - 2]; + Register CopySextNeg1 = Copies[Copies.size() - 1]; + + GISelKnownBits Info(*MF); + EXPECT_EQ(25u, Info.computeNumSignBits(CopySextLoad)); + EXPECT_EQ(32u, Info.computeNumSignBits(CopySextNeg1)); +} + +TEST_F(GISelMITest, TestNumSignBitsTrunc) { + StringRef MIRString = " %3:_(p0) = G_IMPLICIT_DEF\n" + " %4:_(s32) = G_LOAD %3 :: (load 4)\n" + " %5:_(s8) = G_TRUNC %4\n" + " %6:_(s8) = COPY %5\n" + + " %7:_(s32) = G_CONSTANT i32 -1\n" + " %8:_(s8) = G_TRUNC %7\n" + " %9:_(s8) = COPY %8\n" + + " %10:_(s32) = G_CONSTANT i32 7\n" + " %11:_(s8) = G_TRUNC %10\n" + " %12:_(s8) = COPY %11\n"; + setUp(MIRString); + if (!TM) + return; + Register CopyTruncLoad = Copies[Copies.size() - 3]; + Register CopyTruncNeg1 = Copies[Copies.size() - 2]; + Register CopyTrunc7 = Copies[Copies.size() - 1]; + + GISelKnownBits Info(*MF); + EXPECT_EQ(1u, Info.computeNumSignBits(CopyTruncLoad)); + EXPECT_EQ(8u, Info.computeNumSignBits(CopyTruncNeg1)); + EXPECT_EQ(5u, Info.computeNumSignBits(CopyTrunc7)); +} |

