Skip to content

Commit c8e0a17

Browse files
committed
[libc++] std::cmp_less and other integer comparison functions could be improved with _LIBCPP_ASSUME
1 parent 60850b5 commit c8e0a17

File tree

1 file changed

+12
-12
lines changed
  • libcxx/include/__utility

1 file changed

+12
-12
lines changed

libcxx/include/__utility/cmp.h

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,18 @@ _LIBCPP_BEGIN_NAMESPACE_STD
2626

2727
#if _LIBCPP_STD_VER >= 20
2828

29+
template <__signed_or_unsigned_integer _Tp, __signed_integer _Ip>
30+
inline constexpr bool __comparison_can_promote_to =
31+
__signed_integer<_Tp> ? sizeof(_Tp) <= sizeof(_Ip) : sizeof(_Tp) < sizeof(_Ip);
32+
2933
template <__signed_or_unsigned_integer _Tp, __signed_or_unsigned_integer _Up>
3034
_LIBCPP_HIDE_FROM_ABI constexpr bool cmp_equal(_Tp __t, _Up __u) noexcept {
31-
if constexpr (sizeof(_Tp) < sizeof(int) && sizeof(_Up) < sizeof(int)) {
32-
__builtin_assume(__t < numeric_limits<int>::max() && __u < numeric_limits<int>::max());
35+
if constexpr (is_signed_v<_Tp> == is_signed_v<_Up>)
36+
return __t == __u;
37+
else if constexpr (__comparison_can_promote_to<_Tp, int> && __comparison_can_promote_to<_Up, int>)
3338
return static_cast<int>(__t) == static_cast<int>(__u);
34-
} else if constexpr (sizeof(_Tp) < sizeof(long long) && sizeof(_Up) < sizeof(long long)) {
35-
__builtin_assume(__t < numeric_limits<long long>::max() && __u < numeric_limits<long long>::max());
39+
else if constexpr (__comparison_can_promote_to<_Tp, long long> && __comparison_can_promote_to<_Up, long long>)
3640
return static_cast<long long>(__t) == static_cast<long long>(__u);
37-
} else if constexpr (is_signed_v<_Tp> == is_signed_v<_Up>)
38-
return __t == __u;
3941
else if constexpr (is_signed_v<_Tp>)
4042
return __t < 0 ? false : make_unsigned_t<_Tp>(__t) == __u;
4143
else
@@ -49,14 +51,12 @@ _LIBCPP_HIDE_FROM_ABI constexpr bool cmp_not_equal(_Tp __t, _Up __u) noexcept {
4951

5052
template <__signed_or_unsigned_integer _Tp, __signed_or_unsigned_integer _Up>
5153
_LIBCPP_HIDE_FROM_ABI constexpr bool cmp_less(_Tp __t, _Up __u) noexcept {
52-
if constexpr (sizeof(_Tp) < sizeof(int) && sizeof(_Up) < sizeof(int)) {
53-
__builtin_assume(__t < numeric_limits<int>::max() && __u < numeric_limits<int>::max());
54+
if constexpr (is_signed_v<_Tp> == is_signed_v<_Up>)
55+
return __t < __u;
56+
else if constexpr (__comparison_can_promote_to<_Tp, int> && __comparison_can_promote_to<_Up, int>)
5457
return static_cast<int>(__t) < static_cast<int>(__u);
55-
} else if constexpr (sizeof(_Tp) < sizeof(long long) && sizeof(_Up) < sizeof(long long)) {
56-
__builtin_assume(__t < numeric_limits<long long>::max() && __u < numeric_limits<long long>::max());
58+
else if constexpr (__comparison_can_promote_to<_Tp, long long> && __comparison_can_promote_to<_Up, long long>)
5759
return static_cast<long long>(__t) < static_cast<long long>(__u);
58-
} else if constexpr (is_signed_v<_Tp> == is_signed_v<_Up>)
59-
return __t < __u;
6060
else if constexpr (is_signed_v<_Tp>)
6161
return __t < 0 ? true : make_unsigned_t<_Tp>(__t) < __u;
6262
else

0 commit comments

Comments
 (0)