Skip to content

Commit d389939

Browse files
thurstondtmsri
authored andcommitted
Revert "[libc++] Explicitly convert to masks in SIMD code (llvm#107983)"
This reverts commit 1603f99. Reason: buildbot breakage e.g., https://lab.llvm.org/buildbot/#/builders/55/builds/2061 llvm-libc++-shared.cfg.in :: std/algorithms/alg.nonmodifying/alg.starts_with/ranges.starts_with.pass.cpp llvm-libc++-shared.cfg.in :: std/algorithms/alg.nonmodifying/mismatch/mismatch.pass.cpp llvm-libc++-shared.cfg.in :: std/algorithms/alg.nonmodifying/mismatch/ranges_mismatch.pass.cpp ... (Buildbot re-run passed with the previous revision, 1fc288b)
1 parent da167ea commit d389939

File tree

2 files changed

+31
-54
lines changed

2 files changed

+31
-54
lines changed

libcxx/include/__algorithm/mismatch.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ __mismatch_vectorized(_Iter __first1, _Iter __last1, _Iter __first2) {
7979
}
8080

8181
for (size_t __i = 0; __i != __unroll_count; ++__i) {
82-
if (auto __cmp_res = std::__as_mask(__lhs[__i] == __rhs[__i]); !std::__all_of(__cmp_res)) {
82+
if (auto __cmp_res = __lhs[__i] == __rhs[__i]; !std::__all_of(__cmp_res)) {
8383
auto __offset = __i * __vec_size + std::__find_first_not_set(__cmp_res);
8484
return {__first1 + __offset, __first2 + __offset};
8585
}
@@ -91,7 +91,7 @@ __mismatch_vectorized(_Iter __first1, _Iter __last1, _Iter __first2) {
9191

9292
// check the remaining 0-3 vectors
9393
while (static_cast<size_t>(__last1 - __first1) >= __vec_size) {
94-
if (auto __cmp_res = std::__as_mask(std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2));
94+
if (auto __cmp_res = std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2);
9595
!std::__all_of(__cmp_res)) {
9696
auto __offset = std::__find_first_not_set(__cmp_res);
9797
return {__first1 + __offset, __first2 + __offset};
@@ -108,8 +108,8 @@ __mismatch_vectorized(_Iter __first1, _Iter __last1, _Iter __first2) {
108108
if (static_cast<size_t>(__first1 - __orig_first1) >= __vec_size) {
109109
__first1 = __last1 - __vec_size;
110110
__first2 = __last2 - __vec_size;
111-
auto __offset = std::__find_first_not_set(
112-
std::__as_mask(std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2)));
111+
auto __offset =
112+
std::__find_first_not_set(std::__load_vector<__vec>(__first1) == std::__load_vector<__vec>(__first2));
113113
return {__first1 + __offset, __first2 + __offset};
114114
} // else loop over the elements individually
115115
}

libcxx/include/__algorithm/simd_utils.h

Lines changed: 27 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -116,65 +116,42 @@ template <class _VecT, class _Iter>
116116
}(make_index_sequence<__simd_vector_size_v<_VecT>>{});
117117
}
118118

119-
template <size_t _Np>
120-
[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI bool __all_of(__simd_vector<bool, _Np> __vec) noexcept {
121-
return __builtin_reduce_and(__vec);
122-
}
123-
124119
template <class _Tp, size_t _Np>
125-
[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI auto __as_mask(__simd_vector<_Tp, _Np> __vec) noexcept {
126-
static_assert(!is_same<_Tp, bool>::value, "vector type should not be a bool!");
127-
return __builtin_convertvector(__vec, __simd_vector<bool, _Np>);
128-
}
129-
130-
// This uses __builtin_convertvector around the __builtin_shufflevector to work around #107981.
131-
template <size_t _Np>
132-
[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI __simd_vector<bool, 8>
133-
__extend_vector(__simd_vector<bool, _Np> __vec) noexcept {
134-
using _VecT = __simd_vector<bool, _Np>;
135-
if constexpr (_Np == 4) {
136-
return __builtin_convertvector(
137-
__builtin_shufflevector(__vec, _VecT{}, 0, 1, 2, 3, 4, 5, 6, 7), __simd_vector<bool, 8>);
138-
} else if constexpr (_Np == 2) {
139-
return std::__extend_vector(
140-
__builtin_convertvector(__builtin_shufflevector(__vec, _VecT{}, 0, 1, 2, 3), __simd_vector<bool, 4>));
141-
} else if constexpr (_Np == 1) {
142-
return std::__extend_vector(
143-
__builtin_convertvector(__builtin_shufflevector(__vec, _VecT{}, 0, 1), __simd_vector<bool, 2>));
144-
} else {
145-
static_assert(sizeof(_VecT) == 0, "Unexpected vector size");
146-
}
120+
[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI bool __all_of(__simd_vector<_Tp, _Np> __vec) noexcept {
121+
return __builtin_reduce_and(__builtin_convertvector(__vec, __simd_vector<bool, _Np>));
147122
}
148123

149-
template <size_t _Np>
150-
[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI auto __to_int_mask(__simd_vector<bool, _Np> __vec) {
151-
if constexpr (_Np < 8) {
152-
return std::__bit_cast<uint8_t>(std::__extend_vector(__vec));
153-
} else if constexpr (_Np == 8) {
154-
return std::__bit_cast<uint8_t>(__vec);
155-
} else if constexpr (_Np == 16) {
156-
return std::__bit_cast<uint16_t>(__vec);
157-
} else if constexpr (_Np == 32) {
158-
return std::__bit_cast<uint32_t>(__vec);
159-
} else if constexpr (_Np == 64) {
160-
return std::__bit_cast<uint64_t>(__vec);
161-
} else {
162-
static_assert(sizeof(__simd_vector<bool, _Np>) == 0, "Unexpected vector size");
163-
return 0;
164-
}
165-
}
124+
template <class _Tp, size_t _Np>
125+
[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI size_t __find_first_set(__simd_vector<_Tp, _Np> __vec) noexcept {
126+
using __mask_vec = __simd_vector<bool, _Np>;
166127

167-
template <size_t _Np>
168-
[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI size_t __find_first_set(__simd_vector<bool, _Np> __vec) noexcept {
128+
// This has MSan disabled du to https://github.com/llvm/llvm-project/issues/85876
129+
auto __impl = [&]<class _MaskT>(_MaskT) _LIBCPP_NO_SANITIZE("memory") noexcept {
169130
# if defined(_LIBCPP_BIG_ENDIAN)
170-
return std::min<size_t>(_Np, std::__countl_zero(std::__to_int_mask(__vec)));
131+
return std::min<size_t>(
132+
_Np, std::__countl_zero(__builtin_bit_cast(_MaskT, __builtin_convertvector(__vec, __mask_vec))));
171133
# else
172-
return std::min<size_t>(_Np, std::__countr_zero(std::__to_int_mask(__vec)));
134+
return std::min<size_t>(
135+
_Np, std::__countr_zero(__builtin_bit_cast(_MaskT, __builtin_convertvector(__vec, __mask_vec))));
173136
# endif
137+
};
138+
139+
if constexpr (sizeof(__mask_vec) == sizeof(uint8_t)) {
140+
return __impl(uint8_t{});
141+
} else if constexpr (sizeof(__mask_vec) == sizeof(uint16_t)) {
142+
return __impl(uint16_t{});
143+
} else if constexpr (sizeof(__mask_vec) == sizeof(uint32_t)) {
144+
return __impl(uint32_t{});
145+
} else if constexpr (sizeof(__mask_vec) == sizeof(uint64_t)) {
146+
return __impl(uint64_t{});
147+
} else {
148+
static_assert(sizeof(__mask_vec) == 0, "unexpected required size for mask integer type");
149+
return 0;
150+
}
174151
}
175152

176-
template <size_t _Np>
177-
[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI size_t __find_first_not_set(__simd_vector<bool, _Np> __vec) noexcept {
153+
template <class _Tp, size_t _Np>
154+
[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI size_t __find_first_not_set(__simd_vector<_Tp, _Np> __vec) noexcept {
178155
return std::__find_first_set(~__vec);
179156
}
180157

0 commit comments

Comments
 (0)