Hi,
this patch manually CSEs sreal frequency calculations.

Bootstrapped/regtested x86_64-linux, comitted.

        * 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.

Index: ipa-inline.c
===================================================================
--- ipa-inline.c        (revision 278020)
+++ ipa-inline.c        (working copy)
@@ -735,13 +735,13 @@ want_early_inline_function_p (struct cgr
 
 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 cgra
 
 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,
     {
       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,
          && 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,
                   " 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);

Reply via email to