Avoid a bit of copy propagation when there's a REG_EQUIV note
authorRichard Sandiford <rsandifo@redhat.com>
Fri, 24 Nov 2000 11:36:27 +0000 (11:36 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Fri, 24 Nov 2000 11:36:27 +0000 (11:36 +0000)
From-SVN: r37705

gcc/ChangeLog
gcc/cse.c

index d8801970ea680243a31a4706ae7833101a377e53..cbda5d08640060eb59e186a9ba7b10253a3504b2 100644 (file)
@@ -3,6 +3,12 @@
        * combine.c (cant_combine_insn_p): New function.
        (try_combine): Use it.
 
+2000-11-24  Richard Sandiford  <rsandifo@redhat.com>
+
+       * gcc/cse.c (cse_insn): Removed conversion of REG_EQUIV to REG_EQUAL
+       when reversing a register-to-register copy.  Reversal now disabled
+       when the previous instruction has a REG_EQUIV.
+
 2000-11-24  Nathan Sidwell  <nathan@codesourcery.com>
 
        * c-parse.in (unary_expr): Move VA_ARG from here ...
index f89067a80008538253cad0a9c778253b4f1d0c26..a961e80a27baf3408ac68bfe4b87a15410707e51 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -6238,23 +6238,32 @@ cse_insn (insn, libcall_insn)
        {
          rtx prev = prev_nonnote_insn (insn);
 
+         /* Do not swap the registers around if the previous instruction
+            attaches a REG_EQUIV note to REG1.
+
+            ??? It's not entirely clear whether we can transfer a REG_EQUIV
+            from the pseudo that originally shadowed an incoming argument
+            to another register.  Some uses of REG_EQUIV might rely on it
+            being attached to REG1 rather than REG2.
+
+            This section previously turned the REG_EQUIV into a REG_EQUAL
+            note.  We cannot do that because REG_EQUIV may provide an
+            uninitialised stack slot when REG_PARM_STACK_SPACE is used. */
+
          if (prev != 0 && GET_CODE (prev) == INSN
              && GET_CODE (PATTERN (prev)) == SET
-             && SET_DEST (PATTERN (prev)) == SET_SRC (sets[0].rtl))
+             && SET_DEST (PATTERN (prev)) == SET_SRC (sets[0].rtl)
+             && ! find_reg_note (prev, REG_EQUIV, NULL_RTX))
            {
              rtx dest = SET_DEST (sets[0].rtl);
              rtx src = SET_SRC (sets[0].rtl);
-             rtx note = find_reg_note (prev, REG_EQUIV, NULL_RTX);
+             rtx note;
 
              validate_change (prev, &SET_DEST (PATTERN (prev)), dest, 1);
              validate_change (insn, &SET_DEST (sets[0].rtl), src, 1);
              validate_change (insn, &SET_SRC (sets[0].rtl), dest, 1);
              apply_change_group ();
 
-             /* If REG1 was equivalent to a constant, REG0 is not.  */
-             if (note)
-               PUT_REG_NOTE_KIND (note, REG_EQUAL);
-
              /* If there was a REG_WAS_0 note on PREV, remove it.  Move
                 any REG_WAS_0 note on INSN to PREV.  */
              note = find_reg_note (prev, REG_WAS_0, NULL_RTX);