diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-06-09 23:41:06 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-06-09 23:41:06 +0000 |
commit | c0240443c240ca2f9755764a8aa74def28f45765 (patch) | |
tree | dc3b124226cba504d48163438893d6adc04350ab /gcc/ipa-pure-const.c | |
parent | d16af188dda6afa9607b451e32d0a7e925b7e64b (diff) | |
download | gcc-c0240443c240ca2f9755764a8aa74def28f45765.tar.gz |
* 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
Diffstat (limited to 'gcc/ipa-pure-const.c')
-rw-r--r-- | gcc/ipa-pure-const.c | 60 |
1 files changed, 47 insertions, 13 deletions
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; |