tree-ssa-structalias.c (dump_constraint): Don't end the line.

2011-04-28  Richard Guenther  <rguenther@suse.de>

	* tree-ssa-structalias.c (dump_constraint): Don't end the line.
	(debug_constraint): Do it here.
	(dump_constraints): And here.
	(rewrite_constraints): And here.
	(dump_constraint_edge): Remove.
	(dump_constraint_graph): Rewrite to produce DOT output.
	(solve_constraints): Build succ graph as late as possible.
	Dump constraint graphs before and after solving.

From-SVN: r173061
This commit is contained in:
Richard Guenther 2011-04-28 09:11:17 +00:00 committed by Richard Biener
parent e38811ce28
commit 8576f20aed
2 changed files with 89 additions and 67 deletions

View File

@ -1,3 +1,14 @@
2011-04-28 Richard Guenther <rguenther@suse.de>
* tree-ssa-structalias.c (dump_constraint): Don't end the line.
(debug_constraint): Do it here.
(dump_constraints): And here.
(rewrite_constraints): And here.
(dump_constraint_edge): Remove.
(dump_constraint_graph): Rewrite to produce DOT output.
(solve_constraints): Build succ graph as late as possible.
Dump constraint graphs before and after solving.
2011-04-28 Richard Guenther <rguenther@suse.de>
* tree-ssa-structalias.c (find_func_aliases_for_builtin_call):

View File

