diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 430e62bc6cb97df5047262b2ca116539ac912305..5e40c62f8a7f7ecc460ebbd134e6bc581172f672 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+Mon Sep  6 02:42:36 1999  Jeffrey A Law  (law@cygnus.com)
+
+	* cse.c (delete_trivially_dead_insns): Do not skip the last
+	insn if it is a real insn.
+
 Sun Sep  5 18:57:42 1999  Mark Mitchell  <mark@codesourcery.com>
 
 	* Makefile.in (ggc-simple.o): Depend on hash.h.
diff --git a/gcc/cse.c b/gcc/cse.c
index 68fe7b04a9240855cb7fff5dbaa000d016c2a397..d1a2487cb41061fa5d5aef876fa4f7f7ad4e2ea2 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -9135,8 +9135,16 @@ delete_trivially_dead_insns (insns, nreg)
 
   /* Go from the last insn to the first and delete insns that only set unused
      registers or copy a register to itself.  As we delete an insn, remove
-     usage counts for registers it uses.  */
-  for (insn = prev_real_insn (get_last_insn ()); insn; insn = prev)
+     usage counts for registers it uses. 
+
+     The first jump optimization pass may leave a real insn as the last
+     insn in the function.   We must not skip that insn or we may end
+     up deleting code that is not really dead.   */
+  insn = get_last_insn ();
+  if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
+    insn = prev_real_insn (insn);
+
+  for ( ; insn; insn = prev)
     {
       int live_insn = 0;
       rtx note;