* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@187772
138bc75d-0d04-0410-961f-
82ee72b054a4
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>
+
* tree-cfg.c (verify_gimple_assign_unary): Fix typo in previous
commit.
gimple_register_cfg_hooks ();
init_empty_tree_cfg ();
init_tree_ssa (cfun);
- init_ssa_operands ();
+ init_ssa_operands (cfun);
cfun->gimple_df->in_ssa_p = true;
DECL_INITIAL (decl) = make_node (BLOCK);
is_gimple_reg (tree t)
{
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))
return false;
int index;
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_LAST);
if (gimple_in_ssa_p (cfun))
{
- push_cfun (child_cfun);
init_tree_ssa (child_cfun);
- init_ssa_operands ();
- cfun->gimple_df->in_ssa_p = true;
- pop_cfun ();
+ init_ssa_operands (child_cfun);
+ child_cfun->gimple_df->in_ssa_p = true;
block = NULL_TREE;
}
else
/* Local functions. */
static void collect_dfa_stats (struct dfa_stats_d *);
-static tree find_vars_r (tree *, int *, void *);
/*---------------------------------------------------------------------------
the function. */
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
referenced vars. */
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
in, add it to the list of variables. */
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.
Ignore them. */
if (gimple_code (stmt) != GIMPLE_PHI)
{
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
{
- 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++)
{
tree arg = gimple_phi_arg_def (stmt, i);
- walk_tree (&arg, find_vars_r, NULL, NULL);
+ walk_tree (&arg, find_vars_r, cfun, NULL);
}
}
}
{
init_tree_ssa (cfun);
cfun->gimple_df->in_ssa_p = true;
- init_ssa_operands ();
+ init_ssa_operands (cfun);
}
pop_cfun ();
}
basic_block bb;
/* Initialize operand data structures. */
- init_ssa_operands ();
+ init_ssa_operands (cfun);
/* Initialize internal data needed by the renamer. */
init_ssa_renamer ();
operand vector for VUSE, then the new vector will also be modified
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. */
representative of all of the virtual operands FUD chain. */
static void
-create_vop_var (void)
+create_vop_var (struct function *fn)
{
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,
get_identifier (".MEM"),
DECL_CONTEXT (global_var) = NULL_TREE;
TREE_THIS_VOLATILE (global_var) = 0;
TREE_ADDRESSABLE (global_var) = 0;
+ VAR_DECL_IS_VIRTUAL_OPERAND (global_var) = 1;
create_var_ann (global_var);
- add_referenced_var (global_var);
- cfun->gimple_df->vop = global_var;
+ add_referenced_var_1 (global_var, fn);
+ fn->gimple_df->vop = global_var;
}
/* These are the sizes of the operand memory buffer in bytes which gets
/* Initialize the operand cache routines. */
void
-init_ssa_operands (void)
+init_ssa_operands (struct function *fn)
{
if (!n_initialized++)
{
bitmap_obstack_initialize (&operands_bitmap_obstack);
}
- gcc_assert (gimple_ssa_operands (cfun)->operand_memory == NULL);
- gimple_ssa_operands (cfun)->operand_memory_index
- = gimple_ssa_operands (cfun)->ssa_operand_mem_size;
- gimple_ssa_operands (cfun)->ops_active = true;
- memset (&clobber_stats, 0, sizeof (clobber_stats));
- gimple_ssa_operands (cfun)->ssa_operand_mem_size = OP_SIZE_INIT;
- create_vop_var ();
+ gcc_assert (gimple_ssa_operands (fn)->operand_memory == NULL);
+ gimple_ssa_operands (fn)->operand_memory_index
+ = gimple_ssa_operands (fn)->ssa_operand_mem_size;
+ gimple_ssa_operands (fn)->ops_active = true;
+ gimple_ssa_operands (fn)->ssa_operand_mem_size = OP_SIZE_INIT;
+ create_vop_var (fn);
}
bitmap_obstack_release (&operands_bitmap_obstack);
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);
- }
}
#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 update_stmt_operands (gimple);
extern void free_stmt_operands (gimple);
TYPE_SATURATING in
all types
+ VAR_DECL_IS_VIRTUAL_OPERAND in
+ VAR_DECL
+
nowarning_flag:
TREE_NO_WARNING in
libraries. */
#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) \
(TREE_CODE (NODE) == VAR_DECL ? &(NODE)->var_decl.ann \
: TREE_CODE (NODE) == PARM_DECL ? &(NODE)->parm_decl.ann \
extern void stack_protect_epilogue (void);
extern void init_dummy_function_start (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 push_struct_function (tree fndecl);
extern void init_function_start (tree);