diff options
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/ipa-pure-const.c | 18 | ||||
-rw-r--r-- | gcc/ipa-reference.c | 28 | ||||
-rw-r--r-- | gcc/ipa-utils.c | 6 |
4 files changed, 45 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 435d448..43ec6bf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2011-06-10 Jan Hubicka <jh@suse.cz> + + * ipa-utils.c (searchc): Use cgraph_function_or_thunk_node. + * ipa-pure-const.c (analyze_function): Aliases don't need analysis. + (self_recursive_p): Use cgraph_function_node. + (propagate_pure_const): Likewise. + (propagate_nothrow): Likewise. + * ipa-reference.c (ipa_reference_get_not_read_global): Use + cgraph_function_node. + (propagate_bits): Likewise. + (propagate): Likewise. + 2011-06-10 Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org> Richard Earnshaw <rearnsha@arm.com> diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index 74cf52a..b56e48a 100644 --- a/gcc/ipa-pure-const.c +++ b/gcc/ipa-pure-const.c @@ -735,7 +735,7 @@ analyze_function (struct cgraph_node *fn, bool ipa) flags_from_decl_or_type (fn->decl), cgraph_node_cannot_return (fn)); - if (fn->thunk.thunk_p) + if (fn->thunk.thunk_p || fn->alias) { /* Thunk gets propagated through, so nothing interesting happens. */ gcc_assert (ipa); @@ -1070,14 +1070,16 @@ ignore_edge (struct cgraph_edge *e) return (!e->can_throw_external); } -/* Return true if NODE is self recursive function. */ +/* Return true if NODE is self recursive function. + ??? self recursive and indirectly recursive funcions should + be the same, so this function seems unnecesary. */ static bool self_recursive_p (struct cgraph_node *node) { struct cgraph_edge *e; for (e = node->callees; e; e = e->next_callee) - if (e->callee == node) + if (cgraph_function_node (e->callee, NULL) == node) return true; return false; } @@ -1167,7 +1169,8 @@ propagate_pure_const (void) /* Now walk the edges and merge in callee properties. */ for (e = w->callees; e; e = e->next_callee) { - struct cgraph_node *y = e->callee; + enum availability avail; + struct cgraph_node *y = cgraph_function_node (e->callee, &avail); enum pure_const_state_e edge_state = IPA_CONST; bool edge_looping = false; @@ -1178,7 +1181,7 @@ propagate_pure_const (void) cgraph_node_name (e->callee), e->callee->uid); } - if (cgraph_function_body_availability (y) > AVAIL_OVERWRITABLE) + if (avail > AVAIL_OVERWRITABLE) { funct_state y_l = get_function_state (y); if (dump_file && (dump_flags & TDF_DETAILS)) @@ -1396,9 +1399,10 @@ propagate_nothrow (void) for (e = w->callees; e; e = e->next_callee) { - struct cgraph_node *y = e->callee; + enum availability avail; + struct cgraph_node *y = cgraph_function_node (e->callee, &avail); - if (cgraph_function_body_availability (y) > AVAIL_OVERWRITABLE) + if (avail > AVAIL_OVERWRITABLE) { funct_state y_l = get_function_state (y); diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c index b14d636..7ee52da 100644 --- a/gcc/ipa-reference.c +++ b/gcc/ipa-reference.c @@ -196,7 +196,7 @@ ipa_reference_get_not_read_global (struct cgraph_node *fn) { ipa_reference_optimization_summary_t info; - info = get_reference_optimization_summary (fn); + info = get_reference_optimization_summary (cgraph_function_node (fn, NULL)); if (info) return info->statics_not_read; else if (flags_from_decl_or_type (fn->decl) & ECF_LEAF) @@ -301,16 +301,17 @@ propagate_bits (ipa_reference_global_vars_info_t x_global, struct cgraph_node *x struct cgraph_edge *e; for (e = x->callees; e; e = e->next_callee) { - struct cgraph_node *y = e->callee; enum availability avail; + struct cgraph_node *y = cgraph_function_node (e->callee, &avail); - avail = cgraph_function_body_availability (e->callee); + if (!y) + continue; /* Only look into nodes we can propagate something. */ if (avail > AVAIL_OVERWRITABLE || (avail == AVAIL_OVERWRITABLE - && (flags_from_decl_or_type (e->callee->decl) & ECF_LEAF))) + && (flags_from_decl_or_type (y->decl) & ECF_LEAF))) { - int flags = flags_from_decl_or_type (e->callee->decl); + int flags = flags_from_decl_or_type (y->decl); if (get_reference_vars_info (y)) { ipa_reference_vars_info_t y_info @@ -663,8 +664,12 @@ propagate (void) read_write_all_from_decl (node, &read_all, &write_all); for (e = node->callees; e; e = e->next_callee) - if (cgraph_function_body_availability (e->callee) <= AVAIL_OVERWRITABLE) - read_write_all_from_decl (e->callee, &read_all, &write_all); + { + enum availability avail; + struct cgraph_node *callee = cgraph_function_node (e->callee, &avail); + if (!callee || avail <= AVAIL_OVERWRITABLE) + read_write_all_from_decl (callee, &read_all, &write_all); + } for (ie = node->indirect_calls; ie; ie = ie->next_callee) if (!(ie->indirect_info->ecf_flags & ECF_CONST)) @@ -696,8 +701,13 @@ propagate (void) read_write_all_from_decl (w, &read_all, &write_all); for (e = w->callees; e; e = e->next_callee) - if (cgraph_function_body_availability (e->callee) <= AVAIL_OVERWRITABLE) - read_write_all_from_decl (e->callee, &read_all, &write_all); + { + enum availability avail; + struct cgraph_node *callee = cgraph_function_node (e->callee, &avail); + + if (avail <= AVAIL_OVERWRITABLE) + read_write_all_from_decl (callee, &read_all, &write_all); + } for (ie = w->indirect_calls; ie; ie = ie->next_callee) if (!(ie->indirect_info->ecf_flags & ECF_CONST)) diff --git a/gcc/ipa-utils.c b/gcc/ipa-utils.c index 91fe839..ae20736 100644 --- a/gcc/ipa-utils.c +++ b/gcc/ipa-utils.c @@ -101,10 +101,10 @@ searchc (struct searchc_env* env, struct cgraph_node *v, for (edge = v->callees; edge; edge = edge->next_callee) { struct ipa_dfs_info * w_info; - struct cgraph_node *w = edge->callee; - enum availability avail = cgraph_function_body_availability (w); + enum availability avail; + struct cgraph_node *w = cgraph_function_or_thunk_node (edge->callee, &avail); - if (ignore_edge && ignore_edge (edge)) + if (!w || (ignore_edge && ignore_edge (edge))) continue; if (w->aux |