On 5/9/19 10:12 AM, marxin wrote: > > gcc/ChangeLog: > > 2019-05-09 Martin Liska <mli...@suse.cz> > > * gcov.c (circuit): Ignore zero count arcs. > --- > gcc/gcov.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) >
Hi. There's second version of the patch that was confirmed by the reported that works fine. Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Thanks, Martin
>From 028e216cb182d2f0e114d7838bb1f1c7f1102e85 Mon Sep 17 00:00:00 2001 From: marxin <mli...@suse.cz> Date: Thu, 9 May 2019 10:12:42 +0200 Subject: [PATCH 2/2] Do not follow zero edges in cycle detection (PR gcov-profile/90380). gcc/ChangeLog: 2019-05-10 Martin Liska <mli...@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. --- gcc/gcov.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) 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.21.0