ipa-utils.c (ipa_merge_profiles): Fix merging when dst is uninitialized while src...
authorJan Hubicka <hubicka@ucw.cz>
Tue, 4 Jul 2017 17:05:26 +0000 (19:05 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 4 Jul 2017 17:05:26 +0000 (17:05 +0000)
* ipa-utils.c (ipa_merge_profiles): Fix merging when dst is
uninitialized while src is not.

From-SVN: r249973

gcc/ChangeLog
gcc/ipa-utils.c

index ccb1bd476057ecbda58941758ddaa66ed504f2d5..1168a3ac619c01bdfa87f54fe0b571eddf63a0b1 100644 (file)
@@ -1,3 +1,8 @@
+2017-07-04  Jan Hubicka  <hubicka@ucw.cz>
+
+       * ipa-utils.c (ipa_merge_profiles): Fix merging when dst is
+       uninitialized while src is not.
+
 2017-07-04  Richard Earnshaw  <rearnsha@arm.com>
 
        * common/config/arm/arm-common.c: Adjust include path for
index 65eed77c930f17839c8860e134e88cf0ae6d32b1..708710d61353a3c921dc61a5190c308e4bab1a00 100644 (file)
@@ -404,14 +404,17 @@ ipa_merge_profiles (struct cgraph_node *dst,
 
   /* FIXME when we merge in unknown profile, we ought to set counts as
      unsafe.  */
-  if (!dst->count.initialized_p ())
+  if (!src->count.initialized_p ())
     return;
   if (symtab->dump_file)
     {
       fprintf (symtab->dump_file, "Merging profiles of %s to %s\n",
               src->dump_name (), dst->dump_name ());
     }
-  dst->count += src->count;
+  if (dst->count.initialized_p ())
+    dst->count += src->count;
+  else
+    dst->count = src->count;
 
   /* This is ugly.  We need to get both function bodies into memory.
      If declaration is merged, we need to duplicate it to be able
@@ -521,12 +524,20 @@ ipa_merge_profiles (struct cgraph_node *dst,
          unsigned int i;
 
          dstbb = BASIC_BLOCK_FOR_FN (dstcfun, srcbb->index);
-         dstbb->count += srcbb->count;
+         if (dstbb->count.initialized_p ())
+           dstbb->count += srcbb->count;
+         else
+           dstbb->count = srcbb->count;
          for (i = 0; i < EDGE_COUNT (srcbb->succs); i++)
            {
              edge srce = EDGE_SUCC (srcbb, i);
              edge dste = EDGE_SUCC (dstbb, i);
-             dste->count += srce->count;
+             if (dstbb->count.initialized_p ())
+               dste->count += srce->count;
+             else
+               dste->count = srce->count;
+             if (dstbb->count > 0 && dste->count.initialized_p ())
+               dste->probability = dste->count.probability_in (dstbb->count);
            }
        }
       push_cfun (dstcfun);