This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: egcs-current: Major optimizer bug
- To: smurf at noris dot de
- Subject: Re: egcs-current: Major optimizer bug
- From: hjl at lucon dot org (H.J. Lu)
- Date: Tue, 30 Jun 1998 16:08:05 -0700 (PDT)
- Cc: egcs-patches at cygnus dot com, egcs-bugs at cygnus dot com
Hi,
Can you try this patch for your bug?
Thanks.
--
H.J. Lu (hjl@gnu.org)
---
Tue Jun 30 07:37:48 1998 H.J. Lu (hjl@gnu.org)
* local-alloc.c (update_equiv_regs): Check if a REG_EQUIV note
is valid.
Index: local-alloc.c
===================================================================
RCS file: /home/work/cvs/gnu/egcs/gcc/local-alloc.c,v
retrieving revision 1.1.1.14
diff -u -p -r1.1.1.14 local-alloc.c
--- local-alloc.c 1998/06/25 15:54:37 1.1.1.14
+++ local-alloc.c 1998/06/30 18:36:18
@@ -874,7 +874,11 @@ update_equiv_regs ()
If we don't have a REG_EQUIV note, see if this insn is loading
a register used only in one basic block from a MEM. If so, and the
MEM remains unchanged for the life of the register, add a REG_EQUIV
- note. */
+ note.
+
+ We should double check if the REG_EQUIV note is suitable for
+ our purpose. The REG_EQUIV note may not be valid across
+ a CALL_INSN insn. */
note = find_reg_note (insn, REG_EQUIV, NULL_RTX);
@@ -883,6 +887,9 @@ update_equiv_regs ()
&& validate_equiv_mem (insn, dest, SET_SRC (set)))
REG_NOTES (insn) = note = gen_rtx_EXPR_LIST (REG_EQUIV, SET_SRC (set),
REG_NOTES (insn));
+ else if (note && GET_CODE (XEXP (note, 0)) == MEM
+ && !validate_equiv_mem (insn, dest, XEXP (note, 0)))
+ note = NULL_RTX;
if (note)
{