tree-tailcall.c (eliminate_tail_call): Be more careful about not disturbin profile...
authorJan Hubicka <hubicka@ucw.cz>
Fri, 17 Nov 2017 17:44:41 +0000 (18:44 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 17 Nov 2017 17:44:41 +0000 (17:44 +0000)
* tree-tailcall.c (eliminate_tail_call): Be more careful about not
disturbin profile of entry block.

From-SVN: r254887

gcc/ChangeLog
gcc/tree-tailcall.c

index c24c0a5f343c473e02fc44265cc4b82fa0a392e8..5ab422c917ab7b11df27045a5fa99ec440800a87 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-17  Jan Hubicka  <hubicka@ucw.cz>
+
+       * tree-tailcall.c (eliminate_tail_call): Be more careful about not
+       disturbin profile of entry block.
+
 2017-11-17  Jan Hubicka  <hubicka@ucw.cz>
 
        * ipa-fnsummary.c (estimate_node_size_and_time): Be more tolerant for
index 0e637147e8c57f7ee95f5769fe2c65e0d9162c74..212519cdfd7236f6b3c258937ed02613f53d191d 100644 (file)
@@ -889,10 +889,18 @@ eliminate_tail_call (struct tailcall *t)
 
   /* Number of executions of function has reduced by the tailcall.  */
   e = single_succ_edge (gsi_bb (t->call_gsi));
-  decrease_profile (EXIT_BLOCK_PTR_FOR_FN (cfun), e->count ());
-  decrease_profile (ENTRY_BLOCK_PTR_FOR_FN (cfun), e->count ());
+
+  profile_count count = e->count ();
+
+  /* When profile is inconsistent and the recursion edge is more frequent
+     than number of executions of functions, scale it down, so we do not end
+     up with 0 executions of entry block.  */
+  if (count >= ENTRY_BLOCK_PTR_FOR_FN (cfun)->count)
+    count = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.apply_scale (7, 8);
+  decrease_profile (EXIT_BLOCK_PTR_FOR_FN (cfun), count);
+  decrease_profile (ENTRY_BLOCK_PTR_FOR_FN (cfun), count);
   if (e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
-    decrease_profile (e->dest, e->count ());
+    decrease_profile (e->dest, count);
 
   /* Replace the call by a jump to the start of function.  */
   e = redirect_edge_and_branch (single_succ_edge (gsi_bb (t->call_gsi)),