mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-30 07:34:39 +08:00
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
This commit is contained in:
parent
3eb429b2ce
commit
f4e3e61878
@ -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
|
||||
|
14
gcc/gcse.c
14
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;
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user