From c08decdcb899a3245323744e9f23645caab86d30 Mon Sep 17 00:00:00 2001 From: Ben Niu Date: Fri, 2 Aug 2024 08:31:57 -0700 Subject: [PATCH 1/6] Update __msvc_string_view.hpp --- stl/inc/__msvc_string_view.hpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/stl/inc/__msvc_string_view.hpp b/stl/inc/__msvc_string_view.hpp index 5ef55aded1..32319242f8 100644 --- a/stl/inc/__msvc_string_view.hpp +++ b/stl/inc/__msvc_string_view.hpp @@ -220,11 +220,15 @@ struct _WChar_traits : private _Char_traits<_Elem, unsigned short> { _In_reads_(_Count) const _Elem* const _First2, const size_t _Count) noexcept /* strengthened */ { // compare [_First1, _First1 + _Count) with [_First2, ...) #if _HAS_CXX17 - if constexpr (is_same_v<_Elem, wchar_t>) { +#if _HAS_CXX20 + if (_STD _Is_constant_evaluated()) { + return __builtin_wmemcmp(_First1, _First2, _Count); + } else { + return _CSTD wmemcmp(_First1, _First2, _Count); + } +#else // ^^^ _HAS_CXX20 / !_HAS_CXX20 vvv return __builtin_wmemcmp(_First1, _First2, _Count); - } else { - return _Primary_char_traits::compare(_First1, _First2, _Count); - } +#endif // ^^^ !_HAS_CXX20 ^^^ #else // ^^^ _HAS_CXX17 / !_HAS_CXX17 vvv return _CSTD wmemcmp( reinterpret_cast(_First1), reinterpret_cast(_First2), _Count); @@ -249,7 +253,15 @@ struct _WChar_traits : private _Char_traits<_Elem, unsigned short> { // look for _Ch in [_First, _First + _Count) #if _HAS_CXX17 if constexpr (is_same_v<_Elem, wchar_t>) { - return __builtin_wmemchr(_First, _Ch, _Count); +#if _HAS_CXX20 + if (_STD _Is_constant_evaluated()) { + return __builtin_wmemchr(_First1, _Ch, _Count); + } else { + return _CSTD wmemchr(_First1, _Ch, _Count); + } +#else // ^^^ _HAS_CXX20 / !_HAS_CXX20 vvv + return __builtin_wmemchr(_First1, _Ch, _Count); +#endif // ^^^ !_HAS_CXX20 ^^^ } else { return _Primary_char_traits::find(_First, _Count, _Ch); } From b3341195691dc6aa4648a5fccd3780585201992d Mon Sep 17 00:00:00 2001 From: Ben Niu Date: Fri, 2 Aug 2024 08:39:58 -0700 Subject: [PATCH 2/6] Update __msvc_string_view.hpp --- stl/inc/__msvc_string_view.hpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/stl/inc/__msvc_string_view.hpp b/stl/inc/__msvc_string_view.hpp index 32319242f8..d636694abc 100644 --- a/stl/inc/__msvc_string_view.hpp +++ b/stl/inc/__msvc_string_view.hpp @@ -220,6 +220,7 @@ struct _WChar_traits : private _Char_traits<_Elem, unsigned short> { _In_reads_(_Count) const _Elem* const _First2, const size_t _Count) noexcept /* strengthened */ { // compare [_First1, _First1 + _Count) with [_First2, ...) #if _HAS_CXX17 + if constexpr (is_same_v<_Elem, wchar_t>) { #if _HAS_CXX20 if (_STD _Is_constant_evaluated()) { return __builtin_wmemcmp(_First1, _First2, _Count); @@ -229,6 +230,9 @@ struct _WChar_traits : private _Char_traits<_Elem, unsigned short> { #else // ^^^ _HAS_CXX20 / !_HAS_CXX20 vvv return __builtin_wmemcmp(_First1, _First2, _Count); #endif // ^^^ !_HAS_CXX20 ^^^ + } else { + return _Primary_char_traits::compare(_First1, _First2, _Count); + } #else // ^^^ _HAS_CXX17 / !_HAS_CXX17 vvv return _CSTD wmemcmp( reinterpret_cast(_First1), reinterpret_cast(_First2), _Count); @@ -255,12 +259,12 @@ struct _WChar_traits : private _Char_traits<_Elem, unsigned short> { if constexpr (is_same_v<_Elem, wchar_t>) { #if _HAS_CXX20 if (_STD _Is_constant_evaluated()) { - return __builtin_wmemchr(_First1, _Ch, _Count); + return __builtin_wmemchr(_First, _Ch, _Count); } else { - return _CSTD wmemchr(_First1, _Ch, _Count); + return _CSTD wmemchr(_First, _Ch, _Count); } #else // ^^^ _HAS_CXX20 / !_HAS_CXX20 vvv - return __builtin_wmemchr(_First1, _Ch, _Count); + return __builtin_wmemchr(_First, _Ch, _Count); #endif // ^^^ !_HAS_CXX20 ^^^ } else { return _Primary_char_traits::find(_First, _Count, _Ch); From 394eea531cff8983190e4ec25a759e4fa24690c0 Mon Sep 17 00:00:00 2001 From: Ben Niu Date: Fri, 2 Aug 2024 09:09:18 -0700 Subject: [PATCH 3/6] Update __msvc_string_view.hpp --- stl/inc/__msvc_string_view.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stl/inc/__msvc_string_view.hpp b/stl/inc/__msvc_string_view.hpp index d636694abc..5c121fddc3 100644 --- a/stl/inc/__msvc_string_view.hpp +++ b/stl/inc/__msvc_string_view.hpp @@ -222,7 +222,7 @@ struct _WChar_traits : private _Char_traits<_Elem, unsigned short> { #if _HAS_CXX17 if constexpr (is_same_v<_Elem, wchar_t>) { #if _HAS_CXX20 - if (_STD _Is_constant_evaluated()) { + if (_STD is_constant_evaluated()) { return __builtin_wmemcmp(_First1, _First2, _Count); } else { return _CSTD wmemcmp(_First1, _First2, _Count); @@ -258,7 +258,7 @@ struct _WChar_traits : private _Char_traits<_Elem, unsigned short> { #if _HAS_CXX17 if constexpr (is_same_v<_Elem, wchar_t>) { #if _HAS_CXX20 - if (_STD _Is_constant_evaluated()) { + if (_STD is_constant_evaluated()) { return __builtin_wmemchr(_First, _Ch, _Count); } else { return _CSTD wmemchr(_First, _Ch, _Count); From d9c17909f8a1f565e8a128efb257273c1c8c2bf9 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 2 Aug 2024 15:52:06 -0700 Subject: [PATCH 4/6] Activate optimization for exactly C++17. --- stl/inc/__msvc_string_view.hpp | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/stl/inc/__msvc_string_view.hpp b/stl/inc/__msvc_string_view.hpp index 5c121fddc3..255dee3ba0 100644 --- a/stl/inc/__msvc_string_view.hpp +++ b/stl/inc/__msvc_string_view.hpp @@ -221,15 +221,11 @@ struct _WChar_traits : private _Char_traits<_Elem, unsigned short> { // compare [_First1, _First1 + _Count) with [_First2, ...) #if _HAS_CXX17 if constexpr (is_same_v<_Elem, wchar_t>) { -#if _HAS_CXX20 - if (_STD is_constant_evaluated()) { + if (_STD _Is_constant_evaluated()) { return __builtin_wmemcmp(_First1, _First2, _Count); } else { return _CSTD wmemcmp(_First1, _First2, _Count); } -#else // ^^^ _HAS_CXX20 / !_HAS_CXX20 vvv - return __builtin_wmemcmp(_First1, _First2, _Count); -#endif // ^^^ !_HAS_CXX20 ^^^ } else { return _Primary_char_traits::compare(_First1, _First2, _Count); } @@ -257,15 +253,11 @@ struct _WChar_traits : private _Char_traits<_Elem, unsigned short> { // look for _Ch in [_First, _First + _Count) #if _HAS_CXX17 if constexpr (is_same_v<_Elem, wchar_t>) { -#if _HAS_CXX20 - if (_STD is_constant_evaluated()) { + if (_STD _Is_constant_evaluated()) { return __builtin_wmemchr(_First, _Ch, _Count); } else { return _CSTD wmemchr(_First, _Ch, _Count); } -#else // ^^^ _HAS_CXX20 / !_HAS_CXX20 vvv - return __builtin_wmemchr(_First, _Ch, _Count); -#endif // ^^^ !_HAS_CXX20 ^^^ } else { return _Primary_char_traits::find(_First, _Count, _Ch); } From ba5b17d446d6e1cc9d0028bb65da0325e77c2bef Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 2 Aug 2024 16:16:38 -0700 Subject: [PATCH 5/6] Activate optimization for char16_t, unify wmemcmp/wmemchr calls. --- stl/inc/__msvc_string_view.hpp | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/stl/inc/__msvc_string_view.hpp b/stl/inc/__msvc_string_view.hpp index 255dee3ba0..d6a55d93e6 100644 --- a/stl/inc/__msvc_string_view.hpp +++ b/stl/inc/__msvc_string_view.hpp @@ -220,19 +220,17 @@ struct _WChar_traits : private _Char_traits<_Elem, unsigned short> { _In_reads_(_Count) const _Elem* const _First2, const size_t _Count) noexcept /* strengthened */ { // compare [_First1, _First1 + _Count) with [_First2, ...) #if _HAS_CXX17 - if constexpr (is_same_v<_Elem, wchar_t>) { - if (_STD _Is_constant_evaluated()) { + if (_STD _Is_constant_evaluated()) { + if constexpr (is_same_v<_Elem, wchar_t>) { return __builtin_wmemcmp(_First1, _First2, _Count); } else { - return _CSTD wmemcmp(_First1, _First2, _Count); + return _Primary_char_traits::compare(_First1, _First2, _Count); } - } else { - return _Primary_char_traits::compare(_First1, _First2, _Count); } -#else // ^^^ _HAS_CXX17 / !_HAS_CXX17 vvv +#endif // _HAS_CXX17 + return _CSTD wmemcmp( reinterpret_cast(_First1), reinterpret_cast(_First2), _Count); -#endif // ^^^ !_HAS_CXX17 ^^^ } _NODISCARD static _CONSTEXPR17 size_t length(_In_z_ const _Elem* _First) noexcept /* strengthened */ { @@ -252,18 +250,16 @@ struct _WChar_traits : private _Char_traits<_Elem, unsigned short> { _In_reads_(_Count) const _Elem* _First, const size_t _Count, const _Elem& _Ch) noexcept /* strengthened */ { // look for _Ch in [_First, _First + _Count) #if _HAS_CXX17 - if constexpr (is_same_v<_Elem, wchar_t>) { - if (_STD _Is_constant_evaluated()) { + if (_STD _Is_constant_evaluated()) { + if constexpr (is_same_v<_Elem, wchar_t>) { return __builtin_wmemchr(_First, _Ch, _Count); } else { - return _CSTD wmemchr(_First, _Ch, _Count); + return _Primary_char_traits::find(_First, _Count, _Ch); } - } else { - return _Primary_char_traits::find(_First, _Count, _Ch); } -#else // ^^^ _HAS_CXX17 / !_HAS_CXX17 vvv +#endif // _HAS_CXX17 + return reinterpret_cast(_CSTD wmemchr(reinterpret_cast(_First), _Ch, _Count)); -#endif // ^^^ !_HAS_CXX17 ^^^ } static _CONSTEXPR20 _Elem* assign( From 82d2eff51ef804a261d453e9e658ce23e05677d1 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 2 Aug 2024 16:25:04 -0700 Subject: [PATCH 6/6] Also make length() fall through to wcslen(). --- stl/inc/__msvc_string_view.hpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/stl/inc/__msvc_string_view.hpp b/stl/inc/__msvc_string_view.hpp index d6a55d93e6..acc6ac364b 100644 --- a/stl/inc/__msvc_string_view.hpp +++ b/stl/inc/__msvc_string_view.hpp @@ -236,14 +236,16 @@ struct _WChar_traits : private _Char_traits<_Elem, unsigned short> { _NODISCARD static _CONSTEXPR17 size_t length(_In_z_ const _Elem* _First) noexcept /* strengthened */ { // find length of null-terminated sequence #if _HAS_CXX17 - if constexpr (is_same_v<_Elem, wchar_t>) { - return __builtin_wcslen(_First); - } else { - return _Primary_char_traits::length(_First); + if (_STD _Is_constant_evaluated()) { + if constexpr (is_same_v<_Elem, wchar_t>) { + return __builtin_wcslen(_First); + } else { + return _Primary_char_traits::length(_First); + } } -#else // ^^^ _HAS_CXX17 / !_HAS_CXX17 vvv +#endif // _HAS_CXX17 + return _CSTD wcslen(reinterpret_cast(_First)); -#endif // ^^^ !_HAS_CXX17 ^^^ } _NODISCARD static _CONSTEXPR17 const _Elem* find(