OSDN Git Service

When splitting insns, properly update label usage counts
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 4 Apr 2001 15:42:04 +0000 (15:42 +0000)
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 4 Apr 2001 15:42:04 +0000 (15:42 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@41084 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/emit-rtl.c

index 5f23f3c..69e2eac 100644 (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
index 7b715c6..2acb555 100644 (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));
+    }
+}
+
 \f
 /* 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);