diff options
author | Richard Sandiford <rsandifo@redhat.com> | 2000-11-24 11:36:27 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@gcc.gnu.org> | 2000-11-24 11:36:27 +0000 |
commit | 58ecb5e2cd33addcf73d70f87d0f3a5ff221e226 (patch) | |
tree | cb9f0718cf4e398375383fde98eea639a6545067 | |
parent | c34102419d7a73cafeb889085d73db22e79f0316 (diff) | |
download | gcc-58ecb5e2cd33addcf73d70f87d0f3a5ff221e226.zip gcc-58ecb5e2cd33addcf73d70f87d0f3a5ff221e226.tar.gz gcc-58ecb5e2cd33addcf73d70f87d0f3a5ff221e226.tar.bz2 |
Avoid a bit of copy propagation when there's a REG_EQUIV note
From-SVN: r37705
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cse.c | 21 |
2 files changed, 21 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d880197..cbda5d0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 ... @@ -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); |