Make unlikely bb discovery more robust

Jan Hubicka hubicka@ucw.cz
Tue Jan 23 10:24:00 GMT 2018


Hi,
this is second part of fix for wrong partitining decisions.  It makes
probabily_never_executed to ignore scaled profiles because they may be
low for invalid reasons.  This does not seem to affect size of cold section
significantly (as it is predocminantly occupied by blocks with 0 count that
remains precise).

Bootstrapped/regtested x86_64-linux, comitted.

Honza

	* predict.c (probably_never_executed): Only use precise profile info.
	(compute_function_frequency): Skip after inlining hack since we now
	have quality checking.

Index: predict.c
===================================================================
--- predict.c	(revision 256973)
+++ predict.c	(working copy)
@@ -212,7 +212,12 @@ probably_never_executed (struct function
   gcc_checking_assert (fun);
   if (count == profile_count::zero ())
     return true;
-  if (count.initialized_p () && profile_status_for_fn (fun) == PROFILE_READ)
+  /* Do not trust adjusted counts.  This will make us to drop int cold section
+     code with low execution count as a result of inlining. These low counts
+     are not safe even with read profile and may lead us to dropping
+     code which actually gets executed into cold section of binary that is not
+     desirable.  */
+  if (count.precise_p () && profile_status_for_fn (fun) == PROFILE_READ)
     {
       int unlikely_count_fraction = PARAM_VALUE (UNLIKELY_BB_COUNT_FRACTION);
       if (count.apply_scale (unlikely_count_fraction, 1) >= profile_info->runs)
@@ -3759,15 +3764,10 @@ compute_function_frequency (void)
       return;
     }
 
-  /* Only first time try to drop function into unlikely executed.
-     After inlining the roundoff errors may confuse us.
-     Ipa-profile pass will drop functions only called from unlikely
-     functions to unlikely and that is most of what we care about.  */
-  if (!cfun->after_inlining)
-    {
-      node->frequency = NODE_FREQUENCY_UNLIKELY_EXECUTED;
-      warn_function_cold (current_function_decl);
-    }
+  node->frequency = NODE_FREQUENCY_UNLIKELY_EXECUTED;
+  warn_function_cold (current_function_decl);
+  if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.ipa() == profile_count::zero ())
+    return;
   FOR_EACH_BB_FN (bb, cfun)
     {
       if (maybe_hot_bb_p (cfun, bb))



More information about the Gcc-patches mailing list