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;