* cgraph.c (cgraph_node::dump): Complain about profile insanities.
authorJan Hubicka <hubicka@ucw.cz>
Mon, 12 Jun 2017 12:36:47 +0000 (14:36 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 12 Jun 2017 12:36:47 +0000 (12:36 +0000)
From-SVN: r249123

gcc/ChangeLog
gcc/cgraph.c

index 619352776ed823206e68d53bc8ae763508e44148..20dafd3c5861a5f62435231807ba7844fdad14ad 100644 (file)
@@ -1,3 +1,7 @@
+2017-06-11  Jan Hubicka  <hubicka@ucw.cz>
+
+       * cgraph.c (cgraph_node::dump): Complain about profile insanities.
+
 2017-06-12  Doug Rupp  <rupp@adacore.com>
 
        * config.gcc (*-*-vxworks*): Set use_gcc_stdint to "provide".
index 213587e7e2fc782a3303791ab149fc032f4bc708..81aed5c357ca0cac88f52fbcaa0bb3a4180d88d3 100644 (file)
@@ -2094,7 +2094,7 @@ cgraph_node::dump (FILE *f)
   fprintf (f, "  Function flags:");
   if (count.initialized_p ())
     {
-      fprintf (f, " profile_count ");
+      fprintf (f, " count: ");
       count.dump (f);
     }
   if (origin)
@@ -2172,10 +2172,13 @@ cgraph_node::dump (FILE *f)
   
   fprintf (f, "  Called by: ");
 
+  profile_count sum = profile_count::zero ();
   for (edge = callers; edge; edge = edge->next_caller)
     {
       fprintf (f, "%s ", edge->caller->dump_name ());
       edge->dump_edge_flags (f);
+      if (edge->count.initialized_p ())
+       sum += edge->count;
     }
 
   fprintf (f, "\n  Calls: ");
@@ -2186,6 +2189,36 @@ cgraph_node::dump (FILE *f)
     }
   fprintf (f, "\n");
 
+  if (count.initialized_p ())
+    {
+      bool ok = true;
+      bool min = false;
+      ipa_ref *ref;
+
+      FOR_EACH_ALIAS (this, ref)
+       if (dyn_cast <cgraph_node *> (ref->referring)->count.initialized_p ())
+         sum += dyn_cast <cgraph_node *> (ref->referring)->count;
+  
+      if (global.inlined_to
+         || (symtab->state < EXPANSION
+             && ultimate_alias_target () == this && only_called_directly_p ()))
+       ok = !count.differs_from_p (sum);
+      else if (count > profile_count::from_gcov_type (100)
+              && count < sum.apply_scale (99, 100))
+       ok = false, min = true;
+      if (!ok)
+       {
+         fprintf (f, "   Invalid sum of caller counts ");
+         sum.dump (f);
+         if (min)
+           fprintf (f, ", should be at most ");
+         else
+           fprintf (f, ", should be ");
+         count.dump (f);
+         fprintf (f, "\n");
+       }
+    }
+
   for (edge = indirect_calls; edge; edge = edge->next_callee)
     {
       if (edge->indirect_info->polymorphic)