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;
 

Reply via email to