diff options
author | Richard Henderson <rth@redhat.com> | 2002-10-11 15:42:31 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2002-10-11 15:42:31 -0700 |
commit | e197b6fcab6f51f94a1a235c0107dea0cd59eca0 (patch) | |
tree | 3203c3eb64bd45773f8e749fed4cdc25520e0110 /gcc/gcse.c | |
parent | 37d2b7e2dc7cd33b71e889f77520de7404aa3a62 (diff) | |
download | gcc-e197b6fcab6f51f94a1a235c0107dea0cd59eca0.zip gcc-e197b6fcab6f51f94a1a235c0107dea0cd59eca0.tar.gz gcc-e197b6fcab6f51f94a1a235c0107dea0cd59eca0.tar.bz2 |
re PR rtl-optimization/8165 (builtin string functions SEGV on alpha-pc-linux-gnu at -O2)
PR opt/8165
* gcse.c (adjust_libcall_notes): Also adjust notes for INSN.
* gcc.c-torture/execute/20021011-1.c: New.
From-SVN: r58071
Diffstat (limited to 'gcc/gcse.c')
-rw-r--r-- | gcc/gcse.c | 21 |
1 files changed, 15 insertions, 6 deletions
@@ -4251,6 +4251,7 @@ cprop_insn (insn, alter_jumps) /* LIBCALL_SP is a zero-terminated array of insns at the end of a libcall; their REG_EQUAL notes need updating. */ + static bool do_local_cprop (x, insn, alter_jumps, libcall_sp) rtx x; @@ -4260,10 +4261,12 @@ do_local_cprop (x, insn, alter_jumps, libcall_sp) { rtx newreg = NULL, newcnst = NULL; - /* Rule out USE instructions and ASM statements as we don't want to change the hard registers mentioned. */ + /* Rule out USE instructions and ASM statements as we don't want to + change the hard registers mentioned. */ if (GET_CODE (x) == REG && (REGNO (x) >= FIRST_PSEUDO_REGISTER - || (GET_CODE (PATTERN (insn)) != USE && asm_noperands (PATTERN (insn)) < 0))) + || (GET_CODE (PATTERN (insn)) != USE + && asm_noperands (PATTERN (insn)) < 0))) { cselib_val *val = cselib_lookup (x, GET_MODE (x), 0); struct elt_loc_list *l; @@ -4327,17 +4330,23 @@ 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. Return true if all substitutions could - be made. */ + replaced with NEWVAL in INSN. Also update the REG_EQUAL notes 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; + rtx end, note; + + note = find_reg_equal_equiv_note (insn); + if (note) + XEXP (note, 0) = replace_rtx (XEXP (note, 0), oldreg, newval); while ((end = *libcall_sp++)) { - rtx note = find_reg_equal_equiv_note (end); + note = find_reg_equal_equiv_note (end); if (! note) continue; |