aboutsummaryrefslogtreecommitdiff
path: root/gcc/jump.c
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2001-01-07 02:26:51 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2001-01-07 02:26:51 +0000
commitf759eb8bf0d98603f2e6930126e517ed995a64a8 (patch)
tree17de3bb34420626f8eab111aee34a18e3a1f275f /gcc/jump.c
parent0e2e89fd2e117555f71be7a28e41f5f7663c3395 (diff)
downloadgcc-f759eb8bf0d98603f2e6930126e517ed995a64a8.zip
gcc-f759eb8bf0d98603f2e6930126e517ed995a64a8.tar.gz
gcc-f759eb8bf0d98603f2e6930126e517ed995a64a8.tar.bz2
reload.c (subst_reloads): Take INSN argument.
* reload.c (subst_reloads): Take INSN argument. When replacing a LABEL_REF in a JUMP_INSN, add a REG_LABEL note. * reload.h (subst_reloads): Adjust prototype. * reload1.c (reload_as_needed): Pass INSN to subst_reloads. * jump.c (mark_all_labels): Canonicalize any REG_LABEL notes present in JUMP_INSNs and copy them to JUMP_LABEL. * flow.c (find_label_refs, find_basic_blocks_1): Skip JUMP_INSNs and insns with REG_LABELs that are followed by JUMP_INSNs with the same REG_LABEL. * sched-rgn.c (is_cfg_nonregular): Likewise. * rtlanal.c (computed_jump_p): Make it false if a REG_LABEL note is available. * unroll.c (unroll_loop): Look for REG_LABEL notes in JUMP_INSNs too. * rtl.texi (REG_LABEL): Document usage in JUMP_INSNs. From-SVN: r38755
Diffstat (limited to 'gcc/jump.c')
-rw-r--r--gcc/jump.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/jump.c b/gcc/jump.c
index 1c6c3a6..032172d 100644
--- a/gcc/jump.c
+++ b/gcc/jump.c
@@ -863,6 +863,24 @@ mark_all_labels (f, cross_jump)
mark_jump_label (PATTERN (insn), insn, cross_jump, 0);
if (! INSN_DELETED_P (insn) && GET_CODE (insn) == JUMP_INSN)
{
+ /* When we know the LABEL_REF contained in a REG used in
+ an indirect jump, we'll have a REG_LABEL note so that
+ flow can tell where it's going. */
+ if (JUMP_LABEL (insn) == 0)
+ {
+ rtx label_note = find_reg_note (insn, REG_LABEL, NULL_RTX);
+ if (label_note)
+ {
+ /* But a LABEL_REF around the REG_LABEL note, so
+ that we can canonicalize it. */
+ rtx label_ref = gen_rtx_LABEL_REF (VOIDmode,
+ XEXP (label_note, 0));
+
+ mark_jump_label (label_ref, insn, cross_jump, 0);
+ XEXP (label_note, 0) = XEXP (label_ref, 0);
+ JUMP_LABEL (insn) = XEXP (label_note, 0);
+ }
+ }
if (JUMP_LABEL (insn) != 0 && simplejump_p (insn))
{
jump_chain[INSN_UID (insn)]