From fa1ad02f390117ee5911bf180b78a07a16202f9c Mon Sep 17 00:00:00 2001 From: davem Date: Sun, 30 Oct 2011 07:48:05 +0000 Subject: [PATCH] Properly limit backwards label scanning in reorg. * 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 | 7 +++++++ gcc/emit-rtl.c | 15 --------------- gcc/reorg.c | 17 ++++++++++++++++- gcc/rtl.h | 1 - 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0eb34e5..e9bda2b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2011-10-30 David S. Miller + + * 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 * modulo-sched.c (generate_prolog_epilog): Mark prolog and epilog diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 8465237..c2bc56b 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -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. */ diff --git a/gcc/reorg.c b/gcc/reorg.c index f77a3a0..40d73a7 100644 --- a/gcc/reorg.c +++ b/gcc/reorg.c @@ -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; +} + /* 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)))) diff --git a/gcc/rtl.h b/gcc/rtl.h index 81958a5..41536be 100644 --- 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); -- 2.7.4