diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2015-02-17 22:57:53 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2015-02-17 21:57:53 +0000 |
commit | 1ede94c55982638a877e0ecad794cbe7d1a54a20 (patch) | |
tree | e091500afee952a95172cae6c16c788f2e6b15d7 /gcc/ipa-profile.c | |
parent | f05911fb07ef21bd158da44d8618b7be84f11b21 (diff) | |
download | gcc-1ede94c55982638a877e0ecad794cbe7d1a54a20.tar.gz |
ipa-visibility.c (function_and_variable_visibility): Only check locality if node is not already local.
* 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.
From-SVN: r220775
Diffstat (limited to 'gcc/ipa-profile.c')
-rw-r--r-- | gcc/ipa-profile.c | 26 |
1 files changed, 19 insertions, 7 deletions
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) |