2013-11-26 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 26 Nov 2013 09:04:44 +0000 (09:04 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 26 Nov 2013 09:04:44 +0000 (09:04 +0000)
PR tree-optimization/59287
* tree-ssa-structalias.c (get_constraint_for_component_ref):
Remove no longer necessary special-casing of union accesses.

* gcc.dg/tree-ssa/alias-29.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@205380 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/alias-29.c [new file with mode: 0644]
gcc/tree-ssa-structalias.c

index 17fafa1..9a820b5 100644 (file)
@@ -1,5 +1,11 @@
 2013-11-26  Richard Biener  <rguenther@suse.de>
 
+       PR tree-optimization/59287
+       * tree-ssa-structalias.c (get_constraint_for_component_ref):
+       Remove no longer necessary special-casing of union accesses.
+
+2013-11-26  Richard Biener  <rguenther@suse.de>
+
        * pretty-print.c (output_buffer::~output_buffer): Really
        free the obstacks.
 
index 2e9ff15..25d8873 100644 (file)
@@ -1,3 +1,8 @@
+2013-11-26  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/59287
+       * gcc.dg/tree-ssa/alias-29.c: New testcase.
+
 2013-11-25  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/54485
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/alias-29.c b/gcc/testsuite/gcc.dg/tree-ssa/alias-29.c
new file mode 100644 (file)
index 0000000..4d57ca8
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+
+union X {
+    int i;
+    void *p;
+};
+void bar (int);
+
+int * __attribute__((noinline,noclone))
+baz (int *p) { return p; }
+
+void foo (union X *x)
+{
+  struct Y { int i; } ystruct = {};
+  ystruct.i = * baz (&ystruct.i);
+  bar (x->i);
+}
+
+/* DSE and then DCE should be able to remove all uses of ystruct.
+   Formerly the union access for the parameter to bar let 'anything'
+   escape which made the call to bar possibly use ystruct and thus
+   prevent the store to ystruct.i from being eliminated.  The call to
+   baz makes sure that ystruct has its address taken.  */
+
+/* { dg-final { scan-tree-dump-not "ystruct" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
index 2851eae..6482e68 100644 (file)
@@ -3163,29 +3163,6 @@ get_constraint_for_component_ref (tree t, vec<ce_s> *results,
       return;
     }
 
-  /* Handle type-punning through unions.  If we are extracting a pointer
-     from a union via a possibly type-punning access that pointer
-     points to anything, similar to a conversion of an integer to
-     a pointer.  */
-  if (!lhs_p)
-    {
-      tree u;
-      for (u = t;
-          TREE_CODE (u) == COMPONENT_REF || TREE_CODE (u) == ARRAY_REF;
-          u = TREE_OPERAND (u, 0))
-       if (TREE_CODE (u) == COMPONENT_REF
-           && TREE_CODE (TREE_TYPE (TREE_OPERAND (u, 0))) == UNION_TYPE)
-         {
-           struct constraint_expr temp;
-
-           temp.offset = 0;
-           temp.var = anything_id;
-           temp.type = ADDRESSOF;
-           results->safe_push (temp);
-           return;
-         }
-    }
-
   t = get_ref_base_and_extent (t, &bitpos, &bitsize, &bitmaxsize);
 
   /* Pretend to take the address of the base, we'll take care of