From a028622e48d7af9f70b3fe21ec5b330d6b417eff Mon Sep 17 00:00:00 2001 From: Yaron Keren Date: Fri, 18 Sep 2015 06:35:12 +0000 Subject: [PATCH] Simplify SmallBitVector::applyMask by consolidating common code for 32-bit and 64-bit builds. Extend mask value to 64 bits before taking its complement and assert when mask is too large to apply in the small case (previously the extra words were silently ignored). http://reviews.llvm.org/D11890 Patch by James Touton! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247972 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ADT/SmallBitVector.h | 18 ++++++++---------- unittests/ADT/BitVectorTest.cpp | 4 ++-- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/include/llvm/ADT/SmallBitVector.h b/include/llvm/ADT/SmallBitVector.h index ae3d645396f..39d2e14a63d 100644 --- a/include/llvm/ADT/SmallBitVector.h +++ b/include/llvm/ADT/SmallBitVector.h @@ -553,17 +553,15 @@ public: private: template void applyMask(const uint32_t *Mask, unsigned MaskWords) { - if (NumBaseBits == 64 && MaskWords >= 2) { - uint64_t M = Mask[0] | (uint64_t(Mask[1]) << 32); - if (InvertMask) M = ~M; - if (AddBits) setSmallBits(getSmallBits() | M); - else setSmallBits(getSmallBits() & ~M); - } else { - uint32_t M = Mask[0]; - if (InvertMask) M = ~M; - if (AddBits) setSmallBits(getSmallBits() | M); - else setSmallBits(getSmallBits() & ~M); + uintptr_t M = Mask[0]; + if (MaskWords != 1) { + assert(NumBaseBits == 64 && MaskWords == 2 && + "Mask is larger than base!"); + M |= uintptr_t(Mask[1]) << 32; } + if (InvertMask) M = ~M; + if (AddBits) setSmallBits(getSmallBits() | M); + else setSmallBits(getSmallBits() & ~M); } }; diff --git a/unittests/ADT/BitVectorTest.cpp b/unittests/ADT/BitVectorTest.cpp index 3deaff0fe35..5d99e1d27a5 100644 --- a/unittests/ADT/BitVectorTest.cpp +++ b/unittests/ADT/BitVectorTest.cpp @@ -235,12 +235,12 @@ TYPED_TEST(BitVectorTest, PortableBitMask) { const uint32_t Mask1[] = { 0x80000000, 6, 5 }; A.resize(10); - A.setBitsInMask(Mask1, 3); + A.setBitsInMask(Mask1, 2); EXPECT_EQ(10u, A.size()); EXPECT_FALSE(A.test(0)); A.resize(32); - A.setBitsInMask(Mask1, 3); + A.setBitsInMask(Mask1, 2); EXPECT_FALSE(A.test(0)); EXPECT_TRUE(A.test(31)); EXPECT_EQ(1u, A.count()); -- 2.34.1