Re: [PATCH v2] libstdc++: Remove unnecessary code from reduce implementation
Jonathan Wakely <[email protected]>
| Newsgroups | gmane.comp.gcc.patches,gmane.comp.gcc.libstdc++.devel |
|---|---|
| Message-ID | <CACb0b4kbq+b3DCDop4+wbkPtA1nJnWfwWoGKK3gtKW3rQ9CbFw@mail.gmail.com> |
On Wed, 19 Aug 2026 at 09:53, Tomasz Kaminski <[email protected]> wrote: > > > > On Tue, Aug 18, 2026 at 10:10 AM Matthias Kretz <[email protected]> wrote: >> >> Resending (see patch from 2026-07-02). OK for trunk? OK for trunk, thanks. (Is it still needed for gcc-16? Should the drive-by be backported at least?) >> >> ------------- 8< ----------- >> >> From: Matthias Kretz <[email protected]> >> >> Previously, this was necessary for efficient reductions. When I tried to >> turn it into a missed-optimization PR, there was no issue (anymore). The >> generic _S_static_permute implementation optimizes just fine (or better) >> at this point. >> >> The traits_impl.cc change is a simple drive-by fix. >> >> libstdc++-v3/ChangeLog: >> >> * include/bits/simd_vec.h (_M_elements_shifted_to_front): Remove >> x86-specific implementation. >> * testsuite/std/simd/traits_impl.cc: Fix incorrect macro name. >> >> Signed-off-by: Matthias Kretz <[email protected]> > > Thanks, this LGTM. Happy to see that optimization is no longer needed. > Still needs Jonathan ACK. >> >> --- >> libstdc++-v3/include/bits/simd_vec.h | 32 +++---------------- >> .../testsuite/std/simd/traits_impl.cc | 2 +- >> 2 files changed, 6 insertions(+), 28 deletions(-) >> >> diff --git a/libstdc++-v3/include/bits/simd_vec.h b/libstdc++-v3/include/bits/ >> simd_vec.h >> index bf6616df227..9473c57b6cd 100644 >> --- a/libstdc++-v3/include/bits/simd_vec.h >> +++ b/libstdc++-v3/include/bits/simd_vec.h >> @@ -449,33 +449,11 @@ _M_elements_shifted_to_front() const >> static_assert(_Shift < _S_size && -_Shift < _S_size); >> if constexpr (_Shift == 0) >> return *this; >> -#ifdef __SSE2__ >> - else if (!__is_const_known(*this)) >> - { >> - if constexpr (sizeof(_M_data) == 16 && _Shift > 0) >> - return reinterpret_cast<_DataType>( >> - __builtin_ia32_psrldqi128(__vec_bit_cast<long >> long>(_M_data), >> - _Shift * >> sizeof(value_type) * 8)); >> - else if constexpr (sizeof(_M_data) == 16 && _Shift < 0) >> - return reinterpret_cast<_DataType>( >> - __builtin_ia32_pslldqi128(__vec_bit_cast<long >> long>(_M_data), >> - -_Shift * >> sizeof(value_type) * 8)); >> - else if constexpr (sizeof(_M_data) < 16) >> - { >> - auto __x = reinterpret_cast<__vec_builtin_type_bytes<long >> long, 16>>( >> - __vec_zero_pad_to_16(_M_data)); >> - if constexpr (_Shift > 0) >> - __x = __builtin_ia32_psrldqi128(__x, _Shift * >> sizeof(value_type) * 8); >> - else >> - __x = __builtin_ia32_pslldqi128(__x, -_Shift * >> sizeof(value_type) * 8); >> - return >> _VecOps<_DataType>::_S_extract(__vec_bit_cast<__canon_value_type>(__x)); >> - } >> - } >> -#endif >> - return _S_static_permute(*this, [](int __i) consteval { >> - int __off = __i + _Shift; >> - return __off >= _S_size || __off < 0 ? zero_element : >> __off; >> - }); >> + else >> + return _S_static_permute(*this, [](int __i) consteval { >> + int __off = __i + _Shift; >> + return __off >= _S_size || __off < 0 ? zero_element : >> __off; >> + }); >> } >> >> /** @internal >> diff --git a/libstdc++-v3/testsuite/std/simd/traits_impl.cc b/libstdc++-v3/ >> testsuite/std/simd/traits_impl.cc >> index dde41c70aca..9f6e9f42b6e 100644 >> --- a/libstdc++-v3/testsuite/std/simd/traits_impl.cc >> +++ b/libstdc++-v3/testsuite/std/simd/traits_impl.cc >> @@ -49,7 +49,7 @@ namespace simd >> static_assert(__vectorizable<__integer_from<N>>); >> } >> template for (constexpr int N : { >> -#ifdef __STDCPP_BFLOAT16_T__ >> +#ifdef __STDCPP_FLOAT16_T__ >> 2, >> #endif >> 4, 8}) >> -- >> ────────────────────────────────────────────────────────────────────────── >> Dr. Matthias Kretz https://mattkretz.github.io >> GSI Helmholtz Center for Heavy Ion Research https://gsi.de >> std::simd >> ────────────────────────────────────────────────────────────────────────── >> >> >> >>