Prevent inconsistent profiles to be created in inlin_transform
authorJan Hubicka <hubicka@ucw.cz>
Thu, 28 Nov 2019 16:59:43 +0000 (17:59 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 28 Nov 2019 16:59:43 +0000 (16:59 +0000)
* ipa-inline-transform.c (inline_transform): Scale profile before
redirecting.

From-SVN: r278814

gcc/ChangeLog
gcc/ipa-inline-transform.c

index e842cd2648d814bbaf25a46e6122232db182fcf1..87732c84850c54c2cc89c9971c18a7682d20f7de 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-28  Jan Hubicka  <hubicka@ucw.cz>
+
+       * ipa-inline-transform.c (inline_transform): Scale profile before
+       redirecting.
+
 2019-11-28  Jan Hubicka  <hubicka@ucw.cz>
 
        * profile-count.h (profile_count::max): Work on profiles of different
index e7ec7f911e1be8871f3b4e8fab8495e19673cf68..6ec843a23b7666b048b0d6e38c4f2d7b30e03c2f 100644 (file)
@@ -681,6 +681,31 @@ inline_transform (struct cgraph_node *node)
   if (preserve_function_body_p (node))
     save_inline_function_body (node);
 
+  profile_count num = node->count;
+  profile_count den = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
+  bool scale = num.initialized_p () && !(num == den);
+  if (scale)
+    {
+      profile_count::adjust_for_ipa_scaling (&num, &den);
+      if (dump_file)
+       {
+         fprintf (dump_file, "Applying count scale ");
+         num.dump (dump_file);
+         fprintf (dump_file, "/");
+         den.dump (dump_file);
+         fprintf (dump_file, "\n");
+       }
+
+      basic_block bb;
+      cfun->cfg->count_max = profile_count::uninitialized ();
+      FOR_ALL_BB_FN (bb, cfun)
+       {
+         bb->count = bb->count.apply_scale (num, den);
+         cfun->cfg->count_max = cfun->cfg->count_max.max (bb->count);
+       }
+      ENTRY_BLOCK_PTR_FOR_FN (cfun)->count = node->count;
+    }
+
   for (e = node->callees; e; e = next)
     {
       if (!e->inline_failed)
@@ -693,32 +718,8 @@ inline_transform (struct cgraph_node *node)
   timevar_push (TV_INTEGRATION);
   if (node->callees && (opt_for_fn (node->decl, optimize) || has_inline))
     {
-      profile_count num = node->count;
-      profile_count den = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
-      bool scale = num.initialized_p () && !(num == den);
-      if (scale)
-       {
-         profile_count::adjust_for_ipa_scaling (&num, &den);
-         if (dump_file)
-           {
-             fprintf (dump_file, "Applying count scale ");
-             num.dump (dump_file);
-             fprintf (dump_file, "/");
-             den.dump (dump_file);
-             fprintf (dump_file, "\n");
-           }
-
-         basic_block bb;
-         cfun->cfg->count_max = profile_count::uninitialized ();
-         FOR_ALL_BB_FN (bb, cfun)
-           {
-             bb->count = bb->count.apply_scale (num, den);
-             cfun->cfg->count_max = cfun->cfg->count_max.max (bb->count);
-           }
-         ENTRY_BLOCK_PTR_FOR_FN (cfun)->count = node->count;
-       }
       todo = optimize_inline_calls (current_function_decl);
-   }
+    }
   timevar_pop (TV_INTEGRATION);
 
   cfun->always_inline_functions_inlined = true;