Commit cf9712cc by Jan Hubicka Committed by Jan Hubicka

re PR tree-optimization/47234 (ipa-split is executed before profile feedback is read)


	PR tree-optimization/47234 
	* tree-pass.h (TODO_rebuild_cgraph_edges): New TODO.
	(pass_feedback_split_functions): Declare.
	* passes.c (init_optimization_passes): Add ipa-split as subpass of
	tree-profile.
	* ipa-split.c (gate_split_functions): Update comments; disable
	split-functions for profile_arc_flag and branch_probabilities.
	(gate_feedback_split_functions): New function.
	(execute_feedback_split_functions): New function.
	(pass_feedback_split_functions): New global var.

From-SVN: r168632
parent 94cd932c
2011-01-10 Jan Hubicka <jh@suse.cz>
PR tree-optimization/47234
* tree-pass.h (TODO_rebuild_cgraph_edges): New TODO.
(pass_feedback_split_functions): Declare.
* passes.c (init_optimization_passes): Add ipa-split as subpass of
tree-profile.
* ipa-split.c (gate_split_functions): Update comments; disable
split-functions for profile_arc_flag and branch_probabilities.
(gate_feedback_split_functions): New function.
(execute_feedback_split_functions): New function.
(pass_feedback_split_functions): New global var.
2011-01-10 H.J. Lu <hongjiu.lu@intel.com>
PR lto/46760
......
......@@ -1265,7 +1265,9 @@ execute_split_functions (void)
/* See if it makes sense to try to split.
It makes sense to split if we inline, that is if we have direct calls to
handle or direct calls are possibly going to appear as result of indirect
inlining or LTO.
inlining or LTO. Also handle -fprofile-generate as LTO to allow non-LTO
training for LTO -fprofile-use build.
Note that we are not completely conservative about disqualifying functions
called once. It is possible that the caller is called more then once and
then inlining would still benefit. */
......@@ -1336,10 +1338,15 @@ execute_split_functions (void)
return todo;
}
/* Gate function splitting pass. When doing profile feedback, we want
to execute the pass after profiling is read. So disable one in
early optimization. */
static bool
gate_split_functions (void)
{
return flag_partial_inlining;
return (flag_partial_inlining
&& !profile_arc_flag && !flag_branch_probabilities);
}
struct gimple_opt_pass pass_split_functions =
......@@ -1360,3 +1367,44 @@ struct gimple_opt_pass pass_split_functions =
TODO_dump_func /* todo_flags_finish */
}
};
/* Gate feedback driven function splitting pass.
We don't need to split when profiling at all, we are producing
lousy code anyway. */
static bool
gate_feedback_split_functions (void)
{
return (flag_partial_inlining
&& flag_branch_probabilities);
}
/* Execute function splitting pass. */
static unsigned int
execute_feedback_split_functions (void)
{
unsigned int retval = execute_split_functions ();
if (retval)
retval |= TODO_rebuild_cgraph_edges;
return retval;
}
struct gimple_opt_pass pass_feedback_split_functions =
{
{
GIMPLE_PASS,
"feedback_fnsplit", /* name */
gate_feedback_split_functions, /* gate */
execute_feedback_split_functions, /* execute */
NULL, /* sub */
NULL, /* next */
0, /* static_pass_number */
TV_IPA_FNSPLIT, /* tv_id */
PROP_cfg, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
TODO_dump_func /* todo_flags_finish */
}
};
......@@ -785,6 +785,10 @@ init_optimization_passes (void)
NEXT_PASS (pass_inline_parameters);
}
NEXT_PASS (pass_ipa_tree_profile);
{
struct opt_pass **p = &pass_ipa_tree_profile.pass.sub;
NEXT_PASS (pass_feedback_split_functions);
}
NEXT_PASS (pass_ipa_increase_alignment);
NEXT_PASS (pass_ipa_matrix_reorg);
NEXT_PASS (pass_ipa_lower_emutls);
......@@ -1227,6 +1231,9 @@ execute_function_todo (void *data)
if (flags & TODO_rebuild_frequencies)
rebuild_frequencies ();
if (flags & TODO_rebuild_cgraph_edges)
rebuild_cgraph_edges ();
/* If we've seen errors do not bother running any verifiers. */
if (seen_error ())
return;
......
......@@ -312,6 +312,9 @@ struct dump_file_info
/* Rebuild the addressable-vars bitmap and do register promotion. */
#define TODO_update_address_taken (1 << 21)
/* Rebuild the callgraph edges. */
#define TODO_rebuild_cgraph_edges (1 << 22)
/* Internally used in execute_function_todo(). */
#define TODO_update_ssa_any \
(TODO_update_ssa \
......@@ -442,6 +445,7 @@ extern struct gimple_opt_pass pass_local_pure_const;
extern struct gimple_opt_pass pass_tracer;
extern struct gimple_opt_pass pass_warn_unused_result;
extern struct gimple_opt_pass pass_split_functions;
extern struct gimple_opt_pass pass_feedback_split_functions;
/* IPA Passes */
extern struct simple_ipa_opt_pass pass_ipa_lower_emutls;
......
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