[llvm] e956df2 - [LLVM][ADT] Adding range-based test_all and test_any methods for BitVector (#209790)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 15 09:55:27 PDT 2026
Author: Markos Horro
Date: 2026-07-15T18:55:07+02:00
New Revision: e956df27dfaf556f54a96ed22e85f1e16c7a38e3
URL: https://github.com/llvm/llvm-project/commit/e956df27dfaf556f54a96ed22e85f1e16c7a38e3
DIFF: https://github.com/llvm/llvm-project/commit/e956df27dfaf556f54a96ed22e85f1e16c7a38e3.diff
LOG: [LLVM][ADT] Adding range-based test_all and test_any methods for BitVector (#209790)
Added:
Modified:
llvm/include/llvm/ADT/BitVector.h
llvm/include/llvm/ADT/SmallBitVector.h
llvm/unittests/ADT/BitVectorTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ADT/BitVector.h b/llvm/include/llvm/ADT/BitVector.h
index a9902f603081c..38fbe66388a72 100644
--- a/llvm/include/llvm/ADT/BitVector.h
+++ b/llvm/include/llvm/ADT/BitVector.h
@@ -483,6 +483,24 @@ class BitVector {
return (*this)[Idx];
}
+ /// Returns true if all bits in the range [Begin, End) are set.
+ bool test_all(unsigned Begin, unsigned End) const {
+ for (unsigned i = Begin; i < End; ++i) {
+ if (!test(i))
+ return false;
+ }
+ return true;
+ }
+
+ /// Returns true if any of the bits in the range [Begin, End) are set.
+ bool test_any(unsigned Begin, unsigned End) const {
+ for (unsigned i = Begin; i < End; ++i) {
+ if (test(i))
+ return true;
+ }
+ return false;
+ }
+
// Push single bit to end of bitvector.
void push_back(bool Val) {
unsigned OldSize = Size;
diff --git a/llvm/include/llvm/ADT/SmallBitVector.h b/llvm/include/llvm/ADT/SmallBitVector.h
index 01bd502d1552b..5d8c4be8d245f 100644
--- a/llvm/include/llvm/ADT/SmallBitVector.h
+++ b/llvm/include/llvm/ADT/SmallBitVector.h
@@ -471,10 +471,29 @@ class SmallBitVector {
return (*this)[size() - 1];
}
+ /// Returns true if bit \p Idx is set.
bool test(unsigned Idx) const {
return (*this)[Idx];
}
+ /// Returns true if all bits in the range [Begin, End) are set.
+ bool test_all(unsigned Begin, unsigned End) const {
+ for (unsigned i = Begin; i < End; ++i) {
+ if (!test(i))
+ return false;
+ }
+ return true;
+ }
+
+ /// Returns true if any of the bits in the range [Begin, End) are set.
+ bool test_any(unsigned Begin, unsigned End) const {
+ for (unsigned i = Begin; i < End; ++i) {
+ if (test(i))
+ return true;
+ }
+ return false;
+ }
+
// Push single bit to end of vector.
void push_back(bool Val) {
resize(size() + 1, Val);
diff --git a/llvm/unittests/ADT/BitVectorTest.cpp b/llvm/unittests/ADT/BitVectorTest.cpp
index 14f14660048b3..808e63c08cbaa 100644
--- a/llvm/unittests/ADT/BitVectorTest.cpp
+++ b/llvm/unittests/ADT/BitVectorTest.cpp
@@ -199,6 +199,43 @@ TYPED_TEST(BitVectorTest, Equality) {
EXPECT_TRUE(A == B);
}
+TYPED_TEST(BitVectorTest, TestAllAndAny) {
+ TypeParam Vec;
+ Vec.resize(10);
+
+ // Empty range
+ EXPECT_TRUE(Vec.test_all(3, 3));
+ EXPECT_FALSE(Vec.test_any(3, 3));
+
+ Vec.set(2, 5);
+ EXPECT_TRUE(Vec.test_all(2, 5));
+ EXPECT_FALSE(Vec.test_all(2, 6));
+ EXPECT_FALSE(Vec.test_all(1, 5));
+ EXPECT_TRUE(Vec.test_any(2, 5));
+ EXPECT_TRUE(Vec.test_any(4, 5));
+ EXPECT_FALSE(Vec.test_any(0, 2));
+
+ Vec.set(7);
+ EXPECT_FALSE(Vec.test_all(0, Vec.size()));
+ EXPECT_TRUE(Vec.test_any(6, Vec.size()));
+ Vec.reset(7);
+
+ TypeParam LargeVec;
+ LargeVec.resize(80);
+ LargeVec.set(10, 30);
+ EXPECT_TRUE(LargeVec.test_any(10, 30));
+ EXPECT_FALSE(LargeVec.test_all(10, 35));
+ EXPECT_FALSE(LargeVec.test_any(0, 10));
+
+ LargeVec.set(30, 35);
+ EXPECT_TRUE(LargeVec.test_all(10, 35));
+
+ LargeVec.set(70);
+ EXPECT_TRUE(LargeVec.test_any(68, 72));
+ LargeVec.reset(70);
+ EXPECT_FALSE(LargeVec.test_any(68, 72));
+}
+
TYPED_TEST(BitVectorTest, SimpleFindOpsMultiWord) {
TypeParam A;
More information about the llvm-commits
mailing list