diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a631aaa738d13bab456ba155055573ebfe5e27aa..3e000cd424fb09234dec0f5f9d83023041716b67 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-10-20 Jakub Jelinek <jakub@redhat.com> + + PR debug/41340 + * loop-invariant.c (calculate_loop_reg_pressure): Don't count regs + referenced just in DEBUG_INSNs. + 2009-10-20 Richard Guenther <rguenther@suse.de> * gimple.c (gimple_types_compatible_p): Simplify. Move diff --git a/gcc/loop-invariant.c b/gcc/loop-invariant.c index 7fb6cf05fd45d0b2f3d02454ffcc637cfa8a7e84..8cbfdb30a92200d5e7fef8172e0979c73f7a62b4 100644 --- a/gcc/loop-invariant.c +++ b/gcc/loop-invariant.c @@ -1785,7 +1785,7 @@ calculate_loop_reg_pressure (void) FOR_BB_INSNS (bb, insn) { - if (! INSN_P (insn)) + if (! NONDEBUG_INSN_P (insn)) continue; mark_ref_regs (PATTERN (insn)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1868e09da721034a51ea0dbd824be7bf35b65fa5..7a862affcbb5e0b8c0bb588e18dcf4d1ab945083 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-10-20 Jakub Jelinek <jakub@redhat.com> + + PR debug/41340 + * gcc.dg/pr41340.c: New test. + 2009-10-20 Eric Botcazou <ebotcazou@adacore.com> * gnat.dg/discr21.ad[sb]: New test. diff --git a/gcc/testsuite/gcc.dg/pr41340.c b/gcc/testsuite/gcc.dg/pr41340.c new file mode 100644 index 0000000000000000000000000000000000000000..bafa61f5185d358dacb26be7024a639300b779f8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr41340.c @@ -0,0 +1,68 @@ +/* PR debug/41340 */ +/* { dg-do compile } */ +/* { dg-options "-O3 -g -fcompare-debug" } */ +/* { dg-options "-O3 -g -fcompare-debug -march=i686" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ + +typedef struct { int t; } *T; +struct S1 { unsigned s1; }; +struct S2 { struct S1 s2; }; +struct S3 { unsigned s3; struct S2 **s4; }; +struct S5 { struct S2 *s5; }; + +extern void fn0 (void) __attribute__ ((__noreturn__)); +T fn6 (struct S3); +void fn7 (void); + +static inline __attribute__((always_inline)) int +fn1 (const struct S1 *x) +{ + return x->s1; +} + +static inline __attribute__((always_inline)) int +fn2 (const struct S1 *x, unsigned y) +{ + if (y >= x->s1) + fn0 (); + return 0; +} + +static inline __attribute__((always_inline)) int +fn3 (struct S3 x) +{ + return (x.s3 == fn1 (*x.s4 ? &(*x.s4)->s2 : 0)); +} + +static inline __attribute__((always_inline)) int +fn4 (struct S3 x) +{ + return fn2 (&(*x.s4)->s2, x.s3); +} + +int +fn5 (struct S3 x, T *y) +{ + if (!fn3 (x)) + { + *y = (T) (long) fn4 (x); + return 1; + } + return 0; +} + +void +test (struct S5 *x) +{ + struct S3 a; + T b; + unsigned char c = 0; + a.s4 = &x->s5; + while (fn5 (a, &b)) + if (!(b->t & 8)) + c = 1; + a.s4 = &x->s5; + while ((b = fn6 (a))) + ; + if (!c) + fn7 (); +}