diff options
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/ipa-inline.c | 26 |
2 files changed, 22 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d2c7242..02b24d3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 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 case where profiles are same. diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 83764f6..53252e1 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -735,13 +735,13 @@ want_early_inline_function_p (struct cgraph_edge *e) inline sreal 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 ? edge->caller->inlined_to : edge->caller); - sreal freq = edge->sreal_frequency (); if (freq > 0) uninlined_call_time *= freq; else @@ -756,14 +756,14 @@ compute_uninlined_call_time (struct cgraph_edge *edge, inline sreal compute_inlined_call_time (struct cgraph_edge *edge, - sreal time) + sreal time, + sreal freq) { cgraph_node *caller = (edge->caller->inlined_to ? edge->caller->inlined_to : edge->caller); sreal caller_time = ipa_fn_summaries->get (caller)->time; - sreal freq = edge->sreal_frequency (); if (freq > 0) time *= freq; else @@ -787,8 +787,9 @@ big_speedup_p (struct cgraph_edge *e) { sreal unspec_time; sreal spec_time = estimate_edge_time (e, &unspec_time); - sreal time = compute_uninlined_call_time (e, unspec_time); - sreal inlined_time = compute_inlined_call_time (e, spec_time); + sreal freq = e->sreal_frequency (); + 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 ? e->caller->inlined_to : e->caller); @@ -1164,9 +1165,10 @@ edge_badness (struct cgraph_edge *edge, bool dump) { sreal numerator, denominator; 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); if (numerator <= 0) numerator = ((sreal) 1 >> 8); @@ -1198,14 +1200,14 @@ edge_badness (struct cgraph_edge *edge, bool dump) && callee_info->single_caller && !edge->caller->inlined_to /* ... and edges executed only conditionally ... */ - && edge->sreal_frequency () < 1 + && freq < 1 /* ... consider case where callee is not inline but caller is ... */ && ((!DECL_DECLARED_INLINE_P (edge->callee->decl) && DECL_DECLARED_INLINE_P (caller->decl)) /* ... or when early optimizers decided to split and edge frequency still indicates splitting is a win ... */ || (callee->split_part && !caller->split_part - && edge->sreal_frequency () * 100 + && freq * 100 < PARAM_VALUE (PARAM_PARTIAL_INLINING_ENTRY_PROBABILITY) /* ... and do not overwrite user specified hints. */ @@ -1256,11 +1258,11 @@ edge_badness (struct cgraph_edge *edge, bool dump) " overall growth %i (current) %i (original)" " %i (compensated)\n", badness.to_double (), - edge->sreal_frequency ().to_double (), + freq.to_double (), edge->count.ipa ().initialized_p () ? edge->count.ipa ().to_gcov_type () : -1, caller->count.ipa ().initialized_p () ? caller->count.ipa ().to_gcov_type () : -1, compute_uninlined_call_time (edge, - unspec_edge_time).to_double (), + unspec_edge_time, freq).to_double (), inlined_time.to_double (), estimate_growth (callee), callee_info->growth, overall_growth); |