[PATCH] Two more testcases for compound literal optimizations

Richard Guenther richard.guenther@gmail.com
Tue Dec 4 10:29:00 GMT 2007


On Dec 3, 2007 11:57 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> The first of these tests was miscompiled on redhat/gcc-4_1-branch where
> I've backported the compound literal optimizations - this was fixed
> by an Ada fix on the trunk, but just with an Ada testcase, I think it
> wouldn't hurt if we can now have a C testcase as well.
> The second testcase makes sure that compound literals in a compound
> literal's constructor can be optimized too.
>
> Bootstrapped/regtested on x86_64-linux, ok for trunk?

Sure - new testcases are always appreciated.

Thanks,
Richard.

> 2007-12-03  Jakub Jelinek  <jakub@redhat.com>
>
>         * gcc.c-torture/execute/20071202-1.c: New test.
>         * gcc.dg/tree-ssa/pr34146-2.c: New test.
>
> --- gcc/testsuite/gcc.c-torture/execute/20071202-1.c.jj 2007-12-02 19:26:19.000000000 +0100
> +++ gcc/testsuite/gcc.c-torture/execute/20071202-1.c    2007-12-02 19:24:28.000000000 +0100
> @@ -0,0 +1,25 @@
> +extern void abort (void);
> +struct T { int t; int r[8]; };
> +struct S { int a; int b; int c[6]; struct T d; };
> +
> +__attribute__((noinline)) void
> +foo (struct S *s)
> +{
> +  *s = (struct S) { s->b, s->a, { 0, 0, 0, 0, 0, 0 }, s->d };
> +}
> +
> +int
> +main (void)
> +{
> +  struct S s = { 6, 12, { 1, 2, 3, 4, 5, 6 },
> +                { 7, { 8, 9, 10, 11, 12, 13, 14, 15 } } };
> +  foo (&s);
> +  if (s.a != 12 || s.b != 6
> +      || s.c[0] || s.c[1] || s.c[2] || s.c[3] || s.c[4] || s.c[5])
> +    abort ();
> +  if (s.d.t != 7 || s.d.r[0] != 8 || s.d.r[1] != 9 || s.d.r[2] != 10
> +      || s.d.r[3] != 11 || s.d.r[4] != 12 || s.d.r[5] != 13
> +      || s.d.r[6] != 14 || s.d.r[7] != 15)
> +    abort ();
> +  return 0;
> +}
> --- gcc/testsuite/gcc.dg/tree-ssa/pr34146-2.c.jj        2007-12-03 21:22:53.000000000 +0100
> +++ gcc/testsuite/gcc.dg/tree-ssa/pr34146-2.c   2007-12-03 21:23:21.000000000 +0100
> @@ -0,0 +1,53 @@
> +/* PR c/34146 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-gimple" } */
> +
> +struct A
> +{
> +  int f1, f2, f3;
> +};
> +
> +struct B
> +{
> +  struct A g1, g2;
> +};
> +
> +struct C
> +{
> +  struct B h1, h2;
> +};
> +
> +typedef union
> +{
> +  struct C c;
> +  char s[4];
> +  long int a;
> +} T;
> +
> +void
> +foo (void)
> +{
> +  T t = (T) { { { { 0, 0, 0 }, { 0, 0, 0 } }, { { 0, 0, 0 }, { 0, 0, 0 } } } };
> +  test (&t);
> +}
> +
> +void
> +bar (void)
> +{
> +  T t = (T) { { { { 0, 0, 0 }, (struct A) { 0, 0, 0 } },
> +             (struct B) { (struct A) { 0, 0, 0 }, { 0, 0, 0 } } } };
> +  test (&t);
> +}
> +
> +void
> +baz (void)
> +{
> +  T t = (T) { { { { 0, 0, 0 }, (struct A) { 1, 1, 1 } },
> +             (struct B) { (struct A) { 0, 0, 0 }, { 1, 1, 1 } } } };
> +  test (&t);
> +}
> +
> +/* { dg-final { scan-tree-dump-not "t = D" "gimple"} } */
> +/* { dg-final { scan-tree-dump-not "t\.c\.h\[12\] = D" "gimple"} } */
> +/* { dg-final { scan-tree-dump-not "\.g\[12\] = D" "gimple"} } */
> +/* { dg-final { cleanup-tree-dump "gimple" } } */
>
>         Jakub
>



More information about the Gcc-patches mailing list