Thanks for the fix. Is it ok to backport it to gcc-4_9?

Thanks,
Wei.

On Sat, Nov 22, 2014 at 1:08 PM, Jan Hubicka <hubi...@ucw.cz> wrote:
> 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