diff --git a/llvm/include/llvm/ADT/APInt.h b/llvm/include/llvm/ADT/APInt.h index dc5d34f3b1f3..7e06d3d1aecc 100644 --- a/llvm/include/llvm/ADT/APInt.h +++ b/llvm/include/llvm/ADT/APInt.h @@ -896,10 +896,9 @@ public: /// countLeadingZeros - This function is an APInt version of the /// countLeadingZeros_{32,64} functions in MathExtras.h. It counts the number /// of zeros from the most significant bit to the first one bit. - /// @returns getNumWords() * APINT_BITS_PER_WORD if the value is zero. + /// @returns BitWidth if the value is zero. /// @returns the number of zeros from the most significant bit to the first /// one bits. - /// @brief Count the number of leading one bits. uint32_t countLeadingZeros() const; /// countLeadingOnes - This function counts the number of contiguous 1 bits @@ -911,8 +910,8 @@ public: /// countTrailingZeros - This function is an APInt version of the /// countTrailingZoers_{32,64} functions in MathExtras.h. It counts - /// the number of zeros from the least significant bit to the first one bit. - /// @returns getNumWords() * APINT_BITS_PER_WORD if the value is zero. + /// the number of zeros from the least significant bit to the first set bit. + /// @returns BitWidth if the value is zero. /// @returns the number of zeros from the least significant bit to the first /// one bit. /// @brief Count the number of trailing zero bits. diff --git a/llvm/lib/Support/APInt.cpp b/llvm/lib/Support/APInt.cpp index 7af0101ece81..3c83e8a749d9 100644 --- a/llvm/lib/Support/APInt.cpp +++ b/llvm/lib/Support/APInt.cpp @@ -745,7 +745,7 @@ uint32_t APInt::countLeadingZeros() const { uint32_t remainder = BitWidth % APINT_BITS_PER_WORD; if (remainder) Count -= APINT_BITS_PER_WORD - remainder; - return Count; + return std::min(Count, BitWidth); } static uint32_t countLeadingOnes_64(uint64_t V, uint32_t skip) { diff --git a/llvm/test/Transforms/ConstProp/2007-11-23-cttz.ll b/llvm/test/Transforms/ConstProp/2007-11-23-cttz.ll new file mode 100644 index 000000000000..995ce2febf87 --- /dev/null +++ b/llvm/test/Transforms/ConstProp/2007-11-23-cttz.ll @@ -0,0 +1,8 @@ +; RUN: llvm-as < %s | opt -constprop | llvm-dis | grep {ret i13 13} +; PR1816 +declare i13 @llvm.cttz.i13(i13) + +define i13 @test() { + %X = call i13 @llvm.cttz.i13(i13 0) + ret i13 %X +}