On 08/05/2014 10:54 AM, Richard Biener wrote:
The better interface for this is gimple_assign_set_rhs_from_tree. But it
seems the code can be re-structured to avoid re-setting the RHS by
simply doing
if (!is_gimple_reg (x)
&& is_gimple_reg_type (TREE_TYPE (x))
x = init_tmp_var (root, x, &gsi);
right after x is assigned to?
Ok with that change.
That also works, I've committed the following.
Bernd
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f22f09f..c5ef281 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2014-08-25 Bernd Schmidt <ber...@codesourcery.com>
+
+ * tree-nested.c (finalize_nesting_tree_1): Initialize temporary earlier
+ rather than modifying the stmt.
+
2014-08-25 Jan-Benedict Glaw <jbg...@lug-owl.de>
* config/rs6000/rs6000.c (rs6000_return_in_msb): Fix fallout from
diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c
index 82cec96..6ca594d 100644
--- a/gcc/tree-nested.c
+++ b/gcc/tree-nested.c
@@ -2715,10 +2715,6 @@ finalize_nesting_tree_1 (struct nesting_info *root)
else
x = p;
- y = build3 (COMPONENT_REF, TREE_TYPE (field),
- root->frame_decl, field, NULL_TREE);
- stmt = gimple_build_assign (y, x);
- gimple_seq_add_stmt (&stmt_list, stmt);
/* If the assignment is from a non-register the stmt is
not valid gimple. Make it so by using a temporary instead. */
if (!is_gimple_reg (x)
@@ -2726,8 +2722,12 @@ finalize_nesting_tree_1 (struct nesting_info *root)
{
gimple_stmt_iterator gsi = gsi_last (stmt_list);
x = init_tmp_var (root, x, &gsi);
- gimple_assign_set_rhs1 (stmt, x);
}
+
+ y = build3 (COMPONENT_REF, TREE_TYPE (field),
+ root->frame_decl, field, NULL_TREE);
+ stmt = gimple_build_assign (y, x);
+ gimple_seq_add_stmt (&stmt_list, stmt);
}
}