diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-02 13:59:28 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-02 13:59:28 +0000 |
commit | 3b9dd281d794c872def99b4e896a581809ebabed (patch) | |
tree | 3499e792fbbbda9ce6fcb3f168248c06c843602c | |
parent | 01ea2dead39efc3e37b5ec47648bc2ce30abbfae (diff) |
* ipa-inline-analysis.c (reset_inline_edge_summary): New function.
(reset_inline_summary): New function.
(compute_inline_parameters, inline_node_removal_hook,
inline_edge_removal_hook): Use it.
(inline_free_summary): Reset holders correctly.
(inline_generate_summary): Free summary before computing it.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@179427 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/ipa-inline-analysis.c | 63 |
2 files changed, 58 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1f00f7ba89e..e556b128530 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2011-10-02 Jan Hubicka <jh@suse.cz> + + * ipa-inline-analysis.c (reset_inline_edge_summary): New function. + (reset_inline_summary): New function. + (compute_inline_parameters, inline_node_removal_hook, + inline_edge_removal_hook): Use it. + (inline_free_summary): Reset holders correctly. + (inline_generate_summary): Free summary before computing it. + 2011-10-02 Paolo Carlini <paolo.carlini@oracle.com> PR preprocessor/36819 diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c index 7f26af58f7e..4e97943eb9c 100644 --- a/gcc/ipa-inline-analysis.c +++ b/gcc/ipa-inline-analysis.c @@ -789,6 +789,44 @@ inline_summary_alloc (void) 10); } +/* We are called multiple time for given function; clear + data from previous run so they are not cumulated. */ + +static void +reset_inline_edge_summary (struct cgraph_edge *e) +{ + struct inline_edge_summary *es = inline_edge_summary (e); + + es->call_stmt_size = es->call_stmt_time =0; + if (es->predicate) + pool_free (edge_predicate_pool, es->predicate); + es->predicate = NULL; + VEC_free (inline_param_summary_t, heap, es->param); +} + +/* We are called multiple time for given function; clear + data from previous run so they are not cumulated. */ + +static void +reset_inline_summary (struct cgraph_node *node) +{ + struct inline_summary *info = inline_summary (node); + struct cgraph_edge *e; + + info->self_size = info->self_time = 0; + info->estimated_stack_size = 0; + info->estimated_self_stack_size = 0; + info->stack_frame_offset = 0; + info->size = 0; + info->time = 0; + VEC_free (condition, gc, info->conds); + VEC_free (size_time_entry,gc, info->entry); + for (e = node->callees; e; e = e->next_callee) + reset_inline_edge_summary (e); + for (e = node->indirect_calls; e; e = e->next_callee) + reset_inline_edge_summary (e); +} + /* Hook that is called by cgraph.c when a node is removed. */ static void @@ -799,11 +837,7 @@ inline_node_removal_hook (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED) <= (unsigned)node->uid) return; info = inline_summary (node); - reset_node_growth_cache (node); - VEC_free (condition, gc, info->conds); - VEC_free (size_time_entry, gc, info->entry); - info->conds = NULL; - info->entry = NULL; + reset_inline_summary (node); memset (info, 0, sizeof (inline_summary_t)); } @@ -1012,13 +1046,7 @@ inline_edge_removal_hook (struct cgraph_edge *edge, void *data ATTRIBUTE_UNUSED) reset_edge_growth_cache (edge); if (edge->uid < (int)VEC_length (inline_edge_summary_t, inline_edge_summary_vec)) - { - edge_set_predicate (edge, NULL); - VEC_free (inline_param_summary_t, heap, - inline_edge_summary (edge)->param); - memset (inline_edge_summary (edge), 0, - sizeof (struct inline_edge_summary)); - } + reset_inline_edge_summary (edge); } @@ -2041,6 +2069,7 @@ compute_inline_parameters (struct cgraph_node *node, bool early) inline_summary_alloc (); info = inline_summary (node); + reset_inline_summary (node); /* FIXME: Thunks are inlinable, but tree-inline don't know how to do that. Once this happen, we will need to more curefully predict call @@ -2827,6 +2856,7 @@ inline_generate_summary (void) cgraph_add_function_insertion_hook (&add_new_function, NULL); ipa_register_cgraph_hooks (); + inline_free_summary (); FOR_EACH_DEFINED_FUNCTION (node) if (!node->alias) @@ -3109,19 +3139,24 @@ inline_write_summary (cgraph_node_set set, void inline_free_summary (void) { + struct cgraph_node *node; + FOR_EACH_DEFINED_FUNCTION (node) + reset_inline_summary (node); if (function_insertion_hook_holder) cgraph_remove_function_insertion_hook (function_insertion_hook_holder); function_insertion_hook_holder = NULL; if (node_removal_hook_holder) cgraph_remove_node_removal_hook (node_removal_hook_holder); + node_removal_hook_holder = NULL; if (edge_removal_hook_holder) cgraph_remove_edge_removal_hook (edge_removal_hook_holder); - node_removal_hook_holder = NULL; + edge_removal_hook_holder = NULL; if (node_duplication_hook_holder) cgraph_remove_node_duplication_hook (node_duplication_hook_holder); + node_duplication_hook_holder = NULL; if (edge_duplication_hook_holder) cgraph_remove_edge_duplication_hook (edge_duplication_hook_holder); - node_duplication_hook_holder = NULL; + edge_duplication_hook_holder = NULL; VEC_free (inline_summary_t, gc, inline_summary_vec); inline_summary_vec = NULL; VEC_free (inline_edge_summary_t, heap, inline_edge_summary_vec); |