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
This commit is contained in:
Richard Henderson 2002-10-11 15:42:31 -07:00 committed by Richard Henderson
parent 37d2b7e2dc
commit e197b6fcab
3 changed files with 44 additions and 6 deletions

View File

@ -1,3 +1,8 @@
2002-10-11 Richard Henderson <rth@redhat.com>
PR opt/8165
* gcse.c (adjust_libcall_notes): Also adjust notes for INSN.
2002-10-11 John David Anglin <dave@hiauly1.hia.nrc.ca>
* cfganal.c (dfs_enumerate_from): Use PARAMS.

View File

@ -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;

View File

@ -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;
}