GlobalISel: Start adding computeNumSignBits to GISelKnownBits
diff --git a/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp b/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp
index f7b0378..e6c92f3 100644
--- a/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp
@@ -133,3 +133,81 @@
   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));
+}