frange: dump hex values when dumping FP numbers.

It has been suggested that if we start bumping numbers by an ULP when
calculating open ranges (for example the numbers less than 3.0) that
dumping these will become increasingly harder to read, and instead we
should opt for the hex representation.  I still find the floating
point representation easier to read for most numbers, but perhaps we
could have both?

With this patch this is the representation for [15.0, 20.0]:

     [frange] float [1.5e+1 (0x0.fp+4), 2.0e+1 (0x0.ap+5)]

Would you find this useful, or should we stick to the hex
representation only?

Tested on x86-64 Linux.

gcc/ChangeLog:

	* value-range-pretty-print.cc (vrange_printer::print_real_value): New.
	(vrange_printer::visit): Call print_real_value.
	* value-range-pretty-print.h: New print_real_value.
This commit is contained in:
Aldy Hernandez 2022-09-22 18:07:03 +02:00
parent 6516257285
commit 0706262498
2 changed files with 16 additions and 4 deletions

View file

@ -117,6 +117,19 @@ vrange_printer::print_irange_bitmasks (const irange &r) const
pp_string (pp, buf);
}
void
vrange_printer::print_real_value (tree type, const REAL_VALUE_TYPE &r) const
{
char s[100];
real_to_decimal_for_mode (s, &r, sizeof (s), 0, 1, TYPE_MODE (type));
pp_string (pp, s);
if (!DECIMAL_FLOAT_TYPE_P (type))
{
real_to_hexadecimal (s, &r, sizeof (s), 0, 1);
pp_printf (pp, " (%s)", s);
}
}
// Print an frange.
void
@ -141,11 +154,9 @@ vrange_printer::visit (const frange &r) const
bool has_endpoints = !r.known_isnan ();
if (has_endpoints)
{
dump_generic_node (pp,
build_real (type, r.lower_bound ()), 0, TDF_NONE, false);
print_real_value (type, r.lower_bound ());
pp_string (pp, ", ");
dump_generic_node (pp,
build_real (type, r.upper_bound ()), 0, TDF_NONE, false);
print_real_value (type, r.upper_bound ());
}
pp_character (pp, ']');
print_frange_nan (r);

View file

@ -32,6 +32,7 @@ private:
void print_irange_bound (const wide_int &w, tree type) const;
void print_irange_bitmasks (const irange &) const;
void print_frange_nan (const frange &) const;
void print_real_value (tree type, const REAL_VALUE_TYPE &r) const;
pretty_printer *pp;
};