diff options
| author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-10-14 18:16:07 +0000 |
|---|---|---|
| committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-10-14 18:16:07 +0000 |
| commit | 805ae000ed8eb0b87f6e0e8d09bf5308710e1478 (patch) | |
| tree | 0528a5ff07218adcfc96168d07f80f2555b12c8b | |
| parent | 16ceebaec495923de6fa36493f30a629dc7a7780 (diff) | |
| download | ppe42-gcc-805ae000ed8eb0b87f6e0e8d09bf5308710e1478.tar.gz ppe42-gcc-805ae000ed8eb0b87f6e0e8d09bf5308710e1478.zip | |
PR opt/8165
* gcse.c (adjust_libcall_notes): Revert last change.
* simplify-rtx.c (simplify_replace_rtx): Handle LO_SUM.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@58130 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ChangeLog | 6 | ||||
| -rw-r--r-- | gcc/gcse.c | 14 | ||||
| -rw-r--r-- | gcc/simplify-rtx.c | 17 |
3 files changed, 25 insertions, 12 deletions
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 <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 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; |

