aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa-pure-const.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2010-06-09 23:41:06 +0000
committerJan Hubicka <jh@suse.cz>2010-06-09 23:41:06 +0000
commite0893fb33178533db5f8edfd777f91d9b3f3e252 (patch)
treedc3b124226cba504d48163438893d6adc04350ab /gcc/ipa-pure-const.c
parent8fa47845d61a6634ada8534e53c48eda68725824 (diff)
* ipa-pure-const.c (propagate_pure_const, propagate_noreturn):
Break out from ... (propagate) ... here; swap the order. git-svn-id: https://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.c60
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;