OSDN Git Service

* rtl.h (skip_consecutive_labels): Declare.
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 28 May 2004 06:27:31 +0000 (06:27 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 28 May 2004 06:27:31 +0000 (06:27 +0000)
* emit-rtl.c (skip_consecutive_labels): New function.
* reorg.c (relax_delay_slots, dbr_schedule): Use it.
* jump.c (follow_jumps): Say what null return values mean.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@82357 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/emit-rtl.c
gcc/jump.c
gcc/reorg.c
gcc/rtl.h

index b45bea0..618d6d4 100644 (file)
@@ -1,3 +1,10 @@
+2004-05-28  Richard Sandiford  <rsandifo@redhat.com>
+
+       * rtl.h (skip_consecutive_labels): Declare.
+       * emit-rtl.c (skip_consecutive_labels): New function.
+       * reorg.c (relax_delay_slots, dbr_schedule): Use it.
+       * jump.c (follow_jumps): Say what null return values mean.
+
 2004-05-28  Kaz Kojima  <kkojima@gcc.gnu.org>
 
        PR target/13250
index bc23bb7..c3503ee 100644 (file)
@@ -3109,6 +3109,21 @@ prev_label (rtx insn)
 
   return insn;
 }
+
+/* Return the last label to mark the same position as LABEL.  Return null
+   if LABEL itself is null.  */
+
+rtx
+skip_consecutive_labels (rtx label)
+{
+  rtx insn;
+
+  for (insn = label; insn != 0 && !INSN_P (insn); insn = NEXT_INSN (insn))
+    if (LABEL_P (insn))
+      label = insn;
+
+  return label;
+}
 \f
 #ifdef HAVE_cc0
 /* INSN uses CC0 and is being moved into a delay slot.  Set up REG_CC_SETTER
index 2b46f7b..6ead322 100644 (file)
@@ -999,6 +999,7 @@ sets_cc0_p (rtx x)
 \f
 /* Follow any unconditional jump at LABEL;
    return the ultimate label reached by any such chain of jumps.
+   Return null if the chain ultimately leads to a return instruction.
    If LABEL is not followed by a jump, return LABEL.
    If the chain loops or we can't find end, return LABEL,
    since that tells caller to avoid changing the insn.
index dd9737b..ff32162 100644 (file)
@@ -3079,11 +3079,7 @@ relax_delay_slots (rtx first)
          && (condjump_p (insn) || condjump_in_parallel_p (insn))
          && (target_label = JUMP_LABEL (insn)) != 0)
        {
-         target_label = follow_jumps (target_label);
-         /* See comment further down why we must use next_real_insn here,
-            instead of next_active_insn.  */
-         target_label = prev_label (next_real_insn (target_label));
-
+         target_label = skip_consecutive_labels (follow_jumps (target_label));
          if (target_label == 0)
            target_label = find_end_label ();
 
@@ -3231,14 +3227,8 @@ relax_delay_slots (rtx first)
        {
          /* If this jump goes to another unconditional jump, thread it, but
             don't convert a jump into a RETURN here.  */
-         trial = follow_jumps (target_label);
-         /* We use next_real_insn instead of next_active_insn, so that
-            the special USE insns emitted by reorg won't be ignored.
-            If they are ignored, then they will get deleted if target_label
-            is now unreachable, and that would cause mark_target_live_regs
-            to fail.  */
-         trial = prev_label (next_real_insn (trial));
-         if (trial == 0 && target_label != 0)
+         trial = skip_consecutive_labels (follow_jumps (target_label));
+         if (trial == 0)
            trial = find_end_label ();
 
          if (trial != target_label
@@ -3621,7 +3611,7 @@ dbr_schedule (rtx first, FILE *file)
       if (GET_CODE (insn) == JUMP_INSN
          && (condjump_p (insn) || condjump_in_parallel_p (insn))
          && JUMP_LABEL (insn) != 0
-         && ((target = prev_label (next_active_insn (JUMP_LABEL (insn))))
+         && ((target = skip_consecutive_labels (JUMP_LABEL (insn)))
              != JUMP_LABEL (insn)))
        redirect_jump (insn, target, 1);
     }
index d7bfc92..5c0be4d 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1695,6 +1695,7 @@ extern rtx next_active_insn (rtx);
 extern int active_insn_p (rtx);
 extern rtx prev_label (rtx);
 extern rtx next_label (rtx);
+extern rtx skip_consecutive_labels (rtx);
 extern rtx next_cc0_user (rtx);
 extern rtx prev_cc0_setter (rtx);