Partially inline basic_string::operator=(const basic_string&)
Summary:
This change partially inlines operator=(const basic_string&) where both the input and current instance are short strings, making the assignment a fixed length inlined memcpy.
Assignments where either of the strings are long are delegate to __assign_no_alias<__is_short>(), which is templated for the long / short branch already observed in the caller.
Stable:
```
--------------------------------------------------------------------------------
Benchmark Time CPU Iterations
--------------------------------------------------------------------------------
BM_StringAssignStr_Empty_Opaque 2.65 ns 2.66 ns 263745536
BM_StringAssignStr_Empty_Transparent 2.95 ns 2.96 ns 236494848
BM_StringAssignStr_Small_Opaque 2.93 ns 2.94 ns 237301760
BM_StringAssignStr_Small_Transparent 2.69 ns 2.69 ns 265809920
BM_StringAssignStr_Large_Opaque 19.6 ns 19.6 ns 35573760
BM_StringAssignStr_Large_Transparent 19.1 ns 19.1 ns 36716544
BM_StringAssignStr_Huge_Opaque 1901 ns 1901 ns 364544
BM_StringAssignStr_Huge_Transparent 1889 ns 1889 ns 360448
```
Unstable
```
--------------------------------------------------------------------------------
Benchmark Time CPU Iterations
--------------------------------------------------------------------------------
BM_StringAssignStr_Empty_Opaque 1.29 ns 1.29 ns 540454912
BM_StringAssignStr_Empty_Transparent 1.11 ns 1.12 ns 628482048
BM_StringAssignStr_Small_Opaque 1.29 ns 1.29 ns 541216768
BM_StringAssignStr_Small_Transparent 1.11 ns 1.11 ns 629469184
BM_StringAssignStr_Large_Opaque 15.6 ns 15.6 ns 44945408
BM_StringAssignStr_Large_Transparent 14.9 ns 14.9 ns 46764032
BM_StringAssignStr_Huge_Opaque 1713 ns 1713 ns 401408
BM_StringAssignStr_Huge_Transparent 1704 ns 1704 ns 397312
```
Subscribers: libcxx-commits
Tags: #libc
Differential Revision: https://reviews.llvm.org/D75211
Cr-Mirrored-From: https://chromium.googlesource.com/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: f87d30cba2b54a9083a0b276ad97d645c4b8b16c
diff --git a/include/__string b/include/__string
index 2aeaeb8..45060c2 100644
--- a/include/__string
+++ b/include/__string
@@ -165,6 +165,8 @@
_Func(_LIBCPP_FUNC_VIS basic_string<_CharType>::size_type basic_string<_CharType>::find_last_of(value_type const*, size_type, size_type) const) \
_Func(_LIBCPP_FUNC_VIS void basic_string<_CharType>::__grow_by(size_type, size_type, size_type, size_type, size_type, size_type)) \
_Func(_LIBCPP_FUNC_VIS void basic_string<_CharType>::__grow_by_and_replace(size_type, size_type, size_type, size_type, size_type, size_type, value_type const*)) \
+ _Func(_LIBCPP_FUNC_VIS void basic_string<_CharType>::__assign_no_alias<false>(value_type const*, size_type)) \
+ _Func(_LIBCPP_FUNC_VIS void basic_string<_CharType>::__assign_no_alias<true>(value_type const*, size_type)) \
_Func(_LIBCPP_FUNC_VIS void basic_string<_CharType>::push_back(value_type)) \
_Func(_LIBCPP_FUNC_VIS basic_string<_CharType>& basic_string<_CharType>::append(size_type, value_type)) \
_Func(_LIBCPP_FUNC_VIS basic_string<_CharType>::size_type basic_string<_CharType>::rfind(value_type, size_type) const) \
@@ -179,7 +181,6 @@
_Func(_LIBCPP_FUNC_VIS basic_string<_CharType>::size_type basic_string<_CharType>::find(value_type const*, size_type, size_type) const) \
_Func(_LIBCPP_FUNC_VIS int basic_string<_CharType>::compare(size_type, size_type, basic_string const&, size_type, size_type) const) \
_Func(_LIBCPP_FUNC_VIS int basic_string<_CharType>::compare(size_type, size_type, value_type const*, size_type) const) \
- _Func(_LIBCPP_FUNC_VIS basic_string<_CharType>& basic_string<_CharType>::operator=(basic_string const&)) \
_Func(_LIBCPP_FUNC_VIS basic_string<_CharType>& basic_string<_CharType>::append(value_type const*)) \
_Func(_LIBCPP_FUNC_VIS basic_string<_CharType>& basic_string<_CharType>::replace(size_type, size_type, basic_string const&, size_type, size_type)) \
_Func(_LIBCPP_FUNC_VIS basic_string<_CharType>::iterator basic_string<_CharType>::insert(basic_string::const_iterator, value_type)) \