aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/gcse.c14
-rw-r--r--gcc/simplify-rtx.c17
3 files changed, 25 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0312c09..8233cba 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2002-10-14 Richard Henderson <rth@redhat.com>
+
+ PR opt/8165
+ * gcse.c (adjust_libcall_notes): Revert last change.
+ * simplify-rtx.c (simplify_replace_rtx): Handle LO_SUM.
+
2002-10-14 Andrew Haley <aph@redhat.com>
* tree-inline.c (remap_block): All local class initialization
diff --git a/gcc/gcse.c b/gcc/gcse.c
index bdde90f..bb738e2 100644
--- a/gcc/gcse.c
+++ b/gcc/gcse.c
@@ -4330,23 +4330,17 @@ do_local_cprop (x, insn, alter_jumps, libcall_sp)
/* LIBCALL_SP is a zero-terminated array of insns at the end of a libcall;
their REG_EQUAL notes need updating to reflect that OLDREG has been
- replaced with NEWVAL in INSN. Also update the REG_EQUAL notes in INSN.
-
- Return true if all substitutions could be made. */
-
+ replaced with NEWVAL in INSN. Return true if all substitutions could
+ be made. */
static bool
adjust_libcall_notes (oldreg, newval, insn, libcall_sp)
rtx oldreg, newval, insn, *libcall_sp;
{
- rtx end, note;
-
- note = find_reg_equal_equiv_note (insn);
- if (note)
- XEXP (note, 0) = replace_rtx (XEXP (note, 0), oldreg, newval);
+ rtx end;
while ((end = *libcall_sp++))
{
- note = find_reg_equal_equiv_note (end);
+ rtx note = find_reg_equal_equiv_note (end);
if (! note)
continue;
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index cd7e28b..3293f0b 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -343,9 +343,22 @@ simplify_replace_rtx (x, old, new)
return replace_equiv_address_nv (x,
simplify_replace_rtx (XEXP (x, 0),
old, new));
+ else if (code == LO_SUM)
+ {
+ rtx op0 = simplify_replace_rtx (XEXP (x, 0), old, new);
+ rtx op1 = simplify_replace_rtx (XEXP (x, 1), old, new);
- if (REG_P (x) && REG_P (old) && REGNO (x) == REGNO (old))
- return new;
+ /* (lo_sum (high x) x) -> x */
+ if (GET_CODE (op0) == HIGH && rtx_equal_p (XEXP (op0, 0), op1))
+ return op1;
+
+ return gen_rtx_LO_SUM (mode, op0, op1);
+ }
+ else if (code == REG)
+ {
+ if (REG_P (old) && REGNO (x) == REGNO (old))
+ return new;
+ }
return x;