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
