tree.h (VAR_DECL_IS_VIRTUAL_OPERAND): New.

2012-05-22  Richard Guenther  <rguenther@suse.de>

	* tree.h (VAR_DECL_IS_VIRTUAL_OPERAND): New.
	(init_function_for_compilation): Remove.
	* tree-dfa.c (find_vars_r): Take struct function argument.
	(find_referenced_vars_in): Adjust.
	* tree-ssa-operands.c (clobber_stats): Remove.
	(create_vop_var): Take struct function argument.  Mark
	virtual operand with VAR_DECL_IS_VIRTUAL_OPERAND.
	(init_ssa_operands): Take struct function argument.
	(fini_ssa_operands): Do not dump dead stats.
	* tree-ssa-operands.h (init_ssa_operands): Take struct function
	argument.
	* cgraphunit.c (init_lowered_empty_function): Adjust.
	* lto-streamer-in.c (input_cfg): Likewise.
	* tree-inline.c (initialize_cfun): Likewise.
	* tree-into-ssa.c (rewrite_into_ssa): Likewise.
	* omp-low.c (expand_omp_taskreg): Likewise.  Avoid switching
	cfun.
	* gimple.c (is_gimple_reg): Optimize the SSA_NAME case,
	virtual operands are not registers.

From-SVN: r187772
This commit is contained in:
Richard Guenther 2012-05-22 11:59:41 +00:00 committed by Richard Biener
parent 72d5c6c157
commit 3828719aa9
11 changed files with 66 additions and 74 deletions

View File

@ -1,3 +1,25 @@
2012-05-22 Richard Guenther <rguenther@suse.de>
* tree.h (VAR_DECL_IS_VIRTUAL_OPERAND): New.
(init_function_for_compilation): Remove.
* tree-dfa.c (find_vars_r): Take struct function argument.
(find_referenced_vars_in): Adjust.
* tree-ssa-operands.c (clobber_stats): Remove.
(create_vop_var): Take struct function argument. Mark
virtual operand with VAR_DECL_IS_VIRTUAL_OPERAND.
(init_ssa_operands): Take struct function argument.
(fini_ssa_operands): Do not dump dead stats.
* tree-ssa-operands.h (init_ssa_operands): Take struct function
argument.
* cgraphunit.c (init_lowered_empty_function): Adjust.
* lto-streamer-in.c (input_cfg): Likewise.
* tree-inline.c (initialize_cfun): Likewise.
* tree-into-ssa.c (rewrite_into_ssa): Likewise.
* omp-low.c (expand_omp_taskreg): Likewise. Avoid switching
cfun.
* gimple.c (is_gimple_reg): Optimize the SSA_NAME case,
virtual operands are not registers.
2012-05-22 Richard Guenther <rguenther@suse.de> 2012-05-22 Richard Guenther <rguenther@suse.de>
* tree-cfg.c (verify_gimple_assign_unary): Fix typo in previous * tree-cfg.c (verify_gimple_assign_unary): Fix typo in previous

View File

@ -1211,7 +1211,7 @@ init_lowered_empty_function (tree decl)
gimple_register_cfg_hooks (); gimple_register_cfg_hooks ();
init_empty_tree_cfg (); init_empty_tree_cfg ();
init_tree_ssa (cfun); init_tree_ssa (cfun);
init_ssa_operands (); init_ssa_operands (cfun);
cfun->gimple_df->in_ssa_p = true; cfun->gimple_df->in_ssa_p = true;
DECL_INITIAL (decl) = make_node (BLOCK); DECL_INITIAL (decl) = make_node (BLOCK);

View File

