This does for num_pairs() what my previous patch did for VR_UNDEFINED and VR_VARYING.
Note that VR_ANTI_RANGE for legacy is always set to 2 ranges. There is only one way of representing a range, so a range that can be represented as a VR_RANGE will never have a kind of VR_ANTI_RANGE. Also legacy symbolics can also use VR_ANTI_RANGE, but no one will ever ask for the bounds of such range, so m_num_ranges is irrelevant. OK? gcc/ChangeLog: * value-range.cc (irange::legacy_num_pairs): Remove. (irange::invert): Change gcc_assert to gcc_checking_assert. * value-range.h (irange::num_pairs): Adjust for a cached num_pairs(). Also, rename all gcc_assert's to gcc_checking_assert's. --- gcc/value-range.cc | 47 +++++++++------------------------------------- gcc/value-range.h | 7 +++---- 2 files changed, 12 insertions(+), 42 deletions(-) diff --git a/gcc/value-range.cc b/gcc/value-range.cc index 369eeabd7d5..6b0dfb439ba 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -369,63 +369,34 @@ irange::verify_range () { if (m_kind == VR_UNDEFINED) { - gcc_assert (m_num_ranges == 0); + gcc_checking_assert (m_num_ranges == 0); return; } - gcc_assert (m_num_ranges != 0); - if (m_kind == VR_VARYING) { - gcc_assert (m_num_ranges == 1); - gcc_assert (irange_varying_p ()); + gcc_checking_assert (m_num_ranges == 1); + gcc_checking_assert (irange_varying_p ()); return; } if (!legacy_mode_p ()) { - gcc_assert (!irange_varying_p ()); + gcc_checking_assert (m_num_ranges != 0); + gcc_checking_assert (!irange_varying_p ()); for (unsigned i = 0; i < m_num_ranges; ++i) { tree lb = tree_lower_bound (i); tree ub = tree_upper_bound (i); int c = compare_values (lb, ub); - gcc_assert (c == 0 || c == -1); + gcc_checking_assert (c == 0 || c == -1); } return; } if (m_kind == VR_RANGE || m_kind == VR_ANTI_RANGE) { - gcc_assert (m_num_ranges == 1); + gcc_checking_assert (m_num_ranges == 1); int cmp = compare_values (tree_lower_bound (0), tree_upper_bound (0)); - gcc_assert (cmp == 0 || cmp == -1 || cmp == -2); - } -} - -unsigned -irange::legacy_num_pairs () const -{ - gcc_checking_assert (legacy_mode_p ()); - - if (undefined_p ()) - return 0; - if (varying_p ()) - return 1; - // Inlined symbolic_p for performance: - if (!is_gimple_min_invariant (min ()) || !is_gimple_min_invariant (max ())) - { - value_range numeric_range (*this); - numeric_range.normalize_symbolics (); - return numeric_range.num_pairs (); - } - if (m_kind == VR_ANTI_RANGE) - { - // ~[MIN, X] has one sub-range of [X+1, MAX], and - // ~[X, MAX] has one sub-range of [MIN, X-1]. - if (vrp_val_is_min (min ()) || vrp_val_is_max (max ())) - return 1; - return 2; + gcc_checking_assert (cmp == 0 || cmp == -1 || cmp == -2); } - gcc_checking_assert (m_num_ranges == 1); - return 1; } // Return the lower bound for a sub-range. PAIR is the sub-range in @@ -1810,7 +1781,7 @@ irange::invert () return; } - gcc_assert (!undefined_p () && !varying_p ()); + gcc_checking_assert (!undefined_p () && !varying_p ()); // We always need one more set of bounds to represent an inverse, so // if we're at the limit, we can't properly represent things. diff --git a/gcc/value-range.h b/gcc/value-range.h index bfba1a3469e..d2c3ce958d3 100644 --- a/gcc/value-range.h +++ b/gcc/value-range.h @@ -118,7 +118,6 @@ protected: void legacy_union (irange *, const irange *); void legacy_intersect (irange *, const irange *); void verify_range (); - unsigned legacy_num_pairs () const; wide_int legacy_lower_bound (unsigned = 0) const; wide_int legacy_upper_bound (unsigned) const; int value_inside_range (tree) const; @@ -207,10 +206,10 @@ irange::kind () const inline unsigned irange::num_pairs () const { - if (!legacy_mode_p ()) - return m_num_ranges; + if (m_kind == VR_ANTI_RANGE) + return constant_p () ? 2 : 1; else - return legacy_num_pairs (); + return m_num_ranges; } inline tree -- 2.30.2