From: Richard Henderson Date: Sun, 19 Jun 2005 06:32:31 +0000 (-0700) Subject: re PR tree-optimization/22116 (PRE of COMPLEX_EXPR causes ICE) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=aad97b9bddd3ba89e6b39f8c28c4fe714f65fd52;p=gcc.git re PR tree-optimization/22116 (PRE of COMPLEX_EXPR causes ICE) PR tree-opt/22116 * tree-ssa-pre.c (create_expression_by_pieces): Set DECL_COMPLEX_GIMPLE_REG_P. (insert_into_preds_of_block): Likewise. From-SVN: r101177 --- 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 + + 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 * 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);