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);
 	}
     }
 

Reply via email to