From 7dae51e588536d3fb59330dbb443adf2f52ce32b Mon Sep 17 00:00:00 2001 From: Wei Mi Date: Wed, 21 Jan 2015 21:56:14 +0000 Subject: [PATCH] backport: re PR ipa/63970 (gcc-4_9 inlines less funcs than gcc-4_8 because of used_as_abstract_origin flag) Backported from trunk. 2014-11-22 Jan Hubicka 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 | 12 ++++++++++++ gcc/ipa-inline-transform.c | 2 +- gcc/ipa.c | 15 ++++++++++++--- gcc/lto-cgraph.c | 3 ++- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fc0475cfc0cc..bc20f5164e66 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2015-01-21 Wei Mi + + Backported from trunk. + 2014-11-22 Jan Hubicka + + 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 Backport from mainline diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c index 6f68631a12ad..a9be22f65727 100644 --- a/gcc/ipa-inline-transform.c +++ b/gcc/ipa-inline-transform.c @@ -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); } } diff --git a/gcc/ipa.c b/gcc/ipa.c index ebaa82dbfe41..c6f5da7edb0e 100644 --- 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 diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index 173067f65cf3..9e6915f39cf1 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -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); } } -- 2.47.2