]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Backport a change to the 2.95 branch
authorBernd Schmidt <bernds@redhat.co.uk>
Thu, 30 Nov 2000 12:57:46 +0000 (12:57 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Thu, 30 Nov 2000 12:57:46 +0000 (12:57 +0000)
From-SVN: r37888

gcc/ChangeLog
gcc/reload1.c

index 2924f0daf97a24e0896b4365146136541235778f..91456471f256fcc9aa2aea14dc7571528bc87ef5 100644 (file)
@@ -1,5 +1,10 @@
 2000-11-30  Bernd Schmidt  <bernds@redhat.co.uk>
 
+       2000-11-24  Bernd Schmidt  <bernds@redhat.co.uk>
+       * reload1.c (conflicts_with_override): New function.
+       (emit_input_reload_insns): Use it to tighten test for validity
+       of substituting into output of previous insn.
+
        Wed Oct 27 03:09:23 1999  J"orn Rennecke  <amylaar@redhat.co.uk>
        * reload.h (earlyclobber_operand_p): Declare.
        * reload.c (earlyclobber_operand_p): Don't declare.  No longer static.
index 82c7cbe4b5c90903ffbf5c1cb6f538508ce506b8..4011236f47b228e61426413b0cafc898f648303b 100644 (file)
@@ -423,6 +423,7 @@ static int reload_reg_free_for_value_p      PROTO((int, int, enum reload_type, rtx, r
 static int reload_reg_reaches_end_p    PROTO((int, int, enum reload_type));
 static int allocate_reload_reg         PROTO((struct insn_chain *, int, int,
                                               int));
+static int conflicts_with_override     PROTO((rtx));
 static void choose_reload_regs         PROTO((struct insn_chain *));
 static void merge_assigned_reloads     PROTO((rtx));
 static void emit_reload_insns          PROTO((struct insn_chain *));
@@ -5412,6 +5413,21 @@ reload_reg_free_for_value_p (regno, opnum, type, value, out, reloadnum,
   return 1;
 }
 
+/* Determine whether the reload reg X overlaps any rtx'es used for
+   overriding inheritance.  Return nonzero if so.  */
+
+static int
+conflicts_with_override (x)
+     rtx x;
+{
+  int i;
+  for (i = 0; i < n_reloads; i++)
+    if (reload_override_in[i]
+       && reg_overlap_mentioned_p (x, reload_override_in[i]))
+      return 1;
+  return 0;
+}
+
 /* Find a spill register to use as a reload register for reload R.
    LAST_RELOAD is non-zero if this is the last reload for the insn being
    processed.
@@ -6819,6 +6835,7 @@ emit_reload_insns (chain)
                   && dead_or_set_p (insn, old)
                   /* This is unsafe if some other reload
                      uses the same reg first.  */
+                  && ! conflicts_with_override (reloadreg)
                   && reload_reg_free_for_value_p (REGNO (reloadreg),
                                                   reload_opnum[j],
                                                   reload_when_needed[j],