@ -650,7 +650,6 @@ dump_constraint (FILE *file, constraint_t c)
fprintf (file, " + UNKNOWN");
else if (c->rhs.offset != 0)
fprintf (file, " + " HOST_WIDE_INT_PRINT_DEC, c->rhs.offset);
fprintf (file, "\n");
}
@ -666,6 +665,7 @@ DEBUG_FUNCTION void
debug_constraint (constraint_t c)
{
dump_constraint (stderr, c);
fprintf (stderr, "\n");
}
/* Print out all constraints to FILE */
@ -676,7 +676,11 @@ dump_constraints (FILE *file, int from)
int i;
constraint_t c;
for (i = from; VEC_iterate (constraint_t, constraints, i, c); i++)
dump_constraint (file, c);
if (c)
{
dump_constraint (file, c);
fprintf (file, "\n");
}
}
/* Print out all constraints to stderr. */
@ -687,86 +691,77 @@ debug_constraints (void)
dump_constraints (stderr, 0);
}
/* Print out to FILE the edge in the constraint graph that is created by
constraint c. The edge may have a label, depending on the type of
constraint that it represents. If complex1, e.g: a = *b, then the label
is "=*", if complex2, e.g: *a = b, then the label is "*=", if
complex with an offset, e.g: a = b + 8, then the label is "+".
Otherwise the edge has no label. */
static void
dump_constraint_edge (FILE *file, constraint_t c)
{
if (c->rhs.type != ADDRESSOF)
{
const char *src = get_varinfo (c->rhs.var)->name;
const char *dst = get_varinfo (c->lhs.var)->name;
fprintf (file, " \"%s\" -> \"%s\" ", src, dst);
/* Due to preprocessing of constraints, instructions like *a = *b are
illegal; thus, we do not have to handle such cases. */
if (c->lhs.type == DEREF)
fprintf (file, " [ label=\"*=\" ] ;\n");
else if (c->rhs.type == DEREF)
fprintf (file, " [ label=\"=*\" ] ;\n");
else
{
/* We must check the case where the constraint is an offset.
In this case, it is treated as a complex constraint. */
if (c->rhs.offset != c->lhs.offset)
fprintf (file, " [ label=\"+\" ] ;\n");
else
fprintf (file, " ;\n");
}
}
}
/* Print the constraint graph in dot format. */
static void
dump_constraint_graph (FILE *file)
{
unsigned int i=0, size;
constraint_t c;
unsigned int i;
/* Only print the graph if it has already been initialized: */
if (!graph)
return;
/* Print the constraints used to produce the constraint graph. The
constraints will be printed as comments in the dot file: */
fprintf (file, "\n\n/* Constraints used in the constraint graph:\n");
dump_constraints (file, 0);
fprintf (file, "*/\n");
/* Prints the header of the dot file: */
fprintf (file, "\n\n// The constraint graph in dot format:\n");
fprintf (file, "strict digraph {\n");
fprintf (file, " node [\n shape = box\n ]\n");
fprintf (file, " edge [\n fontsize = \"12\"\n ]\n");
fprintf (file, "\n // List of nodes in the constraint graph:\n");
fprintf (file, "\n // List of nodes and complex constraints in "
"the constraint graph:\n");
/* The next lines print the nodes in the graph. In order to get the
number of nodes in the graph, we must choose the minimum between the
vector VEC (varinfo_t, varmap) and graph->size. If the graph has not
yet been initialized, then graph->size == 0, otherwise we must only
read nodes that have an entry in VEC (varinfo_t, varmap). */
size = VEC_length (varinfo_t, varmap);
size = size < graph->size ? size : graph->size;
for (i = 0; i < size; i++)
/* The next lines print the nodes in the graph together with the
complex constraints attached to them. */
for (i = 0; i < graph->size; i++)
{
const char *name = get_varinfo (graph->rep[i])->name;
fprintf (file, " \"%s\" ;\n", name);
if (find (i) != i)
continue;
if (i < FIRST_REF_NODE)
fprintf (file, "\"%s\"", get_varinfo (i)->name);
else
fprintf (file, "\"*%s\"", get_varinfo (i - FIRST_REF_NODE)->name);
if (graph->complex[i])
{
unsigned j;
constraint_t c;
fprintf (file, " [label=\"\\N\\n");
for (j = 0; VEC_iterate (constraint_t, graph->complex[i], j, c); ++j)
{
dump_constraint (file, c);
fprintf (file, "\\l");
}
fprintf (file, "\"]");
}
fprintf (file, ";\n");
}
/* Go over the list of constraints printing the edges in the constraint
graph. */
fprintf (file, "\n // The constraint edges:\n");
FOR_EACH_VEC_ELT (constraint_t, constraints, i, c)
if (c)
dump_constraint_edge (file, c);
/* Go over the edges. */
fprintf (file, "\n // Edges in the constraint graph:\n");
for (i = 0; i < graph->size; i++)
{
unsigned j;
bitmap_iterator bi;
if (find (i) != i)
continue;
EXECUTE_IF_IN_NONNULL_BITMAP (graph->succs[i], 0, j, bi)
{
unsigned to = find (j);
if (i == to)
continue;
if (i < FIRST_REF_NODE)
fprintf (file, "\"%s\"", get_varinfo (i)->name);
else
fprintf (file, "\"*%s\"", get_varinfo (i - FIRST_REF_NODE)->name);
fprintf (file, " -> ");
if (to < FIRST_REF_NODE)
fprintf (file, "\"%s\"", get_varinfo (to)->name);
else
fprintf (file, "\"*%s\"", get_varinfo (to - FIRST_REF_NODE)->name);
fprintf (file, ";\n");
}
}
/* Prints the tail of the dot file. By now, only the closing bracket. */
fprintf (file, "}\n\n\n");
/* Prints the tail of the dot file. */
fprintf (file, "}\n");
}
/* Print out the constraint graph to stderr. */
@ -2419,6 +2414,7 @@ rewrite_constraints (constraint_graph_t graph,
"ignoring constraint:",
get_varinfo (lhs.var)->name);
dump_constraint (dump_file, c);
fprintf (dump_file, "\n");
}
VEC_replace (constraint_t, constraints, i, NULL);
continue;
@ -2433,6 +2429,7 @@ rewrite_constraints (constraint_graph_t graph,
"ignoring constraint:",
get_varinfo (rhs.var)->name);
dump_constraint (dump_file, c);
fprintf (dump_file, "\n");
}
VEC_replace (constraint_t, constraints, i, NULL);
continue;
@ -6362,13 +6359,11 @@ solve_constraints (void)
fprintf (dump_file, "Rewriting constraints and unifying "
"variables\n");
rewrite_constraints (graph, si);
build_succ_graph ();
free_var_substitution_info (si);
if (dump_file && (dump_flags & TDF_GRAPH))
dump_constraint_graph (dump_file);
build_succ_graph ();
/* Attach complex constraints to graph nodes. */
move_complex_constraints (graph);
if (dump_file)
@ -6384,11 +6379,27 @@ solve_constraints (void)
point. */
remove_preds_and_fake_succs (graph);
if (dump_file && (dump_flags & TDF_GRAPH))
{
fprintf (dump_file, "\n\n// The constraint graph before solve-graph "
"in dot format:\n");
dump_constraint_graph (dump_file);
fprintf (dump_file, "\n\n");
}
if (dump_file)
fprintf (dump_file, "Solving graph\n");
solve_graph (graph);
if (dump_file && (dump_flags & TDF_GRAPH))
{
fprintf (dump_file, "\n\n// The constraint graph after solve-graph "
"in dot format:\n");
dump_constraint_graph (dump_file);
fprintf (dump_file, "\n\n");
}
if (dump_file)
dump_sa_points_to_info (dump_file);
}