diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2021-04-17 17:44:37 +0200 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2021-04-26 18:21:02 +0200 |
commit | db3581c4ae4d44edea2b64347095d14363721668 (patch) | |
tree | 76e5c19deffe47516e2e0dbfeaa4b7354001c2a1 /gcc/value-range.cc | |
parent | dc80d5e887ea4fa0e1e950db5f6bdd765c960c22 (diff) | |
download | gcc-db3581c4ae4d44edea2b64347095d14363721668.zip gcc-db3581c4ae4d44edea2b64347095d14363721668.tar.gz gcc-db3581c4ae4d44edea2b64347095d14363721668.tar.bz2 |
Cache irange::num_pairs() for non-legacy code.
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.
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.
Diffstat (limited to 'gcc/value-range.cc')
-rw-r--r-- | gcc/value-range.cc | 41 |
1 files changed, 6 insertions, 35 deletions
diff --git a/gcc/value-range.cc b/gcc/value-range.cc index 297dd60..dc76ed7 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -369,11 +369,9 @@ 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_checking_assert (m_num_ranges == 1); @@ -382,50 +380,23 @@ irange::verify_range () } if (!legacy_mode_p ()) { + gcc_checking_assert (m_num_ranges != 0); gcc_checking_assert (!varying_compatible_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. |