Index: libcxx/include/experimental/simd =================================================================== --- libcxx/include/experimental/simd +++ libcxx/include/experimental/simd @@ -611,6 +611,13 @@ #pragma GCC system_header #endif +#if !defined(_LIBCPP_COMPILER_CLANG) +#define _LIBCPP_UNROLL +#else +// See LLVM PR/36359 for context of this workaround. +#define _LIBCPP_UNROLL _Pragma("unroll") +#endif + _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_SIMD enum class _StorageKind { @@ -2109,20 +2116,22 @@ // algorithms [simd.alg] template -simd<_Tp, _Abi> min(const simd<_Tp, _Abi>& __a, - const simd<_Tp, _Abi>& __b) noexcept { +// Add `inline` keyword until LLVM PR/36495 is fixed +inline simd<_Tp, _Abi> min(const simd<_Tp, _Abi>& __a, + const simd<_Tp, _Abi>& __b) noexcept { simd<_Tp, _Abi> __v; - for (size_t __i = 0; __i < __v.size(); __i++) { + _LIBCPP_UNROLL for (size_t __i = 0; __i < __v.size(); __i++) { __v[__i] = std::min(__a[__i], __b[__i]); } return __v; } template -simd<_Tp, _Abi> max(const simd<_Tp, _Abi>& __a, - const simd<_Tp, _Abi>& __b) noexcept { +// Add `inline` keyword until LLVM PR/36495 is fixed +inline simd<_Tp, _Abi> max(const simd<_Tp, _Abi>& __a, + const simd<_Tp, _Abi>& __b) noexcept { simd<_Tp, _Abi> __v; - for (size_t __i = 0; __i < __v.size(); __i++) { + _LIBCPP_UNROLL for (size_t __i = 0; __i < __v.size(); __i++) { __v[__i] = std::max(__a[__i], __b[__i]); } return __v; @@ -3060,4 +3069,6 @@ _LIBCPP_END_NAMESPACE_EXPERIMENTAL_SIMD +#undef _LIBCPP_UNROLL + #endif /* _LIBCPP_EXPERIMENTAL_SIMD */