aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssanames.c
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@redhat.com>2015-09-30 17:43:26 +0000
committerJeff Law <law@gcc.gnu.org>2015-09-30 11:43:26 -0600
commitdc0ccbb3a3e60f0423ac69d82f6cb78ff9b10800 (patch)
tree9dece98ef18534e0b8a0d3a25a64b43857c34914 /gcc/tree-ssanames.c
parent0fe78d19df60f6131586feb556c1e92bb3c03961 (diff)
downloadgcc-dc0ccbb3a3e60f0423ac69d82f6cb78ff9b10800.zip
gcc-dc0ccbb3a3e60f0423ac69d82f6cb78ff9b10800.tar.gz
gcc-dc0ccbb3a3e60f0423ac69d82f6cb78ff9b10800.tar.bz2
[PATCH] Update SSA_NAME manager to use two lists
* gimple-ssa.h (gimple_df): Add free_ssanames_queue field. * passes.c: Include tree-ssanames.h. (execute_function_todo): Flush the pending free SSA_NAMEs after eliminating unreachable basic blocks. * tree-ssanames.c (FREE_SSANAMES_QUEUE): new. (init_ssanames): Initialize FREE_SSANAMES_QUEUE. (fini_ssanames): Finalize FREE_SSANAMES_QUEUE. (flush_ssanames_freelist): New function. (release_ssaname_fn): Put released names on the queue. (pass_release_ssa_names::execute): Call flush_ssanames_freelist. * tree-ssanames.h (flush_ssanames_freelist): Declare. From-SVN: r228302
Diffstat (limited to 'gcc/tree-ssanames.c')
-rw-r--r--gcc/tree-ssanames.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/gcc/tree-ssanames.c b/gcc/tree-ssanames.c
index 7235dc3..64e2379 100644
--- a/gcc/tree-ssanames.c
+++ b/gcc/tree-ssanames.c
@@ -70,6 +70,7 @@ unsigned int ssa_name_nodes_reused;
unsigned int ssa_name_nodes_created;
#define FREE_SSANAMES(fun) (fun)->gimple_df->free_ssanames
+#define FREE_SSANAMES_QUEUE(fun) (fun)->gimple_df->free_ssanames_queue
/* Initialize management of SSA_NAMEs to default SIZE. If SIZE is
@@ -92,6 +93,7 @@ init_ssanames (struct function *fn, int size)
least 50 elements reserved in it. */
SSANAMES (fn)->quick_push (NULL_TREE);
FREE_SSANAMES (fn) = NULL;
+ FREE_SSANAMES_QUEUE (fn) = NULL;
fn->gimple_df->ssa_renaming_needed = 0;
fn->gimple_df->rename_vops = 0;
@@ -104,6 +106,7 @@ fini_ssanames (void)
{
vec_free (SSANAMES (cfun));
vec_free (FREE_SSANAMES (cfun));
+ vec_free (FREE_SSANAMES_QUEUE (cfun));
}
/* Dump some simple statistics regarding the re-use of SSA_NAME nodes. */
@@ -115,6 +118,22 @@ ssanames_print_statistics (void)
fprintf (stderr, "SSA_NAME nodes reused: %u\n", ssa_name_nodes_reused);
}
+/* Move all SSA_NAMEs from FREE_SSA_NAMES_QUEUE to FREE_SSA_NAMES.
+
+ We do not, but should have a mode to verify the state of the SSA_NAMEs
+ lists. In particular at this point every name must be in the IL,
+ on the free list or in the queue. Anything else is an error. */
+
+void
+flush_ssaname_freelist (void)
+{
+ while (!vec_safe_is_empty (FREE_SSANAMES_QUEUE (cfun)))
+ {
+ tree t = FREE_SSANAMES_QUEUE (cfun)->pop ();
+ vec_safe_push (FREE_SSANAMES (cfun), t);
+ }
+}
+
/* Return an SSA_NAME node for variable VAR defined in statement STMT
in function FN. STMT may be an empty statement for artificial
references (e.g., default definitions created when a variable is
@@ -349,8 +368,8 @@ release_ssa_name_fn (struct function *fn, tree var)
/* Note this SSA_NAME is now in the first list. */
SSA_NAME_IN_FREE_LIST (var) = 1;
- /* And finally put it on the free list. */
- vec_safe_push (FREE_SSANAMES (fn), var);
+ /* And finally queue it so that it will be put on the free list. */
+ vec_safe_push (FREE_SSANAMES_QUEUE (fn), var);
}
}
@@ -631,6 +650,7 @@ unsigned int
pass_release_ssa_names::execute (function *fun)
{
unsigned i, j;
+ flush_ssaname_freelist ();
int n = vec_safe_length (FREE_SSANAMES (fun));
/* Now release the freelist. */