re PR target/20353 (uclibc does not provide C99 math functions)
2007-01-03 Andrew Pinski <andrew_pinski@playstation.sony.com> PR middle-end/20353 * gimplify.c (gimplify_modify_expr_complex_part): Move below tree_to_gimple_tuple. Call tree_to_gimple_tuple when we need the value. 2007-01-03 Andrew Pinski <andrew_pinski@playstation.sony.com> PR middle-end/30353 * gcc.c-torture/compile/complex-4.c: New test. From-SVN: r120404
This commit is contained in:
parent
096be98666
commit
d9c2d2969d
4 changed files with 62 additions and 40 deletions
|
@ -1,3 +1,10 @@
|
|||
2007-01-03 Andrew Pinski <andrew_pinski@playstation.sony.com>
|
||||
|
||||
PR middle-end/20353
|
||||
* gimplify.c (gimplify_modify_expr_complex_part): Move below
|
||||
tree_to_gimple_tuple. Call tree_to_gimple_tuple when we need
|
||||
the value.
|
||||
|
||||
2007-01-03 Kazu Hirata <kazu@codesourcery.com>
|
||||
|
||||
* config/i386/i386.h (NON_STACK_REG_P, REGNO_OK_FOR_SIREG_P,
|
||||
|
|
|
@ -3467,46 +3467,6 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Promote partial stores to COMPLEX variables to total stores. *EXPR_P is
|
||||
a MODIFY_EXPR with a lhs of a REAL/IMAGPART_EXPR of a variable with
|
||||
DECL_GIMPLE_REG_P set. */
|
||||
|
||||
static enum gimplify_status
|
||||
gimplify_modify_expr_complex_part (tree *expr_p, tree *pre_p, bool want_value)
|
||||
{
|
||||
enum tree_code code, ocode;
|
||||
tree lhs, rhs, new_rhs, other, realpart, imagpart;
|
||||
|
||||
lhs = GENERIC_TREE_OPERAND (*expr_p, 0);
|
||||
rhs = GENERIC_TREE_OPERAND (*expr_p, 1);
|
||||
code = TREE_CODE (lhs);
|
||||
lhs = TREE_OPERAND (lhs, 0);
|
||||
|
||||
ocode = code == REALPART_EXPR ? IMAGPART_EXPR : REALPART_EXPR;
|
||||
other = build1 (ocode, TREE_TYPE (rhs), lhs);
|
||||
other = get_formal_tmp_var (other, pre_p);
|
||||
|
||||
realpart = code == REALPART_EXPR ? rhs : other;
|
||||
imagpart = code == REALPART_EXPR ? other : rhs;
|
||||
|
||||
if (TREE_CONSTANT (realpart) && TREE_CONSTANT (imagpart))
|
||||
new_rhs = build_complex (TREE_TYPE (lhs), realpart, imagpart);
|
||||
else
|
||||
new_rhs = build2 (COMPLEX_EXPR, TREE_TYPE (lhs), realpart, imagpart);
|
||||
|
||||
GENERIC_TREE_OPERAND (*expr_p, 0) = lhs;
|
||||
GENERIC_TREE_OPERAND (*expr_p, 1) = new_rhs;
|
||||
|
||||
if (want_value)
|
||||
{
|
||||
append_to_statement_list (*expr_p, pre_p);
|
||||
*expr_p = rhs;
|
||||
}
|
||||
|
||||
return GS_ALL_DONE;
|
||||
}
|
||||
|
||||
|
||||
/* Destructively convert the TREE pointer in TP into a gimple tuple if
|
||||
appropriate. */
|
||||
|
||||
|
@ -3553,6 +3513,47 @@ tree_to_gimple_tuple (tree *tp)
|
|||
}
|
||||
}
|
||||
|
||||
/* Promote partial stores to COMPLEX variables to total stores. *EXPR_P is
|
||||
a MODIFY_EXPR with a lhs of a REAL/IMAGPART_EXPR of a variable with
|
||||
DECL_GIMPLE_REG_P set. */
|
||||
|
||||
static enum gimplify_status
|
||||
gimplify_modify_expr_complex_part (tree *expr_p, tree *pre_p, bool want_value)
|
||||
{
|
||||
enum tree_code code, ocode;
|
||||
tree lhs, rhs, new_rhs, other, realpart, imagpart;
|
||||
|
||||
lhs = GENERIC_TREE_OPERAND (*expr_p, 0);
|
||||
rhs = GENERIC_TREE_OPERAND (*expr_p, 1);
|
||||
code = TREE_CODE (lhs);
|
||||
lhs = TREE_OPERAND (lhs, 0);
|
||||
|
||||
ocode = code == REALPART_EXPR ? IMAGPART_EXPR : REALPART_EXPR;
|
||||
other = build1 (ocode, TREE_TYPE (rhs), lhs);
|
||||
other = get_formal_tmp_var (other, pre_p);
|
||||
|
||||
realpart = code == REALPART_EXPR ? rhs : other;
|
||||
imagpart = code == REALPART_EXPR ? other : rhs;
|
||||
|
||||
if (TREE_CONSTANT (realpart) && TREE_CONSTANT (imagpart))
|
||||
new_rhs = build_complex (TREE_TYPE (lhs), realpart, imagpart);
|
||||
else
|
||||
new_rhs = build2 (COMPLEX_EXPR, TREE_TYPE (lhs), realpart, imagpart);
|
||||
|
||||
GENERIC_TREE_OPERAND (*expr_p, 0) = lhs;
|
||||
GENERIC_TREE_OPERAND (*expr_p, 1) = new_rhs;
|
||||
|
||||
if (want_value)
|
||||
{
|
||||
tree_to_gimple_tuple (expr_p);
|
||||
|
||||
append_to_statement_list (*expr_p, pre_p);
|
||||
*expr_p = rhs;
|
||||
}
|
||||
|
||||
return GS_ALL_DONE;
|
||||
}
|
||||
|
||||
/* Gimplify the MODIFY_EXPR node pointed to by EXPR_P.
|
||||
|
||||
modify_expr
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2007-01-03 Andrew Pinski <andrew_pinski@playstation.sony.com>
|
||||
|
||||
PR middle-end/30353
|
||||
* gcc.c-torture/compile/complex-4.c: New test.
|
||||
|
||||
2007-01-03 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* g++.dg/vect/vect.exp: Skip PowerPC targets not supporting
|
||||
|
|
9
gcc/testsuite/gcc.c-torture/compile/complex-4.c
Normal file
9
gcc/testsuite/gcc.c-torture/compile/complex-4.c
Normal file
|
@ -0,0 +1,9 @@
|
|||
/* This used to ICE because gimplify_modify_expr_complex_part was not
|
||||
updated for the GIMPLE_MODIFY_EXPR changes in that calling
|
||||
tree_to_gimple_tuple was needed. */
|
||||
|
||||
void f(void)
|
||||
{
|
||||
double _Complex Res;
|
||||
__real__ Res = __imag__ Res = 0.0;
|
||||
}
|
Loading…
Add table
Reference in a new issue