[libcxx-commits] [libcxx] [libc++] Simplify __bitset::__init (PR #121357)
Peng Liu via libcxx-commits
libcxx-commits at lists.llvm.org
Wed May 14 07:45:53 PDT 2025
https://github.com/winner245 updated https://github.com/llvm/llvm-project/pull/121357
>From c42c69ffb5ee7242e3c0583dd980d6d65d68785c Mon Sep 17 00:00:00 2001
From: Peng Liu <winner245 at hotmail.com>
Date: Mon, 30 Dec 2024 15:28:49 -0500
Subject: [PATCH 1/2] Simplify __bitset::__init
---
libcxx/include/bitset | 23 +++++++----------------
1 file changed, 7 insertions(+), 16 deletions(-)
diff --git a/libcxx/include/bitset b/libcxx/include/bitset
index 9273ccabbb4e3..38ade8a29db21 100644
--- a/libcxx/include/bitset
+++ b/libcxx/include/bitset
@@ -256,26 +256,16 @@ inline _LIBCPP_CONSTEXPR __bitset<_N_words, _Size>::__bitset() _NOEXCEPT
template <size_t _N_words, size_t _Size>
void __bitset<_N_words, _Size>::__init(unsigned long long __v, false_type) _NOEXCEPT {
- __storage_type __t[sizeof(unsigned long long) / sizeof(__storage_type)];
- size_t __sz = _Size;
- for (size_t __i = 0; __i < sizeof(__t) / sizeof(__t[0]); ++__i, __v >>= __bits_per_word, __sz -= __bits_per_word)
- if (__sz < __bits_per_word)
- __t[__i] = static_cast<__storage_type>(__v) & (1ULL << __sz) - 1;
- else
- __t[__i] = static_cast<__storage_type>(__v);
-
- std::copy(__t, __t + sizeof(__t) / sizeof(__t[0]), __first_);
- std::fill(
- __first_ + sizeof(__t) / sizeof(__t[0]), __first_ + sizeof(__first_) / sizeof(__first_[0]), __storage_type(0));
+ const size_t __n_words = std::min((sizeof(unsigned long long) - 1) / sizeof(__storage_type) + 1, _N_words);
+ for (size_t __i = 0; __i < __n_words; ++__i, __v >>= __bits_per_word)
+ __first_[__i] = static_cast<__storage_type>(__v);
+ std::fill(__first_ + __n_words, __first_ + _N_words, __storage_type(0));
}
template <size_t _N_words, size_t _Size>
inline _LIBCPP_HIDE_FROM_ABI void __bitset<_N_words, _Size>::__init(unsigned long long __v, true_type) _NOEXCEPT {
__first_[0] = __v;
- if (_Size < __bits_per_word)
- __first_[0] &= (1ULL << _Size) - 1;
-
- std::fill(__first_ + 1, __first_ + sizeof(__first_) / sizeof(__first_[0]), __storage_type(0));
+ std::fill(__first_ + 1, __first_ + _N_words, __storage_type(0));
}
# endif // _LIBCPP_CXX03_LANG
@@ -621,7 +611,8 @@ public:
// 23.3.5.1 constructors:
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bitset() _NOEXCEPT {}
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bitset(unsigned long long __v) _NOEXCEPT : __base(__v) {}
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bitset(unsigned long long __v) _NOEXCEPT
+ : __base(sizeof(unsigned long long) * CHAR_BIT <= _Size ? __v : __v & ((1ULL << _Size) - 1)) {}
template <class _CharT, __enable_if_t<_IsCharLikeType<_CharT>::value, int> = 0>
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 explicit bitset(
const _CharT* __str,
>From 4c58cc77d838543074333c04df4d2c4e71f52394 Mon Sep 17 00:00:00 2001
From: Peng Liu <winner245 at hotmail.com>
Date: Mon, 24 Feb 2025 18:26:53 -0500
Subject: [PATCH 2/2] Add benchmark
---
libcxx/test/benchmarks/bitset.bench.cpp | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
create mode 100644 libcxx/test/benchmarks/bitset.bench.cpp
diff --git a/libcxx/test/benchmarks/bitset.bench.cpp b/libcxx/test/benchmarks/bitset.bench.cpp
new file mode 100644
index 0000000000000..55a36d0b566f0
--- /dev/null
+++ b/libcxx/test/benchmarks/bitset.bench.cpp
@@ -0,0 +1,22 @@
+//===----------------------------------------------------------------------===//
+//
+// 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 <benchmark/benchmark.h>
+#include <bitset>
+
+static void BM_ctor_ull(benchmark::State& state) {
+ unsigned long long val = (1ULL << state.range(0)) - 1;
+ for (auto _ : state) {
+ std::bitset<128> b(val);
+ benchmark::DoNotOptimize(b);
+ }
+}
+
+BENCHMARK(BM_ctor_ull)->DenseRange(1, 63);
+
+BENCHMARK_MAIN();
More information about the libcxx-commits
mailing list