From 344dc2fabb86eff576d4b419c3eeab6ca4aaa26c Mon Sep 17 00:00:00 2001 From: bernds Date: Wed, 4 Apr 2001 15:42:04 +0000 Subject: [PATCH] When splitting insns, properly update label usage counts git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@41084 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/emit-rtl.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5f23f3cd694..69e2eacbc3c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2001-04-04 Herman A.J. ten Brugge + + * emit-rtl.c (mark_label_nuses) Increment the label uses for + all labels present in rtx. + (try_split) Call new function for all split insns. + 2001-04-04 Jakub Jelinek * recog.c (validate_replace_rtx_1): Instead of aborting just make diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 7b715c6f69d..2acb55547fa 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -177,6 +177,7 @@ static void mark_sequence_stack PARAMS ((struct sequence_stack *)); static void unshare_all_rtl_1 PARAMS ((rtx)); static void unshare_all_decls PARAMS ((tree)); static void reset_used_decls PARAMS ((tree)); +static void mark_label_nuses PARAMS ((rtx)); static hashval_t const_int_htab_hash PARAMS ((const void *)); static int const_int_htab_eq PARAMS ((const void *, const void *)); @@ -2521,6 +2522,32 @@ prev_cc0_setter (insn) return insn; } #endif + +/* Increment the label uses for all labels present in rtx. */ + +static void +mark_label_nuses(x) + rtx x; +{ + register enum rtx_code code; + register int i, j; + register const char *fmt; + + code = GET_CODE (x); + if (code == LABEL_REF) + LABEL_NUSES (XEXP (x, 0))++; + + fmt = GET_RTX_FORMAT (code); + for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) + { + if (fmt[i] == 'e') + mark_label_nuses (XEXP (x, i)); + else if (fmt[i] == 'E') + for (j = XVECLEN (x, i) - 1; j >= 0; j--) + mark_label_nuses (XVECEXP (x, i, j)); + } +} + /* Try splitting insns that can be split for better scheduling. PAT is the pattern which might split. @@ -2580,6 +2607,13 @@ try_split (pat, trial, last) CALL_INSN_FUNCTION_USAGE (XVECEXP (seq, 0, i)) = CALL_INSN_FUNCTION_USAGE (trial); + /* If there are LABELS inside the split insns increment the + usage count so we don't delete the label. */ + if (GET_CODE (trial) == INSN) + for (i = XVECLEN (seq, 0) - 1; i >= 0; i--) + if (GET_CODE (XVECEXP (seq, 0, i)) == INSN) + mark_label_nuses (PATTERN (XVECEXP (seq, 0, i))); + tem = emit_insn_after (seq, before); delete_insn (trial); -- 2.11.4.GIT