@ -2786,7 +2786,17 @@ bool
is_gimple_reg (tree t) is_gimple_reg (tree t)
{ {
if (TREE_CODE (t) == SSA_NAME) if (TREE_CODE (t) == SSA_NAME)
t = SSA_NAME_VAR (t); {
t = SSA_NAME_VAR (t);
if (TREE_CODE (t) == VAR_DECL
&& VAR_DECL_IS_VIRTUAL_OPERAND (t))
return false;
return true;
}
if (TREE_CODE (t) == VAR_DECL
&& VAR_DECL_IS_VIRTUAL_OPERAND (t))
return false;
if (!is_gimple_variable (t)) if (!is_gimple_variable (t))
return false; return false;

View File

@ -616,7 +616,7 @@ input_cfg (struct lto_input_block *ib, struct function *fn,
int index; int index;
init_empty_tree_cfg_for_function (fn); init_empty_tree_cfg_for_function (fn);
init_ssa_operands (); init_ssa_operands (fn);
profile_status_for_function (fn) = streamer_read_enum (ib, profile_status_d, profile_status_for_function (fn) = streamer_read_enum (ib, profile_status_d,
PROFILE_LAST); PROFILE_LAST);

View File

@ -3543,11 +3543,9 @@ expand_omp_taskreg (struct omp_region *region)
if (gimple_in_ssa_p (cfun)) if (gimple_in_ssa_p (cfun))
{ {
push_cfun (child_cfun);
init_tree_ssa (child_cfun); init_tree_ssa (child_cfun);
init_ssa_operands (); init_ssa_operands (child_cfun);
cfun->gimple_df->in_ssa_p = true; child_cfun->gimple_df->in_ssa_p = true;
pop_cfun ();
block = NULL_TREE; block = NULL_TREE;
} }
else else

View File

@ -62,7 +62,6 @@ struct dfa_stats_d
/* Local functions. */ /* Local functions. */
static void collect_dfa_stats (struct dfa_stats_d *); static void collect_dfa_stats (struct dfa_stats_d *);
static tree find_vars_r (tree *, int *, void *);
/*--------------------------------------------------------------------------- /*---------------------------------------------------------------------------
@ -441,17 +440,19 @@ collect_dfa_stats (struct dfa_stats_d *dfa_stats_p ATTRIBUTE_UNUSED)
the function. */ the function. */
static tree static tree
find_vars_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) find_vars_r (tree *tp, int *walk_subtrees, void *data)
{ {
struct function *fn = (struct function *) data;
/* If we are reading the lto info back in, we need to rescan the /* If we are reading the lto info back in, we need to rescan the
referenced vars. */ referenced vars. */
if (TREE_CODE (*tp) == SSA_NAME) if (TREE_CODE (*tp) == SSA_NAME)
add_referenced_var (SSA_NAME_VAR (*tp)); add_referenced_var_1 (SSA_NAME_VAR (*tp), fn);
/* If T is a regular variable that the optimizers are interested /* If T is a regular variable that the optimizers are interested
in, add it to the list of variables. */ in, add it to the list of variables. */
else if (SSA_VAR_P (*tp)) else if (SSA_VAR_P (*tp))
add_referenced_var (*tp); add_referenced_var_1 (*tp, fn);
/* Type, _DECL and constant nodes have no interesting children. /* Type, _DECL and constant nodes have no interesting children.
Ignore them. */ Ignore them. */
@ -471,16 +472,16 @@ find_referenced_vars_in (gimple stmt)
if (gimple_code (stmt) != GIMPLE_PHI) if (gimple_code (stmt) != GIMPLE_PHI)
{ {
for (i = 0; i < gimple_num_ops (stmt); i++) for (i = 0; i < gimple_num_ops (stmt); i++)
walk_tree (gimple_op_ptr (stmt, i), find_vars_r, NULL, NULL); walk_tree (gimple_op_ptr (stmt, i), find_vars_r, cfun, NULL);
} }
else else
{ {
walk_tree (gimple_phi_result_ptr (stmt), find_vars_r, NULL, NULL); walk_tree (gimple_phi_result_ptr (stmt), find_vars_r, cfun, NULL);
for (i = 0; i < gimple_phi_num_args (stmt); i++) for (i = 0; i < gimple_phi_num_args (stmt); i++)
{ {
tree arg = gimple_phi_arg_def (stmt, i); tree arg = gimple_phi_arg_def (stmt, i);
walk_tree (&arg, find_vars_r, NULL, NULL); walk_tree (&arg, find_vars_r, cfun, NULL);
} }
} }
} }

View File

@ -2123,7 +2123,7 @@ initialize_cfun (tree new_fndecl, tree callee_fndecl, gcov_type count)
{ {
init_tree_ssa (cfun); init_tree_ssa (cfun);
cfun->gimple_df->in_ssa_p = true; cfun->gimple_df->in_ssa_p = true;
init_ssa_operands (); init_ssa_operands (cfun);
} }
pop_cfun (); pop_cfun ();
} }

