diff options
author | Matthias Kretz <m.kretz@gsi.de> | 2023-03-21 14:20:52 +0100 |
---|---|---|
committer | Matthias Kretz <m.kretz@gsi.de> | 2023-03-21 20:30:19 +0100 |
commit | 403e48ef441b0502af46ad3598f699f4a1611791 (patch) | |
tree | fc6fd11d39627ced5cada69e72e3c00c03d2f544 /libstdc++-v3 | |
parent | dd282b16bfd3c6e218dffb7798a375365b10ae22 (diff) | |
download | gcc-403e48ef441b0502af46ad3598f699f4a1611791.tar.gz |
libstdc++: Skip integer division optimization for Clang
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__.
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/include/experimental/bits/simd_detail.h | 2 | ||||
-rw-r--r-- | libstdc++-v3/include/experimental/bits/simd_x86.h | 4 |
2 files changed, 4 insertions, 2 deletions
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 @@ #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 @@ template <typename _Abi, typename> [&__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 @@ template <typename _Abi, typename> */ return _Base::_S_divides(__x, __y); } - #endif // _GLIBCXX_SIMD_WORKAROUND_PR90993 +#endif // _GLIBCXX_SIMD_WORKAROUND_PR90993 // }}} // _S_modulus {{{ |