diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1437ce664decc4d87036e5ecf7b9e675c57c1489..cddfb3968e35013c3b874df47c7f50f3b2820f8e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2009-10-18 Jakub Jelinek <jakub@redhat.com> + + Port from redhat/gcc-4_4-branch: + 2009-10-08 Jakub Jelinek <jakub@redhat.com> + * gcc.dg/debug/vta-2.c: New test. + + 2009-09-30 Alexandre Oliva <aoliva@redhat.com> + * gcc.dg/debug/vta-1.c: New. + 2009-10-19 Eric Botcazou <ebotcazou@adacore.com> * gnat.dg/noreturn2.ad[sb]: New test. diff --git a/gcc/testsuite/gcc.dg/debug/vta-1.c b/gcc/testsuite/gcc.dg/debug/vta-1.c new file mode 100644 index 0000000000000000000000000000000000000000..414083a09c019702636585142b6422c62e225d08 --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/vta-1.c @@ -0,0 +1,34 @@ +/* https://bugzilla.redhat.com/show_bug.cgi?id=521991#c5 + + Distilled from Linux XFS source code. foo, inlined into bar, ends + up with debug stmts referencing the addressable variable b. + Optimization made it non-addressable, and then completely optimized + away, before we got a chance to rename (and discard) the occurrence + in the debug stmt. When we did, we crashed, attempting to rename + an unreference variable. */ + +/* { dg-do compile } */ + +static inline int +foo (void *x, unsigned y) +{ + unsigned z = *(unsigned long *) x % y; + *(unsigned long *) x = *(unsigned long *) x / y; + return z; +} + +struct S +{ + unsigned t; +}; + +void +bar (struct S *x, int *y) +{ + int a = 0; + unsigned long b = x->t; + foo (&b, x->t); + for (;; a++) + if (b) + *y = 1; +} diff --git a/gcc/testsuite/gcc.dg/debug/vta-2.c b/gcc/testsuite/gcc.dg/debug/vta-2.c new file mode 100644 index 0000000000000000000000000000000000000000..5d44262ec76fbe803beb5d24ff01f7be0f18a91b --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/vta-2.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ + +static int +bar (void *a, unsigned int b, int n) +{ + int c = *(unsigned long *) a % b; + *(unsigned long *) a = (int) (*(unsigned long *) a) / b; + return c; +} + +int +foo (unsigned long x, int *y, int z) +{ + int level; + for (level = 0; level < *y; level++) + { + bar (&x, z, sizeof (x)); + if (x) + return *y - 1; + } +}