ipa-utils.c (scale_ipa_profile_for_fn): Break out from ...
authorJan Hubicka <hubicka@ucw.cz>
Thu, 3 Jan 2019 10:19:03 +0000 (11:19 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 3 Jan 2019 10:19:03 +0000 (10:19 +0000)
* ipa-utils.c (scale_ipa_profile_for_fn): Break out from ...
(ipa_merge_profiles): ... here; do not ICE on thunks and aliases.

From-SVN: r267549

gcc/ChangeLog
gcc/ipa-utils.c

index 634de2b0d18cc2b5e940a0766b516c3b8eedefee..d1b1876354d685464b170796e26ec2a43362b0b5 100644 (file)
@@ -1,3 +1,8 @@
+2019-01-03  Jan Hubicka  <hubicka@ucw.cz>
+
+       * ipa-utils.c (scale_ipa_profile_for_fn): Break out from ...
+       (ipa_merge_profiles): ... here; do not ICE on thunks and aliases.
+
 2019-01-02  Martin Sebor  <msebor@redhat.com>
             Jeff Law  <law@redhat.com>
 
index c9723759f5020a6bc15e8fd1381c9e60621b1e5f..aebcb8ea91d440a9c0f86ab68f66cc518eeeea25 100644 (file)
@@ -375,6 +375,20 @@ get_base_var (tree t)
   return t;
 }
 
+/* Scale function of calls in NODE by ratio ORIG_COUNT/NODE->count.  */
+
+void
+scale_ipa_profile_for_fn (struct cgraph_node *node, profile_count orig_count)
+{
+  profile_count to = node->count;
+  profile_count::adjust_for_ipa_scaling (&to, &orig_count);
+  struct cgraph_edge *e;
+  
+  for (e = node->callees; e; e = e->next_callee)
+    e->count = e->count.apply_scale (to, orig_count);
+  for (e = node->indirect_calls; e; e = e->next_callee)
+    e->count = e->count.apply_scale (to, orig_count);
+}
 
 /* SRC and DST are going to be merged.  Take SRC's profile and merge it into
    DST so it is not going to be lost.  Possibly destroy SRC's body on the way
@@ -424,6 +438,14 @@ ipa_merge_profiles (struct cgraph_node *dst,
   else 
     dst->count = src->count.ipa ();
 
+  /* First handle functions with no gimple body.  */
+  if (dst->thunk.thunk_p || dst->alias
+      || src->thunk.thunk_p || src->alias)
+    {
+      scale_ipa_profile_for_fn (dst, orig_count);
+      return;
+    }
+
   /* This is ugly.  We need to get both function bodies into memory.
      If declaration is merged, we need to duplicate it to be able
      to load body that is being replaced.  This makes symbol table
@@ -652,16 +674,7 @@ ipa_merge_profiles (struct cgraph_node *dst,
   /* We can't update CFG profile, but we can scale IPA profile. CFG
      will be scaled according to dst->count after IPA passes.  */
   else
-    {
-      profile_count to = dst->count;
-      profile_count::adjust_for_ipa_scaling (&to, &orig_count);
-      struct cgraph_edge *e;
-      
-      for (e = dst->callees; e; e = e->next_callee)
-       e->count = e->count.apply_scale (to, orig_count);
-      for (e = dst->indirect_calls; e; e = e->next_callee)
-       e->count = e->count.apply_scale (to, orig_count);
-    }
+    scale_ipa_profile_for_fn (dst, orig_count);
   src->decl = oldsrcdecl;
 }