From 2d0f1c57c3f95e43a8b18bfe8481d90b665d5efe Mon Sep 17 00:00:00 2001 From: Torok Edwin Date: Tue, 27 Jan 2009 18:06:03 +0000 Subject: APInt's countLeadingOnes() was broken for negative i128 values, causing assertion failures in getSExtValue(). Fix it by making highWordBits actually contain what its name says, and add some more unit-tests for APInt. This fixes PR3419. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63107 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/APInt.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'lib/Support/APInt.cpp') diff --git a/lib/Support/APInt.cpp b/lib/Support/APInt.cpp index 367c75be1a..3d38a0c606 100644 --- a/lib/Support/APInt.cpp +++ b/lib/Support/APInt.cpp @@ -683,7 +683,13 @@ unsigned APInt::countLeadingOnes() const { return countLeadingOnes_64(VAL, APINT_BITS_PER_WORD - BitWidth); unsigned highWordBits = BitWidth % APINT_BITS_PER_WORD; - unsigned shift = (highWordBits == 0 ? 0 : APINT_BITS_PER_WORD - highWordBits); + unsigned shift; + if (!highWordBits) { + highWordBits = APINT_BITS_PER_WORD; + shift = 0; + } else { + shift = APINT_BITS_PER_WORD - highWordBits; + } int i = getNumWords() - 1; unsigned Count = countLeadingOnes_64(pVal[i], shift); if (Count == highWordBits) { -- cgit v1.2.3-18-g5258