mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
72d5c6c157
commit
3828719aa9
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
10
gcc/gimple.c
10
gcc/gimple.c
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 ();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 ();
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue