From 36a3236111c35a88f06eecf551605a1f32507ab7 Mon Sep 17 00:00:00 2001 From: hubicka Date: Fri, 10 Jun 2011 18:53:35 +0000 Subject: [PATCH] * ipa.c (cgraph_non_local_node_p_1): Break out from ...; (cgraph_local_node_p): ... here; handle aliases. (has_addr_references_p): Break out from ...; (cgraph_remove_unreachable_nodes) ... here. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@174925 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/ipa.c | 49 +++++++++++++++++++++++++++++++++---------------- 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4c204f457de..f15bb2bd5b9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2011-06-10 Jan Hubicka + * ipa.c (cgraph_non_local_node_p_1): Break out from ...; + (cgraph_local_node_p): ... here; handle aliases. + (has_addr_references_p): Break out from ...; + (cgraph_remove_unreachable_nodes) ... here. + +2011-06-10 Jan Hubicka + * opts.c (default_options): Enlist OPT_finline_functions_called_once. * common.opt (flag_inline_functions_called_once):Do not initialize to 1. diff --git a/gcc/ipa.c b/gcc/ipa.c index f40c0aa2efb..7822cfde371 100644 --- a/gcc/ipa.c +++ b/gcc/ipa.c @@ -113,17 +113,43 @@ process_references (struct ipa_ref_list *list, } } + +/* Return true when NODE can not be local. Worker for cgraph_local_node_p. */ + +static bool +cgraph_non_local_node_p_1 (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED) +{ + return !(cgraph_only_called_directly_or_aliased_p (node) + && node->analyzed + && !DECL_EXTERNAL (node->decl) + && !node->local.externally_visible + && !node->reachable_from_other_partition + && !node->in_other_partition); +} + /* Return true when function can be marked local. */ static bool cgraph_local_node_p (struct cgraph_node *node) { - return (cgraph_only_called_directly_p (node) - && node->analyzed - && !DECL_EXTERNAL (node->decl) - && !node->local.externally_visible - && !node->reachable_from_other_partition - && !node->in_other_partition); + return !cgraph_for_node_and_aliases (cgraph_function_or_thunk_node (node, NULL), + cgraph_non_local_node_p_1, NULL, true); + +} + +/* Return true when NODE has ADDR reference. */ + +static bool +has_addr_references_p (struct cgraph_node *node, + void *data ATTRIBUTE_UNUSED) +{ + int i; + struct ipa_ref *ref; + + for (i = 0; ipa_ref_list_refering_iterate (&node->ref_list, i, ref); i++) + if (ref->use == IPA_REF_ADDR) + return true; + return false; } /* Perform reachability analysis and reclaim all unreachable nodes. @@ -417,16 +443,7 @@ cgraph_remove_unreachable_nodes (bool before_inlining_p, FILE *file) if (node->address_taken && !node->reachable_from_other_partition) { - int i; - struct ipa_ref *ref; - bool found = false; - for (i = 0; ipa_ref_list_refering_iterate (&node->ref_list, i, ref) - && !found; i++) - { - gcc_assert (ref->use == IPA_REF_ADDR); - found = true; - } - if (!found) + if (!cgraph_for_node_and_aliases (node, has_addr_references_p, NULL, true)) { if (file) fprintf (file, " %s", cgraph_node_name (node)); -- 2.11.0