* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@94529
138bc75d-0d04-0410-961f-
82ee72b054a4
+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.
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;
}
}
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.