From: Richard Sandiford Date: Fri, 28 May 2004 06:27:31 +0000 (+0000) Subject: rtl.h (skip_consecutive_labels): Declare. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6c2511d34e54923dd7c2195dff882ffcffaa9631;p=gcc.git rtl.h (skip_consecutive_labels): Declare. * 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. From-SVN: r82357 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b45bea0c300..618d6d4dc2d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-05-28 Richard Sandiford + + * 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 PR target/13250 diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index bc23bb7beba..c3503ee8f03 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -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; +} #ifdef HAVE_cc0 /* INSN uses CC0 and is being moved into a delay slot. Set up REG_CC_SETTER diff --git a/gcc/jump.c b/gcc/jump.c index 2b46f7bc991..6ead3220773 100644 --- a/gcc/jump.c +++ b/gcc/jump.c @@ -999,6 +999,7 @@ sets_cc0_p (rtx x) /* 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. diff --git a/gcc/reorg.c b/gcc/reorg.c index dd9737b506f..ff321628137 100644 --- a/gcc/reorg.c +++ b/gcc/reorg.c @@ -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); } diff --git a/gcc/rtl.h b/gcc/rtl.h index d7bfc92c7ec..5c0be4dc939 100644 --- 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);