-/* Communication between reload.c and reload1.c.
- Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1997, 1998,
- 1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
+/* Communication between reload.c, reload1.c and the rest of compiler.
+ Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1997, 1998, 1999,
+ 2000, 2001, 2003, 2004, 2007, 2008 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
+Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
for more details.
You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING. If not, write to the Free
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA. */
+along with GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
/* If secondary reloads are the same for inputs and outputs, define those
SECONDARY_RELOAD_CLASS (CLASS, MODE, X)
#endif
-/* If either macro is defined, show that we need secondary reloads. */
-#if defined(SECONDARY_INPUT_RELOAD_CLASS) || defined(SECONDARY_OUTPUT_RELOAD_CLASS)
-#define HAVE_SECONDARY_RELOADS
-#endif
-
/* If MEMORY_MOVE_COST isn't defined, give it a default here. */
#ifndef MEMORY_MOVE_COST
-#ifdef HAVE_SECONDARY_RELOADS
#define MEMORY_MOVE_COST(MODE,CLASS,IN) \
(4 + memory_move_secondary_cost ((MODE), (CLASS), (IN)))
-#else
-#define MEMORY_MOVE_COST(MODE,CLASS,IN) 4
-#endif
#endif
extern int memory_move_secondary_cost (enum machine_mode, enum reg_class, int);
rtx out;
/* The class of registers to reload into. */
- enum reg_class class;
+ enum reg_class rclass;
/* The mode this operand should have when reloaded, on input. */
enum machine_mode inmode;
extern int n_reloads;
#endif
-extern GTY (()) struct varray_head_tag *reg_equiv_memory_loc_varray;
+extern GTY (()) VEC(rtx,gc) *reg_equiv_memory_loc_vec;
extern rtx *reg_equiv_constant;
+extern rtx *reg_equiv_invariant;
extern rtx *reg_equiv_memory_loc;
extern rtx *reg_equiv_address;
extern rtx *reg_equiv_mem;
+extern rtx *reg_equiv_alt_mem_list;
+
+/* Element N is the list of insns that initialized reg N from its equivalent
+ constant or memory slot. */
+extern GTY((length("reg_equiv_init_size"))) rtx *reg_equiv_init;
+
+/* The size of the previous array, for GC purposes. */
+extern GTY(()) int reg_equiv_init_size;
/* All the "earlyclobber" operands of the current insn
are recorded here. */
all insns that need reloading. */
struct insn_chain *next_need_reload;
- /* The basic block this insn is in. */
- int block;
/* The rtx of the insn. */
rtx insn;
- /* Register life information: record all live hard registers, and all
- live pseudos that have a hard register. */
- regset_head live_throughout;
- regset_head dead_or_set;
-
- /* Copies of the global variables computed by find_reloads. */
- struct reload *rld;
- int n_reloads;
- /* Indicates which registers have already been used for spills. */
- HARD_REG_SET used_spill_regs;
+ /* The basic block this insn is in. */
+ int block;
/* Nonzero if find_reloads said the insn requires reloading. */
unsigned int need_reload:1;
unsigned int need_elim:1;
/* Nonzero if this insn was inserted by perform_caller_saves. */
unsigned int is_caller_save_insn:1;
+
+ /* Register life information: record all live hard registers, and
+ all live pseudos that have a hard register. This set also
+ contains pseudos spilled by IRA. */
+ regset_head live_throughout;
+ regset_head dead_or_set;
+
+ /* Copies of the global variables computed by find_reloads. */
+ struct reload *rld;
+ int n_reloads;
+
+ /* Indicates which registers have already been used for spills. */
+ HARD_REG_SET used_spill_regs;
};
/* A chain of insn_chain structures to describe all non-note insns in
/* Functions from reload.c: */
+extern enum reg_class secondary_reload_class (bool, enum reg_class,
+ enum machine_mode, rtx);
+
+#ifdef GCC_INSN_CODES_H
+extern enum reg_class scratch_reload_class (enum insn_code);
+#endif
+
/* Return a memory location that will be used to copy X in mode MODE.
If we haven't already made a location for this mode in this insn,
call find_reloads_address on the location being returned. */
address, namely: sum constant integers, surround the sum of two
constants with a CONST, put the constant as the second operand, and
group the constant on the outermost sum. */
-extern rtx form_sum (rtx, rtx);
+extern rtx form_sum (enum machine_mode, rtx, rtx);
/* Substitute into the current INSN the registers into which we have reloaded
the things that need reloading. */
/* Scan X and replace any eliminable registers (such as fp) with a
replacement (such as sp), plus an offset. */
extern rtx eliminate_regs (rtx, enum machine_mode, rtx);
+extern bool elimination_target_reg_p (rtx);
/* Deallocate the reload register used by reload number R. */
extern void deallocate_reload_reg (int r);
+/* True if caller-save has been reinitialized. */
+extern bool caller_save_initialized_p;
+
/* Functions in caller-save.c: */
/* Initialize for caller-save. */