[libcxx-commits] [libcxx] [libc++] std::cmp_less and other integer comparison functions could be improved (PR #151332)
via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Jul 30 06:23:51 PDT 2025
https://github.com/kisuhorikka created https://github.com/llvm/llvm-project/pull/151332
Fix #65136
>From d98f1915ba148b36a52ad78fccd60927f7b8c1bf Mon Sep 17 00:00:00 2001
From: kisuhorikka <kisuhorikka at gmail.com>
Date: Wed, 30 Jul 2025 20:53:05 +0800
Subject: [PATCH] [libc++] std::cmp_less and other integer comparison functions
could be improved
---
libcxx/include/__utility/cmp.h | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/libcxx/include/__utility/cmp.h b/libcxx/include/__utility/cmp.h
index 14dc0c154c040..4c29f09628095 100644
--- a/libcxx/include/__utility/cmp.h
+++ b/libcxx/include/__utility/cmp.h
@@ -28,7 +28,13 @@ _LIBCPP_BEGIN_NAMESPACE_STD
template <__signed_or_unsigned_integer _Tp, __signed_or_unsigned_integer _Up>
_LIBCPP_HIDE_FROM_ABI constexpr bool cmp_equal(_Tp __t, _Up __u) noexcept {
- if constexpr (is_signed_v<_Tp> == is_signed_v<_Up>)
+ if constexpr (sizeof(_Tp) < sizeof(int) && sizeof(_Up) < sizeof(int)) {
+ __builtin_assume(__t < numeric_limits<int>::max() && __u < numeric_limits<int>::max());
+ return static_cast<int>(__t) == static_cast<int>(__u);
+ } else if constexpr (sizeof(_Tp) < sizeof(long long) && sizeof(_Up) < sizeof(long long)) {
+ __builtin_assume(__t < numeric_limits<long long>::max() && __u < numeric_limits<long long>::max());
+ return static_cast<long long>(__t) == static_cast<long long>(__u);
+ } else if constexpr (is_signed_v<_Tp> == is_signed_v<_Up>)
return __t == __u;
else if constexpr (is_signed_v<_Tp>)
return __t < 0 ? false : make_unsigned_t<_Tp>(__t) == __u;
@@ -43,7 +49,13 @@ _LIBCPP_HIDE_FROM_ABI constexpr bool cmp_not_equal(_Tp __t, _Up __u) noexcept {
template <__signed_or_unsigned_integer _Tp, __signed_or_unsigned_integer _Up>
_LIBCPP_HIDE_FROM_ABI constexpr bool cmp_less(_Tp __t, _Up __u) noexcept {
- if constexpr (is_signed_v<_Tp> == is_signed_v<_Up>)
+ if constexpr (sizeof(_Tp) < sizeof(int) && sizeof(_Up) < sizeof(int)) {
+ __builtin_assume(__t < numeric_limits<int>::max() && __u < numeric_limits<int>::max());
+ return static_cast<int>(__t) < static_cast<int>(__u);
+ } else if constexpr (sizeof(_Tp) < sizeof(long long) && sizeof(_Up) < sizeof(long long)) {
+ __builtin_assume(__t < numeric_limits<long long>::max() && __u < numeric_limits<long long>::max());
+ return static_cast<long long>(__t) < static_cast<long long>(__u);
+ } else if constexpr (is_signed_v<_Tp> == is_signed_v<_Up>)
return __t < __u;
else if constexpr (is_signed_v<_Tp>)
return __t < 0 ? true : make_unsigned_t<_Tp>(__t) < __u;
More information about the libcxx-commits
mailing list