Teach the two remaining single-interval consumers to walk the whole
set of sub-ranges: frange_storage::get_frange() and the pretty
printer.
This is also a non-functional change.
Tested on ppc64le: bootstrap, tests, LAPACK, and verifying that
assembly doesn't change on a corpus of LAPACK fortran preprocessed
sources.
Pushed.
gcc/ChangeLog:
* value-range-storage.cc (frange_storage::get_frange): Restore
every sub-range.
* value-range-pretty-print.cc (vrange_printer::visit): Print each
sub-range.
---
gcc/value-range-pretty-print.cc | 20 +++++++++++---------
gcc/value-range-storage.cc | 12 +++++++-----
2 files changed, 18 insertions(+), 14 deletions(-)
diff --git a/gcc/value-range-pretty-print.cc b/gcc/value-range-pretty-print.cc
index c3e62b0d73a..8b857b1d59a 100644
--- a/gcc/value-range-pretty-print.cc
+++ b/gcc/value-range-pretty-print.cc
@@ -219,15 +219,17 @@ vrange_printer::visit (const frange &r) const
print_frange_nan (r);
return;
}
- pp_character (pp, '[');
- bool has_endpoints = !r.known_isnan ();
- if (has_endpoints)
- {
- print_real_value (type, r.lower_bound ());
- pp_string (pp, ", ");
- print_real_value (type, r.upper_bound ());
- }
- pp_character (pp, ']');
+ if (r.known_isnan ())
+ pp_string (pp, "[]");
+ else
+ for (unsigned i = 0; i < r.num_pairs (); ++i)
+ {
+ pp_character (pp, '[');
+ print_real_value (type, r.lower_bound (i));
+ pp_string (pp, ", ");
+ print_real_value (type, r.upper_bound (i));
+ pp_character (pp, ']');
+ }
print_frange_nan (r);
}
diff --git a/gcc/value-range-storage.cc b/gcc/value-range-storage.cc
index 6f8b53814a8..153a2aecb48 100644
--- a/gcc/value-range-storage.cc
+++ b/gcc/value-range-storage.cc
@@ -556,11 +556,13 @@ frange_storage::get_frange (frange &r, tree type) const
return;
}
- // FIXME: Rewrite for sub-ranges. This only reconstructs the first pair.
- // Eventually do it piecewise like irange_storage::get_irange: start
- // undefined and union each sub-range built through the constructor (so
- // every piece is re-canonicalized).
- r = frange (type, m_pairs[0].min, m_pairs[0].max, m_kind);
+ // Rebuild piecewise, like irange_storage::get_irange().
+ r.set_undefined ();
+ for (unsigned i = 0; i < m_num_ranges; ++i)
+ {
+ frange tmp (type, m_pairs[i].min, m_pairs[i].max, m_kind);
+ r.union_ (tmp);
+ }
// The constructor will set the NAN bits for HONOR_NANS, but we must
// make sure to set the NAN sign if known.
--
2.47.3