+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
/* 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;
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;