summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/complex-3.c17
-rw-r--r--gcc/tree-ssa-pre.c4
3 files changed, 28 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 767fd7c30c1..293b0a541fc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2005-06-18 Richard Henderson <rth@redhat.com>
+
+ PR tree-opt/22116
+ * tree-ssa-pre.c (create_expression_by_pieces): Set
+ DECL_COMPLEX_GIMPLE_REG_P.
+ (insert_into_preds_of_block): Likewise.
+
2005-06-18 Steven Bosscher <stevenb@suse.de>
* Makefile.in: Fix tree-cfgcleanup.c dependencies.
diff --git a/gcc/testsuite/gcc.c-torture/compile/complex-3.c b/gcc/testsuite/gcc.c-torture/compile/complex-3.c
new file mode 100644
index 00000000000..f12a8f9da4a
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/complex-3.c
@@ -0,0 +1,17 @@
+/* PR 22116 */
+
+void g(_Complex float);
+_Complex float f(int data, _Complex float x, _Complex float y)
+{
+ _Complex float i, t;
+ if (data)
+ {
+ i = x + __imag__ y;
+ g(i);
+ }
+ else
+ i = 5;
+ t = x + __imag__ y;
+ g(t);
+ return t * i;
+}
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index 6ec3cdc194b..a46c367d34b 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -1593,6 +1593,8 @@ create_expression_by_pieces (basic_block block, tree expr, tree stmts)
that we will return. */
temp = create_tmp_var (TREE_TYPE (expr), "pretmp");
add_referenced_tmp_var (temp);
+ if (TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
+ DECL_COMPLEX_GIMPLE_REG_P (temp) = 1;
newexpr = build (MODIFY_EXPR, TREE_TYPE (expr), temp, newexpr);
name = make_ssa_name (temp, newexpr);
TREE_OPERAND (newexpr, 0) = name;
@@ -1699,6 +1701,8 @@ insert_into_preds_of_block (basic_block block, value_set_node_t node,
/* Now build a phi for the new variable. */
temp = create_tmp_var (type, tmpname);
add_referenced_tmp_var (temp);
+ if (TREE_CODE (type) == COMPLEX_TYPE)
+ DECL_COMPLEX_GIMPLE_REG_P (temp) = 1;
temp = create_phi_node (temp, block);
NECESSARY (temp) = 0;
VEC_safe_push (tree, heap, inserted_exprs, temp);