diff mbox series

Make unlikely bb discovery more robust

Message ID 20180123100412.GC48396@kam.mff.cuni.cz
State New
Headers show
Series Make unlikely bb discovery more robust | expand

Commit Message

Jan Hubicka Jan. 23, 2018, 10:04 a.m. UTC
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.
diff mbox series

Patch

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))