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:
parent
fedcf3c476
commit
4711377345
3 changed files with 41 additions and 3 deletions
|
@ -204,7 +204,7 @@ private:
|
|||
class debug_dump_context
|
||||
{
|
||||
public:
|
||||
debug_dump_context ();
|
||||
debug_dump_context (FILE *f = stderr);
|
||||
~debug_dump_context ();
|
||||
|
||||
private:
|
||||
|
|
|
@ -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 ();
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue