]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Properly limit backwards label scanning in reorg.
authorDavid S. Miller <davem@davemloft.net>
Sun, 30 Oct 2011 07:48:05 +0000 (07:48 +0000)
committerDavid S. Miller <davem@gcc.gnu.org>
Sun, 30 Oct 2011 07:48:05 +0000 (00:48 -0700)
* 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.

From-SVN: r180674

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

index 0eb34e5efad126e2bd5f64d5e9fe05f07282a941..e9bda2b793a7f51ad0f20df74e2a3897bc63d61f 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 8465237da60f7a81f7afecb027a040d1a0eb5436..c2bc56b9758f7fb0104b9f0637e2bb8e1fc3fc4c 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 f77a3a0f1d09d56fdff6c6427424f565205aacdf..40d73a76a7174a68536482218d33bf7b4e84a9b2 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 81958a59c2ef9e4c5712c8525a3e2f1fba06ac92..41536bea02c073326feb48c468c5cec30a06dd00 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);