aboutsummaryrefslogtreecommitdiff
path: root/gcc/gcse.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2002-10-11 15:42:31 -0700
committerRichard Henderson <rth@gcc.gnu.org>2002-10-11 15:42:31 -0700
commite197b6fcab6f51f94a1a235c0107dea0cd59eca0 (patch)
tree3203c3eb64bd45773f8e749fed4cdc25520e0110 /gcc/gcse.c
parent37d2b7e2dc7cd33b71e889f77520de7404aa3a62 (diff)
downloadgcc-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.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/gcc/gcse.c b/gcc/gcse.c
index 081275a..bdde90f 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;