* cgraphbuild.c (compute_call_stmt_bb_frequency): Use
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Oct 2015 06:08:06 +0000 (06:08 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Oct 2015 06:08:06 +0000 (06:08 +0000)
counts when these are more informative.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@228703 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cgraphbuild.c

index 931dede..5d38bf6 100644 (file)
@@ -1,5 +1,10 @@
 2015-10-11  Jan Hubicka  <hubicka@ucw.cz>
 
+       * cgraphbuild.c (compute_call_stmt_bb_frequency): Use
+       counts when these are more informative.
+
+2015-10-11  Jan Hubicka  <hubicka@ucw.cz>
+
        * tree-profile.c (tree_profiling): Do not clear
        pure/const when not instrumenting.
        (pass tree_profile): Add dump of symtab.
index 33b01be..a7b4af6 100644 (file)
@@ -202,15 +202,21 @@ compute_call_stmt_bb_frequency (tree decl, basic_block bb)
 {
   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;