Commit 3d7ca167 by Zdenek Dvorak Committed by Zdenek Dvorak

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
parent 37e0ff11
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
......
...@@ -82,6 +82,8 @@ typedef struct arc_info ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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. */
......
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.
......
/* 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 } } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment