Patch from Richard Sandiford <rsandifo@redhat.com>

* reload1.c (choose_reload_regs): Prevent the find_equiv_reg() code
	from inheriting a subreg equivalence with a non-spill register.

	* tree.h (DECL_FUNCTION_CODE): Document that it is overloaded.

From-SVN: r94529
This commit is contained in:
Eric Botcazou 2005-02-01 08:22:19 +01:00 committed by Eric Botcazou
parent 8c94c75ae7
commit 9c0a30c366
3 changed files with 21 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2005-02-01 Eric Botcazou <ebotcazou@libertysurf.fr>
Patch from Richard Sandiford <rsandifo@redhat.com>
* reload1.c (choose_reload_regs): Prevent the find_equiv_reg() code
from inheriting a subreg equivalence with a non-spill register.
* tree.h (DECL_FUNCTION_CODE): Document that it is overloaded.
2005-02-01 Alexandre Oliva <aoliva@redhat.com>
* config/frv/frv.c (movcc_fp_destination_operand): New.

View File

@ -5589,6 +5589,15 @@ choose_reload_regs (struct insn_chain *chain)
gcc_assert (GET_CODE (equiv) == SUBREG);
regno = subreg_regno (equiv);
equiv = gen_rtx_REG (rld[r].mode, regno);
/* If we choose EQUIV as the reload register, but the
loop below decides to cancel the inheritance, we'll
end up reloading EQUIV in rld[r].mode, not the mode
it had originally. That isn't safe when EQUIV isn't
available as a spill register since its value might
still be live at this point. */
for (i = regno; i < regno + (int) rld[r].nregs; i++)
if (TEST_HARD_REG_BIT (reload_reg_unavailable, i))
equiv = 0;
}
}

View File

@ -2000,8 +2000,10 @@ struct tree_binfo GTY (())
that describes the status of this function. */
#define DECL_STRUCT_FUNCTION(NODE) (FUNCTION_DECL_CHECK (NODE)->decl.u2.f)
/* For FUNCTION_DECL, if it is built-in,
this identifies which built-in operation it is. */
/* For FUNCTION_DECL, if it is built-in, this identifies which built-in
operation it is. Note, however, that this field is overloaded, with
DECL_BUILT_IN_CLASS as the discriminant, so the latter must always be
checked before any access to the former. */
#define DECL_FUNCTION_CODE(NODE) (FUNCTION_DECL_CHECK (NODE)->decl.u1.f)
/* The DECL_VINDEX is used for FUNCTION_DECLS in two different ways.