ipa-visibility.c (function_and_variable_visibility): Only check locality if node...
authorJan Hubicka <hubicka@ucw.cz>
Tue, 17 Feb 2015 21:57:53 +0000 (22:57 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 17 Feb 2015 21:57:53 +0000 (21:57 +0000)
* 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

gcc/ChangeLog
gcc/cgraph.c
gcc/ipa-inline.c
gcc/ipa-profile.c
gcc/ipa.c

index 5a44fccaf5c2b9ee783152514576d01a8820187f..3cbcc15956399775f003024efa79a4f646d7fb5c 100644 (file)
@@ -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.
index 3548bd0757d1ffba24bf873d2333c1e6a5c13e58..1ad08dc7631edb98de766a22ff52f4260ce83dac 100644 (file)
@@ -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;
 }
 
index 287a6dd1c4f41bf9e674b6e0dc46bd09a42b2157..025f7fc5f6b19733c5c3ba69d1e75a5f230c8aa6 100644 (file)
@@ -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;
index f82f7db1acfe31291d3da43108d013de5fd9aa83..09298778452ddd94a4ff1fd42c5554f950febbee 100644 (file)
@@ -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)
index c14f5992ae0577bd45b1115b406d820358268017..b3752de5e1b9c537a309e5ad43ef27d775d1e729 100644 (file)
--- 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