]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Backport r271117
authorMartin Liska <mliska@suse.cz>
Tue, 14 May 2019 08:46:35 +0000 (10:46 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Tue, 14 May 2019 08:46:35 +0000 (08:46 +0000)
2019-05-14  Martin Liska  <mliska@suse.cz>

Backport from mainline
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: r271151

gcc/ChangeLog
gcc/gcov.c

index 69deaa5a6d7fb9717140439bb8fd3c5553a60439..d77ccbe12b7192306c508eadaa84373ad90f2a4a 100644 (file)
@@ -1,3 +1,14 @@
+2019-05-14  Martin Liska  <mliska@suse.cz>
+
+       Backport from mainline
+       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-14  Martin Liska  <mliska@suse.cz>
 
        Backport from mainline
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