[libcxx-commits] [libcxx] 38595fb - [libc++] Remove a few unnecessary branches from basic_string::find (#137266)
via libcxx-commits
libcxx-commits at lists.llvm.org
Wed May 7 07:54:38 PDT 2025
Author: Nikolas Klauser
Date: 2025-05-07T10:54:34-04:00
New Revision: 38595fb257fee32aaa3b45ff73c3ceaac86e9143
URL: https://github.com/llvm/llvm-project/commit/38595fb257fee32aaa3b45ff73c3ceaac86e9143
DIFF: https://github.com/llvm/llvm-project/commit/38595fb257fee32aaa3b45ff73c3ceaac86e9143.diff
LOG: [libc++] Remove a few unnecessary branches from basic_string::find (#137266)
I've recently looked at the assembly for `basic_string::find()` and
realized that there were a few branches I didn't expect. It turns out
that we check for null before calling `__constexpr_memchr` in some
cases, which the compiler doesn't optimize away. This is a really
uncommon case though, so I'm not convinced it makes a ton of sense to
optimize for that.
The second case is where `__pos >= __sz`. There, we can instead check
`__pos > __sz`, which the optimizer is able to remove if `__pos == 0`,
which is also a quite common case (basic_string::find(CharT), without an
explicit size parameter).
Added:
Modified:
libcxx/include/__string/char_traits.h
Removed:
################################################################################
diff --git a/libcxx/include/__string/char_traits.h b/libcxx/include/__string/char_traits.h
index 60ec186ead826..86c92477cbfeb 100644
--- a/libcxx/include/__string/char_traits.h
+++ b/libcxx/include/__string/char_traits.h
@@ -132,8 +132,6 @@ struct char_traits<char> {
static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const char_type*
find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT {
- if (__n == 0)
- return nullptr;
return std::__constexpr_memchr(__s, __a, __n);
}
@@ -250,8 +248,6 @@ struct char_traits<wchar_t> : __char_traits_base<wchar_t, wint_t, static_cast<wi
static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const char_type*
find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT {
- if (__n == 0)
- return nullptr;
return std::__constexpr_wmemchr(__s, __a, __n);
}
};
@@ -352,7 +348,7 @@ inline _LIBCPP_CONSTEXPR_SINCE_CXX17 size_t char_traits<char32_t>::length(const
template <class _CharT, class _SizeT, class _Traits, _SizeT __npos>
inline _SizeT _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI
__str_find(const _CharT* __p, _SizeT __sz, _CharT __c, _SizeT __pos) _NOEXCEPT {
- if (__pos >= __sz)
+ if (__pos > __sz)
return __npos;
const _CharT* __r = _Traits::find(__p + __pos, __sz - __pos, __c);
if (__r == nullptr)
More information about the libcxx-commits
mailing list