diff options
author | Richard Biener <rguenther@suse.de> | 2013-01-29 14:22:47 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2013-01-29 14:22:47 +0000 |
commit | 78d087bc6ccc74c3ca8d1483d660fad535cad358 (patch) | |
tree | 53ed24d2dc1f4973861b51fd4a6e3c8de75d095c /gcc/tree-ssa-structalias.c | |
parent | d38207955c35124725ee6a92a06b8074851f0a82 (diff) | |
download | gcc-78d087bc6ccc74c3ca8d1483d660fad535cad358.zip gcc-78d087bc6ccc74c3ca8d1483d660fad535cad358.tar.gz gcc-78d087bc6ccc74c3ca8d1483d660fad535cad358.tar.bz2 |
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
Diffstat (limited to 'gcc/tree-ssa-structalias.c')
-rw-r--r-- | gcc/tree-ssa-structalias.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 4ad956f..cacfdab 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -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 - contains. */ + contains. Sets *REF_LABELS to the bitmap LABELS is equivalent to. */ static unsigned int -equiv_class_lookup (htab_t table, bitmap labels) +equiv_class_lookup (htab_t table, bitmap labels, bitmap *ref_labels) { void **slot; struct equiv_class_label ecl; @@ -1921,9 +1921,18 @@ equiv_class_lookup (htab_t table, bitmap labels) slot = htab_find_slot_with_hash (table, &ecl, ecl.hashcode, NO_INSERT); if (!slot) - return 0; + { + if (ref_labels) + *ref_labels = NULL; + return 0; + } 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) if (!bitmap_empty_p (graph->points_to[n])) { + bitmap ref_points_to; unsigned int label = equiv_class_lookup (pointer_equiv_class_table, - graph->points_to[n]); + graph->points_to[n], + &ref_points_to); if (!label) { label = pointer_equiv_class++; equiv_class_add (pointer_equiv_class_table, label, graph->points_to[n]); } + else + { + BITMAP_FREE (graph->points_to[n]); + graph->points_to[n] = ref_points_to; + } graph->pointer_label[n] = label; } } @@ -2190,7 +2206,7 @@ perform_var_substitution (constraint_graph_t graph) /* Look up the location equivalence label if one exists, or make one otherwise. */ label = equiv_class_lookup (location_equiv_class_table, - pointed_by); + pointed_by, NULL); if (label == 0) { label = location_equiv_class++; |