Commit 78d087bc by Richard Biener Committed by Richard Biener

re PR c/56113 (out of memory when compiling a function with many goto labels (50k > ))

2013-01-29  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/56113
	* tree-ssa-structalias.c (equiv_class_lookup): Also return
	the bitmap leader.
	(label_visit): Free duplicate bitmaps and record the leader instead.
	(perform_var_substitution): Adjust.

From-SVN: r195541
parent d3820795
2013-01-29 Richard Biener <rguenther@suse.de> 2013-01-29 Richard Biener <rguenther@suse.de>
PR tree-optimization/56113
* tree-ssa-structalias.c (equiv_class_lookup): Also return
the bitmap leader.
(label_visit): Free duplicate bitmaps and record the leader instead.
(perform_var_substitution): Adjust.
2013-01-29 Richard Biener <rguenther@suse.de>
PR tree-optimization/55270 PR tree-optimization/55270
* tree-ssa-dom.c (eliminate_degenerate_phis): If we changed * tree-ssa-dom.c (eliminate_degenerate_phis): If we changed
the CFG, schedule loops for fixup. the CFG, schedule loops for fixup.
......
...@@ -1907,10 +1907,10 @@ equiv_class_label_eq (const void *p1, const void *p2) ...@@ -1907,10 +1907,10 @@ equiv_class_label_eq (const void *p1, const void *p2)
} }
/* Lookup a equivalence class in TABLE by the bitmap of LABELS it /* Lookup a equivalence class in TABLE by the bitmap of LABELS it
contains. */ contains. Sets *REF_LABELS to the bitmap LABELS is equivalent to. */
static unsigned int static unsigned int
equiv_class_lookup (htab_t table, bitmap labels) equiv_class_lookup (htab_t table, bitmap labels, bitmap *ref_labels)
{ {
void **slot; void **slot;
struct equiv_class_label ecl; struct equiv_class_label ecl;
...@@ -1921,9 +1921,18 @@ equiv_class_lookup (htab_t table, bitmap labels) ...@@ -1921,9 +1921,18 @@ equiv_class_lookup (htab_t table, bitmap labels)
slot = htab_find_slot_with_hash (table, &ecl, slot = htab_find_slot_with_hash (table, &ecl,
ecl.hashcode, NO_INSERT); ecl.hashcode, NO_INSERT);
if (!slot) if (!slot)
return 0; {
if (ref_labels)
*ref_labels = NULL;
return 0;
}
else else
return ((equiv_class_label_t) *slot)->equivalence_class; {
equiv_class_label_t ec = (equiv_class_label_t) *slot;
if (ref_labels)
*ref_labels = ec->labels;
return ec->equivalence_class;
}
} }
...@@ -2123,14 +2132,21 @@ label_visit (constraint_graph_t graph, struct scc_info *si, unsigned int n) ...@@ -2123,14 +2132,21 @@ label_visit (constraint_graph_t graph, struct scc_info *si, unsigned int n)
if (!bitmap_empty_p (graph->points_to[n])) if (!bitmap_empty_p (graph->points_to[n]))
{ {
bitmap ref_points_to;
unsigned int label = equiv_class_lookup (pointer_equiv_class_table, unsigned int label = equiv_class_lookup (pointer_equiv_class_table,
graph->points_to[n]); graph->points_to[n],
&ref_points_to);
if (!label) if (!label)
{ {
label = pointer_equiv_class++; label = pointer_equiv_class++;
equiv_class_add (pointer_equiv_class_table, equiv_class_add (pointer_equiv_class_table,
label, graph->points_to[n]); label, graph->points_to[n]);
} }
else
{
BITMAP_FREE (graph->points_to[n]);
graph->points_to[n] = ref_points_to;
}
graph->pointer_label[n] = label; graph->pointer_label[n] = label;
} }
} }
...@@ -2190,7 +2206,7 @@ perform_var_substitution (constraint_graph_t graph) ...@@ -2190,7 +2206,7 @@ perform_var_substitution (constraint_graph_t graph)
/* Look up the location equivalence label if one exists, or make /* Look up the location equivalence label if one exists, or make
one otherwise. */ one otherwise. */
label = equiv_class_lookup (location_equiv_class_table, label = equiv_class_lookup (location_equiv_class_table,
pointed_by); pointed_by, NULL);
if (label == 0) if (label == 0)
{ {
label = location_equiv_class++; label = location_equiv_class++;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment