diff options
author | rakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-08-27 21:13:17 +0000 |
---|---|---|
committer | rakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-08-27 21:13:17 +0000 |
commit | e29512ba251d4bf81039d3e91bb2f2a33e82b108 (patch) | |
tree | 7c28704c1941f5fa04436a77f72fd996d53ee36f /gcc/gcov.c | |
parent | c0d1c48cdfa0e3291e08a560feea5c3939b7678a (diff) | |
download | gcc-e29512ba251d4bf81039d3e91bb2f2a33e82b108.tar.gz |
* gcov.c (typedef struct arc_info): New field cs_count.
(accumulate_line_counts): Find cycles correctly.
* gcc.misc-tests/gcov-10b.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@70859 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gcov.c')
-rw-r--r-- | gcc/gcov.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/gcc/gcov.c b/gcc/gcov.c index 4c9af4d68d7..d3037c775b8 100644 --- a/gcc/gcov.c +++ b/gcc/gcov.c @@ -82,6 +82,8 @@ typedef struct arc_info /* transition counts. */ gcov_type count; + /* used in cycle search, so that we do not clobber original counts. */ + gcov_type cs_count; unsigned int count_valid : 1; unsigned int on_tree : 1; @@ -1622,6 +1624,10 @@ accumulate_line_counts (source_t *src) if (flag_branches) add_branch_counts (&src->coverage, arc); } + + /* Initialize the cs_count. */ + for (arc = block->succ; arc; arc = arc->succ_next) + arc->cs_count = arc->count; } /* Find the loops. This uses the algorithm described in @@ -1638,7 +1644,8 @@ accumulate_line_counts (source_t *src) For each loop we find, locate the arc with the smallest transition count, and add that to the cumulative - count. Remove the arc from consideration. */ + count. Decrease flow over the cycle and remove the arc + from consideration. */ for (block = line->u.blocks; block; block = block->chain) { block_t *head = block; @@ -1664,25 +1671,33 @@ accumulate_line_counts (source_t *src) if (dst == block) { /* Found a closing arc. */ - gcov_type cycle_count = arc->count; + gcov_type cycle_count = arc->cs_count; arc_t *cycle_arc = arc; arc_t *probe_arc; /* Locate the smallest arc count of the loop. */ for (dst = head; (probe_arc = dst->u.cycle.arc); dst = probe_arc->src) - if (cycle_count > probe_arc->count) + if (cycle_count > probe_arc->cs_count) { - cycle_count = probe_arc->count; + cycle_count = probe_arc->cs_count; cycle_arc = probe_arc; } count += cycle_count; cycle_arc->cycle = 1; + + /* Remove the flow from the cycle. */ + arc->cs_count -= cycle_count; + for (dst = head; (probe_arc = dst->u.cycle.arc); + dst = probe_arc->src) + probe_arc->cs_count -= cycle_count; + /* Unwind to the cyclic arc. */ while (head != cycle_arc->src) { arc = head->u.cycle.arc; + head->u.cycle.arc = NULL; head = arc->src; } /* Move on. */ |