summaryrefslogtreecommitdiffstats
path: root/gcc
diff options
context:
space:
mode:
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>2001-04-04 15:42:04 +0000
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>2001-04-04 15:42:04 +0000
commit344dc2fabb86eff576d4b419c3eeab6ca4aaa26c (patch)
treeceab558c90e66a03053d71c0ac910f0dbb1d2a89 /gcc
parent1c49fb1f6d95bd8a5c98fc9417f9354a3f368066 (diff)
downloadppe42-gcc-344dc2fabb86eff576d4b419c3eeab6ca4aaa26c.tar.gz
ppe42-gcc-344dc2fabb86eff576d4b419c3eeab6ca4aaa26c.zip
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/emit-rtl.c34
2 files changed, 40 insertions, 0 deletions
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 <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
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);
OpenPOWER on IntegriCloud