From 2e9ff3bbe24879ecd81d7f99d4b30eaa1cd1021b Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Mon, 13 May 2019 09:05:23 +0200 Subject: [PATCH] Do not follow zero edges in cycle detection (PR gcov-profile/90380). 2019-05-13 Martin Liska 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 | 8 ++++++++ gcc/gcov.c | 24 ++++++++++++++++++++---- 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,3 +1,11 @@ +2019-05-13 Martin Liska + + 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 PR gcov-profile/90380 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 -- 2.30.2