Index: gcc/gimple-fold.c
===================================================================
--- gcc/gimple-fold.c   (revision 161603)
+++ gcc/gimple-fold.c   (working copy)
@@ -1152,15 +1152,24 @@ gimplify_and_update_call_from_tree (gimp
        }
       if (laststore)
        {
-         reaching_vuse = make_ssa_name (gimple_vop (cfun), laststore);
+         if (!is_gimple_reg (lhs) && last != laststore)
+           reaching_vuse = make_ssa_name (gimple_vop (cfun), laststore);
+         else
+           {
+             reaching_vuse = gimple_vdef (stmt);
+             SSA_NAME_DEF_STMT (reaching_vuse) = laststore;
+           }
          gimple_set_vdef (laststore, reaching_vuse);
          update_stmt (laststore);
-         laststore = NULL;
        }
       new_stmt = gimple_build_assign (lhs, tmp);
-      gimple_set_vuse (new_stmt, reaching_vuse);
-      gimple_set_vdef (new_stmt, gimple_vdef (stmt));
-      move_ssa_defining_stmt_for_defs (new_stmt, stmt);
+      if (TREE_CODE (lhs) == SSA_NAME)
+       SSA_NAME_DEF_STMT (lhs) = new_stmt;
+      if (!laststore)
+       {
+         gimple_set_vuse (new_stmt, reaching_vuse);
+         gimple_set_vdef (new_stmt, gimple_vdef (stmt));
+       }
     }

   gimple_set_location (new_stmt, gimple_location (stmt));
