From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 917 invoked by alias); 10 Jun 2011 11:54:44 -0000 Received: (qmail 907 invoked by uid 22791); 10 Jun 2011 11:54:43 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,TW_FN,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 11:54:23 +0000 Received: by nikam.ms.mff.cuni.cz (Postfix, from userid 16202) id AB8A29AC7C3; Fri, 10 Jun 2011 13:54:21 +0200 (CEST) Date: Fri, 10 Jun 2011 12:17:00 -0000 From: Jan Hubicka To: gcc-patches@gcc.gnu.org, mjambor@suse.cz Subject: Cgraph alias reorg 6/14 (ipa-sra update) Message-ID: <20110610115421.GD28776@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/msg00830.txt.bz2 Hi, this patch updates ipa-sra. Again it is quite easy: function now can be local even if they have aliases that are local as well. Consequentely the analysis and transform code needs to be updated to walk the aliases of the function being updated. Bootstrapped/regtested x86_64-linux, will commit it shortly. * tree-sra.c (all_callers_have_enough_arguments_p): Rename to ... (not_all_callers_have_enough_arguments_p): ... this one; turn into worker for cgraph_for_node_and_aliases. (convert_callers_for_node): Break out from ... (convert_callers): ... here. (modify_function): Use collect_callers_of_node. (ipa_early_sra): Use cgraph_for_node_and_aliases. Index: tree-sra.c =================================================================== *** tree-sra.c (revision 174895) --- tree-sra.c (working copy) *************** sra_ipa_reset_debug_stmts (ipa_parm_adju *** 4304,4334 **** } } ! /* Return true iff all callers have at least as many actual arguments as there are formal parameters in the current function. */ static bool ! all_callers_have_enough_arguments_p (struct cgraph_node *node) { struct cgraph_edge *cs; for (cs = node->callers; cs; cs = cs->next_caller) if (!callsite_has_enough_arguments_p (cs->call_stmt)) ! return false; ! return true; } ! /* Convert all callers of NODE to pass parameters as given in ADJUSTMENTS. */ ! ! static void ! convert_callers (struct cgraph_node *node, tree old_decl, ! ipa_parm_adjustment_vec adjustments) { ! tree old_cur_fndecl = current_function_decl; ! struct cgraph_edge *cs; ! basic_block this_block; bitmap recomputed_callers = BITMAP_ALLOC (NULL); for (cs = node->callers; cs; cs = cs->next_caller) { --- 4304,4333 ---- } } ! /* Return false iff all callers have at least as many actual arguments as there are formal parameters in the current function. */ static bool ! not_all_callers_have_enough_arguments_p (struct cgraph_node *node, ! void *data ATTRIBUTE_UNUSED) { struct cgraph_edge *cs; for (cs = node->callers; cs; cs = cs->next_caller) if (!callsite_has_enough_arguments_p (cs->call_stmt)) ! return true; ! return false; } + /* Convert all callers of NODE. */ ! static bool ! convert_callers_for_node (struct cgraph_node *node, ! void *data) { ! ipa_parm_adjustment_vec adjustments = (ipa_parm_adjustment_vec)data; bitmap recomputed_callers = BITMAP_ALLOC (NULL); + struct cgraph_edge *cs; for (cs = node->callers; cs; cs = cs->next_caller) { *************** convert_callers (struct cgraph_node *nod *** 4352,4357 **** --- 4351,4371 ---- compute_inline_parameters (cs->caller, true); BITMAP_FREE (recomputed_callers); + return true; + } + + /* Convert all callers of NODE to pass parameters as given in ADJUSTMENTS. */ + + static void + convert_callers (struct cgraph_node *node, tree old_decl, + ipa_parm_adjustment_vec adjustments) + { + tree old_cur_fndecl = current_function_decl; + basic_block this_block; + + cgraph_for_node_and_aliases (node, convert_callers_for_node, + adjustments, false); + current_function_decl = old_cur_fndecl; if (!encountered_recursive_call) *************** static bool *** 4388,4404 **** modify_function (struct cgraph_node *node, ipa_parm_adjustment_vec adjustments) { struct cgraph_node *new_node; - struct cgraph_edge *cs; bool cfg_changed; ! VEC (cgraph_edge_p, heap) * redirect_callers; ! int node_callers; ! ! node_callers = 0; ! for (cs = node->callers; cs != NULL; cs = cs->next_caller) ! node_callers++; ! redirect_callers = VEC_alloc (cgraph_edge_p, heap, node_callers); ! for (cs = node->callers; cs != NULL; cs = cs->next_caller) ! VEC_quick_push (cgraph_edge_p, redirect_callers, cs); rebuild_cgraph_edges (); pop_cfun (); --- 4402,4409 ---- modify_function (struct cgraph_node *node, ipa_parm_adjustment_vec adjustments) { struct cgraph_node *new_node; bool cfg_changed; ! VEC (cgraph_edge_p, heap) * redirect_callers = collect_callers_of_node (node); rebuild_cgraph_edges (); pop_cfun (); *************** ipa_early_sra (void) *** 4503,4509 **** goto simple_out; } ! if (!all_callers_have_enough_arguments_p (node)) { if (dump_file) fprintf (dump_file, "There are callers with insufficient number of " --- 4508,4515 ---- goto simple_out; } ! if (cgraph_for_node_and_aliases (node, not_all_callers_have_enough_arguments_p, ! NULL, true)) { if (dump_file) fprintf (dump_file, "There are callers with insufficient number of "