re PR bootstrap/49786 (bootstrap failed with bootstrap-profiled)
authorMartin Jambor <mjambor@suse.cz>
Tue, 26 Jul 2011 12:26:58 +0000 (14:26 +0200)
committerMartin Jambor <jamborm@gcc.gnu.org>
Tue, 26 Jul 2011 12:26:58 +0000 (14:26 +0200)
2011-07-26  Martin Jambor  <mjambor@suse.cz>

PR bootstrap/49786
* ipa-cp.c (update_profiling_info): Avoid overflow when updating
counts.
(update_specialized_profile): Likewise.

From-SVN: r176789

gcc/ChangeLog
gcc/ipa-cp.c

index 913e2028195b93e83cb5bd950578d5d97bbc9118..7825a25882fd3edcb441b97c57060eff916c345c 100644 (file)
@@ -1,3 +1,10 @@
+2011-07-26  Martin Jambor  <mjambor@suse.cz>
+
+       PR bootstrap/49786
+       * ipa-cp.c (update_profiling_info): Avoid overflow when updating
+       counts.
+       (update_specialized_profile): Likewise.
+
 2011-07-26  Uros Bizjak  <ubizjak@gmail.com>
            H.J. Lu  <hongjiu.lu@intel.com>
 
index dc8cf095f6ef3a32d276d70aaaa17734ae555cfe..94118b7b1a5d0fe814102548aa14f5b85a2ceb3a 100644 (file)
@@ -1877,7 +1877,6 @@ dump_profile_updates (struct cgraph_node *orig_node,
             cgraph_node_name (cs->callee), (HOST_WIDE_INT) cs->count);
 }
 
-
 /* After a specialized NEW_NODE version of ORIG_NODE has been created, update
    their profile information to reflect this.  */
 
@@ -1923,12 +1922,14 @@ update_profiling_info (struct cgraph_node *orig_node,
 
   for (cs = new_node->callees; cs ; cs = cs->next_callee)
     if (cs->frequency)
-      cs->count = cs->count * new_sum / orig_node_count;
+      cs->count = cs->count * (new_sum * REG_BR_PROB_BASE
+                              / orig_node_count) / REG_BR_PROB_BASE;
     else
       cs->count = 0;
 
   for (cs = orig_node->callees; cs ; cs = cs->next_callee)
-    cs->count = cs->count * remainder / orig_node_count;
+    cs->count = cs->count * (remainder * REG_BR_PROB_BASE
+                            / orig_node_count) / REG_BR_PROB_BASE;
 
   if (dump_file)
     dump_profile_updates (orig_node, new_node);
@@ -1966,7 +1967,8 @@ update_specialized_profile (struct cgraph_node *new_node,
 
   for (cs = orig_node->callees; cs ; cs = cs->next_callee)
     {
-      gcov_type dec = cs->count * redirected_sum / orig_node_count;
+      gcov_type dec = cs->count * (redirected_sum * REG_BR_PROB_BASE
+                                  / orig_node_count) / REG_BR_PROB_BASE;
       if (dec < cs->count)
        cs->count -= dec;
       else