* config/c4x/c4x.c (c4x_rptb_insert): Make more robust.
authorMichael Hayes <m.hayes@elec.canterbury.ac.nz>
Sun, 30 Jul 2000 08:29:01 +0000 (08:29 +0000)
committerMichael Hayes <m.hayes@gcc.gnu.org>
Sun, 30 Jul 2000 08:29:01 +0000 (08:29 +0000)
From-SVN: r35338

gcc/ChangeLog
gcc/config/c4x/c4x.c

index a38290fba0571e1779d247f94c8ecb6e3a26afbf..f8c208286b7fd5b45a4a0a47adc4dd665a7544f9 100644 (file)
@@ -1,5 +1,9 @@
 2000-07-30  Michael Hayes  <m.hayes@elec.canterbury.ac.nz>
-       
+
+       * config/c4x/c4x.c (c4x_rptb_insert): Make more robust.
+
+2000-07-30  Michael Hayes  <m.hayes@elec.canterbury.ac.nz>
+
        * config/c4x/c4x.h (ASM_FORMAT_PRIVATE_NAME): Output $ in label.
 
 2000-07-30  Michael Hayes  <m.hayes@elec.canterbury.ac.nz>
index 9972f472f68c40b92deec185e09ea6e46e231fb4..dcc48ff7873ccca3b4deb1c84ef652539d200eb8 100644 (file)
@@ -2214,6 +2214,7 @@ c4x_rptb_insert (insn)
 {
   rtx end_label;
   rtx start_label;
+  rtx new_start_label;
   rtx count_reg;
 
   /* If the count register has not been allocated to RC, say if
@@ -2227,21 +2228,32 @@ c4x_rptb_insert (insn)
   /* Extract the start label from the jump pattern (rptb_end).  */
   start_label = XEXP (XEXP (SET_SRC (XVECEXP (PATTERN (insn), 0, 0)), 1), 0);
   
-  /* We'll have to update the basic blocks.  */
   end_label = gen_label_rtx ();
+  LABEL_NUSES (end_label)++;
   emit_label_after (end_label, insn);
 
+  new_start_label = gen_label_rtx ();
+  LABEL_NUSES (new_start_label)++;
+
   for (; insn; insn = PREV_INSN (insn))
-    if (insn == start_label)
-      break;
+    {
+      if (insn == start_label)
+        break;
+      if (GET_CODE (insn) == JUMP_INSN &&
+         JUMP_LABEL (insn) == start_label)
+       redirect_jump (insn, new_start_label, 0);
+    }
   if (! insn)
     fatal_insn ("c4x_rptb_insert: Cannot find start label", start_label);
 
-  /* We'll have to update the basic blocks.  */
+  emit_label_after (new_start_label, insn);
+
   if (TARGET_RPTS && c4x_rptb_rpts_p (PREV_INSN (insn), 0))
-    emit_insn_before (gen_rpts_top (start_label, end_label), insn);
+    emit_insn_after (gen_rpts_top (new_start_label, end_label), insn);
   else
-    emit_insn_before (gen_rptb_top (start_label, end_label), insn);
+    emit_insn_after (gen_rptb_top (new_start_label, end_label), insn);
+  if (LABEL_NUSES (start_label) == 0)
+    delete_insn (start_label);
 }