I have rebased my value_range dumping patch after your value_range_base
changes.
I know you are not a fan of the gimple-pretty-print.c chunk, but I still
think having one set of dumping code is preferable to catering to
possible GC corruption while debugging. If you're strongly opposed (as,
I'm putting my foot down), I can remove it as well as the relevant
pretty_printer stuff.
The patch looks bigger than it is because I moved all the dump routines
into one place.
OK?
p.s. After your changes, perhaps get_range_info(const_tree, value_range
&) should take a value_range_base instead?
gcc/
* gimple-pretty-print.c (dump_ssaname_info): Use value_range
dumping infrastructure.
* ipa-cp.c (ipcp_vr_lattice::print): Call overloaded
dump_value_range.
* tree-vrp.c (value_range_base::dump): Rewrite to use
pretty_printer. Dump type. Do not display -INF/+INF if precision
is 1.
Move all dumping routines into one spot.
* tree-vrp.h (value_range_base): Add pretty_printer variant.
(value_range): Same.
(dump_value_range_base): Rename to overloaded dump_value_range.
gcc/testsuite/
* gcc.dg/tree-ssa/pr64130.c: Adjust for new value_range pretty
printer.
* gcc.dg/tree-ssa/vrp92.c: Same.
diff --git a/gcc/gimple-pretty-print.c b/gcc/gimple-pretty-print.c
index 276e5798bac..e69683f174e 100644
--- a/gcc/gimple-pretty-print.c
+++ b/gcc/gimple-pretty-print.c
@@ -2151,21 +2151,11 @@ dump_ssaname_info (pretty_printer *buffer, tree node, int spc)
if (!POINTER_TYPE_P (TREE_TYPE (node))
&& SSA_NAME_RANGE_INFO (node))
{
- wide_int min, max, nonzero_bits;
- value_range_kind range_type = get_range_info (node, &min, &max);
+ value_range vr;
- if (range_type == VR_VARYING)
- pp_printf (buffer, "# RANGE VR_VARYING");
- else if (range_type == VR_RANGE || range_type == VR_ANTI_RANGE)
- {
- pp_printf (buffer, "# RANGE ");
- pp_printf (buffer, "%s[", range_type == VR_RANGE ? "" : "~");
- pp_wide_int (buffer, min, TYPE_SIGN (TREE_TYPE (node)));
- pp_printf (buffer, ", ");
- pp_wide_int (buffer, max, TYPE_SIGN (TREE_TYPE (node)));
- pp_printf (buffer, "]");
- }
- nonzero_bits = get_nonzero_bits (node);
+ get_range_info (node, vr);
+ vr.dump (buffer);
+ wide_int nonzero_bits = get_nonzero_bits (node);
if (nonzero_bits != -1)
{
pp_string (buffer, " NONZERO ");
diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
index 4f147eb37cc..882c8975ff4 100644
--- a/gcc/ipa-cp.c
+++ b/gcc/ipa-cp.c
@@ -522,7 +522,7 @@ ipcp_bits_lattice::print (FILE *f)
void
ipcp_vr_lattice::print (FILE * f)
{
- dump_value_range_base (f, &m_vr);
+ dump_value_range (f, &m_vr);
}
/* Print all ipcp_lattices of all functions to F. */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr64130.c b/gcc/testsuite/gcc.dg/tree-ssa/pr64130.c
index e068765e2fc..28ffbb76da8 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr64130.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr64130.c
@@ -15,6 +15,6 @@ int funsigned2 (uint32_t a)
return (-1 * 0x1ffffffffL) / a == 0;
}
-/* { dg-final { scan-tree-dump ": \\\[2, 8589934591\\\]" "evrp" } } */
-/* { dg-final { scan-tree-dump ": \\\[-8589934591, -2\\\]" "evrp" } } */
+/* { dg-final { scan-tree-dump "int \\\[2, 8589934591\\\]" "evrp" } } */
+/* { dg-final { scan-tree-dump "int \\\[-8589934591, -2\\\]" "evrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp92.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp92.c
index 5a2dbf0108a..66d74e9b5e9 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/vrp92.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp92.c
@@ -18,5 +18,5 @@ int foo (int i, int j)
return j;
}
-/* { dg-final { scan-tree-dump "res_.: \\\[1, 1\\\]" "vrp1" } } */
+/* { dg-final { scan-tree-dump "res_.: int \\\[1, 1\\\]" "vrp1" } } */
/* { dg-final { scan-tree-dump-not "Threaded" "vrp1" } } */
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 3ef676bb71b..0081821985c 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -358,70 +358,130 @@ value_range_base::type () const
return TREE_TYPE (min ());
}
-/* Dump value range to FILE. */
+/* Value range dumping functions. */
void
-value_range_base::dump (FILE *file) const
+value_range_base::dump (pretty_printer *buffer) const
{
if (undefined_p ())
- fprintf (file, "UNDEFINED");
+ pp_string (buffer, "UNDEFINED");
else if (m_kind == VR_RANGE || m_kind == VR_ANTI_RANGE)
{
- tree type = TREE_TYPE (min ());
+ tree ttype = type ();
+
+ dump_generic_node (buffer, ttype, 0, TDF_SLIM, false);
+ pp_character (buffer, ' ');
- fprintf (file, "%s[", (m_kind == VR_ANTI_RANGE) ? "~" : "");
+ pp_printf (buffer, "%s[", (m_kind == VR_ANTI_RANGE) ? "~" : "");
- if (INTEGRAL_TYPE_P (type)
- && !TYPE_UNSIGNED (type)
- && vrp_val_is_min (min ()))
- fprintf (file, "-INF");
+ if (INTEGRAL_TYPE_P (ttype)
+ && !TYPE_UNSIGNED (ttype)
+ && vrp_val_is_min (min ())
+ && TYPE_PRECISION (ttype) != 1)
+ pp_printf (buffer, "-INF");
else
- print_generic_expr (file, min ());
+ dump_generic_node (buffer, min (), 0, TDF_SLIM, false);
- fprintf (file, ", ");
+ pp_printf (buffer, ", ");
- if (INTEGRAL_TYPE_P (type)
- && vrp_val_is_max (max ()))
- fprintf (file, "+INF");
+ if (INTEGRAL_TYPE_P (ttype)
+ && vrp_val_is_max (max ())
+ && TYPE_PRECISION (ttype) != 1)
+ pp_printf (buffer, "+INF");
else
- print_generic_expr (file, max ());
+ dump_generic_node (buffer, max (), 0, TDF_SLIM, false);
- fprintf (file, "]");
+ pp_string (buffer, "]");
}
else if (varying_p ())
- fprintf (file, "VARYING");
+ pp_string (buffer, "VARYING");
else
- fprintf (file, "INVALID RANGE");
+ pp_string (buffer, "INVALID RANGE");
}
void
-value_range::dump (FILE *file) const
+dump_value_range (FILE *file, const value_range_base *vr)
+{
+ if (!vr)
+ fprintf (file, "[]");
+ else
+ vr->dump (file);
+}
+
+void
+dump_value_range (FILE *file, const value_range *vr)
+{
+ if (!vr)
+ fprintf (file, "[]");
+ else
+ vr->dump (file);
+}
+
+void
+value_range::dump (pretty_printer *buffer) const
{
- value_range_base::dump (file);
+ value_range_base::dump (buffer);
if ((m_kind == VR_RANGE || m_kind == VR_ANTI_RANGE)
&& m_equiv)
{
bitmap_iterator bi;
unsigned i, c = 0;
- fprintf (file, " EQUIVALENCES: { ");
+ pp_printf (buffer, " EQUIVALENCES: { ");
EXECUTE_IF_SET_IN_BITMAP (m_equiv, 0, i, bi)
{
- print_generic_expr (file, ssa_name (i));
- fprintf (file, " ");
+ dump_generic_node (buffer, ssa_name (i), 0, TDF_SLIM, false);
+ pp_character (buffer, ' ');
c++;
}
- fprintf (file, "} (%u elements)", c);
+ pp_printf (buffer, "} (%u elements)", c);
}
}
void
-value_range::dump () const
+value_range_base::dump (FILE *file) const
+{
+ pretty_printer buffer;
+ pp_needs_newline (&buffer) = true;
+ buffer.buffer->stream = file;
+ dump (&buffer);
+ pp_flush (&buffer);
+}
+
+void
+value_range::dump (FILE *file) const
+{
+ pretty_printer buffer;
+ pp_needs_newline (&buffer) = true;
+ buffer.buffer->stream = file;
+ dump (&buffer);
+ pp_flush (&buffer);
+}
+
+DEBUG_FUNCTION void
+debug (const value_range_base *vr)
+{
+ dump_value_range (stderr, vr);
+}
+
+DEBUG_FUNCTION void
+debug (const value_range_base &vr)
{
- dump_value_range (stderr, this);
- fprintf (stderr, "\n");
+ dump_value_range (stderr, &vr);
+}
+
+DEBUG_FUNCTION void
+debug (const value_range *vr)
+{
+ dump_value_range (stderr, vr);
+}
+
+DEBUG_FUNCTION void
+debug (const value_range &vr)
+{
+ dump_value_range (stderr, &vr);
}
/* Return true if the SSA name NAME is live on the edge E. */
@@ -2167,41 +2227,6 @@ extract_range_from_unary_expr (value_range *vr,
return;
}
-/* Debugging dumps. */
-
-void dump_value_range (FILE *, const value_range *);
-void debug_value_range (const value_range *);
-void dump_all_value_ranges (FILE *);
-void dump_vr_equiv (FILE *, bitmap);
-void debug_vr_equiv (bitmap);
-
-void
-dump_value_range (FILE *file, const value_range *vr)
-{
- if (!vr)
- fprintf (file, "[]");
- else
- vr->dump (file);
-}
-
-void
-dump_value_range_base (FILE *file, const value_range_base *vr)
-{
- if (!vr)
- fprintf (file, "[]");
- else
- vr->dump (file);
-}
-
-/* Dump value range VR to stderr. */
-
-DEBUG_FUNCTION void
-debug_value_range (const value_range *vr)
-{
- vr->dump ();
-}
-
-
/* Given a COND_EXPR COND of the form 'V OP W', and an SSA name V,
create a new SSA name N and return the assertion assignment
'N = ASSERT_EXPR <V, V OP W>'. */
diff --git a/gcc/tree-vrp.h b/gcc/tree-vrp.h
index 1e141c017e8..d93557ac83c 100644
--- a/gcc/tree-vrp.h
+++ b/gcc/tree-vrp.h
@@ -63,8 +63,8 @@ public:
tree type () const;
bool may_contain_p (tree) const;
void set_and_canonicalize (enum value_range_kind, tree, tree);
-
void dump (FILE *) const;
+ void dump (pretty_printer *buffer) const;
protected:
void set (value_range_kind, tree, tree);
@@ -116,7 +116,7 @@ class GTY((user)) value_range : public value_range_base
void deep_copy (const value_range *);
void set_and_canonicalize (enum value_range_kind, tree, tree, bitmap);
void dump (FILE *) const;
- void dump () const;
+ void dump (pretty_printer *) const;
private:
void set (value_range_kind, tree, tree, bitmap);
@@ -202,7 +202,7 @@ value_range::zero_p () const
}
extern void dump_value_range (FILE *, const value_range *);
-extern void dump_value_range_base (FILE *, const value_range_base *);
+extern void dump_value_range (FILE *, const value_range_base *);
extern void extract_range_from_unary_expr (value_range *vr,
enum tree_code code,
tree type,