aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-sra.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2011-06-10 14:53:48 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2011-06-10 12:53:48 +0000
commita6f834c5a87c1ac42f1c842bba34d84740218d77 (patch)
tree20b67a874a850032963d722eda24d2f5015949f7 /gcc/tree-sra.c
parent7871eee372692f471507a857b8eac77598fbdb03 (diff)
downloadgcc-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.c52
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 "