118334Speter/* Communication between reload.c and reload1.c.
290075Sobrien   Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1997, 1998,
3169689Skan   1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
418334Speter
590075SobrienThis file is part of GCC.
618334Speter
790075SobrienGCC is free software; you can redistribute it and/or modify it under
890075Sobrienthe terms of the GNU General Public License as published by the Free
990075SobrienSoftware Foundation; either version 2, or (at your option) any later
1090075Sobrienversion.
1118334Speter
1290075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY
1390075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or
1490075SobrienFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1590075Sobrienfor more details.
1618334Speter
1718334SpeterYou should have received a copy of the GNU General Public License
1890075Sobrienalong with GCC; see the file COPYING.  If not, write to the Free
19169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20169689Skan02110-1301, USA.  */
2118334Speter
2218334Speter
2318334Speter/* If secondary reloads are the same for inputs and outputs, define those
2418334Speter   macros here.  */
2518334Speter
2618334Speter#ifdef SECONDARY_RELOAD_CLASS
2718334Speter#define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, X) \
2818334Speter  SECONDARY_RELOAD_CLASS (CLASS, MODE, X)
2918334Speter#define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, X) \
3018334Speter  SECONDARY_RELOAD_CLASS (CLASS, MODE, X)
3118334Speter#endif
3218334Speter
3350397Sobrien/* If MEMORY_MOVE_COST isn't defined, give it a default here.  */
3450397Sobrien#ifndef MEMORY_MOVE_COST
3550397Sobrien#define MEMORY_MOVE_COST(MODE,CLASS,IN) \
3650397Sobrien  (4 + memory_move_secondary_cost ((MODE), (CLASS), (IN)))
3750397Sobrien#endif
38132718Skanextern int memory_move_secondary_cost (enum machine_mode, enum reg_class, int);
3950397Sobrien
4018334Speter/* Maximum number of reloads we can need.  */
4118334Speter#define MAX_RELOADS (2 * MAX_RECOG_OPERANDS * (MAX_REGS_PER_ADDRESS + 1))
4218334Speter
4318334Speter/* Encode the usage of a reload.  The following codes are supported:
4418334Speter
4518334Speter   RELOAD_FOR_INPUT		reload of an input operand
4618334Speter   RELOAD_FOR_OUTPUT		likewise, for output
4718334Speter   RELOAD_FOR_INSN		a reload that must not conflict with anything
4818334Speter				used in the insn, but may conflict with
4918334Speter				something used before or after the insn
5018334Speter   RELOAD_FOR_INPUT_ADDRESS	reload for parts of the address of an object
5118334Speter				that is an input reload
5250397Sobrien   RELOAD_FOR_INPADDR_ADDRESS	reload needed for RELOAD_FOR_INPUT_ADDRESS
5350397Sobrien   RELOAD_FOR_OUTPUT_ADDRESS	like RELOAD_FOR INPUT_ADDRESS, for output
5450397Sobrien   RELOAD_FOR_OUTADDR_ADDRESS	reload needed for RELOAD_FOR_OUTPUT_ADDRESS
5518334Speter   RELOAD_FOR_OPERAND_ADDRESS	reload for the address of a non-reloaded
5618334Speter				operand; these don't conflict with
5718334Speter				any other addresses.
5818334Speter   RELOAD_FOR_OPADDR_ADDR	reload needed for RELOAD_FOR_OPERAND_ADDRESS
5918334Speter                                reloads; usually secondary reloads
6018334Speter   RELOAD_OTHER			none of the above, usually multiple uses
6118334Speter   RELOAD_FOR_OTHER_ADDRESS     reload for part of the address of an input
62132718Skan				that is marked RELOAD_OTHER.
6318334Speter
6418334Speter   This used to be "enum reload_when_needed" but some debuggers have trouble
6518334Speter   with an enum tag and variable of the same name.  */
6618334Speter
6718334Speterenum reload_type
6818334Speter{
69132718Skan  RELOAD_FOR_INPUT, RELOAD_FOR_OUTPUT, RELOAD_FOR_INSN,
7050397Sobrien  RELOAD_FOR_INPUT_ADDRESS, RELOAD_FOR_INPADDR_ADDRESS,
7150397Sobrien  RELOAD_FOR_OUTPUT_ADDRESS, RELOAD_FOR_OUTADDR_ADDRESS,
7218334Speter  RELOAD_FOR_OPERAND_ADDRESS, RELOAD_FOR_OPADDR_ADDR,
7318334Speter  RELOAD_OTHER, RELOAD_FOR_OTHER_ADDRESS
7418334Speter};
7518334Speter
7690075Sobrien#ifdef GCC_INSN_CODES_H
7790075Sobrien/* Each reload is recorded with a structure like this.  */
7890075Sobrienstruct reload
7990075Sobrien{
8090075Sobrien  /* The value to reload from */
8190075Sobrien  rtx in;
8290075Sobrien  /* Where to store reload-reg afterward if nec (often the same as
8390075Sobrien     reload_in)  */
8490075Sobrien  rtx out;
8518334Speter
8690075Sobrien  /* The class of registers to reload into.  */
8790075Sobrien  enum reg_class class;
8890075Sobrien
8990075Sobrien  /* The mode this operand should have when reloaded, on input.  */
9090075Sobrien  enum machine_mode inmode;
9190075Sobrien  /* The mode this operand should have when reloaded, on output.  */
9290075Sobrien  enum machine_mode outmode;
9390075Sobrien
9490075Sobrien  /* The mode of the reload register.  */
9590075Sobrien  enum machine_mode mode;
9690075Sobrien
9790075Sobrien  /* the largest number of registers this reload will require.  */
9890075Sobrien  unsigned int nregs;
9990075Sobrien
10090075Sobrien  /* Positive amount to increment or decrement by if
10190075Sobrien     reload_in is a PRE_DEC, PRE_INC, POST_DEC, POST_INC.
10290075Sobrien     Ignored otherwise (don't assume it is zero).  */
10390075Sobrien  int inc;
10490075Sobrien  /* A reg for which reload_in is the equivalent.
10590075Sobrien     If reload_in is a symbol_ref which came from
10690075Sobrien     reg_equiv_constant, then this is the pseudo
10790075Sobrien     which has that symbol_ref as equivalent.  */
10890075Sobrien  rtx in_reg;
10990075Sobrien  rtx out_reg;
11090075Sobrien
11190075Sobrien  /* Used in find_reload_regs to record the allocated register.  */
11290075Sobrien  int regno;
11390075Sobrien  /* This is the register to reload into.  If it is zero when `find_reloads'
11490075Sobrien     returns, you must find a suitable register in the class specified by
11590075Sobrien     reload_reg_class, and store here an rtx for that register with mode from
11690075Sobrien     reload_inmode or reload_outmode.  */
11790075Sobrien  rtx reg_rtx;
11890075Sobrien  /* The operand number being reloaded.  This is used to group related reloads
11990075Sobrien     and need not always be equal to the actual operand number in the insn,
12090075Sobrien     though it current will be; for in-out operands, it is one of the two
12190075Sobrien     operand numbers.  */
12290075Sobrien  int opnum;
12390075Sobrien
12490075Sobrien  /* Gives the reload number of a secondary input reload, when needed;
12590075Sobrien     otherwise -1.  */
12690075Sobrien  int secondary_in_reload;
12790075Sobrien  /* Gives the reload number of a secondary output reload, when needed;
12890075Sobrien     otherwise -1.  */
12990075Sobrien  int secondary_out_reload;
13090075Sobrien  /* If a secondary input reload is required, gives the INSN_CODE that uses the
13190075Sobrien     secondary reload as a scratch register, or CODE_FOR_nothing if the
13290075Sobrien     secondary reload register is to be an intermediate register.  */
13390075Sobrien  enum insn_code secondary_in_icode;
13490075Sobrien  /* Likewise, for a secondary output reload.  */
13590075Sobrien  enum insn_code secondary_out_icode;
13690075Sobrien
13790075Sobrien  /* Classifies reload as needed either for addressing an input reload,
13890075Sobrien     addressing an output, for addressing a non-reloaded mem ref, or for
13990075Sobrien     unspecified purposes (i.e., more than one of the above).  */
14090075Sobrien  enum reload_type when_needed;
141132718Skan
14290075Sobrien  /* Nonzero for an optional reload.  Optional reloads are ignored unless the
14390075Sobrien     value is already sitting in a register.  */
14490075Sobrien  unsigned int optional:1;
14590075Sobrien  /* nonzero if this reload shouldn't be combined with another reload.  */
14690075Sobrien  unsigned int nocombine:1;
14790075Sobrien  /* Nonzero if this is a secondary register for one or more reloads.  */
14890075Sobrien  unsigned int secondary_p:1;
14990075Sobrien  /* Nonzero if this reload must use a register not already allocated to a
15090075Sobrien     group.  */
15190075Sobrien  unsigned int nongroup:1;
15290075Sobrien};
15390075Sobrien
15490075Sobrienextern struct reload rld[MAX_RELOADS];
15590075Sobrienextern int n_reloads;
15690075Sobrien#endif
15790075Sobrien
158169689Skanextern GTY (()) VEC(rtx,gc) *reg_equiv_memory_loc_vec;
15918334Speterextern rtx *reg_equiv_constant;
160169689Skanextern rtx *reg_equiv_invariant;
16118334Speterextern rtx *reg_equiv_memory_loc;
16218334Speterextern rtx *reg_equiv_address;
16318334Speterextern rtx *reg_equiv_mem;
164169689Skanextern rtx *reg_equiv_alt_mem_list;
16518334Speter
166169689Skan/* Element N is the list of insns that initialized reg N from its equivalent
167169689Skan   constant or memory slot.  */
168169689Skanextern GTY((length("reg_equiv_init_size"))) rtx *reg_equiv_init;
169169689Skan
170169689Skan/* The size of the previous array, for GC purposes.  */
171169689Skanextern GTY(()) int reg_equiv_init_size;
172169689Skan
17318334Speter/* All the "earlyclobber" operands of the current insn
17418334Speter   are recorded here.  */
17518334Speterextern int n_earlyclobbers;
17618334Speterextern rtx reload_earlyclobbers[MAX_RECOG_OPERANDS];
17718334Speter
17818334Speter/* Save the number of operands.  */
17918334Speterextern int reload_n_operands;
18018334Speter
18118334Speter/* First uid used by insns created by reload in this function.
18218334Speter   Used in find_equiv_reg.  */
18318334Speterextern int reload_first_uid;
18418334Speter
18518334Speter/* Nonzero if indirect addressing is supported when the innermost MEM is
18618334Speter   of the form (MEM (SYMBOL_REF sym)).  It is assumed that the level to
18790075Sobrien   which these are valid is the same as spill_indirect_levels, above.  */
18818334Speter
18918334Speterextern char indirect_symref_ok;
19018334Speter
19118334Speter/* Nonzero if an address (plus (reg frame_pointer) (reg ...)) is valid.  */
19218334Speterextern char double_reg_address_ok;
19318334Speter
19452284Sobrienextern int num_not_at_initial_offset;
19552284Sobrien
19652284Sobrien#if defined SET_HARD_REG_BIT && defined CLEAR_REG_SET
19752284Sobrien/* This structure describes instructions which are relevant for reload.
19852284Sobrien   Apart from all regular insns, this also includes CODE_LABELs, since they
19952284Sobrien   must be examined for register elimination.  */
200132718Skanstruct insn_chain
20152284Sobrien{
202117395Skan  /* Links to the neighbor instructions.  */
20352284Sobrien  struct insn_chain *next, *prev;
20452284Sobrien
20552284Sobrien  /* Link through a chains set up by calculate_needs_all_insns, containing
20652284Sobrien     all insns that need reloading.  */
20752284Sobrien  struct insn_chain *next_need_reload;
20852284Sobrien
20952284Sobrien  /* The basic block this insn is in.  */
21052284Sobrien  int block;
21152284Sobrien  /* The rtx of the insn.  */
21252284Sobrien  rtx insn;
21352284Sobrien  /* Register life information: record all live hard registers, and all
21490075Sobrien     live pseudos that have a hard register.  */
21590075Sobrien  regset_head live_throughout;
21690075Sobrien  regset_head dead_or_set;
21752284Sobrien
21890075Sobrien  /* Copies of the global variables computed by find_reloads.  */
21990075Sobrien  struct reload *rld;
22090075Sobrien  int n_reloads;
22152284Sobrien
22252284Sobrien  /* Indicates which registers have already been used for spills.  */
22352284Sobrien  HARD_REG_SET used_spill_regs;
22452284Sobrien
22552284Sobrien  /* Nonzero if find_reloads said the insn requires reloading.  */
22652284Sobrien  unsigned int need_reload:1;
22752284Sobrien  /* Nonzero if find_reloads needs to be run during reload_as_needed to
22852284Sobrien     perform modifications on any operands.  */
22952284Sobrien  unsigned int need_operand_change:1;
23052284Sobrien  /* Nonzero if eliminate_regs_in_insn said it requires eliminations.  */
23152284Sobrien  unsigned int need_elim:1;
23252284Sobrien  /* Nonzero if this insn was inserted by perform_caller_saves.  */
23352284Sobrien  unsigned int is_caller_save_insn:1;
23452284Sobrien};
23552284Sobrien
23652284Sobrien/* A chain of insn_chain structures to describe all non-note insns in
23752284Sobrien   a function.  */
23852284Sobrienextern struct insn_chain *reload_insn_chain;
23952284Sobrien
24052284Sobrien/* Allocate a new insn_chain structure.  */
241132718Skanextern struct insn_chain *new_insn_chain (void);
24252284Sobrien
243132718Skanextern void compute_use_by_pseudos (HARD_REG_SET *, regset);
24452284Sobrien#endif
24552284Sobrien
24618334Speter/* Functions from reload.c:  */
24718334Speter
248169689Skanextern enum reg_class secondary_reload_class (bool, enum reg_class,
249169689Skan					      enum machine_mode, rtx);
250169689Skan
251169689Skan#ifdef GCC_INSN_CODES_H
252169689Skanextern enum reg_class scratch_reload_class (enum insn_code);
253169689Skan#endif
254169689Skan
255132718Skan/* Return a memory location that will be used to copy X in mode MODE.
25618334Speter   If we haven't already made a location for this mode in this insn,
25718334Speter   call find_reloads_address on the location being returned.  */
258132718Skanextern rtx get_secondary_mem (rtx, enum machine_mode, int, enum reload_type);
25918334Speter
26018334Speter/* Clear any secondary memory locations we've made.  */
261132718Skanextern void clear_secondary_mem (void);
26218334Speter
26318334Speter/* Transfer all replacements that used to be in reload FROM to be in
26418334Speter   reload TO.  */
265132718Skanextern void transfer_replacements (int, int);
26618334Speter
26752284Sobrien/* IN_RTX is the value loaded by a reload that we now decided to inherit,
26852284Sobrien   or a subpart of it.  If we have any replacements registered for IN_RTX,
269132718Skan   cancel the reloads that were supposed to load them.
270132718Skan   Return nonzero if we canceled any reloads.  */
271132718Skanextern int remove_address_replacements (rtx in_rtx);
27218334Speter
27318334Speter/* Like rtx_equal_p except that it allows a REG and a SUBREG to match
27418334Speter   if they are the same hard reg, and has special hacks for
27518334Speter   autoincrement and autodecrement.  */
276132718Skanextern int operands_match_p (rtx, rtx);
27718334Speter
27890075Sobrien/* Return 1 if altering OP will not modify the value of CLOBBER.  */
279132718Skanextern int safe_from_earlyclobber (rtx, rtx);
28018334Speter
28118334Speter/* Search the body of INSN for values that need reloading and record them
28218334Speter   with push_reload.  REPLACE nonzero means record also where the values occur
28318334Speter   so that subst_reloads can be used.  */
284132718Skanextern int find_reloads (rtx, int, int, int, short *);
28518334Speter
28618334Speter/* Compute the sum of X and Y, making canonicalizations assumed in an
28718334Speter   address, namely: sum constant integers, surround the sum of two
28818334Speter   constants with a CONST, put the constant as the second operand, and
28918334Speter   group the constant on the outermost sum.  */
290132718Skanextern rtx form_sum (rtx, rtx);
29118334Speter
29218334Speter/* Substitute into the current INSN the registers into which we have reloaded
29318334Speter   the things that need reloading.  */
294132718Skanextern void subst_reloads (rtx);
29518334Speter
29618334Speter/* Make a copy of any replacements being done into X and move those copies
29718334Speter   to locations in Y, a copy of X.  We only look at the highest level of
29818334Speter   the RTL.  */
299132718Skanextern void copy_replacements (rtx, rtx);
30018334Speter
30150397Sobrien/* Change any replacements being done to *X to be done to *Y */
302132718Skanextern void move_replacements (rtx *x, rtx *y);
30350397Sobrien
30418334Speter/* If LOC was scheduled to be replaced by something, return the replacement.
30518334Speter   Otherwise, return *LOC.  */
306132718Skanextern rtx find_replacement (rtx *);
30718334Speter
30818334Speter/* Nonzero if modifying X will affect IN.  */
309132718Skanextern int reg_overlap_mentioned_for_reload_p (rtx, rtx);
31018334Speter
31118334Speter/* Check the insns before INSN to see if there is a suitable register
31218334Speter   containing the same value as GOAL.  */
313132718Skanextern rtx find_equiv_reg (rtx, rtx, enum reg_class, int, short *,
314132718Skan			   int, enum machine_mode);
31518334Speter
31618334Speter/* Return 1 if register REGNO is the subject of a clobber in insn INSN.  */
317132718Skanextern int regno_clobbered_p (unsigned int, rtx, enum machine_mode, int);
31818334Speter
31990075Sobrien/* Return 1 if X is an operand of an insn that is being earlyclobbered.  */
320132718Skanextern int earlyclobber_operand_p (rtx);
32190075Sobrien
32290075Sobrien/* Record one reload that needs to be performed.  */
323132718Skanextern int push_reload (rtx, rtx, rtx *, rtx *, enum reg_class,
324132718Skan			enum machine_mode, enum machine_mode,
325132718Skan			int, int, int, enum reload_type);
32690075Sobrien
327132718Skan/* Functions in postreload.c:  */
328132718Skanextern void reload_cse_regs (rtx);
329132718Skan
33018334Speter/* Functions in reload1.c:  */
33118334Speter
33218334Speter/* Initialize the reload pass once per compilation.  */
333132718Skanextern void init_reload (void);
33418334Speter
33518334Speter/* The reload pass itself.  */
336132718Skanextern int reload (rtx, int);
33718334Speter
33818334Speter/* Mark the slots in regs_ever_live for the hard regs
33918334Speter   used by pseudo-reg number REGNO.  */
340132718Skanextern void mark_home_live (int);
34118334Speter
34218334Speter/* Scan X and replace any eliminable registers (such as fp) with a
34318334Speter   replacement (such as sp), plus an offset.  */
344132718Skanextern rtx eliminate_regs (rtx, enum machine_mode, rtx);
34518334Speter
34652284Sobrien/* Deallocate the reload register used by reload number R.  */
347132718Skanextern void deallocate_reload_reg (int r);
34852284Sobrien
34918334Speter/* Functions in caller-save.c:  */
35018334Speter
35118334Speter/* Initialize for caller-save.  */
352132718Skanextern void init_caller_save (void);
35318334Speter
35418334Speter/* Initialize save areas by showing that we haven't allocated any yet.  */
355132718Skanextern void init_save_areas (void);
35618334Speter
35718334Speter/* Allocate save areas for any hard registers that might need saving.  */
358132718Skanextern void setup_save_areas (void);
35918334Speter
36018334Speter/* Find the places where hard regs are live across calls and save them.  */
361132718Skanextern void save_call_clobbered_regs (void);
36252284Sobrien
36352284Sobrien/* Replace (subreg (reg)) with the appropriate (reg) for any operands.  */
364132718Skanextern void cleanup_subreg_operands (rtx);
36570635Sobrien
36690075Sobrien/* Debugging support.  */
367132718Skanextern void debug_reload_to_stream (FILE *);
368132718Skanextern void debug_reload (void);
369132718Skan
370132718Skan/* Compute the actual register we should reload to, in case we're
371132718Skan   reloading to/from a register that is wider than a word.  */
372132718Skanextern rtx reload_adjust_reg_for_mode (rtx, enum machine_mode);
373