Feedback optimization errors running SPEC with GCC 3.4 on Darwin 6.4 (Fwd)
Jan Hubicka
jh@suse.cz
Mon Sep 29 21:29:00 GMT 2003
> >>>>> Jan Hubicka writes:
>
> Jan> It would be enought to send dumps up to bpro, but there are not that
> Jan> many afterwards. These bugs are especially irritating to hunt down
> Jan> without a machine to test :(
>
> PR 12283 reports the bug for x86.
At least the x86 problem is caused by corruption of input buffer in last
gcov file handling rewrite.
I also added some sanity checking so we should catch similar bugs more
easilly in the future. Does this help to your problem?
I commited this patch after bootstrapping it.
Mon Sep 29 23:02:40 CEST 2003 Jan Hubicka <jh@suse.cz>
PR optimization/12286
* gcov-io.c (gcov_read_words): Fix memmove call.
* profile.c (compute_branch_probabilities): Add extra sanity checks.
Index: gcov-io.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/gcov-io.c,v
retrieving revision 1.12
diff -c -3 -p -r1.12 gcov-io.c
*** gcov-io.c 10 Jul 2003 14:12:58 -0000 1.12
--- gcov-io.c 29 Sep 2003 21:02:24 -0000
*************** gcov_read_words (unsigned words)
*** 361,367 ****
memcpy (gcov_var.buffer, gcov_var.buffer + gcov_var.offset, 4);
}
#else
! memmove (gcov_var.buffer, gcov_var.buffer + gcov_var.offset, excess);
#endif
gcov_var.offset = 0;
gcov_var.length = excess;
--- 361,367 ----
memcpy (gcov_var.buffer, gcov_var.buffer + gcov_var.offset, 4);
}
#else
! memmove (gcov_var.buffer, gcov_var.buffer + gcov_var.offset, excess * 4);
#endif
gcov_var.offset = 0;
gcov_var.length = excess;
Index: profile.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/profile.c,v
retrieving revision 1.125
diff -c -3 -p -r1.125 profile.c
*** profile.c 2 Aug 2003 10:30:48 -0000 1.125
--- profile.c 29 Sep 2003 21:02:24 -0000
*************** compute_branch_probabilities (void)
*** 280,285 ****
--- 280,298 ----
gcov_type *exec_counts = get_exec_counts ();
int exec_counts_pos = 0;
+ /* Very simple sanity checks so we catch bugs in our profiling code. */
+ if (profile_info->run_max * profile_info->runs < profile_info->sum_max)
+ {
+ error ("corrupted profile info: run_max * runs < sum_max");
+ exec_counts = NULL;
+ }
+
+ if (profile_info->sum_all < profile_info->sum_max)
+ {
+ error ("corrupted profile info: sum_all is smaller than sum_max");
+ exec_counts = NULL;
+ }
+
/* Attach extra info block to each bb. */
alloc_aux_for_blocks (sizeof (struct bb_info));
*************** compute_branch_probabilities (void)
*** 315,320 ****
--- 328,338 ----
if (exec_counts)
{
e->count = exec_counts[exec_counts_pos++];
+ if (e->count > profile_info->sum_max)
+ {
+ error ("corrupted profile info: edge from %i to %i exceeds maximal count",
+ bb->index, e->dest->index);
+ }
}
else
e->count = 0;
More information about the Gcc-patches
mailing list