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>
* config/s390/s390.c (struct machine_function): Remove member

View File

@ -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. */

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