This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Make cgraph frequencies more precise


Hi,
this patch fixes a case of extreme imprecision I noticed while looking into
profiles of PHP interpretter. There is a function that is called 22 times
and contains the main loop.  Now since the frequency of entry block is dropped
to 0, we do not have any information of relative frequencies in the colder
areas of the function.

Hope all this uglyness with go away with conversion to sreals soonish.

Profiledbootstrapped/regtested ppc64le-linux, comitted.
	* cgraphbuild.c (compute_call_stmt_bb_frequency): Use
	counts when these are more informative.
Index: cgraphbuild.c
===================================================================
--- cgraphbuild.c	(revision 228684)
+++ cgraphbuild.c	(working copy)
@@ -202,15 +202,21 @@
 {
   int entry_freq = ENTRY_BLOCK_PTR_FOR_FN
   		     (DECL_STRUCT_FUNCTION (decl))->frequency;
-  int freq = bb->frequency;
+  gcov_type entry_count = ENTRY_BLOCK_PTR_FOR_FN
+			    (DECL_STRUCT_FUNCTION (decl))->count;
+  gcov_type freq = bb->frequency;
 
   if (profile_status_for_fn (DECL_STRUCT_FUNCTION (decl)) == PROFILE_ABSENT)
     return CGRAPH_FREQ_BASE;
 
-  if (!entry_freq)
-    entry_freq = 1, freq++;
-
-  freq = freq * CGRAPH_FREQ_BASE / entry_freq;
+  if (entry_count > entry_freq)
+    freq = RDIV (bb->count * CGRAPH_FREQ_BASE, entry_count);
+  else
+    {
+      if (!entry_freq)
+        entry_freq = 1, freq++;
+      freq = RDIV (freq * CGRAPH_FREQ_BASE, entry_freq);
+    }
   if (freq > CGRAPH_FREQ_MAX)
     freq = CGRAPH_FREQ_MAX;
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]