From 4ad08ee83804220dcc7e059e11377f18a2bb00ba Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Sat, 22 Nov 2014 22:08:07 +0100 Subject: [PATCH] ipa.c (symbol_table::remove_unreachable_nodes): Mark all inline clones as having abstract origin used. * 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: r217973 --- gcc/ChangeLog | 8 ++++++++ gcc/ipa-inline-transform.c | 2 +- gcc/ipa.c | 15 ++++++++++++--- gcc/lto-cgraph.c | 3 ++- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6c15bce92f3..7a735d54f4c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2014-11-22 Jan Hubicka + + * 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. + 2014-11-22 Uros Bizjak * params.def (PARAM_MAX_COMPLETELY_PEELED_INSNS): Increase to 200. diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c index 9b806c1bf66..a64e4dd379c 100644 --- a/gcc/ipa-inline-transform.c +++ b/gcc/ipa-inline-transform.c @@ -100,7 +100,6 @@ can_remove_node_now_p_1 (struct cgraph_node *node) 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 *e, bool duplicate, update_original, vNULL, true, inlining_into, NULL); + n->used_as_abstract_origin = e->callee->used_as_abstract_origin; e->redirect_callee (n); } } diff --git a/gcc/ipa.c b/gcc/ipa.c index 54b30aab83c..4f87b75946c 100644 --- a/gcc/ipa.c +++ b/gcc/ipa.c @@ -360,9 +360,18 @@ symbol_table::remove_unreachable_nodes (bool before_inlining_p, FILE *file) && 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 diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index 3ce2367a3bf..d424e145474 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -877,7 +877,8 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder) 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); } } -- 2.30.2