Do not follow zero edges in cycle detection (PR gcov-profile/90380).
authorMartin Liska <mliska@suse.cz>
Mon, 13 May 2019 07:05:23 +0000 (09:05 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Mon, 13 May 2019 07:05:23 +0000 (07:05 +0000)
2019-05-13  Martin Liska  <mliska@suse.cz>

PR gcov-profile/90380
* gcov.c (handle_cycle): Do not support zero cycle count,
it should not be possible.
(path_contains_zero_cycle_arc): New function.
(circuit): Ignore zero cycle arc counts.

From-SVN: r271117

gcc/ChangeLog
gcc/gcov.c

index fa57dfdb8f104f14894b688cbddf5de688690cae..8fe1a9eeaa785f8ca6372d36d25eb437f69298a6 100644 (file)
@@ -1,3 +1,11 @@
+2019-05-13  Martin Liska  <mliska@suse.cz>
+
+       PR gcov-profile/90380
+       * gcov.c (handle_cycle): Do not support zero cycle count,
+       it should not be possible.
+       (path_contains_zero_cycle_arc): New function.
+       (circuit): Ignore zero cycle arc counts.
+
 2019-05-13  Martin Liska  <mliska@suse.cz>
 
        PR gcov-profile/90380
index 6bcd2b237489e0a15b598116efd42336b6d27d8a..b06a6714c2e5b2af4d7d24d5fcf201898e4c7768 100644 (file)
@@ -696,7 +696,7 @@ handle_cycle (const arc_vector_t &edges, int64_t &count)
   for (unsigned i = 0; i < edges.size (); i++)
     edges[i]->cs_count -= cycle_count;
 
-  gcc_assert (cycle_count >= 0);
+  gcc_assert (cycle_count > 0);
 }
 
 /* Unblock a block U from BLOCKED.  Apart from that, iterate all blocks
@@ -722,6 +722,17 @@ unblock (const block_info *u, block_vector_t &blocked,
     unblock (*it, blocked, block_lists);
 }
 
+/* Return true when PATH contains a zero cycle arc count.  */
+
+static bool
+path_contains_zero_cycle_arc (arc_vector_t &path)
+{
+  for (unsigned i = 0; i < path.size (); i++)
+    if (path[i]->cs_count == 0)
+      return true;
+  return false;
+}
+
 /* Find circuit going to block V, PATH is provisional seen cycle.
    BLOCKED is vector of blocked vertices, BLOCK_LISTS contains vertices
    blocked by a block.  COUNT is accumulated count of the current LINE.
@@ -742,7 +753,9 @@ circuit (block_info *v, arc_vector_t &path, block_info *start,
   for (arc_info *arc = v->succ; arc; arc = arc->succ_next)
     {
       block_info *w = arc->dst;
-      if (w < start || !linfo.has_block (w))
+      if (w < start
+         || arc->cs_count == 0
+         || !linfo.has_block (w))
        continue;
 
       path.push_back (arc);
@@ -752,7 +765,8 @@ circuit (block_info *v, arc_vector_t &path, block_info *start,
          handle_cycle (path, count);
          loop_found = true;
        }
-      else if (find (blocked.begin (), blocked.end (), w) == blocked.end ())
+      else if (!path_contains_zero_cycle_arc (path)
+              &&  find (blocked.begin (), blocked.end (), w) == blocked.end ())
        loop_found |= circuit (w, path, start, blocked, block_lists, linfo,
                               count);
 
@@ -765,7 +779,9 @@ circuit (block_info *v, arc_vector_t &path, block_info *start,
     for (arc_info *arc = v->succ; arc; arc = arc->succ_next)
       {
        block_info *w = arc->dst;
-       if (w < start || !linfo.has_block (w))
+       if (w < start
+           || arc->cs_count == 0
+           || !linfo.has_block (w))
          continue;
 
        size_t index