From f61f9b28793d94060ce858e5f8a080db91785779 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 25 May 2020 16:10:12 +0200 Subject: [PATCH] Add debug (slp_tree) and dump infrastructure for this This adds an alternate debug_dump_context similar to the one for selftests but for interactive debugging routines. This allows to share code between user-visible dumping via the dump_* API and those debugging routines. The primary driver was SLP node dumping which wasn't accessible from inside a gdb session up to now. 2020-05-27 Richard Biener * dump-context.h (debug_dump_context): New class. (dump_context): Make it friend. * dumpfile.c (debug_dump_context::debug_dump_context): Implement. (debug_dump_context::~debug_dump_context): Likewise. * tree-vect-slp.c: Include dump-context.h. (vect_print_slp_tree): Dump a single SLP node. (debug): New overload for slp_tree. (vect_print_slp_graph): Rename from vect_print_slp_tree and use that. (vect_analyze_slp_instance): Adjust. --- gcc/dump-context.h | 21 +++++++++++++++++++++ gcc/dumpfile.c | 28 ++++++++++++++++++++++++++++ gcc/tree-vect-slp.c | 47 +++++++++++++++++++++++++++++++++++------------ 3 files changed, 84 insertions(+), 12 deletions(-) diff --git a/gcc/dump-context.h b/gcc/dump-context.h index 347477f..3f72cc9 100644 --- a/gcc/dump-context.h +++ b/gcc/dump-context.h @@ -29,6 +29,7 @@ along with GCC; see the file COPYING3. If not see class optrecord_json_writer; namespace selftest { class temp_dump_context; } +class debug_dump_context; /* A class for handling the various dump_* calls. @@ -42,6 +43,7 @@ namespace selftest { class temp_dump_context; } class dump_context { friend class selftest::temp_dump_context; + friend class debug_dump_context; public: static dump_context &get () { return *s_current; } @@ -195,6 +197,25 @@ private: auto_vec m_stashed_items; }; +/* An RAII-style class for use in debug dumpers for temporarily using a + different dump_context. It enables full details and outputs to + stderr instead of the currently active dump_file. */ + +class debug_dump_context +{ + public: + debug_dump_context (); + ~debug_dump_context (); + + private: + dump_context m_context; + dump_context *m_saved; + dump_flags_t m_saved_flags; + dump_flags_t m_saved_pflags; + FILE *m_saved_file; +}; + + #if CHECKING_P namespace selftest { diff --git a/gcc/dumpfile.c b/gcc/dumpfile.c index 5471878..5d61946 100644 --- a/gcc/dumpfile.c +++ b/gcc/dumpfile.c @@ -2078,6 +2078,34 @@ enable_rtl_dump_file (void) return num_enabled > 0; } +/* debug_dump_context's ctor. Temporarily override the dump_context + (to forcibly enable output to stderr). */ + +debug_dump_context::debug_dump_context () +: m_context (), + m_saved (&dump_context::get ()), + m_saved_flags (dump_flags), + m_saved_pflags (pflags), + m_saved_file (dump_file) +{ + set_dump_file (stderr); + dump_context::s_current = &m_context; + pflags = dump_flags = MSG_ALL_KINDS | MSG_ALL_PRIORITIES; + dump_context::get ().refresh_dumps_are_enabled (); +} + +/* debug_dump_context's dtor. Restore the saved dump_context. */ + +debug_dump_context::~debug_dump_context () +{ + set_dump_file (m_saved_file); + dump_context::s_current = m_saved; + dump_flags = m_saved_flags; + pflags = m_saved_pflags; + dump_context::get ().refresh_dumps_are_enabled (); +} + + #if CHECKING_P namespace selftest { diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index c4fd045..c0c9afd 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -44,6 +44,7 @@ along with GCC; see the file COPYING3. If not see #include "vec-perm-indices.h" #include "gimple-fold.h" #include "internal-fn.h" +#include "dump-context.h" /* Initialize a SLP node. */ @@ -1579,20 +1580,17 @@ fail: return node; } -/* Dump a slp tree NODE using flags specified in DUMP_KIND. */ +/* Dump a single SLP tree NODE. */ static void vect_print_slp_tree (dump_flags_t dump_kind, dump_location_t loc, - slp_tree node, hash_set &visited) + slp_tree node) { unsigned i, j; - stmt_vec_info stmt_info; slp_tree child; + stmt_vec_info stmt_info; tree op; - if (visited.add (node)) - return; - dump_metadata_t metadata (dump_kind, loc.get_impl_location ()); dump_user_location_t user_loc = loc.get_user_location (); dump_printf_loc (metadata, user_loc, "node%s %p (max_nunits=%u, refcnt=%u)\n", @@ -1626,16 +1624,41 @@ vect_print_slp_tree (dump_flags_t dump_kind, dump_location_t loc, FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), i, child) dump_printf (dump_kind, " %p", (void *)child); dump_printf (dump_kind, "\n"); +} + +DEBUG_FUNCTION void +debug (slp_tree node) +{ + debug_dump_context ctx; + vect_print_slp_tree (MSG_NOTE, + dump_location_t::from_location_t (UNKNOWN_LOCATION), + node); +} + +/* Dump a slp tree NODE using flags specified in DUMP_KIND. */ + +static void +vect_print_slp_graph (dump_flags_t dump_kind, dump_location_t loc, + slp_tree node, hash_set &visited) +{ + unsigned i; + slp_tree child; + + if (visited.add (node)) + return; + + vect_print_slp_tree (dump_kind, loc, node); + FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), i, child) - vect_print_slp_tree (dump_kind, loc, child, visited); + vect_print_slp_graph (dump_kind, loc, child, visited); } static void -vect_print_slp_tree (dump_flags_t dump_kind, dump_location_t loc, - slp_tree node) +vect_print_slp_graph (dump_flags_t dump_kind, dump_location_t loc, + slp_tree entry) { hash_set visited; - vect_print_slp_tree (dump_kind, loc, node, visited); + vect_print_slp_graph (dump_kind, loc, entry, visited); } /* Mark the tree rooted at NODE with PURE_SLP. */ @@ -2240,8 +2263,8 @@ vect_analyze_slp_instance (vec_info *vinfo, { dump_printf_loc (MSG_NOTE, vect_location, "Final SLP tree for instance:\n"); - vect_print_slp_tree (MSG_NOTE, vect_location, - SLP_INSTANCE_TREE (new_instance)); + vect_print_slp_graph (MSG_NOTE, vect_location, + SLP_INSTANCE_TREE (new_instance)); } return true; -- 2.7.4