diff options
author | Richard Sandiford <richard@codesourcery.com> | 2006-04-11 17:43:07 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2006-04-11 17:43:07 +0000 |
commit | 205eb6e78d561bf20425f030f9362d6b8e5e0d0e (patch) | |
tree | 010adf946ea1a78c7e0483714998dbd539c64a80 | |
parent | ef6843ed0b1a7caf04be629d1dac079e48aa048e (diff) | |
download | gcc-205eb6e78d561bf20425f030f9362d6b8e5e0d0e.zip gcc-205eb6e78d561bf20425f030f9362d6b8e5e0d0e.tar.gz gcc-205eb6e78d561bf20425f030f9362d6b8e5e0d0e.tar.bz2 |
re PR rtl-optimization/27073 (invalid gcse manipulation of REG_EQUIV notes)
PR rtl-optimization/27073
* gcse.c (try_replace_reg): Revert last change. Continue to search
for both REG_EQUAL and REG_EQUIV notes, but only perform replacements
on the former.
From-SVN: r112861
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/gcse.c | 10 |
2 files changed, 12 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0cf5ae0..2ab31ce 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2006-04-11 Richard Sandiford <richard@codesourcery.com> + + PR rtl-optimization/27073 + * gcse.c (try_replace_reg): Revert last change. Continue to search + for both REG_EQUAL and REG_EQUIV notes, but only perform replacements + on the former. + 2006-04-11 Eric Botcazou <ebotcazou@libertysurf.fr> * config/sparc/sparc.c (function_arg_slotno) <BLKmode>: Handle @@ -2642,7 +2642,7 @@ find_used_regs (rtx *xptr, void *data ATTRIBUTE_UNUSED) static int try_replace_reg (rtx from, rtx to, rtx insn) { - rtx note = find_reg_note (insn, REG_EQUAL, NULL); + rtx note = find_reg_equal_equiv_note (insn); rtx src = 0; int success = 0; rtx set = single_set (insn); @@ -2660,9 +2660,9 @@ try_replace_reg (rtx from, rtx to, rtx insn) validate_change (insn, &SET_SRC (set), src, 0); } - /* If there is already a NOTE, update the expression in it with our - replacement. */ - if (note != 0) + /* If there is already a REG_EQUAL note, update the expression in it + with our replacement. */ + if (note != 0 && REG_NOTE_KIND (note) == REG_EQUAL) XEXP (note, 0) = simplify_replace_rtx (XEXP (note, 0), from, to); if (!success && set && reg_mentioned_p (from, SET_SRC (set))) @@ -2689,7 +2689,7 @@ try_replace_reg (rtx from, rtx to, rtx insn) We don't allow that. Remove that note. This code ought not to happen, because previous code ought to synthesize reg-reg move, but be on the safe side. */ - if (note && REG_P (XEXP (note, 0))) + if (note && REG_NOTE_KIND (note) == REG_EQUAL && REG_P (XEXP (note, 0))) remove_note (insn, note); return success; |