summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog17
-rw-r--r--gcc/cgraph.c20
-rw-r--r--gcc/ipa-inline.c12
-rw-r--r--gcc/ipa-profile.c26
-rw-r--r--gcc/ipa.c2
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 <hubicka@ucw.cz>
+
+ * 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 <olegendo@gcc.gnu.org>
* 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 <cgraph_node *> (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 <cgraph_node *> (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