From 0563fe8b47eaba2bf82f03c13260d01aa6e026e8 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sat, 18 Jun 2005 01:51:44 -0700 Subject: [PATCH] re PR tree-optimization/22103 (Statement makes a memory store .., complex) PR tree-opt/22103 * tree-sra.c (generate_copy_inout): Handle SSA_NAME complex destinations. From-SVN: r101150 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/gcc.c-torture/compile/complex-2.c | 16 ++++++++++++++++ gcc/tree-sra.c | 17 ++++++++++++++++- 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/complex-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f35e4fffb67..dd22a3f1946 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-06-18 Richard Henderson + + PR tree-opt/22103 + * tree-sra.c (generate_copy_inout): Handle SSA_NAME complex + destinations. + 2005-06-17 Richard Henderson * 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 index 00000000000..4462eee4574 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/complex-2.c @@ -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; +} + diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 7abdd3de34e..e54598a4b3b 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -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); -- 2.30.2