https://gcc.gnu.org/g:3d3bb7c7f881c0650c41f553cbaf7d104a51754f

commit r17-1477-g3d3bb7c7f881c0650c41f553cbaf7d104a51754f
Author: Andrew MacLeod <[email protected]>
Date:   Thu May 28 10:07:02 2026 -0400

    Make prange_storage::equal_p more efficient.
    
    equal_p created a full prange from storage in order to do a comparison.
    This is quite inefficient.  It is better to compare just the required
    fields directly from storage.
    
            * value-range-storage.cc (prange_storage::equal_p): Compare just
            the required fields.

Diff:
---
 gcc/value-range-storage.cc | 46 +++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 43 insertions(+), 3 deletions(-)

diff --git a/gcc/value-range-storage.cc b/gcc/value-range-storage.cc
index 3f5ad9e966e6..58d4a3ba21aa 100644
--- a/gcc/value-range-storage.cc
+++ b/gcc/value-range-storage.cc
@@ -761,9 +761,49 @@ prange_storage::equal_p (const prange &r) const
   if (r.undefined_p ())
     return m_kind == PR_UNDEFINED;
 
-  prange tmp;
-  get_prange (tmp, r.type ());
-  return tmp == r;
+  unsigned index = 0;
+  switch (m_kind)
+    {
+      case PR_VARYING:
+       return r.varying_p ();
+
+      case PR_ZERO:
+       return r.zero_p ();
+
+      case PR_NONZERO:
+       if (!r.nonzero_p ())
+         return false;
+       break;
+
+      case PR_FULL:
+       if (r.m_min != wi::zero (TYPE_PRECISION (r.m_type))
+           || r.m_max != wi::max_value (TYPE_PRECISION (r.m_type),
+                                        TYPE_SIGN (r.m_type)))
+         return false;
+       break;
+
+      case PR_OTHER:
+       if (r.m_min != get_word (index++, r.m_type)
+           || r.m_max != get_word (index++, r.m_type))
+         return false;
+       break;
+
+      default:
+       gcc_unreachable ();
+    }
+
+  if (m_has_bitmask)
+    {
+      wide_int value = get_word (index++, r.m_type);
+      wide_int mask = get_word (index++, r.m_type);
+      if (r.m_bitmask != irange_bitmask (value, mask))
+       return false;
+    }
+  else
+    if (!r.m_bitmask.unknown_p ())
+      return false;
+
+  return true;
 }
 
 bool

Reply via email to