This is the mail archive of the
mailing list for the GCC project.
Re: update_equiv_regs() and dependency chains
- From: "David S. Miller" <davem at redhat dot com>
- To: gcc-bugs at gcc dot gnu dot org
- Cc: gcc-patches at gcc dot gnu dot org, mark at codesourcery dot com
- Date: Fri, 17 May 2002 06:34:36 -0700 (PDT)
- Subject: Re: update_equiv_regs() and dependency chains
- References: <firstname.lastname@example.org>
From: "David S. Miller" <email@example.com>
Date: Fri, 17 May 2002 04:35:10 -0700 (PDT)
[ Replying to myself as often occurs... :-) ]
update_equiv_regs() seems to not be able to handle reg_equiv sources
that are first replaced by other equivalences.
So now we have a problem because the 'src' in reg_equiv still
refers to REG 184 even though we've killed it off. That is, the
reg_equiv.src members are not updated when an equivalence
transformation is performed.
So after some thought on how to deal with this, it seems that the
easiest solution is to record the source using the address of the RTX.
This way, if a replacement occurs it will propagate into the sources
of other equivalences. I thought about how changes to the RTX pointed
to might invalidate our equivalence tests. That should be OK because
we will be replacing the source with something else known to be
equivalent. QED :-)
This patch below fixes the ICE in PR c/6689, and the resulting RTL
looks fine. I'm testing a full bootstrap/testsuite run of this right
now on sparc-linux, and I'll fire one up on sparc64-linux and
i686-linux as well to really make sure this change doesn't have some
weird side effect.
Mark, this is a regression from 3.0 and egcs-1.1.x Ok for the branch
if all of my bootstrap+regression runs pass?
2002-05-17 David S. Miller <firstname.lastname@example.org>
* local-alloc.c (struct equivalence): Rename 'src' to 'src_p'
and make it a pointer to rtx. Update comments.
(update_equiv_regs): When scanning for equivalences, record
address of SET_SRC (set) in reg_equiv.src_p. Dereference
it while making the equiv replacements.
--- local-alloc.c.~1~ Tue Apr 2 18:09:12 2002
+++ local-alloc.c Fri May 17 06:26:46 2002
@@ -245,7 +245,7 @@ static rtx this_insn;
/* Set when an attempt should be made to replace a register
- with the associated src entry. */
+ with the associated src_p entry. */
@@ -255,7 +255,7 @@ struct equivalence
- rtx src;
+ rtx *src_p;
/* Loop depth is used to recognize equivalences which appear
to be present within the same loop (or in an inner loop). */
@@ -1004,7 +1004,7 @@ update_equiv_regs ()
recorded_label_ref = 1;
reg_equiv[regno].replacement = XEXP (note, 0);
- reg_equiv[regno].src = src;
+ reg_equiv[regno].src_p = &SET_SRC (set);
reg_equiv[regno].loop_depth = loop_depth;
/* Don't mess with things live during setjmp. */
@@ -1086,7 +1086,7 @@ update_equiv_regs ()
if (asm_noperands (PATTERN (equiv_insn)) < 0
&& validate_replace_rtx (regno_reg_rtx[regno],
- reg_equiv[regno].src, insn))
+ *(reg_equiv[regno].src_p), insn))