Commit b5351388 by Jan Hubicka Committed by Jan Hubicka

Manually CSE sreal frequency calculations

	* ipa-inline.c (compute_uninlined_call_time,
	compute_inlined_call_time): Take edge frequency as
	parameter rather than computing it by itself.
	(big_speedup_p, edge_badness): Manually CSE sreal
	frequency calculations.

From-SVN: r278023
parent 65eaab18
2019-11-10 Jan Hubicka <hubicka@ucw.cz> 2019-11-10 Jan Hubicka <hubicka@ucw.cz>
* ipa-inline.c (compute_uninlined_call_time,
compute_inlined_call_time): Take edge frequency as
parameter rather than computing it by itself.
(big_speedup_p, edge_badness): Manually CSE sreal
frequency calculations.
2019-11-10 Jan Hubicka <hubicka@ucw.cz>
* profile-count.c (profile_count::to_sreal_scale): Short circuit * profile-count.c (profile_count::to_sreal_scale): Short circuit
case where profiles are same. case where profiles are same.
...@@ -735,13 +735,13 @@ want_early_inline_function_p (struct cgraph_edge *e) ...@@ -735,13 +735,13 @@ want_early_inline_function_p (struct cgraph_edge *e)
inline sreal inline sreal
compute_uninlined_call_time (struct cgraph_edge *edge, compute_uninlined_call_time (struct cgraph_edge *edge,
sreal uninlined_call_time) sreal uninlined_call_time,
sreal freq)
{ {
cgraph_node *caller = (edge->caller->inlined_to cgraph_node *caller = (edge->caller->inlined_to
? edge->caller->inlined_to ? edge->caller->inlined_to
: edge->caller); : edge->caller);
sreal freq = edge->sreal_frequency ();
if (freq > 0) if (freq > 0)
uninlined_call_time *= freq; uninlined_call_time *= freq;
else else
...@@ -756,14 +756,14 @@ compute_uninlined_call_time (struct cgraph_edge *edge, ...@@ -756,14 +756,14 @@ compute_uninlined_call_time (struct cgraph_edge *edge,
inline sreal inline sreal
compute_inlined_call_time (struct cgraph_edge *edge, compute_inlined_call_time (struct cgraph_edge *edge,
sreal time) sreal time,
sreal freq)
{ {
cgraph_node *caller = (edge->caller->inlined_to cgraph_node *caller = (edge->caller->inlined_to
? edge->caller->inlined_to ? edge->caller->inlined_to
: edge->caller); : edge->caller);
sreal caller_time = ipa_fn_summaries->get (caller)->time; sreal caller_time = ipa_fn_summaries->get (caller)->time;
sreal freq = edge->sreal_frequency ();
if (freq > 0) if (freq > 0)
time *= freq; time *= freq;
else else
...@@ -787,8 +787,9 @@ big_speedup_p (struct cgraph_edge *e) ...@@ -787,8 +787,9 @@ big_speedup_p (struct cgraph_edge *e)
{ {
sreal unspec_time; sreal unspec_time;
sreal spec_time = estimate_edge_time (e, &unspec_time); sreal spec_time = estimate_edge_time (e, &unspec_time);
sreal time = compute_uninlined_call_time (e, unspec_time); sreal freq = e->sreal_frequency ();
sreal inlined_time = compute_inlined_call_time (e, spec_time); sreal time = compute_uninlined_call_time (e, unspec_time, freq);
sreal inlined_time = compute_inlined_call_time (e, spec_time, freq);
cgraph_node *caller = (e->caller->inlined_to cgraph_node *caller = (e->caller->inlined_to
? e->caller->inlined_to ? e->caller->inlined_to
: e->caller); : e->caller);
...@@ -1164,9 +1165,10 @@ edge_badness (struct cgraph_edge *edge, bool dump) ...@@ -1164,9 +1165,10 @@ edge_badness (struct cgraph_edge *edge, bool dump)
{ {
sreal numerator, denominator; sreal numerator, denominator;
int overall_growth; int overall_growth;
sreal inlined_time = compute_inlined_call_time (edge, edge_time); sreal freq = edge->sreal_frequency ();
sreal inlined_time = compute_inlined_call_time (edge, edge_time, freq);
numerator = (compute_uninlined_call_time (edge, unspec_edge_time) numerator = (compute_uninlined_call_time (edge, unspec_edge_time, freq)
- inlined_time); - inlined_time);
if (numerator <= 0) if (numerator <= 0)
numerator = ((sreal) 1 >> 8); numerator = ((sreal) 1 >> 8);
...@@ -1198,14 +1200,14 @@ edge_badness (struct cgraph_edge *edge, bool dump) ...@@ -1198,14 +1200,14 @@ edge_badness (struct cgraph_edge *edge, bool dump)
&& callee_info->single_caller && callee_info->single_caller
&& !edge->caller->inlined_to && !edge->caller->inlined_to
/* ... and edges executed only conditionally ... */ /* ... and edges executed only conditionally ... */
&& edge->sreal_frequency () < 1 && freq < 1
/* ... consider case where callee is not inline but caller is ... */ /* ... consider case where callee is not inline but caller is ... */
&& ((!DECL_DECLARED_INLINE_P (edge->callee->decl) && ((!DECL_DECLARED_INLINE_P (edge->callee->decl)
&& DECL_DECLARED_INLINE_P (caller->decl)) && DECL_DECLARED_INLINE_P (caller->decl))
/* ... or when early optimizers decided to split and edge /* ... or when early optimizers decided to split and edge
frequency still indicates splitting is a win ... */ frequency still indicates splitting is a win ... */
|| (callee->split_part && !caller->split_part || (callee->split_part && !caller->split_part
&& edge->sreal_frequency () * 100 && freq * 100
< PARAM_VALUE < PARAM_VALUE
(PARAM_PARTIAL_INLINING_ENTRY_PROBABILITY) (PARAM_PARTIAL_INLINING_ENTRY_PROBABILITY)
/* ... and do not overwrite user specified hints. */ /* ... and do not overwrite user specified hints. */
...@@ -1256,11 +1258,11 @@ edge_badness (struct cgraph_edge *edge, bool dump) ...@@ -1256,11 +1258,11 @@ edge_badness (struct cgraph_edge *edge, bool dump)
" overall growth %i (current) %i (original)" " overall growth %i (current) %i (original)"
" %i (compensated)\n", " %i (compensated)\n",
badness.to_double (), badness.to_double (),
edge->sreal_frequency ().to_double (), freq.to_double (),
edge->count.ipa ().initialized_p () ? edge->count.ipa ().to_gcov_type () : -1, edge->count.ipa ().initialized_p () ? edge->count.ipa ().to_gcov_type () : -1,
caller->count.ipa ().initialized_p () ? caller->count.ipa ().to_gcov_type () : -1, caller->count.ipa ().initialized_p () ? caller->count.ipa ().to_gcov_type () : -1,
compute_uninlined_call_time (edge, compute_uninlined_call_time (edge,
unspec_edge_time).to_double (), unspec_edge_time, freq).to_double (),
inlined_time.to_double (), inlined_time.to_double (),
estimate_growth (callee), estimate_growth (callee),
callee_info->growth, overall_growth); callee_info->growth, overall_growth);
......
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