diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5f23f3cd69469149a066e214732bd1c2de38a86a..69e2eacbc3c8577bf42d4ff095dfed104f604223 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2001-04-04 Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
+
+	* emit-rtl.c (mark_label_nuses) Increment the label uses for
+	all labels present in rtx.
+	(try_split) Call new function for all split insns.
+
 2001-04-04  Jakub Jelinek  <jakub@redhat.com>
 
 	* recog.c (validate_replace_rtx_1): Instead of aborting just make
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 7b715c6f69dd027f5e0361d3aa3355622b57560d..2acb55547fa5d28d2530109a21d04bcc6b932c0f 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -177,6 +177,7 @@ static void mark_sequence_stack         PARAMS ((struct sequence_stack *));
 static void unshare_all_rtl_1		PARAMS ((rtx));
 static void unshare_all_decls		PARAMS ((tree));
 static void reset_used_decls		PARAMS ((tree));
+static void mark_label_nuses		PARAMS ((rtx));
 static hashval_t const_int_htab_hash    PARAMS ((const void *));
 static int const_int_htab_eq            PARAMS ((const void *,
 						 const void *));
@@ -2521,6 +2522,32 @@ prev_cc0_setter (insn)
   return insn;
 }
 #endif
+
+/* Increment the label uses for all labels present in rtx.  */
+
+static void
+mark_label_nuses(x)
+    rtx x;
+{
+  register enum rtx_code code;
+  register int i, j;
+  register const char *fmt;
+
+  code = GET_CODE (x);
+  if (code == LABEL_REF)
+    LABEL_NUSES (XEXP (x, 0))++;
+
+  fmt = GET_RTX_FORMAT (code);
+  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
+    {
+      if (fmt[i] == 'e')
+        mark_label_nuses (XEXP (x, i));
+      else if (fmt[i] == 'E')
+        for (j = XVECLEN (x, i) - 1; j >= 0; j--)
+	  mark_label_nuses (XVECEXP (x, i, j));
+    }
+}
+
 
 /* Try splitting insns that can be split for better scheduling.
    PAT is the pattern which might split.
@@ -2580,6 +2607,13 @@ try_split (pat, trial, last)
 		CALL_INSN_FUNCTION_USAGE (XVECEXP (seq, 0, i))
 		  = CALL_INSN_FUNCTION_USAGE (trial);
 
+	  /* If there are LABELS inside the split insns increment the
+	     usage count so we don't delete the label.  */
+	  if (GET_CODE (trial) == INSN)
+	    for (i = XVECLEN (seq, 0) - 1; i >= 0; i--)
+	      if (GET_CODE (XVECEXP (seq, 0, i)) == INSN)
+	        mark_label_nuses (PATTERN (XVECEXP (seq, 0, i)));
+
 	  tem = emit_insn_after (seq, before);
 
 	  delete_insn (trial);