aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2012-04-05 11:30:52 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-04-05 11:30:52 +0000
commit14f60a5a37d7a958382e6a9ffc39f90957ad1dbc (patch)
tree45d48f1e6b6142df50dda802059251064054c8fc /gcc
parent0e74b5a21f888f99315cfa8ac762d13b7e51a79c (diff)
downloadgcc-14f60a5a37d7a958382e6a9ffc39f90957ad1dbc.zip
gcc-14f60a5a37d7a958382e6a9ffc39f90957ad1dbc.tar.gz
gcc-14f60a5a37d7a958382e6a9ffc39f90957ad1dbc.tar.bz2
tree-ssanames.c (release_dead_ssa_names): Compact the SSA version namespace as we release the freelist.
2012-04-05 Richard Guenther <rguenther@suse.de> * tree-ssanames.c (release_dead_ssa_names): Compact the SSA version namespace as we release the freelist. From-SVN: r186162
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/tree-ssanames.c31
2 files changed, 30 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bd45eb7..8273970 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2012-04-05 Richard Guenther <rguenther@suse.de>
+ * tree-ssanames.c (release_dead_ssa_names): Compact the SSA
+ version namespace as we release the freelist.
+
+2012-04-05 Richard Guenther <rguenther@suse.de>
+
* tree-nrv.c (tree_nrv): Release VDEFs.
* tree-sra.c (sra_modify_constructor_assign): Likewise.
(sra_modify_assign): Likewise.
diff --git a/gcc/tree-ssanames.c b/gcc/tree-ssanames.c
index 42eb924..7c31550 100644
--- a/gcc/tree-ssanames.c
+++ b/gcc/tree-ssanames.c
@@ -325,14 +325,14 @@ replace_ssa_name_symbol (tree ssa_name, tree sym)
TREE_TYPE (ssa_name) = TREE_TYPE (sym);
}
-/* Return SSA names that are unused to GGC memory. This is used to keep
- footprint of compiler during interprocedural optimization.
- As a side effect the SSA_NAME_VERSION number reuse is reduced
- so this function should not be used too often. */
+/* Return SSA names that are unused to GGC memory and compact the SSA
+ version namespace. This is used to keep footprint of compiler during
+ interprocedural optimization. */
static unsigned int
release_dead_ssa_names (void)
{
tree t;
+ unsigned i, j;
int n = VEC_length (tree, FREE_SSANAMES (cfun));
referenced_var_iterator rvi;
@@ -340,14 +340,33 @@ release_dead_ssa_names (void)
eventually dead variables so a bunch of memory is held live. */
FOR_EACH_REFERENCED_VAR (cfun, t, rvi)
set_current_def (t, NULL);
+
/* Now release the freelist. */
VEC_free (tree, gc, FREE_SSANAMES (cfun));
FREE_SSANAMES (cfun) = NULL;
+ /* And compact the SSA number space. We make sure to not change the
+ relative order of SSA versions. */
+ for (i = 1, j = 1; i < VEC_length (tree, cfun->gimple_df->ssa_names); ++i)
+ {
+ tree name = ssa_name (i);
+ if (name)
+ {
+ if (i != j)
+ {
+ SSA_NAME_VERSION (name) = j;
+ VEC_replace (tree, cfun->gimple_df->ssa_names, j, name);
+ }
+ j++;
+ }
+ }
+ VEC_truncate (tree, cfun->gimple_df->ssa_names, j);
+
statistics_counter_event (cfun, "SSA names released", n);
+ statistics_counter_event (cfun, "SSA name holes removed", i - j);
if (dump_file)
- fprintf (dump_file, "Released %i names, %.2f%%\n",
- n, n * 100.0 / num_ssa_names);
+ fprintf (dump_file, "Released %i names, %.2f%%, removed %i holes\n",
+ n, n * 100.0 / num_ssa_names, i - j);
return 0;
}