diff options
author | David S. Miller <davem@davemloft.net> | 2011-10-30 07:48:05 +0000 |
---|---|---|
committer | David S. Miller <davem@gcc.gnu.org> | 2011-10-30 00:48:05 -0700 |
commit | dbeee82924bc45e9990c2205e2768a52ffda5fbf (patch) | |
tree | 6927a78bf433978e525defc0a83618ff6bb2613a /gcc | |
parent | cc1efdff706c78c874ab8ff65264004fdc8a7081 (diff) | |
download | gcc-dbeee82924bc45e9990c2205e2768a52ffda5fbf.zip gcc-dbeee82924bc45e9990c2205e2768a52ffda5fbf.tar.gz gcc-dbeee82924bc45e9990c2205e2768a52ffda5fbf.tar.bz2 |
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.
From-SVN: r180674
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/emit-rtl.c | 15 | ||||
-rw-r--r-- | gcc/reorg.c | 17 | ||||
-rw-r--r-- | 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 <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 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)))) @@ -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); |