diff options
author | Martin Liska <mliska@suse.cz> | 2019-05-13 09:05:23 +0200 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2019-05-13 07:05:23 +0000 |
commit | 2e9ff3bbe24879ecd81d7f99d4b30eaa1cd1021b (patch) | |
tree | 84b7c083e9b0a85acd962bff6b91da85fe752032 /gcc/gcov.c | |
parent | 4af3b0ea1bcc3096e21fc1687fa78a294b232454 (diff) | |
download | gcc-2e9ff3bbe24879ecd81d7f99d4b30eaa1cd1021b.zip gcc-2e9ff3bbe24879ecd81d7f99d4b30eaa1cd1021b.tar.gz gcc-2e9ff3bbe24879ecd81d7f99d4b30eaa1cd1021b.tar.bz2 |
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
Diffstat (limited to 'gcc/gcov.c')
-rw-r--r-- | gcc/gcov.c | 24 |
1 files changed, 20 insertions, 4 deletions
@@ -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 |