From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7206 invoked by alias); 10 Jun 2011 18:32:30 -0000 Received: (qmail 7197 invoked by uid 22791); 10 Jun 2011 18:32:29 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL,BAYES_00,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from nikam.ms.mff.cuni.cz (HELO nikam.ms.mff.cuni.cz) (195.113.20.16) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 10 Jun 2011 18:32:16 +0000 Received: by nikam.ms.mff.cuni.cz (Postfix, from userid 16202) id 06F169AC877; Fri, 10 Jun 2011 20:32:15 +0200 (CEST) Date: Fri, 10 Jun 2011 18:39:00 -0000 From: Jan Hubicka To: gcc-patches@gcc.gnu.org Subject: Cgraph alias reorg 12/14 (ipa.c update) Message-ID: <20110610183214.GJ28776@kam.mff.cuni.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-17) Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-06/txt/msg00874.txt.bz2 Hi, the usual update to walk alias nodes, this time for cgraph_local_node_p and logic deicing whether address is taken. Bootstrapped/regtested x86_64-linux, comitted. Honza * ipa.c (cgraph_non_local_node_p_1): Break out from ... (cgraph_local_node_p): ... here. (has_addr_references_p): Break out from ... (cgraph_remove_unreachable_nodes): ... here; Index: ipa.c =================================================================== --- ipa.c (revision 174913) +++ ipa.c (working copy) @@ -113,17 +113,48 @@ process_references (struct ipa_ref_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++) + { + /* FIXME: handle aliases correctly. */ + gcc_assert (ref->use == IPA_REF_ADDR + || ref->use == IPA_REF_ALIAS); + if (ref->use == IPA_REF_ADDR) + return true; + } + return false; } /* Perform reachability analysis and reclaim all unreachable nodes. @@ -417,16 +448,7 @@ cgraph_remove_unreachable_nodes (bool be 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));