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/051