From: H.J. Lu Date: Thu, 2 Aug 2012 16:58:33 +0000 (+0000) Subject: Add free inline summary pass after pass_early_local_passes X-Git-Tag: upstream/12.2.0~74962 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a8da72b86c262f75d65665c3803a658d8089a679;p=platform%2Fupstream%2Fgcc.git Add free inline summary pass after pass_early_local_passes PR middle-end/53321 PR middle-end/53865 * ipa-inline-analysis.c (inline_free_summary): Return if inline_edge_summary_vec is NULL. * ipa-split.c (execute_split_functions): Check if a function is inlinable only if inline_edge_summary_vec != NULL. * ipa.c (symtab_remove_unreachable_nodes): Restore cgraph_propagate_frequency call when something was changed. (free_inline_summary): New function. (pass_ipa_free_inline_summary): New pass. * passes.c (init_optimization_passes): Add pass_ipa_free_inline_summary before pass_ipa_tree_profile. * timevar.def (TV_IPA_FREE_INLINE_SUMMARY): New. * tree-pass.h (pass_ipa_free_inline_summary): New. From-SVN: r190090 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 578b0a05485..6839fda90ce 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,25 @@ +2012-08-02 H.J. Lu + + PR middle-end/53321 + PR middle-end/53865 + * ipa-inline-analysis.c (inline_free_summary): Return if + inline_edge_summary_vec is NULL. + + * ipa-split.c (execute_split_functions): Check if a function + is inlinable only if inline_edge_summary_vec != NULL. + + * ipa.c (symtab_remove_unreachable_nodes): Restore + cgraph_propagate_frequency call when something was changed. + (free_inline_summary): New function. + (pass_ipa_free_inline_summary): New pass. + + * passes.c (init_optimization_passes): Add + pass_ipa_free_inline_summary before pass_ipa_tree_profile. + + * timevar.def (TV_IPA_FREE_INLINE_SUMMARY): New. + + * tree-pass.h (pass_ipa_free_inline_summary): New. + 2012-08-02 Richard Earnshaw * arm.c (arm_gen_constant): Use UBFX for some AND operations when diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c index ae321318f14..970be1ebca2 100644 --- a/gcc/ipa-inline-analysis.c +++ b/gcc/ipa-inline-analysis.c @@ -3242,6 +3242,8 @@ void inline_free_summary (void) { struct cgraph_node *node; + if (inline_edge_summary_vec == NULL) + return; FOR_EACH_DEFINED_FUNCTION (node) reset_inline_summary (node); if (function_insertion_hook_holder) diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c index d6aad8977e9..7155f9965a7 100644 --- a/gcc/ipa-split.c +++ b/gcc/ipa-split.c @@ -1397,7 +1397,7 @@ execute_split_functions (void) } /* This can be relaxed; function might become inlinable after splitting away the uninlinable part. */ - if (!inline_summary (node)->inlinable) + if (inline_edge_summary_vec && !inline_summary (node)->inlinable) { if (dump_file) fprintf (dump_file, "Not splitting: not inlinable.\n"); diff --git a/gcc/ipa.c b/gcc/ipa.c index 9329d9b2375..e2705918077 100644 --- a/gcc/ipa.c +++ b/gcc/ipa.c @@ -448,6 +448,11 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file) verify_symtab (); #endif + /* If we removed something, perhaps profile could be improved. */ + if (changed && optimize && inline_edge_summary_vec) + FOR_EACH_DEFINED_FUNCTION (node) + cgraph_propagate_frequency (node); + return changed; } @@ -960,6 +965,34 @@ struct simple_ipa_opt_pass pass_ipa_function_and_variable_visibility = } }; +/* Free inline summary. */ + +static unsigned +free_inline_summary (void) +{ + inline_free_summary (); + return 0; +} + +struct simple_ipa_opt_pass pass_ipa_free_inline_summary = +{ + { + SIMPLE_IPA_PASS, + "*free_inline_summary", /* name */ + NULL, /* gate */ + free_inline_summary, /* execute */ + NULL, /* sub */ + NULL, /* next */ + 0, /* static_pass_number */ + TV_IPA_FREE_INLINE_SUMMARY, /* tv_id */ + 0, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_ggc_collect /* todo_flags_finish */ + } +}; + /* Do not re-run on ltrans stage. */ static bool diff --git a/gcc/passes.c b/gcc/passes.c index 877a768515a..31e1f25a67d 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -1323,6 +1323,7 @@ init_optimization_passes (void) NEXT_PASS (pass_rebuild_cgraph_edges); NEXT_PASS (pass_inline_parameters); } + NEXT_PASS (pass_ipa_free_inline_summary); NEXT_PASS (pass_ipa_tree_profile); { struct opt_pass **p = &pass_ipa_tree_profile.pass.sub; diff --git a/gcc/timevar.def b/gcc/timevar.def index 18d419daa47..8fa1a2bf4aa 100644 --- a/gcc/timevar.def +++ b/gcc/timevar.def @@ -89,6 +89,7 @@ DEFTIMEVAR (TV_IPA_PURE_CONST , "ipa pure const") DEFTIMEVAR (TV_IPA_PTA , "ipa points-to") DEFTIMEVAR (TV_IPA_SRA , "ipa SRA") DEFTIMEVAR (TV_IPA_FREE_LANG_DATA , "ipa free lang data") +DEFTIMEVAR (TV_IPA_FREE_INLINE_SUMMARY, "ipa free inline summary") /* Time spent by constructing CFG. */ DEFTIMEVAR (TV_CFG , "cfg construction") /* Time spent by cleaning up CFG. */ diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h index 80ff51302ed..4be92f491af 100644 --- a/gcc/tree-pass.h +++ b/gcc/tree-pass.h @@ -375,6 +375,7 @@ extern struct simple_ipa_opt_pass pass_ipa_increase_alignment; extern struct simple_ipa_opt_pass pass_ipa_matrix_reorg; extern struct ipa_opt_pass_d pass_ipa_inline; extern struct simple_ipa_opt_pass pass_ipa_free_lang_data; +extern struct simple_ipa_opt_pass pass_ipa_free_inline_summary; extern struct ipa_opt_pass_d pass_ipa_cp; extern struct ipa_opt_pass_d pass_ipa_reference; extern struct ipa_opt_pass_d pass_ipa_pure_const;