OSDN Git Service

Properly limit backwards label scanning in reorg.
authordavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 30 Oct 2011 07:48:05 +0000 (07:48 +0000)
committerdavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 30 Oct 2011 07:48:05 +0000 (07:48 +0000)
* reorg.c (label_before_next_insn): New function.
(relax_delay_slots): Use it instead of prev_label.
* rtl.h (prev_label): Delete declaration.
* emit-rtl.c (prev_label): Remove.

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

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

index 0eb34e5..e9bda2b 100644 (file)
@@ -1,3 +1,10 @@
+2011-10-30  David S. Miller  <davem@davemloft.net>
+
+       * reorg.c (label_before_next_insn): New function.
+       (relax_delay_slots): Use it instead of prev_label.
+       * rtl.h (prev_label): Delete declaration.
+       * emit-rtl.c (prev_label): Remove.
+
 2011-10-30  Revital Eres  <revital.eres@linaro.org>
 
        * modulo-sched.c (generate_prolog_epilog): Mark prolog and epilog
index 8465237..c2bc56b 100644 (file)
@@ -3330,21 +3330,6 @@ next_label (rtx insn)
   return insn;
 }
 
-/* Return the last CODE_LABEL before the insn INSN, or 0 if there is none.  */
-
-rtx
-prev_label (rtx insn)
-{
-  while (insn)
-    {
-      insn = PREV_INSN (insn);
-      if (insn == 0 || LABEL_P (insn))
-       break;
-    }
-
-  return insn;
-}
-
 /* Return the last label to mark the same position as LABEL.  Return LABEL
    itself if it is null or any return rtx.  */
 
index f77a3a0..40d73a7 100644 (file)
@@ -3349,6 +3349,21 @@ delete_jump (rtx insn)
     delete_computation (insn);
 }
 
+static rtx
+label_before_next_insn (rtx x, rtx scan_limit)
+{
+  rtx insn = next_active_insn (x);
+  while (insn)
+    {
+      insn = PREV_INSN (insn);
+      if (insn == scan_limit || insn == NULL_RTX)
+       return NULL_RTX;
+      if (LABEL_P (insn))
+       break;
+    }
+  return insn;
+}
+
 \f
 /* Once we have tried two ways to fill a delay slot, make a pass over the
    code to try to improve the results and to do such things as more jump
@@ -3634,7 +3649,7 @@ relax_delay_slots (rtx first)
         identical to the one in its delay slot.  In this case, we can just
         delete the branch and the insn in its delay slot.  */
       if (next && NONJUMP_INSN_P (next)
-         && prev_label (next_active_insn (next)) == target_label
+         && label_before_next_insn (next, insn) == target_label
          && simplejump_p (insn)
          && XVECLEN (pat, 0) == 2
          && rtx_equal_p (PATTERN (next), PATTERN (XVECEXP (pat, 0, 1))))
index 81958a5..41536be 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1812,7 +1812,6 @@ extern rtx next_real_insn (rtx);
 extern rtx prev_active_insn (rtx);
 extern rtx next_active_insn (rtx);
 extern int active_insn_p (const_rtx);
-extern rtx prev_label (rtx);
 extern rtx next_label (rtx);
 extern rtx skip_consecutive_labels (rtx);
 extern rtx next_cc0_user (rtx);