summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2019-05-13 09:05:23 +0200
committerMartin Liska <marxin@gcc.gnu.org>2019-05-13 07:05:23 +0000
commit2e9ff3bbe24879ecd81d7f99d4b30eaa1cd1021b (patch)
tree84b7c083e9b0a85acd962bff6b91da85fe752032
parent4af3b0ea1bcc3096e21fc1687fa78a294b232454 (diff)
Do not follow zero edges in cycle detection (PR gcov-profile/90380).
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
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/gcov.c24
2 files changed, 28 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fa57dfdb8f1..8fe1a9eeaa7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,6 +1,14 @@
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
* gcov.c (enum loop_type): Remove the enum and
the operator.
(handle_cycle): Assert that we should not reach
diff --git a/gcc/gcov.c b/gcc/gcov.c
index 6bcd2b23748..b06a6714c2e 100644
--- a/gcc/gcov.c
+++ b/gcc/gcov.c
@@ -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