cfg.c (check_bb_profile): Do not report mismatched profiles when only edges out of...
authorJan Hubicka <hubicka@ucw.cz>
Sun, 5 Jun 2016 16:38:12 +0000 (18:38 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sun, 5 Jun 2016 16:38:12 +0000 (16:38 +0000)
* cfg.c (check_bb_profile): Do not report mismatched profiles when
only edges out of BB are EH edges.

From-SVN: r237102

gcc/ChangeLog
gcc/cfg.c

index 3e3a255394474d9b7980c3fea799c5560a6a4a81..be9848c513d088fa0fbf84a2f4f0c3da436ad9b2 100644 (file)
@@ -1,3 +1,8 @@
+2016-06-03  Jan Hubicka  <hubicka@ucw.cz>
+
+       * cfg.c (check_bb_profile): Do not report mismatched profiles when
+       only edges out of BB are EH edges.
+
 2016-06-04  Martin Sebor  <msebor@redhat.com>
            Marcin BaczyƄski <marbacz@gmail.com>
 
index fdbdee8113f6d9a934d6fa7cd953f410ae1b75d8..0e317809f4cadbd192c995fce0bdfa17d5723e78 100644 (file)
--- a/gcc/cfg.c
+++ b/gcc/cfg.c
@@ -412,20 +412,31 @@ check_bb_profile (basic_block bb, FILE * file, int indent, int flags)
 
   if (bb != EXIT_BLOCK_PTR_FOR_FN (fun))
     {
+      bool found = false;
       FOR_EACH_EDGE (e, ei, bb->succs)
-       sum += e->probability;
-      if (EDGE_COUNT (bb->succs) && abs (sum - REG_BR_PROB_BASE) > 100)
-       fprintf (file, "%s%sInvalid sum of outgoing probabilities %.1f%%\n",
-                (flags & TDF_COMMENT) ? ";; " : "", s_indent,
-                sum * 100.0 / REG_BR_PROB_BASE);
-      lsum = 0;
-      FOR_EACH_EDGE (e, ei, bb->succs)
-       lsum += e->count;
-      if (EDGE_COUNT (bb->succs)
-         && (lsum - bb->count > 100 || lsum - bb->count < -100))
-       fprintf (file, "%s%sInvalid sum of outgoing counts %i, should be %i\n",
-                (flags & TDF_COMMENT) ? ";; " : "", s_indent,
-                (int) lsum, (int) bb->count);
+       {
+         if (!(e->flags & EDGE_EH))
+           found = true;
+         sum += e->probability;
+       }
+      /* Only report mismatches for non-EH control flow. If there are only EH
+        edges it means that the BB ends by noreturn call.  Here the control
+        flow may just terminate.  */
+      if (found)
+       {
+         if (EDGE_COUNT (bb->succs) && abs (sum - REG_BR_PROB_BASE) > 100)
+           fprintf (file, "%s%sInvalid sum of outgoing probabilities %.1f%%\n",
+                    (flags & TDF_COMMENT) ? ";; " : "", s_indent,
+                    sum * 100.0 / REG_BR_PROB_BASE);
+         lsum = 0;
+         FOR_EACH_EDGE (e, ei, bb->succs)
+           lsum += e->count;
+         if (EDGE_COUNT (bb->succs)
+             && (lsum - bb->count > 100 || lsum - bb->count < -100))
+           fprintf (file, "%s%sInvalid sum of outgoing counts %i, should be %i\n",
+                    (flags & TDF_COMMENT) ? ";; " : "", s_indent,
+                    (int) lsum, (int) bb->count);
+       }
     }
     if (bb != ENTRY_BLOCK_PTR_FOR_FN (fun))
     {