aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-11-23 22:42:31 +0000
committerChris Lattner <sabre@nondot.org>2007-11-23 22:42:31 +0000
commit9e513acd3145036bd06b5e0f5bcc83a3e5c08854 (patch)
tree96d9fb363f32d37c2ba69af504ad1faea4140c0e
parent8314a0cd0ff3a1bb86bf8ab7ec6e35b232c6cb37 (diff)
Fix PR1816, by correcting the broken definition of APInt::countTrailingZeros.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44296 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/ADT/APInt.h7
-rw-r--r--lib/Support/APInt.cpp2
-rw-r--r--test/Transforms/ConstProp/2007-11-23-cttz.ll8
3 files changed, 12 insertions, 5 deletions
diff --git a/include/llvm/ADT/APInt.h b/include/llvm/ADT/APInt.h
index dc5d34f3b1..7e06d3d1ae 100644
--- a/include/llvm/ADT/APInt.h
+++ b/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/lib/Support/APInt.cpp b/lib/Support/APInt.cpp
index 7af0101ece..3c83e8a749 100644
--- a/lib/Support/APInt.cpp
+++ b/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/test/Transforms/ConstProp/2007-11-23-cttz.ll b/test/Transforms/ConstProp/2007-11-23-cttz.ll
new file mode 100644
index 0000000000..995ce2febf
--- /dev/null
+++ b/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
+}