View File

@ -2471,7 +2471,7 @@ rewrite_into_ssa (void)
basic_block bb; basic_block bb;
/* Initialize operand data structures. */ /* Initialize operand data structures. */
init_ssa_operands (); init_ssa_operands (cfun);
/* Initialize internal data needed by the renamer. */ /* Initialize internal data needed by the renamer. */
init_ssa_renamer (); init_ssa_renamer ();

View File

@ -76,34 +76,6 @@ along with GCC; see the file COPYING3. If not see
operand vector for VUSE, then the new vector will also be modified operand vector for VUSE, then the new vector will also be modified
such that it contains 'a_5' rather than 'a'. */ such that it contains 'a_5' rather than 'a'. */
/* Structure storing statistics on how many call clobbers we have, and
how many where avoided. */
static struct
{
/* Number of call-clobbered ops we attempt to add to calls in
add_call_clobbered_mem_symbols. */
unsigned int clobbered_vars;
/* Number of write-clobbers (VDEFs) avoided by using
not_written information. */
unsigned int static_write_clobbers_avoided;
/* Number of reads (VUSEs) avoided by using not_read information. */
unsigned int static_read_clobbers_avoided;
/* Number of write-clobbers avoided because the variable can't escape to
this call. */
unsigned int unescapable_clobbers_avoided;
/* Number of read-only uses we attempt to add to calls in
add_call_read_mem_symbols. */
unsigned int readonly_clobbers;
/* Number of read-only uses we avoid using not_read information. */
unsigned int static_readonly_clobbers_avoided;
} clobber_stats;
/* Flags to describe operand properties in helpers. */ /* Flags to describe operand properties in helpers. */
@ -186,11 +158,11 @@ ssa_operands_active (void)
representative of all of the virtual operands FUD chain. */ representative of all of the virtual operands FUD chain. */
static void static void
create_vop_var (void) create_vop_var (struct function *fn)
{ {
tree global_var; tree global_var;
gcc_assert (cfun->gimple_df->vop == NULL_TREE); gcc_assert (fn->gimple_df->vop == NULL_TREE);
global_var = build_decl (BUILTINS_LOCATION, VAR_DECL, global_var = build_decl (BUILTINS_LOCATION, VAR_DECL,
get_identifier (".MEM"), get_identifier (".MEM"),
@ -203,10 +175,11 @@ create_vop_var (void)
DECL_CONTEXT (global_var) = NULL_TREE; DECL_CONTEXT (global_var) = NULL_TREE;
TREE_THIS_VOLATILE (global_var) = 0; TREE_THIS_VOLATILE (global_var) = 0;
TREE_ADDRESSABLE (global_var) = 0; TREE_ADDRESSABLE (global_var) = 0;
VAR_DECL_IS_VIRTUAL_OPERAND (global_var) = 1;
create_var_ann (global_var); create_var_ann (global_var);
add_referenced_var (global_var); add_referenced_var_1 (global_var, fn);
cfun->gimple_df->vop = global_var; fn->gimple_df->vop = global_var;
} }
/* These are the sizes of the operand memory buffer in bytes which gets /* These are the sizes of the operand memory buffer in bytes which gets
@ -224,7 +197,7 @@ create_vop_var (void)
/* Initialize the operand cache routines. */ /* Initialize the operand cache routines. */
void void
init_ssa_operands (void) init_ssa_operands (struct function *fn)
{ {
if (!n_initialized++) if (!n_initialized++)
{ {
@ -235,13 +208,12 @@ init_ssa_operands (void)
bitmap_obstack_initialize (&operands_bitmap_obstack); bitmap_obstack_initialize (&operands_bitmap_obstack);
} }
gcc_assert (gimple_ssa_operands (cfun)->operand_memory == NULL); gcc_assert (gimple_ssa_operands (fn)->operand_memory == NULL);
gimple_ssa_operands (cfun)->operand_memory_index gimple_ssa_operands (fn)->operand_memory_index
= gimple_ssa_operands (cfun)->ssa_operand_mem_size; = gimple_ssa_operands (fn)->ssa_operand_mem_size;
gimple_ssa_operands (cfun)->ops_active = true; gimple_ssa_operands (fn)->ops_active = true;
memset (&clobber_stats, 0, sizeof (clobber_stats)); gimple_ssa_operands (fn)->ssa_operand_mem_size = OP_SIZE_INIT;
gimple_ssa_operands (cfun)->ssa_operand_mem_size = OP_SIZE_INIT; create_vop_var (fn);
create_vop_var ();
} }
@ -276,22 +248,6 @@ fini_ssa_operands (void)
bitmap_obstack_release (&operands_bitmap_obstack); bitmap_obstack_release (&operands_bitmap_obstack);
cfun->gimple_df->vop = NULL_TREE; cfun->gimple_df->vop = NULL_TREE;
if (dump_file && (dump_flags & TDF_STATS))
{
fprintf (dump_file, "Original clobbered vars: %d\n",
clobber_stats.clobbered_vars);
fprintf (dump_file, "Static write clobbers avoided: %d\n",
clobber_stats.static_write_clobbers_avoided);
fprintf (dump_file, "Static read clobbers avoided: %d\n",
clobber_stats.static_read_clobbers_avoided);
fprintf (dump_file, "Unescapable clobbers avoided: %d\n",
clobber_stats.unescapable_clobbers_avoided);
fprintf (dump_file, "Original read-only clobbers: %d\n",
clobber_stats.readonly_clobbers);
fprintf (dump_file, "Static read-only clobbers avoided: %d\n",
clobber_stats.static_readonly_clobbers_avoided);
}
} }

