File pr34043-2.diff of Package gcc43

2008-03-01  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/35411
	* tree-sra.c (sra_build_assignment): Split conversion to
	final type to a separate statement if we are not assigning
	to a register.

Index: gcc/tree-sra.c
===================================================================
*** gcc/tree-sra.c	(revision 132767)
--- gcc/tree-sra.c	(working copy)
*************** sra_build_assignment (tree dst, tree src
*** 2139,2145 ****
    if (scalar_bitfield_p (src))
      {
        tree var, shift, width;
!       tree utype, stype, stmp, utmp;
        tree list, stmt;
        bool unsignedp = BIT_FIELD_REF_UNSIGNED (src);
  
--- 2139,2145 ----
    if (scalar_bitfield_p (src))
      {
        tree var, shift, width;
!       tree utype, stype, stmp, utmp, dtmp;
        tree list, stmt;
        bool unsignedp = BIT_FIELD_REF_UNSIGNED (src);
  
*************** sra_build_assignment (tree dst, tree src
*** 2256,2261 ****
--- 2256,2271 ----
  	    var = fold_convert (TREE_TYPE (dst), var);
  	  else
  	    var = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (dst), var);
+ 
+ 	  /* If the destination is not a register the conversion needs
+ 	     to be a separate statement.  */
+ 	  if (!is_gimple_reg (dst))
+ 	    {
+ 	      dtmp = make_rename_temp (TREE_TYPE (dst), "SR");
+ 	      stmt = build_gimple_modify_stmt (dtmp, var);
+ 	      append_to_statement_list (stmt, &list);
+ 	      var = dtmp;
+ 	    }
  	}
        stmt = build_gimple_modify_stmt (dst, var);
        append_to_statement_list (stmt, &list);