gcov.c (typedef struct arc_info): New field cs_count.
* gcov.c (typedef struct arc_info): New field cs_count. (accumulate_line_counts): Find cycles correctly. * gcc.misc-tests/gcov-10b.c: New test. From-SVN: r70859
This commit is contained in:
parent
37e0ff1155
commit
3d7ca1673b
4 changed files with 44 additions and 4 deletions
|
@ -1,3 +1,8 @@
|
|||
2003-08-27 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
|
||||
|
||||
* gcov.c (typedef struct arc_info): New field cs_count.
|
||||
(accumulate_line_counts): Find cycles correctly.
|
||||
|
||||
2003-08-27 Ulrich Weigand <uweigand@de.ibm.com>
|
||||
|
||||
* config/s390/s390.c (struct machine_function): Remove member
|
||||
|
|
23
gcc/gcov.c
23
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. */
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2003-08-27 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
|
||||
|
||||
* gcc.misc-tests/gcov-10b.c: New test.
|
||||
|
||||
2003-08-27 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
* g++.dg/opt/ptrmem3.C: New test.
|
||||
|
|
16
gcc/testsuite/gcc.misc-tests/gcov-10b.c
Normal file
16
gcc/testsuite/gcc.misc-tests/gcov-10b.c
Normal file
|
@ -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 } } } */
|
||||
|
Loading…
Add table
Reference in a new issue