diff options
author | Jan Hubicka <jh@suse.cz> | 2011-06-10 14:53:48 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2011-06-10 12:53:48 +0000 |
commit | a6f834c5a87c1ac42f1c842bba34d84740218d77 (patch) | |
tree | 20b67a874a850032963d722eda24d2f5015949f7 /gcc/tree-sra.c | |
parent | 7871eee372692f471507a857b8eac77598fbdb03 (diff) | |
download | gcc-a6f834c5a87c1ac42f1c842bba34d84740218d77.zip gcc-a6f834c5a87c1ac42f1c842bba34d84740218d77.tar.gz gcc-a6f834c5a87c1ac42f1c842bba34d84740218d77.tar.bz2 |
tree-sra.c (all_callers_have_enough_arguments_p): Rename to ...
* 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.
From-SVN: r174904
Diffstat (limited to 'gcc/tree-sra.c')
-rw-r--r-- | gcc/tree-sra.c | 52 |
1 files changed, 29 insertions, 23 deletions
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 47d4471..8ad84be 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -4304,31 +4304,30 @@ sra_ipa_reset_debug_stmts (ipa_parm_adjustment_vec adjustments) } } -/* Return true iff all callers have at least as many actual arguments as there +/* Return false 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) +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 false; + return true; - return true; + return false; } +/* Convert all callers of NODE. */ -/* 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) +static bool +convert_callers_for_node (struct cgraph_node *node, + void *data) { - tree old_cur_fndecl = current_function_decl; - struct cgraph_edge *cs; - basic_block this_block; + 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) { @@ -4352,6 +4351,21 @@ convert_callers (struct cgraph_node *node, tree old_decl, 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) @@ -4388,17 +4402,8 @@ static bool 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); + VEC (cgraph_edge_p, heap) * redirect_callers = collect_callers_of_node (node); rebuild_cgraph_edges (); pop_cfun (); @@ -4503,7 +4508,8 @@ ipa_early_sra (void) goto simple_out; } - if (!all_callers_have_enough_arguments_p (node)) + 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 " |