aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard@codesourcery.com>2006-04-11 17:43:07 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2006-04-11 17:43:07 +0000
commit205eb6e78d561bf20425f030f9362d6b8e5e0d0e (patch)
tree010adf946ea1a78c7e0483714998dbd539c64a80 /gcc
parentef6843ed0b1a7caf04be629d1dac079e48aa048e (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/gcse.c10
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
diff --git a/gcc/gcse.c b/gcc/gcse.c
index 0dbbe0b..1c000a2 100644
--- a/gcc/gcse.c
+++ b/gcc/gcse.c
@@ -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;