[llvm] a16477a - ADT: Add constructor from uint64_t array for Bitset (#162703)

via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 9 20:15:46 PDT 2025


Author: Matt Arsenault
Date: 2025-10-10T12:15:42+09:00
New Revision: a16477a52fcb49fa029b7ec215ec707b0a344223

URL: https://github.com/llvm/llvm-project/commit/a16477a52fcb49fa029b7ec215ec707b0a344223
DIFF: https://github.com/llvm/llvm-project/commit/a16477a52fcb49fa029b7ec215ec707b0a344223.diff

LOG: ADT: Add constructor from uint64_t array for Bitset (#162703)

Avoids exposing the implementation detail of uintptr_t to
the constructor.

This is a replacement of b738f630f73975bc591a82fdcb4858ae5da67477
which avoids needing tablegen to know the underlying storage type.

Added: 
    llvm/unittests/ADT/BitsetTest.cpp

Modified: 
    llvm/include/llvm/ADT/Bitset.h
    llvm/unittests/ADT/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/ADT/Bitset.h b/llvm/include/llvm/ADT/Bitset.h
index b1e539e39aff7..0dfeb2088dfa0 100644
--- a/llvm/include/llvm/ADT/Bitset.h
+++ b/llvm/include/llvm/ADT/Bitset.h
@@ -38,14 +38,22 @@ class Bitset {
   static constexpr unsigned NumWords =
       (NumBits + BitwordBits - 1) / BitwordBits;
 
-protected:
   using StorageType = std::array<BitWord, NumWords>;
-
-private:
   StorageType Bits{};
 
 protected:
-  constexpr Bitset(const StorageType &B) : Bits{B} {}
+  constexpr Bitset(const std::array<uint64_t, (NumBits + 63) / 64> &B) {
+    if constexpr (sizeof(BitWord) == sizeof(uint64_t)) {
+      for (size_t I = 0; I != B.size(); ++I)
+        Bits[I] = B[I];
+    } else {
+      for (size_t I = 0; I != B.size(); ++I) {
+        uint64_t Elt = B[I];
+        Bits[2 * I] = static_cast<uint32_t>(Elt);
+        Bits[2 * I + 1] = static_cast<uint32_t>(Elt >> 32);
+      }
+    }
+  }
 
 public:
   constexpr Bitset() = default;

diff  --git a/llvm/unittests/ADT/BitsetTest.cpp b/llvm/unittests/ADT/BitsetTest.cpp
new file mode 100644
index 0000000000000..8877397b30c53
--- /dev/null
+++ b/llvm/unittests/ADT/BitsetTest.cpp
@@ -0,0 +1,44 @@
+//===- llvm/unittest/Support/BitsetTest.cpp -------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ADT/Bitset.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+
+namespace {
+
+template <unsigned NumBits>
+class TestBitsetUInt64Array : public Bitset<NumBits> {
+  static constexpr unsigned NumElts = (NumBits + 63) / 64;
+
+public:
+  TestBitsetUInt64Array(const std::array<uint64_t, NumElts> &B)
+      : Bitset<NumBits>(B) {}
+
+  bool verifyValue(const std::array<uint64_t, NumElts> &B) const {
+    for (unsigned I = 0; I != NumBits; ++I) {
+      bool ReferenceVal =
+          (B[(I / 64)] & (static_cast<uint64_t>(1) << (I % 64))) != 0;
+      if (ReferenceVal != this->test(I))
+        return false;
+    }
+
+    return true;
+  }
+};
+
+TEST(BitsetTest, Construction) {
+  std::array<uint64_t, 2> TestVals = {0x123456789abcdef3, 0x1337d3a0b22c24};
+  TestBitsetUInt64Array<96> Test(TestVals);
+  EXPECT_TRUE(Test.verifyValue(TestVals));
+
+  TestBitsetUInt64Array<65> Test1(TestVals);
+  EXPECT_TRUE(Test1.verifyValue(TestVals));
+}
+} // namespace

diff  --git a/llvm/unittests/ADT/CMakeLists.txt b/llvm/unittests/ADT/CMakeLists.txt
index dafd73518aedb..848ccba696e76 100644
--- a/llvm/unittests/ADT/CMakeLists.txt
+++ b/llvm/unittests/ADT/CMakeLists.txt
@@ -12,6 +12,7 @@ add_llvm_unittest(ADTTests
   BitFieldsTest.cpp
   BitmaskEnumTest.cpp
   BitTest.cpp
+  BitsetTest.cpp
   BitVectorTest.cpp
   BreadthFirstIteratorTest.cpp
   BumpPtrListTest.cpp


        


More information about the llvm-commits mailing list