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:
Zdenek Dvorak 2003-08-27 23:13:17 +02:00 committed by Zdenek Dvorak
parent 37e0ff1155
commit 3d7ca1673b
4 changed files with 44 additions and 4 deletions

View File

@ -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> 2003-08-27 Ulrich Weigand <uweigand@de.ibm.com>
* config/s390/s390.c (struct machine_function): Remove member * config/s390/s390.c (struct machine_function): Remove member

View File

@ -82,6 +82,8 @@ typedef struct arc_info
/* transition counts. */ /* transition counts. */
gcov_type count; 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 count_valid : 1;
unsigned int on_tree : 1; unsigned int on_tree : 1;
@ -1622,6 +1624,10 @@ accumulate_line_counts (source_t *src)
if (flag_branches) if (flag_branches)
add_branch_counts (&src->coverage, arc); 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 /* 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 For each loop we find, locate the arc with the smallest
transition count, and add that to the cumulative 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) for (block = line->u.blocks; block; block = block->chain)
{ {
block_t *head = block; block_t *head = block;
@ -1664,25 +1671,33 @@ accumulate_line_counts (source_t *src)
if (dst == block) if (dst == block)
{ {
/* Found a closing arc. */ /* Found a closing arc. */
gcov_type cycle_count = arc->count; gcov_type cycle_count = arc->cs_count;
arc_t *cycle_arc = arc; arc_t *cycle_arc = arc;
arc_t *probe_arc; arc_t *probe_arc;
/* Locate the smallest arc count of the loop. */ /* Locate the smallest arc count of the loop. */
for (dst = head; (probe_arc = dst->u.cycle.arc); for (dst = head; (probe_arc = dst->u.cycle.arc);
dst = probe_arc->src) 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; cycle_arc = probe_arc;
} }
count += cycle_count; count += cycle_count;
cycle_arc->cycle = 1; 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. */ /* Unwind to the cyclic arc. */
while (head != cycle_arc->src) while (head != cycle_arc->src)
{ {
arc = head->u.cycle.arc; arc = head->u.cycle.arc;
head->u.cycle.arc = NULL;
head = arc->src; head = arc->src;
} }
/* Move on. */ /* Move on. */

View File

@ -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> 2003-08-27 Mark Mitchell <mark@codesourcery.com>
* g++.dg/opt/ptrmem3.C: New test. * g++.dg/opt/ptrmem3.C: New test.

View 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 } } } */