From c0240443c240ca2f9755764a8aa74def28f45765 Mon Sep 17 00:00:00 2001 From: hubicka Date: Wed, 9 Jun 2010 23:41:06 +0000 Subject: * ipa-pure-const.c (propagate_pure_const, propagate_noreturn): Break out from ... (propagate) ... here; swap the order. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@160517 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/ipa-pure-const.c | 60 ++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 53 insertions(+), 13 deletions(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8e596375752..0e9a91b6f1b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-06-09 Jan Hubicka + + * ipa-pure-const.c (propagate_pure_const, propagate_noreturn): + Break out from ... + (propagate) ... here; swap the order. + 2010-06-09 Jan Hubicka * bitmap.c (bitmap_elt_insert_after, bitmap_first_set_bit, diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index 9055a66e94a..766c8fc6456 100644 --- a/gcc/ipa-pure-const.c +++ b/gcc/ipa-pure-const.c @@ -1021,14 +1021,11 @@ self_recursive_p (struct cgraph_node *node) return false; } +/* Produce transitive closure over the callgraph and compute pure/const + attributes. */ -/* Produce the global information by preforming a transitive closure - on the local information that was produced by generate_summary. - Note that there is no function_transform pass since this only - updates the function_decl. */ - -static unsigned int -propagate (void) +static void +propagate_pure_const (void) { struct cgraph_node *node; struct cgraph_node *w; @@ -1038,9 +1035,6 @@ propagate (void) int i; struct ipa_dfs_info * w_info; - cgraph_remove_function_insertion_hook (function_insertion_hook_holder); - cgraph_remove_node_duplication_hook (node_duplication_hook_holder); - cgraph_remove_node_removal_hook (node_removal_hook_holder); order_pos = ipa_utils_reduced_inorder (order, true, false, NULL); if (dump_file) { @@ -1301,12 +1295,31 @@ propagate (void) node->aux = NULL; } } + + free (order); +} + +/* Produce transitive closure over the callgraph and compute nothrow + attributes. */ + +static void +propagate_nothrow (void) +{ + struct cgraph_node *node; + struct cgraph_node *w; + struct cgraph_node **order = + XCNEWVEC (struct cgraph_node *, cgraph_n_nodes); + int order_pos; + int i; + struct ipa_dfs_info * w_info; + order_pos = ipa_utils_reduced_inorder (order, true, false, ignore_edge); if (dump_file) { dump_cgraph (dump_file); ipa_utils_print_order(dump_file, "reduced for nothrow", order, order_pos); } + /* Propagate the local information thru the call graph to produce the global information. All the nodes within a cycle will have the same info so we collapse cycles first. Then we can do the @@ -1387,12 +1400,33 @@ propagate (void) free (node->aux); node->aux = NULL; } - if (cgraph_function_body_availability (node) >= AVAIL_OVERWRITABLE - && has_function_state (node)) - free (get_function_state (node)); } free (order); +} + + +/* Produce the global information by preforming a transitive closure + on the local information that was produced by generate_summary. */ + +static unsigned int +propagate (void) +{ + struct cgraph_node *node; + + cgraph_remove_function_insertion_hook (function_insertion_hook_holder); + cgraph_remove_node_duplication_hook (node_duplication_hook_holder); + cgraph_remove_node_removal_hook (node_removal_hook_holder); + + /* Nothrow makes more function to not lead to return and improve + later analysis. */ + propagate_nothrow (); + propagate_pure_const (); + + /* Cleanup. */ + for (node = cgraph_nodes; node; node = node->next) + if (has_function_state (node)) + free (get_function_state (node)); VEC_free (funct_state, heap, funct_state_vec); finish_state (); return 0; -- cgit v1.2.1