Consider also negative edges in cycle detection.
authorMartin Liska <mliska@suse.cz>
Mon, 2 Sep 2019 07:06:54 +0000 (09:06 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Mon, 2 Sep 2019 07:06:54 +0000 (07:06 +0000)
2019-09-02  Martin Liska  <mliska@suse.cz>

PR gcov-profile/91601
* gcov.c (path_contains_zero_cycle_arc): Rename to ...
(path_contains_zero_or_negative_cycle_arc): ... this and handle
also negative edges.
(circuit): Handle also negative edges as they can happen
in some situations.

From-SVN: r275291

gcc/ChangeLog
gcc/gcov.c

index f17b4d5..6a4f02d 100644 (file)
@@ -1,3 +1,12 @@
+2019-09-02  Martin Liska  <mliska@suse.cz>
+
+       PR gcov-profile/91601
+       * gcov.c (path_contains_zero_cycle_arc): Rename to ...
+       (path_contains_zero_or_negative_cycle_arc): ... this and handle
+       also negative edges.
+       (circuit): Handle also negative edges as they can happen
+       in some situations.
+
 2019-09-01  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR target/91472
index c65b715..f4e65ee 100644 (file)
@@ -730,10 +730,10 @@ unblock (const block_info *u, block_vector_t &blocked,
 /* Return true when PATH contains a zero cycle arc count.  */
 
 static bool
-path_contains_zero_cycle_arc (arc_vector_t &path)
+path_contains_zero_or_negative_cycle_arc (arc_vector_t &path)
 {
   for (unsigned i = 0; i < path.size (); i++)
-    if (path[i]->cs_count == 0)
+    if (path[i]->cs_count <= 0)
       return true;
   return false;
 }
@@ -759,7 +759,7 @@ circuit (block_info *v, arc_vector_t &path, block_info *start,
     {
       block_info *w = arc->dst;
       if (w < start
-         || arc->cs_count == 0
+         || arc->cs_count <= 0
          || !linfo.has_block (w))
        continue;
 
@@ -770,7 +770,7 @@ circuit (block_info *v, arc_vector_t &path, block_info *start,
          handle_cycle (path, count);
          loop_found = true;
        }
-      else if (!path_contains_zero_cycle_arc (path)
+      else if (!path_contains_zero_or_negative_cycle_arc (path)
               &&  find (blocked.begin (), blocked.end (), w) == blocked.end ())
        loop_found |= circuit (w, path, start, blocked, block_lists, linfo,
                               count);
@@ -785,7 +785,7 @@ circuit (block_info *v, arc_vector_t &path, block_info *start,
       {
        block_info *w = arc->dst;
        if (w < start
-           || arc->cs_count == 0
+           || arc->cs_count <= 0
            || !linfo.has_block (w))
          continue;