diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f5cfca8cd6bdb4567fb2e0103fbc82eb9b9b38ca..dcdefc80e5472e2349c1913007bdf7ee27570e56 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2002-06-28  Jan Hubicka  <jh@suse.cz>
+
+	* gcse.c (gcse_emit_move_after): Use gen_move_insn to produce the move.
+
 2002-06-28  Stephen Clarke  <stephen.clarke@superh.com>
 
 	* combine.c (combine_simplify_rtx): Pass the mode of the
diff --git a/gcc/gcse.c b/gcc/gcse.c
index daeaa909144e41e605324c4a9feaf8922818def1..665be1fd9a35d2b22b1230fa5fd2ce181b23d59c 100644
--- a/gcc/gcse.c
+++ b/gcc/gcse.c
@@ -5144,21 +5144,19 @@ gcse_emit_move_after (src, dest, insn)
      rtx src, dest, insn;
 {
   rtx new;
-  rtx set = single_set (insn);
+  rtx set = single_set (insn), set2;
   rtx note;
   rtx eqv;
 
   /* This should never fail since we're creating a reg->reg copy
      we've verified to be valid.  */
 
-  new = emit_insn_after (gen_rtx_SET (VOIDmode, dest, src), insn);
-
-  /* want_to_gcse_p verifies that this move will be valid.  Still this call
-     is mandatory as it may create clobbers required by the pattern.  */
-  if (insn_invalid_p (insn))
-    abort ();
+  new = emit_insn_after (gen_move_insn (dest, src), insn);
 
   /* Note the equivalence for local CSE pass.  */
+  set2 = single_set (new);
+  if (!set2 || !rtx_equal_p (SET_DEST (set2), dest))
+    return new;
   if ((note = find_reg_equal_equiv_note (insn)))
     eqv = XEXP (note, 0);
   else