Avoid even more sreal calculations in inliner
diff mbox series

Message ID 20191110181857.ygrkn3o4f4xi3hqp@kam.mff.cuni.cz
State New
Headers show
Series
  • Avoid even more sreal calculations in inliner
Related show

Commit Message

Jan Hubicka Nov. 10, 2019, 6:18 p.m. UTC
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.

Patch
diff mbox series

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);