Message ID | 7568297.R56niFO833@minbar |
---|---|
State | New |
Headers | show |
Series | libstdc++: Skip integer division optimization for Clang | expand |
On Tue, 21 Mar 2023 at 17:06, Matthias Kretz via Libstdc++ < libstdc++@gcc.gnu.org> wrote: > Tested on x86_64-pc-linux-gnu. > > --------- 8< ----------- > > Clang ICEs on _SimdImplX86::_S_divides. The function is only working > around a missed optimization and not necessary for correctness. > Therefore, don't use it for Clang. > > Signed-off-by: Matthias Kretz <m.kretz@gsi.de> > > libstdc++-v3/ChangeLog: > > * include/experimental/bits/simd_detail.h: Don't define > _GLIBCXX_SIMD_WORKAROUND_PR90993 for Clang. > * include/experimental/bits/simd_x86.h (_S_divides): Remove > check for __clang__. OK
diff --git a/libstdc++-v3/include/experimental/bits/simd_detail.h b/libstdc++-v3/include/experimental/bits/simd_detail.h index 49b94decf0a..1fb77866bb2 100644 --- a/libstdc++-v3/include/experimental/bits/simd_detail.h +++ b/libstdc++-v3/include/experimental/bits/simd_detail.h @@ -320,7 +320,9 @@ namespace experimental #endif // integer division not optimized +#ifndef __clang__ #define _GLIBCXX_SIMD_WORKAROUND_PR90993 1 +#endif // very bad codegen for extraction and concatenation of 128/256 "subregisters" // with sizeof(element type) < 8: https://godbolt.org/g/mqUsgM diff --git a/libstdc++-v3/include/experimental/bits/simd_x86.h b/libstdc++-v3/include/experimental/bits/simd_x86.h index 7b8f1c664b3..28ba344c2b2 100644 --- a/libstdc++-v3/include/experimental/bits/simd_x86.h +++ b/libstdc++-v3/include/experimental/bits/simd_x86.h @@ -1469,7 +1469,7 @@ _CsrGuard() [&__xf, &__yf](auto __i) _GLIBCXX_SIMD_ALWAYS_INLINE_LAMBDA -> _SimdWrapper<_Float, __n_intermediate> { -#if !defined __clang__ && __GCC_IEC_559 == 0 +#if __GCC_IEC_559 == 0 // If -freciprocal-math is active, using the `/` operator is // incorrect because it may be translated to an imprecise // multiplication with reciprocal. We need to use inline @@ -1524,7 +1524,7 @@ _CsrGuard() */ return _Base::_S_divides(__x, __y); } - #endif // _GLIBCXX_SIMD_WORKAROUND_PR90993 +#endif // _GLIBCXX_SIMD_WORKAROUND_PR90993 // }}} // _S_modulus {{{
Tested on x86_64-pc-linux-gnu. --------- 8< ----------- Clang ICEs on _SimdImplX86::_S_divides. The function is only working around a missed optimization and not necessary for correctness. Therefore, don't use it for Clang. Signed-off-by: Matthias Kretz <m.kretz@gsi.de> libstdc++-v3/ChangeLog: * include/experimental/bits/simd_detail.h: Don't define _GLIBCXX_SIMD_WORKAROUND_PR90993 for Clang. * include/experimental/bits/simd_x86.h (_S_divides): Remove check for __clang__. --- libstdc++-v3/include/experimental/bits/simd_detail.h | 2 ++ libstdc++-v3/include/experimental/bits/simd_x86.h | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) -- ────────────────────────────────────────────────────────────────────────── Dr. Matthias Kretz https://mattkretz.github.io GSI Helmholtz Centre for Heavy Ion Research https://gsi.de stdₓ::simd ──────────────────────────────────────────────────────────────────────────