[PATCH] Fix hoisting -fcompare-debug failures (PR debug/45105)
Jakub Jelinek
jakub@redhat.com
Wed Jul 28 15:44:00 GMT 2010
Hi!
If a bb ends with a DEBUG_INSN, bb_size between -g and -g0
compilation might differ.
The problem is that hoist_code forgets to count BB_END (bb)
instruction (and doesn't even set to_bb_head for it, so it is left at 0).
If in -g0 the block ends with a real insn and with -g with
DEBUG_INSN, in the latter case the last real insn will be counted.
As discussed with Maxim on IRC, we should count even the last insn.
Fixed by using FOR_BB_INSNS macro, bootstrapped/regtested on x86_64-linux
and i686-linux. Ok for trunk?
2010-07-28 Jakub Jelinek <jakub@redhat.com>
PR debug/45105
* gcse.c (hoist_code): Use FOR_BB_INSNS macro.
* gcc.dg/pr45105.c: New test.
--- gcc/gcse.c.jj 2010-07-28 10:36:00.000000000 +0200
+++ gcc/gcse.c 2010-07-28 15:27:56.000000000 +0200
@@ -4389,21 +4389,15 @@ hoist_code (void)
FOR_EACH_BB (bb)
{
rtx insn;
- rtx bb_end;
int to_head;
- insn = BB_HEAD (bb);
- bb_end = BB_END (bb);
to_head = 0;
-
- while (insn != bb_end)
+ FOR_BB_INSNS (bb, insn)
{
/* Don't count debug instructions to avoid them affecting
decision choices. */
if (NONDEBUG_INSN_P (insn))
to_bb_head[INSN_UID (insn)] = to_head++;
-
- insn = NEXT_INSN (insn);
}
bb_size[bb->index] = to_head;
--- gcc/testsuite/gcc.dg/pr45105.c.jj 2010-07-28 15:29:00.000000000 +0200
+++ gcc/testsuite/gcc.dg/pr45105.c 2010-07-28 15:28:42.000000000 +0200
@@ -0,0 +1,27 @@
+/* PR debug/45105 */
+/* { dg-do compile } */
+/* { dg-options "-Os -fcompare-debug" } */
+
+extern int *baz (int *, int *);
+
+void
+bar (int *p1, int *p2)
+{
+ int n = *baz (0, 0);
+ p1[n] = p2[n];
+}
+
+void
+foo (int *p, int l)
+{
+ int a1[32];
+ int a2[32];
+ baz (a1, a2);
+ while (l)
+ {
+ if (l & 1)
+ p = baz (a2, p);
+ l--;
+ bar (a1, a2);
+ }
+}
Jakub
More information about the Gcc-patches
mailing list