From 81a5ddcd9f703e006cdd44f78562c2a1e7aec0d7 Mon Sep 17 00:00:00 2001 From: Yaron Keren Date: Fri, 18 Sep 2015 15:08:24 +0000 Subject: [PATCH] Simplify SmallBitVector::applyMask by consolidating common code for 32- and 64-bit builds and assert when mask is too large to apply in the small case, previously the extra words were silently ignored. clang-format the entire function to match current code standards. This is a rewrite of r247972 which was reverted in r247983 due to warning and possible UB on 32-bits hosts. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247993 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ADT/SmallBitVector.h | 23 +++++++++++------------ unittests/ADT/BitVectorTest.cpp | 4 ++-- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/include/llvm/ADT/SmallBitVector.h b/include/llvm/ADT/SmallBitVector.h index ae3d645396f..4aa3bc217f4 100644 --- a/include/llvm/ADT/SmallBitVector.h +++ b/include/llvm/ADT/SmallBitVector.h @@ -551,19 +551,18 @@ public: } private: - template + 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); - } + assert(MaskWords <= sizeof(uintptr_t) && "Mask is larger than base!"); + uintptr_t M = Mask[0]; + if (NumBaseBits == 64) + M |= uint64_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..95ff93fa9c4 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, 1); EXPECT_EQ(10u, A.size()); EXPECT_FALSE(A.test(0)); A.resize(32); - A.setBitsInMask(Mask1, 3); + A.setBitsInMask(Mask1, 1); EXPECT_FALSE(A.test(0)); EXPECT_TRUE(A.test(31)); EXPECT_EQ(1u, A.count()); -- 2.34.1