diff options
| author | Michael Kruse <llvm-project@meinersbur.de> | 2025-01-03 10:22:51 +0100 |
|---|---|---|
| committer | Michael Kruse <llvm-project@meinersbur.de> | 2025-01-03 10:22:51 +0100 |
| commit | 38500d63e14ce340236840f60d356cdefb56a52c (patch) | |
| tree | 17edbec446ce9b50d2f215a483b83afb293a635d /libcxx/include/__algorithm | |
| parent | 1a3d5daaef7a6a63448a497da3eff7fc9e23df26 (diff) | |
| parent | 27f30029741ecf023baece7b3dde1ff9011ffefc (diff) | |
Merge branch 'main' into users/meinersbur/flang_runtime_split-headersusers/meinersbur/flang_runtime_split-headers
Diffstat (limited to 'libcxx/include/__algorithm')
22 files changed, 54 insertions, 60 deletions
diff --git a/libcxx/include/__algorithm/adjacent_find.h b/libcxx/include/__algorithm/adjacent_find.h index 76728900bd4d..2508250d8796 100644 --- a/libcxx/include/__algorithm/adjacent_find.h +++ b/libcxx/include/__algorithm/adjacent_find.h @@ -11,10 +11,8 @@ #define _LIBCPP___ALGORITHM_ADJACENT_FIND_H #include <__algorithm/comp.h> -#include <__algorithm/iterator_operations.h> #include <__config> #include <__functional/identity.h> -#include <__iterator/iterator_traits.h> #include <__type_traits/invoke.h> #include <__utility/move.h> diff --git a/libcxx/include/__algorithm/binary_search.h b/libcxx/include/__algorithm/binary_search.h index 79a5ec089f5f..4940059f285c 100644 --- a/libcxx/include/__algorithm/binary_search.h +++ b/libcxx/include/__algorithm/binary_search.h @@ -13,7 +13,6 @@ #include <__algorithm/comp_ref_type.h> #include <__algorithm/lower_bound.h> #include <__config> -#include <__iterator/iterator_traits.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header diff --git a/libcxx/include/__algorithm/equal.h b/libcxx/include/__algorithm/equal.h index cd8b0673e7a4..a276bb9954c9 100644 --- a/libcxx/include/__algorithm/equal.h +++ b/libcxx/include/__algorithm/equal.h @@ -20,7 +20,6 @@ #include <__type_traits/desugars_to.h> #include <__type_traits/enable_if.h> #include <__type_traits/invoke.h> -#include <__type_traits/is_constant_evaluated.h> #include <__type_traits/is_equality_comparable.h> #include <__type_traits/is_volatile.h> #include <__utility/move.h> diff --git a/libcxx/include/__algorithm/equal_range.h b/libcxx/include/__algorithm/equal_range.h index 4e74ad20aa41..ff6f4f2225c7 100644 --- a/libcxx/include/__algorithm/equal_range.h +++ b/libcxx/include/__algorithm/equal_range.h @@ -17,10 +17,6 @@ #include <__algorithm/upper_bound.h> #include <__config> #include <__functional/identity.h> -#include <__iterator/advance.h> -#include <__iterator/distance.h> -#include <__iterator/iterator_traits.h> -#include <__iterator/next.h> #include <__type_traits/invoke.h> #include <__type_traits/is_callable.h> #include <__type_traits/is_constructible.h> diff --git a/libcxx/include/__algorithm/fill_n.h b/libcxx/include/__algorithm/fill_n.h index f29633f88087..5069a72783f3 100644 --- a/libcxx/include/__algorithm/fill_n.h +++ b/libcxx/include/__algorithm/fill_n.h @@ -12,7 +12,6 @@ #include <__algorithm/min.h> #include <__config> #include <__fwd/bit_reference.h> -#include <__iterator/iterator_traits.h> #include <__memory/pointer_traits.h> #include <__utility/convert_to_integral.h> diff --git a/libcxx/include/__algorithm/find.h b/libcxx/include/__algorithm/find.h index 14b8a7804887..a05d50718595 100644 --- a/libcxx/include/__algorithm/find.h +++ b/libcxx/include/__algorithm/find.h @@ -24,7 +24,6 @@ #include <__type_traits/invoke.h> #include <__type_traits/is_equality_comparable.h> #include <__type_traits/is_integral.h> -#include <__type_traits/is_same.h> #include <__type_traits/is_signed.h> #include <__utility/move.h> #include <limits> diff --git a/libcxx/include/__algorithm/find_end.h b/libcxx/include/__algorithm/find_end.h index fc876d872676..86b4a3e2e368 100644 --- a/libcxx/include/__algorithm/find_end.h +++ b/libcxx/include/__algorithm/find_end.h @@ -15,7 +15,6 @@ #include <__config> #include <__functional/identity.h> #include <__iterator/iterator_traits.h> -#include <__iterator/next.h> #include <__type_traits/invoke.h> #include <__utility/pair.h> diff --git a/libcxx/include/__algorithm/find_first_of.h b/libcxx/include/__algorithm/find_first_of.h index 4a240f733179..45ec13315437 100644 --- a/libcxx/include/__algorithm/find_first_of.h +++ b/libcxx/include/__algorithm/find_first_of.h @@ -12,7 +12,6 @@ #include <__algorithm/comp.h> #include <__config> -#include <__iterator/iterator_traits.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header diff --git a/libcxx/include/__algorithm/for_each.h b/libcxx/include/__algorithm/for_each.h index 259e527f87f9..e08f583504c0 100644 --- a/libcxx/include/__algorithm/for_each.h +++ b/libcxx/include/__algorithm/for_each.h @@ -14,7 +14,6 @@ #include <__config> #include <__iterator/segmented_iterator.h> #include <__ranges/movable_box.h> -#include <__type_traits/enable_if.h> #include <__utility/in_place.h> #include <__utility/move.h> diff --git a/libcxx/include/__algorithm/includes.h b/libcxx/include/__algorithm/includes.h index a86102fc6d4a..bc6c6579693b 100644 --- a/libcxx/include/__algorithm/includes.h +++ b/libcxx/include/__algorithm/includes.h @@ -13,7 +13,6 @@ #include <__algorithm/comp_ref_type.h> #include <__config> #include <__functional/identity.h> -#include <__iterator/iterator_traits.h> #include <__type_traits/invoke.h> #include <__type_traits/is_callable.h> #include <__utility/move.h> diff --git a/libcxx/include/__algorithm/inplace_merge.h b/libcxx/include/__algorithm/inplace_merge.h index ad3fe6a7a505..69213cc1457b 100644 --- a/libcxx/include/__algorithm/inplace_merge.h +++ b/libcxx/include/__algorithm/inplace_merge.h @@ -20,8 +20,6 @@ #include <__config> #include <__cstddef/ptrdiff_t.h> #include <__functional/identity.h> -#include <__iterator/advance.h> -#include <__iterator/distance.h> #include <__iterator/iterator_traits.h> #include <__iterator/reverse_iterator.h> #include <__memory/destruct_n.h> @@ -29,7 +27,6 @@ #include <__memory/unique_temporary_buffer.h> #include <__utility/move.h> #include <__utility/pair.h> -#include <new> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header diff --git a/libcxx/include/__algorithm/is_heap.h b/libcxx/include/__algorithm/is_heap.h index fa668c1d0433..dfe06200cedc 100644 --- a/libcxx/include/__algorithm/is_heap.h +++ b/libcxx/include/__algorithm/is_heap.h @@ -13,7 +13,6 @@ #include <__algorithm/comp_ref_type.h> #include <__algorithm/is_heap_until.h> #include <__config> -#include <__iterator/iterator_traits.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header diff --git a/libcxx/include/__algorithm/is_permutation.h b/libcxx/include/__algorithm/is_permutation.h index 8753e9fc13f2..1afb11596bc6 100644 --- a/libcxx/include/__algorithm/is_permutation.h +++ b/libcxx/include/__algorithm/is_permutation.h @@ -17,7 +17,6 @@ #include <__iterator/concepts.h> #include <__iterator/distance.h> #include <__iterator/iterator_traits.h> -#include <__iterator/next.h> #include <__type_traits/enable_if.h> #include <__type_traits/invoke.h> #include <__type_traits/is_callable.h> diff --git a/libcxx/include/__algorithm/is_sorted.h b/libcxx/include/__algorithm/is_sorted.h index ff61a7360418..196ae0beec01 100644 --- a/libcxx/include/__algorithm/is_sorted.h +++ b/libcxx/include/__algorithm/is_sorted.h @@ -13,7 +13,6 @@ #include <__algorithm/comp_ref_type.h> #include <__algorithm/is_sorted_until.h> #include <__config> -#include <__iterator/iterator_traits.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header diff --git a/libcxx/include/__algorithm/is_sorted_until.h b/libcxx/include/__algorithm/is_sorted_until.h index b64fb65e84e4..606641949db9 100644 --- a/libcxx/include/__algorithm/is_sorted_until.h +++ b/libcxx/include/__algorithm/is_sorted_until.h @@ -12,7 +12,6 @@ #include <__algorithm/comp.h> #include <__algorithm/comp_ref_type.h> #include <__config> -#include <__iterator/iterator_traits.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header diff --git a/libcxx/include/__algorithm/lower_bound.h b/libcxx/include/__algorithm/lower_bound.h index 2144ba962966..4fba6748e6d7 100644 --- a/libcxx/include/__algorithm/lower_bound.h +++ b/libcxx/include/__algorithm/lower_bound.h @@ -19,7 +19,6 @@ #include <__iterator/iterator_traits.h> #include <__type_traits/invoke.h> #include <__type_traits/is_callable.h> -#include <__type_traits/remove_reference.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header diff --git a/libcxx/include/__algorithm/make_projected.h b/libcxx/include/__algorithm/make_projected.h index 22cceb4cb2fb..4b54c504413e 100644 --- a/libcxx/include/__algorithm/make_projected.h +++ b/libcxx/include/__algorithm/make_projected.h @@ -9,16 +9,13 @@ #ifndef _LIBCPP___ALGORITHM_MAKE_PROJECTED_H #define _LIBCPP___ALGORITHM_MAKE_PROJECTED_H -#include <__concepts/same_as.h> #include <__config> #include <__functional/identity.h> #include <__functional/invoke.h> #include <__type_traits/decay.h> #include <__type_traits/enable_if.h> -#include <__type_traits/integral_constant.h> #include <__type_traits/invoke.h> #include <__type_traits/is_member_pointer.h> -#include <__type_traits/is_same.h> #include <__utility/declval.h> #include <__utility/forward.h> diff --git a/libcxx/include/__algorithm/merge.h b/libcxx/include/__algorithm/merge.h index bad663c4b9f1..ae859b7b63ff 100644 --- a/libcxx/include/__algorithm/merge.h +++ b/libcxx/include/__algorithm/merge.h @@ -13,7 +13,6 @@ #include <__algorithm/comp_ref_type.h> #include <__algorithm/copy.h> #include <__config> -#include <__iterator/iterator_traits.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header diff --git a/libcxx/include/__algorithm/mismatch.h b/libcxx/include/__algorithm/mismatch.h index 556bd4216307..f5855379f687 100644 --- a/libcxx/include/__algorithm/mismatch.h +++ b/libcxx/include/__algorithm/mismatch.h @@ -27,7 +27,6 @@ #include <__type_traits/is_integral.h> #include <__utility/move.h> #include <__utility/pair.h> -#include <__utility/unreachable.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -79,7 +78,7 @@ __mismatch_vectorized(_Iter __first1, _Iter __last1, _Iter __first2) { } for (size_t __i = 0; __i != __unroll_count; ++__i) { - if (auto __cmp_res = __lhs[__i] == __rhs[__i]; !std::__all_of(__cmp_res)) { + if (auto __cmp_res = std::__as_mask(__lhs[__i] == __rhs[__i]); !std::__all_of(__cmp_res)) { auto __offset = __i * __vec_size + std::__find_first_not_set(__cmp_res); return {__first1 + __offset, __first2 + __offset}; } @@ -91,7 +90,7 @@ __mismatch_vectorized(_Iter __first1, _Iter __last1, _Iter __first2) { // check the remaining 0-3 vectors while (static_cast<size_t>(__last1 - __first1) >= __vec_size) { - if (auto __cmp_res = std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2); + if (auto __cmp_res = std::__as_mask(std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2)); !std::__all_of(__cmp_res)) { auto __offset = std::__find_first_not_set(__cmp_res); return {__first1 + __offset, __first2 + __offset}; @@ -108,8 +107,8 @@ __mismatch_vectorized(_Iter __first1, _Iter __last1, _Iter __first2) { if (static_cast<size_t>(__first1 - __orig_first1) >= __vec_size) { __first1 = __last1 - __vec_size; __first2 = __last2 - __vec_size; - auto __offset = - std::__find_first_not_set(std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2)); + auto __offset = std::__find_first_not_set( + std::__as_mask(std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2))); return {__first1 + __offset, __first2 + __offset}; } // else loop over the elements individually } diff --git a/libcxx/include/__algorithm/simd_utils.h b/libcxx/include/__algorithm/simd_utils.h index 4e3e4f2b9404..3ca79247bbd0 100644 --- a/libcxx/include/__algorithm/simd_utils.h +++ b/libcxx/include/__algorithm/simd_utils.h @@ -116,42 +116,65 @@ template <class _VecT, class _Iter> }(make_index_sequence<__simd_vector_size_v<_VecT>>{}); } -template <class _Tp, size_t _Np> -[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI bool __all_of(__simd_vector<_Tp, _Np> __vec) noexcept { - return __builtin_reduce_and(__builtin_convertvector(__vec, __simd_vector<bool, _Np>)); +template <size_t _Np> +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI bool __all_of(__simd_vector<bool, _Np> __vec) noexcept { + return __builtin_reduce_and(__vec); } template <class _Tp, size_t _Np> -[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI size_t __find_first_set(__simd_vector<_Tp, _Np> __vec) noexcept { - using __mask_vec = __simd_vector<bool, _Np>; +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI auto __as_mask(__simd_vector<_Tp, _Np> __vec) noexcept { + static_assert(!is_same<_Tp, bool>::value, "vector type should not be a bool!"); + return __builtin_convertvector(__vec, __simd_vector<bool, _Np>); +} - // This has MSan disabled du to https://github.com/llvm/llvm-project/issues/85876 - auto __impl = [&]<class _MaskT>(_MaskT) _LIBCPP_NO_SANITIZE("memory") noexcept { -# if defined(_LIBCPP_BIG_ENDIAN) - return std::min<size_t>( - _Np, std::__countl_zero(__builtin_bit_cast(_MaskT, __builtin_convertvector(__vec, __mask_vec)))); -# else - return std::min<size_t>( - _Np, std::__countr_zero(__builtin_bit_cast(_MaskT, __builtin_convertvector(__vec, __mask_vec)))); -# endif - }; - - if constexpr (sizeof(__mask_vec) == sizeof(uint8_t)) { - return __impl(uint8_t{}); - } else if constexpr (sizeof(__mask_vec) == sizeof(uint16_t)) { - return __impl(uint16_t{}); - } else if constexpr (sizeof(__mask_vec) == sizeof(uint32_t)) { - return __impl(uint32_t{}); - } else if constexpr (sizeof(__mask_vec) == sizeof(uint64_t)) { - return __impl(uint64_t{}); +// This uses __builtin_convertvector around the __builtin_shufflevector to work around #107981. +template <size_t _Np> +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI __simd_vector<bool, 8> +__extend_vector(__simd_vector<bool, _Np> __vec) noexcept { + using _VecT = __simd_vector<bool, _Np>; + if constexpr (_Np == 4) { + return __builtin_convertvector( + __builtin_shufflevector(__vec, _VecT{}, 0, 1, 2, 3, 4, 5, 6, 7), __simd_vector<bool, 8>); + } else if constexpr (_Np == 2) { + return std::__extend_vector( + __builtin_convertvector(__builtin_shufflevector(__vec, _VecT{}, 0, 1, 2, 3), __simd_vector<bool, 4>)); + } else if constexpr (_Np == 1) { + return std::__extend_vector( + __builtin_convertvector(__builtin_shufflevector(__vec, _VecT{}, 0, 1), __simd_vector<bool, 2>)); } else { - static_assert(sizeof(__mask_vec) == 0, "unexpected required size for mask integer type"); + static_assert(sizeof(_VecT) == 0, "Unexpected vector size"); + } +} + +template <size_t _Np> +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI auto __to_int_mask(__simd_vector<bool, _Np> __vec) { + if constexpr (_Np < 8) { + return std::__bit_cast<uint8_t>(std::__extend_vector(__vec)); + } else if constexpr (_Np == 8) { + return std::__bit_cast<uint8_t>(__vec); + } else if constexpr (_Np == 16) { + return std::__bit_cast<uint16_t>(__vec); + } else if constexpr (_Np == 32) { + return std::__bit_cast<uint32_t>(__vec); + } else if constexpr (_Np == 64) { + return std::__bit_cast<uint64_t>(__vec); + } else { + static_assert(sizeof(__simd_vector<bool, _Np>) == 0, "Unexpected vector size"); return 0; } } -template <class _Tp, size_t _Np> -[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI size_t __find_first_not_set(__simd_vector<_Tp, _Np> __vec) noexcept { +template <size_t _Np> +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI size_t __find_first_set(__simd_vector<bool, _Np> __vec) noexcept { +# if defined(_LIBCPP_BIG_ENDIAN) + return std::min<size_t>(_Np, std::__countl_zero(std::__to_int_mask(__vec))); +# else + return std::min<size_t>(_Np, std::__countr_zero(std::__to_int_mask(__vec))); +# endif +} + +template <size_t _Np> +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI size_t __find_first_not_set(__simd_vector<bool, _Np> __vec) noexcept { return std::__find_first_set(~__vec); } diff --git a/libcxx/include/__algorithm/stable_partition.h b/libcxx/include/__algorithm/stable_partition.h index 0438f589a39d..2ba7239a3a03 100644 --- a/libcxx/include/__algorithm/stable_partition.h +++ b/libcxx/include/__algorithm/stable_partition.h @@ -22,7 +22,6 @@ #include <__type_traits/remove_cvref.h> #include <__utility/move.h> #include <__utility/pair.h> -#include <new> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header diff --git a/libcxx/include/__algorithm/stable_sort.h b/libcxx/include/__algorithm/stable_sort.h index 43f591ac02b0..1111f5509bc3 100644 --- a/libcxx/include/__algorithm/stable_sort.h +++ b/libcxx/include/__algorithm/stable_sort.h @@ -24,7 +24,6 @@ #include <__type_traits/is_trivially_assignable.h> #include <__utility/move.h> #include <__utility/pair.h> -#include <new> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header |
