https://gcc.gnu.org/g:e717c322c6ee21bd5d9cf9373dcd9b4e8ba3312f
commit r15-5216-ge717c322c6ee21bd5d9cf9373dcd9b4e8ba3312f Author: Jonathan Wakely <jwak...@redhat.com> Date: Fri Nov 1 21:52:37 2024 +0000 libstdc++: Replace _Hashtable::__fwd_value_for with cast We can just use a cast to the appropriate type instead of calling a function to do it. This gives the compiler less work to compile and optimize, and at -O0 avoids a function call per element. libstdc++-v3/ChangeLog: * include/bits/hashtable.h (_Hashtable::__fwd_value_for): Remove. (_Hashtable::_M_assign): Use static_cast instead of __fwd_value_for. Reviewed-by: François Dumont <fdum...@gcc.gnu.org> Diff: --- libstdc++-v3/include/bits/hashtable.h | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/libstdc++-v3/include/bits/hashtable.h b/libstdc++-v3/include/bits/hashtable.h index bf6eed7c1c69..f1c30896bcb0 100644 --- a/libstdc++-v3/include/bits/hashtable.h +++ b/libstdc++-v3/include/bits/hashtable.h @@ -325,13 +325,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __node_ptr _M_node; }; - template<typename _Ht> - static constexpr - __conditional_t<std::is_lvalue_reference<_Ht>::value, - const value_type&, value_type&&> - __fwd_value_for(value_type& __val) noexcept - { return std::move(__val); } - // Compile-time diagnostics. // _Hash_code_base has everything protected, so use this derived type to @@ -1406,11 +1399,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION if (!__ht._M_before_begin._M_nxt) return; + using _FromVal = __conditional_t<is_lvalue_reference<_Ht>::value, + const value_type&, value_type&&>; + // First deal with the special first node pointed to by // _M_before_begin. __node_ptr __ht_n = __ht._M_begin(); __node_ptr __this_n - = __node_gen(__fwd_value_for<_Ht>(__ht_n->_M_v())); + = __node_gen(static_cast<_FromVal>(__ht_n->_M_v())); this->_M_copy_code(*__this_n, *__ht_n); _M_update_bbegin(__this_n); @@ -1418,7 +1414,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __node_ptr __prev_n = __this_n; for (__ht_n = __ht_n->_M_next(); __ht_n; __ht_n = __ht_n->_M_next()) { - __this_n = __node_gen(__fwd_value_for<_Ht>(__ht_n->_M_v())); + __this_n = __node_gen(static_cast<_FromVal>(__ht_n->_M_v())); __prev_n->_M_nxt = __this_n; this->_M_copy_code(*__this_n, *__ht_n); size_type __bkt = _M_bucket_index(*__this_n);