From 7feaa33eb2c44bb9d82707d7dc3a9c1bcf0d3dd5 Mon Sep 17 00:00:00 2001 From: hubicka Date: Tue, 17 Feb 2015 21:57:53 +0000 Subject: [PATCH] * ipa-visibility.c (function_and_variable_visibility): Only check locality if node is not already local. * ipa-inline.c (want_inline_function_to_all_callers_p): Use call_for_symbol_and_aliases instead of call_for_symbol_thunks_and_aliases. (ipa_inline): Likewise. * cgraph.c (cgraph_node::call_for_symbol_thunks_and_aliases): first walk aliases. * ipa.c (symbol_table::remove_unreachable_nodes): Use call_for_symbol_and_aliases. * ipa-profile.c (ipa_propagate_frequency_data): Add function_symbol. (ipa_propagate_frequency_1): Use it; use opt_for_fn (ipa_propagate_frequency): Update. (ipa_profile): Add opt_for_fn gueards. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@220775 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 17 +++++++++++++++++ gcc/cgraph.c | 20 ++++++++++---------- gcc/ipa-inline.c | 12 ++++++------ gcc/ipa-profile.c | 26 +++++++++++++++++++------- gcc/ipa.c | 2 +- 5 files changed, 53 insertions(+), 24 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5a44fccaf5c..3cbcc159563 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,20 @@ +2015-02-17 Jan Hubicka + + * ipa-visibility.c (function_and_variable_visibility): Only + check locality if node is not already local. + * ipa-inline.c (want_inline_function_to_all_callers_p): Use + call_for_symbol_and_aliases instead of + call_for_symbol_thunks_and_aliases. + (ipa_inline): Likewise. + * cgraph.c (cgraph_node::call_for_symbol_thunks_and_aliases): + first walk aliases. + * ipa.c (symbol_table::remove_unreachable_nodes): Use + call_for_symbol_and_aliases. + * ipa-profile.c (ipa_propagate_frequency_data): Add function_symbol. + (ipa_propagate_frequency_1): Use it; use opt_for_fn + (ipa_propagate_frequency): Update. + (ipa_profile): Add opt_for_fn gueards. + 2015-02-17 Oleg Endo * config/sh/sh.opt (mcbranch-force-delay-slot): New option. diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 3548bd0757d..1ad08dc7631 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -2191,6 +2191,16 @@ cgraph_node::call_for_symbol_thunks_and_aliases (bool (*callback) if (callback (this, data)) return true; + FOR_EACH_ALIAS (this, ref) + { + cgraph_node *alias = dyn_cast (ref->referring); + if (include_overwritable + || alias->get_availability () > AVAIL_INTERPOSABLE) + if (alias->call_for_symbol_thunks_and_aliases (callback, data, + include_overwritable, + exclude_virtual_thunks)) + return true; + } for (e = callers; e; e = e->next_caller) if (e->caller->thunk.thunk_p && (include_overwritable @@ -2202,16 +2212,6 @@ cgraph_node::call_for_symbol_thunks_and_aliases (bool (*callback) exclude_virtual_thunks)) return true; - FOR_EACH_ALIAS (this, ref) - { - cgraph_node *alias = dyn_cast (ref->referring); - if (include_overwritable - || alias->get_availability () > AVAIL_INTERPOSABLE) - if (alias->call_for_symbol_thunks_and_aliases (callback, data, - include_overwritable, - exclude_virtual_thunks)) - return true; - } return false; } diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 287a6dd1c4f..025f7fc5f6b 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -975,14 +975,14 @@ want_inline_function_to_all_callers_p (struct cgraph_node *node, bool cold) if (node->global.inlined_to) return false; /* Does it have callers? */ - if (!node->call_for_symbol_thunks_and_aliases (has_caller_p, NULL, true)) + if (!node->call_for_symbol_and_aliases (has_caller_p, NULL, true)) return false; /* Inlining into all callers would increase size? */ if (estimate_growth (node) > 0) return false; /* All inlines must be possible. */ - if (node->call_for_symbol_thunks_and_aliases (check_callers, &has_hot_call, - true)) + if (node->call_for_symbol_and_aliases (check_callers, &has_hot_call, + true)) return false; if (!cold && !has_hot_call) return false; @@ -2359,9 +2359,9 @@ ipa_inline (void) if (want_inline_function_to_all_callers_p (node, cold)) { int num_calls = 0; - node->call_for_symbol_thunks_and_aliases (sum_callers, &num_calls, - true); - while (node->call_for_symbol_thunks_and_aliases + node->call_for_symbol_and_aliases (sum_callers, &num_calls, + true); + while (node->call_for_symbol_and_aliases (inline_to_all_callers, &num_calls, true)) ; remove_functions = true; diff --git a/gcc/ipa-profile.c b/gcc/ipa-profile.c index f82f7db1acf..09298778452 100644 --- a/gcc/ipa-profile.c +++ b/gcc/ipa-profile.c @@ -322,6 +322,7 @@ ipa_profile_read_summary (void) struct ipa_propagate_frequency_data { + cgraph_node *function_symbol; bool maybe_unlikely_executed; bool maybe_executed_once; bool only_called_at_startup; @@ -342,7 +343,7 @@ ipa_propagate_frequency_1 (struct cgraph_node *node, void *data) || d->only_called_at_startup || d->only_called_at_exit); edge = edge->next_caller) { - if (edge->caller != node) + if (edge->caller != d->function_symbol) { d->only_called_at_startup &= edge->caller->only_called_at_startup; /* It makes sense to put main() together with the static constructors. @@ -358,7 +359,11 @@ ipa_propagate_frequency_1 (struct cgraph_node *node, void *data) errors can make us to push function into unlikely section even when it is executed by the train run. Transfer the function only if all callers are unlikely executed. */ - if (profile_info && flag_branch_probabilities + if (profile_info + && opt_for_fn (d->function_symbol->decl, flag_branch_probabilities) + /* Thunks are not profiled. This is more or less implementation + bug. */ + && !d->function_symbol->thunk.thunk_p && (edge->caller->frequency != NODE_FREQUENCY_UNLIKELY_EXECUTED || (edge->caller->global.inlined_to && edge->caller->global.inlined_to->frequency @@ -418,7 +423,7 @@ contains_hot_call_p (struct cgraph_node *node) bool ipa_propagate_frequency (struct cgraph_node *node) { - struct ipa_propagate_frequency_data d = {true, true, true, true}; + struct ipa_propagate_frequency_data d = {node, true, true, true, true}; bool changed = false; /* We can not propagate anything useful about externally visible functions @@ -432,8 +437,8 @@ ipa_propagate_frequency (struct cgraph_node *node) if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, "Processing frequency %s\n", node->name ()); - node->call_for_symbol_thunks_and_aliases (ipa_propagate_frequency_1, &d, - true); + node->call_for_symbol_and_aliases (ipa_propagate_frequency_1, &d, + true); if ((d.only_called_at_startup && !d.only_called_at_exit) && !node->only_called_at_startup) @@ -597,6 +602,9 @@ ipa_profile (void) { bool update = false; + if (!opt_for_fn (n->decl, flag_ipa_profile)) + continue; + for (e = n->indirect_calls; e; e = e->next_callee) { if (n->count) @@ -697,7 +705,9 @@ ipa_profile (void) order_pos = ipa_reverse_postorder (order); for (i = order_pos - 1; i >= 0; i--) { - if (order[i]->local.local && ipa_propagate_frequency (order[i])) + if (order[i]->local.local + && opt_for_fn (order[i]->decl, flag_ipa_profile) + && ipa_propagate_frequency (order[i])) { for (e = order[i]->callees; e; e = e->next_callee) if (e->callee->local.local && !e->callee->aux) @@ -714,7 +724,9 @@ ipa_profile (void) something_changed = false; for (i = order_pos - 1; i >= 0; i--) { - if (order[i]->aux && ipa_propagate_frequency (order[i])) + if (order[i]->aux + && opt_for_fn (order[i]->decl, flag_ipa_profile) + && ipa_propagate_frequency (order[i])) { for (e = order[i]->callees; e; e = e->next_callee) if (e->callee->local.local && !e->callee->aux) diff --git a/gcc/ipa.c b/gcc/ipa.c index c14f5992ae0..b3752de5e1b 100644 --- a/gcc/ipa.c +++ b/gcc/ipa.c @@ -661,7 +661,7 @@ symbol_table::remove_unreachable_nodes (FILE *file) if (node->address_taken && !node->used_from_other_partition) { - if (!node->call_for_symbol_thunks_and_aliases + if (!node->call_for_symbol_and_aliases (has_addr_references_p, NULL, true) && (!node->instrumentation_clone || !node->instrumented_version -- 2.11.4.GIT