Commit dc0ccbb3 by Bernd Schmidt Committed by Jeff Law

[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
parent 0fe78d19
2015-09-30 Bernd Schmidt <bernds@redhat.com>
* 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.
2015-09-30 Thomas Schwinge <thomas@codesourcery.com> 2015-09-30 Thomas Schwinge <thomas@codesourcery.com>
* config/i386/intelmic-mkoffload.c (main): Parse "-v" flag. * config/i386/intelmic-mkoffload.c (main): Parse "-v" flag.
...@@ -90,6 +90,9 @@ struct GTY(()) gimple_df { ...@@ -90,6 +90,9 @@ struct GTY(()) gimple_df {
/* Free list of SSA_NAMEs. */ /* Free list of SSA_NAMEs. */
vec<tree, va_gc> *free_ssanames; vec<tree, va_gc> *free_ssanames;
/* Queue of SSA_NAMEs to be freed at the next opportunity. */
vec<tree, va_gc> *free_ssanames_queue;
/* Hashtable holding definition for symbol. If this field is not NULL, it /* Hashtable holding definition for symbol. If this field is not NULL, it
means that the first reference to this variable in the function is a means that the first reference to this variable in the function is a
USE or a VUSE. In those cases, the SSA renamer creates an SSA name USE or a VUSE. In those cases, the SSA renamer creates an SSA name
......
...@@ -84,6 +84,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -84,6 +84,7 @@ along with GCC; see the file COPYING3. If not see
#include "cfgrtl.h" #include "cfgrtl.h"
#include "tree-ssa-live.h" /* For remove_unused_locals. */ #include "tree-ssa-live.h" /* For remove_unused_locals. */
#include "tree-cfgcleanup.h" #include "tree-cfgcleanup.h"
#include "tree-ssanames.h"
using namespace gcc; using namespace gcc;
...@@ -1913,6 +1914,14 @@ execute_function_todo (function *fn, void *data) ...@@ -1913,6 +1914,14 @@ execute_function_todo (function *fn, void *data)
{ {
cleanup_tree_cfg (); cleanup_tree_cfg ();
/* Once unreachable nodes have been removed from the CFG,
there can't be any lingering references to released
SSA_NAMES (because there is no more unreachable code).
Thus, now is the time to flush the SSA_NAMEs freelist. */
if (fn->gimple_df)
flush_ssaname_freelist ();
/* When cleanup_tree_cfg merges consecutive blocks, it may /* When cleanup_tree_cfg merges consecutive blocks, it may
perform some simplistic propagation when removing single perform some simplistic propagation when removing single
valued PHI nodes. This propagation may, in turn, cause the valued PHI nodes. This propagation may, in turn, cause the
......
...@@ -70,6 +70,7 @@ unsigned int ssa_name_nodes_reused; ...@@ -70,6 +70,7 @@ unsigned int ssa_name_nodes_reused;
unsigned int ssa_name_nodes_created; unsigned int ssa_name_nodes_created;
#define FREE_SSANAMES(fun) (fun)->gimple_df->free_ssanames #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 /* Initialize management of SSA_NAMEs to default SIZE. If SIZE is
...@@ -92,6 +93,7 @@ init_ssanames (struct function *fn, int size) ...@@ -92,6 +93,7 @@ init_ssanames (struct function *fn, int size)
least 50 elements reserved in it. */ least 50 elements reserved in it. */
SSANAMES (fn)->quick_push (NULL_TREE); SSANAMES (fn)->quick_push (NULL_TREE);
FREE_SSANAMES (fn) = NULL; FREE_SSANAMES (fn) = NULL;
FREE_SSANAMES_QUEUE (fn) = NULL;
fn->gimple_df->ssa_renaming_needed = 0; fn->gimple_df->ssa_renaming_needed = 0;
fn->gimple_df->rename_vops = 0; fn->gimple_df->rename_vops = 0;
...@@ -104,6 +106,7 @@ fini_ssanames (void) ...@@ -104,6 +106,7 @@ fini_ssanames (void)
{ {
vec_free (SSANAMES (cfun)); vec_free (SSANAMES (cfun));
vec_free (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. */ /* Dump some simple statistics regarding the re-use of SSA_NAME nodes. */
...@@ -115,6 +118,22 @@ ssanames_print_statistics (void) ...@@ -115,6 +118,22 @@ ssanames_print_statistics (void)
fprintf (stderr, "SSA_NAME nodes reused: %u\n", ssa_name_nodes_reused); 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 /* Return an SSA_NAME node for variable VAR defined in statement STMT
in function FN. STMT may be an empty statement for artificial in function FN. STMT may be an empty statement for artificial
references (e.g., default definitions created when a variable is references (e.g., default definitions created when a variable is
...@@ -349,8 +368,8 @@ release_ssa_name_fn (struct function *fn, tree var) ...@@ -349,8 +368,8 @@ release_ssa_name_fn (struct function *fn, tree var)
/* Note this SSA_NAME is now in the first list. */ /* Note this SSA_NAME is now in the first list. */
SSA_NAME_IN_FREE_LIST (var) = 1; SSA_NAME_IN_FREE_LIST (var) = 1;
/* And finally put it on the free list. */ /* And finally queue it so that it will be put on the free list. */
vec_safe_push (FREE_SSANAMES (fn), var); vec_safe_push (FREE_SSANAMES_QUEUE (fn), var);
} }
} }
...@@ -631,6 +650,7 @@ unsigned int ...@@ -631,6 +650,7 @@ unsigned int
pass_release_ssa_names::execute (function *fun) pass_release_ssa_names::execute (function *fun)
{ {
unsigned i, j; unsigned i, j;
flush_ssaname_freelist ();
int n = vec_safe_length (FREE_SSANAMES (fun)); int n = vec_safe_length (FREE_SSANAMES (fun));
/* Now release the freelist. */ /* Now release the freelist. */
......
...@@ -98,6 +98,7 @@ extern void reset_flow_sensitive_info (tree); ...@@ -98,6 +98,7 @@ extern void reset_flow_sensitive_info (tree);
extern void reset_flow_sensitive_info_in_bb (basic_block); extern void reset_flow_sensitive_info_in_bb (basic_block);
extern void release_defs (gimple *); extern void release_defs (gimple *);
extern void replace_ssa_name_symbol (tree, tree); extern void replace_ssa_name_symbol (tree, tree);
extern void flush_ssaname_freelist (void);
/* Return an SSA_NAME node for variable VAR defined in statement STMT /* Return an SSA_NAME node for variable VAR defined in statement STMT
......
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