diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 618f7a294b5..c84e8eb9469 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-10-11 Richard Henderson + + PR opt/8165 + * gcse.c (adjust_libcall_notes): Also adjust notes for INSN. + 2002-10-11 John David Anglin * cfganal.c (dfs_enumerate_from): Use PARAMS. diff --git a/gcc/gcse.c b/gcc/gcse.c index 081275a0c7d..bdde90f4e0c 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -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; diff --git a/gcc/testsuite/gcc.c-torture/execute/20021011-1.c b/gcc/testsuite/gcc.c-torture/execute/20021011-1.c new file mode 100644 index 00000000000..b1b2c406a71 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20021011-1.c @@ -0,0 +1,24 @@ +/* PR opt/8165. */ + +extern void abort (void); + +char buf[64]; + +int +main (void) +{ + int i; + + __builtin_strcpy (buf, "mystring"); + if (__builtin_strcmp (buf, "mystring") != 0) + abort (); + + for (i = 0; i < 16; ++i) + { + __builtin_strcpy (buf + i, "mystring"); + if (__builtin_strcmp (buf + i, "mystring") != 0) + abort (); + } + + return 0; +}