View File

@ -100,7 +100,7 @@ struct GTY(()) ssa_operands {
#define PHI_ARG_INDEX_FROM_USE(USE) phi_arg_index_from_use (USE) #define PHI_ARG_INDEX_FROM_USE(USE) phi_arg_index_from_use (USE)
extern void init_ssa_operands (void); extern void init_ssa_operands (struct function *fn);
extern void fini_ssa_operands (void); extern void fini_ssa_operands (void);
extern void update_stmt_operands (gimple); extern void update_stmt_operands (gimple);
extern void free_stmt_operands (gimple); extern void free_stmt_operands (gimple);

View File

@ -689,6 +689,9 @@ struct GTY(()) tree_common {
TYPE_SATURATING in TYPE_SATURATING in
all types all types
VAR_DECL_IS_VIRTUAL_OPERAND in
VAR_DECL
nowarning_flag: nowarning_flag:
TREE_NO_WARNING in TREE_NO_WARNING in
@ -3333,6 +3336,9 @@ extern void decl_fini_priority_insert (tree, priority_type);
libraries. */ libraries. */
#define MAX_RESERVED_INIT_PRIORITY 100 #define MAX_RESERVED_INIT_PRIORITY 100
#define VAR_DECL_IS_VIRTUAL_OPERAND(NODE) \
(VAR_DECL_CHECK (NODE)->base.saturating_flag)
#define DECL_VAR_ANN_PTR(NODE) \ #define DECL_VAR_ANN_PTR(NODE) \
(TREE_CODE (NODE) == VAR_DECL ? &(NODE)->var_decl.ann \ (TREE_CODE (NODE) == VAR_DECL ? &(NODE)->var_decl.ann \
: TREE_CODE (NODE) == PARM_DECL ? &(NODE)->parm_decl.ann \ : TREE_CODE (NODE) == PARM_DECL ? &(NODE)->parm_decl.ann \
@ -5537,7 +5543,6 @@ extern void stack_protect_prologue (void);
extern void stack_protect_epilogue (void); extern void stack_protect_epilogue (void);
extern void init_dummy_function_start (void); extern void init_dummy_function_start (void);
extern void expand_dummy_function_end (void); extern void expand_dummy_function_end (void);
extern unsigned int init_function_for_compilation (void);
extern void allocate_struct_function (tree, bool); extern void allocate_struct_function (tree, bool);
extern void push_struct_function (tree fndecl); extern void push_struct_function (tree fndecl);
extern void init_function_start (tree); extern void init_function_start (tree);