[libcxx-commits] [libcxx] [libc++] Use _BitInt and __builtin_popcountg in bitset::count() (PR #160679)
Nikolas Klauser via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Sep 25 03:10:20 PDT 2025
https://github.com/philnik777 created https://github.com/llvm/llvm-project/pull/160679
This has multiple benefits:
1) The compiler has to do way less work to figure out things fold into a simple `popcount`, improving compile times quite a bit
2) The compiler inlines better, since the compile doesn't have to do complicated optimizations to get to the same point. Looking at the pipeline, it seems that without this, LLVM has to go all the way to GVN to get to the same code as there is after the first InstCombine pass with this change.
>From 28df28be7ade05b99cf5abc28ce07703c6bdc94f Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Thu, 25 Sep 2025 11:51:32 +0200
Subject: [PATCH] [libc++] Use _BitInt and __builtin_popcountg in
bitset::count()
---
libcxx/include/bitset | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/libcxx/include/bitset b/libcxx/include/bitset
index e2b46154ae730..d8bb938456104 100644
--- a/libcxx/include/bitset
+++ b/libcxx/include/bitset
@@ -867,7 +867,14 @@ bitset<_Size>::to_string(char __zero, char __one) const {
template <size_t _Size>
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 size_t bitset<_Size>::count() const _NOEXCEPT {
- return static_cast<size_t>(std::count(__base::__make_iter(0), __base::__make_iter(_Size), true));
+#ifdef _LIBCPP_COMPILER_CLANG_BASED
+ if constexpr (_Size <= __base::__bits_per_word) {
+ return __builtin_popcountg(static_cast<unsigned _BitInt(_Size)>(__base::__first_));
+ } else
+#endif
+ {
+ return static_cast<size_t>(std::count(__base::__make_iter(0), __base::__make_iter(_Size), true));
+ }
}
template <size_t _Size>
More information about the libcxx-commits
mailing list