From 38595fb257fee32aaa3b45ff73c3ceaac86e9143 Mon Sep 17 00:00:00 2001 From: Nikolas Klauser Date: Wed, 7 May 2025 16:54:34 +0200 Subject: [PATCH] [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). --- libcxx/include/__string/char_traits.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/libcxx/include/__string/char_traits.h b/libcxx/include/__string/char_traits.h index 60ec186ead82..86c92477cbfe 100644 --- a/libcxx/include/__string/char_traits.h +++ b/libcxx/include/__string/char_traits.h @@ -132,8 +132,6 @@ struct char_traits { 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 : __char_traits_base::length(const template 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)