This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Make cgraph frequencies more precise
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc-patches at gcc dot gnu dot org, dje dot gcc at gmail dot com
- Date: Mon, 12 Oct 2015 08:07:27 +0200
- Subject: Make cgraph frequencies more precise
- Authentication-results: sourceware.org; auth=none
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;