diff options
author | Jan Hubicka <jh@suse.cz> | 2011-01-10 15:33:04 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2011-01-10 14:33:04 +0000 |
commit | cf9712ccc092e054e2a48d78c275b709700a0032 (patch) | |
tree | bbc73f1eb46e75ef826904a55147a08ff0e52674 /gcc | |
parent | 94cd932caeac5f720dd5a5f78583a5eaea456c6c (diff) | |
download | gcc-cf9712ccc092e054e2a48d78c275b709700a0032.zip gcc-cf9712ccc092e054e2a48d78c275b709700a0032.tar.gz gcc-cf9712ccc092e054e2a48d78c275b709700a0032.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/ipa-split.c | 52 | ||||
-rw-r--r-- | gcc/passes.c | 7 | ||||
-rw-r--r-- | gcc/tree-pass.h | 4 |
4 files changed, 74 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a07601f..4eff792 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +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 diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c index fabd6d1..4fcbfe9 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 4be61a9..804ac9f 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 a87a770..32d8f40 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; |