summaryrefslogtreecommitdiff
path: root/gcc/gimplify.c
diff options
context:
space:
mode:
authorpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>2007-01-03 23:00:40 +0000
committerpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>2007-01-03 23:00:40 +0000
commit1dfbdb0f03b9e735c668930b0147672b4fa44269 (patch)
treeb053fdcdb1a176efa4edf13451e8d6b696ccaeb4 /gcc/gimplify.c
parent224f24454c2501497c7fc75d731fc948f215748e (diff)
downloadgcc-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.c81
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