http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56113
--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> 2013-01-28
09:45:06 UTC ---
label_visit () seems to collect recursively points_to bits over the predecessor
graph, thus using a quadratic amount of memory. It does so to optimize
variables that point to the same stuff by assigning them the same
pointer_label.
"indirect" nodes seem to be special as far as I can see as they will never
share the same label with a previously visited node. We should be able
to represent their points_to set by themselves and not miss any equivalences
nor create false ones by that. Thus:
Index: gcc/tree-ssa-structalias.c
===================================================================
--- gcc/tree-ssa-structalias.c (revision 195502)
+++ gcc/tree-ssa-structalias.c (working copy)
@@ -2103,6 +2103,17 @@ label_visit (constraint_graph_t graph, s
if (!graph->points_to[n])
graph->points_to[n] = BITMAP_ALLOC (&predbitmap_obstack);
+ /* Indirect nodes get fresh variables. Represent those by that
+ single fresh variable. */
+ if (!bitmap_bit_p (graph->direct_nodes, n))
+ {
+ bitmap_set_bit (graph->points_to[n], FIRST_REF_NODE + n);
+ graph->pointer_label[n] = pointer_equiv_class++;
+ equiv_class_add (pointer_equiv_class_table,
+ graph->pointer_label[n], graph->points_to[n]);
+ return;
+ }
+
/* Label and union our incoming edges's points to sets. */
EXECUTE_IF_IN_NONNULL_BITMAP (graph->preds[n], 0, i, bi)
{
@@ -2117,9 +2128,6 @@ label_visit (constraint_graph_t graph, s
if (graph->points_to[w])
bitmap_ior_into(graph->points_to[n], graph->points_to[w]);
}
- /* Indirect nodes get fresh variables. */
- if (!bitmap_bit_p (graph->direct_nodes, n))
- bitmap_set_bit (graph->points_to[n], FIRST_REF_NODE + n);
if (!bitmap_empty_p (graph->points_to[n]))
{
not sure if it helps in this case though. Assigning pointer_labels is
an optimization, and could be completely short-cut if necessary (not
sure what the result would be for this testcase, or how we could up-front
detect if performing this equivalencing is worthwhile or not).
One may also think of using the pointer_labels of the incoming edges
to perform the unioning instead, thus cache by { set of pointer labels },
{ points-to set } instead of by expanded points-to set only.
The algorithm is definitely poor in its memory usage ...