When splitting insns, properly update label usage counts

From-SVN: r41084
This commit is contained in:
Herman A.J. ten Brugge 2001-04-04 17:42:04 +02:00 committed by Bernd Schmidt
parent 347f344069
commit e5bef2e400
2 changed files with 40 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2001-04-04 Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
* 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 <jakub@redhat.com>
* recog.c (validate_replace_rtx_1): Instead of aborting just make

View File

@ -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);