From 58ecb5e2cd33addcf73d70f87d0f3a5ff221e226 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Fri, 24 Nov 2000 11:36:27 +0000 Subject: [PATCH] Avoid a bit of copy propagation when there's a REG_EQUIV note From-SVN: r37705 --- gcc/ChangeLog | 6 ++++++ gcc/cse.c | 21 +++++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d8801970ea6..cbda5d08640 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 + + * 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 * c-parse.in (unary_expr): Move VA_ARG from here ... diff --git a/gcc/cse.c b/gcc/cse.c index f89067a8000..a961e80a27b 100644 --- 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); -- 2.30.2