Commit a5093353 by Jan Hubicka Committed by Jan Hubicka

omp-low.c (expand_omp_parallel): Set function properties.

	* omp-low.c (expand_omp_parallel): Set function properties.
	* function.h (struct function): Add curr_properties and last_verified.
	* passes.c (register_dump_files): Do not set TODO_set_props for the
	first pass
	(init_optimization_passes): Set it here; reorder initialization so the
	dump files appear in more logical order.
	(last_verified, curr_properties): Kill.
	(do_per_function): New function.
	(execute_function_todo): Break out from ...
	(execute_todo): ... here; handle per-function flags.
	(clear_last_verified, verify_curr_properties,
	update_properties_after_pass): New functions.
	(execute_one_pass): Handle per-function properties.
	(execute_ipa_pass_list): Use do_per_function; sanity check that cfun
	and current_function_decls are cleared out.
	* ipa-cp.c (constant_val_insert): Clear cfun/current_function_decl
	after use.

From-SVN: r119966
parent e5c0ebd9
2006-12-16 Jan Hubicka <jh@suse.cz>
* omp-low.c (expand_omp_parallel): Set function properties.
* function.h (struct function): Add curr_properties and last_verified.
* passes.c (register_dump_files): Do not set TODO_set_props for the
first pass
(init_optimization_passes): Set it here; reorder initialization so the
dump files appear in more logical order.
(last_verified, curr_properties): Kill.
(do_per_function): New function.
(execute_function_todo): Break out from ...
(execute_todo): ... here; handle per-function flags.
(clear_last_verified, verify_curr_properties,
update_properties_after_pass): New functions.
(execute_one_pass): Handle per-function properties.
(execute_ipa_pass_list): Use do_per_function; sanity check that cfun
and current_function_decls are cleared out.
* ipa-cp.c (constant_val_insert): Clear cfun/current_function_decl
after use.
2006-12-16 Manuel Lopez-Ibanez <manu@gcc.gnu.org> 2006-12-16 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR middle-end/7651 PR middle-end/7651
......
...@@ -373,6 +373,10 @@ struct function GTY(()) ...@@ -373,6 +373,10 @@ struct function GTY(())
Used for detecting stack clobbers. */ Used for detecting stack clobbers. */
tree stack_protect_guard; tree stack_protect_guard;
/* Properties used by the pass manager. */
unsigned int curr_properties;
unsigned int last_verified;
/* Collected bit flags. */ /* Collected bit flags. */
/* Nonzero if function being compiled needs to be given an address /* Nonzero if function being compiled needs to be given an address
......
...@@ -453,6 +453,8 @@ constant_val_insert (tree fn, tree parm1, tree val) ...@@ -453,6 +453,8 @@ constant_val_insert (tree fn, tree parm1, tree val)
if (ENTRY_BLOCK_PTR_FOR_FUNCTION (func)->succs) if (ENTRY_BLOCK_PTR_FOR_FUNCTION (func)->succs)
FOR_EACH_EDGE (e_step, ei, ENTRY_BLOCK_PTR_FOR_FUNCTION (func)->succs) FOR_EACH_EDGE (e_step, ei, ENTRY_BLOCK_PTR_FOR_FUNCTION (func)->succs)
bsi_insert_on_edge_immediate (e_step, init_stmt); bsi_insert_on_edge_immediate (e_step, init_stmt);
current_function_decl = NULL;
cfun = NULL;
} }
/* build INTEGER_CST tree with type TREE_TYPE and /* build INTEGER_CST tree with type TREE_TYPE and
......
...@@ -2531,6 +2531,8 @@ expand_omp_parallel (struct omp_region *region) ...@@ -2531,6 +2531,8 @@ expand_omp_parallel (struct omp_region *region)
new_bb = move_sese_region_to_fn (child_cfun, entry_bb, exit_bb); new_bb = move_sese_region_to_fn (child_cfun, entry_bb, exit_bb);
if (exit_bb) if (exit_bb)
single_succ_edge (new_bb)->flags = EDGE_FALLTHRU; single_succ_edge (new_bb)->flags = EDGE_FALLTHRU;
DECL_STRUCT_FUNCTION (child_fn)->curr_properties
= cfun->curr_properties;
cgraph_add_new_function (child_fn); cgraph_add_new_function (child_fn);
/* Convert OMP_RETURN into a RETURN_EXPR. */ /* Convert OMP_RETURN into a RETURN_EXPR. */
......
...@@ -371,7 +371,6 @@ static void ...@@ -371,7 +371,6 @@ static void
register_dump_files (struct tree_opt_pass *pass, bool ipa, int properties) register_dump_files (struct tree_opt_pass *pass, bool ipa, int properties)
{ {
pass->properties_required |= properties; pass->properties_required |= properties;
pass->todo_flags_start |= TODO_set_props;
register_dump_files_1 (pass, ipa, properties); register_dump_files_1 (pass, ipa, properties);
} }
...@@ -695,29 +694,52 @@ init_optimization_passes (void) ...@@ -695,29 +694,52 @@ init_optimization_passes (void)
#undef NEXT_PASS #undef NEXT_PASS
/* Register the passes with the tree dump code. */ /* Register the passes with the tree dump code. */
register_dump_files (all_lowering_passes, false, PROP_gimple_any);
all_lowering_passes->todo_flags_start |= TODO_set_props;
register_dump_files (all_ipa_passes, true, register_dump_files (all_ipa_passes, true,
PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
| PROP_cfg); | PROP_cfg);
register_dump_files (all_lowering_passes, false, PROP_gimple_any);
register_dump_files (all_passes, false, register_dump_files (all_passes, false,
PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
| PROP_cfg); | PROP_cfg);
} }
static unsigned int last_verified; /* If we are in IPA mode (i.e., current_function_decl is NULL), call
static unsigned int curr_properties; function CALLBACK for every function in the call graph. Otherwise,
call CALLBACK on the current function. */
static void static void
execute_todo (unsigned int flags) do_per_function (void (*callback) (void *data), void *data)
{ {
#if defined ENABLE_CHECKING if (current_function_decl)
if (need_ssa_update_p ()) callback (data);
gcc_assert (flags & TODO_update_ssa_any); else
#endif {
struct cgraph_node *node;
for (node = cgraph_nodes; node; node = node->next)
if (node->analyzed)
{
push_cfun (DECL_STRUCT_FUNCTION (node->decl));
current_function_decl = node->decl;
callback (data);
free_dominance_info (CDI_DOMINATORS);
free_dominance_info (CDI_POST_DOMINATORS);
current_function_decl = NULL;
pop_cfun ();
ggc_collect ();
}
}
}
if (curr_properties & PROP_ssa) /* Perform all TODO actions that ought to be done on each function. */
static void
execute_function_todo (void *data)
{
unsigned int flags = (size_t)data;
if (cfun->curr_properties & PROP_ssa)
flags |= TODO_verify_ssa; flags |= TODO_verify_ssa;
flags &= ~last_verified; flags &= ~cfun->last_verified;
if (!flags) if (!flags)
return; return;
...@@ -743,7 +765,7 @@ execute_todo (unsigned int flags) ...@@ -743,7 +765,7 @@ execute_todo (unsigned int flags)
{ {
unsigned update_flags = flags & TODO_update_ssa_any; unsigned update_flags = flags & TODO_update_ssa_any;
update_ssa (update_flags); update_ssa (update_flags);
last_verified &= ~TODO_verify_ssa; cfun->last_verified &= ~TODO_verify_ssa;
} }
if (flags & TODO_remove_unused_locals) if (flags & TODO_remove_unused_locals)
...@@ -752,19 +774,20 @@ execute_todo (unsigned int flags) ...@@ -752,19 +774,20 @@ execute_todo (unsigned int flags)
if ((flags & TODO_dump_func) if ((flags & TODO_dump_func)
&& dump_file && current_function_decl) && dump_file && current_function_decl)
{ {
if (curr_properties & PROP_trees) if (cfun->curr_properties & PROP_trees)
dump_function_to_file (current_function_decl, dump_function_to_file (current_function_decl,
dump_file, dump_flags); dump_file, dump_flags);
else else
{ {
if (dump_flags & TDF_SLIM) if (dump_flags & TDF_SLIM)
print_rtl_slim_with_bb (dump_file, get_insns (), dump_flags); print_rtl_slim_with_bb (dump_file, get_insns (), dump_flags);
else if ((curr_properties & PROP_cfg) && (dump_flags & TDF_BLOCKS)) else if ((cfun->curr_properties & PROP_cfg)
&& (dump_flags & TDF_BLOCKS))
print_rtl_with_bb (dump_file, get_insns ()); print_rtl_with_bb (dump_file, get_insns ());
else else
print_rtl (dump_file, get_insns ()); print_rtl (dump_file, get_insns ());
if (curr_properties & PROP_cfg if (cfun->curr_properties & PROP_cfg
&& graph_dump_format != no_graph && graph_dump_format != no_graph
&& (dump_flags & TDF_GRAPH)) && (dump_flags & TDF_GRAPH))
print_rtl_graph_with_bb (dump_file_name, get_insns ()); print_rtl_graph_with_bb (dump_file_name, get_insns ());
...@@ -774,6 +797,32 @@ execute_todo (unsigned int flags) ...@@ -774,6 +797,32 @@ execute_todo (unsigned int flags)
close the file before aborting. */ close the file before aborting. */
fflush (dump_file); fflush (dump_file);
} }
#if defined ENABLE_CHECKING
if (flags & TODO_verify_ssa)
verify_ssa (true);
if (flags & TODO_verify_flow)
verify_flow_info ();
if (flags & TODO_verify_stmts)
verify_stmts ();
if (flags & TODO_verify_loops)
verify_loop_closed_ssa ();
#endif
cfun->last_verified = flags & TODO_verify_all;
}
/* Perform all TODO actions. */
static void
execute_todo (unsigned int flags)
{
#if defined ENABLE_CHECKING
if (need_ssa_update_p ())
gcc_assert (flags & TODO_update_ssa_any);
#endif
do_per_function (execute_function_todo, (void *)(size_t) flags);
if ((flags & TODO_dump_cgraph) if ((flags & TODO_dump_cgraph)
&& dump_file && !current_function_decl) && dump_file && !current_function_decl)
{ {
...@@ -787,19 +836,34 @@ execute_todo (unsigned int flags) ...@@ -787,19 +836,34 @@ execute_todo (unsigned int flags)
{ {
ggc_collect (); ggc_collect ();
} }
}
#if defined ENABLE_CHECKING /* Clear the last verified flag. */
if (flags & TODO_verify_ssa)
verify_ssa (true); static void
if (flags & TODO_verify_flow) clear_last_verified (void *data ATTRIBUTE_UNUSED)
verify_flow_info (); {
if (flags & TODO_verify_stmts) cfun->last_verified = 0;
verify_stmts (); }
if (flags & TODO_verify_loops)
verify_loop_closed_ssa (); /* Helper function. Verify that the properties has been turn into the
#endif properties expected by the pass. */
static void
verify_curr_properties (void *data)
{
unsigned int props = (size_t)data;
gcc_assert ((cfun->curr_properties & props) == props);
}
last_verified = flags & TODO_verify_all; /* After executing the pass, apply expected changes to the function
properties. */
static void
update_properties_after_pass (void *data)
{
struct tree_opt_pass *pass = data;
cfun->curr_properties = (cfun->curr_properties | pass->properties_provided)
& ~pass->properties_destroyed;
} }
static bool static bool
...@@ -813,17 +877,19 @@ execute_one_pass (struct tree_opt_pass *pass) ...@@ -813,17 +877,19 @@ execute_one_pass (struct tree_opt_pass *pass)
return false; return false;
if (pass->todo_flags_start & TODO_set_props) if (pass->todo_flags_start & TODO_set_props)
curr_properties = pass->properties_required; cfun->curr_properties = pass->properties_required;
/* Note that the folders should only create gimple expressions. /* Note that the folders should only create gimple expressions.
This is a hack until the new folder is ready. */ This is a hack until the new folder is ready. */
in_gimple_form = (curr_properties & PROP_trees) != 0; in_gimple_form = (cfun && (cfun->curr_properties & PROP_trees)) != 0;
/* Run pre-pass verification. */ /* Run pre-pass verification. */
execute_todo (pass->todo_flags_start); execute_todo (pass->todo_flags_start);
gcc_assert ((curr_properties & pass->properties_required) #ifdef ENABLE_CHECKING
== pass->properties_required); do_per_function (verify_curr_properties,
(void *)(size_t)pass->properties_required);
#endif
/* If a dump file name is present, open it if enabled. */ /* If a dump file name is present, open it if enabled. */
if (pass->static_pass_number != -1) if (pass->static_pass_number != -1)
...@@ -856,20 +922,20 @@ execute_one_pass (struct tree_opt_pass *pass) ...@@ -856,20 +922,20 @@ execute_one_pass (struct tree_opt_pass *pass)
if (pass->execute) if (pass->execute)
{ {
todo_after = pass->execute (); todo_after = pass->execute ();
last_verified = 0; do_per_function (clear_last_verified, NULL);
} }
/* Stop timevar. */ /* Stop timevar. */
if (pass->tv_id) if (pass->tv_id)
timevar_pop (pass->tv_id); timevar_pop (pass->tv_id);
curr_properties = (curr_properties | pass->properties_provided) do_per_function (update_properties_after_pass, pass);
& ~pass->properties_destroyed;
if (initializing_dump if (initializing_dump
&& dump_file && dump_file
&& graph_dump_format != no_graph && graph_dump_format != no_graph
&& (curr_properties & (PROP_cfg | PROP_rtl)) == (PROP_cfg | PROP_rtl)) && (cfun->curr_properties & (PROP_cfg | PROP_rtl))
== (PROP_cfg | PROP_rtl))
{ {
get_dump_file_info (pass->static_pass_number)->flags |= TDF_GRAPH; get_dump_file_info (pass->static_pass_number)->flags |= TDF_GRAPH;
dump_flags |= TDF_GRAPH; dump_flags |= TDF_GRAPH;
...@@ -914,22 +980,10 @@ execute_ipa_pass_list (struct tree_opt_pass *pass) ...@@ -914,22 +980,10 @@ execute_ipa_pass_list (struct tree_opt_pass *pass)
{ {
do do
{ {
gcc_assert (!current_function_decl);
gcc_assert (!cfun);
if (execute_one_pass (pass) && pass->sub) if (execute_one_pass (pass) && pass->sub)
{ do_per_function ((void (*)(void *))execute_pass_list, pass->sub);
struct cgraph_node *node;
for (node = cgraph_nodes; node; node = node->next)
if (node->analyzed)
{
push_cfun (DECL_STRUCT_FUNCTION (node->decl));
current_function_decl = node->decl;
execute_pass_list (pass->sub);
free_dominance_info (CDI_DOMINATORS);
free_dominance_info (CDI_POST_DOMINATORS);
current_function_decl = NULL;
pop_cfun ();
ggc_collect ();
}
}
pass = pass->next; pass = pass->next;
} }
while (pass); while (pass);
......
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