From e29512ba251d4bf81039d3e91bb2f2a33e82b108 Mon Sep 17 00:00:00 2001 From: rakdver Date: Wed, 27 Aug 2003 21:13:17 +0000 Subject: [PATCH] * 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 --- gcc/ChangeLog | 5 +++++ gcc/gcov.c | 23 +++++++++++++++++++---- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.misc-tests/gcov-10b.c | 16 ++++++++++++++++ 4 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-10b.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 03b535a..7a97ad5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-08-27 Zdenek Dvorak + + * gcov.c (typedef struct arc_info): New field cs_count. + (accumulate_line_counts): Find cycles correctly. + 2003-08-27 Ulrich Weigand * config/s390/s390.c (struct machine_function): Remove member diff --git a/gcc/gcov.c b/gcc/gcov.c index 4c9af4d..d3037c7 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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 576845a..0877585 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-08-27 Zdenek Dvorak + + * gcc.misc-tests/gcov-10b.c: New test. + 2003-08-27 Mark Mitchell * g++.dg/opt/ptrmem3.C: New test. diff --git a/gcc/testsuite/gcc.misc-tests/gcov-10b.c b/gcc/testsuite/gcc.misc-tests/gcov-10b.c new file mode 100644 index 0000000..148d779 --- /dev/null +++ b/gcc/testsuite/gcc.misc-tests/gcov-10b.c @@ -0,0 +1,16 @@ +/* Test gcov block mode. */ + +/* { dg-options "-fprofile-arcs -ftest-coverage" } */ +/* { dg-do run { target native } } */ + +int main () +{ + unsigned ix, jx = 0; + + ix = 10; goto test; loop: ; if (ix & 1) jx++; test: ; if (ix--) goto loop; /* count(11) */ + + return jx != 5; +} + +/* { dg-final { run-gcov { -a gcov-10b.c } } } */ + -- 2.7.4