Commit d2bcf46c by Jan Hubicka Committed by Jan Hubicka

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
parent b4b7464b
2019-11-20 Jan Hubicka <jh@suse.cz>
* 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.
2019-11-20 Richard Sandiford <richard.sandiford@arm.com> 2019-11-20 Richard Sandiford <richard.sandiford@arm.com>
* tree-vect-slp.c (vect_schedule_slp_instance): Restore stmt * tree-vect-slp.c (vect_schedule_slp_instance): Restore stmt
...@@ -176,7 +176,8 @@ ipa_fn_summary::account_size_time (int size, sreal time, ...@@ -176,7 +176,8 @@ ipa_fn_summary::account_size_time (int size, sreal time,
if (!size && time == 0 && table) if (!size && time == 0 && table)
return; 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++) for (i = 0; vec_safe_iterate (table, i, &e); i++)
if (e->exec_predicate == exec_pred if (e->exec_predicate == exec_pred
...@@ -226,6 +227,10 @@ ipa_fn_summary::account_size_time (int size, sreal time, ...@@ -226,6 +227,10 @@ ipa_fn_summary::account_size_time (int size, sreal time,
{ {
e->size += size; e->size += size;
e->time += time; 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) ...@@ -3897,6 +3902,21 @@ ipa_merge_fn_summary_after_inlining (struct cgraph_edge *edge)
info->estimated_stack_size = peak; info->estimated_stack_size = peak;
inline_update_callee_summaries (edge->callee, es->loop_depth); 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. */ /* Free summaries that are not maintained for inline clones/edges. */
ipa_call_summaries->remove (edge); ipa_call_summaries->remove (edge);
...@@ -3905,10 +3925,11 @@ ipa_merge_fn_summary_after_inlining (struct cgraph_edge *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 /* 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 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_fn_summary *info = ipa_fn_summaries->get (node);
class ipa_size_summary *size_info = ipa_size_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) ...@@ -3923,7 +3944,8 @@ ipa_update_overall_fn_summary (struct cgraph_node *node)
info->time += e->time; info->time += e->time;
} }
info->min_size = (*info->size_time_table)[0].size; 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) if (node->callees || node->indirect_calls)
estimate_calls_size_and_time (node, &size_info->size, &info->min_size, estimate_calls_size_and_time (node, &size_info->size, &info->min_size,
&info->time, NULL, &info->time, NULL,
......
...@@ -358,7 +358,7 @@ void estimate_ipcp_clone_size_and_time (struct cgraph_node *, ...@@ -358,7 +358,7 @@ void estimate_ipcp_clone_size_and_time (struct cgraph_node *,
int *, sreal *, sreal *, int *, sreal *, sreal *,
ipa_hints *); ipa_hints *);
void ipa_merge_fn_summary_after_inlining (struct cgraph_edge *edge); void ipa_merge_fn_summary_after_inlining (struct cgraph_edge *edge);
void ipa_update_overall_fn_summary (struct cgraph_node *node); void ipa_update_overall_fn_summary (struct cgraph_node *node, bool reset = true);
void compute_fn_summary (struct cgraph_node *, bool); void compute_fn_summary (struct cgraph_node *, bool);
......
...@@ -489,9 +489,9 @@ inline_call (struct cgraph_edge *e, bool update_original, ...@@ -489,9 +489,9 @@ inline_call (struct cgraph_edge *e, bool update_original,
mark_all_inlined_calls_cdtor (e->callee); mark_all_inlined_calls_cdtor (e->callee);
if (opt_for_fn (e->caller->decl, optimize)) if (opt_for_fn (e->caller->decl, optimize))
new_edges_found = ipa_propagate_indirect_call_infos (curr, new_edges); new_edges_found = ipa_propagate_indirect_call_infos (curr, new_edges);
check_speculations (e->callee, new_edges); bool removed_p = check_speculations (e->callee, new_edges);
if (update_overall_summary) if (update_overall_summary)
ipa_update_overall_fn_summary (to); ipa_update_overall_fn_summary (to, new_edges_found || removed_p);
else else
/* Update self size by the estimate so overall function growth limits /* Update self size by the estimate so overall function growth limits
work for further inlining into this function. Before inlining work for further inlining into this function. Before inlining
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment