From 71fb4f92ba50a4faf13468333516bfe24bffddf7 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Fri, 10 Jun 2011 22:06:48 +0200 Subject: [PATCH] cgraph.c (cgraph_set_nothrow_flag_1): Update cgraph after setting the nothrow flag. * cgraph.c (cgraph_set_nothrow_flag_1): Update cgraph after setting the nothrow flag. * ipa-reference.c (propagate): Skip aliases. * ipa-pure-const.c (propagate_pure_const): Skip aliases. (propagate_nothrow): Skip aliases; do not update cgraph. (local_pure_const): Do not update cgraph. * tree-profile.c (tree_profiling): Do fixup_cfg. From-SVN: r174929 --- gcc/ChangeLog | 10 ++++++++++ gcc/cgraph.c | 6 ++++++ gcc/ipa-pure-const.c | 13 ++++++------- gcc/ipa-reference.c | 6 +++++- gcc/tree-profile.c | 5 +++-- 5 files changed, 30 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f15bb2bd5b9..be07c9afd0c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2011-06-10 Jan Hubicka + + * cgraph.c (cgraph_set_nothrow_flag_1): Update cgraph after + setting the nothrow flag. + * ipa-reference.c (propagate): Skip aliases. + * ipa-pure-const.c (propagate_pure_const): Skip aliases. + (propagate_nothrow): Skip aliases; do not update cgraph. + (local_pure_const): Do not update cgraph. + * tree-profile.c (tree_profiling): Do fixup_cfg. + 2011-06-10 Jan Hubicka * ipa.c (cgraph_non_local_node_p_1): Break out from ...; diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 4dffdc4010a..f5fd150baac 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -2681,7 +2681,13 @@ cgraph_make_node_local (struct cgraph_node *node) static bool cgraph_set_nothrow_flag_1 (struct cgraph_node *node, void *data) { + struct cgraph_edge *e; + TREE_NOTHROW (node->decl) = data != NULL; + + if (data != NULL) + for (e = node->callers; e; e = e->next_caller) + e->can_throw_external = false; return false; } diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index b56e48ad6f0..0414273c655 100644 --- a/gcc/ipa-pure-const.c +++ b/gcc/ipa-pure-const.c @@ -1116,6 +1116,9 @@ propagate_pure_const (void) int count = 0; node = order[i]; + if (node->alias) + continue; + if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, "Starting cycle\n"); @@ -1383,6 +1386,9 @@ propagate_nothrow (void) bool can_throw = false; node = order[i]; + if (node->alias) + continue; + /* Find the worst state for any node in the cycle. */ w = node; while (w) @@ -1430,10 +1436,7 @@ propagate_nothrow (void) funct_state w_l = get_function_state (w); if (!can_throw && !TREE_NOTHROW (w->decl)) { - struct cgraph_edge *e; cgraph_set_nothrow_flag (w, true); - for (e = w->callers; e; e = e->next_caller) - e->can_throw_external = false; if (dump_file) fprintf (dump_file, "Function found to be nothrow: %s\n", cgraph_node_name (w)); @@ -1640,11 +1643,7 @@ local_pure_const (void) } if (!l->can_throw && !TREE_NOTHROW (current_function_decl)) { - struct cgraph_edge *e; - cgraph_set_nothrow_flag (node, true); - for (e = node->callers; e; e = e->next_caller) - e->can_throw_external = false; changed = true; if (dump_file) fprintf (dump_file, "Function found to be nothrow: %s\n", diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c index 7ee52dacda1..05024b4989e 100644 --- a/gcc/ipa-reference.c +++ b/gcc/ipa-reference.c @@ -645,6 +645,8 @@ propagate (void) struct ipa_dfs_info * w_info; node = order[i]; + if (node->alias) + continue; node_info = get_reference_vars_info (node); gcc_assert (node_info); @@ -802,6 +804,8 @@ propagate (void) struct ipa_dfs_info * w_info; node = order[i]; + if (node->alias) + continue; node_info = get_reference_vars_info (node); node_g = &node_info->global; node_l = &node_info->local; @@ -885,7 +889,7 @@ propagate (void) ipa_reference_global_vars_info_t node_g; ipa_reference_optimization_summary_t opt; - if (!node->analyzed) + if (!node->analyzed || node->alias) continue; node_info = get_reference_vars_info (node); diff --git a/gcc/tree-profile.c b/gcc/tree-profile.c index ab51e261a56..3bc4d5c532c 100644 --- a/gcc/tree-profile.c +++ b/gcc/tree-profile.c @@ -470,8 +470,7 @@ tree_profiling (void) for (node = cgraph_nodes; node; node = node->next) { if (!node->analyzed - || !gimple_has_body_p (node->decl) - || !(!node->clone_of || node->decl != node->clone_of->decl)) + || !gimple_has_body_p (node->decl)) continue; /* Don't profile functions produced for builtin stuff. */ @@ -485,6 +484,8 @@ tree_profiling (void) /* Re-set global shared temporary variable for edge-counters. */ gcov_type_tmp_var = NULL_TREE; + /* Local pure-const may imply need to fixup the cfg. */ + execute_fixup_cfg (); branch_prob (); if (! flag_branch_probabilities -- 2.30.2