[PATCH v2] libstdc++: Remove unnecessary code from reduce implementation
Tomasz Kaminski
tkaminsk@redhat.com
Wed Aug 19 08:52:46 GMT 2026
On Tue, Aug 18, 2026 at 10:10 AM Matthias Kretz <MatthiasKretz@gmx.net>
wrote:
> Resending (see patch from 2026-07-02). OK for trunk?
>
> ------------- 8< -----------
>
> From: Matthias Kretz <m.kretz@gsi.de>
>
> 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 <m.kretz@gsi.de>
>
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
> ──────────────────────────────────────────────────────────────────────────
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20260819/2a68994e/attachment-0001.htm>
More information about the Libstdc++
mailing list