diff options
author | pinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-01-03 23:00:40 +0000 |
---|---|---|
committer | pinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-01-03 23:00:40 +0000 |
commit | 1dfbdb0f03b9e735c668930b0147672b4fa44269 (patch) | |
tree | b053fdcdb1a176efa4edf13451e8d6b696ccaeb4 /gcc/gimplify.c | |
parent | 224f24454c2501497c7fc75d731fc948f215748e (diff) | |
download | gcc-1dfbdb0f03b9e735c668930b0147672b4fa44269.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@120404 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r-- | gcc/gimplify.c | 81 |
1 files changed, 41 insertions, 40 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 1876f64808a..d14e01e8202 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -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 |