Hi,
this is patch I commited to mainline

2014-11-22  Jan Hubicka  <hubi...@ucw.cz>

        * 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.
        * ipa-cgraph.c (working): Use get_create to get abstract origin node.
Index: ipa.c
===================================================================
--- ipa.c       (revision 217890)
+++ ipa.c       (working copy)
@@ -360,9 +360,18 @@ symbol_table::remove_unreachable_nodes (
              && DECL_ABSTRACT_ORIGIN (node->decl))
            {
              struct cgraph_node *origin_node
-             = cgraph_node::get_create (DECL_ABSTRACT_ORIGIN (node->decl));
-             origin_node->used_as_abstract_origin = true;
-             enqueue_node (origin_node, &first, &reachable);
+             = cgraph_node::get (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: ipa-inline-transform.c
===================================================================
--- ipa-inline-transform.c      (revision 217890)
+++ ipa-inline-transform.c      (working copy)
@@ -100,7 +100,6 @@ can_remove_node_now_p_1 (struct cgraph_n
      the callgraph so references can point to it.  */
   return (!node->address_taken
          && !node->has_aliases_p ()
-         && !node->used_as_abstract_origin
          && node->can_remove_if_no_direct_calls_p ()
          /* Inlining might enable more devirtualizing, so we want to remove
             those only after all devirtualizable virtual calls are processed.
@@ -218,6 +217,7 @@ clone_inlined_nodes (struct cgraph_edge
                                       update_original, vNULL, true,
                                       inlining_into,
                                       NULL);
+         n->used_as_abstract_origin = e->callee->used_as_abstract_origin;
          e->redirect_callee (n);
        }
     }
Index: lto-cgraph.c
===================================================================
--- lto-cgraph.c        (revision 217890)
+++ lto-cgraph.c        (working copy)
@@ -877,7 +877,8 @@ compute_ltrans_boundary (lto_symtab_enco
       if (DECL_ABSTRACT_ORIGIN (node->decl))
        {
          struct cgraph_node *origin_node
-         = cgraph_node::get (DECL_ABSTRACT_ORIGIN (node->decl));
+         = cgraph_node::get_create (DECL_ABSTRACT_ORIGIN (node->decl));
+         origin_node->used_as_abstract_origin = true;
          add_node_to (encoder, origin_node, true);
        }
     }

Reply via email to