cfgexpand.c (add_alias_set_conflicts): Add conflicts with a variable containing union...
authorEaswaran Raman <eraman@google.com>
Wed, 20 Apr 2011 18:34:59 +0000 (18:34 +0000)
committerEaswaran Raman <eraman@gcc.gnu.org>
Wed, 20 Apr 2011 18:34:59 +0000 (18:34 +0000)
2011-04-20  Easwaran Raman  <eraman@google.com>

* cfgexpand.c (add_alias_set_conflicts): Add conflicts with a variable
containing union type only with -fstrict-aliasing.

2011-04-20  Easwaran Raman  <eraman@google.com>

* gcc.dg/stack-layout-1.c: New test.

From-SVN: r172788

gcc/ChangeLog
gcc/cfgexpand.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/stack-layout-1.c [new file with mode: 0644]

index 86a2b832cf1e12307806f462c5ec40010f64254e..85ec2e6074793a896b795a2baf4b0ee04aae4b72 100644 (file)
@@ -1,3 +1,8 @@
+2011-04-20  Easwaran Raman  <eraman@google.com>
+
+       * cfgexpand.c (add_alias_set_conflicts): Add conflicts with a variable
+       containing union type only with -fstrict-aliasing.
+
 2011-04-20  Jim Meyering  <meyering@redhat.com>
 
        Remove useless if-before-free tests.
index a3abc8497df299eead35ea37e41e44da1532fd3f..e88bec14945876c7b51ac793e40d01508e4eca12 100644 (file)
@@ -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);
        }
     }
index 3528f3e43c2559a0decec3ea94b6c0a25497ed95..dfa5c8c00ced2997cc9a13f1ad1f48dc2316c9f1 100644 (file)
@@ -1,3 +1,7 @@
+2011-04-20  Easwaran Raman  <eraman@google.com>
+
+       * gcc.dg/stack-layout-1.c: New test.
+
 2011-04-20  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * gcc.dg/vect/vect-shift-3.c, gcc.dg/vect/vect-shift-4.c: New.
diff --git a/gcc/testsuite/gcc.dg/stack-layout-1.c b/gcc/testsuite/gcc.dg/stack-layout-1.c
new file mode 100644 (file)
index 0000000..389a4eb
--- /dev/null
@@ -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" } } */