From a15d5ede1b745b109884a8f94950aefc66836037 Mon Sep 17 00:00:00 2001 From: hubicka Date: Mon, 10 Jan 2011 14:33:04 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@168632 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 13 +++++++++++++ gcc/ipa-split.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- gcc/passes.c | 7 +++++++ gcc/tree-pass.h | 4 ++++ 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a07601f8dd8..4eff7926d8c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2011-01-10 Jan Hubicka + + 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 PR lto/46760 diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c index fabd6d11bd9..4fcbfe940ba 100644 --- a/gcc/ipa-split.c +++ b/gcc/ipa-split.c @@ -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 */ + } +}; diff --git a/gcc/passes.c b/gcc/passes.c index 4be61a9455e..804ac9f2a60 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -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; diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h index a87a7706f77..32d8f40470c 100644 --- a/gcc/tree-pass.h +++ b/gcc/tree-pass.h @@ -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; -- 2.11.0