aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>2003-08-27 23:13:17 +0200
committerZdenek Dvorak <rakdver@gcc.gnu.org>2003-08-27 21:13:17 +0000
commit3d7ca1673b3387bf420f02e3b45122ab75ff15e5 (patch)
tree7c28704c1941f5fa04436a77f72fd996d53ee36f
parent37e0ff11557b3ebc5917151becaaeb9514c8692d (diff)
downloadgcc-3d7ca1673b3387bf420f02e3b45122ab75ff15e5.zip
gcc-3d7ca1673b3387bf420f02e3b45122ab75ff15e5.tar.gz
gcc-3d7ca1673b3387bf420f02e3b45122ab75ff15e5.tar.bz2
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
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/gcov.c23
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.misc-tests/gcov-10b.c16
4 files changed, 44 insertions, 4 deletions
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 <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
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 <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.
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 } } } */
+