]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR ipa/63970 (gcc-4_9 inlines less funcs than gcc-4_8 because of used_as...
authorWei Mi <wmi@google.com>
Wed, 21 Jan 2015 21:56:14 +0000 (21:56 +0000)
committerWei Mi <wmi@gcc.gnu.org>
Wed, 21 Jan 2015 21:56:14 +0000 (21:56 +0000)
        Backported from trunk.
        2014-11-22  Jan Hubicka  <hubicka@ucw.cz>

        PR ipa/63970
        * ipa.c (symbol_table::remove_unreachable_nodes): Mark all inline clones
        as having abstract origin used.
        * ipa-inline-transform.c (can_remove_node_now_p_1): Drop abstract origin check.
        (clone_inlined_nodes): Copy abstract originflag.
        * lto-cgraph.c (compute_ltrans_boundary): Use get_create to get abstract origin node.

From-SVN: r219972

gcc/ChangeLog
gcc/ipa-inline-transform.c
gcc/ipa.c
gcc/lto-cgraph.c

index fc0475cfc0ccc1e469f6581817b8c522f085fc6f..bc20f5164e665de880c061797926d3c2a3a713d8 100644 (file)
@@ -1,3 +1,15 @@
+2015-01-21  Wei Mi  <wmi@google.com>
+
+       Backported from trunk.
+       2014-11-22  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/63970
+       * ipa.c (symbol_table::remove_unreachable_nodes): Mark all inline clones
+       as having abstract origin used.
+       * ipa-inline-transform.c (can_remove_node_now_p_1): Drop abstract origin check.
+       (clone_inlined_nodes): Copy abstract originflag.
+       * lto-cgraph.c (compute_ltrans_boundary): Use get_create to get abstract origin node.
+
 2015-01-20  Chung-Lin Tang  <cltang@codesourcery.com>
 
        Backport from mainline
index 6f68631a12ad43f938bc7659a41ac56abb17ca89..a9be22f6572776bfd0fb826af07234732c285a40 100644 (file)
@@ -87,7 +87,6 @@ can_remove_node_now_p_1 (struct cgraph_node *node)
      the callgraph so references can point to it.  */
   return (!node->address_taken
          && !ipa_ref_has_aliases_p (&node->ref_list)
-         && !node->used_as_abstract_origin
          && cgraph_can_remove_if_no_direct_calls_p (node)
          /* Inlining might enable more devirtualizing, so we want to remove
             those only after all devirtualizable virtual calls are processed.
@@ -185,6 +184,7 @@ clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
          n = cgraph_clone_node (e->callee, e->callee->decl,
                                 e->count, freq_scale, update_original,
                                 vNULL, true, inlining_into, NULL);
+         n->used_as_abstract_origin = e->callee->used_as_abstract_origin;
          cgraph_redirect_edge_callee (e, n);
        }
     }
index ebaa82dbfe4182ee56e766bc4d0cbb3d0dcb9cc6..c6f5da7edb0eb54a51608aebb417a329747030c7 100644 (file)
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -364,9 +364,18 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
              && DECL_ABSTRACT_ORIGIN (node->decl))
            {
              struct cgraph_node *origin_node
-             = cgraph_get_create_node (DECL_ABSTRACT_ORIGIN (node->decl));
-             origin_node->used_as_abstract_origin = true;
-             enqueue_node (origin_node, &first, reachable);
+             = cgraph_get_node (DECL_ABSTRACT_ORIGIN (node->decl));
+             if (origin_node && !origin_node->used_as_abstract_origin)
+               {
+                 origin_node->used_as_abstract_origin = true;
+                 gcc_assert (!origin_node->prev_sibling_clone);
+                 gcc_assert (!origin_node->next_sibling_clone);
+                 for (cgraph_node *n = origin_node->clones; n;
+                      n = n->next_sibling_clone)
+                   if (n->decl == DECL_ABSTRACT_ORIGIN (node->decl))
+                     n->used_as_abstract_origin = true;
+                 enqueue_node (origin_node, &first, reachable);
+               }
            }
          /* If any symbol in a comdat group is reachable, force
             all externally visible symbols in the same comdat
index 173067f65cf34124b716dcfedb863264d33c7813..9e6915f39cf1158d66bcef70c1c2d1442f92a1c1 100644 (file)
@@ -793,7 +793,8 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder)
       if (DECL_ABSTRACT_ORIGIN (node->decl))
        {
          struct cgraph_node *origin_node
-         = cgraph_get_node (DECL_ABSTRACT_ORIGIN (node->decl));
+         = cgraph_get_create_node (DECL_ABSTRACT_ORIGIN (node->decl));
+         origin_node->used_as_abstract_origin = true;
          add_node_to (encoder, origin_node, true);
        }
     }