produce simple DOT graphs from SLP trees

This adds a dot_slp_tree debug function producing a simple DOT
graph from a starting node down the graph.  There's no fancy
direct invocation of dot but the output is directed to a specified
file.  It re-uses vect_print_slp_tree, naming nodes as their
address.

2021-07-12  Richard Biener  <rguenther@suse.de>

	* dump-context.h (debug_dump_context::debug_dump_context):
	Add FILE * parameter defaulted to stderr.
	* dumpfile.c (debug_dump_context::debug_dump_context): Adjust.
	* tree-vect-slp.c (dot_slp_tree): New functions.
This commit is contained in:
Richard Biener 2021-07-12 15:13:17 +02:00
parent fedcf3c476
commit 4711377345
3 changed files with 41 additions and 3 deletions

View File

@ -204,7 +204,7 @@ private:
class debug_dump_context
{
public:
debug_dump_context ();
debug_dump_context (FILE *f = stderr);
~debug_dump_context ();
private:

View File

@ -2098,14 +2098,14 @@ enable_rtl_dump_file (void)
/* debug_dump_context's ctor. Temporarily override the dump_context
(to forcibly enable output to stderr). */
debug_dump_context::debug_dump_context ()
debug_dump_context::debug_dump_context (FILE *f)
: 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);
set_dump_file (f);
dump_context::s_current = &m_context;
pflags = dump_flags = MSG_ALL_KINDS | MSG_ALL_PRIORITIES;
dump_context::get ().refresh_dumps_are_enabled ();

View File

@ -2552,6 +2552,44 @@ debug (slp_tree node)
node);
}
/* Recursive helper for the dot producer below. */
static void
dot_slp_tree (FILE *f, slp_tree node, hash_set<slp_tree> &visited)
{
if (visited.add (node))
return;
fprintf (f, "\"%p\" [label=\"", (void *)node);
vect_print_slp_tree (MSG_NOTE,
dump_location_t::from_location_t (UNKNOWN_LOCATION),
node);
fprintf (f, "\"];\n");
for (slp_tree child : SLP_TREE_CHILDREN (node))
fprintf (f, "\"%p\" -> \"%p\";", (void *)node, (void *)child);
for (slp_tree child : SLP_TREE_CHILDREN (node))
dot_slp_tree (f, child, visited);
}
DEBUG_FUNCTION void
dot_slp_tree (const char *fname, slp_tree node)
{
FILE *f = fopen (fname, "w");
fprintf (f, "digraph {\n");
fflush (f);
{
debug_dump_context ctx (f);
hash_set<slp_tree> visited;
dot_slp_tree (f, node, visited);
}
fflush (f);
fprintf (f, "}\n");
fclose (f);
}
/* Dump a slp tree NODE using flags specified in DUMP_KIND. */
static void