On Wed, Apr 20, 2011 at 2:42 AM, Easwaran Raman <era...@google.com> wrote:
> Hi,
>  This patch allows variables whose type  transitively contains a union to 
> share stack slots if -fno-strict-aliasing is used.
>
>  Bootstraps on x86_64 with no test regressions. Also tested by changing 
> flag_strict_aliasing to 0 by default. Bootstraps and no test regressions when 
> compared to flag_strict_aliasing=0 without this patch.
>
> OK for trunk?

Ok.

Thanks,
Richard.

> -Easwaran
>
> 2011-04-19  Easwaran Raman  <era...@google.com>
>
>        * gcc/testsuite/gcc.dg/stack-layout-1.c: New
>        * gcc/cfgexpand.c (add_alias_set_conflicts): Add conflicts
>        with a variable containing union type only with
>        -fstrict-aliasing.
>
> Index: gcc/testsuite/gcc.dg/stack-layout-1.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/stack-layout-1.c       (revision 0)
> +++ gcc/testsuite/gcc.dg/stack-layout-1.c       (revision 0)
> @@ -0,0 +1,25 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fno-strict-aliasing -fdump-rtl-expand" } */
> +union U {
> +  int a;
> +  float b;
> +};
> +struct A {
> +  union U u1;
> +  char a[100];
> +};
> +void bar (struct A *);
> +void foo ()
> +  {
> +    {
> +      struct A a;
> +      bar (&a);
> +    }
> +    {
> +      struct A a;
> +      bar (&a);
> +    }
> +  }
> +
> +/* { dg-final { scan-rtl-dump-times "Partition" 1 "expand" } } */
> +/* { dg-final { cleanup-rtl-dump "expand" } } */
> Index: gcc/cfgexpand.c
> ===================================================================
> --- gcc/cfgexpand.c     (revision 172657)
> +++ gcc/cfgexpand.c     (working copy)
> @@ -373,8 +373,9 @@ add_alias_set_conflicts (void)
>                 to elements will conflict.  In case of unions we have
>                 to be careful as type based aliasing rules may say
>                 access to the same memory does not conflict.  So play
> -                safe and add a conflict in this case.  */
> -             || contains_union)
> +                safe and add a conflict in this case when
> +                 -fstrict-aliasing is used.  */
> +              || (contains_union && flag_strict_aliasing))
>            add_stack_var_conflict (i, j);
>        }
>     }
>
> --
> This patch is available for review at http://codereview.appspot.com/4444051
>

Reply via email to