This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PR profile/24093 (negative counts)


Hi,
this patch fixes the other half of problem.  It turns out that the
profile missmatch produced by recursive inlining (that is avoidable but
likely not worthwhile) propagate into negative counts that in general
might happen in other cases too (due to roundoff errors), so I just
added code checking it.

Bootstrapped/regtested i686-pc-gnu-linux, comitted.

2005-10-31  Jan Hubicka  <jh@suse.cz>
	PR middle-end/24093
	* cgraph.c (cgraph_clone_edge, cgraph_clone_node): Watch negative
	counts.
Index: cgraph.c
===================================================================
--- cgraph.c	(revision 106281)
+++ cgraph.c	(working copy)
@@ -895,7 +895,11 @@ cgraph_clone_edge (struct cgraph_edge *e
 
   new->inline_failed = e->inline_failed;
   if (update_original)
-    e->count -= new->count;
+    {
+      e->count -= new->count;
+      if (e->count < 0)
+	e->count = 0;
+    }
   return new;
 }
 
@@ -931,7 +935,11 @@ cgraph_clone_node (struct cgraph_node *n
   else
     count_scale = 0;
   if (update_original)
-    n->count -= count;
+    {
+      n->count -= count;
+      if (n->count < 0)
+	n->count = 0;
+    }
 
   for (e = n->callees;e; e=e->next_callee)
     cgraph_clone_edge (e, new, e->call_stmt, count_scale, loop_nest,


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]