From: Richard Henderson Date: Mon, 14 Oct 2002 18:16:07 +0000 (-0700) Subject: re PR rtl-optimization/8165 (builtin string functions SEGV on alpha-pc-linux-gnu... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f4e3e618783d34c309c90f89f2b068a9124b27ed;p=gcc.git re PR rtl-optimization/8165 (builtin string functions SEGV on alpha-pc-linux-gnu at -O2) PR opt/8165 * gcse.c (adjust_libcall_notes): Revert last change. * simplify-rtx.c (simplify_replace_rtx): Handle LO_SUM. From-SVN: r58130 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0312c09199d..8233cba8ded 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-10-14 Richard Henderson + + 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 * tree-inline.c (remap_block): All local class initialization diff --git a/gcc/gcse.c b/gcc/gcse.c index bdde90f4e0c..bb738e2dd8f 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 cd7e28b45c7..3293f0b7c6b 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;