From 6340722d1751841a00e791a44d8f2f5e481b8c61 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Fri, 30 Apr 2010 13:40:27 +0000 Subject: SmallBitVector: Rework find_first/find_next and tweak test to test them (at least on 64 bit platforms). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@102712 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ADT/SmallBitVector.h | 26 ++++++++++++-------------- unittests/ADT/SmallBitVectorTest.cpp | 5 +++-- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/include/llvm/ADT/SmallBitVector.h b/include/llvm/ADT/SmallBitVector.h index 884e631c88..3441d0a90c 100644 --- a/include/llvm/ADT/SmallBitVector.h +++ b/include/llvm/ADT/SmallBitVector.h @@ -199,13 +199,12 @@ public: int find_first() const { if (isSmall()) { uintptr_t Bits = getSmallBits(); - if (sizeof(uintptr_t) * CHAR_BIT == 32) { - size_t FirstBit = CountTrailingZeros_32(Bits); - return FirstBit == 32 ? -1 : FirstBit; - } else if (sizeof(uintptr_t) * CHAR_BIT == 64) { - size_t FirstBit = CountTrailingZeros_64(Bits); - return FirstBit == 64 ? -1 : FirstBit; - } + if (Bits == 0) + return -1; + if (sizeof(uintptr_t) * CHAR_BIT == 32) + return CountTrailingZeros_32(Bits); + if (sizeof(uintptr_t) * CHAR_BIT == 64) + return CountTrailingZeros_64(Bits); assert(0 && "Unsupported!"); } return getPointer()->find_first(); @@ -218,13 +217,12 @@ public: uintptr_t Bits = getSmallBits(); // Mask off previous bits. Bits &= ~uintptr_t(0) << (Prev + 1); - if (sizeof(uintptr_t) * CHAR_BIT == 32) { - size_t FirstBit = CountTrailingZeros_32(Bits); - return FirstBit == 32 ? -1 : FirstBit; - } else if (sizeof(uintptr_t) * CHAR_BIT == 64) { - size_t FirstBit = CountTrailingZeros_64(Bits); - return FirstBit == 64 ? -1 : FirstBit; - } + if (Bits == 0 || Prev + 1 >= getSmallSize()) + return -1; + if (sizeof(uintptr_t) * CHAR_BIT == 32) + return CountTrailingZeros_32(Bits); + if (sizeof(uintptr_t) * CHAR_BIT == 64) + return CountTrailingZeros_64(Bits); assert(0 && "Unsupported!"); } return getPointer()->find_next(Prev); diff --git a/unittests/ADT/SmallBitVectorTest.cpp b/unittests/ADT/SmallBitVectorTest.cpp index a0c079d874..e12abfe20d 100644 --- a/unittests/ADT/SmallBitVectorTest.cpp +++ b/unittests/ADT/SmallBitVectorTest.cpp @@ -55,7 +55,7 @@ TEST(SmallBitVectorTest, TrivialOperation) { Vec.resize(26, true); Vec.resize(29, false); Vec.resize(33, true); - Vec.resize(61, false); + Vec.resize(57, false); unsigned Count = 0; for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) { ++Count; @@ -66,7 +66,8 @@ TEST(SmallBitVectorTest, TrivialOperation) { EXPECT_EQ(Count, 23u); EXPECT_FALSE(Vec[0]); EXPECT_TRUE(Vec[32]); - EXPECT_FALSE(Vec[60]); + EXPECT_FALSE(Vec[56]); + Vec.resize(61, false); SmallBitVector Copy = Vec; SmallBitVector Alt(3, false); -- cgit v1.2.3