aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa-fnsummary.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2019-11-21 09:03:01 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2019-11-21 08:03:01 +0000
commitd2bcf46cd03bcc3ebdd9102e53022b6fb03202f7 (patch)
tree92ffeae1886e53d112d01b1c55ba6c8ba4cdfcc7 /gcc/ipa-fnsummary.c
parentb4b7464b57190287cb1bfc5eb56f63148a508f0c (diff)
downloadgcc-d2bcf46cd03bcc3ebdd9102e53022b6fb03202f7.zip
gcc-d2bcf46cd03bcc3ebdd9102e53022b6fb03202f7.tar.gz
gcc-d2bcf46cd03bcc3ebdd9102e53022b6fb03202f7.tar.bz2
Incremental updating of inline summaries.
* ipa-fnsummary.c (ipa_fn_summary::account_size_time): Allow negative time in calls summary; correct roundoff errors leading to negative times. (ipa_merge_fn_summary_after_inlining): Update calls size time table if present. (ipa_update_overall_fn_summary): Add RESET parameter. * ipa-fnsummary.h (ipa_update_overall_fn_summary): Update prototype. * ipa-inline-transform.c (inline_call): Enable incremental updates. From-SVN: r278541
Diffstat (limited to 'gcc/ipa-fnsummary.c')
-rw-r--r--gcc/ipa-fnsummary.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/gcc/ipa-fnsummary.c b/gcc/ipa-fnsummary.c
index 0652207..d0bbe71 100644
--- a/gcc/ipa-fnsummary.c
+++ b/gcc/ipa-fnsummary.c
@@ -176,7 +176,8 @@ ipa_fn_summary::account_size_time (int size, sreal time,
if (!size && time == 0 && table)
return;
- gcc_assert (time >= 0);
+ /* Only for calls we are unaccounting what we previously recoreded. */
+ gcc_checking_assert (time >= 0 || call);
for (i = 0; vec_safe_iterate (table, i, &e); i++)
if (e->exec_predicate == exec_pred
@@ -226,6 +227,10 @@ ipa_fn_summary::account_size_time (int size, sreal time,
{
e->size += size;
e->time += time;
+ gcc_checking_assert (e->time >= -1);
+ /* Tolerate small roundoff issues. */
+ if (e->time < 0)
+ e->time = 0;
}
}
@@ -3897,6 +3902,21 @@ ipa_merge_fn_summary_after_inlining (struct cgraph_edge *edge)
info->estimated_stack_size = peak;
inline_update_callee_summaries (edge->callee, es->loop_depth);
+ if (info->call_size_time_table)
+ {
+ int edge_size = 0;
+ sreal edge_time = 0;
+
+ estimate_edge_size_and_time (edge, &edge_size, NULL, &edge_time, vNULL,
+ vNULL, vNULL, 0);
+ /* Unaccount size and time of the optimized out call. */
+ info->account_size_time (-edge_size, -edge_time,
+ es->predicate ? *es->predicate : true,
+ es->predicate ? *es->predicate : true,
+ true);
+ /* Account new calls. */
+ summarize_calls_size_and_time (edge->callee, info);
+ }
/* Free summaries that are not maintained for inline clones/edges. */
ipa_call_summaries->remove (edge);
@@ -3905,10 +3925,11 @@ ipa_merge_fn_summary_after_inlining (struct cgraph_edge *edge)
}
/* For performance reasons ipa_merge_fn_summary_after_inlining is not updating
- overall size and time. Recompute it. */
+ overall size and time. Recompute it.
+ If RESET is true also recompute call_time_size_table. */
void
-ipa_update_overall_fn_summary (struct cgraph_node *node)
+ipa_update_overall_fn_summary (struct cgraph_node *node, bool reset)
{
class ipa_fn_summary *info = ipa_fn_summaries->get (node);
class ipa_size_summary *size_info = ipa_size_summaries->get (node);
@@ -3923,7 +3944,8 @@ ipa_update_overall_fn_summary (struct cgraph_node *node)
info->time += e->time;
}
info->min_size = (*info->size_time_table)[0].size;
- vec_free (info->call_size_time_table);
+ if (reset)
+ vec_free (info->call_size_time_table);
if (node->callees || node->indirect_calls)
estimate_calls_size_and_time (node, &size_info->size, &info->min_size,
&info->time, NULL,