aboutsummaryrefslogtreecommitdiff
path: root/libcxx
diff options
context:
space:
mode:
authorLouis Dionne <ldionne.2@gmail.com>2024-06-11 16:55:56 -0400
committerGitHub <noreply@github.com>2024-06-11 16:55:56 -0400
commit6faae130e4ea34f8b092fdfcd866fbb5861bfc49 (patch)
tree9c1c08e36412afce2834398aec96b4adc286ee96 /libcxx
parentf638f7b6a7c22bc802bb9620acfa10a00d4217cf (diff)
downloadllvm-6faae130e4ea34f8b092fdfcd866fbb5861bfc49.zip
llvm-6faae130e4ea34f8b092fdfcd866fbb5861bfc49.tar.gz
llvm-6faae130e4ea34f8b092fdfcd866fbb5861bfc49.tar.bz2
[libc++] Simplify the definition of string::operator== (#95000)
Instead of hardcoding a loop for small strings, always call char_traits::compare which ends up desugaring to __builtin_memcmp. Note that the original code dates back 11 years, when we didn't lower to intrinsics in `char_traits::compare`. Fixes #94222
Diffstat (limited to 'libcxx')
-rw-r--r--libcxx/include/string13
1 files changed, 3 insertions, 10 deletions
diff --git a/libcxx/include/string b/libcxx/include/string
index 1db803e..5301f8a 100644
--- a/libcxx/include/string
+++ b/libcxx/include/string
@@ -3746,17 +3746,10 @@ template <class _Allocator>
inline _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool
operator==(const basic_string<char, char_traits<char>, _Allocator>& __lhs,
const basic_string<char, char_traits<char>, _Allocator>& __rhs) _NOEXCEPT {
- size_t __lhs_sz = __lhs.size();
- if (__lhs_sz != __rhs.size())
+ size_t __sz = __lhs.size();
+ if (__sz != __rhs.size())
return false;
- const char* __lp = __lhs.data();
- const char* __rp = __rhs.data();
- if (__lhs.__is_long())
- return char_traits<char>::compare(__lp, __rp, __lhs_sz) == 0;
- for (; __lhs_sz != 0; --__lhs_sz, ++__lp, ++__rp)
- if (*__lp != *__rp)
- return false;
- return true;
+ return char_traits<char>::compare(__lhs.data(), __rhs.data(), __sz) == 0;
}
#if _LIBCPP_STD_VER <= 17