re PR c/56113 (out of memory when compiling a function with many goto labels (50k...
authorRichard Biener <rguenther@suse.de>
Fri, 1 Feb 2013 12:38:45 +0000 (12:38 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 1 Feb 2013 12:38:45 +0000 (12:38 +0000)
2013-02-01  Richard Biener  <rguenther@suse.de>

        PR tree-optimization/56113
* tree-ssa-structalias.c (label_visit): Reduce work for
single-predecessor nodes.

From-SVN: r195646

gcc/ChangeLog
gcc/tree-ssa-structalias.c

index aa966f9390638e09a45064b46cbd2c9385a96ddd..60394c74e490d77967a05ff23b328d805e5a4255 100644 (file)
@@ -1,3 +1,9 @@
+2013-02-01  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/56113
+       * tree-ssa-structalias.c (label_visit): Reduce work for
+       single-predecessor nodes.
+
 2013-02-01  Eric Botcazou  <ebotcazou@adacore.com>
 
        * fold-const.c (make_range_step) <TRUTH_NOT_EXPR>: Bail out if the
index 1bbe1cc5ae087c2704a13199ba7d851d5c896c33..bee27b1f1c54db05216cdd8673a9739f064cc32f 100644 (file)
@@ -2107,14 +2107,13 @@ condense_visit (constraint_graph_t graph, struct scc_info *si, unsigned int n)
 static void
 label_visit (constraint_graph_t graph, struct scc_info *si, unsigned int n)
 {
-  unsigned int i;
+  unsigned int i, first_pred;
   bitmap_iterator bi;
-  bitmap_set_bit (si->visited, n);
 
-  if (!graph->points_to[n])
-    graph->points_to[n] = BITMAP_ALLOC (&predbitmap_obstack);
+  bitmap_set_bit (si->visited, n);
 
   /* Label and union our incoming edges's points to sets.  */
+  first_pred = -1U;
   EXECUTE_IF_IN_NONNULL_BITMAP (graph->preds[n], 0, i, bi)
     {
       unsigned int w = si->node_mapping[i];
@@ -2126,11 +2125,45 @@ label_visit (constraint_graph_t graph, struct scc_info *si, unsigned int n)
        continue;
 
       if (graph->points_to[w])
-       bitmap_ior_into(graph->points_to[n], graph->points_to[w]);
+       {
+         if (first_pred == -1U)
+           first_pred = w;
+         else if (!graph->points_to[n])
+           {
+             graph->points_to[n] = BITMAP_ALLOC (&predbitmap_obstack);
+             bitmap_ior (graph->points_to[n],
+                         graph->points_to[first_pred], graph->points_to[w]);
+           }
+         else
+           bitmap_ior_into(graph->points_to[n], graph->points_to[w]);
+       }
     }
-  /* Indirect nodes get fresh variables.  */
+
+  /* Indirect nodes get fresh variables and a new pointer equiv class.  */
   if (!bitmap_bit_p (graph->direct_nodes, n))
-    bitmap_set_bit (graph->points_to[n], FIRST_REF_NODE + n);
+    {
+      if (!graph->points_to[n])
+       {
+         graph->points_to[n] = BITMAP_ALLOC (&predbitmap_obstack);
+         if (first_pred != -1U)
+           bitmap_copy (graph->points_to[n], graph->points_to[first_pred]);
+       }
+      bitmap_set_bit (graph->points_to[n], FIRST_REF_NODE + n);
+      graph->pointer_label[n] = pointer_equiv_class++;
+      return;
+    }
+
+  /* If there was only a single non-empty predecessor the pointer equiv
+     class is the same.  */
+  if (!graph->points_to[n])
+    {
+      if (first_pred != -1U)
+       {
+         graph->pointer_label[n] = graph->pointer_label[first_pred];
+         graph->points_to[n] = graph->points_to[first_pred];
+       }
+      return;
+    }
 
   if (!bitmap_empty_p (graph->points_to[n]))
     {