re PR tree-optimization/22103 (Statement makes a memory store .., complex)
authorRichard Henderson <rth@redhat.com>
Sat, 18 Jun 2005 08:51:44 +0000 (01:51 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Sat, 18 Jun 2005 08:51:44 +0000 (01:51 -0700)
        PR tree-opt/22103
        * tree-sra.c (generate_copy_inout): Handle SSA_NAME complex
        destinations.

From-SVN: r101150

gcc/ChangeLog
gcc/testsuite/gcc.c-torture/compile/complex-2.c [new file with mode: 0644]
gcc/tree-sra.c

index f35e4ff..dd22a3f 100644 (file)
@@ -1,3 +1,9 @@
+2005-06-18  Richard Henderson  <rth@redhat.com>
+
+       PR tree-opt/22103
+       * tree-sra.c (generate_copy_inout): Handle SSA_NAME complex
+       destinations.
+
 2005-06-17  Richard Henderson  <rth@redhat.com>
 
         * tree-vect-transform.c (vect_do_peeling_for_loop_bound): Use
diff --git a/gcc/testsuite/gcc.c-torture/compile/complex-2.c b/gcc/testsuite/gcc.c-torture/compile/complex-2.c
new file mode 100644 (file)
index 0000000..4462eee
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR 22103 */
+
+_Complex float f(void);
+void *a;
+
+_Complex float g(void)
+{
+  _Complex float x = f();
+  __imag__ x = 1.0;
+  if (__imag__ x != 1.0)
+    {
+      a = &x;
+    }
+  return x;
+}
+
index 7abdd3d..e54598a 100644 (file)
@@ -1526,7 +1526,22 @@ generate_copy_inout (struct sra_elt *elt, bool copy_out, tree expr,
   struct sra_elt *c;
   tree t;
 
-  if (elt->replacement)
+  if (!copy_out && TREE_CODE (expr) == SSA_NAME
+      && TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
+    {
+      tree r, i;
+
+      c = lookup_element (elt, integer_zero_node, NULL, NO_INSERT);
+      r = c->replacement;
+      c = lookup_element (elt, integer_one_node, NULL, NO_INSERT);
+      i = c->replacement;
+
+      t = build (COMPLEX_EXPR, elt->type, r, i);
+      t = build (MODIFY_EXPR, void_type_node, expr, t);
+      SSA_NAME_DEF_STMT (expr) = t;
+      append_to_statement_list (t, list_p);
+    }
+  else if (elt->replacement)
     {
       if (copy_out)
        t = build (MODIFY_EXPR, void_type_node, elt->replacement, expr);