xref: /dflybsd-src/contrib/gcc-4.7/gcc/reload1.c (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino /* Reload pseudo regs into hard regs for insns that require hard regs.
2*e4b17023SJohn Marino    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3*e4b17023SJohn Marino    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
4*e4b17023SJohn Marino    2011, 2012 Free Software Foundation, Inc.
5*e4b17023SJohn Marino 
6*e4b17023SJohn Marino This file is part of GCC.
7*e4b17023SJohn Marino 
8*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify it under
9*e4b17023SJohn Marino the terms of the GNU General Public License as published by the Free
10*e4b17023SJohn Marino Software Foundation; either version 3, or (at your option) any later
11*e4b17023SJohn Marino version.
12*e4b17023SJohn Marino 
13*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14*e4b17023SJohn Marino WARRANTY; without even the implied warranty of MERCHANTABILITY or
15*e4b17023SJohn Marino FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16*e4b17023SJohn Marino for more details.
17*e4b17023SJohn Marino 
18*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
19*e4b17023SJohn Marino along with GCC; see the file COPYING3.  If not see
20*e4b17023SJohn Marino <http://www.gnu.org/licenses/>.  */
21*e4b17023SJohn Marino 
22*e4b17023SJohn Marino #include "config.h"
23*e4b17023SJohn Marino #include "system.h"
24*e4b17023SJohn Marino #include "coretypes.h"
25*e4b17023SJohn Marino #include "tm.h"
26*e4b17023SJohn Marino 
27*e4b17023SJohn Marino #include "machmode.h"
28*e4b17023SJohn Marino #include "hard-reg-set.h"
29*e4b17023SJohn Marino #include "rtl-error.h"
30*e4b17023SJohn Marino #include "tm_p.h"
31*e4b17023SJohn Marino #include "obstack.h"
32*e4b17023SJohn Marino #include "insn-config.h"
33*e4b17023SJohn Marino #include "ggc.h"
34*e4b17023SJohn Marino #include "flags.h"
35*e4b17023SJohn Marino #include "function.h"
36*e4b17023SJohn Marino #include "expr.h"
37*e4b17023SJohn Marino #include "optabs.h"
38*e4b17023SJohn Marino #include "regs.h"
39*e4b17023SJohn Marino #include "addresses.h"
40*e4b17023SJohn Marino #include "basic-block.h"
41*e4b17023SJohn Marino #include "df.h"
42*e4b17023SJohn Marino #include "reload.h"
43*e4b17023SJohn Marino #include "recog.h"
44*e4b17023SJohn Marino #include "output.h"
45*e4b17023SJohn Marino #include "except.h"
46*e4b17023SJohn Marino #include "tree.h"
47*e4b17023SJohn Marino #include "ira.h"
48*e4b17023SJohn Marino #include "target.h"
49*e4b17023SJohn Marino #include "emit-rtl.h"
50*e4b17023SJohn Marino 
51*e4b17023SJohn Marino /* This file contains the reload pass of the compiler, which is
52*e4b17023SJohn Marino    run after register allocation has been done.  It checks that
53*e4b17023SJohn Marino    each insn is valid (operands required to be in registers really
54*e4b17023SJohn Marino    are in registers of the proper class) and fixes up invalid ones
55*e4b17023SJohn Marino    by copying values temporarily into registers for the insns
56*e4b17023SJohn Marino    that need them.
57*e4b17023SJohn Marino 
58*e4b17023SJohn Marino    The results of register allocation are described by the vector
59*e4b17023SJohn Marino    reg_renumber; the insns still contain pseudo regs, but reg_renumber
60*e4b17023SJohn Marino    can be used to find which hard reg, if any, a pseudo reg is in.
61*e4b17023SJohn Marino 
62*e4b17023SJohn Marino    The technique we always use is to free up a few hard regs that are
63*e4b17023SJohn Marino    called ``reload regs'', and for each place where a pseudo reg
64*e4b17023SJohn Marino    must be in a hard reg, copy it temporarily into one of the reload regs.
65*e4b17023SJohn Marino 
66*e4b17023SJohn Marino    Reload regs are allocated locally for every instruction that needs
67*e4b17023SJohn Marino    reloads.  When there are pseudos which are allocated to a register that
68*e4b17023SJohn Marino    has been chosen as a reload reg, such pseudos must be ``spilled''.
69*e4b17023SJohn Marino    This means that they go to other hard regs, or to stack slots if no other
70*e4b17023SJohn Marino    available hard regs can be found.  Spilling can invalidate more
71*e4b17023SJohn Marino    insns, requiring additional need for reloads, so we must keep checking
72*e4b17023SJohn Marino    until the process stabilizes.
73*e4b17023SJohn Marino 
74*e4b17023SJohn Marino    For machines with different classes of registers, we must keep track
75*e4b17023SJohn Marino    of the register class needed for each reload, and make sure that
76*e4b17023SJohn Marino    we allocate enough reload registers of each class.
77*e4b17023SJohn Marino 
78*e4b17023SJohn Marino    The file reload.c contains the code that checks one insn for
79*e4b17023SJohn Marino    validity and reports the reloads that it needs.  This file
80*e4b17023SJohn Marino    is in charge of scanning the entire rtl code, accumulating the
81*e4b17023SJohn Marino    reload needs, spilling, assigning reload registers to use for
82*e4b17023SJohn Marino    fixing up each insn, and generating the new insns to copy values
83*e4b17023SJohn Marino    into the reload registers.  */
84*e4b17023SJohn Marino 
85*e4b17023SJohn Marino struct target_reload default_target_reload;
86*e4b17023SJohn Marino #if SWITCHABLE_TARGET
87*e4b17023SJohn Marino struct target_reload *this_target_reload = &default_target_reload;
88*e4b17023SJohn Marino #endif
89*e4b17023SJohn Marino 
90*e4b17023SJohn Marino #define spill_indirect_levels			\
91*e4b17023SJohn Marino   (this_target_reload->x_spill_indirect_levels)
92*e4b17023SJohn Marino 
93*e4b17023SJohn Marino /* During reload_as_needed, element N contains a REG rtx for the hard reg
94*e4b17023SJohn Marino    into which reg N has been reloaded (perhaps for a previous insn).  */
95*e4b17023SJohn Marino static rtx *reg_last_reload_reg;
96*e4b17023SJohn Marino 
97*e4b17023SJohn Marino /* Elt N nonzero if reg_last_reload_reg[N] has been set in this insn
98*e4b17023SJohn Marino    for an output reload that stores into reg N.  */
99*e4b17023SJohn Marino static regset_head reg_has_output_reload;
100*e4b17023SJohn Marino 
101*e4b17023SJohn Marino /* Indicates which hard regs are reload-registers for an output reload
102*e4b17023SJohn Marino    in the current insn.  */
103*e4b17023SJohn Marino static HARD_REG_SET reg_is_output_reload;
104*e4b17023SJohn Marino 
105*e4b17023SJohn Marino /* Widest width in which each pseudo reg is referred to (via subreg).  */
106*e4b17023SJohn Marino static unsigned int *reg_max_ref_width;
107*e4b17023SJohn Marino 
108*e4b17023SJohn Marino /* Vector to remember old contents of reg_renumber before spilling.  */
109*e4b17023SJohn Marino static short *reg_old_renumber;
110*e4b17023SJohn Marino 
111*e4b17023SJohn Marino /* During reload_as_needed, element N contains the last pseudo regno reloaded
112*e4b17023SJohn Marino    into hard register N.  If that pseudo reg occupied more than one register,
113*e4b17023SJohn Marino    reg_reloaded_contents points to that pseudo for each spill register in
114*e4b17023SJohn Marino    use; all of these must remain set for an inheritance to occur.  */
115*e4b17023SJohn Marino static int reg_reloaded_contents[FIRST_PSEUDO_REGISTER];
116*e4b17023SJohn Marino 
117*e4b17023SJohn Marino /* During reload_as_needed, element N contains the insn for which
118*e4b17023SJohn Marino    hard register N was last used.   Its contents are significant only
119*e4b17023SJohn Marino    when reg_reloaded_valid is set for this register.  */
120*e4b17023SJohn Marino static rtx reg_reloaded_insn[FIRST_PSEUDO_REGISTER];
121*e4b17023SJohn Marino 
122*e4b17023SJohn Marino /* Indicate if reg_reloaded_insn / reg_reloaded_contents is valid.  */
123*e4b17023SJohn Marino static HARD_REG_SET reg_reloaded_valid;
124*e4b17023SJohn Marino /* Indicate if the register was dead at the end of the reload.
125*e4b17023SJohn Marino    This is only valid if reg_reloaded_contents is set and valid.  */
126*e4b17023SJohn Marino static HARD_REG_SET reg_reloaded_dead;
127*e4b17023SJohn Marino 
128*e4b17023SJohn Marino /* Indicate whether the register's current value is one that is not
129*e4b17023SJohn Marino    safe to retain across a call, even for registers that are normally
130*e4b17023SJohn Marino    call-saved.  This is only meaningful for members of reg_reloaded_valid.  */
131*e4b17023SJohn Marino static HARD_REG_SET reg_reloaded_call_part_clobbered;
132*e4b17023SJohn Marino 
133*e4b17023SJohn Marino /* Number of spill-regs so far; number of valid elements of spill_regs.  */
134*e4b17023SJohn Marino static int n_spills;
135*e4b17023SJohn Marino 
136*e4b17023SJohn Marino /* In parallel with spill_regs, contains REG rtx's for those regs.
137*e4b17023SJohn Marino    Holds the last rtx used for any given reg, or 0 if it has never
138*e4b17023SJohn Marino    been used for spilling yet.  This rtx is reused, provided it has
139*e4b17023SJohn Marino    the proper mode.  */
140*e4b17023SJohn Marino static rtx spill_reg_rtx[FIRST_PSEUDO_REGISTER];
141*e4b17023SJohn Marino 
142*e4b17023SJohn Marino /* In parallel with spill_regs, contains nonzero for a spill reg
143*e4b17023SJohn Marino    that was stored after the last time it was used.
144*e4b17023SJohn Marino    The precise value is the insn generated to do the store.  */
145*e4b17023SJohn Marino static rtx spill_reg_store[FIRST_PSEUDO_REGISTER];
146*e4b17023SJohn Marino 
147*e4b17023SJohn Marino /* This is the register that was stored with spill_reg_store.  This is a
148*e4b17023SJohn Marino    copy of reload_out / reload_out_reg when the value was stored; if
149*e4b17023SJohn Marino    reload_out is a MEM, spill_reg_stored_to will be set to reload_out_reg.  */
150*e4b17023SJohn Marino static rtx spill_reg_stored_to[FIRST_PSEUDO_REGISTER];
151*e4b17023SJohn Marino 
152*e4b17023SJohn Marino /* This table is the inverse mapping of spill_regs:
153*e4b17023SJohn Marino    indexed by hard reg number,
154*e4b17023SJohn Marino    it contains the position of that reg in spill_regs,
155*e4b17023SJohn Marino    or -1 for something that is not in spill_regs.
156*e4b17023SJohn Marino 
157*e4b17023SJohn Marino    ?!?  This is no longer accurate.  */
158*e4b17023SJohn Marino static short spill_reg_order[FIRST_PSEUDO_REGISTER];
159*e4b17023SJohn Marino 
160*e4b17023SJohn Marino /* This reg set indicates registers that can't be used as spill registers for
161*e4b17023SJohn Marino    the currently processed insn.  These are the hard registers which are live
162*e4b17023SJohn Marino    during the insn, but not allocated to pseudos, as well as fixed
163*e4b17023SJohn Marino    registers.  */
164*e4b17023SJohn Marino static HARD_REG_SET bad_spill_regs;
165*e4b17023SJohn Marino 
166*e4b17023SJohn Marino /* These are the hard registers that can't be used as spill register for any
167*e4b17023SJohn Marino    insn.  This includes registers used for user variables and registers that
168*e4b17023SJohn Marino    we can't eliminate.  A register that appears in this set also can't be used
169*e4b17023SJohn Marino    to retry register allocation.  */
170*e4b17023SJohn Marino static HARD_REG_SET bad_spill_regs_global;
171*e4b17023SJohn Marino 
172*e4b17023SJohn Marino /* Describes order of use of registers for reloading
173*e4b17023SJohn Marino    of spilled pseudo-registers.  `n_spills' is the number of
174*e4b17023SJohn Marino    elements that are actually valid; new ones are added at the end.
175*e4b17023SJohn Marino 
176*e4b17023SJohn Marino    Both spill_regs and spill_reg_order are used on two occasions:
177*e4b17023SJohn Marino    once during find_reload_regs, where they keep track of the spill registers
178*e4b17023SJohn Marino    for a single insn, but also during reload_as_needed where they show all
179*e4b17023SJohn Marino    the registers ever used by reload.  For the latter case, the information
180*e4b17023SJohn Marino    is calculated during finish_spills.  */
181*e4b17023SJohn Marino static short spill_regs[FIRST_PSEUDO_REGISTER];
182*e4b17023SJohn Marino 
183*e4b17023SJohn Marino /* This vector of reg sets indicates, for each pseudo, which hard registers
184*e4b17023SJohn Marino    may not be used for retrying global allocation because the register was
185*e4b17023SJohn Marino    formerly spilled from one of them.  If we allowed reallocating a pseudo to
186*e4b17023SJohn Marino    a register that it was already allocated to, reload might not
187*e4b17023SJohn Marino    terminate.  */
188*e4b17023SJohn Marino static HARD_REG_SET *pseudo_previous_regs;
189*e4b17023SJohn Marino 
190*e4b17023SJohn Marino /* This vector of reg sets indicates, for each pseudo, which hard
191*e4b17023SJohn Marino    registers may not be used for retrying global allocation because they
192*e4b17023SJohn Marino    are used as spill registers during one of the insns in which the
193*e4b17023SJohn Marino    pseudo is live.  */
194*e4b17023SJohn Marino static HARD_REG_SET *pseudo_forbidden_regs;
195*e4b17023SJohn Marino 
196*e4b17023SJohn Marino /* All hard regs that have been used as spill registers for any insn are
197*e4b17023SJohn Marino    marked in this set.  */
198*e4b17023SJohn Marino static HARD_REG_SET used_spill_regs;
199*e4b17023SJohn Marino 
200*e4b17023SJohn Marino /* Index of last register assigned as a spill register.  We allocate in
201*e4b17023SJohn Marino    a round-robin fashion.  */
202*e4b17023SJohn Marino static int last_spill_reg;
203*e4b17023SJohn Marino 
204*e4b17023SJohn Marino /* Record the stack slot for each spilled hard register.  */
205*e4b17023SJohn Marino static rtx spill_stack_slot[FIRST_PSEUDO_REGISTER];
206*e4b17023SJohn Marino 
207*e4b17023SJohn Marino /* Width allocated so far for that stack slot.  */
208*e4b17023SJohn Marino static unsigned int spill_stack_slot_width[FIRST_PSEUDO_REGISTER];
209*e4b17023SJohn Marino 
210*e4b17023SJohn Marino /* Record which pseudos needed to be spilled.  */
211*e4b17023SJohn Marino static regset_head spilled_pseudos;
212*e4b17023SJohn Marino 
213*e4b17023SJohn Marino /* Record which pseudos changed their allocation in finish_spills.  */
214*e4b17023SJohn Marino static regset_head changed_allocation_pseudos;
215*e4b17023SJohn Marino 
216*e4b17023SJohn Marino /* Used for communication between order_regs_for_reload and count_pseudo.
217*e4b17023SJohn Marino    Used to avoid counting one pseudo twice.  */
218*e4b17023SJohn Marino static regset_head pseudos_counted;
219*e4b17023SJohn Marino 
220*e4b17023SJohn Marino /* First uid used by insns created by reload in this function.
221*e4b17023SJohn Marino    Used in find_equiv_reg.  */
222*e4b17023SJohn Marino int reload_first_uid;
223*e4b17023SJohn Marino 
224*e4b17023SJohn Marino /* Flag set by local-alloc or global-alloc if anything is live in
225*e4b17023SJohn Marino    a call-clobbered reg across calls.  */
226*e4b17023SJohn Marino int caller_save_needed;
227*e4b17023SJohn Marino 
228*e4b17023SJohn Marino /* Set to 1 while reload_as_needed is operating.
229*e4b17023SJohn Marino    Required by some machines to handle any generated moves differently.  */
230*e4b17023SJohn Marino int reload_in_progress = 0;
231*e4b17023SJohn Marino 
232*e4b17023SJohn Marino /* This obstack is used for allocation of rtl during register elimination.
233*e4b17023SJohn Marino    The allocated storage can be freed once find_reloads has processed the
234*e4b17023SJohn Marino    insn.  */
235*e4b17023SJohn Marino static struct obstack reload_obstack;
236*e4b17023SJohn Marino 
237*e4b17023SJohn Marino /* Points to the beginning of the reload_obstack.  All insn_chain structures
238*e4b17023SJohn Marino    are allocated first.  */
239*e4b17023SJohn Marino static char *reload_startobj;
240*e4b17023SJohn Marino 
241*e4b17023SJohn Marino /* The point after all insn_chain structures.  Used to quickly deallocate
242*e4b17023SJohn Marino    memory allocated in copy_reloads during calculate_needs_all_insns.  */
243*e4b17023SJohn Marino static char *reload_firstobj;
244*e4b17023SJohn Marino 
245*e4b17023SJohn Marino /* This points before all local rtl generated by register elimination.
246*e4b17023SJohn Marino    Used to quickly free all memory after processing one insn.  */
247*e4b17023SJohn Marino static char *reload_insn_firstobj;
248*e4b17023SJohn Marino 
249*e4b17023SJohn Marino /* List of insn_chain instructions, one for every insn that reload needs to
250*e4b17023SJohn Marino    examine.  */
251*e4b17023SJohn Marino struct insn_chain *reload_insn_chain;
252*e4b17023SJohn Marino 
253*e4b17023SJohn Marino /* TRUE if we potentially left dead insns in the insn stream and want to
254*e4b17023SJohn Marino    run DCE immediately after reload, FALSE otherwise.  */
255*e4b17023SJohn Marino static bool need_dce;
256*e4b17023SJohn Marino 
257*e4b17023SJohn Marino /* List of all insns needing reloads.  */
258*e4b17023SJohn Marino static struct insn_chain *insns_need_reload;
259*e4b17023SJohn Marino 
260*e4b17023SJohn Marino /* This structure is used to record information about register eliminations.
261*e4b17023SJohn Marino    Each array entry describes one possible way of eliminating a register
262*e4b17023SJohn Marino    in favor of another.   If there is more than one way of eliminating a
263*e4b17023SJohn Marino    particular register, the most preferred should be specified first.  */
264*e4b17023SJohn Marino 
265*e4b17023SJohn Marino struct elim_table
266*e4b17023SJohn Marino {
267*e4b17023SJohn Marino   int from;			/* Register number to be eliminated.  */
268*e4b17023SJohn Marino   int to;			/* Register number used as replacement.  */
269*e4b17023SJohn Marino   HOST_WIDE_INT initial_offset;	/* Initial difference between values.  */
270*e4b17023SJohn Marino   int can_eliminate;		/* Nonzero if this elimination can be done.  */
271*e4b17023SJohn Marino   int can_eliminate_previous;	/* Value returned by TARGET_CAN_ELIMINATE
272*e4b17023SJohn Marino 				   target hook in previous scan over insns
273*e4b17023SJohn Marino 				   made by reload.  */
274*e4b17023SJohn Marino   HOST_WIDE_INT offset;		/* Current offset between the two regs.  */
275*e4b17023SJohn Marino   HOST_WIDE_INT previous_offset;/* Offset at end of previous insn.  */
276*e4b17023SJohn Marino   int ref_outside_mem;		/* "to" has been referenced outside a MEM.  */
277*e4b17023SJohn Marino   rtx from_rtx;			/* REG rtx for the register to be eliminated.
278*e4b17023SJohn Marino 				   We cannot simply compare the number since
279*e4b17023SJohn Marino 				   we might then spuriously replace a hard
280*e4b17023SJohn Marino 				   register corresponding to a pseudo
281*e4b17023SJohn Marino 				   assigned to the reg to be eliminated.  */
282*e4b17023SJohn Marino   rtx to_rtx;			/* REG rtx for the replacement.  */
283*e4b17023SJohn Marino };
284*e4b17023SJohn Marino 
285*e4b17023SJohn Marino static struct elim_table *reg_eliminate = 0;
286*e4b17023SJohn Marino 
287*e4b17023SJohn Marino /* This is an intermediate structure to initialize the table.  It has
288*e4b17023SJohn Marino    exactly the members provided by ELIMINABLE_REGS.  */
289*e4b17023SJohn Marino static const struct elim_table_1
290*e4b17023SJohn Marino {
291*e4b17023SJohn Marino   const int from;
292*e4b17023SJohn Marino   const int to;
293*e4b17023SJohn Marino } reg_eliminate_1[] =
294*e4b17023SJohn Marino 
295*e4b17023SJohn Marino /* If a set of eliminable registers was specified, define the table from it.
296*e4b17023SJohn Marino    Otherwise, default to the normal case of the frame pointer being
297*e4b17023SJohn Marino    replaced by the stack pointer.  */
298*e4b17023SJohn Marino 
299*e4b17023SJohn Marino #ifdef ELIMINABLE_REGS
300*e4b17023SJohn Marino   ELIMINABLE_REGS;
301*e4b17023SJohn Marino #else
302*e4b17023SJohn Marino   {{ FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}};
303*e4b17023SJohn Marino #endif
304*e4b17023SJohn Marino 
305*e4b17023SJohn Marino #define NUM_ELIMINABLE_REGS ARRAY_SIZE (reg_eliminate_1)
306*e4b17023SJohn Marino 
307*e4b17023SJohn Marino /* Record the number of pending eliminations that have an offset not equal
308*e4b17023SJohn Marino    to their initial offset.  If nonzero, we use a new copy of each
309*e4b17023SJohn Marino    replacement result in any insns encountered.  */
310*e4b17023SJohn Marino int num_not_at_initial_offset;
311*e4b17023SJohn Marino 
312*e4b17023SJohn Marino /* Count the number of registers that we may be able to eliminate.  */
313*e4b17023SJohn Marino static int num_eliminable;
314*e4b17023SJohn Marino /* And the number of registers that are equivalent to a constant that
315*e4b17023SJohn Marino    can be eliminated to frame_pointer / arg_pointer + constant.  */
316*e4b17023SJohn Marino static int num_eliminable_invariants;
317*e4b17023SJohn Marino 
318*e4b17023SJohn Marino /* For each label, we record the offset of each elimination.  If we reach
319*e4b17023SJohn Marino    a label by more than one path and an offset differs, we cannot do the
320*e4b17023SJohn Marino    elimination.  This information is indexed by the difference of the
321*e4b17023SJohn Marino    number of the label and the first label number.  We can't offset the
322*e4b17023SJohn Marino    pointer itself as this can cause problems on machines with segmented
323*e4b17023SJohn Marino    memory.  The first table is an array of flags that records whether we
324*e4b17023SJohn Marino    have yet encountered a label and the second table is an array of arrays,
325*e4b17023SJohn Marino    one entry in the latter array for each elimination.  */
326*e4b17023SJohn Marino 
327*e4b17023SJohn Marino static int first_label_num;
328*e4b17023SJohn Marino static char *offsets_known_at;
329*e4b17023SJohn Marino static HOST_WIDE_INT (*offsets_at)[NUM_ELIMINABLE_REGS];
330*e4b17023SJohn Marino 
331*e4b17023SJohn Marino VEC(reg_equivs_t,gc) *reg_equivs;
332*e4b17023SJohn Marino 
333*e4b17023SJohn Marino /* Stack of addresses where an rtx has been changed.  We can undo the
334*e4b17023SJohn Marino    changes by popping items off the stack and restoring the original
335*e4b17023SJohn Marino    value at each location.
336*e4b17023SJohn Marino 
337*e4b17023SJohn Marino    We use this simplistic undo capability rather than copy_rtx as copy_rtx
338*e4b17023SJohn Marino    will not make a deep copy of a normally sharable rtx, such as
339*e4b17023SJohn Marino    (const (plus (symbol_ref) (const_int))).  If such an expression appears
340*e4b17023SJohn Marino    as R1 in gen_reload_chain_without_interm_reg_p, then a shared
341*e4b17023SJohn Marino    rtx expression would be changed.  See PR 42431.  */
342*e4b17023SJohn Marino 
343*e4b17023SJohn Marino typedef rtx *rtx_p;
344*e4b17023SJohn Marino DEF_VEC_P(rtx_p);
345*e4b17023SJohn Marino DEF_VEC_ALLOC_P(rtx_p,heap);
346*e4b17023SJohn Marino static VEC(rtx_p,heap) *substitute_stack;
347*e4b17023SJohn Marino 
348*e4b17023SJohn Marino /* Number of labels in the current function.  */
349*e4b17023SJohn Marino 
350*e4b17023SJohn Marino static int num_labels;
351*e4b17023SJohn Marino 
352*e4b17023SJohn Marino static void replace_pseudos_in (rtx *, enum machine_mode, rtx);
353*e4b17023SJohn Marino static void maybe_fix_stack_asms (void);
354*e4b17023SJohn Marino static void copy_reloads (struct insn_chain *);
355*e4b17023SJohn Marino static void calculate_needs_all_insns (int);
356*e4b17023SJohn Marino static int find_reg (struct insn_chain *, int);
357*e4b17023SJohn Marino static void find_reload_regs (struct insn_chain *);
358*e4b17023SJohn Marino static void select_reload_regs (void);
359*e4b17023SJohn Marino static void delete_caller_save_insns (void);
360*e4b17023SJohn Marino 
361*e4b17023SJohn Marino static void spill_failure (rtx, enum reg_class);
362*e4b17023SJohn Marino static void count_spilled_pseudo (int, int, int);
363*e4b17023SJohn Marino static void delete_dead_insn (rtx);
364*e4b17023SJohn Marino static void alter_reg (int, int, bool);
365*e4b17023SJohn Marino static void set_label_offsets (rtx, rtx, int);
366*e4b17023SJohn Marino static void check_eliminable_occurrences (rtx);
367*e4b17023SJohn Marino static void elimination_effects (rtx, enum machine_mode);
368*e4b17023SJohn Marino static rtx eliminate_regs_1 (rtx, enum machine_mode, rtx, bool, bool);
369*e4b17023SJohn Marino static int eliminate_regs_in_insn (rtx, int);
370*e4b17023SJohn Marino static void update_eliminable_offsets (void);
371*e4b17023SJohn Marino static void mark_not_eliminable (rtx, const_rtx, void *);
372*e4b17023SJohn Marino static void set_initial_elim_offsets (void);
373*e4b17023SJohn Marino static bool verify_initial_elim_offsets (void);
374*e4b17023SJohn Marino static void set_initial_label_offsets (void);
375*e4b17023SJohn Marino static void set_offsets_for_label (rtx);
376*e4b17023SJohn Marino static void init_eliminable_invariants (rtx, bool);
377*e4b17023SJohn Marino static void init_elim_table (void);
378*e4b17023SJohn Marino static void free_reg_equiv (void);
379*e4b17023SJohn Marino static void update_eliminables (HARD_REG_SET *);
380*e4b17023SJohn Marino static void elimination_costs_in_insn (rtx);
381*e4b17023SJohn Marino static void spill_hard_reg (unsigned int, int);
382*e4b17023SJohn Marino static int finish_spills (int);
383*e4b17023SJohn Marino static void scan_paradoxical_subregs (rtx);
384*e4b17023SJohn Marino static void count_pseudo (int);
385*e4b17023SJohn Marino static void order_regs_for_reload (struct insn_chain *);
386*e4b17023SJohn Marino static void reload_as_needed (int);
387*e4b17023SJohn Marino static void forget_old_reloads_1 (rtx, const_rtx, void *);
388*e4b17023SJohn Marino static void forget_marked_reloads (regset);
389*e4b17023SJohn Marino static int reload_reg_class_lower (const void *, const void *);
390*e4b17023SJohn Marino static void mark_reload_reg_in_use (unsigned int, int, enum reload_type,
391*e4b17023SJohn Marino 				    enum machine_mode);
392*e4b17023SJohn Marino static void clear_reload_reg_in_use (unsigned int, int, enum reload_type,
393*e4b17023SJohn Marino 				     enum machine_mode);
394*e4b17023SJohn Marino static int reload_reg_free_p (unsigned int, int, enum reload_type);
395*e4b17023SJohn Marino static int reload_reg_free_for_value_p (int, int, int, enum reload_type,
396*e4b17023SJohn Marino 					rtx, rtx, int, int);
397*e4b17023SJohn Marino static int free_for_value_p (int, enum machine_mode, int, enum reload_type,
398*e4b17023SJohn Marino 			     rtx, rtx, int, int);
399*e4b17023SJohn Marino static int allocate_reload_reg (struct insn_chain *, int, int);
400*e4b17023SJohn Marino static int conflicts_with_override (rtx);
401*e4b17023SJohn Marino static void failed_reload (rtx, int);
402*e4b17023SJohn Marino static int set_reload_reg (int, int);
403*e4b17023SJohn Marino static void choose_reload_regs_init (struct insn_chain *, rtx *);
404*e4b17023SJohn Marino static void choose_reload_regs (struct insn_chain *);
405*e4b17023SJohn Marino static void emit_input_reload_insns (struct insn_chain *, struct reload *,
406*e4b17023SJohn Marino 				     rtx, int);
407*e4b17023SJohn Marino static void emit_output_reload_insns (struct insn_chain *, struct reload *,
408*e4b17023SJohn Marino 				      int);
409*e4b17023SJohn Marino static void do_input_reload (struct insn_chain *, struct reload *, int);
410*e4b17023SJohn Marino static void do_output_reload (struct insn_chain *, struct reload *, int);
411*e4b17023SJohn Marino static void emit_reload_insns (struct insn_chain *);
412*e4b17023SJohn Marino static void delete_output_reload (rtx, int, int, rtx);
413*e4b17023SJohn Marino static void delete_address_reloads (rtx, rtx);
414*e4b17023SJohn Marino static void delete_address_reloads_1 (rtx, rtx, rtx);
415*e4b17023SJohn Marino static void inc_for_reload (rtx, rtx, rtx, int);
416*e4b17023SJohn Marino #ifdef AUTO_INC_DEC
417*e4b17023SJohn Marino static void add_auto_inc_notes (rtx, rtx);
418*e4b17023SJohn Marino #endif
419*e4b17023SJohn Marino static void substitute (rtx *, const_rtx, rtx);
420*e4b17023SJohn Marino static bool gen_reload_chain_without_interm_reg_p (int, int);
421*e4b17023SJohn Marino static int reloads_conflict (int, int);
422*e4b17023SJohn Marino static rtx gen_reload (rtx, rtx, int, enum reload_type);
423*e4b17023SJohn Marino static rtx emit_insn_if_valid_for_reload (rtx);
424*e4b17023SJohn Marino 
425*e4b17023SJohn Marino /* Initialize the reload pass.  This is called at the beginning of compilation
426*e4b17023SJohn Marino    and may be called again if the target is reinitialized.  */
427*e4b17023SJohn Marino 
428*e4b17023SJohn Marino void
init_reload(void)429*e4b17023SJohn Marino init_reload (void)
430*e4b17023SJohn Marino {
431*e4b17023SJohn Marino   int i;
432*e4b17023SJohn Marino 
433*e4b17023SJohn Marino   /* Often (MEM (REG n)) is still valid even if (REG n) is put on the stack.
434*e4b17023SJohn Marino      Set spill_indirect_levels to the number of levels such addressing is
435*e4b17023SJohn Marino      permitted, zero if it is not permitted at all.  */
436*e4b17023SJohn Marino 
437*e4b17023SJohn Marino   rtx tem
438*e4b17023SJohn Marino     = gen_rtx_MEM (Pmode,
439*e4b17023SJohn Marino 		   gen_rtx_PLUS (Pmode,
440*e4b17023SJohn Marino 				 gen_rtx_REG (Pmode,
441*e4b17023SJohn Marino 					      LAST_VIRTUAL_REGISTER + 1),
442*e4b17023SJohn Marino 				 GEN_INT (4)));
443*e4b17023SJohn Marino   spill_indirect_levels = 0;
444*e4b17023SJohn Marino 
445*e4b17023SJohn Marino   while (memory_address_p (QImode, tem))
446*e4b17023SJohn Marino     {
447*e4b17023SJohn Marino       spill_indirect_levels++;
448*e4b17023SJohn Marino       tem = gen_rtx_MEM (Pmode, tem);
449*e4b17023SJohn Marino     }
450*e4b17023SJohn Marino 
451*e4b17023SJohn Marino   /* See if indirect addressing is valid for (MEM (SYMBOL_REF ...)).  */
452*e4b17023SJohn Marino 
453*e4b17023SJohn Marino   tem = gen_rtx_MEM (Pmode, gen_rtx_SYMBOL_REF (Pmode, "foo"));
454*e4b17023SJohn Marino   indirect_symref_ok = memory_address_p (QImode, tem);
455*e4b17023SJohn Marino 
456*e4b17023SJohn Marino   /* See if reg+reg is a valid (and offsettable) address.  */
457*e4b17023SJohn Marino 
458*e4b17023SJohn Marino   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
459*e4b17023SJohn Marino     {
460*e4b17023SJohn Marino       tem = gen_rtx_PLUS (Pmode,
461*e4b17023SJohn Marino 			  gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM),
462*e4b17023SJohn Marino 			  gen_rtx_REG (Pmode, i));
463*e4b17023SJohn Marino 
464*e4b17023SJohn Marino       /* This way, we make sure that reg+reg is an offsettable address.  */
465*e4b17023SJohn Marino       tem = plus_constant (tem, 4);
466*e4b17023SJohn Marino 
467*e4b17023SJohn Marino       if (memory_address_p (QImode, tem))
468*e4b17023SJohn Marino 	{
469*e4b17023SJohn Marino 	  double_reg_address_ok = 1;
470*e4b17023SJohn Marino 	  break;
471*e4b17023SJohn Marino 	}
472*e4b17023SJohn Marino     }
473*e4b17023SJohn Marino 
474*e4b17023SJohn Marino   /* Initialize obstack for our rtl allocation.  */
475*e4b17023SJohn Marino   gcc_obstack_init (&reload_obstack);
476*e4b17023SJohn Marino   reload_startobj = XOBNEWVAR (&reload_obstack, char, 0);
477*e4b17023SJohn Marino 
478*e4b17023SJohn Marino   INIT_REG_SET (&spilled_pseudos);
479*e4b17023SJohn Marino   INIT_REG_SET (&changed_allocation_pseudos);
480*e4b17023SJohn Marino   INIT_REG_SET (&pseudos_counted);
481*e4b17023SJohn Marino }
482*e4b17023SJohn Marino 
483*e4b17023SJohn Marino /* List of insn chains that are currently unused.  */
484*e4b17023SJohn Marino static struct insn_chain *unused_insn_chains = 0;
485*e4b17023SJohn Marino 
486*e4b17023SJohn Marino /* Allocate an empty insn_chain structure.  */
487*e4b17023SJohn Marino struct insn_chain *
new_insn_chain(void)488*e4b17023SJohn Marino new_insn_chain (void)
489*e4b17023SJohn Marino {
490*e4b17023SJohn Marino   struct insn_chain *c;
491*e4b17023SJohn Marino 
492*e4b17023SJohn Marino   if (unused_insn_chains == 0)
493*e4b17023SJohn Marino     {
494*e4b17023SJohn Marino       c = XOBNEW (&reload_obstack, struct insn_chain);
495*e4b17023SJohn Marino       INIT_REG_SET (&c->live_throughout);
496*e4b17023SJohn Marino       INIT_REG_SET (&c->dead_or_set);
497*e4b17023SJohn Marino     }
498*e4b17023SJohn Marino   else
499*e4b17023SJohn Marino     {
500*e4b17023SJohn Marino       c = unused_insn_chains;
501*e4b17023SJohn Marino       unused_insn_chains = c->next;
502*e4b17023SJohn Marino     }
503*e4b17023SJohn Marino   c->is_caller_save_insn = 0;
504*e4b17023SJohn Marino   c->need_operand_change = 0;
505*e4b17023SJohn Marino   c->need_reload = 0;
506*e4b17023SJohn Marino   c->need_elim = 0;
507*e4b17023SJohn Marino   return c;
508*e4b17023SJohn Marino }
509*e4b17023SJohn Marino 
510*e4b17023SJohn Marino /* Small utility function to set all regs in hard reg set TO which are
511*e4b17023SJohn Marino    allocated to pseudos in regset FROM.  */
512*e4b17023SJohn Marino 
513*e4b17023SJohn Marino void
compute_use_by_pseudos(HARD_REG_SET * to,regset from)514*e4b17023SJohn Marino compute_use_by_pseudos (HARD_REG_SET *to, regset from)
515*e4b17023SJohn Marino {
516*e4b17023SJohn Marino   unsigned int regno;
517*e4b17023SJohn Marino   reg_set_iterator rsi;
518*e4b17023SJohn Marino 
519*e4b17023SJohn Marino   EXECUTE_IF_SET_IN_REG_SET (from, FIRST_PSEUDO_REGISTER, regno, rsi)
520*e4b17023SJohn Marino     {
521*e4b17023SJohn Marino       int r = reg_renumber[regno];
522*e4b17023SJohn Marino 
523*e4b17023SJohn Marino       if (r < 0)
524*e4b17023SJohn Marino 	{
525*e4b17023SJohn Marino 	  /* reload_combine uses the information from DF_LIVE_IN,
526*e4b17023SJohn Marino 	     which might still contain registers that have not
527*e4b17023SJohn Marino 	     actually been allocated since they have an
528*e4b17023SJohn Marino 	     equivalence.  */
529*e4b17023SJohn Marino 	  gcc_assert (ira_conflicts_p || reload_completed);
530*e4b17023SJohn Marino 	}
531*e4b17023SJohn Marino       else
532*e4b17023SJohn Marino 	add_to_hard_reg_set (to, PSEUDO_REGNO_MODE (regno), r);
533*e4b17023SJohn Marino     }
534*e4b17023SJohn Marino }
535*e4b17023SJohn Marino 
536*e4b17023SJohn Marino /* Replace all pseudos found in LOC with their corresponding
537*e4b17023SJohn Marino    equivalences.  */
538*e4b17023SJohn Marino 
539*e4b17023SJohn Marino static void
replace_pseudos_in(rtx * loc,enum machine_mode mem_mode,rtx usage)540*e4b17023SJohn Marino replace_pseudos_in (rtx *loc, enum machine_mode mem_mode, rtx usage)
541*e4b17023SJohn Marino {
542*e4b17023SJohn Marino   rtx x = *loc;
543*e4b17023SJohn Marino   enum rtx_code code;
544*e4b17023SJohn Marino   const char *fmt;
545*e4b17023SJohn Marino   int i, j;
546*e4b17023SJohn Marino 
547*e4b17023SJohn Marino   if (! x)
548*e4b17023SJohn Marino     return;
549*e4b17023SJohn Marino 
550*e4b17023SJohn Marino   code = GET_CODE (x);
551*e4b17023SJohn Marino   if (code == REG)
552*e4b17023SJohn Marino     {
553*e4b17023SJohn Marino       unsigned int regno = REGNO (x);
554*e4b17023SJohn Marino 
555*e4b17023SJohn Marino       if (regno < FIRST_PSEUDO_REGISTER)
556*e4b17023SJohn Marino 	return;
557*e4b17023SJohn Marino 
558*e4b17023SJohn Marino       x = eliminate_regs_1 (x, mem_mode, usage, true, false);
559*e4b17023SJohn Marino       if (x != *loc)
560*e4b17023SJohn Marino 	{
561*e4b17023SJohn Marino 	  *loc = x;
562*e4b17023SJohn Marino 	  replace_pseudos_in (loc, mem_mode, usage);
563*e4b17023SJohn Marino 	  return;
564*e4b17023SJohn Marino 	}
565*e4b17023SJohn Marino 
566*e4b17023SJohn Marino       if (reg_equiv_constant (regno))
567*e4b17023SJohn Marino 	*loc = reg_equiv_constant (regno);
568*e4b17023SJohn Marino       else if (reg_equiv_invariant (regno))
569*e4b17023SJohn Marino 	*loc = reg_equiv_invariant (regno);
570*e4b17023SJohn Marino       else if (reg_equiv_mem (regno))
571*e4b17023SJohn Marino 	*loc = reg_equiv_mem (regno);
572*e4b17023SJohn Marino       else if (reg_equiv_address (regno))
573*e4b17023SJohn Marino 	*loc = gen_rtx_MEM (GET_MODE (x), reg_equiv_address (regno));
574*e4b17023SJohn Marino       else
575*e4b17023SJohn Marino 	{
576*e4b17023SJohn Marino 	  gcc_assert (!REG_P (regno_reg_rtx[regno])
577*e4b17023SJohn Marino 		      || REGNO (regno_reg_rtx[regno]) != regno);
578*e4b17023SJohn Marino 	  *loc = regno_reg_rtx[regno];
579*e4b17023SJohn Marino 	}
580*e4b17023SJohn Marino 
581*e4b17023SJohn Marino       return;
582*e4b17023SJohn Marino     }
583*e4b17023SJohn Marino   else if (code == MEM)
584*e4b17023SJohn Marino     {
585*e4b17023SJohn Marino       replace_pseudos_in (& XEXP (x, 0), GET_MODE (x), usage);
586*e4b17023SJohn Marino       return;
587*e4b17023SJohn Marino     }
588*e4b17023SJohn Marino 
589*e4b17023SJohn Marino   /* Process each of our operands recursively.  */
590*e4b17023SJohn Marino   fmt = GET_RTX_FORMAT (code);
591*e4b17023SJohn Marino   for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
592*e4b17023SJohn Marino     if (*fmt == 'e')
593*e4b17023SJohn Marino       replace_pseudos_in (&XEXP (x, i), mem_mode, usage);
594*e4b17023SJohn Marino     else if (*fmt == 'E')
595*e4b17023SJohn Marino       for (j = 0; j < XVECLEN (x, i); j++)
596*e4b17023SJohn Marino 	replace_pseudos_in (& XVECEXP (x, i, j), mem_mode, usage);
597*e4b17023SJohn Marino }
598*e4b17023SJohn Marino 
599*e4b17023SJohn Marino /* Determine if the current function has an exception receiver block
600*e4b17023SJohn Marino    that reaches the exit block via non-exceptional edges  */
601*e4b17023SJohn Marino 
602*e4b17023SJohn Marino static bool
has_nonexceptional_receiver(void)603*e4b17023SJohn Marino has_nonexceptional_receiver (void)
604*e4b17023SJohn Marino {
605*e4b17023SJohn Marino   edge e;
606*e4b17023SJohn Marino   edge_iterator ei;
607*e4b17023SJohn Marino   basic_block *tos, *worklist, bb;
608*e4b17023SJohn Marino 
609*e4b17023SJohn Marino   /* If we're not optimizing, then just err on the safe side.  */
610*e4b17023SJohn Marino   if (!optimize)
611*e4b17023SJohn Marino     return true;
612*e4b17023SJohn Marino 
613*e4b17023SJohn Marino   /* First determine which blocks can reach exit via normal paths.  */
614*e4b17023SJohn Marino   tos = worklist = XNEWVEC (basic_block, n_basic_blocks + 1);
615*e4b17023SJohn Marino 
616*e4b17023SJohn Marino   FOR_EACH_BB (bb)
617*e4b17023SJohn Marino     bb->flags &= ~BB_REACHABLE;
618*e4b17023SJohn Marino 
619*e4b17023SJohn Marino   /* Place the exit block on our worklist.  */
620*e4b17023SJohn Marino   EXIT_BLOCK_PTR->flags |= BB_REACHABLE;
621*e4b17023SJohn Marino   *tos++ = EXIT_BLOCK_PTR;
622*e4b17023SJohn Marino 
623*e4b17023SJohn Marino   /* Iterate: find everything reachable from what we've already seen.  */
624*e4b17023SJohn Marino   while (tos != worklist)
625*e4b17023SJohn Marino     {
626*e4b17023SJohn Marino       bb = *--tos;
627*e4b17023SJohn Marino 
628*e4b17023SJohn Marino       FOR_EACH_EDGE (e, ei, bb->preds)
629*e4b17023SJohn Marino 	if (!(e->flags & EDGE_ABNORMAL))
630*e4b17023SJohn Marino 	  {
631*e4b17023SJohn Marino 	    basic_block src = e->src;
632*e4b17023SJohn Marino 
633*e4b17023SJohn Marino 	    if (!(src->flags & BB_REACHABLE))
634*e4b17023SJohn Marino 	      {
635*e4b17023SJohn Marino 		src->flags |= BB_REACHABLE;
636*e4b17023SJohn Marino 		*tos++ = src;
637*e4b17023SJohn Marino 	      }
638*e4b17023SJohn Marino 	  }
639*e4b17023SJohn Marino     }
640*e4b17023SJohn Marino   free (worklist);
641*e4b17023SJohn Marino 
642*e4b17023SJohn Marino   /* Now see if there's a reachable block with an exceptional incoming
643*e4b17023SJohn Marino      edge.  */
644*e4b17023SJohn Marino   FOR_EACH_BB (bb)
645*e4b17023SJohn Marino     if (bb->flags & BB_REACHABLE && bb_has_abnormal_pred (bb))
646*e4b17023SJohn Marino       return true;
647*e4b17023SJohn Marino 
648*e4b17023SJohn Marino   /* No exceptional block reached exit unexceptionally.  */
649*e4b17023SJohn Marino   return false;
650*e4b17023SJohn Marino }
651*e4b17023SJohn Marino 
652*e4b17023SJohn Marino /* Grow (or allocate) the REG_EQUIVS array from its current size (which may be
653*e4b17023SJohn Marino    zero elements) to MAX_REG_NUM elements.
654*e4b17023SJohn Marino 
655*e4b17023SJohn Marino    Initialize all new fields to NULL and update REG_EQUIVS_SIZE.  */
656*e4b17023SJohn Marino void
grow_reg_equivs(void)657*e4b17023SJohn Marino grow_reg_equivs (void)
658*e4b17023SJohn Marino {
659*e4b17023SJohn Marino   int old_size = VEC_length (reg_equivs_t, reg_equivs);
660*e4b17023SJohn Marino   int max_regno = max_reg_num ();
661*e4b17023SJohn Marino   int i;
662*e4b17023SJohn Marino 
663*e4b17023SJohn Marino   VEC_reserve (reg_equivs_t, gc, reg_equivs, max_regno);
664*e4b17023SJohn Marino   for (i = old_size; i < max_regno; i++)
665*e4b17023SJohn Marino     {
666*e4b17023SJohn Marino       VEC_quick_insert (reg_equivs_t, reg_equivs, i, 0);
667*e4b17023SJohn Marino       memset (VEC_index (reg_equivs_t, reg_equivs, i), 0, sizeof (reg_equivs_t));
668*e4b17023SJohn Marino     }
669*e4b17023SJohn Marino 
670*e4b17023SJohn Marino }
671*e4b17023SJohn Marino 
672*e4b17023SJohn Marino 
673*e4b17023SJohn Marino /* Global variables used by reload and its subroutines.  */
674*e4b17023SJohn Marino 
675*e4b17023SJohn Marino /* The current basic block while in calculate_elim_costs_all_insns.  */
676*e4b17023SJohn Marino static basic_block elim_bb;
677*e4b17023SJohn Marino 
678*e4b17023SJohn Marino /* Set during calculate_needs if an insn needs register elimination.  */
679*e4b17023SJohn Marino static int something_needs_elimination;
680*e4b17023SJohn Marino /* Set during calculate_needs if an insn needs an operand changed.  */
681*e4b17023SJohn Marino static int something_needs_operands_changed;
682*e4b17023SJohn Marino /* Set by alter_regs if we spilled a register to the stack.  */
683*e4b17023SJohn Marino static bool something_was_spilled;
684*e4b17023SJohn Marino 
685*e4b17023SJohn Marino /* Nonzero means we couldn't get enough spill regs.  */
686*e4b17023SJohn Marino static int failure;
687*e4b17023SJohn Marino 
688*e4b17023SJohn Marino /* Temporary array of pseudo-register number.  */
689*e4b17023SJohn Marino static int *temp_pseudo_reg_arr;
690*e4b17023SJohn Marino 
691*e4b17023SJohn Marino /* Main entry point for the reload pass.
692*e4b17023SJohn Marino 
693*e4b17023SJohn Marino    FIRST is the first insn of the function being compiled.
694*e4b17023SJohn Marino 
695*e4b17023SJohn Marino    GLOBAL nonzero means we were called from global_alloc
696*e4b17023SJohn Marino    and should attempt to reallocate any pseudoregs that we
697*e4b17023SJohn Marino    displace from hard regs we will use for reloads.
698*e4b17023SJohn Marino    If GLOBAL is zero, we do not have enough information to do that,
699*e4b17023SJohn Marino    so any pseudo reg that is spilled must go to the stack.
700*e4b17023SJohn Marino 
701*e4b17023SJohn Marino    Return value is TRUE if reload likely left dead insns in the
702*e4b17023SJohn Marino    stream and a DCE pass should be run to elimiante them.  Else the
703*e4b17023SJohn Marino    return value is FALSE.  */
704*e4b17023SJohn Marino 
705*e4b17023SJohn Marino bool
reload(rtx first,int global)706*e4b17023SJohn Marino reload (rtx first, int global)
707*e4b17023SJohn Marino {
708*e4b17023SJohn Marino   int i, n;
709*e4b17023SJohn Marino   rtx insn;
710*e4b17023SJohn Marino   struct elim_table *ep;
711*e4b17023SJohn Marino   basic_block bb;
712*e4b17023SJohn Marino   bool inserted;
713*e4b17023SJohn Marino 
714*e4b17023SJohn Marino   /* Make sure even insns with volatile mem refs are recognizable.  */
715*e4b17023SJohn Marino   init_recog ();
716*e4b17023SJohn Marino 
717*e4b17023SJohn Marino   failure = 0;
718*e4b17023SJohn Marino 
719*e4b17023SJohn Marino   reload_firstobj = XOBNEWVAR (&reload_obstack, char, 0);
720*e4b17023SJohn Marino 
721*e4b17023SJohn Marino   /* Make sure that the last insn in the chain
722*e4b17023SJohn Marino      is not something that needs reloading.  */
723*e4b17023SJohn Marino   emit_note (NOTE_INSN_DELETED);
724*e4b17023SJohn Marino 
725*e4b17023SJohn Marino   /* Enable find_equiv_reg to distinguish insns made by reload.  */
726*e4b17023SJohn Marino   reload_first_uid = get_max_uid ();
727*e4b17023SJohn Marino 
728*e4b17023SJohn Marino #ifdef SECONDARY_MEMORY_NEEDED
729*e4b17023SJohn Marino   /* Initialize the secondary memory table.  */
730*e4b17023SJohn Marino   clear_secondary_mem ();
731*e4b17023SJohn Marino #endif
732*e4b17023SJohn Marino 
733*e4b17023SJohn Marino   /* We don't have a stack slot for any spill reg yet.  */
734*e4b17023SJohn Marino   memset (spill_stack_slot, 0, sizeof spill_stack_slot);
735*e4b17023SJohn Marino   memset (spill_stack_slot_width, 0, sizeof spill_stack_slot_width);
736*e4b17023SJohn Marino 
737*e4b17023SJohn Marino   /* Initialize the save area information for caller-save, in case some
738*e4b17023SJohn Marino      are needed.  */
739*e4b17023SJohn Marino   init_save_areas ();
740*e4b17023SJohn Marino 
741*e4b17023SJohn Marino   /* Compute which hard registers are now in use
742*e4b17023SJohn Marino      as homes for pseudo registers.
743*e4b17023SJohn Marino      This is done here rather than (eg) in global_alloc
744*e4b17023SJohn Marino      because this point is reached even if not optimizing.  */
745*e4b17023SJohn Marino   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
746*e4b17023SJohn Marino     mark_home_live (i);
747*e4b17023SJohn Marino 
748*e4b17023SJohn Marino   /* A function that has a nonlocal label that can reach the exit
749*e4b17023SJohn Marino      block via non-exceptional paths must save all call-saved
750*e4b17023SJohn Marino      registers.  */
751*e4b17023SJohn Marino   if (cfun->has_nonlocal_label
752*e4b17023SJohn Marino       && has_nonexceptional_receiver ())
753*e4b17023SJohn Marino     crtl->saves_all_registers = 1;
754*e4b17023SJohn Marino 
755*e4b17023SJohn Marino   if (crtl->saves_all_registers)
756*e4b17023SJohn Marino     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
757*e4b17023SJohn Marino       if (! call_used_regs[i] && ! fixed_regs[i] && ! LOCAL_REGNO (i))
758*e4b17023SJohn Marino 	df_set_regs_ever_live (i, true);
759*e4b17023SJohn Marino 
760*e4b17023SJohn Marino   /* Find all the pseudo registers that didn't get hard regs
761*e4b17023SJohn Marino      but do have known equivalent constants or memory slots.
762*e4b17023SJohn Marino      These include parameters (known equivalent to parameter slots)
763*e4b17023SJohn Marino      and cse'd or loop-moved constant memory addresses.
764*e4b17023SJohn Marino 
765*e4b17023SJohn Marino      Record constant equivalents in reg_equiv_constant
766*e4b17023SJohn Marino      so they will be substituted by find_reloads.
767*e4b17023SJohn Marino      Record memory equivalents in reg_mem_equiv so they can
768*e4b17023SJohn Marino      be substituted eventually by altering the REG-rtx's.  */
769*e4b17023SJohn Marino 
770*e4b17023SJohn Marino   grow_reg_equivs ();
771*e4b17023SJohn Marino   reg_old_renumber = XCNEWVEC (short, max_regno);
772*e4b17023SJohn Marino   memcpy (reg_old_renumber, reg_renumber, max_regno * sizeof (short));
773*e4b17023SJohn Marino   pseudo_forbidden_regs = XNEWVEC (HARD_REG_SET, max_regno);
774*e4b17023SJohn Marino   pseudo_previous_regs = XCNEWVEC (HARD_REG_SET, max_regno);
775*e4b17023SJohn Marino 
776*e4b17023SJohn Marino   CLEAR_HARD_REG_SET (bad_spill_regs_global);
777*e4b17023SJohn Marino 
778*e4b17023SJohn Marino   init_eliminable_invariants (first, true);
779*e4b17023SJohn Marino   init_elim_table ();
780*e4b17023SJohn Marino 
781*e4b17023SJohn Marino   /* Alter each pseudo-reg rtx to contain its hard reg number.  Assign
782*e4b17023SJohn Marino      stack slots to the pseudos that lack hard regs or equivalents.
783*e4b17023SJohn Marino      Do not touch virtual registers.  */
784*e4b17023SJohn Marino 
785*e4b17023SJohn Marino   temp_pseudo_reg_arr = XNEWVEC (int, max_regno - LAST_VIRTUAL_REGISTER - 1);
786*e4b17023SJohn Marino   for (n = 0, i = LAST_VIRTUAL_REGISTER + 1; i < max_regno; i++)
787*e4b17023SJohn Marino     temp_pseudo_reg_arr[n++] = i;
788*e4b17023SJohn Marino 
789*e4b17023SJohn Marino   if (ira_conflicts_p)
790*e4b17023SJohn Marino     /* Ask IRA to order pseudo-registers for better stack slot
791*e4b17023SJohn Marino        sharing.  */
792*e4b17023SJohn Marino     ira_sort_regnos_for_alter_reg (temp_pseudo_reg_arr, n, reg_max_ref_width);
793*e4b17023SJohn Marino 
794*e4b17023SJohn Marino   for (i = 0; i < n; i++)
795*e4b17023SJohn Marino     alter_reg (temp_pseudo_reg_arr[i], -1, false);
796*e4b17023SJohn Marino 
797*e4b17023SJohn Marino   /* If we have some registers we think can be eliminated, scan all insns to
798*e4b17023SJohn Marino      see if there is an insn that sets one of these registers to something
799*e4b17023SJohn Marino      other than itself plus a constant.  If so, the register cannot be
800*e4b17023SJohn Marino      eliminated.  Doing this scan here eliminates an extra pass through the
801*e4b17023SJohn Marino      main reload loop in the most common case where register elimination
802*e4b17023SJohn Marino      cannot be done.  */
803*e4b17023SJohn Marino   for (insn = first; insn && num_eliminable; insn = NEXT_INSN (insn))
804*e4b17023SJohn Marino     if (INSN_P (insn))
805*e4b17023SJohn Marino       note_stores (PATTERN (insn), mark_not_eliminable, NULL);
806*e4b17023SJohn Marino 
807*e4b17023SJohn Marino   maybe_fix_stack_asms ();
808*e4b17023SJohn Marino 
809*e4b17023SJohn Marino   insns_need_reload = 0;
810*e4b17023SJohn Marino   something_needs_elimination = 0;
811*e4b17023SJohn Marino 
812*e4b17023SJohn Marino   /* Initialize to -1, which means take the first spill register.  */
813*e4b17023SJohn Marino   last_spill_reg = -1;
814*e4b17023SJohn Marino 
815*e4b17023SJohn Marino   /* Spill any hard regs that we know we can't eliminate.  */
816*e4b17023SJohn Marino   CLEAR_HARD_REG_SET (used_spill_regs);
817*e4b17023SJohn Marino   /* There can be multiple ways to eliminate a register;
818*e4b17023SJohn Marino      they should be listed adjacently.
819*e4b17023SJohn Marino      Elimination for any register fails only if all possible ways fail.  */
820*e4b17023SJohn Marino   for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; )
821*e4b17023SJohn Marino     {
822*e4b17023SJohn Marino       int from = ep->from;
823*e4b17023SJohn Marino       int can_eliminate = 0;
824*e4b17023SJohn Marino       do
825*e4b17023SJohn Marino 	{
826*e4b17023SJohn Marino           can_eliminate |= ep->can_eliminate;
827*e4b17023SJohn Marino           ep++;
828*e4b17023SJohn Marino 	}
829*e4b17023SJohn Marino       while (ep < &reg_eliminate[NUM_ELIMINABLE_REGS] && ep->from == from);
830*e4b17023SJohn Marino       if (! can_eliminate)
831*e4b17023SJohn Marino 	spill_hard_reg (from, 1);
832*e4b17023SJohn Marino     }
833*e4b17023SJohn Marino 
834*e4b17023SJohn Marino #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
835*e4b17023SJohn Marino   if (frame_pointer_needed)
836*e4b17023SJohn Marino     spill_hard_reg (HARD_FRAME_POINTER_REGNUM, 1);
837*e4b17023SJohn Marino #endif
838*e4b17023SJohn Marino   finish_spills (global);
839*e4b17023SJohn Marino 
840*e4b17023SJohn Marino   /* From now on, we may need to generate moves differently.  We may also
841*e4b17023SJohn Marino      allow modifications of insns which cause them to not be recognized.
842*e4b17023SJohn Marino      Any such modifications will be cleaned up during reload itself.  */
843*e4b17023SJohn Marino   reload_in_progress = 1;
844*e4b17023SJohn Marino 
845*e4b17023SJohn Marino   /* This loop scans the entire function each go-round
846*e4b17023SJohn Marino      and repeats until one repetition spills no additional hard regs.  */
847*e4b17023SJohn Marino   for (;;)
848*e4b17023SJohn Marino     {
849*e4b17023SJohn Marino       int something_changed;
850*e4b17023SJohn Marino       int did_spill;
851*e4b17023SJohn Marino       HOST_WIDE_INT starting_frame_size;
852*e4b17023SJohn Marino 
853*e4b17023SJohn Marino       starting_frame_size = get_frame_size ();
854*e4b17023SJohn Marino       something_was_spilled = false;
855*e4b17023SJohn Marino 
856*e4b17023SJohn Marino       set_initial_elim_offsets ();
857*e4b17023SJohn Marino       set_initial_label_offsets ();
858*e4b17023SJohn Marino 
859*e4b17023SJohn Marino       /* For each pseudo register that has an equivalent location defined,
860*e4b17023SJohn Marino 	 try to eliminate any eliminable registers (such as the frame pointer)
861*e4b17023SJohn Marino 	 assuming initial offsets for the replacement register, which
862*e4b17023SJohn Marino 	 is the normal case.
863*e4b17023SJohn Marino 
864*e4b17023SJohn Marino 	 If the resulting location is directly addressable, substitute
865*e4b17023SJohn Marino 	 the MEM we just got directly for the old REG.
866*e4b17023SJohn Marino 
867*e4b17023SJohn Marino 	 If it is not addressable but is a constant or the sum of a hard reg
868*e4b17023SJohn Marino 	 and constant, it is probably not addressable because the constant is
869*e4b17023SJohn Marino 	 out of range, in that case record the address; we will generate
870*e4b17023SJohn Marino 	 hairy code to compute the address in a register each time it is
871*e4b17023SJohn Marino 	 needed.  Similarly if it is a hard register, but one that is not
872*e4b17023SJohn Marino 	 valid as an address register.
873*e4b17023SJohn Marino 
874*e4b17023SJohn Marino 	 If the location is not addressable, but does not have one of the
875*e4b17023SJohn Marino 	 above forms, assign a stack slot.  We have to do this to avoid the
876*e4b17023SJohn Marino 	 potential of producing lots of reloads if, e.g., a location involves
877*e4b17023SJohn Marino 	 a pseudo that didn't get a hard register and has an equivalent memory
878*e4b17023SJohn Marino 	 location that also involves a pseudo that didn't get a hard register.
879*e4b17023SJohn Marino 
880*e4b17023SJohn Marino 	 Perhaps at some point we will improve reload_when_needed handling
881*e4b17023SJohn Marino 	 so this problem goes away.  But that's very hairy.  */
882*e4b17023SJohn Marino 
883*e4b17023SJohn Marino       for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
884*e4b17023SJohn Marino 	if (reg_renumber[i] < 0 && reg_equiv_memory_loc (i))
885*e4b17023SJohn Marino 	  {
886*e4b17023SJohn Marino 	    rtx x = eliminate_regs (reg_equiv_memory_loc (i), VOIDmode,
887*e4b17023SJohn Marino 				    NULL_RTX);
888*e4b17023SJohn Marino 
889*e4b17023SJohn Marino 	    if (strict_memory_address_addr_space_p
890*e4b17023SJohn Marino 		  (GET_MODE (regno_reg_rtx[i]), XEXP (x, 0),
891*e4b17023SJohn Marino 		   MEM_ADDR_SPACE (x)))
892*e4b17023SJohn Marino 	      reg_equiv_mem (i) = x, reg_equiv_address (i) = 0;
893*e4b17023SJohn Marino 	    else if (CONSTANT_P (XEXP (x, 0))
894*e4b17023SJohn Marino 		     || (REG_P (XEXP (x, 0))
895*e4b17023SJohn Marino 			 && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
896*e4b17023SJohn Marino 		     || (GET_CODE (XEXP (x, 0)) == PLUS
897*e4b17023SJohn Marino 			 && REG_P (XEXP (XEXP (x, 0), 0))
898*e4b17023SJohn Marino 			 && (REGNO (XEXP (XEXP (x, 0), 0))
899*e4b17023SJohn Marino 			     < FIRST_PSEUDO_REGISTER)
900*e4b17023SJohn Marino 			 && CONSTANT_P (XEXP (XEXP (x, 0), 1))))
901*e4b17023SJohn Marino 	      reg_equiv_address (i) = XEXP (x, 0), reg_equiv_mem (i) = 0;
902*e4b17023SJohn Marino 	    else
903*e4b17023SJohn Marino 	      {
904*e4b17023SJohn Marino 		/* Make a new stack slot.  Then indicate that something
905*e4b17023SJohn Marino 		   changed so we go back and recompute offsets for
906*e4b17023SJohn Marino 		   eliminable registers because the allocation of memory
907*e4b17023SJohn Marino 		   below might change some offset.  reg_equiv_{mem,address}
908*e4b17023SJohn Marino 		   will be set up for this pseudo on the next pass around
909*e4b17023SJohn Marino 		   the loop.  */
910*e4b17023SJohn Marino 		reg_equiv_memory_loc (i) = 0;
911*e4b17023SJohn Marino 		reg_equiv_init (i) = 0;
912*e4b17023SJohn Marino 		alter_reg (i, -1, true);
913*e4b17023SJohn Marino 	      }
914*e4b17023SJohn Marino 	  }
915*e4b17023SJohn Marino 
916*e4b17023SJohn Marino       if (caller_save_needed)
917*e4b17023SJohn Marino 	setup_save_areas ();
918*e4b17023SJohn Marino 
919*e4b17023SJohn Marino       /* If we allocated another stack slot, redo elimination bookkeeping.  */
920*e4b17023SJohn Marino       if (something_was_spilled || starting_frame_size != get_frame_size ())
921*e4b17023SJohn Marino 	continue;
922*e4b17023SJohn Marino       if (starting_frame_size && crtl->stack_alignment_needed)
923*e4b17023SJohn Marino 	{
924*e4b17023SJohn Marino 	  /* If we have a stack frame, we must align it now.  The
925*e4b17023SJohn Marino 	     stack size may be a part of the offset computation for
926*e4b17023SJohn Marino 	     register elimination.  So if this changes the stack size,
927*e4b17023SJohn Marino 	     then repeat the elimination bookkeeping.  We don't
928*e4b17023SJohn Marino 	     realign when there is no stack, as that will cause a
929*e4b17023SJohn Marino 	     stack frame when none is needed should
930*e4b17023SJohn Marino 	     STARTING_FRAME_OFFSET not be already aligned to
931*e4b17023SJohn Marino 	     STACK_BOUNDARY.  */
932*e4b17023SJohn Marino 	  assign_stack_local (BLKmode, 0, crtl->stack_alignment_needed);
933*e4b17023SJohn Marino 	  if (starting_frame_size != get_frame_size ())
934*e4b17023SJohn Marino 	    continue;
935*e4b17023SJohn Marino 	}
936*e4b17023SJohn Marino 
937*e4b17023SJohn Marino       if (caller_save_needed)
938*e4b17023SJohn Marino 	{
939*e4b17023SJohn Marino 	  save_call_clobbered_regs ();
940*e4b17023SJohn Marino 	  /* That might have allocated new insn_chain structures.  */
941*e4b17023SJohn Marino 	  reload_firstobj = XOBNEWVAR (&reload_obstack, char, 0);
942*e4b17023SJohn Marino 	}
943*e4b17023SJohn Marino 
944*e4b17023SJohn Marino       calculate_needs_all_insns (global);
945*e4b17023SJohn Marino 
946*e4b17023SJohn Marino       if (! ira_conflicts_p)
947*e4b17023SJohn Marino 	/* Don't do it for IRA.  We need this info because we don't
948*e4b17023SJohn Marino 	   change live_throughout and dead_or_set for chains when IRA
949*e4b17023SJohn Marino 	   is used.  */
950*e4b17023SJohn Marino 	CLEAR_REG_SET (&spilled_pseudos);
951*e4b17023SJohn Marino 
952*e4b17023SJohn Marino       did_spill = 0;
953*e4b17023SJohn Marino 
954*e4b17023SJohn Marino       something_changed = 0;
955*e4b17023SJohn Marino 
956*e4b17023SJohn Marino       /* If we allocated any new memory locations, make another pass
957*e4b17023SJohn Marino 	 since it might have changed elimination offsets.  */
958*e4b17023SJohn Marino       if (something_was_spilled || starting_frame_size != get_frame_size ())
959*e4b17023SJohn Marino 	something_changed = 1;
960*e4b17023SJohn Marino 
961*e4b17023SJohn Marino       /* Even if the frame size remained the same, we might still have
962*e4b17023SJohn Marino 	 changed elimination offsets, e.g. if find_reloads called
963*e4b17023SJohn Marino 	 force_const_mem requiring the back end to allocate a constant
964*e4b17023SJohn Marino 	 pool base register that needs to be saved on the stack.  */
965*e4b17023SJohn Marino       else if (!verify_initial_elim_offsets ())
966*e4b17023SJohn Marino 	something_changed = 1;
967*e4b17023SJohn Marino 
968*e4b17023SJohn Marino       {
969*e4b17023SJohn Marino 	HARD_REG_SET to_spill;
970*e4b17023SJohn Marino 	CLEAR_HARD_REG_SET (to_spill);
971*e4b17023SJohn Marino 	update_eliminables (&to_spill);
972*e4b17023SJohn Marino 	AND_COMPL_HARD_REG_SET (used_spill_regs, to_spill);
973*e4b17023SJohn Marino 
974*e4b17023SJohn Marino 	for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
975*e4b17023SJohn Marino 	  if (TEST_HARD_REG_BIT (to_spill, i))
976*e4b17023SJohn Marino 	    {
977*e4b17023SJohn Marino 	      spill_hard_reg (i, 1);
978*e4b17023SJohn Marino 	      did_spill = 1;
979*e4b17023SJohn Marino 
980*e4b17023SJohn Marino 	      /* Regardless of the state of spills, if we previously had
981*e4b17023SJohn Marino 		 a register that we thought we could eliminate, but now can
982*e4b17023SJohn Marino 		 not eliminate, we must run another pass.
983*e4b17023SJohn Marino 
984*e4b17023SJohn Marino 		 Consider pseudos which have an entry in reg_equiv_* which
985*e4b17023SJohn Marino 		 reference an eliminable register.  We must make another pass
986*e4b17023SJohn Marino 		 to update reg_equiv_* so that we do not substitute in the
987*e4b17023SJohn Marino 		 old value from when we thought the elimination could be
988*e4b17023SJohn Marino 		 performed.  */
989*e4b17023SJohn Marino 	      something_changed = 1;
990*e4b17023SJohn Marino 	    }
991*e4b17023SJohn Marino       }
992*e4b17023SJohn Marino 
993*e4b17023SJohn Marino       select_reload_regs ();
994*e4b17023SJohn Marino       if (failure)
995*e4b17023SJohn Marino 	goto failed;
996*e4b17023SJohn Marino 
997*e4b17023SJohn Marino       if (insns_need_reload != 0 || did_spill)
998*e4b17023SJohn Marino 	something_changed |= finish_spills (global);
999*e4b17023SJohn Marino 
1000*e4b17023SJohn Marino       if (! something_changed)
1001*e4b17023SJohn Marino 	break;
1002*e4b17023SJohn Marino 
1003*e4b17023SJohn Marino       if (caller_save_needed)
1004*e4b17023SJohn Marino 	delete_caller_save_insns ();
1005*e4b17023SJohn Marino 
1006*e4b17023SJohn Marino       obstack_free (&reload_obstack, reload_firstobj);
1007*e4b17023SJohn Marino     }
1008*e4b17023SJohn Marino 
1009*e4b17023SJohn Marino   /* If global-alloc was run, notify it of any register eliminations we have
1010*e4b17023SJohn Marino      done.  */
1011*e4b17023SJohn Marino   if (global)
1012*e4b17023SJohn Marino     for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
1013*e4b17023SJohn Marino       if (ep->can_eliminate)
1014*e4b17023SJohn Marino 	mark_elimination (ep->from, ep->to);
1015*e4b17023SJohn Marino 
1016*e4b17023SJohn Marino   /* If a pseudo has no hard reg, delete the insns that made the equivalence.
1017*e4b17023SJohn Marino      If that insn didn't set the register (i.e., it copied the register to
1018*e4b17023SJohn Marino      memory), just delete that insn instead of the equivalencing insn plus
1019*e4b17023SJohn Marino      anything now dead.  If we call delete_dead_insn on that insn, we may
1020*e4b17023SJohn Marino      delete the insn that actually sets the register if the register dies
1021*e4b17023SJohn Marino      there and that is incorrect.  */
1022*e4b17023SJohn Marino 
1023*e4b17023SJohn Marino   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
1024*e4b17023SJohn Marino     {
1025*e4b17023SJohn Marino       if (reg_renumber[i] < 0 && reg_equiv_init (i) != 0)
1026*e4b17023SJohn Marino 	{
1027*e4b17023SJohn Marino 	  rtx list;
1028*e4b17023SJohn Marino 	  for (list = reg_equiv_init (i); list; list = XEXP (list, 1))
1029*e4b17023SJohn Marino 	    {
1030*e4b17023SJohn Marino 	      rtx equiv_insn = XEXP (list, 0);
1031*e4b17023SJohn Marino 
1032*e4b17023SJohn Marino 	      /* If we already deleted the insn or if it may trap, we can't
1033*e4b17023SJohn Marino 		 delete it.  The latter case shouldn't happen, but can
1034*e4b17023SJohn Marino 		 if an insn has a variable address, gets a REG_EH_REGION
1035*e4b17023SJohn Marino 		 note added to it, and then gets converted into a load
1036*e4b17023SJohn Marino 		 from a constant address.  */
1037*e4b17023SJohn Marino 	      if (NOTE_P (equiv_insn)
1038*e4b17023SJohn Marino 		  || can_throw_internal (equiv_insn))
1039*e4b17023SJohn Marino 		;
1040*e4b17023SJohn Marino 	      else if (reg_set_p (regno_reg_rtx[i], PATTERN (equiv_insn)))
1041*e4b17023SJohn Marino 		delete_dead_insn (equiv_insn);
1042*e4b17023SJohn Marino 	      else
1043*e4b17023SJohn Marino 		SET_INSN_DELETED (equiv_insn);
1044*e4b17023SJohn Marino 	    }
1045*e4b17023SJohn Marino 	}
1046*e4b17023SJohn Marino     }
1047*e4b17023SJohn Marino 
1048*e4b17023SJohn Marino   /* Use the reload registers where necessary
1049*e4b17023SJohn Marino      by generating move instructions to move the must-be-register
1050*e4b17023SJohn Marino      values into or out of the reload registers.  */
1051*e4b17023SJohn Marino 
1052*e4b17023SJohn Marino   if (insns_need_reload != 0 || something_needs_elimination
1053*e4b17023SJohn Marino       || something_needs_operands_changed)
1054*e4b17023SJohn Marino     {
1055*e4b17023SJohn Marino       HOST_WIDE_INT old_frame_size = get_frame_size ();
1056*e4b17023SJohn Marino 
1057*e4b17023SJohn Marino       reload_as_needed (global);
1058*e4b17023SJohn Marino 
1059*e4b17023SJohn Marino       gcc_assert (old_frame_size == get_frame_size ());
1060*e4b17023SJohn Marino 
1061*e4b17023SJohn Marino       gcc_assert (verify_initial_elim_offsets ());
1062*e4b17023SJohn Marino     }
1063*e4b17023SJohn Marino 
1064*e4b17023SJohn Marino   /* If we were able to eliminate the frame pointer, show that it is no
1065*e4b17023SJohn Marino      longer live at the start of any basic block.  If it ls live by
1066*e4b17023SJohn Marino      virtue of being in a pseudo, that pseudo will be marked live
1067*e4b17023SJohn Marino      and hence the frame pointer will be known to be live via that
1068*e4b17023SJohn Marino      pseudo.  */
1069*e4b17023SJohn Marino 
1070*e4b17023SJohn Marino   if (! frame_pointer_needed)
1071*e4b17023SJohn Marino     FOR_EACH_BB (bb)
1072*e4b17023SJohn Marino       bitmap_clear_bit (df_get_live_in (bb), HARD_FRAME_POINTER_REGNUM);
1073*e4b17023SJohn Marino 
1074*e4b17023SJohn Marino   /* Come here (with failure set nonzero) if we can't get enough spill
1075*e4b17023SJohn Marino      regs.  */
1076*e4b17023SJohn Marino  failed:
1077*e4b17023SJohn Marino 
1078*e4b17023SJohn Marino   CLEAR_REG_SET (&changed_allocation_pseudos);
1079*e4b17023SJohn Marino   CLEAR_REG_SET (&spilled_pseudos);
1080*e4b17023SJohn Marino   reload_in_progress = 0;
1081*e4b17023SJohn Marino 
1082*e4b17023SJohn Marino   /* Now eliminate all pseudo regs by modifying them into
1083*e4b17023SJohn Marino      their equivalent memory references.
1084*e4b17023SJohn Marino      The REG-rtx's for the pseudos are modified in place,
1085*e4b17023SJohn Marino      so all insns that used to refer to them now refer to memory.
1086*e4b17023SJohn Marino 
1087*e4b17023SJohn Marino      For a reg that has a reg_equiv_address, all those insns
1088*e4b17023SJohn Marino      were changed by reloading so that no insns refer to it any longer;
1089*e4b17023SJohn Marino      but the DECL_RTL of a variable decl may refer to it,
1090*e4b17023SJohn Marino      and if so this causes the debugging info to mention the variable.  */
1091*e4b17023SJohn Marino 
1092*e4b17023SJohn Marino   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
1093*e4b17023SJohn Marino     {
1094*e4b17023SJohn Marino       rtx addr = 0;
1095*e4b17023SJohn Marino 
1096*e4b17023SJohn Marino       if (reg_equiv_mem (i))
1097*e4b17023SJohn Marino 	addr = XEXP (reg_equiv_mem (i), 0);
1098*e4b17023SJohn Marino 
1099*e4b17023SJohn Marino       if (reg_equiv_address (i))
1100*e4b17023SJohn Marino 	addr = reg_equiv_address (i);
1101*e4b17023SJohn Marino 
1102*e4b17023SJohn Marino       if (addr)
1103*e4b17023SJohn Marino 	{
1104*e4b17023SJohn Marino 	  if (reg_renumber[i] < 0)
1105*e4b17023SJohn Marino 	    {
1106*e4b17023SJohn Marino 	      rtx reg = regno_reg_rtx[i];
1107*e4b17023SJohn Marino 
1108*e4b17023SJohn Marino 	      REG_USERVAR_P (reg) = 0;
1109*e4b17023SJohn Marino 	      PUT_CODE (reg, MEM);
1110*e4b17023SJohn Marino 	      XEXP (reg, 0) = addr;
1111*e4b17023SJohn Marino 	      if (reg_equiv_memory_loc (i))
1112*e4b17023SJohn Marino 		MEM_COPY_ATTRIBUTES (reg, reg_equiv_memory_loc (i));
1113*e4b17023SJohn Marino 	      else
1114*e4b17023SJohn Marino 		MEM_ATTRS (reg) = 0;
1115*e4b17023SJohn Marino 	      MEM_NOTRAP_P (reg) = 1;
1116*e4b17023SJohn Marino 	    }
1117*e4b17023SJohn Marino 	  else if (reg_equiv_mem (i))
1118*e4b17023SJohn Marino 	    XEXP (reg_equiv_mem (i), 0) = addr;
1119*e4b17023SJohn Marino 	}
1120*e4b17023SJohn Marino 
1121*e4b17023SJohn Marino       /* We don't want complex addressing modes in debug insns
1122*e4b17023SJohn Marino 	 if simpler ones will do, so delegitimize equivalences
1123*e4b17023SJohn Marino 	 in debug insns.  */
1124*e4b17023SJohn Marino       if (MAY_HAVE_DEBUG_INSNS && reg_renumber[i] < 0)
1125*e4b17023SJohn Marino 	{
1126*e4b17023SJohn Marino 	  rtx reg = regno_reg_rtx[i];
1127*e4b17023SJohn Marino 	  rtx equiv = 0;
1128*e4b17023SJohn Marino 	  df_ref use, next;
1129*e4b17023SJohn Marino 
1130*e4b17023SJohn Marino 	  if (reg_equiv_constant (i))
1131*e4b17023SJohn Marino 	    equiv = reg_equiv_constant (i);
1132*e4b17023SJohn Marino 	  else if (reg_equiv_invariant (i))
1133*e4b17023SJohn Marino 	    equiv = reg_equiv_invariant (i);
1134*e4b17023SJohn Marino 	  else if (reg && MEM_P (reg))
1135*e4b17023SJohn Marino 	    equiv = targetm.delegitimize_address (reg);
1136*e4b17023SJohn Marino 	  else if (reg && REG_P (reg) && (int)REGNO (reg) != i)
1137*e4b17023SJohn Marino 	    equiv = reg;
1138*e4b17023SJohn Marino 
1139*e4b17023SJohn Marino 	  if (equiv == reg)
1140*e4b17023SJohn Marino 	    continue;
1141*e4b17023SJohn Marino 
1142*e4b17023SJohn Marino 	  for (use = DF_REG_USE_CHAIN (i); use; use = next)
1143*e4b17023SJohn Marino 	    {
1144*e4b17023SJohn Marino 	      insn = DF_REF_INSN (use);
1145*e4b17023SJohn Marino 
1146*e4b17023SJohn Marino 	      /* Make sure the next ref is for a different instruction,
1147*e4b17023SJohn Marino 		 so that we're not affected by the rescan.  */
1148*e4b17023SJohn Marino 	      next = DF_REF_NEXT_REG (use);
1149*e4b17023SJohn Marino 	      while (next && DF_REF_INSN (next) == insn)
1150*e4b17023SJohn Marino 		next = DF_REF_NEXT_REG (next);
1151*e4b17023SJohn Marino 
1152*e4b17023SJohn Marino 	      if (DEBUG_INSN_P (insn))
1153*e4b17023SJohn Marino 		{
1154*e4b17023SJohn Marino 		  if (!equiv)
1155*e4b17023SJohn Marino 		    {
1156*e4b17023SJohn Marino 		      INSN_VAR_LOCATION_LOC (insn) = gen_rtx_UNKNOWN_VAR_LOC ();
1157*e4b17023SJohn Marino 		      df_insn_rescan_debug_internal (insn);
1158*e4b17023SJohn Marino 		    }
1159*e4b17023SJohn Marino 		  else
1160*e4b17023SJohn Marino 		    INSN_VAR_LOCATION_LOC (insn)
1161*e4b17023SJohn Marino 		      = simplify_replace_rtx (INSN_VAR_LOCATION_LOC (insn),
1162*e4b17023SJohn Marino 					      reg, equiv);
1163*e4b17023SJohn Marino 		}
1164*e4b17023SJohn Marino 	    }
1165*e4b17023SJohn Marino 	}
1166*e4b17023SJohn Marino     }
1167*e4b17023SJohn Marino 
1168*e4b17023SJohn Marino   /* We must set reload_completed now since the cleanup_subreg_operands call
1169*e4b17023SJohn Marino      below will re-recognize each insn and reload may have generated insns
1170*e4b17023SJohn Marino      which are only valid during and after reload.  */
1171*e4b17023SJohn Marino   reload_completed = 1;
1172*e4b17023SJohn Marino 
1173*e4b17023SJohn Marino   /* Make a pass over all the insns and delete all USEs which we inserted
1174*e4b17023SJohn Marino      only to tag a REG_EQUAL note on them.  Remove all REG_DEAD and REG_UNUSED
1175*e4b17023SJohn Marino      notes.  Delete all CLOBBER insns, except those that refer to the return
1176*e4b17023SJohn Marino      value and the special mem:BLK CLOBBERs added to prevent the scheduler
1177*e4b17023SJohn Marino      from misarranging variable-array code, and simplify (subreg (reg))
1178*e4b17023SJohn Marino      operands.  Strip and regenerate REG_INC notes that may have been moved
1179*e4b17023SJohn Marino      around.  */
1180*e4b17023SJohn Marino 
1181*e4b17023SJohn Marino   for (insn = first; insn; insn = NEXT_INSN (insn))
1182*e4b17023SJohn Marino     if (INSN_P (insn))
1183*e4b17023SJohn Marino       {
1184*e4b17023SJohn Marino 	rtx *pnote;
1185*e4b17023SJohn Marino 
1186*e4b17023SJohn Marino 	if (CALL_P (insn))
1187*e4b17023SJohn Marino 	  replace_pseudos_in (& CALL_INSN_FUNCTION_USAGE (insn),
1188*e4b17023SJohn Marino 			      VOIDmode, CALL_INSN_FUNCTION_USAGE (insn));
1189*e4b17023SJohn Marino 
1190*e4b17023SJohn Marino 	if ((GET_CODE (PATTERN (insn)) == USE
1191*e4b17023SJohn Marino 	     /* We mark with QImode USEs introduced by reload itself.  */
1192*e4b17023SJohn Marino 	     && (GET_MODE (insn) == QImode
1193*e4b17023SJohn Marino 		 || find_reg_note (insn, REG_EQUAL, NULL_RTX)))
1194*e4b17023SJohn Marino 	    || (GET_CODE (PATTERN (insn)) == CLOBBER
1195*e4b17023SJohn Marino 		&& (!MEM_P (XEXP (PATTERN (insn), 0))
1196*e4b17023SJohn Marino 		    || GET_MODE (XEXP (PATTERN (insn), 0)) != BLKmode
1197*e4b17023SJohn Marino 		    || (GET_CODE (XEXP (XEXP (PATTERN (insn), 0), 0)) != SCRATCH
1198*e4b17023SJohn Marino 			&& XEXP (XEXP (PATTERN (insn), 0), 0)
1199*e4b17023SJohn Marino 				!= stack_pointer_rtx))
1200*e4b17023SJohn Marino 		&& (!REG_P (XEXP (PATTERN (insn), 0))
1201*e4b17023SJohn Marino 		    || ! REG_FUNCTION_VALUE_P (XEXP (PATTERN (insn), 0)))))
1202*e4b17023SJohn Marino 	  {
1203*e4b17023SJohn Marino 	    delete_insn (insn);
1204*e4b17023SJohn Marino 	    continue;
1205*e4b17023SJohn Marino 	  }
1206*e4b17023SJohn Marino 
1207*e4b17023SJohn Marino 	/* Some CLOBBERs may survive until here and still reference unassigned
1208*e4b17023SJohn Marino 	   pseudos with const equivalent, which may in turn cause ICE in later
1209*e4b17023SJohn Marino 	   passes if the reference remains in place.  */
1210*e4b17023SJohn Marino 	if (GET_CODE (PATTERN (insn)) == CLOBBER)
1211*e4b17023SJohn Marino 	  replace_pseudos_in (& XEXP (PATTERN (insn), 0),
1212*e4b17023SJohn Marino 			      VOIDmode, PATTERN (insn));
1213*e4b17023SJohn Marino 
1214*e4b17023SJohn Marino 	/* Discard obvious no-ops, even without -O.  This optimization
1215*e4b17023SJohn Marino 	   is fast and doesn't interfere with debugging.  */
1216*e4b17023SJohn Marino 	if (NONJUMP_INSN_P (insn)
1217*e4b17023SJohn Marino 	    && GET_CODE (PATTERN (insn)) == SET
1218*e4b17023SJohn Marino 	    && REG_P (SET_SRC (PATTERN (insn)))
1219*e4b17023SJohn Marino 	    && REG_P (SET_DEST (PATTERN (insn)))
1220*e4b17023SJohn Marino 	    && (REGNO (SET_SRC (PATTERN (insn)))
1221*e4b17023SJohn Marino 		== REGNO (SET_DEST (PATTERN (insn)))))
1222*e4b17023SJohn Marino 	  {
1223*e4b17023SJohn Marino 	    delete_insn (insn);
1224*e4b17023SJohn Marino 	    continue;
1225*e4b17023SJohn Marino 	  }
1226*e4b17023SJohn Marino 
1227*e4b17023SJohn Marino 	pnote = &REG_NOTES (insn);
1228*e4b17023SJohn Marino 	while (*pnote != 0)
1229*e4b17023SJohn Marino 	  {
1230*e4b17023SJohn Marino 	    if (REG_NOTE_KIND (*pnote) == REG_DEAD
1231*e4b17023SJohn Marino 		|| REG_NOTE_KIND (*pnote) == REG_UNUSED
1232*e4b17023SJohn Marino 		|| REG_NOTE_KIND (*pnote) == REG_INC)
1233*e4b17023SJohn Marino 	      *pnote = XEXP (*pnote, 1);
1234*e4b17023SJohn Marino 	    else
1235*e4b17023SJohn Marino 	      pnote = &XEXP (*pnote, 1);
1236*e4b17023SJohn Marino 	  }
1237*e4b17023SJohn Marino 
1238*e4b17023SJohn Marino #ifdef AUTO_INC_DEC
1239*e4b17023SJohn Marino 	add_auto_inc_notes (insn, PATTERN (insn));
1240*e4b17023SJohn Marino #endif
1241*e4b17023SJohn Marino 
1242*e4b17023SJohn Marino 	/* Simplify (subreg (reg)) if it appears as an operand.  */
1243*e4b17023SJohn Marino 	cleanup_subreg_operands (insn);
1244*e4b17023SJohn Marino 
1245*e4b17023SJohn Marino 	/* Clean up invalid ASMs so that they don't confuse later passes.
1246*e4b17023SJohn Marino 	   See PR 21299.  */
1247*e4b17023SJohn Marino 	if (asm_noperands (PATTERN (insn)) >= 0)
1248*e4b17023SJohn Marino 	  {
1249*e4b17023SJohn Marino 	    extract_insn (insn);
1250*e4b17023SJohn Marino 	    if (!constrain_operands (1))
1251*e4b17023SJohn Marino 	      {
1252*e4b17023SJohn Marino 		error_for_asm (insn,
1253*e4b17023SJohn Marino 			       "%<asm%> operand has impossible constraints");
1254*e4b17023SJohn Marino 		delete_insn (insn);
1255*e4b17023SJohn Marino 		continue;
1256*e4b17023SJohn Marino 	      }
1257*e4b17023SJohn Marino 	  }
1258*e4b17023SJohn Marino       }
1259*e4b17023SJohn Marino 
1260*e4b17023SJohn Marino   /* If we are doing generic stack checking, give a warning if this
1261*e4b17023SJohn Marino      function's frame size is larger than we expect.  */
1262*e4b17023SJohn Marino   if (flag_stack_check == GENERIC_STACK_CHECK)
1263*e4b17023SJohn Marino     {
1264*e4b17023SJohn Marino       HOST_WIDE_INT size = get_frame_size () + STACK_CHECK_FIXED_FRAME_SIZE;
1265*e4b17023SJohn Marino       static int verbose_warned = 0;
1266*e4b17023SJohn Marino 
1267*e4b17023SJohn Marino       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1268*e4b17023SJohn Marino 	if (df_regs_ever_live_p (i) && ! fixed_regs[i] && call_used_regs[i])
1269*e4b17023SJohn Marino 	  size += UNITS_PER_WORD;
1270*e4b17023SJohn Marino 
1271*e4b17023SJohn Marino       if (size > STACK_CHECK_MAX_FRAME_SIZE)
1272*e4b17023SJohn Marino 	{
1273*e4b17023SJohn Marino 	  warning (0, "frame size too large for reliable stack checking");
1274*e4b17023SJohn Marino 	  if (! verbose_warned)
1275*e4b17023SJohn Marino 	    {
1276*e4b17023SJohn Marino 	      warning (0, "try reducing the number of local variables");
1277*e4b17023SJohn Marino 	      verbose_warned = 1;
1278*e4b17023SJohn Marino 	    }
1279*e4b17023SJohn Marino 	}
1280*e4b17023SJohn Marino     }
1281*e4b17023SJohn Marino 
1282*e4b17023SJohn Marino   free (temp_pseudo_reg_arr);
1283*e4b17023SJohn Marino 
1284*e4b17023SJohn Marino   /* Indicate that we no longer have known memory locations or constants.  */
1285*e4b17023SJohn Marino   free_reg_equiv ();
1286*e4b17023SJohn Marino 
1287*e4b17023SJohn Marino   free (reg_max_ref_width);
1288*e4b17023SJohn Marino   free (reg_old_renumber);
1289*e4b17023SJohn Marino   free (pseudo_previous_regs);
1290*e4b17023SJohn Marino   free (pseudo_forbidden_regs);
1291*e4b17023SJohn Marino 
1292*e4b17023SJohn Marino   CLEAR_HARD_REG_SET (used_spill_regs);
1293*e4b17023SJohn Marino   for (i = 0; i < n_spills; i++)
1294*e4b17023SJohn Marino     SET_HARD_REG_BIT (used_spill_regs, spill_regs[i]);
1295*e4b17023SJohn Marino 
1296*e4b17023SJohn Marino   /* Free all the insn_chain structures at once.  */
1297*e4b17023SJohn Marino   obstack_free (&reload_obstack, reload_startobj);
1298*e4b17023SJohn Marino   unused_insn_chains = 0;
1299*e4b17023SJohn Marino 
1300*e4b17023SJohn Marino   inserted = fixup_abnormal_edges ();
1301*e4b17023SJohn Marino 
1302*e4b17023SJohn Marino   /* We've possibly turned single trapping insn into multiple ones.  */
1303*e4b17023SJohn Marino   if (cfun->can_throw_non_call_exceptions)
1304*e4b17023SJohn Marino     {
1305*e4b17023SJohn Marino       sbitmap blocks;
1306*e4b17023SJohn Marino       blocks = sbitmap_alloc (last_basic_block);
1307*e4b17023SJohn Marino       sbitmap_ones (blocks);
1308*e4b17023SJohn Marino       find_many_sub_basic_blocks (blocks);
1309*e4b17023SJohn Marino       sbitmap_free (blocks);
1310*e4b17023SJohn Marino     }
1311*e4b17023SJohn Marino 
1312*e4b17023SJohn Marino   if (inserted)
1313*e4b17023SJohn Marino     commit_edge_insertions ();
1314*e4b17023SJohn Marino 
1315*e4b17023SJohn Marino   /* Replacing pseudos with their memory equivalents might have
1316*e4b17023SJohn Marino      created shared rtx.  Subsequent passes would get confused
1317*e4b17023SJohn Marino      by this, so unshare everything here.  */
1318*e4b17023SJohn Marino   unshare_all_rtl_again (first);
1319*e4b17023SJohn Marino 
1320*e4b17023SJohn Marino #ifdef STACK_BOUNDARY
1321*e4b17023SJohn Marino   /* init_emit has set the alignment of the hard frame pointer
1322*e4b17023SJohn Marino      to STACK_BOUNDARY.  It is very likely no longer valid if
1323*e4b17023SJohn Marino      the hard frame pointer was used for register allocation.  */
1324*e4b17023SJohn Marino   if (!frame_pointer_needed)
1325*e4b17023SJohn Marino     REGNO_POINTER_ALIGN (HARD_FRAME_POINTER_REGNUM) = BITS_PER_UNIT;
1326*e4b17023SJohn Marino #endif
1327*e4b17023SJohn Marino 
1328*e4b17023SJohn Marino   VEC_free (rtx_p, heap, substitute_stack);
1329*e4b17023SJohn Marino 
1330*e4b17023SJohn Marino   gcc_assert (bitmap_empty_p (&spilled_pseudos));
1331*e4b17023SJohn Marino 
1332*e4b17023SJohn Marino   reload_completed = !failure;
1333*e4b17023SJohn Marino 
1334*e4b17023SJohn Marino   return need_dce;
1335*e4b17023SJohn Marino }
1336*e4b17023SJohn Marino 
1337*e4b17023SJohn Marino /* Yet another special case.  Unfortunately, reg-stack forces people to
1338*e4b17023SJohn Marino    write incorrect clobbers in asm statements.  These clobbers must not
1339*e4b17023SJohn Marino    cause the register to appear in bad_spill_regs, otherwise we'll call
1340*e4b17023SJohn Marino    fatal_insn later.  We clear the corresponding regnos in the live
1341*e4b17023SJohn Marino    register sets to avoid this.
1342*e4b17023SJohn Marino    The whole thing is rather sick, I'm afraid.  */
1343*e4b17023SJohn Marino 
1344*e4b17023SJohn Marino static void
maybe_fix_stack_asms(void)1345*e4b17023SJohn Marino maybe_fix_stack_asms (void)
1346*e4b17023SJohn Marino {
1347*e4b17023SJohn Marino #ifdef STACK_REGS
1348*e4b17023SJohn Marino   const char *constraints[MAX_RECOG_OPERANDS];
1349*e4b17023SJohn Marino   enum machine_mode operand_mode[MAX_RECOG_OPERANDS];
1350*e4b17023SJohn Marino   struct insn_chain *chain;
1351*e4b17023SJohn Marino 
1352*e4b17023SJohn Marino   for (chain = reload_insn_chain; chain != 0; chain = chain->next)
1353*e4b17023SJohn Marino     {
1354*e4b17023SJohn Marino       int i, noperands;
1355*e4b17023SJohn Marino       HARD_REG_SET clobbered, allowed;
1356*e4b17023SJohn Marino       rtx pat;
1357*e4b17023SJohn Marino 
1358*e4b17023SJohn Marino       if (! INSN_P (chain->insn)
1359*e4b17023SJohn Marino 	  || (noperands = asm_noperands (PATTERN (chain->insn))) < 0)
1360*e4b17023SJohn Marino 	continue;
1361*e4b17023SJohn Marino       pat = PATTERN (chain->insn);
1362*e4b17023SJohn Marino       if (GET_CODE (pat) != PARALLEL)
1363*e4b17023SJohn Marino 	continue;
1364*e4b17023SJohn Marino 
1365*e4b17023SJohn Marino       CLEAR_HARD_REG_SET (clobbered);
1366*e4b17023SJohn Marino       CLEAR_HARD_REG_SET (allowed);
1367*e4b17023SJohn Marino 
1368*e4b17023SJohn Marino       /* First, make a mask of all stack regs that are clobbered.  */
1369*e4b17023SJohn Marino       for (i = 0; i < XVECLEN (pat, 0); i++)
1370*e4b17023SJohn Marino 	{
1371*e4b17023SJohn Marino 	  rtx t = XVECEXP (pat, 0, i);
1372*e4b17023SJohn Marino 	  if (GET_CODE (t) == CLOBBER && STACK_REG_P (XEXP (t, 0)))
1373*e4b17023SJohn Marino 	    SET_HARD_REG_BIT (clobbered, REGNO (XEXP (t, 0)));
1374*e4b17023SJohn Marino 	}
1375*e4b17023SJohn Marino 
1376*e4b17023SJohn Marino       /* Get the operand values and constraints out of the insn.  */
1377*e4b17023SJohn Marino       decode_asm_operands (pat, recog_data.operand, recog_data.operand_loc,
1378*e4b17023SJohn Marino 			   constraints, operand_mode, NULL);
1379*e4b17023SJohn Marino 
1380*e4b17023SJohn Marino       /* For every operand, see what registers are allowed.  */
1381*e4b17023SJohn Marino       for (i = 0; i < noperands; i++)
1382*e4b17023SJohn Marino 	{
1383*e4b17023SJohn Marino 	  const char *p = constraints[i];
1384*e4b17023SJohn Marino 	  /* For every alternative, we compute the class of registers allowed
1385*e4b17023SJohn Marino 	     for reloading in CLS, and merge its contents into the reg set
1386*e4b17023SJohn Marino 	     ALLOWED.  */
1387*e4b17023SJohn Marino 	  int cls = (int) NO_REGS;
1388*e4b17023SJohn Marino 
1389*e4b17023SJohn Marino 	  for (;;)
1390*e4b17023SJohn Marino 	    {
1391*e4b17023SJohn Marino 	      char c = *p;
1392*e4b17023SJohn Marino 
1393*e4b17023SJohn Marino 	      if (c == '\0' || c == ',' || c == '#')
1394*e4b17023SJohn Marino 		{
1395*e4b17023SJohn Marino 		  /* End of one alternative - mark the regs in the current
1396*e4b17023SJohn Marino 		     class, and reset the class.  */
1397*e4b17023SJohn Marino 		  IOR_HARD_REG_SET (allowed, reg_class_contents[cls]);
1398*e4b17023SJohn Marino 		  cls = NO_REGS;
1399*e4b17023SJohn Marino 		  p++;
1400*e4b17023SJohn Marino 		  if (c == '#')
1401*e4b17023SJohn Marino 		    do {
1402*e4b17023SJohn Marino 		      c = *p++;
1403*e4b17023SJohn Marino 		    } while (c != '\0' && c != ',');
1404*e4b17023SJohn Marino 		  if (c == '\0')
1405*e4b17023SJohn Marino 		    break;
1406*e4b17023SJohn Marino 		  continue;
1407*e4b17023SJohn Marino 		}
1408*e4b17023SJohn Marino 
1409*e4b17023SJohn Marino 	      switch (c)
1410*e4b17023SJohn Marino 		{
1411*e4b17023SJohn Marino 		case '=': case '+': case '*': case '%': case '?': case '!':
1412*e4b17023SJohn Marino 		case '0': case '1': case '2': case '3': case '4': case '<':
1413*e4b17023SJohn Marino 		case '>': case 'V': case 'o': case '&': case 'E': case 'F':
1414*e4b17023SJohn Marino 		case 's': case 'i': case 'n': case 'X': case 'I': case 'J':
1415*e4b17023SJohn Marino 		case 'K': case 'L': case 'M': case 'N': case 'O': case 'P':
1416*e4b17023SJohn Marino 		case TARGET_MEM_CONSTRAINT:
1417*e4b17023SJohn Marino 		  break;
1418*e4b17023SJohn Marino 
1419*e4b17023SJohn Marino 		case 'p':
1420*e4b17023SJohn Marino 		  cls = (int) reg_class_subunion[cls]
1421*e4b17023SJohn Marino 		      [(int) base_reg_class (VOIDmode, ADDR_SPACE_GENERIC,
1422*e4b17023SJohn Marino 					     ADDRESS, SCRATCH)];
1423*e4b17023SJohn Marino 		  break;
1424*e4b17023SJohn Marino 
1425*e4b17023SJohn Marino 		case 'g':
1426*e4b17023SJohn Marino 		case 'r':
1427*e4b17023SJohn Marino 		  cls = (int) reg_class_subunion[cls][(int) GENERAL_REGS];
1428*e4b17023SJohn Marino 		  break;
1429*e4b17023SJohn Marino 
1430*e4b17023SJohn Marino 		default:
1431*e4b17023SJohn Marino 		  if (EXTRA_ADDRESS_CONSTRAINT (c, p))
1432*e4b17023SJohn Marino 		    cls = (int) reg_class_subunion[cls]
1433*e4b17023SJohn Marino 		      [(int) base_reg_class (VOIDmode, ADDR_SPACE_GENERIC,
1434*e4b17023SJohn Marino 					     ADDRESS, SCRATCH)];
1435*e4b17023SJohn Marino 		  else
1436*e4b17023SJohn Marino 		    cls = (int) reg_class_subunion[cls]
1437*e4b17023SJohn Marino 		      [(int) REG_CLASS_FROM_CONSTRAINT (c, p)];
1438*e4b17023SJohn Marino 		}
1439*e4b17023SJohn Marino 	      p += CONSTRAINT_LEN (c, p);
1440*e4b17023SJohn Marino 	    }
1441*e4b17023SJohn Marino 	}
1442*e4b17023SJohn Marino       /* Those of the registers which are clobbered, but allowed by the
1443*e4b17023SJohn Marino 	 constraints, must be usable as reload registers.  So clear them
1444*e4b17023SJohn Marino 	 out of the life information.  */
1445*e4b17023SJohn Marino       AND_HARD_REG_SET (allowed, clobbered);
1446*e4b17023SJohn Marino       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1447*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (allowed, i))
1448*e4b17023SJohn Marino 	  {
1449*e4b17023SJohn Marino 	    CLEAR_REGNO_REG_SET (&chain->live_throughout, i);
1450*e4b17023SJohn Marino 	    CLEAR_REGNO_REG_SET (&chain->dead_or_set, i);
1451*e4b17023SJohn Marino 	  }
1452*e4b17023SJohn Marino     }
1453*e4b17023SJohn Marino 
1454*e4b17023SJohn Marino #endif
1455*e4b17023SJohn Marino }
1456*e4b17023SJohn Marino 
1457*e4b17023SJohn Marino /* Copy the global variables n_reloads and rld into the corresponding elts
1458*e4b17023SJohn Marino    of CHAIN.  */
1459*e4b17023SJohn Marino static void
copy_reloads(struct insn_chain * chain)1460*e4b17023SJohn Marino copy_reloads (struct insn_chain *chain)
1461*e4b17023SJohn Marino {
1462*e4b17023SJohn Marino   chain->n_reloads = n_reloads;
1463*e4b17023SJohn Marino   chain->rld = XOBNEWVEC (&reload_obstack, struct reload, n_reloads);
1464*e4b17023SJohn Marino   memcpy (chain->rld, rld, n_reloads * sizeof (struct reload));
1465*e4b17023SJohn Marino   reload_insn_firstobj = XOBNEWVAR (&reload_obstack, char, 0);
1466*e4b17023SJohn Marino }
1467*e4b17023SJohn Marino 
1468*e4b17023SJohn Marino /* Walk the chain of insns, and determine for each whether it needs reloads
1469*e4b17023SJohn Marino    and/or eliminations.  Build the corresponding insns_need_reload list, and
1470*e4b17023SJohn Marino    set something_needs_elimination as appropriate.  */
1471*e4b17023SJohn Marino static void
calculate_needs_all_insns(int global)1472*e4b17023SJohn Marino calculate_needs_all_insns (int global)
1473*e4b17023SJohn Marino {
1474*e4b17023SJohn Marino   struct insn_chain **pprev_reload = &insns_need_reload;
1475*e4b17023SJohn Marino   struct insn_chain *chain, *next = 0;
1476*e4b17023SJohn Marino 
1477*e4b17023SJohn Marino   something_needs_elimination = 0;
1478*e4b17023SJohn Marino 
1479*e4b17023SJohn Marino   reload_insn_firstobj = XOBNEWVAR (&reload_obstack, char, 0);
1480*e4b17023SJohn Marino   for (chain = reload_insn_chain; chain != 0; chain = next)
1481*e4b17023SJohn Marino     {
1482*e4b17023SJohn Marino       rtx insn = chain->insn;
1483*e4b17023SJohn Marino 
1484*e4b17023SJohn Marino       next = chain->next;
1485*e4b17023SJohn Marino 
1486*e4b17023SJohn Marino       /* Clear out the shortcuts.  */
1487*e4b17023SJohn Marino       chain->n_reloads = 0;
1488*e4b17023SJohn Marino       chain->need_elim = 0;
1489*e4b17023SJohn Marino       chain->need_reload = 0;
1490*e4b17023SJohn Marino       chain->need_operand_change = 0;
1491*e4b17023SJohn Marino 
1492*e4b17023SJohn Marino       /* If this is a label, a JUMP_INSN, or has REG_NOTES (which might
1493*e4b17023SJohn Marino 	 include REG_LABEL_OPERAND and REG_LABEL_TARGET), we need to see
1494*e4b17023SJohn Marino 	 what effects this has on the known offsets at labels.  */
1495*e4b17023SJohn Marino 
1496*e4b17023SJohn Marino       if (LABEL_P (insn) || JUMP_P (insn)
1497*e4b17023SJohn Marino 	  || (INSN_P (insn) && REG_NOTES (insn) != 0))
1498*e4b17023SJohn Marino 	set_label_offsets (insn, insn, 0);
1499*e4b17023SJohn Marino 
1500*e4b17023SJohn Marino       if (INSN_P (insn))
1501*e4b17023SJohn Marino 	{
1502*e4b17023SJohn Marino 	  rtx old_body = PATTERN (insn);
1503*e4b17023SJohn Marino 	  int old_code = INSN_CODE (insn);
1504*e4b17023SJohn Marino 	  rtx old_notes = REG_NOTES (insn);
1505*e4b17023SJohn Marino 	  int did_elimination = 0;
1506*e4b17023SJohn Marino 	  int operands_changed = 0;
1507*e4b17023SJohn Marino 	  rtx set = single_set (insn);
1508*e4b17023SJohn Marino 
1509*e4b17023SJohn Marino 	  /* Skip insns that only set an equivalence.  */
1510*e4b17023SJohn Marino 	  if (set && REG_P (SET_DEST (set))
1511*e4b17023SJohn Marino 	      && reg_renumber[REGNO (SET_DEST (set))] < 0
1512*e4b17023SJohn Marino 	      && (reg_equiv_constant (REGNO (SET_DEST (set)))
1513*e4b17023SJohn Marino 		  || (reg_equiv_invariant (REGNO (SET_DEST (set)))))
1514*e4b17023SJohn Marino 		      && reg_equiv_init (REGNO (SET_DEST (set))))
1515*e4b17023SJohn Marino 	    continue;
1516*e4b17023SJohn Marino 
1517*e4b17023SJohn Marino 	  /* If needed, eliminate any eliminable registers.  */
1518*e4b17023SJohn Marino 	  if (num_eliminable || num_eliminable_invariants)
1519*e4b17023SJohn Marino 	    did_elimination = eliminate_regs_in_insn (insn, 0);
1520*e4b17023SJohn Marino 
1521*e4b17023SJohn Marino 	  /* Analyze the instruction.  */
1522*e4b17023SJohn Marino 	  operands_changed = find_reloads (insn, 0, spill_indirect_levels,
1523*e4b17023SJohn Marino 					   global, spill_reg_order);
1524*e4b17023SJohn Marino 
1525*e4b17023SJohn Marino 	  /* If a no-op set needs more than one reload, this is likely
1526*e4b17023SJohn Marino 	     to be something that needs input address reloads.  We
1527*e4b17023SJohn Marino 	     can't get rid of this cleanly later, and it is of no use
1528*e4b17023SJohn Marino 	     anyway, so discard it now.
1529*e4b17023SJohn Marino 	     We only do this when expensive_optimizations is enabled,
1530*e4b17023SJohn Marino 	     since this complements reload inheritance / output
1531*e4b17023SJohn Marino 	     reload deletion, and it can make debugging harder.  */
1532*e4b17023SJohn Marino 	  if (flag_expensive_optimizations && n_reloads > 1)
1533*e4b17023SJohn Marino 	    {
1534*e4b17023SJohn Marino 	      rtx set = single_set (insn);
1535*e4b17023SJohn Marino 	      if (set
1536*e4b17023SJohn Marino 		  &&
1537*e4b17023SJohn Marino 		  ((SET_SRC (set) == SET_DEST (set)
1538*e4b17023SJohn Marino 		    && REG_P (SET_SRC (set))
1539*e4b17023SJohn Marino 		    && REGNO (SET_SRC (set)) >= FIRST_PSEUDO_REGISTER)
1540*e4b17023SJohn Marino 		   || (REG_P (SET_SRC (set)) && REG_P (SET_DEST (set))
1541*e4b17023SJohn Marino 		       && reg_renumber[REGNO (SET_SRC (set))] < 0
1542*e4b17023SJohn Marino 		       && reg_renumber[REGNO (SET_DEST (set))] < 0
1543*e4b17023SJohn Marino 		       && reg_equiv_memory_loc (REGNO (SET_SRC (set))) != NULL
1544*e4b17023SJohn Marino 		       && reg_equiv_memory_loc (REGNO (SET_DEST (set))) != NULL
1545*e4b17023SJohn Marino 		       && rtx_equal_p (reg_equiv_memory_loc (REGNO (SET_SRC (set))),
1546*e4b17023SJohn Marino 				       reg_equiv_memory_loc (REGNO (SET_DEST (set)))))))
1547*e4b17023SJohn Marino 		{
1548*e4b17023SJohn Marino 		  if (ira_conflicts_p)
1549*e4b17023SJohn Marino 		    /* Inform IRA about the insn deletion.  */
1550*e4b17023SJohn Marino 		    ira_mark_memory_move_deletion (REGNO (SET_DEST (set)),
1551*e4b17023SJohn Marino 						   REGNO (SET_SRC (set)));
1552*e4b17023SJohn Marino 		  delete_insn (insn);
1553*e4b17023SJohn Marino 		  /* Delete it from the reload chain.  */
1554*e4b17023SJohn Marino 		  if (chain->prev)
1555*e4b17023SJohn Marino 		    chain->prev->next = next;
1556*e4b17023SJohn Marino 		  else
1557*e4b17023SJohn Marino 		    reload_insn_chain = next;
1558*e4b17023SJohn Marino 		  if (next)
1559*e4b17023SJohn Marino 		    next->prev = chain->prev;
1560*e4b17023SJohn Marino 		  chain->next = unused_insn_chains;
1561*e4b17023SJohn Marino 		  unused_insn_chains = chain;
1562*e4b17023SJohn Marino 		  continue;
1563*e4b17023SJohn Marino 		}
1564*e4b17023SJohn Marino 	    }
1565*e4b17023SJohn Marino 	  if (num_eliminable)
1566*e4b17023SJohn Marino 	    update_eliminable_offsets ();
1567*e4b17023SJohn Marino 
1568*e4b17023SJohn Marino 	  /* Remember for later shortcuts which insns had any reloads or
1569*e4b17023SJohn Marino 	     register eliminations.  */
1570*e4b17023SJohn Marino 	  chain->need_elim = did_elimination;
1571*e4b17023SJohn Marino 	  chain->need_reload = n_reloads > 0;
1572*e4b17023SJohn Marino 	  chain->need_operand_change = operands_changed;
1573*e4b17023SJohn Marino 
1574*e4b17023SJohn Marino 	  /* Discard any register replacements done.  */
1575*e4b17023SJohn Marino 	  if (did_elimination)
1576*e4b17023SJohn Marino 	    {
1577*e4b17023SJohn Marino 	      obstack_free (&reload_obstack, reload_insn_firstobj);
1578*e4b17023SJohn Marino 	      PATTERN (insn) = old_body;
1579*e4b17023SJohn Marino 	      INSN_CODE (insn) = old_code;
1580*e4b17023SJohn Marino 	      REG_NOTES (insn) = old_notes;
1581*e4b17023SJohn Marino 	      something_needs_elimination = 1;
1582*e4b17023SJohn Marino 	    }
1583*e4b17023SJohn Marino 
1584*e4b17023SJohn Marino 	  something_needs_operands_changed |= operands_changed;
1585*e4b17023SJohn Marino 
1586*e4b17023SJohn Marino 	  if (n_reloads != 0)
1587*e4b17023SJohn Marino 	    {
1588*e4b17023SJohn Marino 	      copy_reloads (chain);
1589*e4b17023SJohn Marino 	      *pprev_reload = chain;
1590*e4b17023SJohn Marino 	      pprev_reload = &chain->next_need_reload;
1591*e4b17023SJohn Marino 	    }
1592*e4b17023SJohn Marino 	}
1593*e4b17023SJohn Marino     }
1594*e4b17023SJohn Marino   *pprev_reload = 0;
1595*e4b17023SJohn Marino }
1596*e4b17023SJohn Marino 
1597*e4b17023SJohn Marino /* This function is called from the register allocator to set up estimates
1598*e4b17023SJohn Marino    for the cost of eliminating pseudos which have REG_EQUIV equivalences to
1599*e4b17023SJohn Marino    an invariant.  The structure is similar to calculate_needs_all_insns.  */
1600*e4b17023SJohn Marino 
1601*e4b17023SJohn Marino void
calculate_elim_costs_all_insns(void)1602*e4b17023SJohn Marino calculate_elim_costs_all_insns (void)
1603*e4b17023SJohn Marino {
1604*e4b17023SJohn Marino   int *reg_equiv_init_cost;
1605*e4b17023SJohn Marino   basic_block bb;
1606*e4b17023SJohn Marino   int i;
1607*e4b17023SJohn Marino 
1608*e4b17023SJohn Marino   reg_equiv_init_cost = XCNEWVEC (int, max_regno);
1609*e4b17023SJohn Marino   init_elim_table ();
1610*e4b17023SJohn Marino   init_eliminable_invariants (get_insns (), false);
1611*e4b17023SJohn Marino 
1612*e4b17023SJohn Marino   set_initial_elim_offsets ();
1613*e4b17023SJohn Marino   set_initial_label_offsets ();
1614*e4b17023SJohn Marino 
1615*e4b17023SJohn Marino   FOR_EACH_BB (bb)
1616*e4b17023SJohn Marino     {
1617*e4b17023SJohn Marino       rtx insn;
1618*e4b17023SJohn Marino       elim_bb = bb;
1619*e4b17023SJohn Marino 
1620*e4b17023SJohn Marino       FOR_BB_INSNS (bb, insn)
1621*e4b17023SJohn Marino 	{
1622*e4b17023SJohn Marino 	  /* If this is a label, a JUMP_INSN, or has REG_NOTES (which might
1623*e4b17023SJohn Marino 	     include REG_LABEL_OPERAND and REG_LABEL_TARGET), we need to see
1624*e4b17023SJohn Marino 	     what effects this has on the known offsets at labels.  */
1625*e4b17023SJohn Marino 
1626*e4b17023SJohn Marino 	  if (LABEL_P (insn) || JUMP_P (insn)
1627*e4b17023SJohn Marino 	      || (INSN_P (insn) && REG_NOTES (insn) != 0))
1628*e4b17023SJohn Marino 	    set_label_offsets (insn, insn, 0);
1629*e4b17023SJohn Marino 
1630*e4b17023SJohn Marino 	  if (INSN_P (insn))
1631*e4b17023SJohn Marino 	    {
1632*e4b17023SJohn Marino 	      rtx set = single_set (insn);
1633*e4b17023SJohn Marino 
1634*e4b17023SJohn Marino 	      /* Skip insns that only set an equivalence.  */
1635*e4b17023SJohn Marino 	      if (set && REG_P (SET_DEST (set))
1636*e4b17023SJohn Marino 		  && reg_renumber[REGNO (SET_DEST (set))] < 0
1637*e4b17023SJohn Marino 		  && (reg_equiv_constant (REGNO (SET_DEST (set)))
1638*e4b17023SJohn Marino 		      || reg_equiv_invariant (REGNO (SET_DEST (set)))))
1639*e4b17023SJohn Marino 		{
1640*e4b17023SJohn Marino 		  unsigned regno = REGNO (SET_DEST (set));
1641*e4b17023SJohn Marino 		  rtx init = reg_equiv_init (regno);
1642*e4b17023SJohn Marino 		  if (init)
1643*e4b17023SJohn Marino 		    {
1644*e4b17023SJohn Marino 		      rtx t = eliminate_regs_1 (SET_SRC (set), VOIDmode, insn,
1645*e4b17023SJohn Marino 						false, true);
1646*e4b17023SJohn Marino 		      int cost = set_src_cost (t, optimize_bb_for_speed_p (bb));
1647*e4b17023SJohn Marino 		      int freq = REG_FREQ_FROM_BB (bb);
1648*e4b17023SJohn Marino 
1649*e4b17023SJohn Marino 		      reg_equiv_init_cost[regno] = cost * freq;
1650*e4b17023SJohn Marino 		      continue;
1651*e4b17023SJohn Marino 		    }
1652*e4b17023SJohn Marino 		}
1653*e4b17023SJohn Marino 	      /* If needed, eliminate any eliminable registers.  */
1654*e4b17023SJohn Marino 	      if (num_eliminable || num_eliminable_invariants)
1655*e4b17023SJohn Marino 		elimination_costs_in_insn (insn);
1656*e4b17023SJohn Marino 
1657*e4b17023SJohn Marino 	      if (num_eliminable)
1658*e4b17023SJohn Marino 		update_eliminable_offsets ();
1659*e4b17023SJohn Marino 	    }
1660*e4b17023SJohn Marino 	}
1661*e4b17023SJohn Marino     }
1662*e4b17023SJohn Marino   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
1663*e4b17023SJohn Marino     {
1664*e4b17023SJohn Marino       if (reg_equiv_invariant (i))
1665*e4b17023SJohn Marino 	{
1666*e4b17023SJohn Marino 	  if (reg_equiv_init (i))
1667*e4b17023SJohn Marino 	    {
1668*e4b17023SJohn Marino 	      int cost = reg_equiv_init_cost[i];
1669*e4b17023SJohn Marino 	      if (dump_file)
1670*e4b17023SJohn Marino 		fprintf (dump_file,
1671*e4b17023SJohn Marino 			 "Reg %d has equivalence, initial gains %d\n", i, cost);
1672*e4b17023SJohn Marino 	      if (cost != 0)
1673*e4b17023SJohn Marino 		ira_adjust_equiv_reg_cost (i, cost);
1674*e4b17023SJohn Marino 	    }
1675*e4b17023SJohn Marino 	  else
1676*e4b17023SJohn Marino 	    {
1677*e4b17023SJohn Marino 	      if (dump_file)
1678*e4b17023SJohn Marino 		fprintf (dump_file,
1679*e4b17023SJohn Marino 			 "Reg %d had equivalence, but can't be eliminated\n",
1680*e4b17023SJohn Marino 			 i);
1681*e4b17023SJohn Marino 	      ira_adjust_equiv_reg_cost (i, 0);
1682*e4b17023SJohn Marino 	    }
1683*e4b17023SJohn Marino 	}
1684*e4b17023SJohn Marino     }
1685*e4b17023SJohn Marino 
1686*e4b17023SJohn Marino   free (reg_equiv_init_cost);
1687*e4b17023SJohn Marino   free (offsets_known_at);
1688*e4b17023SJohn Marino   free (offsets_at);
1689*e4b17023SJohn Marino   offsets_at = NULL;
1690*e4b17023SJohn Marino   offsets_known_at = NULL;
1691*e4b17023SJohn Marino }
1692*e4b17023SJohn Marino 
1693*e4b17023SJohn Marino /* Comparison function for qsort to decide which of two reloads
1694*e4b17023SJohn Marino    should be handled first.  *P1 and *P2 are the reload numbers.  */
1695*e4b17023SJohn Marino 
1696*e4b17023SJohn Marino static int
reload_reg_class_lower(const void * r1p,const void * r2p)1697*e4b17023SJohn Marino reload_reg_class_lower (const void *r1p, const void *r2p)
1698*e4b17023SJohn Marino {
1699*e4b17023SJohn Marino   int r1 = *(const short *) r1p, r2 = *(const short *) r2p;
1700*e4b17023SJohn Marino   int t;
1701*e4b17023SJohn Marino 
1702*e4b17023SJohn Marino   /* Consider required reloads before optional ones.  */
1703*e4b17023SJohn Marino   t = rld[r1].optional - rld[r2].optional;
1704*e4b17023SJohn Marino   if (t != 0)
1705*e4b17023SJohn Marino     return t;
1706*e4b17023SJohn Marino 
1707*e4b17023SJohn Marino   /* Count all solitary classes before non-solitary ones.  */
1708*e4b17023SJohn Marino   t = ((reg_class_size[(int) rld[r2].rclass] == 1)
1709*e4b17023SJohn Marino        - (reg_class_size[(int) rld[r1].rclass] == 1));
1710*e4b17023SJohn Marino   if (t != 0)
1711*e4b17023SJohn Marino     return t;
1712*e4b17023SJohn Marino 
1713*e4b17023SJohn Marino   /* Aside from solitaires, consider all multi-reg groups first.  */
1714*e4b17023SJohn Marino   t = rld[r2].nregs - rld[r1].nregs;
1715*e4b17023SJohn Marino   if (t != 0)
1716*e4b17023SJohn Marino     return t;
1717*e4b17023SJohn Marino 
1718*e4b17023SJohn Marino   /* Consider reloads in order of increasing reg-class number.  */
1719*e4b17023SJohn Marino   t = (int) rld[r1].rclass - (int) rld[r2].rclass;
1720*e4b17023SJohn Marino   if (t != 0)
1721*e4b17023SJohn Marino     return t;
1722*e4b17023SJohn Marino 
1723*e4b17023SJohn Marino   /* If reloads are equally urgent, sort by reload number,
1724*e4b17023SJohn Marino      so that the results of qsort leave nothing to chance.  */
1725*e4b17023SJohn Marino   return r1 - r2;
1726*e4b17023SJohn Marino }
1727*e4b17023SJohn Marino 
1728*e4b17023SJohn Marino /* The cost of spilling each hard reg.  */
1729*e4b17023SJohn Marino static int spill_cost[FIRST_PSEUDO_REGISTER];
1730*e4b17023SJohn Marino 
1731*e4b17023SJohn Marino /* When spilling multiple hard registers, we use SPILL_COST for the first
1732*e4b17023SJohn Marino    spilled hard reg and SPILL_ADD_COST for subsequent regs.  SPILL_ADD_COST
1733*e4b17023SJohn Marino    only the first hard reg for a multi-reg pseudo.  */
1734*e4b17023SJohn Marino static int spill_add_cost[FIRST_PSEUDO_REGISTER];
1735*e4b17023SJohn Marino 
1736*e4b17023SJohn Marino /* Map of hard regno to pseudo regno currently occupying the hard
1737*e4b17023SJohn Marino    reg.  */
1738*e4b17023SJohn Marino static int hard_regno_to_pseudo_regno[FIRST_PSEUDO_REGISTER];
1739*e4b17023SJohn Marino 
1740*e4b17023SJohn Marino /* Update the spill cost arrays, considering that pseudo REG is live.  */
1741*e4b17023SJohn Marino 
1742*e4b17023SJohn Marino static void
count_pseudo(int reg)1743*e4b17023SJohn Marino count_pseudo (int reg)
1744*e4b17023SJohn Marino {
1745*e4b17023SJohn Marino   int freq = REG_FREQ (reg);
1746*e4b17023SJohn Marino   int r = reg_renumber[reg];
1747*e4b17023SJohn Marino   int nregs;
1748*e4b17023SJohn Marino 
1749*e4b17023SJohn Marino   if (REGNO_REG_SET_P (&pseudos_counted, reg)
1750*e4b17023SJohn Marino       || REGNO_REG_SET_P (&spilled_pseudos, reg)
1751*e4b17023SJohn Marino       /* Ignore spilled pseudo-registers which can be here only if IRA
1752*e4b17023SJohn Marino 	 is used.  */
1753*e4b17023SJohn Marino       || (ira_conflicts_p && r < 0))
1754*e4b17023SJohn Marino     return;
1755*e4b17023SJohn Marino 
1756*e4b17023SJohn Marino   SET_REGNO_REG_SET (&pseudos_counted, reg);
1757*e4b17023SJohn Marino 
1758*e4b17023SJohn Marino   gcc_assert (r >= 0);
1759*e4b17023SJohn Marino 
1760*e4b17023SJohn Marino   spill_add_cost[r] += freq;
1761*e4b17023SJohn Marino   nregs = hard_regno_nregs[r][PSEUDO_REGNO_MODE (reg)];
1762*e4b17023SJohn Marino   while (nregs-- > 0)
1763*e4b17023SJohn Marino     {
1764*e4b17023SJohn Marino       hard_regno_to_pseudo_regno[r + nregs] = reg;
1765*e4b17023SJohn Marino       spill_cost[r + nregs] += freq;
1766*e4b17023SJohn Marino     }
1767*e4b17023SJohn Marino }
1768*e4b17023SJohn Marino 
1769*e4b17023SJohn Marino /* Calculate the SPILL_COST and SPILL_ADD_COST arrays and determine the
1770*e4b17023SJohn Marino    contents of BAD_SPILL_REGS for the insn described by CHAIN.  */
1771*e4b17023SJohn Marino 
1772*e4b17023SJohn Marino static void
order_regs_for_reload(struct insn_chain * chain)1773*e4b17023SJohn Marino order_regs_for_reload (struct insn_chain *chain)
1774*e4b17023SJohn Marino {
1775*e4b17023SJohn Marino   unsigned i;
1776*e4b17023SJohn Marino   HARD_REG_SET used_by_pseudos;
1777*e4b17023SJohn Marino   HARD_REG_SET used_by_pseudos2;
1778*e4b17023SJohn Marino   reg_set_iterator rsi;
1779*e4b17023SJohn Marino 
1780*e4b17023SJohn Marino   COPY_HARD_REG_SET (bad_spill_regs, fixed_reg_set);
1781*e4b17023SJohn Marino 
1782*e4b17023SJohn Marino   memset (spill_cost, 0, sizeof spill_cost);
1783*e4b17023SJohn Marino   memset (spill_add_cost, 0, sizeof spill_add_cost);
1784*e4b17023SJohn Marino   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1785*e4b17023SJohn Marino     hard_regno_to_pseudo_regno[i] = -1;
1786*e4b17023SJohn Marino 
1787*e4b17023SJohn Marino   /* Count number of uses of each hard reg by pseudo regs allocated to it
1788*e4b17023SJohn Marino      and then order them by decreasing use.  First exclude hard registers
1789*e4b17023SJohn Marino      that are live in or across this insn.  */
1790*e4b17023SJohn Marino 
1791*e4b17023SJohn Marino   REG_SET_TO_HARD_REG_SET (used_by_pseudos, &chain->live_throughout);
1792*e4b17023SJohn Marino   REG_SET_TO_HARD_REG_SET (used_by_pseudos2, &chain->dead_or_set);
1793*e4b17023SJohn Marino   IOR_HARD_REG_SET (bad_spill_regs, used_by_pseudos);
1794*e4b17023SJohn Marino   IOR_HARD_REG_SET (bad_spill_regs, used_by_pseudos2);
1795*e4b17023SJohn Marino 
1796*e4b17023SJohn Marino   /* Now find out which pseudos are allocated to it, and update
1797*e4b17023SJohn Marino      hard_reg_n_uses.  */
1798*e4b17023SJohn Marino   CLEAR_REG_SET (&pseudos_counted);
1799*e4b17023SJohn Marino 
1800*e4b17023SJohn Marino   EXECUTE_IF_SET_IN_REG_SET
1801*e4b17023SJohn Marino     (&chain->live_throughout, FIRST_PSEUDO_REGISTER, i, rsi)
1802*e4b17023SJohn Marino     {
1803*e4b17023SJohn Marino       count_pseudo (i);
1804*e4b17023SJohn Marino     }
1805*e4b17023SJohn Marino   EXECUTE_IF_SET_IN_REG_SET
1806*e4b17023SJohn Marino     (&chain->dead_or_set, FIRST_PSEUDO_REGISTER, i, rsi)
1807*e4b17023SJohn Marino     {
1808*e4b17023SJohn Marino       count_pseudo (i);
1809*e4b17023SJohn Marino     }
1810*e4b17023SJohn Marino   CLEAR_REG_SET (&pseudos_counted);
1811*e4b17023SJohn Marino }
1812*e4b17023SJohn Marino 
1813*e4b17023SJohn Marino /* Vector of reload-numbers showing the order in which the reloads should
1814*e4b17023SJohn Marino    be processed.  */
1815*e4b17023SJohn Marino static short reload_order[MAX_RELOADS];
1816*e4b17023SJohn Marino 
1817*e4b17023SJohn Marino /* This is used to keep track of the spill regs used in one insn.  */
1818*e4b17023SJohn Marino static HARD_REG_SET used_spill_regs_local;
1819*e4b17023SJohn Marino 
1820*e4b17023SJohn Marino /* We decided to spill hard register SPILLED, which has a size of
1821*e4b17023SJohn Marino    SPILLED_NREGS.  Determine how pseudo REG, which is live during the insn,
1822*e4b17023SJohn Marino    is affected.  We will add it to SPILLED_PSEUDOS if necessary, and we will
1823*e4b17023SJohn Marino    update SPILL_COST/SPILL_ADD_COST.  */
1824*e4b17023SJohn Marino 
1825*e4b17023SJohn Marino static void
count_spilled_pseudo(int spilled,int spilled_nregs,int reg)1826*e4b17023SJohn Marino count_spilled_pseudo (int spilled, int spilled_nregs, int reg)
1827*e4b17023SJohn Marino {
1828*e4b17023SJohn Marino   int freq = REG_FREQ (reg);
1829*e4b17023SJohn Marino   int r = reg_renumber[reg];
1830*e4b17023SJohn Marino   int nregs = hard_regno_nregs[r][PSEUDO_REGNO_MODE (reg)];
1831*e4b17023SJohn Marino 
1832*e4b17023SJohn Marino   /* Ignore spilled pseudo-registers which can be here only if IRA is
1833*e4b17023SJohn Marino      used.  */
1834*e4b17023SJohn Marino   if ((ira_conflicts_p && r < 0)
1835*e4b17023SJohn Marino       || REGNO_REG_SET_P (&spilled_pseudos, reg)
1836*e4b17023SJohn Marino       || spilled + spilled_nregs <= r || r + nregs <= spilled)
1837*e4b17023SJohn Marino     return;
1838*e4b17023SJohn Marino 
1839*e4b17023SJohn Marino   SET_REGNO_REG_SET (&spilled_pseudos, reg);
1840*e4b17023SJohn Marino 
1841*e4b17023SJohn Marino   spill_add_cost[r] -= freq;
1842*e4b17023SJohn Marino   while (nregs-- > 0)
1843*e4b17023SJohn Marino     {
1844*e4b17023SJohn Marino       hard_regno_to_pseudo_regno[r + nregs] = -1;
1845*e4b17023SJohn Marino       spill_cost[r + nregs] -= freq;
1846*e4b17023SJohn Marino     }
1847*e4b17023SJohn Marino }
1848*e4b17023SJohn Marino 
1849*e4b17023SJohn Marino /* Find reload register to use for reload number ORDER.  */
1850*e4b17023SJohn Marino 
1851*e4b17023SJohn Marino static int
find_reg(struct insn_chain * chain,int order)1852*e4b17023SJohn Marino find_reg (struct insn_chain *chain, int order)
1853*e4b17023SJohn Marino {
1854*e4b17023SJohn Marino   int rnum = reload_order[order];
1855*e4b17023SJohn Marino   struct reload *rl = rld + rnum;
1856*e4b17023SJohn Marino   int best_cost = INT_MAX;
1857*e4b17023SJohn Marino   int best_reg = -1;
1858*e4b17023SJohn Marino   unsigned int i, j, n;
1859*e4b17023SJohn Marino   int k;
1860*e4b17023SJohn Marino   HARD_REG_SET not_usable;
1861*e4b17023SJohn Marino   HARD_REG_SET used_by_other_reload;
1862*e4b17023SJohn Marino   reg_set_iterator rsi;
1863*e4b17023SJohn Marino   static int regno_pseudo_regs[FIRST_PSEUDO_REGISTER];
1864*e4b17023SJohn Marino   static int best_regno_pseudo_regs[FIRST_PSEUDO_REGISTER];
1865*e4b17023SJohn Marino 
1866*e4b17023SJohn Marino   COPY_HARD_REG_SET (not_usable, bad_spill_regs);
1867*e4b17023SJohn Marino   IOR_HARD_REG_SET (not_usable, bad_spill_regs_global);
1868*e4b17023SJohn Marino   IOR_COMPL_HARD_REG_SET (not_usable, reg_class_contents[rl->rclass]);
1869*e4b17023SJohn Marino 
1870*e4b17023SJohn Marino   CLEAR_HARD_REG_SET (used_by_other_reload);
1871*e4b17023SJohn Marino   for (k = 0; k < order; k++)
1872*e4b17023SJohn Marino     {
1873*e4b17023SJohn Marino       int other = reload_order[k];
1874*e4b17023SJohn Marino 
1875*e4b17023SJohn Marino       if (rld[other].regno >= 0 && reloads_conflict (other, rnum))
1876*e4b17023SJohn Marino 	for (j = 0; j < rld[other].nregs; j++)
1877*e4b17023SJohn Marino 	  SET_HARD_REG_BIT (used_by_other_reload, rld[other].regno + j);
1878*e4b17023SJohn Marino     }
1879*e4b17023SJohn Marino 
1880*e4b17023SJohn Marino   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1881*e4b17023SJohn Marino     {
1882*e4b17023SJohn Marino #ifdef REG_ALLOC_ORDER
1883*e4b17023SJohn Marino       unsigned int regno = reg_alloc_order[i];
1884*e4b17023SJohn Marino #else
1885*e4b17023SJohn Marino       unsigned int regno = i;
1886*e4b17023SJohn Marino #endif
1887*e4b17023SJohn Marino 
1888*e4b17023SJohn Marino       if (! TEST_HARD_REG_BIT (not_usable, regno)
1889*e4b17023SJohn Marino 	  && ! TEST_HARD_REG_BIT (used_by_other_reload, regno)
1890*e4b17023SJohn Marino 	  && HARD_REGNO_MODE_OK (regno, rl->mode))
1891*e4b17023SJohn Marino 	{
1892*e4b17023SJohn Marino 	  int this_cost = spill_cost[regno];
1893*e4b17023SJohn Marino 	  int ok = 1;
1894*e4b17023SJohn Marino 	  unsigned int this_nregs = hard_regno_nregs[regno][rl->mode];
1895*e4b17023SJohn Marino 
1896*e4b17023SJohn Marino 	  for (j = 1; j < this_nregs; j++)
1897*e4b17023SJohn Marino 	    {
1898*e4b17023SJohn Marino 	      this_cost += spill_add_cost[regno + j];
1899*e4b17023SJohn Marino 	      if ((TEST_HARD_REG_BIT (not_usable, regno + j))
1900*e4b17023SJohn Marino 		  || TEST_HARD_REG_BIT (used_by_other_reload, regno + j))
1901*e4b17023SJohn Marino 		ok = 0;
1902*e4b17023SJohn Marino 	    }
1903*e4b17023SJohn Marino 	  if (! ok)
1904*e4b17023SJohn Marino 	    continue;
1905*e4b17023SJohn Marino 
1906*e4b17023SJohn Marino 	  if (ira_conflicts_p)
1907*e4b17023SJohn Marino 	    {
1908*e4b17023SJohn Marino 	      /* Ask IRA to find a better pseudo-register for
1909*e4b17023SJohn Marino 		 spilling.  */
1910*e4b17023SJohn Marino 	      for (n = j = 0; j < this_nregs; j++)
1911*e4b17023SJohn Marino 		{
1912*e4b17023SJohn Marino 		  int r = hard_regno_to_pseudo_regno[regno + j];
1913*e4b17023SJohn Marino 
1914*e4b17023SJohn Marino 		  if (r < 0)
1915*e4b17023SJohn Marino 		    continue;
1916*e4b17023SJohn Marino 		  if (n == 0 || regno_pseudo_regs[n - 1] != r)
1917*e4b17023SJohn Marino 		    regno_pseudo_regs[n++] = r;
1918*e4b17023SJohn Marino 		}
1919*e4b17023SJohn Marino 	      regno_pseudo_regs[n++] = -1;
1920*e4b17023SJohn Marino 	      if (best_reg < 0
1921*e4b17023SJohn Marino 		  || ira_better_spill_reload_regno_p (regno_pseudo_regs,
1922*e4b17023SJohn Marino 						      best_regno_pseudo_regs,
1923*e4b17023SJohn Marino 						      rl->in, rl->out,
1924*e4b17023SJohn Marino 						      chain->insn))
1925*e4b17023SJohn Marino 		{
1926*e4b17023SJohn Marino 		  best_reg = regno;
1927*e4b17023SJohn Marino 		  for (j = 0;; j++)
1928*e4b17023SJohn Marino 		    {
1929*e4b17023SJohn Marino 		      best_regno_pseudo_regs[j] = regno_pseudo_regs[j];
1930*e4b17023SJohn Marino 		      if (regno_pseudo_regs[j] < 0)
1931*e4b17023SJohn Marino 			break;
1932*e4b17023SJohn Marino 		    }
1933*e4b17023SJohn Marino 		}
1934*e4b17023SJohn Marino 	      continue;
1935*e4b17023SJohn Marino 	    }
1936*e4b17023SJohn Marino 
1937*e4b17023SJohn Marino 	  if (rl->in && REG_P (rl->in) && REGNO (rl->in) == regno)
1938*e4b17023SJohn Marino 	    this_cost--;
1939*e4b17023SJohn Marino 	  if (rl->out && REG_P (rl->out) && REGNO (rl->out) == regno)
1940*e4b17023SJohn Marino 	    this_cost--;
1941*e4b17023SJohn Marino 	  if (this_cost < best_cost
1942*e4b17023SJohn Marino 	      /* Among registers with equal cost, prefer caller-saved ones, or
1943*e4b17023SJohn Marino 		 use REG_ALLOC_ORDER if it is defined.  */
1944*e4b17023SJohn Marino 	      || (this_cost == best_cost
1945*e4b17023SJohn Marino #ifdef REG_ALLOC_ORDER
1946*e4b17023SJohn Marino 		  && (inv_reg_alloc_order[regno]
1947*e4b17023SJohn Marino 		      < inv_reg_alloc_order[best_reg])
1948*e4b17023SJohn Marino #else
1949*e4b17023SJohn Marino 		  && call_used_regs[regno]
1950*e4b17023SJohn Marino 		  && ! call_used_regs[best_reg]
1951*e4b17023SJohn Marino #endif
1952*e4b17023SJohn Marino 		  ))
1953*e4b17023SJohn Marino 	    {
1954*e4b17023SJohn Marino 	      best_reg = regno;
1955*e4b17023SJohn Marino 	      best_cost = this_cost;
1956*e4b17023SJohn Marino 	    }
1957*e4b17023SJohn Marino 	}
1958*e4b17023SJohn Marino     }
1959*e4b17023SJohn Marino   if (best_reg == -1)
1960*e4b17023SJohn Marino     return 0;
1961*e4b17023SJohn Marino 
1962*e4b17023SJohn Marino   if (dump_file)
1963*e4b17023SJohn Marino     fprintf (dump_file, "Using reg %d for reload %d\n", best_reg, rnum);
1964*e4b17023SJohn Marino 
1965*e4b17023SJohn Marino   rl->nregs = hard_regno_nregs[best_reg][rl->mode];
1966*e4b17023SJohn Marino   rl->regno = best_reg;
1967*e4b17023SJohn Marino 
1968*e4b17023SJohn Marino   EXECUTE_IF_SET_IN_REG_SET
1969*e4b17023SJohn Marino     (&chain->live_throughout, FIRST_PSEUDO_REGISTER, j, rsi)
1970*e4b17023SJohn Marino     {
1971*e4b17023SJohn Marino       count_spilled_pseudo (best_reg, rl->nregs, j);
1972*e4b17023SJohn Marino     }
1973*e4b17023SJohn Marino 
1974*e4b17023SJohn Marino   EXECUTE_IF_SET_IN_REG_SET
1975*e4b17023SJohn Marino     (&chain->dead_or_set, FIRST_PSEUDO_REGISTER, j, rsi)
1976*e4b17023SJohn Marino     {
1977*e4b17023SJohn Marino       count_spilled_pseudo (best_reg, rl->nregs, j);
1978*e4b17023SJohn Marino     }
1979*e4b17023SJohn Marino 
1980*e4b17023SJohn Marino   for (i = 0; i < rl->nregs; i++)
1981*e4b17023SJohn Marino     {
1982*e4b17023SJohn Marino       gcc_assert (spill_cost[best_reg + i] == 0);
1983*e4b17023SJohn Marino       gcc_assert (spill_add_cost[best_reg + i] == 0);
1984*e4b17023SJohn Marino       gcc_assert (hard_regno_to_pseudo_regno[best_reg + i] == -1);
1985*e4b17023SJohn Marino       SET_HARD_REG_BIT (used_spill_regs_local, best_reg + i);
1986*e4b17023SJohn Marino     }
1987*e4b17023SJohn Marino   return 1;
1988*e4b17023SJohn Marino }
1989*e4b17023SJohn Marino 
1990*e4b17023SJohn Marino /* Find more reload regs to satisfy the remaining need of an insn, which
1991*e4b17023SJohn Marino    is given by CHAIN.
1992*e4b17023SJohn Marino    Do it by ascending class number, since otherwise a reg
1993*e4b17023SJohn Marino    might be spilled for a big class and might fail to count
1994*e4b17023SJohn Marino    for a smaller class even though it belongs to that class.  */
1995*e4b17023SJohn Marino 
1996*e4b17023SJohn Marino static void
find_reload_regs(struct insn_chain * chain)1997*e4b17023SJohn Marino find_reload_regs (struct insn_chain *chain)
1998*e4b17023SJohn Marino {
1999*e4b17023SJohn Marino   int i;
2000*e4b17023SJohn Marino 
2001*e4b17023SJohn Marino   /* In order to be certain of getting the registers we need,
2002*e4b17023SJohn Marino      we must sort the reloads into order of increasing register class.
2003*e4b17023SJohn Marino      Then our grabbing of reload registers will parallel the process
2004*e4b17023SJohn Marino      that provided the reload registers.  */
2005*e4b17023SJohn Marino   for (i = 0; i < chain->n_reloads; i++)
2006*e4b17023SJohn Marino     {
2007*e4b17023SJohn Marino       /* Show whether this reload already has a hard reg.  */
2008*e4b17023SJohn Marino       if (chain->rld[i].reg_rtx)
2009*e4b17023SJohn Marino 	{
2010*e4b17023SJohn Marino 	  int regno = REGNO (chain->rld[i].reg_rtx);
2011*e4b17023SJohn Marino 	  chain->rld[i].regno = regno;
2012*e4b17023SJohn Marino 	  chain->rld[i].nregs
2013*e4b17023SJohn Marino 	    = hard_regno_nregs[regno][GET_MODE (chain->rld[i].reg_rtx)];
2014*e4b17023SJohn Marino 	}
2015*e4b17023SJohn Marino       else
2016*e4b17023SJohn Marino 	chain->rld[i].regno = -1;
2017*e4b17023SJohn Marino       reload_order[i] = i;
2018*e4b17023SJohn Marino     }
2019*e4b17023SJohn Marino 
2020*e4b17023SJohn Marino   n_reloads = chain->n_reloads;
2021*e4b17023SJohn Marino   memcpy (rld, chain->rld, n_reloads * sizeof (struct reload));
2022*e4b17023SJohn Marino 
2023*e4b17023SJohn Marino   CLEAR_HARD_REG_SET (used_spill_regs_local);
2024*e4b17023SJohn Marino 
2025*e4b17023SJohn Marino   if (dump_file)
2026*e4b17023SJohn Marino     fprintf (dump_file, "Spilling for insn %d.\n", INSN_UID (chain->insn));
2027*e4b17023SJohn Marino 
2028*e4b17023SJohn Marino   qsort (reload_order, n_reloads, sizeof (short), reload_reg_class_lower);
2029*e4b17023SJohn Marino 
2030*e4b17023SJohn Marino   /* Compute the order of preference for hard registers to spill.  */
2031*e4b17023SJohn Marino 
2032*e4b17023SJohn Marino   order_regs_for_reload (chain);
2033*e4b17023SJohn Marino 
2034*e4b17023SJohn Marino   for (i = 0; i < n_reloads; i++)
2035*e4b17023SJohn Marino     {
2036*e4b17023SJohn Marino       int r = reload_order[i];
2037*e4b17023SJohn Marino 
2038*e4b17023SJohn Marino       /* Ignore reloads that got marked inoperative.  */
2039*e4b17023SJohn Marino       if ((rld[r].out != 0 || rld[r].in != 0 || rld[r].secondary_p)
2040*e4b17023SJohn Marino 	  && ! rld[r].optional
2041*e4b17023SJohn Marino 	  && rld[r].regno == -1)
2042*e4b17023SJohn Marino 	if (! find_reg (chain, i))
2043*e4b17023SJohn Marino 	  {
2044*e4b17023SJohn Marino 	    if (dump_file)
2045*e4b17023SJohn Marino 	      fprintf (dump_file, "reload failure for reload %d\n", r);
2046*e4b17023SJohn Marino 	    spill_failure (chain->insn, rld[r].rclass);
2047*e4b17023SJohn Marino 	    failure = 1;
2048*e4b17023SJohn Marino 	    return;
2049*e4b17023SJohn Marino 	  }
2050*e4b17023SJohn Marino     }
2051*e4b17023SJohn Marino 
2052*e4b17023SJohn Marino   COPY_HARD_REG_SET (chain->used_spill_regs, used_spill_regs_local);
2053*e4b17023SJohn Marino   IOR_HARD_REG_SET (used_spill_regs, used_spill_regs_local);
2054*e4b17023SJohn Marino 
2055*e4b17023SJohn Marino   memcpy (chain->rld, rld, n_reloads * sizeof (struct reload));
2056*e4b17023SJohn Marino }
2057*e4b17023SJohn Marino 
2058*e4b17023SJohn Marino static void
select_reload_regs(void)2059*e4b17023SJohn Marino select_reload_regs (void)
2060*e4b17023SJohn Marino {
2061*e4b17023SJohn Marino   struct insn_chain *chain;
2062*e4b17023SJohn Marino 
2063*e4b17023SJohn Marino   /* Try to satisfy the needs for each insn.  */
2064*e4b17023SJohn Marino   for (chain = insns_need_reload; chain != 0;
2065*e4b17023SJohn Marino        chain = chain->next_need_reload)
2066*e4b17023SJohn Marino     find_reload_regs (chain);
2067*e4b17023SJohn Marino }
2068*e4b17023SJohn Marino 
2069*e4b17023SJohn Marino /* Delete all insns that were inserted by emit_caller_save_insns during
2070*e4b17023SJohn Marino    this iteration.  */
2071*e4b17023SJohn Marino static void
delete_caller_save_insns(void)2072*e4b17023SJohn Marino delete_caller_save_insns (void)
2073*e4b17023SJohn Marino {
2074*e4b17023SJohn Marino   struct insn_chain *c = reload_insn_chain;
2075*e4b17023SJohn Marino 
2076*e4b17023SJohn Marino   while (c != 0)
2077*e4b17023SJohn Marino     {
2078*e4b17023SJohn Marino       while (c != 0 && c->is_caller_save_insn)
2079*e4b17023SJohn Marino 	{
2080*e4b17023SJohn Marino 	  struct insn_chain *next = c->next;
2081*e4b17023SJohn Marino 	  rtx insn = c->insn;
2082*e4b17023SJohn Marino 
2083*e4b17023SJohn Marino 	  if (c == reload_insn_chain)
2084*e4b17023SJohn Marino 	    reload_insn_chain = next;
2085*e4b17023SJohn Marino 	  delete_insn (insn);
2086*e4b17023SJohn Marino 
2087*e4b17023SJohn Marino 	  if (next)
2088*e4b17023SJohn Marino 	    next->prev = c->prev;
2089*e4b17023SJohn Marino 	  if (c->prev)
2090*e4b17023SJohn Marino 	    c->prev->next = next;
2091*e4b17023SJohn Marino 	  c->next = unused_insn_chains;
2092*e4b17023SJohn Marino 	  unused_insn_chains = c;
2093*e4b17023SJohn Marino 	  c = next;
2094*e4b17023SJohn Marino 	}
2095*e4b17023SJohn Marino       if (c != 0)
2096*e4b17023SJohn Marino 	c = c->next;
2097*e4b17023SJohn Marino     }
2098*e4b17023SJohn Marino }
2099*e4b17023SJohn Marino 
2100*e4b17023SJohn Marino /* Handle the failure to find a register to spill.
2101*e4b17023SJohn Marino    INSN should be one of the insns which needed this particular spill reg.  */
2102*e4b17023SJohn Marino 
2103*e4b17023SJohn Marino static void
spill_failure(rtx insn,enum reg_class rclass)2104*e4b17023SJohn Marino spill_failure (rtx insn, enum reg_class rclass)
2105*e4b17023SJohn Marino {
2106*e4b17023SJohn Marino   if (asm_noperands (PATTERN (insn)) >= 0)
2107*e4b17023SJohn Marino     error_for_asm (insn, "can%'t find a register in class %qs while "
2108*e4b17023SJohn Marino 		   "reloading %<asm%>",
2109*e4b17023SJohn Marino 		   reg_class_names[rclass]);
2110*e4b17023SJohn Marino   else
2111*e4b17023SJohn Marino     {
2112*e4b17023SJohn Marino       error ("unable to find a register to spill in class %qs",
2113*e4b17023SJohn Marino 	     reg_class_names[rclass]);
2114*e4b17023SJohn Marino 
2115*e4b17023SJohn Marino       if (dump_file)
2116*e4b17023SJohn Marino 	{
2117*e4b17023SJohn Marino 	  fprintf (dump_file, "\nReloads for insn # %d\n", INSN_UID (insn));
2118*e4b17023SJohn Marino 	  debug_reload_to_stream (dump_file);
2119*e4b17023SJohn Marino 	}
2120*e4b17023SJohn Marino       fatal_insn ("this is the insn:", insn);
2121*e4b17023SJohn Marino     }
2122*e4b17023SJohn Marino }
2123*e4b17023SJohn Marino 
2124*e4b17023SJohn Marino /* Delete an unneeded INSN and any previous insns who sole purpose is loading
2125*e4b17023SJohn Marino    data that is dead in INSN.  */
2126*e4b17023SJohn Marino 
2127*e4b17023SJohn Marino static void
delete_dead_insn(rtx insn)2128*e4b17023SJohn Marino delete_dead_insn (rtx insn)
2129*e4b17023SJohn Marino {
2130*e4b17023SJohn Marino   rtx prev = prev_active_insn (insn);
2131*e4b17023SJohn Marino   rtx prev_dest;
2132*e4b17023SJohn Marino 
2133*e4b17023SJohn Marino   /* If the previous insn sets a register that dies in our insn make
2134*e4b17023SJohn Marino      a note that we want to run DCE immediately after reload.
2135*e4b17023SJohn Marino 
2136*e4b17023SJohn Marino      We used to delete the previous insn & recurse, but that's wrong for
2137*e4b17023SJohn Marino      block local equivalences.  Instead of trying to figure out the exact
2138*e4b17023SJohn Marino      circumstances where we can delete the potentially dead insns, just
2139*e4b17023SJohn Marino      let DCE do the job.  */
2140*e4b17023SJohn Marino   if (prev && GET_CODE (PATTERN (prev)) == SET
2141*e4b17023SJohn Marino       && (prev_dest = SET_DEST (PATTERN (prev)), REG_P (prev_dest))
2142*e4b17023SJohn Marino       && reg_mentioned_p (prev_dest, PATTERN (insn))
2143*e4b17023SJohn Marino       && find_regno_note (insn, REG_DEAD, REGNO (prev_dest))
2144*e4b17023SJohn Marino       && ! side_effects_p (SET_SRC (PATTERN (prev))))
2145*e4b17023SJohn Marino     need_dce = 1;
2146*e4b17023SJohn Marino 
2147*e4b17023SJohn Marino   SET_INSN_DELETED (insn);
2148*e4b17023SJohn Marino }
2149*e4b17023SJohn Marino 
2150*e4b17023SJohn Marino /* Modify the home of pseudo-reg I.
2151*e4b17023SJohn Marino    The new home is present in reg_renumber[I].
2152*e4b17023SJohn Marino 
2153*e4b17023SJohn Marino    FROM_REG may be the hard reg that the pseudo-reg is being spilled from;
2154*e4b17023SJohn Marino    or it may be -1, meaning there is none or it is not relevant.
2155*e4b17023SJohn Marino    This is used so that all pseudos spilled from a given hard reg
2156*e4b17023SJohn Marino    can share one stack slot.  */
2157*e4b17023SJohn Marino 
2158*e4b17023SJohn Marino static void
alter_reg(int i,int from_reg,bool dont_share_p)2159*e4b17023SJohn Marino alter_reg (int i, int from_reg, bool dont_share_p)
2160*e4b17023SJohn Marino {
2161*e4b17023SJohn Marino   /* When outputting an inline function, this can happen
2162*e4b17023SJohn Marino      for a reg that isn't actually used.  */
2163*e4b17023SJohn Marino   if (regno_reg_rtx[i] == 0)
2164*e4b17023SJohn Marino     return;
2165*e4b17023SJohn Marino 
2166*e4b17023SJohn Marino   /* If the reg got changed to a MEM at rtl-generation time,
2167*e4b17023SJohn Marino      ignore it.  */
2168*e4b17023SJohn Marino   if (!REG_P (regno_reg_rtx[i]))
2169*e4b17023SJohn Marino     return;
2170*e4b17023SJohn Marino 
2171*e4b17023SJohn Marino   /* Modify the reg-rtx to contain the new hard reg
2172*e4b17023SJohn Marino      number or else to contain its pseudo reg number.  */
2173*e4b17023SJohn Marino   SET_REGNO (regno_reg_rtx[i],
2174*e4b17023SJohn Marino 	     reg_renumber[i] >= 0 ? reg_renumber[i] : i);
2175*e4b17023SJohn Marino 
2176*e4b17023SJohn Marino   /* If we have a pseudo that is needed but has no hard reg or equivalent,
2177*e4b17023SJohn Marino      allocate a stack slot for it.  */
2178*e4b17023SJohn Marino 
2179*e4b17023SJohn Marino   if (reg_renumber[i] < 0
2180*e4b17023SJohn Marino       && REG_N_REFS (i) > 0
2181*e4b17023SJohn Marino       && reg_equiv_constant (i) == 0
2182*e4b17023SJohn Marino       && (reg_equiv_invariant (i) == 0
2183*e4b17023SJohn Marino 	  || reg_equiv_init (i) == 0)
2184*e4b17023SJohn Marino       && reg_equiv_memory_loc (i) == 0)
2185*e4b17023SJohn Marino     {
2186*e4b17023SJohn Marino       rtx x = NULL_RTX;
2187*e4b17023SJohn Marino       enum machine_mode mode = GET_MODE (regno_reg_rtx[i]);
2188*e4b17023SJohn Marino       unsigned int inherent_size = PSEUDO_REGNO_BYTES (i);
2189*e4b17023SJohn Marino       unsigned int inherent_align = GET_MODE_ALIGNMENT (mode);
2190*e4b17023SJohn Marino       unsigned int total_size = MAX (inherent_size, reg_max_ref_width[i]);
2191*e4b17023SJohn Marino       unsigned int min_align = reg_max_ref_width[i] * BITS_PER_UNIT;
2192*e4b17023SJohn Marino       int adjust = 0;
2193*e4b17023SJohn Marino 
2194*e4b17023SJohn Marino       something_was_spilled = true;
2195*e4b17023SJohn Marino 
2196*e4b17023SJohn Marino       if (ira_conflicts_p)
2197*e4b17023SJohn Marino 	{
2198*e4b17023SJohn Marino 	  /* Mark the spill for IRA.  */
2199*e4b17023SJohn Marino 	  SET_REGNO_REG_SET (&spilled_pseudos, i);
2200*e4b17023SJohn Marino 	  if (!dont_share_p)
2201*e4b17023SJohn Marino 	    x = ira_reuse_stack_slot (i, inherent_size, total_size);
2202*e4b17023SJohn Marino 	}
2203*e4b17023SJohn Marino 
2204*e4b17023SJohn Marino       if (x)
2205*e4b17023SJohn Marino 	;
2206*e4b17023SJohn Marino 
2207*e4b17023SJohn Marino       /* Each pseudo reg has an inherent size which comes from its own mode,
2208*e4b17023SJohn Marino 	 and a total size which provides room for paradoxical subregs
2209*e4b17023SJohn Marino 	 which refer to the pseudo reg in wider modes.
2210*e4b17023SJohn Marino 
2211*e4b17023SJohn Marino 	 We can use a slot already allocated if it provides both
2212*e4b17023SJohn Marino 	 enough inherent space and enough total space.
2213*e4b17023SJohn Marino 	 Otherwise, we allocate a new slot, making sure that it has no less
2214*e4b17023SJohn Marino 	 inherent space, and no less total space, then the previous slot.  */
2215*e4b17023SJohn Marino       else if (from_reg == -1 || (!dont_share_p && ira_conflicts_p))
2216*e4b17023SJohn Marino 	{
2217*e4b17023SJohn Marino 	  rtx stack_slot;
2218*e4b17023SJohn Marino 
2219*e4b17023SJohn Marino 	  /* No known place to spill from => no slot to reuse.  */
2220*e4b17023SJohn Marino 	  x = assign_stack_local (mode, total_size,
2221*e4b17023SJohn Marino 				  min_align > inherent_align
2222*e4b17023SJohn Marino 				  || total_size > inherent_size ? -1 : 0);
2223*e4b17023SJohn Marino 
2224*e4b17023SJohn Marino 	  stack_slot = x;
2225*e4b17023SJohn Marino 
2226*e4b17023SJohn Marino 	  /* Cancel the big-endian correction done in assign_stack_local.
2227*e4b17023SJohn Marino 	     Get the address of the beginning of the slot.  This is so we
2228*e4b17023SJohn Marino 	     can do a big-endian correction unconditionally below.  */
2229*e4b17023SJohn Marino 	  if (BYTES_BIG_ENDIAN)
2230*e4b17023SJohn Marino 	    {
2231*e4b17023SJohn Marino 	      adjust = inherent_size - total_size;
2232*e4b17023SJohn Marino 	      if (adjust)
2233*e4b17023SJohn Marino 		stack_slot
2234*e4b17023SJohn Marino 		  = adjust_address_nv (x, mode_for_size (total_size
2235*e4b17023SJohn Marino 						         * BITS_PER_UNIT,
2236*e4b17023SJohn Marino 						         MODE_INT, 1),
2237*e4b17023SJohn Marino 				       adjust);
2238*e4b17023SJohn Marino 	    }
2239*e4b17023SJohn Marino 
2240*e4b17023SJohn Marino 	  if (! dont_share_p && ira_conflicts_p)
2241*e4b17023SJohn Marino 	    /* Inform IRA about allocation a new stack slot.  */
2242*e4b17023SJohn Marino 	    ira_mark_new_stack_slot (stack_slot, i, total_size);
2243*e4b17023SJohn Marino 	}
2244*e4b17023SJohn Marino 
2245*e4b17023SJohn Marino       /* Reuse a stack slot if possible.  */
2246*e4b17023SJohn Marino       else if (spill_stack_slot[from_reg] != 0
2247*e4b17023SJohn Marino 	       && spill_stack_slot_width[from_reg] >= total_size
2248*e4b17023SJohn Marino 	       && (GET_MODE_SIZE (GET_MODE (spill_stack_slot[from_reg]))
2249*e4b17023SJohn Marino 		   >= inherent_size)
2250*e4b17023SJohn Marino 	       && MEM_ALIGN (spill_stack_slot[from_reg]) >= min_align)
2251*e4b17023SJohn Marino 	x = spill_stack_slot[from_reg];
2252*e4b17023SJohn Marino 
2253*e4b17023SJohn Marino       /* Allocate a bigger slot.  */
2254*e4b17023SJohn Marino       else
2255*e4b17023SJohn Marino 	{
2256*e4b17023SJohn Marino 	  /* Compute maximum size needed, both for inherent size
2257*e4b17023SJohn Marino 	     and for total size.  */
2258*e4b17023SJohn Marino 	  rtx stack_slot;
2259*e4b17023SJohn Marino 
2260*e4b17023SJohn Marino 	  if (spill_stack_slot[from_reg])
2261*e4b17023SJohn Marino 	    {
2262*e4b17023SJohn Marino 	      if (GET_MODE_SIZE (GET_MODE (spill_stack_slot[from_reg]))
2263*e4b17023SJohn Marino 		  > inherent_size)
2264*e4b17023SJohn Marino 		mode = GET_MODE (spill_stack_slot[from_reg]);
2265*e4b17023SJohn Marino 	      if (spill_stack_slot_width[from_reg] > total_size)
2266*e4b17023SJohn Marino 		total_size = spill_stack_slot_width[from_reg];
2267*e4b17023SJohn Marino 	      if (MEM_ALIGN (spill_stack_slot[from_reg]) > min_align)
2268*e4b17023SJohn Marino 		min_align = MEM_ALIGN (spill_stack_slot[from_reg]);
2269*e4b17023SJohn Marino 	    }
2270*e4b17023SJohn Marino 
2271*e4b17023SJohn Marino 	  /* Make a slot with that size.  */
2272*e4b17023SJohn Marino 	  x = assign_stack_local (mode, total_size,
2273*e4b17023SJohn Marino 				  min_align > inherent_align
2274*e4b17023SJohn Marino 				  || total_size > inherent_size ? -1 : 0);
2275*e4b17023SJohn Marino 	  stack_slot = x;
2276*e4b17023SJohn Marino 
2277*e4b17023SJohn Marino 	  /* Cancel the  big-endian correction done in assign_stack_local.
2278*e4b17023SJohn Marino 	     Get the address of the beginning of the slot.  This is so we
2279*e4b17023SJohn Marino 	     can do a big-endian correction unconditionally below.  */
2280*e4b17023SJohn Marino 	  if (BYTES_BIG_ENDIAN)
2281*e4b17023SJohn Marino 	    {
2282*e4b17023SJohn Marino 	      adjust = GET_MODE_SIZE (mode) - total_size;
2283*e4b17023SJohn Marino 	      if (adjust)
2284*e4b17023SJohn Marino 		stack_slot
2285*e4b17023SJohn Marino 		  = adjust_address_nv (x, mode_for_size (total_size
2286*e4b17023SJohn Marino 							 * BITS_PER_UNIT,
2287*e4b17023SJohn Marino 							 MODE_INT, 1),
2288*e4b17023SJohn Marino 				       adjust);
2289*e4b17023SJohn Marino 	    }
2290*e4b17023SJohn Marino 
2291*e4b17023SJohn Marino 	  spill_stack_slot[from_reg] = stack_slot;
2292*e4b17023SJohn Marino 	  spill_stack_slot_width[from_reg] = total_size;
2293*e4b17023SJohn Marino 	}
2294*e4b17023SJohn Marino 
2295*e4b17023SJohn Marino       /* On a big endian machine, the "address" of the slot
2296*e4b17023SJohn Marino 	 is the address of the low part that fits its inherent mode.  */
2297*e4b17023SJohn Marino       if (BYTES_BIG_ENDIAN && inherent_size < total_size)
2298*e4b17023SJohn Marino 	adjust += (total_size - inherent_size);
2299*e4b17023SJohn Marino 
2300*e4b17023SJohn Marino       /* If we have any adjustment to make, or if the stack slot is the
2301*e4b17023SJohn Marino 	 wrong mode, make a new stack slot.  */
2302*e4b17023SJohn Marino       x = adjust_address_nv (x, GET_MODE (regno_reg_rtx[i]), adjust);
2303*e4b17023SJohn Marino 
2304*e4b17023SJohn Marino       /* Set all of the memory attributes as appropriate for a spill.  */
2305*e4b17023SJohn Marino       set_mem_attrs_for_spill (x);
2306*e4b17023SJohn Marino 
2307*e4b17023SJohn Marino       /* Save the stack slot for later.  */
2308*e4b17023SJohn Marino       reg_equiv_memory_loc (i) = x;
2309*e4b17023SJohn Marino     }
2310*e4b17023SJohn Marino }
2311*e4b17023SJohn Marino 
2312*e4b17023SJohn Marino /* Mark the slots in regs_ever_live for the hard regs used by
2313*e4b17023SJohn Marino    pseudo-reg number REGNO, accessed in MODE.  */
2314*e4b17023SJohn Marino 
2315*e4b17023SJohn Marino static void
mark_home_live_1(int regno,enum machine_mode mode)2316*e4b17023SJohn Marino mark_home_live_1 (int regno, enum machine_mode mode)
2317*e4b17023SJohn Marino {
2318*e4b17023SJohn Marino   int i, lim;
2319*e4b17023SJohn Marino 
2320*e4b17023SJohn Marino   i = reg_renumber[regno];
2321*e4b17023SJohn Marino   if (i < 0)
2322*e4b17023SJohn Marino     return;
2323*e4b17023SJohn Marino   lim = end_hard_regno (mode, i);
2324*e4b17023SJohn Marino   while (i < lim)
2325*e4b17023SJohn Marino     df_set_regs_ever_live(i++, true);
2326*e4b17023SJohn Marino }
2327*e4b17023SJohn Marino 
2328*e4b17023SJohn Marino /* Mark the slots in regs_ever_live for the hard regs
2329*e4b17023SJohn Marino    used by pseudo-reg number REGNO.  */
2330*e4b17023SJohn Marino 
2331*e4b17023SJohn Marino void
mark_home_live(int regno)2332*e4b17023SJohn Marino mark_home_live (int regno)
2333*e4b17023SJohn Marino {
2334*e4b17023SJohn Marino   if (reg_renumber[regno] >= 0)
2335*e4b17023SJohn Marino     mark_home_live_1 (regno, PSEUDO_REGNO_MODE (regno));
2336*e4b17023SJohn Marino }
2337*e4b17023SJohn Marino 
2338*e4b17023SJohn Marino /* This function handles the tracking of elimination offsets around branches.
2339*e4b17023SJohn Marino 
2340*e4b17023SJohn Marino    X is a piece of RTL being scanned.
2341*e4b17023SJohn Marino 
2342*e4b17023SJohn Marino    INSN is the insn that it came from, if any.
2343*e4b17023SJohn Marino 
2344*e4b17023SJohn Marino    INITIAL_P is nonzero if we are to set the offset to be the initial
2345*e4b17023SJohn Marino    offset and zero if we are setting the offset of the label to be the
2346*e4b17023SJohn Marino    current offset.  */
2347*e4b17023SJohn Marino 
2348*e4b17023SJohn Marino static void
set_label_offsets(rtx x,rtx insn,int initial_p)2349*e4b17023SJohn Marino set_label_offsets (rtx x, rtx insn, int initial_p)
2350*e4b17023SJohn Marino {
2351*e4b17023SJohn Marino   enum rtx_code code = GET_CODE (x);
2352*e4b17023SJohn Marino   rtx tem;
2353*e4b17023SJohn Marino   unsigned int i;
2354*e4b17023SJohn Marino   struct elim_table *p;
2355*e4b17023SJohn Marino 
2356*e4b17023SJohn Marino   switch (code)
2357*e4b17023SJohn Marino     {
2358*e4b17023SJohn Marino     case LABEL_REF:
2359*e4b17023SJohn Marino       if (LABEL_REF_NONLOCAL_P (x))
2360*e4b17023SJohn Marino 	return;
2361*e4b17023SJohn Marino 
2362*e4b17023SJohn Marino       x = XEXP (x, 0);
2363*e4b17023SJohn Marino 
2364*e4b17023SJohn Marino       /* ... fall through ...  */
2365*e4b17023SJohn Marino 
2366*e4b17023SJohn Marino     case CODE_LABEL:
2367*e4b17023SJohn Marino       /* If we know nothing about this label, set the desired offsets.  Note
2368*e4b17023SJohn Marino 	 that this sets the offset at a label to be the offset before a label
2369*e4b17023SJohn Marino 	 if we don't know anything about the label.  This is not correct for
2370*e4b17023SJohn Marino 	 the label after a BARRIER, but is the best guess we can make.  If
2371*e4b17023SJohn Marino 	 we guessed wrong, we will suppress an elimination that might have
2372*e4b17023SJohn Marino 	 been possible had we been able to guess correctly.  */
2373*e4b17023SJohn Marino 
2374*e4b17023SJohn Marino       if (! offsets_known_at[CODE_LABEL_NUMBER (x) - first_label_num])
2375*e4b17023SJohn Marino 	{
2376*e4b17023SJohn Marino 	  for (i = 0; i < NUM_ELIMINABLE_REGS; i++)
2377*e4b17023SJohn Marino 	    offsets_at[CODE_LABEL_NUMBER (x) - first_label_num][i]
2378*e4b17023SJohn Marino 	      = (initial_p ? reg_eliminate[i].initial_offset
2379*e4b17023SJohn Marino 		 : reg_eliminate[i].offset);
2380*e4b17023SJohn Marino 	  offsets_known_at[CODE_LABEL_NUMBER (x) - first_label_num] = 1;
2381*e4b17023SJohn Marino 	}
2382*e4b17023SJohn Marino 
2383*e4b17023SJohn Marino       /* Otherwise, if this is the definition of a label and it is
2384*e4b17023SJohn Marino 	 preceded by a BARRIER, set our offsets to the known offset of
2385*e4b17023SJohn Marino 	 that label.  */
2386*e4b17023SJohn Marino 
2387*e4b17023SJohn Marino       else if (x == insn
2388*e4b17023SJohn Marino 	       && (tem = prev_nonnote_insn (insn)) != 0
2389*e4b17023SJohn Marino 	       && BARRIER_P (tem))
2390*e4b17023SJohn Marino 	set_offsets_for_label (insn);
2391*e4b17023SJohn Marino       else
2392*e4b17023SJohn Marino 	/* If neither of the above cases is true, compare each offset
2393*e4b17023SJohn Marino 	   with those previously recorded and suppress any eliminations
2394*e4b17023SJohn Marino 	   where the offsets disagree.  */
2395*e4b17023SJohn Marino 
2396*e4b17023SJohn Marino 	for (i = 0; i < NUM_ELIMINABLE_REGS; i++)
2397*e4b17023SJohn Marino 	  if (offsets_at[CODE_LABEL_NUMBER (x) - first_label_num][i]
2398*e4b17023SJohn Marino 	      != (initial_p ? reg_eliminate[i].initial_offset
2399*e4b17023SJohn Marino 		  : reg_eliminate[i].offset))
2400*e4b17023SJohn Marino 	    reg_eliminate[i].can_eliminate = 0;
2401*e4b17023SJohn Marino 
2402*e4b17023SJohn Marino       return;
2403*e4b17023SJohn Marino 
2404*e4b17023SJohn Marino     case JUMP_INSN:
2405*e4b17023SJohn Marino       set_label_offsets (PATTERN (insn), insn, initial_p);
2406*e4b17023SJohn Marino 
2407*e4b17023SJohn Marino       /* ... fall through ...  */
2408*e4b17023SJohn Marino 
2409*e4b17023SJohn Marino     case INSN:
2410*e4b17023SJohn Marino     case CALL_INSN:
2411*e4b17023SJohn Marino       /* Any labels mentioned in REG_LABEL_OPERAND notes can be branched
2412*e4b17023SJohn Marino 	 to indirectly and hence must have all eliminations at their
2413*e4b17023SJohn Marino 	 initial offsets.  */
2414*e4b17023SJohn Marino       for (tem = REG_NOTES (x); tem; tem = XEXP (tem, 1))
2415*e4b17023SJohn Marino 	if (REG_NOTE_KIND (tem) == REG_LABEL_OPERAND)
2416*e4b17023SJohn Marino 	  set_label_offsets (XEXP (tem, 0), insn, 1);
2417*e4b17023SJohn Marino       return;
2418*e4b17023SJohn Marino 
2419*e4b17023SJohn Marino     case PARALLEL:
2420*e4b17023SJohn Marino     case ADDR_VEC:
2421*e4b17023SJohn Marino     case ADDR_DIFF_VEC:
2422*e4b17023SJohn Marino       /* Each of the labels in the parallel or address vector must be
2423*e4b17023SJohn Marino 	 at their initial offsets.  We want the first field for PARALLEL
2424*e4b17023SJohn Marino 	 and ADDR_VEC and the second field for ADDR_DIFF_VEC.  */
2425*e4b17023SJohn Marino 
2426*e4b17023SJohn Marino       for (i = 0; i < (unsigned) XVECLEN (x, code == ADDR_DIFF_VEC); i++)
2427*e4b17023SJohn Marino 	set_label_offsets (XVECEXP (x, code == ADDR_DIFF_VEC, i),
2428*e4b17023SJohn Marino 			   insn, initial_p);
2429*e4b17023SJohn Marino       return;
2430*e4b17023SJohn Marino 
2431*e4b17023SJohn Marino     case SET:
2432*e4b17023SJohn Marino       /* We only care about setting PC.  If the source is not RETURN,
2433*e4b17023SJohn Marino 	 IF_THEN_ELSE, or a label, disable any eliminations not at
2434*e4b17023SJohn Marino 	 their initial offsets.  Similarly if any arm of the IF_THEN_ELSE
2435*e4b17023SJohn Marino 	 isn't one of those possibilities.  For branches to a label,
2436*e4b17023SJohn Marino 	 call ourselves recursively.
2437*e4b17023SJohn Marino 
2438*e4b17023SJohn Marino 	 Note that this can disable elimination unnecessarily when we have
2439*e4b17023SJohn Marino 	 a non-local goto since it will look like a non-constant jump to
2440*e4b17023SJohn Marino 	 someplace in the current function.  This isn't a significant
2441*e4b17023SJohn Marino 	 problem since such jumps will normally be when all elimination
2442*e4b17023SJohn Marino 	 pairs are back to their initial offsets.  */
2443*e4b17023SJohn Marino 
2444*e4b17023SJohn Marino       if (SET_DEST (x) != pc_rtx)
2445*e4b17023SJohn Marino 	return;
2446*e4b17023SJohn Marino 
2447*e4b17023SJohn Marino       switch (GET_CODE (SET_SRC (x)))
2448*e4b17023SJohn Marino 	{
2449*e4b17023SJohn Marino 	case PC:
2450*e4b17023SJohn Marino 	case RETURN:
2451*e4b17023SJohn Marino 	  return;
2452*e4b17023SJohn Marino 
2453*e4b17023SJohn Marino 	case LABEL_REF:
2454*e4b17023SJohn Marino 	  set_label_offsets (SET_SRC (x), insn, initial_p);
2455*e4b17023SJohn Marino 	  return;
2456*e4b17023SJohn Marino 
2457*e4b17023SJohn Marino 	case IF_THEN_ELSE:
2458*e4b17023SJohn Marino 	  tem = XEXP (SET_SRC (x), 1);
2459*e4b17023SJohn Marino 	  if (GET_CODE (tem) == LABEL_REF)
2460*e4b17023SJohn Marino 	    set_label_offsets (XEXP (tem, 0), insn, initial_p);
2461*e4b17023SJohn Marino 	  else if (GET_CODE (tem) != PC && GET_CODE (tem) != RETURN)
2462*e4b17023SJohn Marino 	    break;
2463*e4b17023SJohn Marino 
2464*e4b17023SJohn Marino 	  tem = XEXP (SET_SRC (x), 2);
2465*e4b17023SJohn Marino 	  if (GET_CODE (tem) == LABEL_REF)
2466*e4b17023SJohn Marino 	    set_label_offsets (XEXP (tem, 0), insn, initial_p);
2467*e4b17023SJohn Marino 	  else if (GET_CODE (tem) != PC && GET_CODE (tem) != RETURN)
2468*e4b17023SJohn Marino 	    break;
2469*e4b17023SJohn Marino 	  return;
2470*e4b17023SJohn Marino 
2471*e4b17023SJohn Marino 	default:
2472*e4b17023SJohn Marino 	  break;
2473*e4b17023SJohn Marino 	}
2474*e4b17023SJohn Marino 
2475*e4b17023SJohn Marino       /* If we reach here, all eliminations must be at their initial
2476*e4b17023SJohn Marino 	 offset because we are doing a jump to a variable address.  */
2477*e4b17023SJohn Marino       for (p = reg_eliminate; p < &reg_eliminate[NUM_ELIMINABLE_REGS]; p++)
2478*e4b17023SJohn Marino 	if (p->offset != p->initial_offset)
2479*e4b17023SJohn Marino 	  p->can_eliminate = 0;
2480*e4b17023SJohn Marino       break;
2481*e4b17023SJohn Marino 
2482*e4b17023SJohn Marino     default:
2483*e4b17023SJohn Marino       break;
2484*e4b17023SJohn Marino     }
2485*e4b17023SJohn Marino }
2486*e4b17023SJohn Marino 
2487*e4b17023SJohn Marino /* Called through for_each_rtx, this function examines every reg that occurs
2488*e4b17023SJohn Marino    in PX and adjusts the costs for its elimination which are gathered by IRA.
2489*e4b17023SJohn Marino    DATA is the insn in which PX occurs.  We do not recurse into MEM
2490*e4b17023SJohn Marino    expressions.  */
2491*e4b17023SJohn Marino 
2492*e4b17023SJohn Marino static int
note_reg_elim_costly(rtx * px,void * data)2493*e4b17023SJohn Marino note_reg_elim_costly (rtx *px, void *data)
2494*e4b17023SJohn Marino {
2495*e4b17023SJohn Marino   rtx insn = (rtx)data;
2496*e4b17023SJohn Marino   rtx x = *px;
2497*e4b17023SJohn Marino 
2498*e4b17023SJohn Marino   if (MEM_P (x))
2499*e4b17023SJohn Marino     return -1;
2500*e4b17023SJohn Marino 
2501*e4b17023SJohn Marino   if (REG_P (x)
2502*e4b17023SJohn Marino       && REGNO (x) >= FIRST_PSEUDO_REGISTER
2503*e4b17023SJohn Marino       && reg_equiv_init (REGNO (x))
2504*e4b17023SJohn Marino       && reg_equiv_invariant (REGNO (x)))
2505*e4b17023SJohn Marino     {
2506*e4b17023SJohn Marino       rtx t = reg_equiv_invariant (REGNO (x));
2507*e4b17023SJohn Marino       rtx new_rtx = eliminate_regs_1 (t, Pmode, insn, true, true);
2508*e4b17023SJohn Marino       int cost = set_src_cost (new_rtx, optimize_bb_for_speed_p (elim_bb));
2509*e4b17023SJohn Marino       int freq = REG_FREQ_FROM_BB (elim_bb);
2510*e4b17023SJohn Marino 
2511*e4b17023SJohn Marino       if (cost != 0)
2512*e4b17023SJohn Marino 	ira_adjust_equiv_reg_cost (REGNO (x), -cost * freq);
2513*e4b17023SJohn Marino     }
2514*e4b17023SJohn Marino   return 0;
2515*e4b17023SJohn Marino }
2516*e4b17023SJohn Marino 
2517*e4b17023SJohn Marino /* Scan X and replace any eliminable registers (such as fp) with a
2518*e4b17023SJohn Marino    replacement (such as sp), plus an offset.
2519*e4b17023SJohn Marino 
2520*e4b17023SJohn Marino    MEM_MODE is the mode of an enclosing MEM.  We need this to know how
2521*e4b17023SJohn Marino    much to adjust a register for, e.g., PRE_DEC.  Also, if we are inside a
2522*e4b17023SJohn Marino    MEM, we are allowed to replace a sum of a register and the constant zero
2523*e4b17023SJohn Marino    with the register, which we cannot do outside a MEM.  In addition, we need
2524*e4b17023SJohn Marino    to record the fact that a register is referenced outside a MEM.
2525*e4b17023SJohn Marino 
2526*e4b17023SJohn Marino    If INSN is an insn, it is the insn containing X.  If we replace a REG
2527*e4b17023SJohn Marino    in a SET_DEST with an equivalent MEM and INSN is nonzero, write a
2528*e4b17023SJohn Marino    CLOBBER of the pseudo after INSN so find_equiv_regs will know that
2529*e4b17023SJohn Marino    the REG is being modified.
2530*e4b17023SJohn Marino 
2531*e4b17023SJohn Marino    Alternatively, INSN may be a note (an EXPR_LIST or INSN_LIST).
2532*e4b17023SJohn Marino    That's used when we eliminate in expressions stored in notes.
2533*e4b17023SJohn Marino    This means, do not set ref_outside_mem even if the reference
2534*e4b17023SJohn Marino    is outside of MEMs.
2535*e4b17023SJohn Marino 
2536*e4b17023SJohn Marino    If FOR_COSTS is true, we are being called before reload in order to
2537*e4b17023SJohn Marino    estimate the costs of keeping registers with an equivalence unallocated.
2538*e4b17023SJohn Marino 
2539*e4b17023SJohn Marino    REG_EQUIV_MEM and REG_EQUIV_ADDRESS contain address that have had
2540*e4b17023SJohn Marino    replacements done assuming all offsets are at their initial values.  If
2541*e4b17023SJohn Marino    they are not, or if REG_EQUIV_ADDRESS is nonzero for a pseudo we
2542*e4b17023SJohn Marino    encounter, return the actual location so that find_reloads will do
2543*e4b17023SJohn Marino    the proper thing.  */
2544*e4b17023SJohn Marino 
2545*e4b17023SJohn Marino static rtx
eliminate_regs_1(rtx x,enum machine_mode mem_mode,rtx insn,bool may_use_invariant,bool for_costs)2546*e4b17023SJohn Marino eliminate_regs_1 (rtx x, enum machine_mode mem_mode, rtx insn,
2547*e4b17023SJohn Marino 		  bool may_use_invariant, bool for_costs)
2548*e4b17023SJohn Marino {
2549*e4b17023SJohn Marino   enum rtx_code code = GET_CODE (x);
2550*e4b17023SJohn Marino   struct elim_table *ep;
2551*e4b17023SJohn Marino   int regno;
2552*e4b17023SJohn Marino   rtx new_rtx;
2553*e4b17023SJohn Marino   int i, j;
2554*e4b17023SJohn Marino   const char *fmt;
2555*e4b17023SJohn Marino   int copied = 0;
2556*e4b17023SJohn Marino 
2557*e4b17023SJohn Marino   if (! current_function_decl)
2558*e4b17023SJohn Marino     return x;
2559*e4b17023SJohn Marino 
2560*e4b17023SJohn Marino   switch (code)
2561*e4b17023SJohn Marino     {
2562*e4b17023SJohn Marino     case CONST_INT:
2563*e4b17023SJohn Marino     case CONST_DOUBLE:
2564*e4b17023SJohn Marino     case CONST_FIXED:
2565*e4b17023SJohn Marino     case CONST_VECTOR:
2566*e4b17023SJohn Marino     case CONST:
2567*e4b17023SJohn Marino     case SYMBOL_REF:
2568*e4b17023SJohn Marino     case CODE_LABEL:
2569*e4b17023SJohn Marino     case PC:
2570*e4b17023SJohn Marino     case CC0:
2571*e4b17023SJohn Marino     case ASM_INPUT:
2572*e4b17023SJohn Marino     case ADDR_VEC:
2573*e4b17023SJohn Marino     case ADDR_DIFF_VEC:
2574*e4b17023SJohn Marino     case RETURN:
2575*e4b17023SJohn Marino       return x;
2576*e4b17023SJohn Marino 
2577*e4b17023SJohn Marino     case REG:
2578*e4b17023SJohn Marino       regno = REGNO (x);
2579*e4b17023SJohn Marino 
2580*e4b17023SJohn Marino       /* First handle the case where we encounter a bare register that
2581*e4b17023SJohn Marino 	 is eliminable.  Replace it with a PLUS.  */
2582*e4b17023SJohn Marino       if (regno < FIRST_PSEUDO_REGISTER)
2583*e4b17023SJohn Marino 	{
2584*e4b17023SJohn Marino 	  for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
2585*e4b17023SJohn Marino 	       ep++)
2586*e4b17023SJohn Marino 	    if (ep->from_rtx == x && ep->can_eliminate)
2587*e4b17023SJohn Marino 	      return plus_constant (ep->to_rtx, ep->previous_offset);
2588*e4b17023SJohn Marino 
2589*e4b17023SJohn Marino 	}
2590*e4b17023SJohn Marino       else if (reg_renumber && reg_renumber[regno] < 0
2591*e4b17023SJohn Marino 	       && reg_equivs
2592*e4b17023SJohn Marino 	       && reg_equiv_invariant (regno))
2593*e4b17023SJohn Marino 	{
2594*e4b17023SJohn Marino 	  if (may_use_invariant || (insn && DEBUG_INSN_P (insn)))
2595*e4b17023SJohn Marino 	    return eliminate_regs_1 (copy_rtx (reg_equiv_invariant (regno)),
2596*e4b17023SJohn Marino 			             mem_mode, insn, true, for_costs);
2597*e4b17023SJohn Marino 	  /* There exists at least one use of REGNO that cannot be
2598*e4b17023SJohn Marino 	     eliminated.  Prevent the defining insn from being deleted.  */
2599*e4b17023SJohn Marino 	  reg_equiv_init (regno) = NULL_RTX;
2600*e4b17023SJohn Marino 	  if (!for_costs)
2601*e4b17023SJohn Marino 	    alter_reg (regno, -1, true);
2602*e4b17023SJohn Marino 	}
2603*e4b17023SJohn Marino       return x;
2604*e4b17023SJohn Marino 
2605*e4b17023SJohn Marino     /* You might think handling MINUS in a manner similar to PLUS is a
2606*e4b17023SJohn Marino        good idea.  It is not.  It has been tried multiple times and every
2607*e4b17023SJohn Marino        time the change has had to have been reverted.
2608*e4b17023SJohn Marino 
2609*e4b17023SJohn Marino        Other parts of reload know a PLUS is special (gen_reload for example)
2610*e4b17023SJohn Marino        and require special code to handle code a reloaded PLUS operand.
2611*e4b17023SJohn Marino 
2612*e4b17023SJohn Marino        Also consider backends where the flags register is clobbered by a
2613*e4b17023SJohn Marino        MINUS, but we can emit a PLUS that does not clobber flags (IA-32,
2614*e4b17023SJohn Marino        lea instruction comes to mind).  If we try to reload a MINUS, we
2615*e4b17023SJohn Marino        may kill the flags register that was holding a useful value.
2616*e4b17023SJohn Marino 
2617*e4b17023SJohn Marino        So, please before trying to handle MINUS, consider reload as a
2618*e4b17023SJohn Marino        whole instead of this little section as well as the backend issues.  */
2619*e4b17023SJohn Marino     case PLUS:
2620*e4b17023SJohn Marino       /* If this is the sum of an eliminable register and a constant, rework
2621*e4b17023SJohn Marino 	 the sum.  */
2622*e4b17023SJohn Marino       if (REG_P (XEXP (x, 0))
2623*e4b17023SJohn Marino 	  && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
2624*e4b17023SJohn Marino 	  && CONSTANT_P (XEXP (x, 1)))
2625*e4b17023SJohn Marino 	{
2626*e4b17023SJohn Marino 	  for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
2627*e4b17023SJohn Marino 	       ep++)
2628*e4b17023SJohn Marino 	    if (ep->from_rtx == XEXP (x, 0) && ep->can_eliminate)
2629*e4b17023SJohn Marino 	      {
2630*e4b17023SJohn Marino 		/* The only time we want to replace a PLUS with a REG (this
2631*e4b17023SJohn Marino 		   occurs when the constant operand of the PLUS is the negative
2632*e4b17023SJohn Marino 		   of the offset) is when we are inside a MEM.  We won't want
2633*e4b17023SJohn Marino 		   to do so at other times because that would change the
2634*e4b17023SJohn Marino 		   structure of the insn in a way that reload can't handle.
2635*e4b17023SJohn Marino 		   We special-case the commonest situation in
2636*e4b17023SJohn Marino 		   eliminate_regs_in_insn, so just replace a PLUS with a
2637*e4b17023SJohn Marino 		   PLUS here, unless inside a MEM.  */
2638*e4b17023SJohn Marino 		if (mem_mode != 0 && CONST_INT_P (XEXP (x, 1))
2639*e4b17023SJohn Marino 		    && INTVAL (XEXP (x, 1)) == - ep->previous_offset)
2640*e4b17023SJohn Marino 		  return ep->to_rtx;
2641*e4b17023SJohn Marino 		else
2642*e4b17023SJohn Marino 		  return gen_rtx_PLUS (Pmode, ep->to_rtx,
2643*e4b17023SJohn Marino 				       plus_constant (XEXP (x, 1),
2644*e4b17023SJohn Marino 						      ep->previous_offset));
2645*e4b17023SJohn Marino 	      }
2646*e4b17023SJohn Marino 
2647*e4b17023SJohn Marino 	  /* If the register is not eliminable, we are done since the other
2648*e4b17023SJohn Marino 	     operand is a constant.  */
2649*e4b17023SJohn Marino 	  return x;
2650*e4b17023SJohn Marino 	}
2651*e4b17023SJohn Marino 
2652*e4b17023SJohn Marino       /* If this is part of an address, we want to bring any constant to the
2653*e4b17023SJohn Marino 	 outermost PLUS.  We will do this by doing register replacement in
2654*e4b17023SJohn Marino 	 our operands and seeing if a constant shows up in one of them.
2655*e4b17023SJohn Marino 
2656*e4b17023SJohn Marino 	 Note that there is no risk of modifying the structure of the insn,
2657*e4b17023SJohn Marino 	 since we only get called for its operands, thus we are either
2658*e4b17023SJohn Marino 	 modifying the address inside a MEM, or something like an address
2659*e4b17023SJohn Marino 	 operand of a load-address insn.  */
2660*e4b17023SJohn Marino 
2661*e4b17023SJohn Marino       {
2662*e4b17023SJohn Marino 	rtx new0 = eliminate_regs_1 (XEXP (x, 0), mem_mode, insn, true,
2663*e4b17023SJohn Marino 				     for_costs);
2664*e4b17023SJohn Marino 	rtx new1 = eliminate_regs_1 (XEXP (x, 1), mem_mode, insn, true,
2665*e4b17023SJohn Marino 				     for_costs);
2666*e4b17023SJohn Marino 
2667*e4b17023SJohn Marino 	if (reg_renumber && (new0 != XEXP (x, 0) || new1 != XEXP (x, 1)))
2668*e4b17023SJohn Marino 	  {
2669*e4b17023SJohn Marino 	    /* If one side is a PLUS and the other side is a pseudo that
2670*e4b17023SJohn Marino 	       didn't get a hard register but has a reg_equiv_constant,
2671*e4b17023SJohn Marino 	       we must replace the constant here since it may no longer
2672*e4b17023SJohn Marino 	       be in the position of any operand.  */
2673*e4b17023SJohn Marino 	    if (GET_CODE (new0) == PLUS && REG_P (new1)
2674*e4b17023SJohn Marino 		&& REGNO (new1) >= FIRST_PSEUDO_REGISTER
2675*e4b17023SJohn Marino 		&& reg_renumber[REGNO (new1)] < 0
2676*e4b17023SJohn Marino 		&& reg_equivs
2677*e4b17023SJohn Marino 		&& reg_equiv_constant (REGNO (new1)) != 0)
2678*e4b17023SJohn Marino 	      new1 = reg_equiv_constant (REGNO (new1));
2679*e4b17023SJohn Marino 	    else if (GET_CODE (new1) == PLUS && REG_P (new0)
2680*e4b17023SJohn Marino 		     && REGNO (new0) >= FIRST_PSEUDO_REGISTER
2681*e4b17023SJohn Marino 		     && reg_renumber[REGNO (new0)] < 0
2682*e4b17023SJohn Marino 		     && reg_equiv_constant (REGNO (new0)) != 0)
2683*e4b17023SJohn Marino 	      new0 = reg_equiv_constant (REGNO (new0));
2684*e4b17023SJohn Marino 
2685*e4b17023SJohn Marino 	    new_rtx = form_sum (GET_MODE (x), new0, new1);
2686*e4b17023SJohn Marino 
2687*e4b17023SJohn Marino 	    /* As above, if we are not inside a MEM we do not want to
2688*e4b17023SJohn Marino 	       turn a PLUS into something else.  We might try to do so here
2689*e4b17023SJohn Marino 	       for an addition of 0 if we aren't optimizing.  */
2690*e4b17023SJohn Marino 	    if (! mem_mode && GET_CODE (new_rtx) != PLUS)
2691*e4b17023SJohn Marino 	      return gen_rtx_PLUS (GET_MODE (x), new_rtx, const0_rtx);
2692*e4b17023SJohn Marino 	    else
2693*e4b17023SJohn Marino 	      return new_rtx;
2694*e4b17023SJohn Marino 	  }
2695*e4b17023SJohn Marino       }
2696*e4b17023SJohn Marino       return x;
2697*e4b17023SJohn Marino 
2698*e4b17023SJohn Marino     case MULT:
2699*e4b17023SJohn Marino       /* If this is the product of an eliminable register and a
2700*e4b17023SJohn Marino 	 constant, apply the distribute law and move the constant out
2701*e4b17023SJohn Marino 	 so that we have (plus (mult ..) ..).  This is needed in order
2702*e4b17023SJohn Marino 	 to keep load-address insns valid.   This case is pathological.
2703*e4b17023SJohn Marino 	 We ignore the possibility of overflow here.  */
2704*e4b17023SJohn Marino       if (REG_P (XEXP (x, 0))
2705*e4b17023SJohn Marino 	  && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
2706*e4b17023SJohn Marino 	  && CONST_INT_P (XEXP (x, 1)))
2707*e4b17023SJohn Marino 	for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
2708*e4b17023SJohn Marino 	     ep++)
2709*e4b17023SJohn Marino 	  if (ep->from_rtx == XEXP (x, 0) && ep->can_eliminate)
2710*e4b17023SJohn Marino 	    {
2711*e4b17023SJohn Marino 	      if (! mem_mode
2712*e4b17023SJohn Marino 		  /* Refs inside notes or in DEBUG_INSNs don't count for
2713*e4b17023SJohn Marino 		     this purpose.  */
2714*e4b17023SJohn Marino 		  && ! (insn != 0 && (GET_CODE (insn) == EXPR_LIST
2715*e4b17023SJohn Marino 				      || GET_CODE (insn) == INSN_LIST
2716*e4b17023SJohn Marino 				      || DEBUG_INSN_P (insn))))
2717*e4b17023SJohn Marino 		ep->ref_outside_mem = 1;
2718*e4b17023SJohn Marino 
2719*e4b17023SJohn Marino 	      return
2720*e4b17023SJohn Marino 		plus_constant (gen_rtx_MULT (Pmode, ep->to_rtx, XEXP (x, 1)),
2721*e4b17023SJohn Marino 			       ep->previous_offset * INTVAL (XEXP (x, 1)));
2722*e4b17023SJohn Marino 	    }
2723*e4b17023SJohn Marino 
2724*e4b17023SJohn Marino       /* ... fall through ...  */
2725*e4b17023SJohn Marino 
2726*e4b17023SJohn Marino     case CALL:
2727*e4b17023SJohn Marino     case COMPARE:
2728*e4b17023SJohn Marino     /* See comments before PLUS about handling MINUS.  */
2729*e4b17023SJohn Marino     case MINUS:
2730*e4b17023SJohn Marino     case DIV:      case UDIV:
2731*e4b17023SJohn Marino     case MOD:      case UMOD:
2732*e4b17023SJohn Marino     case AND:      case IOR:      case XOR:
2733*e4b17023SJohn Marino     case ROTATERT: case ROTATE:
2734*e4b17023SJohn Marino     case ASHIFTRT: case LSHIFTRT: case ASHIFT:
2735*e4b17023SJohn Marino     case NE:       case EQ:
2736*e4b17023SJohn Marino     case GE:       case GT:       case GEU:    case GTU:
2737*e4b17023SJohn Marino     case LE:       case LT:       case LEU:    case LTU:
2738*e4b17023SJohn Marino       {
2739*e4b17023SJohn Marino 	rtx new0 = eliminate_regs_1 (XEXP (x, 0), mem_mode, insn, false,
2740*e4b17023SJohn Marino 				     for_costs);
2741*e4b17023SJohn Marino 	rtx new1 = XEXP (x, 1)
2742*e4b17023SJohn Marino 	  ? eliminate_regs_1 (XEXP (x, 1), mem_mode, insn, false,
2743*e4b17023SJohn Marino 			      for_costs) : 0;
2744*e4b17023SJohn Marino 
2745*e4b17023SJohn Marino 	if (new0 != XEXP (x, 0) || new1 != XEXP (x, 1))
2746*e4b17023SJohn Marino 	  return gen_rtx_fmt_ee (code, GET_MODE (x), new0, new1);
2747*e4b17023SJohn Marino       }
2748*e4b17023SJohn Marino       return x;
2749*e4b17023SJohn Marino 
2750*e4b17023SJohn Marino     case EXPR_LIST:
2751*e4b17023SJohn Marino       /* If we have something in XEXP (x, 0), the usual case, eliminate it.  */
2752*e4b17023SJohn Marino       if (XEXP (x, 0))
2753*e4b17023SJohn Marino 	{
2754*e4b17023SJohn Marino 	  new_rtx = eliminate_regs_1 (XEXP (x, 0), mem_mode, insn, true,
2755*e4b17023SJohn Marino 				      for_costs);
2756*e4b17023SJohn Marino 	  if (new_rtx != XEXP (x, 0))
2757*e4b17023SJohn Marino 	    {
2758*e4b17023SJohn Marino 	      /* If this is a REG_DEAD note, it is not valid anymore.
2759*e4b17023SJohn Marino 		 Using the eliminated version could result in creating a
2760*e4b17023SJohn Marino 		 REG_DEAD note for the stack or frame pointer.  */
2761*e4b17023SJohn Marino 	      if (REG_NOTE_KIND (x) == REG_DEAD)
2762*e4b17023SJohn Marino 		return (XEXP (x, 1)
2763*e4b17023SJohn Marino 			? eliminate_regs_1 (XEXP (x, 1), mem_mode, insn, true,
2764*e4b17023SJohn Marino 					    for_costs)
2765*e4b17023SJohn Marino 			: NULL_RTX);
2766*e4b17023SJohn Marino 
2767*e4b17023SJohn Marino 	      x = alloc_reg_note (REG_NOTE_KIND (x), new_rtx, XEXP (x, 1));
2768*e4b17023SJohn Marino 	    }
2769*e4b17023SJohn Marino 	}
2770*e4b17023SJohn Marino 
2771*e4b17023SJohn Marino       /* ... fall through ...  */
2772*e4b17023SJohn Marino 
2773*e4b17023SJohn Marino     case INSN_LIST:
2774*e4b17023SJohn Marino       /* Now do eliminations in the rest of the chain.  If this was
2775*e4b17023SJohn Marino 	 an EXPR_LIST, this might result in allocating more memory than is
2776*e4b17023SJohn Marino 	 strictly needed, but it simplifies the code.  */
2777*e4b17023SJohn Marino       if (XEXP (x, 1))
2778*e4b17023SJohn Marino 	{
2779*e4b17023SJohn Marino 	  new_rtx = eliminate_regs_1 (XEXP (x, 1), mem_mode, insn, true,
2780*e4b17023SJohn Marino 				      for_costs);
2781*e4b17023SJohn Marino 	  if (new_rtx != XEXP (x, 1))
2782*e4b17023SJohn Marino 	    return
2783*e4b17023SJohn Marino 	      gen_rtx_fmt_ee (GET_CODE (x), GET_MODE (x), XEXP (x, 0), new_rtx);
2784*e4b17023SJohn Marino 	}
2785*e4b17023SJohn Marino       return x;
2786*e4b17023SJohn Marino 
2787*e4b17023SJohn Marino     case PRE_INC:
2788*e4b17023SJohn Marino     case POST_INC:
2789*e4b17023SJohn Marino     case PRE_DEC:
2790*e4b17023SJohn Marino     case POST_DEC:
2791*e4b17023SJohn Marino       /* We do not support elimination of a register that is modified.
2792*e4b17023SJohn Marino 	 elimination_effects has already make sure that this does not
2793*e4b17023SJohn Marino 	 happen.  */
2794*e4b17023SJohn Marino       return x;
2795*e4b17023SJohn Marino 
2796*e4b17023SJohn Marino     case PRE_MODIFY:
2797*e4b17023SJohn Marino     case POST_MODIFY:
2798*e4b17023SJohn Marino       /* We do not support elimination of a register that is modified.
2799*e4b17023SJohn Marino 	 elimination_effects has already make sure that this does not
2800*e4b17023SJohn Marino 	 happen.  The only remaining case we need to consider here is
2801*e4b17023SJohn Marino 	 that the increment value may be an eliminable register.  */
2802*e4b17023SJohn Marino       if (GET_CODE (XEXP (x, 1)) == PLUS
2803*e4b17023SJohn Marino 	  && XEXP (XEXP (x, 1), 0) == XEXP (x, 0))
2804*e4b17023SJohn Marino 	{
2805*e4b17023SJohn Marino 	  rtx new_rtx = eliminate_regs_1 (XEXP (XEXP (x, 1), 1), mem_mode,
2806*e4b17023SJohn Marino 					  insn, true, for_costs);
2807*e4b17023SJohn Marino 
2808*e4b17023SJohn Marino 	  if (new_rtx != XEXP (XEXP (x, 1), 1))
2809*e4b17023SJohn Marino 	    return gen_rtx_fmt_ee (code, GET_MODE (x), XEXP (x, 0),
2810*e4b17023SJohn Marino 				   gen_rtx_PLUS (GET_MODE (x),
2811*e4b17023SJohn Marino 						 XEXP (x, 0), new_rtx));
2812*e4b17023SJohn Marino 	}
2813*e4b17023SJohn Marino       return x;
2814*e4b17023SJohn Marino 
2815*e4b17023SJohn Marino     case STRICT_LOW_PART:
2816*e4b17023SJohn Marino     case NEG:          case NOT:
2817*e4b17023SJohn Marino     case SIGN_EXTEND:  case ZERO_EXTEND:
2818*e4b17023SJohn Marino     case TRUNCATE:     case FLOAT_EXTEND: case FLOAT_TRUNCATE:
2819*e4b17023SJohn Marino     case FLOAT:        case FIX:
2820*e4b17023SJohn Marino     case UNSIGNED_FIX: case UNSIGNED_FLOAT:
2821*e4b17023SJohn Marino     case ABS:
2822*e4b17023SJohn Marino     case SQRT:
2823*e4b17023SJohn Marino     case FFS:
2824*e4b17023SJohn Marino     case CLZ:
2825*e4b17023SJohn Marino     case CTZ:
2826*e4b17023SJohn Marino     case POPCOUNT:
2827*e4b17023SJohn Marino     case PARITY:
2828*e4b17023SJohn Marino     case BSWAP:
2829*e4b17023SJohn Marino       new_rtx = eliminate_regs_1 (XEXP (x, 0), mem_mode, insn, false,
2830*e4b17023SJohn Marino 				  for_costs);
2831*e4b17023SJohn Marino       if (new_rtx != XEXP (x, 0))
2832*e4b17023SJohn Marino 	return gen_rtx_fmt_e (code, GET_MODE (x), new_rtx);
2833*e4b17023SJohn Marino       return x;
2834*e4b17023SJohn Marino 
2835*e4b17023SJohn Marino     case SUBREG:
2836*e4b17023SJohn Marino       /* Similar to above processing, but preserve SUBREG_BYTE.
2837*e4b17023SJohn Marino 	 Convert (subreg (mem)) to (mem) if not paradoxical.
2838*e4b17023SJohn Marino 	 Also, if we have a non-paradoxical (subreg (pseudo)) and the
2839*e4b17023SJohn Marino 	 pseudo didn't get a hard reg, we must replace this with the
2840*e4b17023SJohn Marino 	 eliminated version of the memory location because push_reload
2841*e4b17023SJohn Marino 	 may do the replacement in certain circumstances.  */
2842*e4b17023SJohn Marino       if (REG_P (SUBREG_REG (x))
2843*e4b17023SJohn Marino 	  && !paradoxical_subreg_p (x)
2844*e4b17023SJohn Marino 	  && reg_equivs
2845*e4b17023SJohn Marino 	  && reg_equiv_memory_loc (REGNO (SUBREG_REG (x))) != 0)
2846*e4b17023SJohn Marino 	{
2847*e4b17023SJohn Marino 	  new_rtx = SUBREG_REG (x);
2848*e4b17023SJohn Marino 	}
2849*e4b17023SJohn Marino       else
2850*e4b17023SJohn Marino 	new_rtx = eliminate_regs_1 (SUBREG_REG (x), mem_mode, insn, false, for_costs);
2851*e4b17023SJohn Marino 
2852*e4b17023SJohn Marino       if (new_rtx != SUBREG_REG (x))
2853*e4b17023SJohn Marino 	{
2854*e4b17023SJohn Marino 	  int x_size = GET_MODE_SIZE (GET_MODE (x));
2855*e4b17023SJohn Marino 	  int new_size = GET_MODE_SIZE (GET_MODE (new_rtx));
2856*e4b17023SJohn Marino 
2857*e4b17023SJohn Marino 	  if (MEM_P (new_rtx)
2858*e4b17023SJohn Marino 	      && ((x_size < new_size
2859*e4b17023SJohn Marino #ifdef WORD_REGISTER_OPERATIONS
2860*e4b17023SJohn Marino 		   /* On these machines, combine can create rtl of the form
2861*e4b17023SJohn Marino 		      (set (subreg:m1 (reg:m2 R) 0) ...)
2862*e4b17023SJohn Marino 		      where m1 < m2, and expects something interesting to
2863*e4b17023SJohn Marino 		      happen to the entire word.  Moreover, it will use the
2864*e4b17023SJohn Marino 		      (reg:m2 R) later, expecting all bits to be preserved.
2865*e4b17023SJohn Marino 		      So if the number of words is the same, preserve the
2866*e4b17023SJohn Marino 		      subreg so that push_reload can see it.  */
2867*e4b17023SJohn Marino 		   && ! ((x_size - 1) / UNITS_PER_WORD
2868*e4b17023SJohn Marino 			 == (new_size -1 ) / UNITS_PER_WORD)
2869*e4b17023SJohn Marino #endif
2870*e4b17023SJohn Marino 		   )
2871*e4b17023SJohn Marino 		  || x_size == new_size)
2872*e4b17023SJohn Marino 	      )
2873*e4b17023SJohn Marino 	    return adjust_address_nv (new_rtx, GET_MODE (x), SUBREG_BYTE (x));
2874*e4b17023SJohn Marino 	  else
2875*e4b17023SJohn Marino 	    return gen_rtx_SUBREG (GET_MODE (x), new_rtx, SUBREG_BYTE (x));
2876*e4b17023SJohn Marino 	}
2877*e4b17023SJohn Marino 
2878*e4b17023SJohn Marino       return x;
2879*e4b17023SJohn Marino 
2880*e4b17023SJohn Marino     case MEM:
2881*e4b17023SJohn Marino       /* Our only special processing is to pass the mode of the MEM to our
2882*e4b17023SJohn Marino 	 recursive call and copy the flags.  While we are here, handle this
2883*e4b17023SJohn Marino 	 case more efficiently.  */
2884*e4b17023SJohn Marino 
2885*e4b17023SJohn Marino       new_rtx = eliminate_regs_1 (XEXP (x, 0), GET_MODE (x), insn, true,
2886*e4b17023SJohn Marino 				  for_costs);
2887*e4b17023SJohn Marino       if (for_costs
2888*e4b17023SJohn Marino 	  && memory_address_p (GET_MODE (x), XEXP (x, 0))
2889*e4b17023SJohn Marino 	  && !memory_address_p (GET_MODE (x), new_rtx))
2890*e4b17023SJohn Marino 	for_each_rtx (&XEXP (x, 0), note_reg_elim_costly, insn);
2891*e4b17023SJohn Marino 
2892*e4b17023SJohn Marino       return replace_equiv_address_nv (x, new_rtx);
2893*e4b17023SJohn Marino 
2894*e4b17023SJohn Marino     case USE:
2895*e4b17023SJohn Marino       /* Handle insn_list USE that a call to a pure function may generate.  */
2896*e4b17023SJohn Marino       new_rtx = eliminate_regs_1 (XEXP (x, 0), VOIDmode, insn, false,
2897*e4b17023SJohn Marino 				  for_costs);
2898*e4b17023SJohn Marino       if (new_rtx != XEXP (x, 0))
2899*e4b17023SJohn Marino 	return gen_rtx_USE (GET_MODE (x), new_rtx);
2900*e4b17023SJohn Marino       return x;
2901*e4b17023SJohn Marino 
2902*e4b17023SJohn Marino     case CLOBBER:
2903*e4b17023SJohn Marino     case ASM_OPERANDS:
2904*e4b17023SJohn Marino       gcc_assert (insn && DEBUG_INSN_P (insn));
2905*e4b17023SJohn Marino       break;
2906*e4b17023SJohn Marino 
2907*e4b17023SJohn Marino     case SET:
2908*e4b17023SJohn Marino       gcc_unreachable ();
2909*e4b17023SJohn Marino 
2910*e4b17023SJohn Marino     default:
2911*e4b17023SJohn Marino       break;
2912*e4b17023SJohn Marino     }
2913*e4b17023SJohn Marino 
2914*e4b17023SJohn Marino   /* Process each of our operands recursively.  If any have changed, make a
2915*e4b17023SJohn Marino      copy of the rtx.  */
2916*e4b17023SJohn Marino   fmt = GET_RTX_FORMAT (code);
2917*e4b17023SJohn Marino   for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
2918*e4b17023SJohn Marino     {
2919*e4b17023SJohn Marino       if (*fmt == 'e')
2920*e4b17023SJohn Marino 	{
2921*e4b17023SJohn Marino 	  new_rtx = eliminate_regs_1 (XEXP (x, i), mem_mode, insn, false,
2922*e4b17023SJohn Marino 				      for_costs);
2923*e4b17023SJohn Marino 	  if (new_rtx != XEXP (x, i) && ! copied)
2924*e4b17023SJohn Marino 	    {
2925*e4b17023SJohn Marino 	      x = shallow_copy_rtx (x);
2926*e4b17023SJohn Marino 	      copied = 1;
2927*e4b17023SJohn Marino 	    }
2928*e4b17023SJohn Marino 	  XEXP (x, i) = new_rtx;
2929*e4b17023SJohn Marino 	}
2930*e4b17023SJohn Marino       else if (*fmt == 'E')
2931*e4b17023SJohn Marino 	{
2932*e4b17023SJohn Marino 	  int copied_vec = 0;
2933*e4b17023SJohn Marino 	  for (j = 0; j < XVECLEN (x, i); j++)
2934*e4b17023SJohn Marino 	    {
2935*e4b17023SJohn Marino 	      new_rtx = eliminate_regs_1 (XVECEXP (x, i, j), mem_mode, insn, false,
2936*e4b17023SJohn Marino 					  for_costs);
2937*e4b17023SJohn Marino 	      if (new_rtx != XVECEXP (x, i, j) && ! copied_vec)
2938*e4b17023SJohn Marino 		{
2939*e4b17023SJohn Marino 		  rtvec new_v = gen_rtvec_v (XVECLEN (x, i),
2940*e4b17023SJohn Marino 					     XVEC (x, i)->elem);
2941*e4b17023SJohn Marino 		  if (! copied)
2942*e4b17023SJohn Marino 		    {
2943*e4b17023SJohn Marino 		      x = shallow_copy_rtx (x);
2944*e4b17023SJohn Marino 		      copied = 1;
2945*e4b17023SJohn Marino 		    }
2946*e4b17023SJohn Marino 		  XVEC (x, i) = new_v;
2947*e4b17023SJohn Marino 		  copied_vec = 1;
2948*e4b17023SJohn Marino 		}
2949*e4b17023SJohn Marino 	      XVECEXP (x, i, j) = new_rtx;
2950*e4b17023SJohn Marino 	    }
2951*e4b17023SJohn Marino 	}
2952*e4b17023SJohn Marino     }
2953*e4b17023SJohn Marino 
2954*e4b17023SJohn Marino   return x;
2955*e4b17023SJohn Marino }
2956*e4b17023SJohn Marino 
2957*e4b17023SJohn Marino rtx
eliminate_regs(rtx x,enum machine_mode mem_mode,rtx insn)2958*e4b17023SJohn Marino eliminate_regs (rtx x, enum machine_mode mem_mode, rtx insn)
2959*e4b17023SJohn Marino {
2960*e4b17023SJohn Marino   return eliminate_regs_1 (x, mem_mode, insn, false, false);
2961*e4b17023SJohn Marino }
2962*e4b17023SJohn Marino 
2963*e4b17023SJohn Marino /* Scan rtx X for modifications of elimination target registers.  Update
2964*e4b17023SJohn Marino    the table of eliminables to reflect the changed state.  MEM_MODE is
2965*e4b17023SJohn Marino    the mode of an enclosing MEM rtx, or VOIDmode if not within a MEM.  */
2966*e4b17023SJohn Marino 
2967*e4b17023SJohn Marino static void
elimination_effects(rtx x,enum machine_mode mem_mode)2968*e4b17023SJohn Marino elimination_effects (rtx x, enum machine_mode mem_mode)
2969*e4b17023SJohn Marino {
2970*e4b17023SJohn Marino   enum rtx_code code = GET_CODE (x);
2971*e4b17023SJohn Marino   struct elim_table *ep;
2972*e4b17023SJohn Marino   int regno;
2973*e4b17023SJohn Marino   int i, j;
2974*e4b17023SJohn Marino   const char *fmt;
2975*e4b17023SJohn Marino 
2976*e4b17023SJohn Marino   switch (code)
2977*e4b17023SJohn Marino     {
2978*e4b17023SJohn Marino     case CONST_INT:
2979*e4b17023SJohn Marino     case CONST_DOUBLE:
2980*e4b17023SJohn Marino     case CONST_FIXED:
2981*e4b17023SJohn Marino     case CONST_VECTOR:
2982*e4b17023SJohn Marino     case CONST:
2983*e4b17023SJohn Marino     case SYMBOL_REF:
2984*e4b17023SJohn Marino     case CODE_LABEL:
2985*e4b17023SJohn Marino     case PC:
2986*e4b17023SJohn Marino     case CC0:
2987*e4b17023SJohn Marino     case ASM_INPUT:
2988*e4b17023SJohn Marino     case ADDR_VEC:
2989*e4b17023SJohn Marino     case ADDR_DIFF_VEC:
2990*e4b17023SJohn Marino     case RETURN:
2991*e4b17023SJohn Marino       return;
2992*e4b17023SJohn Marino 
2993*e4b17023SJohn Marino     case REG:
2994*e4b17023SJohn Marino       regno = REGNO (x);
2995*e4b17023SJohn Marino 
2996*e4b17023SJohn Marino       /* First handle the case where we encounter a bare register that
2997*e4b17023SJohn Marino 	 is eliminable.  Replace it with a PLUS.  */
2998*e4b17023SJohn Marino       if (regno < FIRST_PSEUDO_REGISTER)
2999*e4b17023SJohn Marino 	{
3000*e4b17023SJohn Marino 	  for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
3001*e4b17023SJohn Marino 	       ep++)
3002*e4b17023SJohn Marino 	    if (ep->from_rtx == x && ep->can_eliminate)
3003*e4b17023SJohn Marino 	      {
3004*e4b17023SJohn Marino 		if (! mem_mode)
3005*e4b17023SJohn Marino 		  ep->ref_outside_mem = 1;
3006*e4b17023SJohn Marino 		return;
3007*e4b17023SJohn Marino 	      }
3008*e4b17023SJohn Marino 
3009*e4b17023SJohn Marino 	}
3010*e4b17023SJohn Marino       else if (reg_renumber[regno] < 0
3011*e4b17023SJohn Marino 	       && reg_equivs != 0
3012*e4b17023SJohn Marino 	       && reg_equiv_constant (regno)
3013*e4b17023SJohn Marino 	       && ! function_invariant_p (reg_equiv_constant (regno)))
3014*e4b17023SJohn Marino 	elimination_effects (reg_equiv_constant (regno), mem_mode);
3015*e4b17023SJohn Marino       return;
3016*e4b17023SJohn Marino 
3017*e4b17023SJohn Marino     case PRE_INC:
3018*e4b17023SJohn Marino     case POST_INC:
3019*e4b17023SJohn Marino     case PRE_DEC:
3020*e4b17023SJohn Marino     case POST_DEC:
3021*e4b17023SJohn Marino     case POST_MODIFY:
3022*e4b17023SJohn Marino     case PRE_MODIFY:
3023*e4b17023SJohn Marino       /* If we modify the source of an elimination rule, disable it.  */
3024*e4b17023SJohn Marino       for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
3025*e4b17023SJohn Marino 	if (ep->from_rtx == XEXP (x, 0))
3026*e4b17023SJohn Marino 	  ep->can_eliminate = 0;
3027*e4b17023SJohn Marino 
3028*e4b17023SJohn Marino       /* If we modify the target of an elimination rule by adding a constant,
3029*e4b17023SJohn Marino 	 update its offset.  If we modify the target in any other way, we'll
3030*e4b17023SJohn Marino 	 have to disable the rule as well.  */
3031*e4b17023SJohn Marino       for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
3032*e4b17023SJohn Marino 	if (ep->to_rtx == XEXP (x, 0))
3033*e4b17023SJohn Marino 	  {
3034*e4b17023SJohn Marino 	    int size = GET_MODE_SIZE (mem_mode);
3035*e4b17023SJohn Marino 
3036*e4b17023SJohn Marino 	    /* If more bytes than MEM_MODE are pushed, account for them.  */
3037*e4b17023SJohn Marino #ifdef PUSH_ROUNDING
3038*e4b17023SJohn Marino 	    if (ep->to_rtx == stack_pointer_rtx)
3039*e4b17023SJohn Marino 	      size = PUSH_ROUNDING (size);
3040*e4b17023SJohn Marino #endif
3041*e4b17023SJohn Marino 	    if (code == PRE_DEC || code == POST_DEC)
3042*e4b17023SJohn Marino 	      ep->offset += size;
3043*e4b17023SJohn Marino 	    else if (code == PRE_INC || code == POST_INC)
3044*e4b17023SJohn Marino 	      ep->offset -= size;
3045*e4b17023SJohn Marino 	    else if (code == PRE_MODIFY || code == POST_MODIFY)
3046*e4b17023SJohn Marino 	      {
3047*e4b17023SJohn Marino 		if (GET_CODE (XEXP (x, 1)) == PLUS
3048*e4b17023SJohn Marino 		    && XEXP (x, 0) == XEXP (XEXP (x, 1), 0)
3049*e4b17023SJohn Marino 		    && CONST_INT_P (XEXP (XEXP (x, 1), 1)))
3050*e4b17023SJohn Marino 		  ep->offset -= INTVAL (XEXP (XEXP (x, 1), 1));
3051*e4b17023SJohn Marino 		else
3052*e4b17023SJohn Marino 		  ep->can_eliminate = 0;
3053*e4b17023SJohn Marino 	      }
3054*e4b17023SJohn Marino 	  }
3055*e4b17023SJohn Marino 
3056*e4b17023SJohn Marino       /* These two aren't unary operators.  */
3057*e4b17023SJohn Marino       if (code == POST_MODIFY || code == PRE_MODIFY)
3058*e4b17023SJohn Marino 	break;
3059*e4b17023SJohn Marino 
3060*e4b17023SJohn Marino       /* Fall through to generic unary operation case.  */
3061*e4b17023SJohn Marino     case STRICT_LOW_PART:
3062*e4b17023SJohn Marino     case NEG:          case NOT:
3063*e4b17023SJohn Marino     case SIGN_EXTEND:  case ZERO_EXTEND:
3064*e4b17023SJohn Marino     case TRUNCATE:     case FLOAT_EXTEND: case FLOAT_TRUNCATE:
3065*e4b17023SJohn Marino     case FLOAT:        case FIX:
3066*e4b17023SJohn Marino     case UNSIGNED_FIX: case UNSIGNED_FLOAT:
3067*e4b17023SJohn Marino     case ABS:
3068*e4b17023SJohn Marino     case SQRT:
3069*e4b17023SJohn Marino     case FFS:
3070*e4b17023SJohn Marino     case CLZ:
3071*e4b17023SJohn Marino     case CTZ:
3072*e4b17023SJohn Marino     case POPCOUNT:
3073*e4b17023SJohn Marino     case PARITY:
3074*e4b17023SJohn Marino     case BSWAP:
3075*e4b17023SJohn Marino       elimination_effects (XEXP (x, 0), mem_mode);
3076*e4b17023SJohn Marino       return;
3077*e4b17023SJohn Marino 
3078*e4b17023SJohn Marino     case SUBREG:
3079*e4b17023SJohn Marino       if (REG_P (SUBREG_REG (x))
3080*e4b17023SJohn Marino 	  && (GET_MODE_SIZE (GET_MODE (x))
3081*e4b17023SJohn Marino 	      <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
3082*e4b17023SJohn Marino 	  && reg_equivs != 0
3083*e4b17023SJohn Marino 	  && reg_equiv_memory_loc (REGNO (SUBREG_REG (x))) != 0)
3084*e4b17023SJohn Marino 	return;
3085*e4b17023SJohn Marino 
3086*e4b17023SJohn Marino       elimination_effects (SUBREG_REG (x), mem_mode);
3087*e4b17023SJohn Marino       return;
3088*e4b17023SJohn Marino 
3089*e4b17023SJohn Marino     case USE:
3090*e4b17023SJohn Marino       /* If using a register that is the source of an eliminate we still
3091*e4b17023SJohn Marino 	 think can be performed, note it cannot be performed since we don't
3092*e4b17023SJohn Marino 	 know how this register is used.  */
3093*e4b17023SJohn Marino       for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
3094*e4b17023SJohn Marino 	if (ep->from_rtx == XEXP (x, 0))
3095*e4b17023SJohn Marino 	  ep->can_eliminate = 0;
3096*e4b17023SJohn Marino 
3097*e4b17023SJohn Marino       elimination_effects (XEXP (x, 0), mem_mode);
3098*e4b17023SJohn Marino       return;
3099*e4b17023SJohn Marino 
3100*e4b17023SJohn Marino     case CLOBBER:
3101*e4b17023SJohn Marino       /* If clobbering a register that is the replacement register for an
3102*e4b17023SJohn Marino 	 elimination we still think can be performed, note that it cannot
3103*e4b17023SJohn Marino 	 be performed.  Otherwise, we need not be concerned about it.  */
3104*e4b17023SJohn Marino       for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
3105*e4b17023SJohn Marino 	if (ep->to_rtx == XEXP (x, 0))
3106*e4b17023SJohn Marino 	  ep->can_eliminate = 0;
3107*e4b17023SJohn Marino 
3108*e4b17023SJohn Marino       elimination_effects (XEXP (x, 0), mem_mode);
3109*e4b17023SJohn Marino       return;
3110*e4b17023SJohn Marino 
3111*e4b17023SJohn Marino     case SET:
3112*e4b17023SJohn Marino       /* Check for setting a register that we know about.  */
3113*e4b17023SJohn Marino       if (REG_P (SET_DEST (x)))
3114*e4b17023SJohn Marino 	{
3115*e4b17023SJohn Marino 	  /* See if this is setting the replacement register for an
3116*e4b17023SJohn Marino 	     elimination.
3117*e4b17023SJohn Marino 
3118*e4b17023SJohn Marino 	     If DEST is the hard frame pointer, we do nothing because we
3119*e4b17023SJohn Marino 	     assume that all assignments to the frame pointer are for
3120*e4b17023SJohn Marino 	     non-local gotos and are being done at a time when they are valid
3121*e4b17023SJohn Marino 	     and do not disturb anything else.  Some machines want to
3122*e4b17023SJohn Marino 	     eliminate a fake argument pointer (or even a fake frame pointer)
3123*e4b17023SJohn Marino 	     with either the real frame or the stack pointer.  Assignments to
3124*e4b17023SJohn Marino 	     the hard frame pointer must not prevent this elimination.  */
3125*e4b17023SJohn Marino 
3126*e4b17023SJohn Marino 	  for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
3127*e4b17023SJohn Marino 	       ep++)
3128*e4b17023SJohn Marino 	    if (ep->to_rtx == SET_DEST (x)
3129*e4b17023SJohn Marino 		&& SET_DEST (x) != hard_frame_pointer_rtx)
3130*e4b17023SJohn Marino 	      {
3131*e4b17023SJohn Marino 		/* If it is being incremented, adjust the offset.  Otherwise,
3132*e4b17023SJohn Marino 		   this elimination can't be done.  */
3133*e4b17023SJohn Marino 		rtx src = SET_SRC (x);
3134*e4b17023SJohn Marino 
3135*e4b17023SJohn Marino 		if (GET_CODE (src) == PLUS
3136*e4b17023SJohn Marino 		    && XEXP (src, 0) == SET_DEST (x)
3137*e4b17023SJohn Marino 		    && CONST_INT_P (XEXP (src, 1)))
3138*e4b17023SJohn Marino 		  ep->offset -= INTVAL (XEXP (src, 1));
3139*e4b17023SJohn Marino 		else
3140*e4b17023SJohn Marino 		  ep->can_eliminate = 0;
3141*e4b17023SJohn Marino 	      }
3142*e4b17023SJohn Marino 	}
3143*e4b17023SJohn Marino 
3144*e4b17023SJohn Marino       elimination_effects (SET_DEST (x), VOIDmode);
3145*e4b17023SJohn Marino       elimination_effects (SET_SRC (x), VOIDmode);
3146*e4b17023SJohn Marino       return;
3147*e4b17023SJohn Marino 
3148*e4b17023SJohn Marino     case MEM:
3149*e4b17023SJohn Marino       /* Our only special processing is to pass the mode of the MEM to our
3150*e4b17023SJohn Marino 	 recursive call.  */
3151*e4b17023SJohn Marino       elimination_effects (XEXP (x, 0), GET_MODE (x));
3152*e4b17023SJohn Marino       return;
3153*e4b17023SJohn Marino 
3154*e4b17023SJohn Marino     default:
3155*e4b17023SJohn Marino       break;
3156*e4b17023SJohn Marino     }
3157*e4b17023SJohn Marino 
3158*e4b17023SJohn Marino   fmt = GET_RTX_FORMAT (code);
3159*e4b17023SJohn Marino   for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
3160*e4b17023SJohn Marino     {
3161*e4b17023SJohn Marino       if (*fmt == 'e')
3162*e4b17023SJohn Marino 	elimination_effects (XEXP (x, i), mem_mode);
3163*e4b17023SJohn Marino       else if (*fmt == 'E')
3164*e4b17023SJohn Marino 	for (j = 0; j < XVECLEN (x, i); j++)
3165*e4b17023SJohn Marino 	  elimination_effects (XVECEXP (x, i, j), mem_mode);
3166*e4b17023SJohn Marino     }
3167*e4b17023SJohn Marino }
3168*e4b17023SJohn Marino 
3169*e4b17023SJohn Marino /* Descend through rtx X and verify that no references to eliminable registers
3170*e4b17023SJohn Marino    remain.  If any do remain, mark the involved register as not
3171*e4b17023SJohn Marino    eliminable.  */
3172*e4b17023SJohn Marino 
3173*e4b17023SJohn Marino static void
check_eliminable_occurrences(rtx x)3174*e4b17023SJohn Marino check_eliminable_occurrences (rtx x)
3175*e4b17023SJohn Marino {
3176*e4b17023SJohn Marino   const char *fmt;
3177*e4b17023SJohn Marino   int i;
3178*e4b17023SJohn Marino   enum rtx_code code;
3179*e4b17023SJohn Marino 
3180*e4b17023SJohn Marino   if (x == 0)
3181*e4b17023SJohn Marino     return;
3182*e4b17023SJohn Marino 
3183*e4b17023SJohn Marino   code = GET_CODE (x);
3184*e4b17023SJohn Marino 
3185*e4b17023SJohn Marino   if (code == REG && REGNO (x) < FIRST_PSEUDO_REGISTER)
3186*e4b17023SJohn Marino     {
3187*e4b17023SJohn Marino       struct elim_table *ep;
3188*e4b17023SJohn Marino 
3189*e4b17023SJohn Marino       for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
3190*e4b17023SJohn Marino 	if (ep->from_rtx == x)
3191*e4b17023SJohn Marino 	  ep->can_eliminate = 0;
3192*e4b17023SJohn Marino       return;
3193*e4b17023SJohn Marino     }
3194*e4b17023SJohn Marino 
3195*e4b17023SJohn Marino   fmt = GET_RTX_FORMAT (code);
3196*e4b17023SJohn Marino   for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
3197*e4b17023SJohn Marino     {
3198*e4b17023SJohn Marino       if (*fmt == 'e')
3199*e4b17023SJohn Marino 	check_eliminable_occurrences (XEXP (x, i));
3200*e4b17023SJohn Marino       else if (*fmt == 'E')
3201*e4b17023SJohn Marino 	{
3202*e4b17023SJohn Marino 	  int j;
3203*e4b17023SJohn Marino 	  for (j = 0; j < XVECLEN (x, i); j++)
3204*e4b17023SJohn Marino 	    check_eliminable_occurrences (XVECEXP (x, i, j));
3205*e4b17023SJohn Marino 	}
3206*e4b17023SJohn Marino     }
3207*e4b17023SJohn Marino }
3208*e4b17023SJohn Marino 
3209*e4b17023SJohn Marino /* Scan INSN and eliminate all eliminable registers in it.
3210*e4b17023SJohn Marino 
3211*e4b17023SJohn Marino    If REPLACE is nonzero, do the replacement destructively.  Also
3212*e4b17023SJohn Marino    delete the insn as dead it if it is setting an eliminable register.
3213*e4b17023SJohn Marino 
3214*e4b17023SJohn Marino    If REPLACE is zero, do all our allocations in reload_obstack.
3215*e4b17023SJohn Marino 
3216*e4b17023SJohn Marino    If no eliminations were done and this insn doesn't require any elimination
3217*e4b17023SJohn Marino    processing (these are not identical conditions: it might be updating sp,
3218*e4b17023SJohn Marino    but not referencing fp; this needs to be seen during reload_as_needed so
3219*e4b17023SJohn Marino    that the offset between fp and sp can be taken into consideration), zero
3220*e4b17023SJohn Marino    is returned.  Otherwise, 1 is returned.  */
3221*e4b17023SJohn Marino 
3222*e4b17023SJohn Marino static int
eliminate_regs_in_insn(rtx insn,int replace)3223*e4b17023SJohn Marino eliminate_regs_in_insn (rtx insn, int replace)
3224*e4b17023SJohn Marino {
3225*e4b17023SJohn Marino   int icode = recog_memoized (insn);
3226*e4b17023SJohn Marino   rtx old_body = PATTERN (insn);
3227*e4b17023SJohn Marino   int insn_is_asm = asm_noperands (old_body) >= 0;
3228*e4b17023SJohn Marino   rtx old_set = single_set (insn);
3229*e4b17023SJohn Marino   rtx new_body;
3230*e4b17023SJohn Marino   int val = 0;
3231*e4b17023SJohn Marino   int i;
3232*e4b17023SJohn Marino   rtx substed_operand[MAX_RECOG_OPERANDS];
3233*e4b17023SJohn Marino   rtx orig_operand[MAX_RECOG_OPERANDS];
3234*e4b17023SJohn Marino   struct elim_table *ep;
3235*e4b17023SJohn Marino   rtx plus_src, plus_cst_src;
3236*e4b17023SJohn Marino 
3237*e4b17023SJohn Marino   if (! insn_is_asm && icode < 0)
3238*e4b17023SJohn Marino     {
3239*e4b17023SJohn Marino       gcc_assert (GET_CODE (PATTERN (insn)) == USE
3240*e4b17023SJohn Marino 		  || GET_CODE (PATTERN (insn)) == CLOBBER
3241*e4b17023SJohn Marino 		  || GET_CODE (PATTERN (insn)) == ADDR_VEC
3242*e4b17023SJohn Marino 		  || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
3243*e4b17023SJohn Marino 		  || GET_CODE (PATTERN (insn)) == ASM_INPUT
3244*e4b17023SJohn Marino 		  || DEBUG_INSN_P (insn));
3245*e4b17023SJohn Marino       if (DEBUG_INSN_P (insn))
3246*e4b17023SJohn Marino 	INSN_VAR_LOCATION_LOC (insn)
3247*e4b17023SJohn Marino 	  = eliminate_regs (INSN_VAR_LOCATION_LOC (insn), VOIDmode, insn);
3248*e4b17023SJohn Marino       return 0;
3249*e4b17023SJohn Marino     }
3250*e4b17023SJohn Marino 
3251*e4b17023SJohn Marino   if (old_set != 0 && REG_P (SET_DEST (old_set))
3252*e4b17023SJohn Marino       && REGNO (SET_DEST (old_set)) < FIRST_PSEUDO_REGISTER)
3253*e4b17023SJohn Marino     {
3254*e4b17023SJohn Marino       /* Check for setting an eliminable register.  */
3255*e4b17023SJohn Marino       for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
3256*e4b17023SJohn Marino 	if (ep->from_rtx == SET_DEST (old_set) && ep->can_eliminate)
3257*e4b17023SJohn Marino 	  {
3258*e4b17023SJohn Marino #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
3259*e4b17023SJohn Marino 	    /* If this is setting the frame pointer register to the
3260*e4b17023SJohn Marino 	       hardware frame pointer register and this is an elimination
3261*e4b17023SJohn Marino 	       that will be done (tested above), this insn is really
3262*e4b17023SJohn Marino 	       adjusting the frame pointer downward to compensate for
3263*e4b17023SJohn Marino 	       the adjustment done before a nonlocal goto.  */
3264*e4b17023SJohn Marino 	    if (ep->from == FRAME_POINTER_REGNUM
3265*e4b17023SJohn Marino 		&& ep->to == HARD_FRAME_POINTER_REGNUM)
3266*e4b17023SJohn Marino 	      {
3267*e4b17023SJohn Marino 		rtx base = SET_SRC (old_set);
3268*e4b17023SJohn Marino 		rtx base_insn = insn;
3269*e4b17023SJohn Marino 		HOST_WIDE_INT offset = 0;
3270*e4b17023SJohn Marino 
3271*e4b17023SJohn Marino 		while (base != ep->to_rtx)
3272*e4b17023SJohn Marino 		  {
3273*e4b17023SJohn Marino 		    rtx prev_insn, prev_set;
3274*e4b17023SJohn Marino 
3275*e4b17023SJohn Marino 		    if (GET_CODE (base) == PLUS
3276*e4b17023SJohn Marino 		        && CONST_INT_P (XEXP (base, 1)))
3277*e4b17023SJohn Marino 		      {
3278*e4b17023SJohn Marino 		        offset += INTVAL (XEXP (base, 1));
3279*e4b17023SJohn Marino 		        base = XEXP (base, 0);
3280*e4b17023SJohn Marino 		      }
3281*e4b17023SJohn Marino 		    else if ((prev_insn = prev_nonnote_insn (base_insn)) != 0
3282*e4b17023SJohn Marino 			     && (prev_set = single_set (prev_insn)) != 0
3283*e4b17023SJohn Marino 			     && rtx_equal_p (SET_DEST (prev_set), base))
3284*e4b17023SJohn Marino 		      {
3285*e4b17023SJohn Marino 		        base = SET_SRC (prev_set);
3286*e4b17023SJohn Marino 		        base_insn = prev_insn;
3287*e4b17023SJohn Marino 		      }
3288*e4b17023SJohn Marino 		    else
3289*e4b17023SJohn Marino 		      break;
3290*e4b17023SJohn Marino 		  }
3291*e4b17023SJohn Marino 
3292*e4b17023SJohn Marino 		if (base == ep->to_rtx)
3293*e4b17023SJohn Marino 		  {
3294*e4b17023SJohn Marino 		    rtx src
3295*e4b17023SJohn Marino 		      = plus_constant (ep->to_rtx, offset - ep->offset);
3296*e4b17023SJohn Marino 
3297*e4b17023SJohn Marino 		    new_body = old_body;
3298*e4b17023SJohn Marino 		    if (! replace)
3299*e4b17023SJohn Marino 		      {
3300*e4b17023SJohn Marino 			new_body = copy_insn (old_body);
3301*e4b17023SJohn Marino 			if (REG_NOTES (insn))
3302*e4b17023SJohn Marino 			  REG_NOTES (insn) = copy_insn_1 (REG_NOTES (insn));
3303*e4b17023SJohn Marino 		      }
3304*e4b17023SJohn Marino 		    PATTERN (insn) = new_body;
3305*e4b17023SJohn Marino 		    old_set = single_set (insn);
3306*e4b17023SJohn Marino 
3307*e4b17023SJohn Marino 		    /* First see if this insn remains valid when we
3308*e4b17023SJohn Marino 		       make the change.  If not, keep the INSN_CODE
3309*e4b17023SJohn Marino 		       the same and let reload fit it up.  */
3310*e4b17023SJohn Marino 		    validate_change (insn, &SET_SRC (old_set), src, 1);
3311*e4b17023SJohn Marino 		    validate_change (insn, &SET_DEST (old_set),
3312*e4b17023SJohn Marino 				     ep->to_rtx, 1);
3313*e4b17023SJohn Marino 		    if (! apply_change_group ())
3314*e4b17023SJohn Marino 		      {
3315*e4b17023SJohn Marino 			SET_SRC (old_set) = src;
3316*e4b17023SJohn Marino 			SET_DEST (old_set) = ep->to_rtx;
3317*e4b17023SJohn Marino 		      }
3318*e4b17023SJohn Marino 
3319*e4b17023SJohn Marino 		    val = 1;
3320*e4b17023SJohn Marino 		    goto done;
3321*e4b17023SJohn Marino 		  }
3322*e4b17023SJohn Marino 	      }
3323*e4b17023SJohn Marino #endif
3324*e4b17023SJohn Marino 
3325*e4b17023SJohn Marino 	    /* In this case this insn isn't serving a useful purpose.  We
3326*e4b17023SJohn Marino 	       will delete it in reload_as_needed once we know that this
3327*e4b17023SJohn Marino 	       elimination is, in fact, being done.
3328*e4b17023SJohn Marino 
3329*e4b17023SJohn Marino 	       If REPLACE isn't set, we can't delete this insn, but needn't
3330*e4b17023SJohn Marino 	       process it since it won't be used unless something changes.  */
3331*e4b17023SJohn Marino 	    if (replace)
3332*e4b17023SJohn Marino 	      {
3333*e4b17023SJohn Marino 		delete_dead_insn (insn);
3334*e4b17023SJohn Marino 		return 1;
3335*e4b17023SJohn Marino 	      }
3336*e4b17023SJohn Marino 	    val = 1;
3337*e4b17023SJohn Marino 	    goto done;
3338*e4b17023SJohn Marino 	  }
3339*e4b17023SJohn Marino     }
3340*e4b17023SJohn Marino 
3341*e4b17023SJohn Marino   /* We allow one special case which happens to work on all machines we
3342*e4b17023SJohn Marino      currently support: a single set with the source or a REG_EQUAL
3343*e4b17023SJohn Marino      note being a PLUS of an eliminable register and a constant.  */
3344*e4b17023SJohn Marino   plus_src = plus_cst_src = 0;
3345*e4b17023SJohn Marino   if (old_set && REG_P (SET_DEST (old_set)))
3346*e4b17023SJohn Marino     {
3347*e4b17023SJohn Marino       if (GET_CODE (SET_SRC (old_set)) == PLUS)
3348*e4b17023SJohn Marino 	plus_src = SET_SRC (old_set);
3349*e4b17023SJohn Marino       /* First see if the source is of the form (plus (...) CST).  */
3350*e4b17023SJohn Marino       if (plus_src
3351*e4b17023SJohn Marino 	  && CONST_INT_P (XEXP (plus_src, 1)))
3352*e4b17023SJohn Marino 	plus_cst_src = plus_src;
3353*e4b17023SJohn Marino       else if (REG_P (SET_SRC (old_set))
3354*e4b17023SJohn Marino 	       || plus_src)
3355*e4b17023SJohn Marino 	{
3356*e4b17023SJohn Marino 	  /* Otherwise, see if we have a REG_EQUAL note of the form
3357*e4b17023SJohn Marino 	     (plus (...) CST).  */
3358*e4b17023SJohn Marino 	  rtx links;
3359*e4b17023SJohn Marino 	  for (links = REG_NOTES (insn); links; links = XEXP (links, 1))
3360*e4b17023SJohn Marino 	    {
3361*e4b17023SJohn Marino 	      if ((REG_NOTE_KIND (links) == REG_EQUAL
3362*e4b17023SJohn Marino 		   || REG_NOTE_KIND (links) == REG_EQUIV)
3363*e4b17023SJohn Marino 		  && GET_CODE (XEXP (links, 0)) == PLUS
3364*e4b17023SJohn Marino 		  && CONST_INT_P (XEXP (XEXP (links, 0), 1)))
3365*e4b17023SJohn Marino 		{
3366*e4b17023SJohn Marino 		  plus_cst_src = XEXP (links, 0);
3367*e4b17023SJohn Marino 		  break;
3368*e4b17023SJohn Marino 		}
3369*e4b17023SJohn Marino 	    }
3370*e4b17023SJohn Marino 	}
3371*e4b17023SJohn Marino 
3372*e4b17023SJohn Marino       /* Check that the first operand of the PLUS is a hard reg or
3373*e4b17023SJohn Marino 	 the lowpart subreg of one.  */
3374*e4b17023SJohn Marino       if (plus_cst_src)
3375*e4b17023SJohn Marino 	{
3376*e4b17023SJohn Marino 	  rtx reg = XEXP (plus_cst_src, 0);
3377*e4b17023SJohn Marino 	  if (GET_CODE (reg) == SUBREG && subreg_lowpart_p (reg))
3378*e4b17023SJohn Marino 	    reg = SUBREG_REG (reg);
3379*e4b17023SJohn Marino 
3380*e4b17023SJohn Marino 	  if (!REG_P (reg) || REGNO (reg) >= FIRST_PSEUDO_REGISTER)
3381*e4b17023SJohn Marino 	    plus_cst_src = 0;
3382*e4b17023SJohn Marino 	}
3383*e4b17023SJohn Marino     }
3384*e4b17023SJohn Marino   if (plus_cst_src)
3385*e4b17023SJohn Marino     {
3386*e4b17023SJohn Marino       rtx reg = XEXP (plus_cst_src, 0);
3387*e4b17023SJohn Marino       HOST_WIDE_INT offset = INTVAL (XEXP (plus_cst_src, 1));
3388*e4b17023SJohn Marino 
3389*e4b17023SJohn Marino       if (GET_CODE (reg) == SUBREG)
3390*e4b17023SJohn Marino 	reg = SUBREG_REG (reg);
3391*e4b17023SJohn Marino 
3392*e4b17023SJohn Marino       for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
3393*e4b17023SJohn Marino 	if (ep->from_rtx == reg && ep->can_eliminate)
3394*e4b17023SJohn Marino 	  {
3395*e4b17023SJohn Marino 	    rtx to_rtx = ep->to_rtx;
3396*e4b17023SJohn Marino 	    offset += ep->offset;
3397*e4b17023SJohn Marino 	    offset = trunc_int_for_mode (offset, GET_MODE (plus_cst_src));
3398*e4b17023SJohn Marino 
3399*e4b17023SJohn Marino 	    if (GET_CODE (XEXP (plus_cst_src, 0)) == SUBREG)
3400*e4b17023SJohn Marino 	      to_rtx = gen_lowpart (GET_MODE (XEXP (plus_cst_src, 0)),
3401*e4b17023SJohn Marino 				    to_rtx);
3402*e4b17023SJohn Marino 	    /* If we have a nonzero offset, and the source is already
3403*e4b17023SJohn Marino 	       a simple REG, the following transformation would
3404*e4b17023SJohn Marino 	       increase the cost of the insn by replacing a simple REG
3405*e4b17023SJohn Marino 	       with (plus (reg sp) CST).  So try only when we already
3406*e4b17023SJohn Marino 	       had a PLUS before.  */
3407*e4b17023SJohn Marino 	    if (offset == 0 || plus_src)
3408*e4b17023SJohn Marino 	      {
3409*e4b17023SJohn Marino 		rtx new_src = plus_constant (to_rtx, offset);
3410*e4b17023SJohn Marino 
3411*e4b17023SJohn Marino 		new_body = old_body;
3412*e4b17023SJohn Marino 		if (! replace)
3413*e4b17023SJohn Marino 		  {
3414*e4b17023SJohn Marino 		    new_body = copy_insn (old_body);
3415*e4b17023SJohn Marino 		    if (REG_NOTES (insn))
3416*e4b17023SJohn Marino 		      REG_NOTES (insn) = copy_insn_1 (REG_NOTES (insn));
3417*e4b17023SJohn Marino 		  }
3418*e4b17023SJohn Marino 		PATTERN (insn) = new_body;
3419*e4b17023SJohn Marino 		old_set = single_set (insn);
3420*e4b17023SJohn Marino 
3421*e4b17023SJohn Marino 		/* First see if this insn remains valid when we make the
3422*e4b17023SJohn Marino 		   change.  If not, try to replace the whole pattern with
3423*e4b17023SJohn Marino 		   a simple set (this may help if the original insn was a
3424*e4b17023SJohn Marino 		   PARALLEL that was only recognized as single_set due to
3425*e4b17023SJohn Marino 		   REG_UNUSED notes).  If this isn't valid either, keep
3426*e4b17023SJohn Marino 		   the INSN_CODE the same and let reload fix it up.  */
3427*e4b17023SJohn Marino 		if (!validate_change (insn, &SET_SRC (old_set), new_src, 0))
3428*e4b17023SJohn Marino 		  {
3429*e4b17023SJohn Marino 		    rtx new_pat = gen_rtx_SET (VOIDmode,
3430*e4b17023SJohn Marino 					       SET_DEST (old_set), new_src);
3431*e4b17023SJohn Marino 
3432*e4b17023SJohn Marino 		    if (!validate_change (insn, &PATTERN (insn), new_pat, 0))
3433*e4b17023SJohn Marino 		      SET_SRC (old_set) = new_src;
3434*e4b17023SJohn Marino 		  }
3435*e4b17023SJohn Marino 	      }
3436*e4b17023SJohn Marino 	    else
3437*e4b17023SJohn Marino 	      break;
3438*e4b17023SJohn Marino 
3439*e4b17023SJohn Marino 	    val = 1;
3440*e4b17023SJohn Marino 	    /* This can't have an effect on elimination offsets, so skip right
3441*e4b17023SJohn Marino 	       to the end.  */
3442*e4b17023SJohn Marino 	    goto done;
3443*e4b17023SJohn Marino 	  }
3444*e4b17023SJohn Marino     }
3445*e4b17023SJohn Marino 
3446*e4b17023SJohn Marino   /* Determine the effects of this insn on elimination offsets.  */
3447*e4b17023SJohn Marino   elimination_effects (old_body, VOIDmode);
3448*e4b17023SJohn Marino 
3449*e4b17023SJohn Marino   /* Eliminate all eliminable registers occurring in operands that
3450*e4b17023SJohn Marino      can be handled by reload.  */
3451*e4b17023SJohn Marino   extract_insn (insn);
3452*e4b17023SJohn Marino   for (i = 0; i < recog_data.n_operands; i++)
3453*e4b17023SJohn Marino     {
3454*e4b17023SJohn Marino       orig_operand[i] = recog_data.operand[i];
3455*e4b17023SJohn Marino       substed_operand[i] = recog_data.operand[i];
3456*e4b17023SJohn Marino 
3457*e4b17023SJohn Marino       /* For an asm statement, every operand is eliminable.  */
3458*e4b17023SJohn Marino       if (insn_is_asm || insn_data[icode].operand[i].eliminable)
3459*e4b17023SJohn Marino 	{
3460*e4b17023SJohn Marino 	  bool is_set_src, in_plus;
3461*e4b17023SJohn Marino 
3462*e4b17023SJohn Marino 	  /* Check for setting a register that we know about.  */
3463*e4b17023SJohn Marino 	  if (recog_data.operand_type[i] != OP_IN
3464*e4b17023SJohn Marino 	      && REG_P (orig_operand[i]))
3465*e4b17023SJohn Marino 	    {
3466*e4b17023SJohn Marino 	      /* If we are assigning to a register that can be eliminated, it
3467*e4b17023SJohn Marino 		 must be as part of a PARALLEL, since the code above handles
3468*e4b17023SJohn Marino 		 single SETs.  We must indicate that we can no longer
3469*e4b17023SJohn Marino 		 eliminate this reg.  */
3470*e4b17023SJohn Marino 	      for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
3471*e4b17023SJohn Marino 		   ep++)
3472*e4b17023SJohn Marino 		if (ep->from_rtx == orig_operand[i])
3473*e4b17023SJohn Marino 		  ep->can_eliminate = 0;
3474*e4b17023SJohn Marino 	    }
3475*e4b17023SJohn Marino 
3476*e4b17023SJohn Marino 	  /* Companion to the above plus substitution, we can allow
3477*e4b17023SJohn Marino 	     invariants as the source of a plain move.  */
3478*e4b17023SJohn Marino 	  is_set_src = false;
3479*e4b17023SJohn Marino 	  if (old_set
3480*e4b17023SJohn Marino 	      && recog_data.operand_loc[i] == &SET_SRC (old_set))
3481*e4b17023SJohn Marino 	    is_set_src = true;
3482*e4b17023SJohn Marino 	  in_plus = false;
3483*e4b17023SJohn Marino 	  if (plus_src
3484*e4b17023SJohn Marino 	      && (recog_data.operand_loc[i] == &XEXP (plus_src, 0)
3485*e4b17023SJohn Marino 		  || recog_data.operand_loc[i] == &XEXP (plus_src, 1)))
3486*e4b17023SJohn Marino 	    in_plus = true;
3487*e4b17023SJohn Marino 
3488*e4b17023SJohn Marino 	  substed_operand[i]
3489*e4b17023SJohn Marino 	    = eliminate_regs_1 (recog_data.operand[i], VOIDmode,
3490*e4b17023SJohn Marino 			        replace ? insn : NULL_RTX,
3491*e4b17023SJohn Marino 				is_set_src || in_plus, false);
3492*e4b17023SJohn Marino 	  if (substed_operand[i] != orig_operand[i])
3493*e4b17023SJohn Marino 	    val = 1;
3494*e4b17023SJohn Marino 	  /* Terminate the search in check_eliminable_occurrences at
3495*e4b17023SJohn Marino 	     this point.  */
3496*e4b17023SJohn Marino 	  *recog_data.operand_loc[i] = 0;
3497*e4b17023SJohn Marino 
3498*e4b17023SJohn Marino 	  /* If an output operand changed from a REG to a MEM and INSN is an
3499*e4b17023SJohn Marino 	     insn, write a CLOBBER insn.  */
3500*e4b17023SJohn Marino 	  if (recog_data.operand_type[i] != OP_IN
3501*e4b17023SJohn Marino 	      && REG_P (orig_operand[i])
3502*e4b17023SJohn Marino 	      && MEM_P (substed_operand[i])
3503*e4b17023SJohn Marino 	      && replace)
3504*e4b17023SJohn Marino 	    emit_insn_after (gen_clobber (orig_operand[i]), insn);
3505*e4b17023SJohn Marino 	}
3506*e4b17023SJohn Marino     }
3507*e4b17023SJohn Marino 
3508*e4b17023SJohn Marino   for (i = 0; i < recog_data.n_dups; i++)
3509*e4b17023SJohn Marino     *recog_data.dup_loc[i]
3510*e4b17023SJohn Marino       = *recog_data.operand_loc[(int) recog_data.dup_num[i]];
3511*e4b17023SJohn Marino 
3512*e4b17023SJohn Marino   /* If any eliminable remain, they aren't eliminable anymore.  */
3513*e4b17023SJohn Marino   check_eliminable_occurrences (old_body);
3514*e4b17023SJohn Marino 
3515*e4b17023SJohn Marino   /* Substitute the operands; the new values are in the substed_operand
3516*e4b17023SJohn Marino      array.  */
3517*e4b17023SJohn Marino   for (i = 0; i < recog_data.n_operands; i++)
3518*e4b17023SJohn Marino     *recog_data.operand_loc[i] = substed_operand[i];
3519*e4b17023SJohn Marino   for (i = 0; i < recog_data.n_dups; i++)
3520*e4b17023SJohn Marino     *recog_data.dup_loc[i] = substed_operand[(int) recog_data.dup_num[i]];
3521*e4b17023SJohn Marino 
3522*e4b17023SJohn Marino   /* If we are replacing a body that was a (set X (plus Y Z)), try to
3523*e4b17023SJohn Marino      re-recognize the insn.  We do this in case we had a simple addition
3524*e4b17023SJohn Marino      but now can do this as a load-address.  This saves an insn in this
3525*e4b17023SJohn Marino      common case.
3526*e4b17023SJohn Marino      If re-recognition fails, the old insn code number will still be used,
3527*e4b17023SJohn Marino      and some register operands may have changed into PLUS expressions.
3528*e4b17023SJohn Marino      These will be handled by find_reloads by loading them into a register
3529*e4b17023SJohn Marino      again.  */
3530*e4b17023SJohn Marino 
3531*e4b17023SJohn Marino   if (val)
3532*e4b17023SJohn Marino     {
3533*e4b17023SJohn Marino       /* If we aren't replacing things permanently and we changed something,
3534*e4b17023SJohn Marino 	 make another copy to ensure that all the RTL is new.  Otherwise
3535*e4b17023SJohn Marino 	 things can go wrong if find_reload swaps commutative operands
3536*e4b17023SJohn Marino 	 and one is inside RTL that has been copied while the other is not.  */
3537*e4b17023SJohn Marino       new_body = old_body;
3538*e4b17023SJohn Marino       if (! replace)
3539*e4b17023SJohn Marino 	{
3540*e4b17023SJohn Marino 	  new_body = copy_insn (old_body);
3541*e4b17023SJohn Marino 	  if (REG_NOTES (insn))
3542*e4b17023SJohn Marino 	    REG_NOTES (insn) = copy_insn_1 (REG_NOTES (insn));
3543*e4b17023SJohn Marino 	}
3544*e4b17023SJohn Marino       PATTERN (insn) = new_body;
3545*e4b17023SJohn Marino 
3546*e4b17023SJohn Marino       /* If we had a move insn but now we don't, rerecognize it.  This will
3547*e4b17023SJohn Marino 	 cause spurious re-recognition if the old move had a PARALLEL since
3548*e4b17023SJohn Marino 	 the new one still will, but we can't call single_set without
3549*e4b17023SJohn Marino 	 having put NEW_BODY into the insn and the re-recognition won't
3550*e4b17023SJohn Marino 	 hurt in this rare case.  */
3551*e4b17023SJohn Marino       /* ??? Why this huge if statement - why don't we just rerecognize the
3552*e4b17023SJohn Marino 	 thing always?  */
3553*e4b17023SJohn Marino       if (! insn_is_asm
3554*e4b17023SJohn Marino 	  && old_set != 0
3555*e4b17023SJohn Marino 	  && ((REG_P (SET_SRC (old_set))
3556*e4b17023SJohn Marino 	       && (GET_CODE (new_body) != SET
3557*e4b17023SJohn Marino 		   || !REG_P (SET_SRC (new_body))))
3558*e4b17023SJohn Marino 	      /* If this was a load from or store to memory, compare
3559*e4b17023SJohn Marino 		 the MEM in recog_data.operand to the one in the insn.
3560*e4b17023SJohn Marino 		 If they are not equal, then rerecognize the insn.  */
3561*e4b17023SJohn Marino 	      || (old_set != 0
3562*e4b17023SJohn Marino 		  && ((MEM_P (SET_SRC (old_set))
3563*e4b17023SJohn Marino 		       && SET_SRC (old_set) != recog_data.operand[1])
3564*e4b17023SJohn Marino 		      || (MEM_P (SET_DEST (old_set))
3565*e4b17023SJohn Marino 			  && SET_DEST (old_set) != recog_data.operand[0])))
3566*e4b17023SJohn Marino 	      /* If this was an add insn before, rerecognize.  */
3567*e4b17023SJohn Marino 	      || GET_CODE (SET_SRC (old_set)) == PLUS))
3568*e4b17023SJohn Marino 	{
3569*e4b17023SJohn Marino 	  int new_icode = recog (PATTERN (insn), insn, 0);
3570*e4b17023SJohn Marino 	  if (new_icode >= 0)
3571*e4b17023SJohn Marino 	    INSN_CODE (insn) = new_icode;
3572*e4b17023SJohn Marino 	}
3573*e4b17023SJohn Marino     }
3574*e4b17023SJohn Marino 
3575*e4b17023SJohn Marino   /* Restore the old body.  If there were any changes to it, we made a copy
3576*e4b17023SJohn Marino      of it while the changes were still in place, so we'll correctly return
3577*e4b17023SJohn Marino      a modified insn below.  */
3578*e4b17023SJohn Marino   if (! replace)
3579*e4b17023SJohn Marino     {
3580*e4b17023SJohn Marino       /* Restore the old body.  */
3581*e4b17023SJohn Marino       for (i = 0; i < recog_data.n_operands; i++)
3582*e4b17023SJohn Marino 	/* Restoring a top-level match_parallel would clobber the new_body
3583*e4b17023SJohn Marino 	   we installed in the insn.  */
3584*e4b17023SJohn Marino 	if (recog_data.operand_loc[i] != &PATTERN (insn))
3585*e4b17023SJohn Marino 	  *recog_data.operand_loc[i] = orig_operand[i];
3586*e4b17023SJohn Marino       for (i = 0; i < recog_data.n_dups; i++)
3587*e4b17023SJohn Marino 	*recog_data.dup_loc[i] = orig_operand[(int) recog_data.dup_num[i]];
3588*e4b17023SJohn Marino     }
3589*e4b17023SJohn Marino 
3590*e4b17023SJohn Marino   /* Update all elimination pairs to reflect the status after the current
3591*e4b17023SJohn Marino      insn.  The changes we make were determined by the earlier call to
3592*e4b17023SJohn Marino      elimination_effects.
3593*e4b17023SJohn Marino 
3594*e4b17023SJohn Marino      We also detect cases where register elimination cannot be done,
3595*e4b17023SJohn Marino      namely, if a register would be both changed and referenced outside a MEM
3596*e4b17023SJohn Marino      in the resulting insn since such an insn is often undefined and, even if
3597*e4b17023SJohn Marino      not, we cannot know what meaning will be given to it.  Note that it is
3598*e4b17023SJohn Marino      valid to have a register used in an address in an insn that changes it
3599*e4b17023SJohn Marino      (presumably with a pre- or post-increment or decrement).
3600*e4b17023SJohn Marino 
3601*e4b17023SJohn Marino      If anything changes, return nonzero.  */
3602*e4b17023SJohn Marino 
3603*e4b17023SJohn Marino   for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
3604*e4b17023SJohn Marino     {
3605*e4b17023SJohn Marino       if (ep->previous_offset != ep->offset && ep->ref_outside_mem)
3606*e4b17023SJohn Marino 	ep->can_eliminate = 0;
3607*e4b17023SJohn Marino 
3608*e4b17023SJohn Marino       ep->ref_outside_mem = 0;
3609*e4b17023SJohn Marino 
3610*e4b17023SJohn Marino       if (ep->previous_offset != ep->offset)
3611*e4b17023SJohn Marino 	val = 1;
3612*e4b17023SJohn Marino     }
3613*e4b17023SJohn Marino 
3614*e4b17023SJohn Marino  done:
3615*e4b17023SJohn Marino   /* If we changed something, perform elimination in REG_NOTES.  This is
3616*e4b17023SJohn Marino      needed even when REPLACE is zero because a REG_DEAD note might refer
3617*e4b17023SJohn Marino      to a register that we eliminate and could cause a different number
3618*e4b17023SJohn Marino      of spill registers to be needed in the final reload pass than in
3619*e4b17023SJohn Marino      the pre-passes.  */
3620*e4b17023SJohn Marino   if (val && REG_NOTES (insn) != 0)
3621*e4b17023SJohn Marino     REG_NOTES (insn)
3622*e4b17023SJohn Marino       = eliminate_regs_1 (REG_NOTES (insn), VOIDmode, REG_NOTES (insn), true,
3623*e4b17023SJohn Marino 			  false);
3624*e4b17023SJohn Marino 
3625*e4b17023SJohn Marino   return val;
3626*e4b17023SJohn Marino }
3627*e4b17023SJohn Marino 
3628*e4b17023SJohn Marino /* Like eliminate_regs_in_insn, but only estimate costs for the use of the
3629*e4b17023SJohn Marino    register allocator.  INSN is the instruction we need to examine, we perform
3630*e4b17023SJohn Marino    eliminations in its operands and record cases where eliminating a reg with
3631*e4b17023SJohn Marino    an invariant equivalence would add extra cost.  */
3632*e4b17023SJohn Marino 
3633*e4b17023SJohn Marino static void
elimination_costs_in_insn(rtx insn)3634*e4b17023SJohn Marino elimination_costs_in_insn (rtx insn)
3635*e4b17023SJohn Marino {
3636*e4b17023SJohn Marino   int icode = recog_memoized (insn);
3637*e4b17023SJohn Marino   rtx old_body = PATTERN (insn);
3638*e4b17023SJohn Marino   int insn_is_asm = asm_noperands (old_body) >= 0;
3639*e4b17023SJohn Marino   rtx old_set = single_set (insn);
3640*e4b17023SJohn Marino   int i;
3641*e4b17023SJohn Marino   rtx orig_operand[MAX_RECOG_OPERANDS];
3642*e4b17023SJohn Marino   rtx orig_dup[MAX_RECOG_OPERANDS];
3643*e4b17023SJohn Marino   struct elim_table *ep;
3644*e4b17023SJohn Marino   rtx plus_src, plus_cst_src;
3645*e4b17023SJohn Marino   bool sets_reg_p;
3646*e4b17023SJohn Marino 
3647*e4b17023SJohn Marino   if (! insn_is_asm && icode < 0)
3648*e4b17023SJohn Marino     {
3649*e4b17023SJohn Marino       gcc_assert (GET_CODE (PATTERN (insn)) == USE
3650*e4b17023SJohn Marino 		  || GET_CODE (PATTERN (insn)) == CLOBBER
3651*e4b17023SJohn Marino 		  || GET_CODE (PATTERN (insn)) == ADDR_VEC
3652*e4b17023SJohn Marino 		  || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
3653*e4b17023SJohn Marino 		  || GET_CODE (PATTERN (insn)) == ASM_INPUT
3654*e4b17023SJohn Marino 		  || DEBUG_INSN_P (insn));
3655*e4b17023SJohn Marino       return;
3656*e4b17023SJohn Marino     }
3657*e4b17023SJohn Marino 
3658*e4b17023SJohn Marino   if (old_set != 0 && REG_P (SET_DEST (old_set))
3659*e4b17023SJohn Marino       && REGNO (SET_DEST (old_set)) < FIRST_PSEUDO_REGISTER)
3660*e4b17023SJohn Marino     {
3661*e4b17023SJohn Marino       /* Check for setting an eliminable register.  */
3662*e4b17023SJohn Marino       for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
3663*e4b17023SJohn Marino 	if (ep->from_rtx == SET_DEST (old_set) && ep->can_eliminate)
3664*e4b17023SJohn Marino 	  return;
3665*e4b17023SJohn Marino     }
3666*e4b17023SJohn Marino 
3667*e4b17023SJohn Marino   /* We allow one special case which happens to work on all machines we
3668*e4b17023SJohn Marino      currently support: a single set with the source or a REG_EQUAL
3669*e4b17023SJohn Marino      note being a PLUS of an eliminable register and a constant.  */
3670*e4b17023SJohn Marino   plus_src = plus_cst_src = 0;
3671*e4b17023SJohn Marino   sets_reg_p = false;
3672*e4b17023SJohn Marino   if (old_set && REG_P (SET_DEST (old_set)))
3673*e4b17023SJohn Marino     {
3674*e4b17023SJohn Marino       sets_reg_p = true;
3675*e4b17023SJohn Marino       if (GET_CODE (SET_SRC (old_set)) == PLUS)
3676*e4b17023SJohn Marino 	plus_src = SET_SRC (old_set);
3677*e4b17023SJohn Marino       /* First see if the source is of the form (plus (...) CST).  */
3678*e4b17023SJohn Marino       if (plus_src
3679*e4b17023SJohn Marino 	  && CONST_INT_P (XEXP (plus_src, 1)))
3680*e4b17023SJohn Marino 	plus_cst_src = plus_src;
3681*e4b17023SJohn Marino       else if (REG_P (SET_SRC (old_set))
3682*e4b17023SJohn Marino 	       || plus_src)
3683*e4b17023SJohn Marino 	{
3684*e4b17023SJohn Marino 	  /* Otherwise, see if we have a REG_EQUAL note of the form
3685*e4b17023SJohn Marino 	     (plus (...) CST).  */
3686*e4b17023SJohn Marino 	  rtx links;
3687*e4b17023SJohn Marino 	  for (links = REG_NOTES (insn); links; links = XEXP (links, 1))
3688*e4b17023SJohn Marino 	    {
3689*e4b17023SJohn Marino 	      if ((REG_NOTE_KIND (links) == REG_EQUAL
3690*e4b17023SJohn Marino 		   || REG_NOTE_KIND (links) == REG_EQUIV)
3691*e4b17023SJohn Marino 		  && GET_CODE (XEXP (links, 0)) == PLUS
3692*e4b17023SJohn Marino 		  && CONST_INT_P (XEXP (XEXP (links, 0), 1)))
3693*e4b17023SJohn Marino 		{
3694*e4b17023SJohn Marino 		  plus_cst_src = XEXP (links, 0);
3695*e4b17023SJohn Marino 		  break;
3696*e4b17023SJohn Marino 		}
3697*e4b17023SJohn Marino 	    }
3698*e4b17023SJohn Marino 	}
3699*e4b17023SJohn Marino     }
3700*e4b17023SJohn Marino 
3701*e4b17023SJohn Marino   /* Determine the effects of this insn on elimination offsets.  */
3702*e4b17023SJohn Marino   elimination_effects (old_body, VOIDmode);
3703*e4b17023SJohn Marino 
3704*e4b17023SJohn Marino   /* Eliminate all eliminable registers occurring in operands that
3705*e4b17023SJohn Marino      can be handled by reload.  */
3706*e4b17023SJohn Marino   extract_insn (insn);
3707*e4b17023SJohn Marino   for (i = 0; i < recog_data.n_dups; i++)
3708*e4b17023SJohn Marino     orig_dup[i] = *recog_data.dup_loc[i];
3709*e4b17023SJohn Marino 
3710*e4b17023SJohn Marino   for (i = 0; i < recog_data.n_operands; i++)
3711*e4b17023SJohn Marino     {
3712*e4b17023SJohn Marino       orig_operand[i] = recog_data.operand[i];
3713*e4b17023SJohn Marino 
3714*e4b17023SJohn Marino       /* For an asm statement, every operand is eliminable.  */
3715*e4b17023SJohn Marino       if (insn_is_asm || insn_data[icode].operand[i].eliminable)
3716*e4b17023SJohn Marino 	{
3717*e4b17023SJohn Marino 	  bool is_set_src, in_plus;
3718*e4b17023SJohn Marino 
3719*e4b17023SJohn Marino 	  /* Check for setting a register that we know about.  */
3720*e4b17023SJohn Marino 	  if (recog_data.operand_type[i] != OP_IN
3721*e4b17023SJohn Marino 	      && REG_P (orig_operand[i]))
3722*e4b17023SJohn Marino 	    {
3723*e4b17023SJohn Marino 	      /* If we are assigning to a register that can be eliminated, it
3724*e4b17023SJohn Marino 		 must be as part of a PARALLEL, since the code above handles
3725*e4b17023SJohn Marino 		 single SETs.  We must indicate that we can no longer
3726*e4b17023SJohn Marino 		 eliminate this reg.  */
3727*e4b17023SJohn Marino 	      for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
3728*e4b17023SJohn Marino 		   ep++)
3729*e4b17023SJohn Marino 		if (ep->from_rtx == orig_operand[i])
3730*e4b17023SJohn Marino 		  ep->can_eliminate = 0;
3731*e4b17023SJohn Marino 	    }
3732*e4b17023SJohn Marino 
3733*e4b17023SJohn Marino 	  /* Companion to the above plus substitution, we can allow
3734*e4b17023SJohn Marino 	     invariants as the source of a plain move.  */
3735*e4b17023SJohn Marino 	  is_set_src = false;
3736*e4b17023SJohn Marino 	  if (old_set && recog_data.operand_loc[i] == &SET_SRC (old_set))
3737*e4b17023SJohn Marino 	    is_set_src = true;
3738*e4b17023SJohn Marino 	  if (is_set_src && !sets_reg_p)
3739*e4b17023SJohn Marino 	    note_reg_elim_costly (&SET_SRC (old_set), insn);
3740*e4b17023SJohn Marino 	  in_plus = false;
3741*e4b17023SJohn Marino 	  if (plus_src && sets_reg_p
3742*e4b17023SJohn Marino 	      && (recog_data.operand_loc[i] == &XEXP (plus_src, 0)
3743*e4b17023SJohn Marino 		  || recog_data.operand_loc[i] == &XEXP (plus_src, 1)))
3744*e4b17023SJohn Marino 	    in_plus = true;
3745*e4b17023SJohn Marino 
3746*e4b17023SJohn Marino 	  eliminate_regs_1 (recog_data.operand[i], VOIDmode,
3747*e4b17023SJohn Marino 			    NULL_RTX,
3748*e4b17023SJohn Marino 			    is_set_src || in_plus, true);
3749*e4b17023SJohn Marino 	  /* Terminate the search in check_eliminable_occurrences at
3750*e4b17023SJohn Marino 	     this point.  */
3751*e4b17023SJohn Marino 	  *recog_data.operand_loc[i] = 0;
3752*e4b17023SJohn Marino 	}
3753*e4b17023SJohn Marino     }
3754*e4b17023SJohn Marino 
3755*e4b17023SJohn Marino   for (i = 0; i < recog_data.n_dups; i++)
3756*e4b17023SJohn Marino     *recog_data.dup_loc[i]
3757*e4b17023SJohn Marino       = *recog_data.operand_loc[(int) recog_data.dup_num[i]];
3758*e4b17023SJohn Marino 
3759*e4b17023SJohn Marino   /* If any eliminable remain, they aren't eliminable anymore.  */
3760*e4b17023SJohn Marino   check_eliminable_occurrences (old_body);
3761*e4b17023SJohn Marino 
3762*e4b17023SJohn Marino   /* Restore the old body.  */
3763*e4b17023SJohn Marino   for (i = 0; i < recog_data.n_operands; i++)
3764*e4b17023SJohn Marino     *recog_data.operand_loc[i] = orig_operand[i];
3765*e4b17023SJohn Marino   for (i = 0; i < recog_data.n_dups; i++)
3766*e4b17023SJohn Marino     *recog_data.dup_loc[i] = orig_dup[i];
3767*e4b17023SJohn Marino 
3768*e4b17023SJohn Marino   /* Update all elimination pairs to reflect the status after the current
3769*e4b17023SJohn Marino      insn.  The changes we make were determined by the earlier call to
3770*e4b17023SJohn Marino      elimination_effects.  */
3771*e4b17023SJohn Marino 
3772*e4b17023SJohn Marino   for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
3773*e4b17023SJohn Marino     {
3774*e4b17023SJohn Marino       if (ep->previous_offset != ep->offset && ep->ref_outside_mem)
3775*e4b17023SJohn Marino 	ep->can_eliminate = 0;
3776*e4b17023SJohn Marino 
3777*e4b17023SJohn Marino       ep->ref_outside_mem = 0;
3778*e4b17023SJohn Marino     }
3779*e4b17023SJohn Marino 
3780*e4b17023SJohn Marino   return;
3781*e4b17023SJohn Marino }
3782*e4b17023SJohn Marino 
3783*e4b17023SJohn Marino /* Loop through all elimination pairs.
3784*e4b17023SJohn Marino    Recalculate the number not at initial offset.
3785*e4b17023SJohn Marino 
3786*e4b17023SJohn Marino    Compute the maximum offset (minimum offset if the stack does not
3787*e4b17023SJohn Marino    grow downward) for each elimination pair.  */
3788*e4b17023SJohn Marino 
3789*e4b17023SJohn Marino static void
update_eliminable_offsets(void)3790*e4b17023SJohn Marino update_eliminable_offsets (void)
3791*e4b17023SJohn Marino {
3792*e4b17023SJohn Marino   struct elim_table *ep;
3793*e4b17023SJohn Marino 
3794*e4b17023SJohn Marino   num_not_at_initial_offset = 0;
3795*e4b17023SJohn Marino   for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
3796*e4b17023SJohn Marino     {
3797*e4b17023SJohn Marino       ep->previous_offset = ep->offset;
3798*e4b17023SJohn Marino       if (ep->can_eliminate && ep->offset != ep->initial_offset)
3799*e4b17023SJohn Marino 	num_not_at_initial_offset++;
3800*e4b17023SJohn Marino     }
3801*e4b17023SJohn Marino }
3802*e4b17023SJohn Marino 
3803*e4b17023SJohn Marino /* Given X, a SET or CLOBBER of DEST, if DEST is the target of a register
3804*e4b17023SJohn Marino    replacement we currently believe is valid, mark it as not eliminable if X
3805*e4b17023SJohn Marino    modifies DEST in any way other than by adding a constant integer to it.
3806*e4b17023SJohn Marino 
3807*e4b17023SJohn Marino    If DEST is the frame pointer, we do nothing because we assume that
3808*e4b17023SJohn Marino    all assignments to the hard frame pointer are nonlocal gotos and are being
3809*e4b17023SJohn Marino    done at a time when they are valid and do not disturb anything else.
3810*e4b17023SJohn Marino    Some machines want to eliminate a fake argument pointer with either the
3811*e4b17023SJohn Marino    frame or stack pointer.  Assignments to the hard frame pointer must not
3812*e4b17023SJohn Marino    prevent this elimination.
3813*e4b17023SJohn Marino 
3814*e4b17023SJohn Marino    Called via note_stores from reload before starting its passes to scan
3815*e4b17023SJohn Marino    the insns of the function.  */
3816*e4b17023SJohn Marino 
3817*e4b17023SJohn Marino static void
mark_not_eliminable(rtx dest,const_rtx x,void * data ATTRIBUTE_UNUSED)3818*e4b17023SJohn Marino mark_not_eliminable (rtx dest, const_rtx x, void *data ATTRIBUTE_UNUSED)
3819*e4b17023SJohn Marino {
3820*e4b17023SJohn Marino   unsigned int i;
3821*e4b17023SJohn Marino 
3822*e4b17023SJohn Marino   /* A SUBREG of a hard register here is just changing its mode.  We should
3823*e4b17023SJohn Marino      not see a SUBREG of an eliminable hard register, but check just in
3824*e4b17023SJohn Marino      case.  */
3825*e4b17023SJohn Marino   if (GET_CODE (dest) == SUBREG)
3826*e4b17023SJohn Marino     dest = SUBREG_REG (dest);
3827*e4b17023SJohn Marino 
3828*e4b17023SJohn Marino   if (dest == hard_frame_pointer_rtx)
3829*e4b17023SJohn Marino     return;
3830*e4b17023SJohn Marino 
3831*e4b17023SJohn Marino   for (i = 0; i < NUM_ELIMINABLE_REGS; i++)
3832*e4b17023SJohn Marino     if (reg_eliminate[i].can_eliminate && dest == reg_eliminate[i].to_rtx
3833*e4b17023SJohn Marino 	&& (GET_CODE (x) != SET
3834*e4b17023SJohn Marino 	    || GET_CODE (SET_SRC (x)) != PLUS
3835*e4b17023SJohn Marino 	    || XEXP (SET_SRC (x), 0) != dest
3836*e4b17023SJohn Marino 	    || !CONST_INT_P (XEXP (SET_SRC (x), 1))))
3837*e4b17023SJohn Marino       {
3838*e4b17023SJohn Marino 	reg_eliminate[i].can_eliminate_previous
3839*e4b17023SJohn Marino 	  = reg_eliminate[i].can_eliminate = 0;
3840*e4b17023SJohn Marino 	num_eliminable--;
3841*e4b17023SJohn Marino       }
3842*e4b17023SJohn Marino }
3843*e4b17023SJohn Marino 
3844*e4b17023SJohn Marino /* Verify that the initial elimination offsets did not change since the
3845*e4b17023SJohn Marino    last call to set_initial_elim_offsets.  This is used to catch cases
3846*e4b17023SJohn Marino    where something illegal happened during reload_as_needed that could
3847*e4b17023SJohn Marino    cause incorrect code to be generated if we did not check for it.  */
3848*e4b17023SJohn Marino 
3849*e4b17023SJohn Marino static bool
verify_initial_elim_offsets(void)3850*e4b17023SJohn Marino verify_initial_elim_offsets (void)
3851*e4b17023SJohn Marino {
3852*e4b17023SJohn Marino   HOST_WIDE_INT t;
3853*e4b17023SJohn Marino 
3854*e4b17023SJohn Marino   if (!num_eliminable)
3855*e4b17023SJohn Marino     return true;
3856*e4b17023SJohn Marino 
3857*e4b17023SJohn Marino #ifdef ELIMINABLE_REGS
3858*e4b17023SJohn Marino   {
3859*e4b17023SJohn Marino    struct elim_table *ep;
3860*e4b17023SJohn Marino 
3861*e4b17023SJohn Marino    for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
3862*e4b17023SJohn Marino      {
3863*e4b17023SJohn Marino        INITIAL_ELIMINATION_OFFSET (ep->from, ep->to, t);
3864*e4b17023SJohn Marino        if (t != ep->initial_offset)
3865*e4b17023SJohn Marino 	 return false;
3866*e4b17023SJohn Marino      }
3867*e4b17023SJohn Marino   }
3868*e4b17023SJohn Marino #else
3869*e4b17023SJohn Marino   INITIAL_FRAME_POINTER_OFFSET (t);
3870*e4b17023SJohn Marino   if (t != reg_eliminate[0].initial_offset)
3871*e4b17023SJohn Marino     return false;
3872*e4b17023SJohn Marino #endif
3873*e4b17023SJohn Marino 
3874*e4b17023SJohn Marino   return true;
3875*e4b17023SJohn Marino }
3876*e4b17023SJohn Marino 
3877*e4b17023SJohn Marino /* Reset all offsets on eliminable registers to their initial values.  */
3878*e4b17023SJohn Marino 
3879*e4b17023SJohn Marino static void
set_initial_elim_offsets(void)3880*e4b17023SJohn Marino set_initial_elim_offsets (void)
3881*e4b17023SJohn Marino {
3882*e4b17023SJohn Marino   struct elim_table *ep = reg_eliminate;
3883*e4b17023SJohn Marino 
3884*e4b17023SJohn Marino #ifdef ELIMINABLE_REGS
3885*e4b17023SJohn Marino   for (; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
3886*e4b17023SJohn Marino     {
3887*e4b17023SJohn Marino       INITIAL_ELIMINATION_OFFSET (ep->from, ep->to, ep->initial_offset);
3888*e4b17023SJohn Marino       ep->previous_offset = ep->offset = ep->initial_offset;
3889*e4b17023SJohn Marino     }
3890*e4b17023SJohn Marino #else
3891*e4b17023SJohn Marino   INITIAL_FRAME_POINTER_OFFSET (ep->initial_offset);
3892*e4b17023SJohn Marino   ep->previous_offset = ep->offset = ep->initial_offset;
3893*e4b17023SJohn Marino #endif
3894*e4b17023SJohn Marino 
3895*e4b17023SJohn Marino   num_not_at_initial_offset = 0;
3896*e4b17023SJohn Marino }
3897*e4b17023SJohn Marino 
3898*e4b17023SJohn Marino /* Subroutine of set_initial_label_offsets called via for_each_eh_label.  */
3899*e4b17023SJohn Marino 
3900*e4b17023SJohn Marino static void
set_initial_eh_label_offset(rtx label)3901*e4b17023SJohn Marino set_initial_eh_label_offset (rtx label)
3902*e4b17023SJohn Marino {
3903*e4b17023SJohn Marino   set_label_offsets (label, NULL_RTX, 1);
3904*e4b17023SJohn Marino }
3905*e4b17023SJohn Marino 
3906*e4b17023SJohn Marino /* Initialize the known label offsets.
3907*e4b17023SJohn Marino    Set a known offset for each forced label to be at the initial offset
3908*e4b17023SJohn Marino    of each elimination.  We do this because we assume that all
3909*e4b17023SJohn Marino    computed jumps occur from a location where each elimination is
3910*e4b17023SJohn Marino    at its initial offset.
3911*e4b17023SJohn Marino    For all other labels, show that we don't know the offsets.  */
3912*e4b17023SJohn Marino 
3913*e4b17023SJohn Marino static void
set_initial_label_offsets(void)3914*e4b17023SJohn Marino set_initial_label_offsets (void)
3915*e4b17023SJohn Marino {
3916*e4b17023SJohn Marino   rtx x;
3917*e4b17023SJohn Marino   memset (offsets_known_at, 0, num_labels);
3918*e4b17023SJohn Marino 
3919*e4b17023SJohn Marino   for (x = forced_labels; x; x = XEXP (x, 1))
3920*e4b17023SJohn Marino     if (XEXP (x, 0))
3921*e4b17023SJohn Marino       set_label_offsets (XEXP (x, 0), NULL_RTX, 1);
3922*e4b17023SJohn Marino 
3923*e4b17023SJohn Marino   for (x = nonlocal_goto_handler_labels; x; x = XEXP (x, 1))
3924*e4b17023SJohn Marino     if (XEXP (x, 0))
3925*e4b17023SJohn Marino       set_label_offsets (XEXP (x, 0), NULL_RTX, 1);
3926*e4b17023SJohn Marino 
3927*e4b17023SJohn Marino   for_each_eh_label (set_initial_eh_label_offset);
3928*e4b17023SJohn Marino }
3929*e4b17023SJohn Marino 
3930*e4b17023SJohn Marino /* Set all elimination offsets to the known values for the code label given
3931*e4b17023SJohn Marino    by INSN.  */
3932*e4b17023SJohn Marino 
3933*e4b17023SJohn Marino static void
set_offsets_for_label(rtx insn)3934*e4b17023SJohn Marino set_offsets_for_label (rtx insn)
3935*e4b17023SJohn Marino {
3936*e4b17023SJohn Marino   unsigned int i;
3937*e4b17023SJohn Marino   int label_nr = CODE_LABEL_NUMBER (insn);
3938*e4b17023SJohn Marino   struct elim_table *ep;
3939*e4b17023SJohn Marino 
3940*e4b17023SJohn Marino   num_not_at_initial_offset = 0;
3941*e4b17023SJohn Marino   for (i = 0, ep = reg_eliminate; i < NUM_ELIMINABLE_REGS; ep++, i++)
3942*e4b17023SJohn Marino     {
3943*e4b17023SJohn Marino       ep->offset = ep->previous_offset
3944*e4b17023SJohn Marino 		 = offsets_at[label_nr - first_label_num][i];
3945*e4b17023SJohn Marino       if (ep->can_eliminate && ep->offset != ep->initial_offset)
3946*e4b17023SJohn Marino 	num_not_at_initial_offset++;
3947*e4b17023SJohn Marino     }
3948*e4b17023SJohn Marino }
3949*e4b17023SJohn Marino 
3950*e4b17023SJohn Marino /* See if anything that happened changes which eliminations are valid.
3951*e4b17023SJohn Marino    For example, on the SPARC, whether or not the frame pointer can
3952*e4b17023SJohn Marino    be eliminated can depend on what registers have been used.  We need
3953*e4b17023SJohn Marino    not check some conditions again (such as flag_omit_frame_pointer)
3954*e4b17023SJohn Marino    since they can't have changed.  */
3955*e4b17023SJohn Marino 
3956*e4b17023SJohn Marino static void
update_eliminables(HARD_REG_SET * pset)3957*e4b17023SJohn Marino update_eliminables (HARD_REG_SET *pset)
3958*e4b17023SJohn Marino {
3959*e4b17023SJohn Marino   int previous_frame_pointer_needed = frame_pointer_needed;
3960*e4b17023SJohn Marino   struct elim_table *ep;
3961*e4b17023SJohn Marino 
3962*e4b17023SJohn Marino   for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
3963*e4b17023SJohn Marino     if ((ep->from == HARD_FRAME_POINTER_REGNUM
3964*e4b17023SJohn Marino          && targetm.frame_pointer_required ())
3965*e4b17023SJohn Marino #ifdef ELIMINABLE_REGS
3966*e4b17023SJohn Marino 	|| ! targetm.can_eliminate (ep->from, ep->to)
3967*e4b17023SJohn Marino #endif
3968*e4b17023SJohn Marino 	)
3969*e4b17023SJohn Marino       ep->can_eliminate = 0;
3970*e4b17023SJohn Marino 
3971*e4b17023SJohn Marino   /* Look for the case where we have discovered that we can't replace
3972*e4b17023SJohn Marino      register A with register B and that means that we will now be
3973*e4b17023SJohn Marino      trying to replace register A with register C.  This means we can
3974*e4b17023SJohn Marino      no longer replace register C with register B and we need to disable
3975*e4b17023SJohn Marino      such an elimination, if it exists.  This occurs often with A == ap,
3976*e4b17023SJohn Marino      B == sp, and C == fp.  */
3977*e4b17023SJohn Marino 
3978*e4b17023SJohn Marino   for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
3979*e4b17023SJohn Marino     {
3980*e4b17023SJohn Marino       struct elim_table *op;
3981*e4b17023SJohn Marino       int new_to = -1;
3982*e4b17023SJohn Marino 
3983*e4b17023SJohn Marino       if (! ep->can_eliminate && ep->can_eliminate_previous)
3984*e4b17023SJohn Marino 	{
3985*e4b17023SJohn Marino 	  /* Find the current elimination for ep->from, if there is a
3986*e4b17023SJohn Marino 	     new one.  */
3987*e4b17023SJohn Marino 	  for (op = reg_eliminate;
3988*e4b17023SJohn Marino 	       op < &reg_eliminate[NUM_ELIMINABLE_REGS]; op++)
3989*e4b17023SJohn Marino 	    if (op->from == ep->from && op->can_eliminate)
3990*e4b17023SJohn Marino 	      {
3991*e4b17023SJohn Marino 		new_to = op->to;
3992*e4b17023SJohn Marino 		break;
3993*e4b17023SJohn Marino 	      }
3994*e4b17023SJohn Marino 
3995*e4b17023SJohn Marino 	  /* See if there is an elimination of NEW_TO -> EP->TO.  If so,
3996*e4b17023SJohn Marino 	     disable it.  */
3997*e4b17023SJohn Marino 	  for (op = reg_eliminate;
3998*e4b17023SJohn Marino 	       op < &reg_eliminate[NUM_ELIMINABLE_REGS]; op++)
3999*e4b17023SJohn Marino 	    if (op->from == new_to && op->to == ep->to)
4000*e4b17023SJohn Marino 	      op->can_eliminate = 0;
4001*e4b17023SJohn Marino 	}
4002*e4b17023SJohn Marino     }
4003*e4b17023SJohn Marino 
4004*e4b17023SJohn Marino   /* See if any registers that we thought we could eliminate the previous
4005*e4b17023SJohn Marino      time are no longer eliminable.  If so, something has changed and we
4006*e4b17023SJohn Marino      must spill the register.  Also, recompute the number of eliminable
4007*e4b17023SJohn Marino      registers and see if the frame pointer is needed; it is if there is
4008*e4b17023SJohn Marino      no elimination of the frame pointer that we can perform.  */
4009*e4b17023SJohn Marino 
4010*e4b17023SJohn Marino   frame_pointer_needed = 1;
4011*e4b17023SJohn Marino   for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
4012*e4b17023SJohn Marino     {
4013*e4b17023SJohn Marino       if (ep->can_eliminate
4014*e4b17023SJohn Marino 	  && ep->from == FRAME_POINTER_REGNUM
4015*e4b17023SJohn Marino 	  && ep->to != HARD_FRAME_POINTER_REGNUM
4016*e4b17023SJohn Marino 	  && (! SUPPORTS_STACK_ALIGNMENT
4017*e4b17023SJohn Marino 	      || ! crtl->stack_realign_needed))
4018*e4b17023SJohn Marino 	frame_pointer_needed = 0;
4019*e4b17023SJohn Marino 
4020*e4b17023SJohn Marino       if (! ep->can_eliminate && ep->can_eliminate_previous)
4021*e4b17023SJohn Marino 	{
4022*e4b17023SJohn Marino 	  ep->can_eliminate_previous = 0;
4023*e4b17023SJohn Marino 	  SET_HARD_REG_BIT (*pset, ep->from);
4024*e4b17023SJohn Marino 	  num_eliminable--;
4025*e4b17023SJohn Marino 	}
4026*e4b17023SJohn Marino     }
4027*e4b17023SJohn Marino 
4028*e4b17023SJohn Marino   /* If we didn't need a frame pointer last time, but we do now, spill
4029*e4b17023SJohn Marino      the hard frame pointer.  */
4030*e4b17023SJohn Marino   if (frame_pointer_needed && ! previous_frame_pointer_needed)
4031*e4b17023SJohn Marino     SET_HARD_REG_BIT (*pset, HARD_FRAME_POINTER_REGNUM);
4032*e4b17023SJohn Marino }
4033*e4b17023SJohn Marino 
4034*e4b17023SJohn Marino /* Return true if X is used as the target register of an elimination.  */
4035*e4b17023SJohn Marino 
4036*e4b17023SJohn Marino bool
elimination_target_reg_p(rtx x)4037*e4b17023SJohn Marino elimination_target_reg_p (rtx x)
4038*e4b17023SJohn Marino {
4039*e4b17023SJohn Marino   struct elim_table *ep;
4040*e4b17023SJohn Marino 
4041*e4b17023SJohn Marino   for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
4042*e4b17023SJohn Marino     if (ep->to_rtx == x && ep->can_eliminate)
4043*e4b17023SJohn Marino       return true;
4044*e4b17023SJohn Marino 
4045*e4b17023SJohn Marino   return false;
4046*e4b17023SJohn Marino }
4047*e4b17023SJohn Marino 
4048*e4b17023SJohn Marino /* Initialize the table of registers to eliminate.
4049*e4b17023SJohn Marino    Pre-condition: global flag frame_pointer_needed has been set before
4050*e4b17023SJohn Marino    calling this function.  */
4051*e4b17023SJohn Marino 
4052*e4b17023SJohn Marino static void
init_elim_table(void)4053*e4b17023SJohn Marino init_elim_table (void)
4054*e4b17023SJohn Marino {
4055*e4b17023SJohn Marino   struct elim_table *ep;
4056*e4b17023SJohn Marino #ifdef ELIMINABLE_REGS
4057*e4b17023SJohn Marino   const struct elim_table_1 *ep1;
4058*e4b17023SJohn Marino #endif
4059*e4b17023SJohn Marino 
4060*e4b17023SJohn Marino   if (!reg_eliminate)
4061*e4b17023SJohn Marino     reg_eliminate = XCNEWVEC (struct elim_table, NUM_ELIMINABLE_REGS);
4062*e4b17023SJohn Marino 
4063*e4b17023SJohn Marino   num_eliminable = 0;
4064*e4b17023SJohn Marino 
4065*e4b17023SJohn Marino #ifdef ELIMINABLE_REGS
4066*e4b17023SJohn Marino   for (ep = reg_eliminate, ep1 = reg_eliminate_1;
4067*e4b17023SJohn Marino        ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++, ep1++)
4068*e4b17023SJohn Marino     {
4069*e4b17023SJohn Marino       ep->from = ep1->from;
4070*e4b17023SJohn Marino       ep->to = ep1->to;
4071*e4b17023SJohn Marino       ep->can_eliminate = ep->can_eliminate_previous
4072*e4b17023SJohn Marino 	= (targetm.can_eliminate (ep->from, ep->to)
4073*e4b17023SJohn Marino 	   && ! (ep->to == STACK_POINTER_REGNUM
4074*e4b17023SJohn Marino 		 && frame_pointer_needed
4075*e4b17023SJohn Marino 		 && (! SUPPORTS_STACK_ALIGNMENT
4076*e4b17023SJohn Marino 		     || ! stack_realign_fp)));
4077*e4b17023SJohn Marino     }
4078*e4b17023SJohn Marino #else
4079*e4b17023SJohn Marino   reg_eliminate[0].from = reg_eliminate_1[0].from;
4080*e4b17023SJohn Marino   reg_eliminate[0].to = reg_eliminate_1[0].to;
4081*e4b17023SJohn Marino   reg_eliminate[0].can_eliminate = reg_eliminate[0].can_eliminate_previous
4082*e4b17023SJohn Marino     = ! frame_pointer_needed;
4083*e4b17023SJohn Marino #endif
4084*e4b17023SJohn Marino 
4085*e4b17023SJohn Marino   /* Count the number of eliminable registers and build the FROM and TO
4086*e4b17023SJohn Marino      REG rtx's.  Note that code in gen_rtx_REG will cause, e.g.,
4087*e4b17023SJohn Marino      gen_rtx_REG (Pmode, STACK_POINTER_REGNUM) to equal stack_pointer_rtx.
4088*e4b17023SJohn Marino      We depend on this.  */
4089*e4b17023SJohn Marino   for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
4090*e4b17023SJohn Marino     {
4091*e4b17023SJohn Marino       num_eliminable += ep->can_eliminate;
4092*e4b17023SJohn Marino       ep->from_rtx = gen_rtx_REG (Pmode, ep->from);
4093*e4b17023SJohn Marino       ep->to_rtx = gen_rtx_REG (Pmode, ep->to);
4094*e4b17023SJohn Marino     }
4095*e4b17023SJohn Marino }
4096*e4b17023SJohn Marino 
4097*e4b17023SJohn Marino /* Find all the pseudo registers that didn't get hard regs
4098*e4b17023SJohn Marino    but do have known equivalent constants or memory slots.
4099*e4b17023SJohn Marino    These include parameters (known equivalent to parameter slots)
4100*e4b17023SJohn Marino    and cse'd or loop-moved constant memory addresses.
4101*e4b17023SJohn Marino 
4102*e4b17023SJohn Marino    Record constant equivalents in reg_equiv_constant
4103*e4b17023SJohn Marino    so they will be substituted by find_reloads.
4104*e4b17023SJohn Marino    Record memory equivalents in reg_mem_equiv so they can
4105*e4b17023SJohn Marino    be substituted eventually by altering the REG-rtx's.  */
4106*e4b17023SJohn Marino 
4107*e4b17023SJohn Marino static void
init_eliminable_invariants(rtx first,bool do_subregs)4108*e4b17023SJohn Marino init_eliminable_invariants (rtx first, bool do_subregs)
4109*e4b17023SJohn Marino {
4110*e4b17023SJohn Marino   int i;
4111*e4b17023SJohn Marino   rtx insn;
4112*e4b17023SJohn Marino 
4113*e4b17023SJohn Marino   grow_reg_equivs ();
4114*e4b17023SJohn Marino   if (do_subregs)
4115*e4b17023SJohn Marino     reg_max_ref_width = XCNEWVEC (unsigned int, max_regno);
4116*e4b17023SJohn Marino   else
4117*e4b17023SJohn Marino     reg_max_ref_width = NULL;
4118*e4b17023SJohn Marino 
4119*e4b17023SJohn Marino   num_eliminable_invariants = 0;
4120*e4b17023SJohn Marino 
4121*e4b17023SJohn Marino   first_label_num = get_first_label_num ();
4122*e4b17023SJohn Marino   num_labels = max_label_num () - first_label_num;
4123*e4b17023SJohn Marino 
4124*e4b17023SJohn Marino   /* Allocate the tables used to store offset information at labels.  */
4125*e4b17023SJohn Marino   offsets_known_at = XNEWVEC (char, num_labels);
4126*e4b17023SJohn Marino   offsets_at = (HOST_WIDE_INT (*)[NUM_ELIMINABLE_REGS]) xmalloc (num_labels * NUM_ELIMINABLE_REGS * sizeof (HOST_WIDE_INT));
4127*e4b17023SJohn Marino 
4128*e4b17023SJohn Marino /* Look for REG_EQUIV notes; record what each pseudo is equivalent
4129*e4b17023SJohn Marino    to.  If DO_SUBREGS is true, also find all paradoxical subregs and
4130*e4b17023SJohn Marino    find largest such for each pseudo.  FIRST is the head of the insn
4131*e4b17023SJohn Marino    list.  */
4132*e4b17023SJohn Marino 
4133*e4b17023SJohn Marino   for (insn = first; insn; insn = NEXT_INSN (insn))
4134*e4b17023SJohn Marino     {
4135*e4b17023SJohn Marino       rtx set = single_set (insn);
4136*e4b17023SJohn Marino 
4137*e4b17023SJohn Marino       /* We may introduce USEs that we want to remove at the end, so
4138*e4b17023SJohn Marino 	 we'll mark them with QImode.  Make sure there are no
4139*e4b17023SJohn Marino 	 previously-marked insns left by say regmove.  */
4140*e4b17023SJohn Marino       if (INSN_P (insn) && GET_CODE (PATTERN (insn)) == USE
4141*e4b17023SJohn Marino 	  && GET_MODE (insn) != VOIDmode)
4142*e4b17023SJohn Marino 	PUT_MODE (insn, VOIDmode);
4143*e4b17023SJohn Marino 
4144*e4b17023SJohn Marino       if (do_subregs && NONDEBUG_INSN_P (insn))
4145*e4b17023SJohn Marino 	scan_paradoxical_subregs (PATTERN (insn));
4146*e4b17023SJohn Marino 
4147*e4b17023SJohn Marino       if (set != 0 && REG_P (SET_DEST (set)))
4148*e4b17023SJohn Marino 	{
4149*e4b17023SJohn Marino 	  rtx note = find_reg_note (insn, REG_EQUIV, NULL_RTX);
4150*e4b17023SJohn Marino 	  rtx x;
4151*e4b17023SJohn Marino 
4152*e4b17023SJohn Marino 	  if (! note)
4153*e4b17023SJohn Marino 	    continue;
4154*e4b17023SJohn Marino 
4155*e4b17023SJohn Marino 	  i = REGNO (SET_DEST (set));
4156*e4b17023SJohn Marino 	  x = XEXP (note, 0);
4157*e4b17023SJohn Marino 
4158*e4b17023SJohn Marino 	  if (i <= LAST_VIRTUAL_REGISTER)
4159*e4b17023SJohn Marino 	    continue;
4160*e4b17023SJohn Marino 
4161*e4b17023SJohn Marino 	  /* If flag_pic and we have constant, verify it's legitimate.  */
4162*e4b17023SJohn Marino 	  if (!CONSTANT_P (x)
4163*e4b17023SJohn Marino 	      || !flag_pic || LEGITIMATE_PIC_OPERAND_P (x))
4164*e4b17023SJohn Marino 	    {
4165*e4b17023SJohn Marino 	      /* It can happen that a REG_EQUIV note contains a MEM
4166*e4b17023SJohn Marino 		 that is not a legitimate memory operand.  As later
4167*e4b17023SJohn Marino 		 stages of reload assume that all addresses found
4168*e4b17023SJohn Marino 		 in the reg_equiv_* arrays were originally legitimate,
4169*e4b17023SJohn Marino 		 we ignore such REG_EQUIV notes.  */
4170*e4b17023SJohn Marino 	      if (memory_operand (x, VOIDmode))
4171*e4b17023SJohn Marino 		{
4172*e4b17023SJohn Marino 		  /* Always unshare the equivalence, so we can
4173*e4b17023SJohn Marino 		     substitute into this insn without touching the
4174*e4b17023SJohn Marino 		       equivalence.  */
4175*e4b17023SJohn Marino 		  reg_equiv_memory_loc (i) = copy_rtx (x);
4176*e4b17023SJohn Marino 		}
4177*e4b17023SJohn Marino 	      else if (function_invariant_p (x))
4178*e4b17023SJohn Marino 		{
4179*e4b17023SJohn Marino 		  enum machine_mode mode;
4180*e4b17023SJohn Marino 
4181*e4b17023SJohn Marino 		  mode = GET_MODE (SET_DEST (set));
4182*e4b17023SJohn Marino 		  if (GET_CODE (x) == PLUS)
4183*e4b17023SJohn Marino 		    {
4184*e4b17023SJohn Marino 		      /* This is PLUS of frame pointer and a constant,
4185*e4b17023SJohn Marino 			 and might be shared.  Unshare it.  */
4186*e4b17023SJohn Marino 		      reg_equiv_invariant (i) = copy_rtx (x);
4187*e4b17023SJohn Marino 		      num_eliminable_invariants++;
4188*e4b17023SJohn Marino 		    }
4189*e4b17023SJohn Marino 		  else if (x == frame_pointer_rtx || x == arg_pointer_rtx)
4190*e4b17023SJohn Marino 		    {
4191*e4b17023SJohn Marino 		      reg_equiv_invariant (i) = x;
4192*e4b17023SJohn Marino 		      num_eliminable_invariants++;
4193*e4b17023SJohn Marino 		    }
4194*e4b17023SJohn Marino 		  else if (targetm.legitimate_constant_p (mode, x))
4195*e4b17023SJohn Marino 		    reg_equiv_constant (i) = x;
4196*e4b17023SJohn Marino 		  else
4197*e4b17023SJohn Marino 		    {
4198*e4b17023SJohn Marino 		      reg_equiv_memory_loc (i) = force_const_mem (mode, x);
4199*e4b17023SJohn Marino 		      if (! reg_equiv_memory_loc (i))
4200*e4b17023SJohn Marino 			reg_equiv_init (i) = NULL_RTX;
4201*e4b17023SJohn Marino 		    }
4202*e4b17023SJohn Marino 		}
4203*e4b17023SJohn Marino 	      else
4204*e4b17023SJohn Marino 		{
4205*e4b17023SJohn Marino 		  reg_equiv_init (i) = NULL_RTX;
4206*e4b17023SJohn Marino 		  continue;
4207*e4b17023SJohn Marino 		}
4208*e4b17023SJohn Marino 	    }
4209*e4b17023SJohn Marino 	  else
4210*e4b17023SJohn Marino 	    reg_equiv_init (i) = NULL_RTX;
4211*e4b17023SJohn Marino 	}
4212*e4b17023SJohn Marino     }
4213*e4b17023SJohn Marino 
4214*e4b17023SJohn Marino   if (dump_file)
4215*e4b17023SJohn Marino     for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
4216*e4b17023SJohn Marino       if (reg_equiv_init (i))
4217*e4b17023SJohn Marino 	{
4218*e4b17023SJohn Marino 	  fprintf (dump_file, "init_insns for %u: ", i);
4219*e4b17023SJohn Marino 	  print_inline_rtx (dump_file, reg_equiv_init (i), 20);
4220*e4b17023SJohn Marino 	  fprintf (dump_file, "\n");
4221*e4b17023SJohn Marino 	}
4222*e4b17023SJohn Marino }
4223*e4b17023SJohn Marino 
4224*e4b17023SJohn Marino /* Indicate that we no longer have known memory locations or constants.
4225*e4b17023SJohn Marino    Free all data involved in tracking these.  */
4226*e4b17023SJohn Marino 
4227*e4b17023SJohn Marino static void
free_reg_equiv(void)4228*e4b17023SJohn Marino free_reg_equiv (void)
4229*e4b17023SJohn Marino {
4230*e4b17023SJohn Marino   int i;
4231*e4b17023SJohn Marino 
4232*e4b17023SJohn Marino 
4233*e4b17023SJohn Marino   free (offsets_known_at);
4234*e4b17023SJohn Marino   free (offsets_at);
4235*e4b17023SJohn Marino   offsets_at = 0;
4236*e4b17023SJohn Marino   offsets_known_at = 0;
4237*e4b17023SJohn Marino 
4238*e4b17023SJohn Marino   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4239*e4b17023SJohn Marino     if (reg_equiv_alt_mem_list (i))
4240*e4b17023SJohn Marino       free_EXPR_LIST_list (&reg_equiv_alt_mem_list (i));
4241*e4b17023SJohn Marino   VEC_free (reg_equivs_t, gc, reg_equivs);
4242*e4b17023SJohn Marino   reg_equivs = NULL;
4243*e4b17023SJohn Marino 
4244*e4b17023SJohn Marino }
4245*e4b17023SJohn Marino 
4246*e4b17023SJohn Marino /* Kick all pseudos out of hard register REGNO.
4247*e4b17023SJohn Marino 
4248*e4b17023SJohn Marino    If CANT_ELIMINATE is nonzero, it means that we are doing this spill
4249*e4b17023SJohn Marino    because we found we can't eliminate some register.  In the case, no pseudos
4250*e4b17023SJohn Marino    are allowed to be in the register, even if they are only in a block that
4251*e4b17023SJohn Marino    doesn't require spill registers, unlike the case when we are spilling this
4252*e4b17023SJohn Marino    hard reg to produce another spill register.
4253*e4b17023SJohn Marino 
4254*e4b17023SJohn Marino    Return nonzero if any pseudos needed to be kicked out.  */
4255*e4b17023SJohn Marino 
4256*e4b17023SJohn Marino static void
spill_hard_reg(unsigned int regno,int cant_eliminate)4257*e4b17023SJohn Marino spill_hard_reg (unsigned int regno, int cant_eliminate)
4258*e4b17023SJohn Marino {
4259*e4b17023SJohn Marino   int i;
4260*e4b17023SJohn Marino 
4261*e4b17023SJohn Marino   if (cant_eliminate)
4262*e4b17023SJohn Marino     {
4263*e4b17023SJohn Marino       SET_HARD_REG_BIT (bad_spill_regs_global, regno);
4264*e4b17023SJohn Marino       df_set_regs_ever_live (regno, true);
4265*e4b17023SJohn Marino     }
4266*e4b17023SJohn Marino 
4267*e4b17023SJohn Marino   /* Spill every pseudo reg that was allocated to this reg
4268*e4b17023SJohn Marino      or to something that overlaps this reg.  */
4269*e4b17023SJohn Marino 
4270*e4b17023SJohn Marino   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
4271*e4b17023SJohn Marino     if (reg_renumber[i] >= 0
4272*e4b17023SJohn Marino 	&& (unsigned int) reg_renumber[i] <= regno
4273*e4b17023SJohn Marino 	&& end_hard_regno (PSEUDO_REGNO_MODE (i), reg_renumber[i]) > regno)
4274*e4b17023SJohn Marino       SET_REGNO_REG_SET (&spilled_pseudos, i);
4275*e4b17023SJohn Marino }
4276*e4b17023SJohn Marino 
4277*e4b17023SJohn Marino /* After find_reload_regs has been run for all insn that need reloads,
4278*e4b17023SJohn Marino    and/or spill_hard_regs was called, this function is used to actually
4279*e4b17023SJohn Marino    spill pseudo registers and try to reallocate them.  It also sets up the
4280*e4b17023SJohn Marino    spill_regs array for use by choose_reload_regs.  */
4281*e4b17023SJohn Marino 
4282*e4b17023SJohn Marino static int
finish_spills(int global)4283*e4b17023SJohn Marino finish_spills (int global)
4284*e4b17023SJohn Marino {
4285*e4b17023SJohn Marino   struct insn_chain *chain;
4286*e4b17023SJohn Marino   int something_changed = 0;
4287*e4b17023SJohn Marino   unsigned i;
4288*e4b17023SJohn Marino   reg_set_iterator rsi;
4289*e4b17023SJohn Marino 
4290*e4b17023SJohn Marino   /* Build the spill_regs array for the function.  */
4291*e4b17023SJohn Marino   /* If there are some registers still to eliminate and one of the spill regs
4292*e4b17023SJohn Marino      wasn't ever used before, additional stack space may have to be
4293*e4b17023SJohn Marino      allocated to store this register.  Thus, we may have changed the offset
4294*e4b17023SJohn Marino      between the stack and frame pointers, so mark that something has changed.
4295*e4b17023SJohn Marino 
4296*e4b17023SJohn Marino      One might think that we need only set VAL to 1 if this is a call-used
4297*e4b17023SJohn Marino      register.  However, the set of registers that must be saved by the
4298*e4b17023SJohn Marino      prologue is not identical to the call-used set.  For example, the
4299*e4b17023SJohn Marino      register used by the call insn for the return PC is a call-used register,
4300*e4b17023SJohn Marino      but must be saved by the prologue.  */
4301*e4b17023SJohn Marino 
4302*e4b17023SJohn Marino   n_spills = 0;
4303*e4b17023SJohn Marino   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4304*e4b17023SJohn Marino     if (TEST_HARD_REG_BIT (used_spill_regs, i))
4305*e4b17023SJohn Marino       {
4306*e4b17023SJohn Marino 	spill_reg_order[i] = n_spills;
4307*e4b17023SJohn Marino 	spill_regs[n_spills++] = i;
4308*e4b17023SJohn Marino 	if (num_eliminable && ! df_regs_ever_live_p (i))
4309*e4b17023SJohn Marino 	  something_changed = 1;
4310*e4b17023SJohn Marino 	df_set_regs_ever_live (i, true);
4311*e4b17023SJohn Marino       }
4312*e4b17023SJohn Marino     else
4313*e4b17023SJohn Marino       spill_reg_order[i] = -1;
4314*e4b17023SJohn Marino 
4315*e4b17023SJohn Marino   EXECUTE_IF_SET_IN_REG_SET (&spilled_pseudos, FIRST_PSEUDO_REGISTER, i, rsi)
4316*e4b17023SJohn Marino     if (! ira_conflicts_p || reg_renumber[i] >= 0)
4317*e4b17023SJohn Marino       {
4318*e4b17023SJohn Marino 	/* Record the current hard register the pseudo is allocated to
4319*e4b17023SJohn Marino 	   in pseudo_previous_regs so we avoid reallocating it to the
4320*e4b17023SJohn Marino 	   same hard reg in a later pass.  */
4321*e4b17023SJohn Marino 	gcc_assert (reg_renumber[i] >= 0);
4322*e4b17023SJohn Marino 
4323*e4b17023SJohn Marino 	SET_HARD_REG_BIT (pseudo_previous_regs[i], reg_renumber[i]);
4324*e4b17023SJohn Marino 	/* Mark it as no longer having a hard register home.  */
4325*e4b17023SJohn Marino 	reg_renumber[i] = -1;
4326*e4b17023SJohn Marino 	if (ira_conflicts_p)
4327*e4b17023SJohn Marino 	  /* Inform IRA about the change.  */
4328*e4b17023SJohn Marino 	  ira_mark_allocation_change (i);
4329*e4b17023SJohn Marino 	/* We will need to scan everything again.  */
4330*e4b17023SJohn Marino 	something_changed = 1;
4331*e4b17023SJohn Marino       }
4332*e4b17023SJohn Marino 
4333*e4b17023SJohn Marino   /* Retry global register allocation if possible.  */
4334*e4b17023SJohn Marino   if (global && ira_conflicts_p)
4335*e4b17023SJohn Marino     {
4336*e4b17023SJohn Marino       unsigned int n;
4337*e4b17023SJohn Marino 
4338*e4b17023SJohn Marino       memset (pseudo_forbidden_regs, 0, max_regno * sizeof (HARD_REG_SET));
4339*e4b17023SJohn Marino       /* For every insn that needs reloads, set the registers used as spill
4340*e4b17023SJohn Marino 	 regs in pseudo_forbidden_regs for every pseudo live across the
4341*e4b17023SJohn Marino 	 insn.  */
4342*e4b17023SJohn Marino       for (chain = insns_need_reload; chain; chain = chain->next_need_reload)
4343*e4b17023SJohn Marino 	{
4344*e4b17023SJohn Marino 	  EXECUTE_IF_SET_IN_REG_SET
4345*e4b17023SJohn Marino 	    (&chain->live_throughout, FIRST_PSEUDO_REGISTER, i, rsi)
4346*e4b17023SJohn Marino 	    {
4347*e4b17023SJohn Marino 	      IOR_HARD_REG_SET (pseudo_forbidden_regs[i],
4348*e4b17023SJohn Marino 				chain->used_spill_regs);
4349*e4b17023SJohn Marino 	    }
4350*e4b17023SJohn Marino 	  EXECUTE_IF_SET_IN_REG_SET
4351*e4b17023SJohn Marino 	    (&chain->dead_or_set, FIRST_PSEUDO_REGISTER, i, rsi)
4352*e4b17023SJohn Marino 	    {
4353*e4b17023SJohn Marino 	      IOR_HARD_REG_SET (pseudo_forbidden_regs[i],
4354*e4b17023SJohn Marino 				chain->used_spill_regs);
4355*e4b17023SJohn Marino 	    }
4356*e4b17023SJohn Marino 	}
4357*e4b17023SJohn Marino 
4358*e4b17023SJohn Marino       /* Retry allocating the pseudos spilled in IRA and the
4359*e4b17023SJohn Marino 	 reload.  For each reg, merge the various reg sets that
4360*e4b17023SJohn Marino 	 indicate which hard regs can't be used, and call
4361*e4b17023SJohn Marino 	 ira_reassign_pseudos.  */
4362*e4b17023SJohn Marino       for (n = 0, i = FIRST_PSEUDO_REGISTER; i < (unsigned) max_regno; i++)
4363*e4b17023SJohn Marino 	if (reg_old_renumber[i] != reg_renumber[i])
4364*e4b17023SJohn Marino 	  {
4365*e4b17023SJohn Marino 	    if (reg_renumber[i] < 0)
4366*e4b17023SJohn Marino 	      temp_pseudo_reg_arr[n++] = i;
4367*e4b17023SJohn Marino 	    else
4368*e4b17023SJohn Marino 	      CLEAR_REGNO_REG_SET (&spilled_pseudos, i);
4369*e4b17023SJohn Marino 	  }
4370*e4b17023SJohn Marino       if (ira_reassign_pseudos (temp_pseudo_reg_arr, n,
4371*e4b17023SJohn Marino 				bad_spill_regs_global,
4372*e4b17023SJohn Marino 				pseudo_forbidden_regs, pseudo_previous_regs,
4373*e4b17023SJohn Marino 				&spilled_pseudos))
4374*e4b17023SJohn Marino 	something_changed = 1;
4375*e4b17023SJohn Marino     }
4376*e4b17023SJohn Marino   /* Fix up the register information in the insn chain.
4377*e4b17023SJohn Marino      This involves deleting those of the spilled pseudos which did not get
4378*e4b17023SJohn Marino      a new hard register home from the live_{before,after} sets.  */
4379*e4b17023SJohn Marino   for (chain = reload_insn_chain; chain; chain = chain->next)
4380*e4b17023SJohn Marino     {
4381*e4b17023SJohn Marino       HARD_REG_SET used_by_pseudos;
4382*e4b17023SJohn Marino       HARD_REG_SET used_by_pseudos2;
4383*e4b17023SJohn Marino 
4384*e4b17023SJohn Marino       if (! ira_conflicts_p)
4385*e4b17023SJohn Marino 	{
4386*e4b17023SJohn Marino 	  /* Don't do it for IRA because IRA and the reload still can
4387*e4b17023SJohn Marino 	     assign hard registers to the spilled pseudos on next
4388*e4b17023SJohn Marino 	     reload iterations.  */
4389*e4b17023SJohn Marino 	  AND_COMPL_REG_SET (&chain->live_throughout, &spilled_pseudos);
4390*e4b17023SJohn Marino 	  AND_COMPL_REG_SET (&chain->dead_or_set, &spilled_pseudos);
4391*e4b17023SJohn Marino 	}
4392*e4b17023SJohn Marino       /* Mark any unallocated hard regs as available for spills.  That
4393*e4b17023SJohn Marino 	 makes inheritance work somewhat better.  */
4394*e4b17023SJohn Marino       if (chain->need_reload)
4395*e4b17023SJohn Marino 	{
4396*e4b17023SJohn Marino 	  REG_SET_TO_HARD_REG_SET (used_by_pseudos, &chain->live_throughout);
4397*e4b17023SJohn Marino 	  REG_SET_TO_HARD_REG_SET (used_by_pseudos2, &chain->dead_or_set);
4398*e4b17023SJohn Marino 	  IOR_HARD_REG_SET (used_by_pseudos, used_by_pseudos2);
4399*e4b17023SJohn Marino 
4400*e4b17023SJohn Marino 	  compute_use_by_pseudos (&used_by_pseudos, &chain->live_throughout);
4401*e4b17023SJohn Marino 	  compute_use_by_pseudos (&used_by_pseudos, &chain->dead_or_set);
4402*e4b17023SJohn Marino 	  /* Value of chain->used_spill_regs from previous iteration
4403*e4b17023SJohn Marino 	     may be not included in the value calculated here because
4404*e4b17023SJohn Marino 	     of possible removing caller-saves insns (see function
4405*e4b17023SJohn Marino 	     delete_caller_save_insns.  */
4406*e4b17023SJohn Marino 	  COMPL_HARD_REG_SET (chain->used_spill_regs, used_by_pseudos);
4407*e4b17023SJohn Marino 	  AND_HARD_REG_SET (chain->used_spill_regs, used_spill_regs);
4408*e4b17023SJohn Marino 	}
4409*e4b17023SJohn Marino     }
4410*e4b17023SJohn Marino 
4411*e4b17023SJohn Marino   CLEAR_REG_SET (&changed_allocation_pseudos);
4412*e4b17023SJohn Marino   /* Let alter_reg modify the reg rtx's for the modified pseudos.  */
4413*e4b17023SJohn Marino   for (i = FIRST_PSEUDO_REGISTER; i < (unsigned)max_regno; i++)
4414*e4b17023SJohn Marino     {
4415*e4b17023SJohn Marino       int regno = reg_renumber[i];
4416*e4b17023SJohn Marino       if (reg_old_renumber[i] == regno)
4417*e4b17023SJohn Marino 	continue;
4418*e4b17023SJohn Marino 
4419*e4b17023SJohn Marino       SET_REGNO_REG_SET (&changed_allocation_pseudos, i);
4420*e4b17023SJohn Marino 
4421*e4b17023SJohn Marino       alter_reg (i, reg_old_renumber[i], false);
4422*e4b17023SJohn Marino       reg_old_renumber[i] = regno;
4423*e4b17023SJohn Marino       if (dump_file)
4424*e4b17023SJohn Marino 	{
4425*e4b17023SJohn Marino 	  if (regno == -1)
4426*e4b17023SJohn Marino 	    fprintf (dump_file, " Register %d now on stack.\n\n", i);
4427*e4b17023SJohn Marino 	  else
4428*e4b17023SJohn Marino 	    fprintf (dump_file, " Register %d now in %d.\n\n",
4429*e4b17023SJohn Marino 		     i, reg_renumber[i]);
4430*e4b17023SJohn Marino 	}
4431*e4b17023SJohn Marino     }
4432*e4b17023SJohn Marino 
4433*e4b17023SJohn Marino   return something_changed;
4434*e4b17023SJohn Marino }
4435*e4b17023SJohn Marino 
4436*e4b17023SJohn Marino /* Find all paradoxical subregs within X and update reg_max_ref_width.  */
4437*e4b17023SJohn Marino 
4438*e4b17023SJohn Marino static void
scan_paradoxical_subregs(rtx x)4439*e4b17023SJohn Marino scan_paradoxical_subregs (rtx x)
4440*e4b17023SJohn Marino {
4441*e4b17023SJohn Marino   int i;
4442*e4b17023SJohn Marino   const char *fmt;
4443*e4b17023SJohn Marino   enum rtx_code code = GET_CODE (x);
4444*e4b17023SJohn Marino 
4445*e4b17023SJohn Marino   switch (code)
4446*e4b17023SJohn Marino     {
4447*e4b17023SJohn Marino     case REG:
4448*e4b17023SJohn Marino     case CONST_INT:
4449*e4b17023SJohn Marino     case CONST:
4450*e4b17023SJohn Marino     case SYMBOL_REF:
4451*e4b17023SJohn Marino     case LABEL_REF:
4452*e4b17023SJohn Marino     case CONST_DOUBLE:
4453*e4b17023SJohn Marino     case CONST_FIXED:
4454*e4b17023SJohn Marino     case CONST_VECTOR: /* shouldn't happen, but just in case.  */
4455*e4b17023SJohn Marino     case CC0:
4456*e4b17023SJohn Marino     case PC:
4457*e4b17023SJohn Marino     case USE:
4458*e4b17023SJohn Marino     case CLOBBER:
4459*e4b17023SJohn Marino       return;
4460*e4b17023SJohn Marino 
4461*e4b17023SJohn Marino     case SUBREG:
4462*e4b17023SJohn Marino       if (REG_P (SUBREG_REG (x))
4463*e4b17023SJohn Marino 	  && (GET_MODE_SIZE (GET_MODE (x))
4464*e4b17023SJohn Marino 	      > reg_max_ref_width[REGNO (SUBREG_REG (x))]))
4465*e4b17023SJohn Marino 	{
4466*e4b17023SJohn Marino 	  reg_max_ref_width[REGNO (SUBREG_REG (x))]
4467*e4b17023SJohn Marino 	    = GET_MODE_SIZE (GET_MODE (x));
4468*e4b17023SJohn Marino 	  mark_home_live_1 (REGNO (SUBREG_REG (x)), GET_MODE (x));
4469*e4b17023SJohn Marino 	}
4470*e4b17023SJohn Marino       return;
4471*e4b17023SJohn Marino 
4472*e4b17023SJohn Marino     default:
4473*e4b17023SJohn Marino       break;
4474*e4b17023SJohn Marino     }
4475*e4b17023SJohn Marino 
4476*e4b17023SJohn Marino   fmt = GET_RTX_FORMAT (code);
4477*e4b17023SJohn Marino   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
4478*e4b17023SJohn Marino     {
4479*e4b17023SJohn Marino       if (fmt[i] == 'e')
4480*e4b17023SJohn Marino 	scan_paradoxical_subregs (XEXP (x, i));
4481*e4b17023SJohn Marino       else if (fmt[i] == 'E')
4482*e4b17023SJohn Marino 	{
4483*e4b17023SJohn Marino 	  int j;
4484*e4b17023SJohn Marino 	  for (j = XVECLEN (x, i) - 1; j >= 0; j--)
4485*e4b17023SJohn Marino 	    scan_paradoxical_subregs (XVECEXP (x, i, j));
4486*e4b17023SJohn Marino 	}
4487*e4b17023SJohn Marino     }
4488*e4b17023SJohn Marino }
4489*e4b17023SJohn Marino 
4490*e4b17023SJohn Marino /* *OP_PTR and *OTHER_PTR are two operands to a conceptual reload.
4491*e4b17023SJohn Marino    If *OP_PTR is a paradoxical subreg, try to remove that subreg
4492*e4b17023SJohn Marino    and apply the corresponding narrowing subreg to *OTHER_PTR.
4493*e4b17023SJohn Marino    Return true if the operands were changed, false otherwise.  */
4494*e4b17023SJohn Marino 
4495*e4b17023SJohn Marino static bool
strip_paradoxical_subreg(rtx * op_ptr,rtx * other_ptr)4496*e4b17023SJohn Marino strip_paradoxical_subreg (rtx *op_ptr, rtx *other_ptr)
4497*e4b17023SJohn Marino {
4498*e4b17023SJohn Marino   rtx op, inner, other, tem;
4499*e4b17023SJohn Marino 
4500*e4b17023SJohn Marino   op = *op_ptr;
4501*e4b17023SJohn Marino   if (!paradoxical_subreg_p (op))
4502*e4b17023SJohn Marino     return false;
4503*e4b17023SJohn Marino   inner = SUBREG_REG (op);
4504*e4b17023SJohn Marino 
4505*e4b17023SJohn Marino   other = *other_ptr;
4506*e4b17023SJohn Marino   tem = gen_lowpart_common (GET_MODE (inner), other);
4507*e4b17023SJohn Marino   if (!tem)
4508*e4b17023SJohn Marino     return false;
4509*e4b17023SJohn Marino 
4510*e4b17023SJohn Marino   /* If the lowpart operation turned a hard register into a subreg,
4511*e4b17023SJohn Marino      rather than simplifying it to another hard register, then the
4512*e4b17023SJohn Marino      mode change cannot be properly represented.  For example, OTHER
4513*e4b17023SJohn Marino      might be valid in its current mode, but not in the new one.  */
4514*e4b17023SJohn Marino   if (GET_CODE (tem) == SUBREG
4515*e4b17023SJohn Marino       && REG_P (other)
4516*e4b17023SJohn Marino       && HARD_REGISTER_P (other))
4517*e4b17023SJohn Marino     return false;
4518*e4b17023SJohn Marino 
4519*e4b17023SJohn Marino   *op_ptr = inner;
4520*e4b17023SJohn Marino   *other_ptr = tem;
4521*e4b17023SJohn Marino   return true;
4522*e4b17023SJohn Marino }
4523*e4b17023SJohn Marino 
4524*e4b17023SJohn Marino /* A subroutine of reload_as_needed.  If INSN has a REG_EH_REGION note,
4525*e4b17023SJohn Marino    examine all of the reload insns between PREV and NEXT exclusive, and
4526*e4b17023SJohn Marino    annotate all that may trap.  */
4527*e4b17023SJohn Marino 
4528*e4b17023SJohn Marino static void
fixup_eh_region_note(rtx insn,rtx prev,rtx next)4529*e4b17023SJohn Marino fixup_eh_region_note (rtx insn, rtx prev, rtx next)
4530*e4b17023SJohn Marino {
4531*e4b17023SJohn Marino   rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
4532*e4b17023SJohn Marino   if (note == NULL)
4533*e4b17023SJohn Marino     return;
4534*e4b17023SJohn Marino   if (!insn_could_throw_p (insn))
4535*e4b17023SJohn Marino     remove_note (insn, note);
4536*e4b17023SJohn Marino   copy_reg_eh_region_note_forward (note, NEXT_INSN (prev), next);
4537*e4b17023SJohn Marino }
4538*e4b17023SJohn Marino 
4539*e4b17023SJohn Marino /* Reload pseudo-registers into hard regs around each insn as needed.
4540*e4b17023SJohn Marino    Additional register load insns are output before the insn that needs it
4541*e4b17023SJohn Marino    and perhaps store insns after insns that modify the reloaded pseudo reg.
4542*e4b17023SJohn Marino 
4543*e4b17023SJohn Marino    reg_last_reload_reg and reg_reloaded_contents keep track of
4544*e4b17023SJohn Marino    which registers are already available in reload registers.
4545*e4b17023SJohn Marino    We update these for the reloads that we perform,
4546*e4b17023SJohn Marino    as the insns are scanned.  */
4547*e4b17023SJohn Marino 
4548*e4b17023SJohn Marino static void
reload_as_needed(int live_known)4549*e4b17023SJohn Marino reload_as_needed (int live_known)
4550*e4b17023SJohn Marino {
4551*e4b17023SJohn Marino   struct insn_chain *chain;
4552*e4b17023SJohn Marino #if defined (AUTO_INC_DEC)
4553*e4b17023SJohn Marino   int i;
4554*e4b17023SJohn Marino #endif
4555*e4b17023SJohn Marino   rtx x, marker;
4556*e4b17023SJohn Marino 
4557*e4b17023SJohn Marino   memset (spill_reg_rtx, 0, sizeof spill_reg_rtx);
4558*e4b17023SJohn Marino   memset (spill_reg_store, 0, sizeof spill_reg_store);
4559*e4b17023SJohn Marino   reg_last_reload_reg = XCNEWVEC (rtx, max_regno);
4560*e4b17023SJohn Marino   INIT_REG_SET (&reg_has_output_reload);
4561*e4b17023SJohn Marino   CLEAR_HARD_REG_SET (reg_reloaded_valid);
4562*e4b17023SJohn Marino   CLEAR_HARD_REG_SET (reg_reloaded_call_part_clobbered);
4563*e4b17023SJohn Marino 
4564*e4b17023SJohn Marino   set_initial_elim_offsets ();
4565*e4b17023SJohn Marino 
4566*e4b17023SJohn Marino   /* Generate a marker insn that we will move around.  */
4567*e4b17023SJohn Marino   marker = emit_note (NOTE_INSN_DELETED);
4568*e4b17023SJohn Marino   unlink_insn_chain (marker, marker);
4569*e4b17023SJohn Marino 
4570*e4b17023SJohn Marino   for (chain = reload_insn_chain; chain; chain = chain->next)
4571*e4b17023SJohn Marino     {
4572*e4b17023SJohn Marino       rtx prev = 0;
4573*e4b17023SJohn Marino       rtx insn = chain->insn;
4574*e4b17023SJohn Marino       rtx old_next = NEXT_INSN (insn);
4575*e4b17023SJohn Marino #ifdef AUTO_INC_DEC
4576*e4b17023SJohn Marino       rtx old_prev = PREV_INSN (insn);
4577*e4b17023SJohn Marino #endif
4578*e4b17023SJohn Marino 
4579*e4b17023SJohn Marino       /* If we pass a label, copy the offsets from the label information
4580*e4b17023SJohn Marino 	 into the current offsets of each elimination.  */
4581*e4b17023SJohn Marino       if (LABEL_P (insn))
4582*e4b17023SJohn Marino 	set_offsets_for_label (insn);
4583*e4b17023SJohn Marino 
4584*e4b17023SJohn Marino       else if (INSN_P (insn))
4585*e4b17023SJohn Marino 	{
4586*e4b17023SJohn Marino 	  regset_head regs_to_forget;
4587*e4b17023SJohn Marino 	  INIT_REG_SET (&regs_to_forget);
4588*e4b17023SJohn Marino 	  note_stores (PATTERN (insn), forget_old_reloads_1, &regs_to_forget);
4589*e4b17023SJohn Marino 
4590*e4b17023SJohn Marino 	  /* If this is a USE and CLOBBER of a MEM, ensure that any
4591*e4b17023SJohn Marino 	     references to eliminable registers have been removed.  */
4592*e4b17023SJohn Marino 
4593*e4b17023SJohn Marino 	  if ((GET_CODE (PATTERN (insn)) == USE
4594*e4b17023SJohn Marino 	       || GET_CODE (PATTERN (insn)) == CLOBBER)
4595*e4b17023SJohn Marino 	      && MEM_P (XEXP (PATTERN (insn), 0)))
4596*e4b17023SJohn Marino 	    XEXP (XEXP (PATTERN (insn), 0), 0)
4597*e4b17023SJohn Marino 	      = eliminate_regs (XEXP (XEXP (PATTERN (insn), 0), 0),
4598*e4b17023SJohn Marino 				GET_MODE (XEXP (PATTERN (insn), 0)),
4599*e4b17023SJohn Marino 				NULL_RTX);
4600*e4b17023SJohn Marino 
4601*e4b17023SJohn Marino 	  /* If we need to do register elimination processing, do so.
4602*e4b17023SJohn Marino 	     This might delete the insn, in which case we are done.  */
4603*e4b17023SJohn Marino 	  if ((num_eliminable || num_eliminable_invariants) && chain->need_elim)
4604*e4b17023SJohn Marino 	    {
4605*e4b17023SJohn Marino 	      eliminate_regs_in_insn (insn, 1);
4606*e4b17023SJohn Marino 	      if (NOTE_P (insn))
4607*e4b17023SJohn Marino 		{
4608*e4b17023SJohn Marino 		  update_eliminable_offsets ();
4609*e4b17023SJohn Marino 		  CLEAR_REG_SET (&regs_to_forget);
4610*e4b17023SJohn Marino 		  continue;
4611*e4b17023SJohn Marino 		}
4612*e4b17023SJohn Marino 	    }
4613*e4b17023SJohn Marino 
4614*e4b17023SJohn Marino 	  /* If need_elim is nonzero but need_reload is zero, one might think
4615*e4b17023SJohn Marino 	     that we could simply set n_reloads to 0.  However, find_reloads
4616*e4b17023SJohn Marino 	     could have done some manipulation of the insn (such as swapping
4617*e4b17023SJohn Marino 	     commutative operands), and these manipulations are lost during
4618*e4b17023SJohn Marino 	     the first pass for every insn that needs register elimination.
4619*e4b17023SJohn Marino 	     So the actions of find_reloads must be redone here.  */
4620*e4b17023SJohn Marino 
4621*e4b17023SJohn Marino 	  if (! chain->need_elim && ! chain->need_reload
4622*e4b17023SJohn Marino 	      && ! chain->need_operand_change)
4623*e4b17023SJohn Marino 	    n_reloads = 0;
4624*e4b17023SJohn Marino 	  /* First find the pseudo regs that must be reloaded for this insn.
4625*e4b17023SJohn Marino 	     This info is returned in the tables reload_... (see reload.h).
4626*e4b17023SJohn Marino 	     Also modify the body of INSN by substituting RELOAD
4627*e4b17023SJohn Marino 	     rtx's for those pseudo regs.  */
4628*e4b17023SJohn Marino 	  else
4629*e4b17023SJohn Marino 	    {
4630*e4b17023SJohn Marino 	      CLEAR_REG_SET (&reg_has_output_reload);
4631*e4b17023SJohn Marino 	      CLEAR_HARD_REG_SET (reg_is_output_reload);
4632*e4b17023SJohn Marino 
4633*e4b17023SJohn Marino 	      find_reloads (insn, 1, spill_indirect_levels, live_known,
4634*e4b17023SJohn Marino 			    spill_reg_order);
4635*e4b17023SJohn Marino 	    }
4636*e4b17023SJohn Marino 
4637*e4b17023SJohn Marino 	  if (n_reloads > 0)
4638*e4b17023SJohn Marino 	    {
4639*e4b17023SJohn Marino 	      rtx next = NEXT_INSN (insn);
4640*e4b17023SJohn Marino 	      rtx p;
4641*e4b17023SJohn Marino 
4642*e4b17023SJohn Marino 	      /* ??? PREV can get deleted by reload inheritance.
4643*e4b17023SJohn Marino 		 Work around this by emitting a marker note.  */
4644*e4b17023SJohn Marino 	      prev = PREV_INSN (insn);
4645*e4b17023SJohn Marino 	      reorder_insns_nobb (marker, marker, prev);
4646*e4b17023SJohn Marino 
4647*e4b17023SJohn Marino 	      /* Now compute which reload regs to reload them into.  Perhaps
4648*e4b17023SJohn Marino 		 reusing reload regs from previous insns, or else output
4649*e4b17023SJohn Marino 		 load insns to reload them.  Maybe output store insns too.
4650*e4b17023SJohn Marino 		 Record the choices of reload reg in reload_reg_rtx.  */
4651*e4b17023SJohn Marino 	      choose_reload_regs (chain);
4652*e4b17023SJohn Marino 
4653*e4b17023SJohn Marino 	      /* Generate the insns to reload operands into or out of
4654*e4b17023SJohn Marino 		 their reload regs.  */
4655*e4b17023SJohn Marino 	      emit_reload_insns (chain);
4656*e4b17023SJohn Marino 
4657*e4b17023SJohn Marino 	      /* Substitute the chosen reload regs from reload_reg_rtx
4658*e4b17023SJohn Marino 		 into the insn's body (or perhaps into the bodies of other
4659*e4b17023SJohn Marino 		 load and store insn that we just made for reloading
4660*e4b17023SJohn Marino 		 and that we moved the structure into).  */
4661*e4b17023SJohn Marino 	      subst_reloads (insn);
4662*e4b17023SJohn Marino 
4663*e4b17023SJohn Marino 	      prev = PREV_INSN (marker);
4664*e4b17023SJohn Marino 	      unlink_insn_chain (marker, marker);
4665*e4b17023SJohn Marino 
4666*e4b17023SJohn Marino 	      /* Adjust the exception region notes for loads and stores.  */
4667*e4b17023SJohn Marino 	      if (cfun->can_throw_non_call_exceptions && !CALL_P (insn))
4668*e4b17023SJohn Marino 		fixup_eh_region_note (insn, prev, next);
4669*e4b17023SJohn Marino 
4670*e4b17023SJohn Marino 	      /* Adjust the location of REG_ARGS_SIZE.  */
4671*e4b17023SJohn Marino 	      p = find_reg_note (insn, REG_ARGS_SIZE, NULL_RTX);
4672*e4b17023SJohn Marino 	      if (p)
4673*e4b17023SJohn Marino 		{
4674*e4b17023SJohn Marino 		  remove_note (insn, p);
4675*e4b17023SJohn Marino 		  fixup_args_size_notes (prev, PREV_INSN (next),
4676*e4b17023SJohn Marino 					 INTVAL (XEXP (p, 0)));
4677*e4b17023SJohn Marino 		}
4678*e4b17023SJohn Marino 
4679*e4b17023SJohn Marino 	      /* If this was an ASM, make sure that all the reload insns
4680*e4b17023SJohn Marino 		 we have generated are valid.  If not, give an error
4681*e4b17023SJohn Marino 		 and delete them.  */
4682*e4b17023SJohn Marino 	      if (asm_noperands (PATTERN (insn)) >= 0)
4683*e4b17023SJohn Marino 		for (p = NEXT_INSN (prev); p != next; p = NEXT_INSN (p))
4684*e4b17023SJohn Marino 		  if (p != insn && INSN_P (p)
4685*e4b17023SJohn Marino 		      && GET_CODE (PATTERN (p)) != USE
4686*e4b17023SJohn Marino 		      && (recog_memoized (p) < 0
4687*e4b17023SJohn Marino 			  || (extract_insn (p), ! constrain_operands (1))))
4688*e4b17023SJohn Marino 		    {
4689*e4b17023SJohn Marino 		      error_for_asm (insn,
4690*e4b17023SJohn Marino 				     "%<asm%> operand requires "
4691*e4b17023SJohn Marino 				     "impossible reload");
4692*e4b17023SJohn Marino 		      delete_insn (p);
4693*e4b17023SJohn Marino 		    }
4694*e4b17023SJohn Marino 	    }
4695*e4b17023SJohn Marino 
4696*e4b17023SJohn Marino 	  if (num_eliminable && chain->need_elim)
4697*e4b17023SJohn Marino 	    update_eliminable_offsets ();
4698*e4b17023SJohn Marino 
4699*e4b17023SJohn Marino 	  /* Any previously reloaded spilled pseudo reg, stored in this insn,
4700*e4b17023SJohn Marino 	     is no longer validly lying around to save a future reload.
4701*e4b17023SJohn Marino 	     Note that this does not detect pseudos that were reloaded
4702*e4b17023SJohn Marino 	     for this insn in order to be stored in
4703*e4b17023SJohn Marino 	     (obeying register constraints).  That is correct; such reload
4704*e4b17023SJohn Marino 	     registers ARE still valid.  */
4705*e4b17023SJohn Marino 	  forget_marked_reloads (&regs_to_forget);
4706*e4b17023SJohn Marino 	  CLEAR_REG_SET (&regs_to_forget);
4707*e4b17023SJohn Marino 
4708*e4b17023SJohn Marino 	  /* There may have been CLOBBER insns placed after INSN.  So scan
4709*e4b17023SJohn Marino 	     between INSN and NEXT and use them to forget old reloads.  */
4710*e4b17023SJohn Marino 	  for (x = NEXT_INSN (insn); x != old_next; x = NEXT_INSN (x))
4711*e4b17023SJohn Marino 	    if (NONJUMP_INSN_P (x) && GET_CODE (PATTERN (x)) == CLOBBER)
4712*e4b17023SJohn Marino 	      note_stores (PATTERN (x), forget_old_reloads_1, NULL);
4713*e4b17023SJohn Marino 
4714*e4b17023SJohn Marino #ifdef AUTO_INC_DEC
4715*e4b17023SJohn Marino 	  /* Likewise for regs altered by auto-increment in this insn.
4716*e4b17023SJohn Marino 	     REG_INC notes have been changed by reloading:
4717*e4b17023SJohn Marino 	     find_reloads_address_1 records substitutions for them,
4718*e4b17023SJohn Marino 	     which have been performed by subst_reloads above.  */
4719*e4b17023SJohn Marino 	  for (i = n_reloads - 1; i >= 0; i--)
4720*e4b17023SJohn Marino 	    {
4721*e4b17023SJohn Marino 	      rtx in_reg = rld[i].in_reg;
4722*e4b17023SJohn Marino 	      if (in_reg)
4723*e4b17023SJohn Marino 		{
4724*e4b17023SJohn Marino 		  enum rtx_code code = GET_CODE (in_reg);
4725*e4b17023SJohn Marino 		  /* PRE_INC / PRE_DEC will have the reload register ending up
4726*e4b17023SJohn Marino 		     with the same value as the stack slot, but that doesn't
4727*e4b17023SJohn Marino 		     hold true for POST_INC / POST_DEC.  Either we have to
4728*e4b17023SJohn Marino 		     convert the memory access to a true POST_INC / POST_DEC,
4729*e4b17023SJohn Marino 		     or we can't use the reload register for inheritance.  */
4730*e4b17023SJohn Marino 		  if ((code == POST_INC || code == POST_DEC)
4731*e4b17023SJohn Marino 		      && TEST_HARD_REG_BIT (reg_reloaded_valid,
4732*e4b17023SJohn Marino 					    REGNO (rld[i].reg_rtx))
4733*e4b17023SJohn Marino 		      /* Make sure it is the inc/dec pseudo, and not
4734*e4b17023SJohn Marino 			 some other (e.g. output operand) pseudo.  */
4735*e4b17023SJohn Marino 		      && ((unsigned) reg_reloaded_contents[REGNO (rld[i].reg_rtx)]
4736*e4b17023SJohn Marino 			  == REGNO (XEXP (in_reg, 0))))
4737*e4b17023SJohn Marino 
4738*e4b17023SJohn Marino 		    {
4739*e4b17023SJohn Marino 		      rtx reload_reg = rld[i].reg_rtx;
4740*e4b17023SJohn Marino 		      enum machine_mode mode = GET_MODE (reload_reg);
4741*e4b17023SJohn Marino 		      int n = 0;
4742*e4b17023SJohn Marino 		      rtx p;
4743*e4b17023SJohn Marino 
4744*e4b17023SJohn Marino 		      for (p = PREV_INSN (old_next); p != prev; p = PREV_INSN (p))
4745*e4b17023SJohn Marino 			{
4746*e4b17023SJohn Marino 			  /* We really want to ignore REG_INC notes here, so
4747*e4b17023SJohn Marino 			     use PATTERN (p) as argument to reg_set_p .  */
4748*e4b17023SJohn Marino 			  if (reg_set_p (reload_reg, PATTERN (p)))
4749*e4b17023SJohn Marino 			    break;
4750*e4b17023SJohn Marino 			  n = count_occurrences (PATTERN (p), reload_reg, 0);
4751*e4b17023SJohn Marino 			  if (! n)
4752*e4b17023SJohn Marino 			    continue;
4753*e4b17023SJohn Marino 			  if (n == 1)
4754*e4b17023SJohn Marino 			    {
4755*e4b17023SJohn Marino 			      rtx replace_reg
4756*e4b17023SJohn Marino 				= gen_rtx_fmt_e (code, mode, reload_reg);
4757*e4b17023SJohn Marino 
4758*e4b17023SJohn Marino 			      validate_replace_rtx_group (reload_reg,
4759*e4b17023SJohn Marino 							  replace_reg, p);
4760*e4b17023SJohn Marino 			      n = verify_changes (0);
4761*e4b17023SJohn Marino 
4762*e4b17023SJohn Marino 			      /* We must also verify that the constraints
4763*e4b17023SJohn Marino 				 are met after the replacement.  Make sure
4764*e4b17023SJohn Marino 				 extract_insn is only called for an insn
4765*e4b17023SJohn Marino 				 where the replacements were found to be
4766*e4b17023SJohn Marino 				 valid so far. */
4767*e4b17023SJohn Marino 			      if (n)
4768*e4b17023SJohn Marino 				{
4769*e4b17023SJohn Marino 				  extract_insn (p);
4770*e4b17023SJohn Marino 				  n = constrain_operands (1);
4771*e4b17023SJohn Marino 				}
4772*e4b17023SJohn Marino 
4773*e4b17023SJohn Marino 			      /* If the constraints were not met, then
4774*e4b17023SJohn Marino 				 undo the replacement, else confirm it.  */
4775*e4b17023SJohn Marino 			      if (!n)
4776*e4b17023SJohn Marino 				cancel_changes (0);
4777*e4b17023SJohn Marino 			      else
4778*e4b17023SJohn Marino 				confirm_change_group ();
4779*e4b17023SJohn Marino 			    }
4780*e4b17023SJohn Marino 			  break;
4781*e4b17023SJohn Marino 			}
4782*e4b17023SJohn Marino 		      if (n == 1)
4783*e4b17023SJohn Marino 			{
4784*e4b17023SJohn Marino 			  add_reg_note (p, REG_INC, reload_reg);
4785*e4b17023SJohn Marino 			  /* Mark this as having an output reload so that the
4786*e4b17023SJohn Marino 			     REG_INC processing code below won't invalidate
4787*e4b17023SJohn Marino 			     the reload for inheritance.  */
4788*e4b17023SJohn Marino 			  SET_HARD_REG_BIT (reg_is_output_reload,
4789*e4b17023SJohn Marino 					    REGNO (reload_reg));
4790*e4b17023SJohn Marino 			  SET_REGNO_REG_SET (&reg_has_output_reload,
4791*e4b17023SJohn Marino 					     REGNO (XEXP (in_reg, 0)));
4792*e4b17023SJohn Marino 			}
4793*e4b17023SJohn Marino 		      else
4794*e4b17023SJohn Marino 			forget_old_reloads_1 (XEXP (in_reg, 0), NULL_RTX,
4795*e4b17023SJohn Marino 					      NULL);
4796*e4b17023SJohn Marino 		    }
4797*e4b17023SJohn Marino 		  else if ((code == PRE_INC || code == PRE_DEC)
4798*e4b17023SJohn Marino 			   && TEST_HARD_REG_BIT (reg_reloaded_valid,
4799*e4b17023SJohn Marino 						 REGNO (rld[i].reg_rtx))
4800*e4b17023SJohn Marino 			   /* Make sure it is the inc/dec pseudo, and not
4801*e4b17023SJohn Marino 			      some other (e.g. output operand) pseudo.  */
4802*e4b17023SJohn Marino 			   && ((unsigned) reg_reloaded_contents[REGNO (rld[i].reg_rtx)]
4803*e4b17023SJohn Marino 			       == REGNO (XEXP (in_reg, 0))))
4804*e4b17023SJohn Marino 		    {
4805*e4b17023SJohn Marino 		      SET_HARD_REG_BIT (reg_is_output_reload,
4806*e4b17023SJohn Marino 					REGNO (rld[i].reg_rtx));
4807*e4b17023SJohn Marino 		      SET_REGNO_REG_SET (&reg_has_output_reload,
4808*e4b17023SJohn Marino 					 REGNO (XEXP (in_reg, 0)));
4809*e4b17023SJohn Marino 		    }
4810*e4b17023SJohn Marino 		  else if (code == PRE_INC || code == PRE_DEC
4811*e4b17023SJohn Marino 			   || code == POST_INC || code == POST_DEC)
4812*e4b17023SJohn Marino 		    {
4813*e4b17023SJohn Marino 		      int in_regno = REGNO (XEXP (in_reg, 0));
4814*e4b17023SJohn Marino 
4815*e4b17023SJohn Marino 		      if (reg_last_reload_reg[in_regno] != NULL_RTX)
4816*e4b17023SJohn Marino 			{
4817*e4b17023SJohn Marino 			  int in_hard_regno;
4818*e4b17023SJohn Marino 			  bool forget_p = true;
4819*e4b17023SJohn Marino 
4820*e4b17023SJohn Marino 			  in_hard_regno = REGNO (reg_last_reload_reg[in_regno]);
4821*e4b17023SJohn Marino 			  if (TEST_HARD_REG_BIT (reg_reloaded_valid,
4822*e4b17023SJohn Marino 						 in_hard_regno))
4823*e4b17023SJohn Marino 			    {
4824*e4b17023SJohn Marino 			      for (x = old_prev ? NEXT_INSN (old_prev) : insn;
4825*e4b17023SJohn Marino 				   x != old_next;
4826*e4b17023SJohn Marino 				   x = NEXT_INSN (x))
4827*e4b17023SJohn Marino 				if (x == reg_reloaded_insn[in_hard_regno])
4828*e4b17023SJohn Marino 				  {
4829*e4b17023SJohn Marino 				    forget_p = false;
4830*e4b17023SJohn Marino 				    break;
4831*e4b17023SJohn Marino 				  }
4832*e4b17023SJohn Marino 			    }
4833*e4b17023SJohn Marino 			  /* If for some reasons, we didn't set up
4834*e4b17023SJohn Marino 			     reg_last_reload_reg in this insn,
4835*e4b17023SJohn Marino 			     invalidate inheritance from previous
4836*e4b17023SJohn Marino 			     insns for the incremented/decremented
4837*e4b17023SJohn Marino 			     register.  Such registers will be not in
4838*e4b17023SJohn Marino 			     reg_has_output_reload.  Invalidate it
4839*e4b17023SJohn Marino 			     also if the corresponding element in
4840*e4b17023SJohn Marino 			     reg_reloaded_insn is also
4841*e4b17023SJohn Marino 			     invalidated.  */
4842*e4b17023SJohn Marino 			  if (forget_p)
4843*e4b17023SJohn Marino 			    forget_old_reloads_1 (XEXP (in_reg, 0),
4844*e4b17023SJohn Marino 						  NULL_RTX, NULL);
4845*e4b17023SJohn Marino 			}
4846*e4b17023SJohn Marino 		    }
4847*e4b17023SJohn Marino 		}
4848*e4b17023SJohn Marino 	    }
4849*e4b17023SJohn Marino 	  /* If a pseudo that got a hard register is auto-incremented,
4850*e4b17023SJohn Marino 	     we must purge records of copying it into pseudos without
4851*e4b17023SJohn Marino 	     hard registers.  */
4852*e4b17023SJohn Marino 	  for (x = REG_NOTES (insn); x; x = XEXP (x, 1))
4853*e4b17023SJohn Marino 	    if (REG_NOTE_KIND (x) == REG_INC)
4854*e4b17023SJohn Marino 	      {
4855*e4b17023SJohn Marino 		/* See if this pseudo reg was reloaded in this insn.
4856*e4b17023SJohn Marino 		   If so, its last-reload info is still valid
4857*e4b17023SJohn Marino 		   because it is based on this insn's reload.  */
4858*e4b17023SJohn Marino 		for (i = 0; i < n_reloads; i++)
4859*e4b17023SJohn Marino 		  if (rld[i].out == XEXP (x, 0))
4860*e4b17023SJohn Marino 		    break;
4861*e4b17023SJohn Marino 
4862*e4b17023SJohn Marino 		if (i == n_reloads)
4863*e4b17023SJohn Marino 		  forget_old_reloads_1 (XEXP (x, 0), NULL_RTX, NULL);
4864*e4b17023SJohn Marino 	      }
4865*e4b17023SJohn Marino #endif
4866*e4b17023SJohn Marino 	}
4867*e4b17023SJohn Marino       /* A reload reg's contents are unknown after a label.  */
4868*e4b17023SJohn Marino       if (LABEL_P (insn))
4869*e4b17023SJohn Marino 	CLEAR_HARD_REG_SET (reg_reloaded_valid);
4870*e4b17023SJohn Marino 
4871*e4b17023SJohn Marino       /* Don't assume a reload reg is still good after a call insn
4872*e4b17023SJohn Marino 	 if it is a call-used reg, or if it contains a value that will
4873*e4b17023SJohn Marino          be partially clobbered by the call.  */
4874*e4b17023SJohn Marino       else if (CALL_P (insn))
4875*e4b17023SJohn Marino 	{
4876*e4b17023SJohn Marino 	  AND_COMPL_HARD_REG_SET (reg_reloaded_valid, call_used_reg_set);
4877*e4b17023SJohn Marino 	  AND_COMPL_HARD_REG_SET (reg_reloaded_valid, reg_reloaded_call_part_clobbered);
4878*e4b17023SJohn Marino 
4879*e4b17023SJohn Marino 	  /* If this is a call to a setjmp-type function, we must not
4880*e4b17023SJohn Marino 	     reuse any reload reg contents across the call; that will
4881*e4b17023SJohn Marino 	     just be clobbered by other uses of the register in later
4882*e4b17023SJohn Marino 	     code, before the longjmp.  */
4883*e4b17023SJohn Marino 	  if (find_reg_note (insn, REG_SETJMP, NULL_RTX))
4884*e4b17023SJohn Marino 	    CLEAR_HARD_REG_SET (reg_reloaded_valid);
4885*e4b17023SJohn Marino 	}
4886*e4b17023SJohn Marino     }
4887*e4b17023SJohn Marino 
4888*e4b17023SJohn Marino   /* Clean up.  */
4889*e4b17023SJohn Marino   free (reg_last_reload_reg);
4890*e4b17023SJohn Marino   CLEAR_REG_SET (&reg_has_output_reload);
4891*e4b17023SJohn Marino }
4892*e4b17023SJohn Marino 
4893*e4b17023SJohn Marino /* Discard all record of any value reloaded from X,
4894*e4b17023SJohn Marino    or reloaded in X from someplace else;
4895*e4b17023SJohn Marino    unless X is an output reload reg of the current insn.
4896*e4b17023SJohn Marino 
4897*e4b17023SJohn Marino    X may be a hard reg (the reload reg)
4898*e4b17023SJohn Marino    or it may be a pseudo reg that was reloaded from.
4899*e4b17023SJohn Marino 
4900*e4b17023SJohn Marino    When DATA is non-NULL just mark the registers in regset
4901*e4b17023SJohn Marino    to be forgotten later.  */
4902*e4b17023SJohn Marino 
4903*e4b17023SJohn Marino static void
forget_old_reloads_1(rtx x,const_rtx ignored ATTRIBUTE_UNUSED,void * data)4904*e4b17023SJohn Marino forget_old_reloads_1 (rtx x, const_rtx ignored ATTRIBUTE_UNUSED,
4905*e4b17023SJohn Marino 		      void *data)
4906*e4b17023SJohn Marino {
4907*e4b17023SJohn Marino   unsigned int regno;
4908*e4b17023SJohn Marino   unsigned int nr;
4909*e4b17023SJohn Marino   regset regs = (regset) data;
4910*e4b17023SJohn Marino 
4911*e4b17023SJohn Marino   /* note_stores does give us subregs of hard regs,
4912*e4b17023SJohn Marino      subreg_regno_offset requires a hard reg.  */
4913*e4b17023SJohn Marino   while (GET_CODE (x) == SUBREG)
4914*e4b17023SJohn Marino     {
4915*e4b17023SJohn Marino       /* We ignore the subreg offset when calculating the regno,
4916*e4b17023SJohn Marino 	 because we are using the entire underlying hard register
4917*e4b17023SJohn Marino 	 below.  */
4918*e4b17023SJohn Marino       x = SUBREG_REG (x);
4919*e4b17023SJohn Marino     }
4920*e4b17023SJohn Marino 
4921*e4b17023SJohn Marino   if (!REG_P (x))
4922*e4b17023SJohn Marino     return;
4923*e4b17023SJohn Marino 
4924*e4b17023SJohn Marino   regno = REGNO (x);
4925*e4b17023SJohn Marino 
4926*e4b17023SJohn Marino   if (regno >= FIRST_PSEUDO_REGISTER)
4927*e4b17023SJohn Marino     nr = 1;
4928*e4b17023SJohn Marino   else
4929*e4b17023SJohn Marino     {
4930*e4b17023SJohn Marino       unsigned int i;
4931*e4b17023SJohn Marino 
4932*e4b17023SJohn Marino       nr = hard_regno_nregs[regno][GET_MODE (x)];
4933*e4b17023SJohn Marino       /* Storing into a spilled-reg invalidates its contents.
4934*e4b17023SJohn Marino 	 This can happen if a block-local pseudo is allocated to that reg
4935*e4b17023SJohn Marino 	 and it wasn't spilled because this block's total need is 0.
4936*e4b17023SJohn Marino 	 Then some insn might have an optional reload and use this reg.  */
4937*e4b17023SJohn Marino       if (!regs)
4938*e4b17023SJohn Marino 	for (i = 0; i < nr; i++)
4939*e4b17023SJohn Marino 	  /* But don't do this if the reg actually serves as an output
4940*e4b17023SJohn Marino 	     reload reg in the current instruction.  */
4941*e4b17023SJohn Marino 	  if (n_reloads == 0
4942*e4b17023SJohn Marino 	      || ! TEST_HARD_REG_BIT (reg_is_output_reload, regno + i))
4943*e4b17023SJohn Marino 	    {
4944*e4b17023SJohn Marino 	      CLEAR_HARD_REG_BIT (reg_reloaded_valid, regno + i);
4945*e4b17023SJohn Marino 	      spill_reg_store[regno + i] = 0;
4946*e4b17023SJohn Marino 	    }
4947*e4b17023SJohn Marino     }
4948*e4b17023SJohn Marino 
4949*e4b17023SJohn Marino   if (regs)
4950*e4b17023SJohn Marino     while (nr-- > 0)
4951*e4b17023SJohn Marino       SET_REGNO_REG_SET (regs, regno + nr);
4952*e4b17023SJohn Marino   else
4953*e4b17023SJohn Marino     {
4954*e4b17023SJohn Marino       /* Since value of X has changed,
4955*e4b17023SJohn Marino 	 forget any value previously copied from it.  */
4956*e4b17023SJohn Marino 
4957*e4b17023SJohn Marino       while (nr-- > 0)
4958*e4b17023SJohn Marino 	/* But don't forget a copy if this is the output reload
4959*e4b17023SJohn Marino 	   that establishes the copy's validity.  */
4960*e4b17023SJohn Marino 	if (n_reloads == 0
4961*e4b17023SJohn Marino 	    || !REGNO_REG_SET_P (&reg_has_output_reload, regno + nr))
4962*e4b17023SJohn Marino 	  reg_last_reload_reg[regno + nr] = 0;
4963*e4b17023SJohn Marino      }
4964*e4b17023SJohn Marino }
4965*e4b17023SJohn Marino 
4966*e4b17023SJohn Marino /* Forget the reloads marked in regset by previous function.  */
4967*e4b17023SJohn Marino static void
forget_marked_reloads(regset regs)4968*e4b17023SJohn Marino forget_marked_reloads (regset regs)
4969*e4b17023SJohn Marino {
4970*e4b17023SJohn Marino   unsigned int reg;
4971*e4b17023SJohn Marino   reg_set_iterator rsi;
4972*e4b17023SJohn Marino   EXECUTE_IF_SET_IN_REG_SET (regs, 0, reg, rsi)
4973*e4b17023SJohn Marino     {
4974*e4b17023SJohn Marino       if (reg < FIRST_PSEUDO_REGISTER
4975*e4b17023SJohn Marino 	  /* But don't do this if the reg actually serves as an output
4976*e4b17023SJohn Marino 	     reload reg in the current instruction.  */
4977*e4b17023SJohn Marino 	  && (n_reloads == 0
4978*e4b17023SJohn Marino 	      || ! TEST_HARD_REG_BIT (reg_is_output_reload, reg)))
4979*e4b17023SJohn Marino 	  {
4980*e4b17023SJohn Marino 	    CLEAR_HARD_REG_BIT (reg_reloaded_valid, reg);
4981*e4b17023SJohn Marino 	    spill_reg_store[reg] = 0;
4982*e4b17023SJohn Marino 	  }
4983*e4b17023SJohn Marino       if (n_reloads == 0
4984*e4b17023SJohn Marino 	  || !REGNO_REG_SET_P (&reg_has_output_reload, reg))
4985*e4b17023SJohn Marino 	reg_last_reload_reg[reg] = 0;
4986*e4b17023SJohn Marino     }
4987*e4b17023SJohn Marino }
4988*e4b17023SJohn Marino 
4989*e4b17023SJohn Marino /* The following HARD_REG_SETs indicate when each hard register is
4990*e4b17023SJohn Marino    used for a reload of various parts of the current insn.  */
4991*e4b17023SJohn Marino 
4992*e4b17023SJohn Marino /* If reg is unavailable for all reloads.  */
4993*e4b17023SJohn Marino static HARD_REG_SET reload_reg_unavailable;
4994*e4b17023SJohn Marino /* If reg is in use as a reload reg for a RELOAD_OTHER reload.  */
4995*e4b17023SJohn Marino static HARD_REG_SET reload_reg_used;
4996*e4b17023SJohn Marino /* If reg is in use for a RELOAD_FOR_INPUT_ADDRESS reload for operand I.  */
4997*e4b17023SJohn Marino static HARD_REG_SET reload_reg_used_in_input_addr[MAX_RECOG_OPERANDS];
4998*e4b17023SJohn Marino /* If reg is in use for a RELOAD_FOR_INPADDR_ADDRESS reload for operand I.  */
4999*e4b17023SJohn Marino static HARD_REG_SET reload_reg_used_in_inpaddr_addr[MAX_RECOG_OPERANDS];
5000*e4b17023SJohn Marino /* If reg is in use for a RELOAD_FOR_OUTPUT_ADDRESS reload for operand I.  */
5001*e4b17023SJohn Marino static HARD_REG_SET reload_reg_used_in_output_addr[MAX_RECOG_OPERANDS];
5002*e4b17023SJohn Marino /* If reg is in use for a RELOAD_FOR_OUTADDR_ADDRESS reload for operand I.  */
5003*e4b17023SJohn Marino static HARD_REG_SET reload_reg_used_in_outaddr_addr[MAX_RECOG_OPERANDS];
5004*e4b17023SJohn Marino /* If reg is in use for a RELOAD_FOR_INPUT reload for operand I.  */
5005*e4b17023SJohn Marino static HARD_REG_SET reload_reg_used_in_input[MAX_RECOG_OPERANDS];
5006*e4b17023SJohn Marino /* If reg is in use for a RELOAD_FOR_OUTPUT reload for operand I.  */
5007*e4b17023SJohn Marino static HARD_REG_SET reload_reg_used_in_output[MAX_RECOG_OPERANDS];
5008*e4b17023SJohn Marino /* If reg is in use for a RELOAD_FOR_OPERAND_ADDRESS reload.  */
5009*e4b17023SJohn Marino static HARD_REG_SET reload_reg_used_in_op_addr;
5010*e4b17023SJohn Marino /* If reg is in use for a RELOAD_FOR_OPADDR_ADDR reload.  */
5011*e4b17023SJohn Marino static HARD_REG_SET reload_reg_used_in_op_addr_reload;
5012*e4b17023SJohn Marino /* If reg is in use for a RELOAD_FOR_INSN reload.  */
5013*e4b17023SJohn Marino static HARD_REG_SET reload_reg_used_in_insn;
5014*e4b17023SJohn Marino /* If reg is in use for a RELOAD_FOR_OTHER_ADDRESS reload.  */
5015*e4b17023SJohn Marino static HARD_REG_SET reload_reg_used_in_other_addr;
5016*e4b17023SJohn Marino 
5017*e4b17023SJohn Marino /* If reg is in use as a reload reg for any sort of reload.  */
5018*e4b17023SJohn Marino static HARD_REG_SET reload_reg_used_at_all;
5019*e4b17023SJohn Marino 
5020*e4b17023SJohn Marino /* If reg is use as an inherited reload.  We just mark the first register
5021*e4b17023SJohn Marino    in the group.  */
5022*e4b17023SJohn Marino static HARD_REG_SET reload_reg_used_for_inherit;
5023*e4b17023SJohn Marino 
5024*e4b17023SJohn Marino /* Records which hard regs are used in any way, either as explicit use or
5025*e4b17023SJohn Marino    by being allocated to a pseudo during any point of the current insn.  */
5026*e4b17023SJohn Marino static HARD_REG_SET reg_used_in_insn;
5027*e4b17023SJohn Marino 
5028*e4b17023SJohn Marino /* Mark reg REGNO as in use for a reload of the sort spec'd by OPNUM and
5029*e4b17023SJohn Marino    TYPE. MODE is used to indicate how many consecutive regs are
5030*e4b17023SJohn Marino    actually used.  */
5031*e4b17023SJohn Marino 
5032*e4b17023SJohn Marino static void
mark_reload_reg_in_use(unsigned int regno,int opnum,enum reload_type type,enum machine_mode mode)5033*e4b17023SJohn Marino mark_reload_reg_in_use (unsigned int regno, int opnum, enum reload_type type,
5034*e4b17023SJohn Marino 			enum machine_mode mode)
5035*e4b17023SJohn Marino {
5036*e4b17023SJohn Marino   switch (type)
5037*e4b17023SJohn Marino     {
5038*e4b17023SJohn Marino     case RELOAD_OTHER:
5039*e4b17023SJohn Marino       add_to_hard_reg_set (&reload_reg_used, mode, regno);
5040*e4b17023SJohn Marino       break;
5041*e4b17023SJohn Marino 
5042*e4b17023SJohn Marino     case RELOAD_FOR_INPUT_ADDRESS:
5043*e4b17023SJohn Marino       add_to_hard_reg_set (&reload_reg_used_in_input_addr[opnum], mode, regno);
5044*e4b17023SJohn Marino       break;
5045*e4b17023SJohn Marino 
5046*e4b17023SJohn Marino     case RELOAD_FOR_INPADDR_ADDRESS:
5047*e4b17023SJohn Marino       add_to_hard_reg_set (&reload_reg_used_in_inpaddr_addr[opnum], mode, regno);
5048*e4b17023SJohn Marino       break;
5049*e4b17023SJohn Marino 
5050*e4b17023SJohn Marino     case RELOAD_FOR_OUTPUT_ADDRESS:
5051*e4b17023SJohn Marino       add_to_hard_reg_set (&reload_reg_used_in_output_addr[opnum], mode, regno);
5052*e4b17023SJohn Marino       break;
5053*e4b17023SJohn Marino 
5054*e4b17023SJohn Marino     case RELOAD_FOR_OUTADDR_ADDRESS:
5055*e4b17023SJohn Marino       add_to_hard_reg_set (&reload_reg_used_in_outaddr_addr[opnum], mode, regno);
5056*e4b17023SJohn Marino       break;
5057*e4b17023SJohn Marino 
5058*e4b17023SJohn Marino     case RELOAD_FOR_OPERAND_ADDRESS:
5059*e4b17023SJohn Marino       add_to_hard_reg_set (&reload_reg_used_in_op_addr, mode, regno);
5060*e4b17023SJohn Marino       break;
5061*e4b17023SJohn Marino 
5062*e4b17023SJohn Marino     case RELOAD_FOR_OPADDR_ADDR:
5063*e4b17023SJohn Marino       add_to_hard_reg_set (&reload_reg_used_in_op_addr_reload, mode, regno);
5064*e4b17023SJohn Marino       break;
5065*e4b17023SJohn Marino 
5066*e4b17023SJohn Marino     case RELOAD_FOR_OTHER_ADDRESS:
5067*e4b17023SJohn Marino       add_to_hard_reg_set (&reload_reg_used_in_other_addr, mode, regno);
5068*e4b17023SJohn Marino       break;
5069*e4b17023SJohn Marino 
5070*e4b17023SJohn Marino     case RELOAD_FOR_INPUT:
5071*e4b17023SJohn Marino       add_to_hard_reg_set (&reload_reg_used_in_input[opnum], mode, regno);
5072*e4b17023SJohn Marino       break;
5073*e4b17023SJohn Marino 
5074*e4b17023SJohn Marino     case RELOAD_FOR_OUTPUT:
5075*e4b17023SJohn Marino       add_to_hard_reg_set (&reload_reg_used_in_output[opnum], mode, regno);
5076*e4b17023SJohn Marino       break;
5077*e4b17023SJohn Marino 
5078*e4b17023SJohn Marino     case RELOAD_FOR_INSN:
5079*e4b17023SJohn Marino       add_to_hard_reg_set (&reload_reg_used_in_insn,  mode, regno);
5080*e4b17023SJohn Marino       break;
5081*e4b17023SJohn Marino     }
5082*e4b17023SJohn Marino 
5083*e4b17023SJohn Marino   add_to_hard_reg_set (&reload_reg_used_at_all, mode, regno);
5084*e4b17023SJohn Marino }
5085*e4b17023SJohn Marino 
5086*e4b17023SJohn Marino /* Similarly, but show REGNO is no longer in use for a reload.  */
5087*e4b17023SJohn Marino 
5088*e4b17023SJohn Marino static void
clear_reload_reg_in_use(unsigned int regno,int opnum,enum reload_type type,enum machine_mode mode)5089*e4b17023SJohn Marino clear_reload_reg_in_use (unsigned int regno, int opnum,
5090*e4b17023SJohn Marino 			 enum reload_type type, enum machine_mode mode)
5091*e4b17023SJohn Marino {
5092*e4b17023SJohn Marino   unsigned int nregs = hard_regno_nregs[regno][mode];
5093*e4b17023SJohn Marino   unsigned int start_regno, end_regno, r;
5094*e4b17023SJohn Marino   int i;
5095*e4b17023SJohn Marino   /* A complication is that for some reload types, inheritance might
5096*e4b17023SJohn Marino      allow multiple reloads of the same types to share a reload register.
5097*e4b17023SJohn Marino      We set check_opnum if we have to check only reloads with the same
5098*e4b17023SJohn Marino      operand number, and check_any if we have to check all reloads.  */
5099*e4b17023SJohn Marino   int check_opnum = 0;
5100*e4b17023SJohn Marino   int check_any = 0;
5101*e4b17023SJohn Marino   HARD_REG_SET *used_in_set;
5102*e4b17023SJohn Marino 
5103*e4b17023SJohn Marino   switch (type)
5104*e4b17023SJohn Marino     {
5105*e4b17023SJohn Marino     case RELOAD_OTHER:
5106*e4b17023SJohn Marino       used_in_set = &reload_reg_used;
5107*e4b17023SJohn Marino       break;
5108*e4b17023SJohn Marino 
5109*e4b17023SJohn Marino     case RELOAD_FOR_INPUT_ADDRESS:
5110*e4b17023SJohn Marino       used_in_set = &reload_reg_used_in_input_addr[opnum];
5111*e4b17023SJohn Marino       break;
5112*e4b17023SJohn Marino 
5113*e4b17023SJohn Marino     case RELOAD_FOR_INPADDR_ADDRESS:
5114*e4b17023SJohn Marino       check_opnum = 1;
5115*e4b17023SJohn Marino       used_in_set = &reload_reg_used_in_inpaddr_addr[opnum];
5116*e4b17023SJohn Marino       break;
5117*e4b17023SJohn Marino 
5118*e4b17023SJohn Marino     case RELOAD_FOR_OUTPUT_ADDRESS:
5119*e4b17023SJohn Marino       used_in_set = &reload_reg_used_in_output_addr[opnum];
5120*e4b17023SJohn Marino       break;
5121*e4b17023SJohn Marino 
5122*e4b17023SJohn Marino     case RELOAD_FOR_OUTADDR_ADDRESS:
5123*e4b17023SJohn Marino       check_opnum = 1;
5124*e4b17023SJohn Marino       used_in_set = &reload_reg_used_in_outaddr_addr[opnum];
5125*e4b17023SJohn Marino       break;
5126*e4b17023SJohn Marino 
5127*e4b17023SJohn Marino     case RELOAD_FOR_OPERAND_ADDRESS:
5128*e4b17023SJohn Marino       used_in_set = &reload_reg_used_in_op_addr;
5129*e4b17023SJohn Marino       break;
5130*e4b17023SJohn Marino 
5131*e4b17023SJohn Marino     case RELOAD_FOR_OPADDR_ADDR:
5132*e4b17023SJohn Marino       check_any = 1;
5133*e4b17023SJohn Marino       used_in_set = &reload_reg_used_in_op_addr_reload;
5134*e4b17023SJohn Marino       break;
5135*e4b17023SJohn Marino 
5136*e4b17023SJohn Marino     case RELOAD_FOR_OTHER_ADDRESS:
5137*e4b17023SJohn Marino       used_in_set = &reload_reg_used_in_other_addr;
5138*e4b17023SJohn Marino       check_any = 1;
5139*e4b17023SJohn Marino       break;
5140*e4b17023SJohn Marino 
5141*e4b17023SJohn Marino     case RELOAD_FOR_INPUT:
5142*e4b17023SJohn Marino       used_in_set = &reload_reg_used_in_input[opnum];
5143*e4b17023SJohn Marino       break;
5144*e4b17023SJohn Marino 
5145*e4b17023SJohn Marino     case RELOAD_FOR_OUTPUT:
5146*e4b17023SJohn Marino       used_in_set = &reload_reg_used_in_output[opnum];
5147*e4b17023SJohn Marino       break;
5148*e4b17023SJohn Marino 
5149*e4b17023SJohn Marino     case RELOAD_FOR_INSN:
5150*e4b17023SJohn Marino       used_in_set = &reload_reg_used_in_insn;
5151*e4b17023SJohn Marino       break;
5152*e4b17023SJohn Marino     default:
5153*e4b17023SJohn Marino       gcc_unreachable ();
5154*e4b17023SJohn Marino     }
5155*e4b17023SJohn Marino   /* We resolve conflicts with remaining reloads of the same type by
5156*e4b17023SJohn Marino      excluding the intervals of reload registers by them from the
5157*e4b17023SJohn Marino      interval of freed reload registers.  Since we only keep track of
5158*e4b17023SJohn Marino      one set of interval bounds, we might have to exclude somewhat
5159*e4b17023SJohn Marino      more than what would be necessary if we used a HARD_REG_SET here.
5160*e4b17023SJohn Marino      But this should only happen very infrequently, so there should
5161*e4b17023SJohn Marino      be no reason to worry about it.  */
5162*e4b17023SJohn Marino 
5163*e4b17023SJohn Marino   start_regno = regno;
5164*e4b17023SJohn Marino   end_regno = regno + nregs;
5165*e4b17023SJohn Marino   if (check_opnum || check_any)
5166*e4b17023SJohn Marino     {
5167*e4b17023SJohn Marino       for (i = n_reloads - 1; i >= 0; i--)
5168*e4b17023SJohn Marino 	{
5169*e4b17023SJohn Marino 	  if (rld[i].when_needed == type
5170*e4b17023SJohn Marino 	      && (check_any || rld[i].opnum == opnum)
5171*e4b17023SJohn Marino 	      && rld[i].reg_rtx)
5172*e4b17023SJohn Marino 	    {
5173*e4b17023SJohn Marino 	      unsigned int conflict_start = true_regnum (rld[i].reg_rtx);
5174*e4b17023SJohn Marino 	      unsigned int conflict_end
5175*e4b17023SJohn Marino 		= end_hard_regno (rld[i].mode, conflict_start);
5176*e4b17023SJohn Marino 
5177*e4b17023SJohn Marino 	      /* If there is an overlap with the first to-be-freed register,
5178*e4b17023SJohn Marino 		 adjust the interval start.  */
5179*e4b17023SJohn Marino 	      if (conflict_start <= start_regno && conflict_end > start_regno)
5180*e4b17023SJohn Marino 		start_regno = conflict_end;
5181*e4b17023SJohn Marino 	      /* Otherwise, if there is a conflict with one of the other
5182*e4b17023SJohn Marino 		 to-be-freed registers, adjust the interval end.  */
5183*e4b17023SJohn Marino 	      if (conflict_start > start_regno && conflict_start < end_regno)
5184*e4b17023SJohn Marino 		end_regno = conflict_start;
5185*e4b17023SJohn Marino 	    }
5186*e4b17023SJohn Marino 	}
5187*e4b17023SJohn Marino     }
5188*e4b17023SJohn Marino 
5189*e4b17023SJohn Marino   for (r = start_regno; r < end_regno; r++)
5190*e4b17023SJohn Marino     CLEAR_HARD_REG_BIT (*used_in_set, r);
5191*e4b17023SJohn Marino }
5192*e4b17023SJohn Marino 
5193*e4b17023SJohn Marino /* 1 if reg REGNO is free as a reload reg for a reload of the sort
5194*e4b17023SJohn Marino    specified by OPNUM and TYPE.  */
5195*e4b17023SJohn Marino 
5196*e4b17023SJohn Marino static int
reload_reg_free_p(unsigned int regno,int opnum,enum reload_type type)5197*e4b17023SJohn Marino reload_reg_free_p (unsigned int regno, int opnum, enum reload_type type)
5198*e4b17023SJohn Marino {
5199*e4b17023SJohn Marino   int i;
5200*e4b17023SJohn Marino 
5201*e4b17023SJohn Marino   /* In use for a RELOAD_OTHER means it's not available for anything.  */
5202*e4b17023SJohn Marino   if (TEST_HARD_REG_BIT (reload_reg_used, regno)
5203*e4b17023SJohn Marino       || TEST_HARD_REG_BIT (reload_reg_unavailable, regno))
5204*e4b17023SJohn Marino     return 0;
5205*e4b17023SJohn Marino 
5206*e4b17023SJohn Marino   switch (type)
5207*e4b17023SJohn Marino     {
5208*e4b17023SJohn Marino     case RELOAD_OTHER:
5209*e4b17023SJohn Marino       /* In use for anything means we can't use it for RELOAD_OTHER.  */
5210*e4b17023SJohn Marino       if (TEST_HARD_REG_BIT (reload_reg_used_in_other_addr, regno)
5211*e4b17023SJohn Marino 	  || TEST_HARD_REG_BIT (reload_reg_used_in_op_addr, regno)
5212*e4b17023SJohn Marino 	  || TEST_HARD_REG_BIT (reload_reg_used_in_op_addr_reload, regno)
5213*e4b17023SJohn Marino 	  || TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno))
5214*e4b17023SJohn Marino 	return 0;
5215*e4b17023SJohn Marino 
5216*e4b17023SJohn Marino       for (i = 0; i < reload_n_operands; i++)
5217*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[i], regno)
5218*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_inpaddr_addr[i], regno)
5219*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno)
5220*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_outaddr_addr[i], regno)
5221*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno)
5222*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
5223*e4b17023SJohn Marino 	  return 0;
5224*e4b17023SJohn Marino 
5225*e4b17023SJohn Marino       return 1;
5226*e4b17023SJohn Marino 
5227*e4b17023SJohn Marino     case RELOAD_FOR_INPUT:
5228*e4b17023SJohn Marino       if (TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno)
5229*e4b17023SJohn Marino 	  || TEST_HARD_REG_BIT (reload_reg_used_in_op_addr, regno))
5230*e4b17023SJohn Marino 	return 0;
5231*e4b17023SJohn Marino 
5232*e4b17023SJohn Marino       if (TEST_HARD_REG_BIT (reload_reg_used_in_op_addr_reload, regno))
5233*e4b17023SJohn Marino 	return 0;
5234*e4b17023SJohn Marino 
5235*e4b17023SJohn Marino       /* If it is used for some other input, can't use it.  */
5236*e4b17023SJohn Marino       for (i = 0; i < reload_n_operands; i++)
5237*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno))
5238*e4b17023SJohn Marino 	  return 0;
5239*e4b17023SJohn Marino 
5240*e4b17023SJohn Marino       /* If it is used in a later operand's address, can't use it.  */
5241*e4b17023SJohn Marino       for (i = opnum + 1; i < reload_n_operands; i++)
5242*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[i], regno)
5243*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_inpaddr_addr[i], regno))
5244*e4b17023SJohn Marino 	  return 0;
5245*e4b17023SJohn Marino 
5246*e4b17023SJohn Marino       return 1;
5247*e4b17023SJohn Marino 
5248*e4b17023SJohn Marino     case RELOAD_FOR_INPUT_ADDRESS:
5249*e4b17023SJohn Marino       /* Can't use a register if it is used for an input address for this
5250*e4b17023SJohn Marino 	 operand or used as an input in an earlier one.  */
5251*e4b17023SJohn Marino       if (TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[opnum], regno)
5252*e4b17023SJohn Marino 	  || TEST_HARD_REG_BIT (reload_reg_used_in_inpaddr_addr[opnum], regno))
5253*e4b17023SJohn Marino 	return 0;
5254*e4b17023SJohn Marino 
5255*e4b17023SJohn Marino       for (i = 0; i < opnum; i++)
5256*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno))
5257*e4b17023SJohn Marino 	  return 0;
5258*e4b17023SJohn Marino 
5259*e4b17023SJohn Marino       return 1;
5260*e4b17023SJohn Marino 
5261*e4b17023SJohn Marino     case RELOAD_FOR_INPADDR_ADDRESS:
5262*e4b17023SJohn Marino       /* Can't use a register if it is used for an input address
5263*e4b17023SJohn Marino 	 for this operand or used as an input in an earlier
5264*e4b17023SJohn Marino 	 one.  */
5265*e4b17023SJohn Marino       if (TEST_HARD_REG_BIT (reload_reg_used_in_inpaddr_addr[opnum], regno))
5266*e4b17023SJohn Marino 	return 0;
5267*e4b17023SJohn Marino 
5268*e4b17023SJohn Marino       for (i = 0; i < opnum; i++)
5269*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno))
5270*e4b17023SJohn Marino 	  return 0;
5271*e4b17023SJohn Marino 
5272*e4b17023SJohn Marino       return 1;
5273*e4b17023SJohn Marino 
5274*e4b17023SJohn Marino     case RELOAD_FOR_OUTPUT_ADDRESS:
5275*e4b17023SJohn Marino       /* Can't use a register if it is used for an output address for this
5276*e4b17023SJohn Marino 	 operand or used as an output in this or a later operand.  Note
5277*e4b17023SJohn Marino 	 that multiple output operands are emitted in reverse order, so
5278*e4b17023SJohn Marino 	 the conflicting ones are those with lower indices.  */
5279*e4b17023SJohn Marino       if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[opnum], regno))
5280*e4b17023SJohn Marino 	return 0;
5281*e4b17023SJohn Marino 
5282*e4b17023SJohn Marino       for (i = 0; i <= opnum; i++)
5283*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
5284*e4b17023SJohn Marino 	  return 0;
5285*e4b17023SJohn Marino 
5286*e4b17023SJohn Marino       return 1;
5287*e4b17023SJohn Marino 
5288*e4b17023SJohn Marino     case RELOAD_FOR_OUTADDR_ADDRESS:
5289*e4b17023SJohn Marino       /* Can't use a register if it is used for an output address
5290*e4b17023SJohn Marino 	 for this operand or used as an output in this or a
5291*e4b17023SJohn Marino 	 later operand.  Note that multiple output operands are
5292*e4b17023SJohn Marino 	 emitted in reverse order, so the conflicting ones are
5293*e4b17023SJohn Marino 	 those with lower indices.  */
5294*e4b17023SJohn Marino       if (TEST_HARD_REG_BIT (reload_reg_used_in_outaddr_addr[opnum], regno))
5295*e4b17023SJohn Marino 	return 0;
5296*e4b17023SJohn Marino 
5297*e4b17023SJohn Marino       for (i = 0; i <= opnum; i++)
5298*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
5299*e4b17023SJohn Marino 	  return 0;
5300*e4b17023SJohn Marino 
5301*e4b17023SJohn Marino       return 1;
5302*e4b17023SJohn Marino 
5303*e4b17023SJohn Marino     case RELOAD_FOR_OPERAND_ADDRESS:
5304*e4b17023SJohn Marino       for (i = 0; i < reload_n_operands; i++)
5305*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno))
5306*e4b17023SJohn Marino 	  return 0;
5307*e4b17023SJohn Marino 
5308*e4b17023SJohn Marino       return (! TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno)
5309*e4b17023SJohn Marino 	      && ! TEST_HARD_REG_BIT (reload_reg_used_in_op_addr, regno));
5310*e4b17023SJohn Marino 
5311*e4b17023SJohn Marino     case RELOAD_FOR_OPADDR_ADDR:
5312*e4b17023SJohn Marino       for (i = 0; i < reload_n_operands; i++)
5313*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno))
5314*e4b17023SJohn Marino 	  return 0;
5315*e4b17023SJohn Marino 
5316*e4b17023SJohn Marino       return (!TEST_HARD_REG_BIT (reload_reg_used_in_op_addr_reload, regno));
5317*e4b17023SJohn Marino 
5318*e4b17023SJohn Marino     case RELOAD_FOR_OUTPUT:
5319*e4b17023SJohn Marino       /* This cannot share a register with RELOAD_FOR_INSN reloads, other
5320*e4b17023SJohn Marino 	 outputs, or an operand address for this or an earlier output.
5321*e4b17023SJohn Marino 	 Note that multiple output operands are emitted in reverse order,
5322*e4b17023SJohn Marino 	 so the conflicting ones are those with higher indices.  */
5323*e4b17023SJohn Marino       if (TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno))
5324*e4b17023SJohn Marino 	return 0;
5325*e4b17023SJohn Marino 
5326*e4b17023SJohn Marino       for (i = 0; i < reload_n_operands; i++)
5327*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
5328*e4b17023SJohn Marino 	  return 0;
5329*e4b17023SJohn Marino 
5330*e4b17023SJohn Marino       for (i = opnum; i < reload_n_operands; i++)
5331*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno)
5332*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_outaddr_addr[i], regno))
5333*e4b17023SJohn Marino 	  return 0;
5334*e4b17023SJohn Marino 
5335*e4b17023SJohn Marino       return 1;
5336*e4b17023SJohn Marino 
5337*e4b17023SJohn Marino     case RELOAD_FOR_INSN:
5338*e4b17023SJohn Marino       for (i = 0; i < reload_n_operands; i++)
5339*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno)
5340*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
5341*e4b17023SJohn Marino 	  return 0;
5342*e4b17023SJohn Marino 
5343*e4b17023SJohn Marino       return (! TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno)
5344*e4b17023SJohn Marino 	      && ! TEST_HARD_REG_BIT (reload_reg_used_in_op_addr, regno));
5345*e4b17023SJohn Marino 
5346*e4b17023SJohn Marino     case RELOAD_FOR_OTHER_ADDRESS:
5347*e4b17023SJohn Marino       return ! TEST_HARD_REG_BIT (reload_reg_used_in_other_addr, regno);
5348*e4b17023SJohn Marino 
5349*e4b17023SJohn Marino     default:
5350*e4b17023SJohn Marino       gcc_unreachable ();
5351*e4b17023SJohn Marino     }
5352*e4b17023SJohn Marino }
5353*e4b17023SJohn Marino 
5354*e4b17023SJohn Marino /* Return 1 if the value in reload reg REGNO, as used by the reload with
5355*e4b17023SJohn Marino    the number RELOADNUM, is still available in REGNO at the end of the insn.
5356*e4b17023SJohn Marino 
5357*e4b17023SJohn Marino    We can assume that the reload reg was already tested for availability
5358*e4b17023SJohn Marino    at the time it is needed, and we should not check this again,
5359*e4b17023SJohn Marino    in case the reg has already been marked in use.  */
5360*e4b17023SJohn Marino 
5361*e4b17023SJohn Marino static int
reload_reg_reaches_end_p(unsigned int regno,int reloadnum)5362*e4b17023SJohn Marino reload_reg_reaches_end_p (unsigned int regno, int reloadnum)
5363*e4b17023SJohn Marino {
5364*e4b17023SJohn Marino   int opnum = rld[reloadnum].opnum;
5365*e4b17023SJohn Marino   enum reload_type type = rld[reloadnum].when_needed;
5366*e4b17023SJohn Marino   int i;
5367*e4b17023SJohn Marino 
5368*e4b17023SJohn Marino   /* See if there is a reload with the same type for this operand, using
5369*e4b17023SJohn Marino      the same register. This case is not handled by the code below.  */
5370*e4b17023SJohn Marino   for (i = reloadnum + 1; i < n_reloads; i++)
5371*e4b17023SJohn Marino     {
5372*e4b17023SJohn Marino       rtx reg;
5373*e4b17023SJohn Marino       int nregs;
5374*e4b17023SJohn Marino 
5375*e4b17023SJohn Marino       if (rld[i].opnum != opnum || rld[i].when_needed != type)
5376*e4b17023SJohn Marino 	continue;
5377*e4b17023SJohn Marino       reg = rld[i].reg_rtx;
5378*e4b17023SJohn Marino       if (reg == NULL_RTX)
5379*e4b17023SJohn Marino 	continue;
5380*e4b17023SJohn Marino       nregs = hard_regno_nregs[REGNO (reg)][GET_MODE (reg)];
5381*e4b17023SJohn Marino       if (regno >= REGNO (reg) && regno < REGNO (reg) + nregs)
5382*e4b17023SJohn Marino 	return 0;
5383*e4b17023SJohn Marino     }
5384*e4b17023SJohn Marino 
5385*e4b17023SJohn Marino   switch (type)
5386*e4b17023SJohn Marino     {
5387*e4b17023SJohn Marino     case RELOAD_OTHER:
5388*e4b17023SJohn Marino       /* Since a RELOAD_OTHER reload claims the reg for the entire insn,
5389*e4b17023SJohn Marino 	 its value must reach the end.  */
5390*e4b17023SJohn Marino       return 1;
5391*e4b17023SJohn Marino 
5392*e4b17023SJohn Marino       /* If this use is for part of the insn,
5393*e4b17023SJohn Marino 	 its value reaches if no subsequent part uses the same register.
5394*e4b17023SJohn Marino 	 Just like the above function, don't try to do this with lots
5395*e4b17023SJohn Marino 	 of fallthroughs.  */
5396*e4b17023SJohn Marino 
5397*e4b17023SJohn Marino     case RELOAD_FOR_OTHER_ADDRESS:
5398*e4b17023SJohn Marino       /* Here we check for everything else, since these don't conflict
5399*e4b17023SJohn Marino 	 with anything else and everything comes later.  */
5400*e4b17023SJohn Marino 
5401*e4b17023SJohn Marino       for (i = 0; i < reload_n_operands; i++)
5402*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno)
5403*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_outaddr_addr[i], regno)
5404*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno)
5405*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[i], regno)
5406*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_inpaddr_addr[i], regno)
5407*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno))
5408*e4b17023SJohn Marino 	  return 0;
5409*e4b17023SJohn Marino 
5410*e4b17023SJohn Marino       return (! TEST_HARD_REG_BIT (reload_reg_used_in_op_addr, regno)
5411*e4b17023SJohn Marino 	      && ! TEST_HARD_REG_BIT (reload_reg_used_in_op_addr_reload, regno)
5412*e4b17023SJohn Marino 	      && ! TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno)
5413*e4b17023SJohn Marino 	      && ! TEST_HARD_REG_BIT (reload_reg_used, regno));
5414*e4b17023SJohn Marino 
5415*e4b17023SJohn Marino     case RELOAD_FOR_INPUT_ADDRESS:
5416*e4b17023SJohn Marino     case RELOAD_FOR_INPADDR_ADDRESS:
5417*e4b17023SJohn Marino       /* Similar, except that we check only for this and subsequent inputs
5418*e4b17023SJohn Marino 	 and the address of only subsequent inputs and we do not need
5419*e4b17023SJohn Marino 	 to check for RELOAD_OTHER objects since they are known not to
5420*e4b17023SJohn Marino 	 conflict.  */
5421*e4b17023SJohn Marino 
5422*e4b17023SJohn Marino       for (i = opnum; i < reload_n_operands; i++)
5423*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno))
5424*e4b17023SJohn Marino 	  return 0;
5425*e4b17023SJohn Marino 
5426*e4b17023SJohn Marino       /* Reload register of reload with type RELOAD_FOR_INPADDR_ADDRESS
5427*e4b17023SJohn Marino 	 could be killed if the register is also used by reload with type
5428*e4b17023SJohn Marino 	 RELOAD_FOR_INPUT_ADDRESS, so check it.  */
5429*e4b17023SJohn Marino       if (type == RELOAD_FOR_INPADDR_ADDRESS
5430*e4b17023SJohn Marino 	  && TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[opnum], regno))
5431*e4b17023SJohn Marino 	return 0;
5432*e4b17023SJohn Marino 
5433*e4b17023SJohn Marino       for (i = opnum + 1; i < reload_n_operands; i++)
5434*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[i], regno)
5435*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_inpaddr_addr[i], regno))
5436*e4b17023SJohn Marino 	  return 0;
5437*e4b17023SJohn Marino 
5438*e4b17023SJohn Marino       for (i = 0; i < reload_n_operands; i++)
5439*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno)
5440*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_outaddr_addr[i], regno)
5441*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
5442*e4b17023SJohn Marino 	  return 0;
5443*e4b17023SJohn Marino 
5444*e4b17023SJohn Marino       if (TEST_HARD_REG_BIT (reload_reg_used_in_op_addr_reload, regno))
5445*e4b17023SJohn Marino 	return 0;
5446*e4b17023SJohn Marino 
5447*e4b17023SJohn Marino       return (!TEST_HARD_REG_BIT (reload_reg_used_in_op_addr, regno)
5448*e4b17023SJohn Marino 	      && !TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno)
5449*e4b17023SJohn Marino 	      && !TEST_HARD_REG_BIT (reload_reg_used, regno));
5450*e4b17023SJohn Marino 
5451*e4b17023SJohn Marino     case RELOAD_FOR_INPUT:
5452*e4b17023SJohn Marino       /* Similar to input address, except we start at the next operand for
5453*e4b17023SJohn Marino 	 both input and input address and we do not check for
5454*e4b17023SJohn Marino 	 RELOAD_FOR_OPERAND_ADDRESS and RELOAD_FOR_INSN since these
5455*e4b17023SJohn Marino 	 would conflict.  */
5456*e4b17023SJohn Marino 
5457*e4b17023SJohn Marino       for (i = opnum + 1; i < reload_n_operands; i++)
5458*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[i], regno)
5459*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_inpaddr_addr[i], regno)
5460*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno))
5461*e4b17023SJohn Marino 	  return 0;
5462*e4b17023SJohn Marino 
5463*e4b17023SJohn Marino       /* ... fall through ...  */
5464*e4b17023SJohn Marino 
5465*e4b17023SJohn Marino     case RELOAD_FOR_OPERAND_ADDRESS:
5466*e4b17023SJohn Marino       /* Check outputs and their addresses.  */
5467*e4b17023SJohn Marino 
5468*e4b17023SJohn Marino       for (i = 0; i < reload_n_operands; i++)
5469*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno)
5470*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_outaddr_addr[i], regno)
5471*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
5472*e4b17023SJohn Marino 	  return 0;
5473*e4b17023SJohn Marino 
5474*e4b17023SJohn Marino       return (!TEST_HARD_REG_BIT (reload_reg_used, regno));
5475*e4b17023SJohn Marino 
5476*e4b17023SJohn Marino     case RELOAD_FOR_OPADDR_ADDR:
5477*e4b17023SJohn Marino       for (i = 0; i < reload_n_operands; i++)
5478*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno)
5479*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_outaddr_addr[i], regno)
5480*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
5481*e4b17023SJohn Marino 	  return 0;
5482*e4b17023SJohn Marino 
5483*e4b17023SJohn Marino       return (!TEST_HARD_REG_BIT (reload_reg_used_in_op_addr, regno)
5484*e4b17023SJohn Marino 	      && !TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno)
5485*e4b17023SJohn Marino 	      && !TEST_HARD_REG_BIT (reload_reg_used, regno));
5486*e4b17023SJohn Marino 
5487*e4b17023SJohn Marino     case RELOAD_FOR_INSN:
5488*e4b17023SJohn Marino       /* These conflict with other outputs with RELOAD_OTHER.  So
5489*e4b17023SJohn Marino 	 we need only check for output addresses.  */
5490*e4b17023SJohn Marino 
5491*e4b17023SJohn Marino       opnum = reload_n_operands;
5492*e4b17023SJohn Marino 
5493*e4b17023SJohn Marino       /* ... fall through ...  */
5494*e4b17023SJohn Marino 
5495*e4b17023SJohn Marino     case RELOAD_FOR_OUTPUT:
5496*e4b17023SJohn Marino     case RELOAD_FOR_OUTPUT_ADDRESS:
5497*e4b17023SJohn Marino     case RELOAD_FOR_OUTADDR_ADDRESS:
5498*e4b17023SJohn Marino       /* We already know these can't conflict with a later output.  So the
5499*e4b17023SJohn Marino 	 only thing to check are later output addresses.
5500*e4b17023SJohn Marino 	 Note that multiple output operands are emitted in reverse order,
5501*e4b17023SJohn Marino 	 so the conflicting ones are those with lower indices.  */
5502*e4b17023SJohn Marino       for (i = 0; i < opnum; i++)
5503*e4b17023SJohn Marino 	if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno)
5504*e4b17023SJohn Marino 	    || TEST_HARD_REG_BIT (reload_reg_used_in_outaddr_addr[i], regno))
5505*e4b17023SJohn Marino 	  return 0;
5506*e4b17023SJohn Marino 
5507*e4b17023SJohn Marino       /* Reload register of reload with type RELOAD_FOR_OUTADDR_ADDRESS
5508*e4b17023SJohn Marino 	 could be killed if the register is also used by reload with type
5509*e4b17023SJohn Marino 	 RELOAD_FOR_OUTPUT_ADDRESS, so check it.  */
5510*e4b17023SJohn Marino       if (type == RELOAD_FOR_OUTADDR_ADDRESS
5511*e4b17023SJohn Marino 	  && TEST_HARD_REG_BIT (reload_reg_used_in_outaddr_addr[opnum], regno))
5512*e4b17023SJohn Marino 	return 0;
5513*e4b17023SJohn Marino 
5514*e4b17023SJohn Marino       return 1;
5515*e4b17023SJohn Marino 
5516*e4b17023SJohn Marino     default:
5517*e4b17023SJohn Marino       gcc_unreachable ();
5518*e4b17023SJohn Marino     }
5519*e4b17023SJohn Marino }
5520*e4b17023SJohn Marino 
5521*e4b17023SJohn Marino /* Like reload_reg_reaches_end_p, but check that the condition holds for
5522*e4b17023SJohn Marino    every register in REG.  */
5523*e4b17023SJohn Marino 
5524*e4b17023SJohn Marino static bool
reload_reg_rtx_reaches_end_p(rtx reg,int reloadnum)5525*e4b17023SJohn Marino reload_reg_rtx_reaches_end_p (rtx reg, int reloadnum)
5526*e4b17023SJohn Marino {
5527*e4b17023SJohn Marino   unsigned int i;
5528*e4b17023SJohn Marino 
5529*e4b17023SJohn Marino   for (i = REGNO (reg); i < END_REGNO (reg); i++)
5530*e4b17023SJohn Marino     if (!reload_reg_reaches_end_p (i, reloadnum))
5531*e4b17023SJohn Marino       return false;
5532*e4b17023SJohn Marino   return true;
5533*e4b17023SJohn Marino }
5534*e4b17023SJohn Marino 
5535*e4b17023SJohn Marino 
5536*e4b17023SJohn Marino /*  Returns whether R1 and R2 are uniquely chained: the value of one
5537*e4b17023SJohn Marino     is used by the other, and that value is not used by any other
5538*e4b17023SJohn Marino     reload for this insn.  This is used to partially undo the decision
5539*e4b17023SJohn Marino     made in find_reloads when in the case of multiple
5540*e4b17023SJohn Marino     RELOAD_FOR_OPERAND_ADDRESS reloads it converts all
5541*e4b17023SJohn Marino     RELOAD_FOR_OPADDR_ADDR reloads into RELOAD_FOR_OPERAND_ADDRESS
5542*e4b17023SJohn Marino     reloads.  This code tries to avoid the conflict created by that
5543*e4b17023SJohn Marino     change.  It might be cleaner to explicitly keep track of which
5544*e4b17023SJohn Marino     RELOAD_FOR_OPADDR_ADDR reload is associated with which
5545*e4b17023SJohn Marino     RELOAD_FOR_OPERAND_ADDRESS reload, rather than to try to detect
5546*e4b17023SJohn Marino     this after the fact. */
5547*e4b17023SJohn Marino static bool
reloads_unique_chain_p(int r1,int r2)5548*e4b17023SJohn Marino reloads_unique_chain_p (int r1, int r2)
5549*e4b17023SJohn Marino {
5550*e4b17023SJohn Marino   int i;
5551*e4b17023SJohn Marino 
5552*e4b17023SJohn Marino   /* We only check input reloads.  */
5553*e4b17023SJohn Marino   if (! rld[r1].in || ! rld[r2].in)
5554*e4b17023SJohn Marino     return false;
5555*e4b17023SJohn Marino 
5556*e4b17023SJohn Marino   /* Avoid anything with output reloads.  */
5557*e4b17023SJohn Marino   if (rld[r1].out || rld[r2].out)
5558*e4b17023SJohn Marino     return false;
5559*e4b17023SJohn Marino 
5560*e4b17023SJohn Marino   /* "chained" means one reload is a component of the other reload,
5561*e4b17023SJohn Marino      not the same as the other reload.  */
5562*e4b17023SJohn Marino   if (rld[r1].opnum != rld[r2].opnum
5563*e4b17023SJohn Marino       || rtx_equal_p (rld[r1].in, rld[r2].in)
5564*e4b17023SJohn Marino       || rld[r1].optional || rld[r2].optional
5565*e4b17023SJohn Marino       || ! (reg_mentioned_p (rld[r1].in, rld[r2].in)
5566*e4b17023SJohn Marino 	    || reg_mentioned_p (rld[r2].in, rld[r1].in)))
5567*e4b17023SJohn Marino     return false;
5568*e4b17023SJohn Marino 
5569*e4b17023SJohn Marino   for (i = 0; i < n_reloads; i ++)
5570*e4b17023SJohn Marino     /* Look for input reloads that aren't our two */
5571*e4b17023SJohn Marino     if (i != r1 && i != r2 && rld[i].in)
5572*e4b17023SJohn Marino       {
5573*e4b17023SJohn Marino 	/* If our reload is mentioned at all, it isn't a simple chain.  */
5574*e4b17023SJohn Marino 	if (reg_mentioned_p (rld[r1].in, rld[i].in))
5575*e4b17023SJohn Marino 	  return false;
5576*e4b17023SJohn Marino       }
5577*e4b17023SJohn Marino   return true;
5578*e4b17023SJohn Marino }
5579*e4b17023SJohn Marino 
5580*e4b17023SJohn Marino /* The recursive function change all occurrences of WHAT in *WHERE
5581*e4b17023SJohn Marino    to REPL.  */
5582*e4b17023SJohn Marino static void
substitute(rtx * where,const_rtx what,rtx repl)5583*e4b17023SJohn Marino substitute (rtx *where, const_rtx what, rtx repl)
5584*e4b17023SJohn Marino {
5585*e4b17023SJohn Marino   const char *fmt;
5586*e4b17023SJohn Marino   int i;
5587*e4b17023SJohn Marino   enum rtx_code code;
5588*e4b17023SJohn Marino 
5589*e4b17023SJohn Marino   if (*where == 0)
5590*e4b17023SJohn Marino     return;
5591*e4b17023SJohn Marino 
5592*e4b17023SJohn Marino   if (*where == what || rtx_equal_p (*where, what))
5593*e4b17023SJohn Marino     {
5594*e4b17023SJohn Marino       /* Record the location of the changed rtx.  */
5595*e4b17023SJohn Marino       VEC_safe_push (rtx_p, heap, substitute_stack, where);
5596*e4b17023SJohn Marino       *where = repl;
5597*e4b17023SJohn Marino       return;
5598*e4b17023SJohn Marino     }
5599*e4b17023SJohn Marino 
5600*e4b17023SJohn Marino   code = GET_CODE (*where);
5601*e4b17023SJohn Marino   fmt = GET_RTX_FORMAT (code);
5602*e4b17023SJohn Marino   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
5603*e4b17023SJohn Marino     {
5604*e4b17023SJohn Marino       if (fmt[i] == 'E')
5605*e4b17023SJohn Marino 	{
5606*e4b17023SJohn Marino 	  int j;
5607*e4b17023SJohn Marino 
5608*e4b17023SJohn Marino 	  for (j = XVECLEN (*where, i) - 1; j >= 0; j--)
5609*e4b17023SJohn Marino 	    substitute (&XVECEXP (*where, i, j), what, repl);
5610*e4b17023SJohn Marino 	}
5611*e4b17023SJohn Marino       else if (fmt[i] == 'e')
5612*e4b17023SJohn Marino 	substitute (&XEXP (*where, i), what, repl);
5613*e4b17023SJohn Marino     }
5614*e4b17023SJohn Marino }
5615*e4b17023SJohn Marino 
5616*e4b17023SJohn Marino /* The function returns TRUE if chain of reload R1 and R2 (in any
5617*e4b17023SJohn Marino    order) can be evaluated without usage of intermediate register for
5618*e4b17023SJohn Marino    the reload containing another reload.  It is important to see
5619*e4b17023SJohn Marino    gen_reload to understand what the function is trying to do.  As an
5620*e4b17023SJohn Marino    example, let us have reload chain
5621*e4b17023SJohn Marino 
5622*e4b17023SJohn Marino       r2: const
5623*e4b17023SJohn Marino       r1: <something> + const
5624*e4b17023SJohn Marino 
5625*e4b17023SJohn Marino    and reload R2 got reload reg HR.  The function returns true if
5626*e4b17023SJohn Marino    there is a correct insn HR = HR + <something>.  Otherwise,
5627*e4b17023SJohn Marino    gen_reload will use intermediate register (and this is the reload
5628*e4b17023SJohn Marino    reg for R1) to reload <something>.
5629*e4b17023SJohn Marino 
5630*e4b17023SJohn Marino    We need this function to find a conflict for chain reloads.  In our
5631*e4b17023SJohn Marino    example, if HR = HR + <something> is incorrect insn, then we cannot
5632*e4b17023SJohn Marino    use HR as a reload register for R2.  If we do use it then we get a
5633*e4b17023SJohn Marino    wrong code:
5634*e4b17023SJohn Marino 
5635*e4b17023SJohn Marino       HR = const
5636*e4b17023SJohn Marino       HR = <something>
5637*e4b17023SJohn Marino       HR = HR + HR
5638*e4b17023SJohn Marino 
5639*e4b17023SJohn Marino */
5640*e4b17023SJohn Marino static bool
gen_reload_chain_without_interm_reg_p(int r1,int r2)5641*e4b17023SJohn Marino gen_reload_chain_without_interm_reg_p (int r1, int r2)
5642*e4b17023SJohn Marino {
5643*e4b17023SJohn Marino   /* Assume other cases in gen_reload are not possible for
5644*e4b17023SJohn Marino      chain reloads or do need an intermediate hard registers.  */
5645*e4b17023SJohn Marino   bool result = true;
5646*e4b17023SJohn Marino   int regno, n, code;
5647*e4b17023SJohn Marino   rtx out, in, insn;
5648*e4b17023SJohn Marino   rtx last = get_last_insn ();
5649*e4b17023SJohn Marino 
5650*e4b17023SJohn Marino   /* Make r2 a component of r1.  */
5651*e4b17023SJohn Marino   if (reg_mentioned_p (rld[r1].in, rld[r2].in))
5652*e4b17023SJohn Marino     {
5653*e4b17023SJohn Marino       n = r1;
5654*e4b17023SJohn Marino       r1 = r2;
5655*e4b17023SJohn Marino       r2 = n;
5656*e4b17023SJohn Marino     }
5657*e4b17023SJohn Marino   gcc_assert (reg_mentioned_p (rld[r2].in, rld[r1].in));
5658*e4b17023SJohn Marino   regno = rld[r1].regno >= 0 ? rld[r1].regno : rld[r2].regno;
5659*e4b17023SJohn Marino   gcc_assert (regno >= 0);
5660*e4b17023SJohn Marino   out = gen_rtx_REG (rld[r1].mode, regno);
5661*e4b17023SJohn Marino   in = rld[r1].in;
5662*e4b17023SJohn Marino   substitute (&in, rld[r2].in, gen_rtx_REG (rld[r2].mode, regno));
5663*e4b17023SJohn Marino 
5664*e4b17023SJohn Marino   /* If IN is a paradoxical SUBREG, remove it and try to put the
5665*e4b17023SJohn Marino      opposite SUBREG on OUT.  Likewise for a paradoxical SUBREG on OUT.  */
5666*e4b17023SJohn Marino   strip_paradoxical_subreg (&in, &out);
5667*e4b17023SJohn Marino 
5668*e4b17023SJohn Marino   if (GET_CODE (in) == PLUS
5669*e4b17023SJohn Marino       && (REG_P (XEXP (in, 0))
5670*e4b17023SJohn Marino 	  || GET_CODE (XEXP (in, 0)) == SUBREG
5671*e4b17023SJohn Marino 	  || MEM_P (XEXP (in, 0)))
5672*e4b17023SJohn Marino       && (REG_P (XEXP (in, 1))
5673*e4b17023SJohn Marino 	  || GET_CODE (XEXP (in, 1)) == SUBREG
5674*e4b17023SJohn Marino 	  || CONSTANT_P (XEXP (in, 1))
5675*e4b17023SJohn Marino 	  || MEM_P (XEXP (in, 1))))
5676*e4b17023SJohn Marino     {
5677*e4b17023SJohn Marino       insn = emit_insn (gen_rtx_SET (VOIDmode, out, in));
5678*e4b17023SJohn Marino       code = recog_memoized (insn);
5679*e4b17023SJohn Marino       result = false;
5680*e4b17023SJohn Marino 
5681*e4b17023SJohn Marino       if (code >= 0)
5682*e4b17023SJohn Marino 	{
5683*e4b17023SJohn Marino 	  extract_insn (insn);
5684*e4b17023SJohn Marino 	  /* We want constrain operands to treat this insn strictly in
5685*e4b17023SJohn Marino 	     its validity determination, i.e., the way it would after
5686*e4b17023SJohn Marino 	     reload has completed.  */
5687*e4b17023SJohn Marino 	  result = constrain_operands (1);
5688*e4b17023SJohn Marino 	}
5689*e4b17023SJohn Marino 
5690*e4b17023SJohn Marino       delete_insns_since (last);
5691*e4b17023SJohn Marino     }
5692*e4b17023SJohn Marino 
5693*e4b17023SJohn Marino   /* Restore the original value at each changed address within R1.  */
5694*e4b17023SJohn Marino   while (!VEC_empty (rtx_p, substitute_stack))
5695*e4b17023SJohn Marino     {
5696*e4b17023SJohn Marino       rtx *where = VEC_pop (rtx_p, substitute_stack);
5697*e4b17023SJohn Marino       *where = rld[r2].in;
5698*e4b17023SJohn Marino     }
5699*e4b17023SJohn Marino 
5700*e4b17023SJohn Marino   return result;
5701*e4b17023SJohn Marino }
5702*e4b17023SJohn Marino 
5703*e4b17023SJohn Marino /* Return 1 if the reloads denoted by R1 and R2 cannot share a register.
5704*e4b17023SJohn Marino    Return 0 otherwise.
5705*e4b17023SJohn Marino 
5706*e4b17023SJohn Marino    This function uses the same algorithm as reload_reg_free_p above.  */
5707*e4b17023SJohn Marino 
5708*e4b17023SJohn Marino static int
reloads_conflict(int r1,int r2)5709*e4b17023SJohn Marino reloads_conflict (int r1, int r2)
5710*e4b17023SJohn Marino {
5711*e4b17023SJohn Marino   enum reload_type r1_type = rld[r1].when_needed;
5712*e4b17023SJohn Marino   enum reload_type r2_type = rld[r2].when_needed;
5713*e4b17023SJohn Marino   int r1_opnum = rld[r1].opnum;
5714*e4b17023SJohn Marino   int r2_opnum = rld[r2].opnum;
5715*e4b17023SJohn Marino 
5716*e4b17023SJohn Marino   /* RELOAD_OTHER conflicts with everything.  */
5717*e4b17023SJohn Marino   if (r2_type == RELOAD_OTHER)
5718*e4b17023SJohn Marino     return 1;
5719*e4b17023SJohn Marino 
5720*e4b17023SJohn Marino   /* Otherwise, check conflicts differently for each type.  */
5721*e4b17023SJohn Marino 
5722*e4b17023SJohn Marino   switch (r1_type)
5723*e4b17023SJohn Marino     {
5724*e4b17023SJohn Marino     case RELOAD_FOR_INPUT:
5725*e4b17023SJohn Marino       return (r2_type == RELOAD_FOR_INSN
5726*e4b17023SJohn Marino 	      || r2_type == RELOAD_FOR_OPERAND_ADDRESS
5727*e4b17023SJohn Marino 	      || r2_type == RELOAD_FOR_OPADDR_ADDR
5728*e4b17023SJohn Marino 	      || r2_type == RELOAD_FOR_INPUT
5729*e4b17023SJohn Marino 	      || ((r2_type == RELOAD_FOR_INPUT_ADDRESS
5730*e4b17023SJohn Marino 		   || r2_type == RELOAD_FOR_INPADDR_ADDRESS)
5731*e4b17023SJohn Marino 		  && r2_opnum > r1_opnum));
5732*e4b17023SJohn Marino 
5733*e4b17023SJohn Marino     case RELOAD_FOR_INPUT_ADDRESS:
5734*e4b17023SJohn Marino       return ((r2_type == RELOAD_FOR_INPUT_ADDRESS && r1_opnum == r2_opnum)
5735*e4b17023SJohn Marino 	      || (r2_type == RELOAD_FOR_INPUT && r2_opnum < r1_opnum));
5736*e4b17023SJohn Marino 
5737*e4b17023SJohn Marino     case RELOAD_FOR_INPADDR_ADDRESS:
5738*e4b17023SJohn Marino       return ((r2_type == RELOAD_FOR_INPADDR_ADDRESS && r1_opnum == r2_opnum)
5739*e4b17023SJohn Marino 	      || (r2_type == RELOAD_FOR_INPUT && r2_opnum < r1_opnum));
5740*e4b17023SJohn Marino 
5741*e4b17023SJohn Marino     case RELOAD_FOR_OUTPUT_ADDRESS:
5742*e4b17023SJohn Marino       return ((r2_type == RELOAD_FOR_OUTPUT_ADDRESS && r2_opnum == r1_opnum)
5743*e4b17023SJohn Marino 	      || (r2_type == RELOAD_FOR_OUTPUT && r2_opnum <= r1_opnum));
5744*e4b17023SJohn Marino 
5745*e4b17023SJohn Marino     case RELOAD_FOR_OUTADDR_ADDRESS:
5746*e4b17023SJohn Marino       return ((r2_type == RELOAD_FOR_OUTADDR_ADDRESS && r2_opnum == r1_opnum)
5747*e4b17023SJohn Marino 	      || (r2_type == RELOAD_FOR_OUTPUT && r2_opnum <= r1_opnum));
5748*e4b17023SJohn Marino 
5749*e4b17023SJohn Marino     case RELOAD_FOR_OPERAND_ADDRESS:
5750*e4b17023SJohn Marino       return (r2_type == RELOAD_FOR_INPUT || r2_type == RELOAD_FOR_INSN
5751*e4b17023SJohn Marino 	      || (r2_type == RELOAD_FOR_OPERAND_ADDRESS
5752*e4b17023SJohn Marino 		  && (!reloads_unique_chain_p (r1, r2)
5753*e4b17023SJohn Marino 		      || !gen_reload_chain_without_interm_reg_p (r1, r2))));
5754*e4b17023SJohn Marino 
5755*e4b17023SJohn Marino     case RELOAD_FOR_OPADDR_ADDR:
5756*e4b17023SJohn Marino       return (r2_type == RELOAD_FOR_INPUT
5757*e4b17023SJohn Marino 	      || r2_type == RELOAD_FOR_OPADDR_ADDR);
5758*e4b17023SJohn Marino 
5759*e4b17023SJohn Marino     case RELOAD_FOR_OUTPUT:
5760*e4b17023SJohn Marino       return (r2_type == RELOAD_FOR_INSN || r2_type == RELOAD_FOR_OUTPUT
5761*e4b17023SJohn Marino 	      || ((r2_type == RELOAD_FOR_OUTPUT_ADDRESS
5762*e4b17023SJohn Marino 		   || r2_type == RELOAD_FOR_OUTADDR_ADDRESS)
5763*e4b17023SJohn Marino 		  && r2_opnum >= r1_opnum));
5764*e4b17023SJohn Marino 
5765*e4b17023SJohn Marino     case RELOAD_FOR_INSN:
5766*e4b17023SJohn Marino       return (r2_type == RELOAD_FOR_INPUT || r2_type == RELOAD_FOR_OUTPUT
5767*e4b17023SJohn Marino 	      || r2_type == RELOAD_FOR_INSN
5768*e4b17023SJohn Marino 	      || r2_type == RELOAD_FOR_OPERAND_ADDRESS);
5769*e4b17023SJohn Marino 
5770*e4b17023SJohn Marino     case RELOAD_FOR_OTHER_ADDRESS:
5771*e4b17023SJohn Marino       return r2_type == RELOAD_FOR_OTHER_ADDRESS;
5772*e4b17023SJohn Marino 
5773*e4b17023SJohn Marino     case RELOAD_OTHER:
5774*e4b17023SJohn Marino       return 1;
5775*e4b17023SJohn Marino 
5776*e4b17023SJohn Marino     default:
5777*e4b17023SJohn Marino       gcc_unreachable ();
5778*e4b17023SJohn Marino     }
5779*e4b17023SJohn Marino }
5780*e4b17023SJohn Marino 
5781*e4b17023SJohn Marino /* Indexed by reload number, 1 if incoming value
5782*e4b17023SJohn Marino    inherited from previous insns.  */
5783*e4b17023SJohn Marino static char reload_inherited[MAX_RELOADS];
5784*e4b17023SJohn Marino 
5785*e4b17023SJohn Marino /* For an inherited reload, this is the insn the reload was inherited from,
5786*e4b17023SJohn Marino    if we know it.  Otherwise, this is 0.  */
5787*e4b17023SJohn Marino static rtx reload_inheritance_insn[MAX_RELOADS];
5788*e4b17023SJohn Marino 
5789*e4b17023SJohn Marino /* If nonzero, this is a place to get the value of the reload,
5790*e4b17023SJohn Marino    rather than using reload_in.  */
5791*e4b17023SJohn Marino static rtx reload_override_in[MAX_RELOADS];
5792*e4b17023SJohn Marino 
5793*e4b17023SJohn Marino /* For each reload, the hard register number of the register used,
5794*e4b17023SJohn Marino    or -1 if we did not need a register for this reload.  */
5795*e4b17023SJohn Marino static int reload_spill_index[MAX_RELOADS];
5796*e4b17023SJohn Marino 
5797*e4b17023SJohn Marino /* Index X is the value of rld[X].reg_rtx, adjusted for the input mode.  */
5798*e4b17023SJohn Marino static rtx reload_reg_rtx_for_input[MAX_RELOADS];
5799*e4b17023SJohn Marino 
5800*e4b17023SJohn Marino /* Index X is the value of rld[X].reg_rtx, adjusted for the output mode.  */
5801*e4b17023SJohn Marino static rtx reload_reg_rtx_for_output[MAX_RELOADS];
5802*e4b17023SJohn Marino 
5803*e4b17023SJohn Marino /* Subroutine of free_for_value_p, used to check a single register.
5804*e4b17023SJohn Marino    START_REGNO is the starting regno of the full reload register
5805*e4b17023SJohn Marino    (possibly comprising multiple hard registers) that we are considering.  */
5806*e4b17023SJohn Marino 
5807*e4b17023SJohn Marino static int
reload_reg_free_for_value_p(int start_regno,int regno,int opnum,enum reload_type type,rtx value,rtx out,int reloadnum,int ignore_address_reloads)5808*e4b17023SJohn Marino reload_reg_free_for_value_p (int start_regno, int regno, int opnum,
5809*e4b17023SJohn Marino 			     enum reload_type type, rtx value, rtx out,
5810*e4b17023SJohn Marino 			     int reloadnum, int ignore_address_reloads)
5811*e4b17023SJohn Marino {
5812*e4b17023SJohn Marino   int time1;
5813*e4b17023SJohn Marino   /* Set if we see an input reload that must not share its reload register
5814*e4b17023SJohn Marino      with any new earlyclobber, but might otherwise share the reload
5815*e4b17023SJohn Marino      register with an output or input-output reload.  */
5816*e4b17023SJohn Marino   int check_earlyclobber = 0;
5817*e4b17023SJohn Marino   int i;
5818*e4b17023SJohn Marino   int copy = 0;
5819*e4b17023SJohn Marino 
5820*e4b17023SJohn Marino   if (TEST_HARD_REG_BIT (reload_reg_unavailable, regno))
5821*e4b17023SJohn Marino     return 0;
5822*e4b17023SJohn Marino 
5823*e4b17023SJohn Marino   if (out == const0_rtx)
5824*e4b17023SJohn Marino     {
5825*e4b17023SJohn Marino       copy = 1;
5826*e4b17023SJohn Marino       out = NULL_RTX;
5827*e4b17023SJohn Marino     }
5828*e4b17023SJohn Marino 
5829*e4b17023SJohn Marino   /* We use some pseudo 'time' value to check if the lifetimes of the
5830*e4b17023SJohn Marino      new register use would overlap with the one of a previous reload
5831*e4b17023SJohn Marino      that is not read-only or uses a different value.
5832*e4b17023SJohn Marino      The 'time' used doesn't have to be linear in any shape or form, just
5833*e4b17023SJohn Marino      monotonic.
5834*e4b17023SJohn Marino      Some reload types use different 'buckets' for each operand.
5835*e4b17023SJohn Marino      So there are MAX_RECOG_OPERANDS different time values for each
5836*e4b17023SJohn Marino      such reload type.
5837*e4b17023SJohn Marino      We compute TIME1 as the time when the register for the prospective
5838*e4b17023SJohn Marino      new reload ceases to be live, and TIME2 for each existing
5839*e4b17023SJohn Marino      reload as the time when that the reload register of that reload
5840*e4b17023SJohn Marino      becomes live.
5841*e4b17023SJohn Marino      Where there is little to be gained by exact lifetime calculations,
5842*e4b17023SJohn Marino      we just make conservative assumptions, i.e. a longer lifetime;
5843*e4b17023SJohn Marino      this is done in the 'default:' cases.  */
5844*e4b17023SJohn Marino   switch (type)
5845*e4b17023SJohn Marino     {
5846*e4b17023SJohn Marino     case RELOAD_FOR_OTHER_ADDRESS:
5847*e4b17023SJohn Marino       /* RELOAD_FOR_OTHER_ADDRESS conflicts with RELOAD_OTHER reloads.  */
5848*e4b17023SJohn Marino       time1 = copy ? 0 : 1;
5849*e4b17023SJohn Marino       break;
5850*e4b17023SJohn Marino     case RELOAD_OTHER:
5851*e4b17023SJohn Marino       time1 = copy ? 1 : MAX_RECOG_OPERANDS * 5 + 5;
5852*e4b17023SJohn Marino       break;
5853*e4b17023SJohn Marino       /* For each input, we may have a sequence of RELOAD_FOR_INPADDR_ADDRESS,
5854*e4b17023SJohn Marino 	 RELOAD_FOR_INPUT_ADDRESS and RELOAD_FOR_INPUT.  By adding 0 / 1 / 2 ,
5855*e4b17023SJohn Marino 	 respectively, to the time values for these, we get distinct time
5856*e4b17023SJohn Marino 	 values.  To get distinct time values for each operand, we have to
5857*e4b17023SJohn Marino 	 multiply opnum by at least three.  We round that up to four because
5858*e4b17023SJohn Marino 	 multiply by four is often cheaper.  */
5859*e4b17023SJohn Marino     case RELOAD_FOR_INPADDR_ADDRESS:
5860*e4b17023SJohn Marino       time1 = opnum * 4 + 2;
5861*e4b17023SJohn Marino       break;
5862*e4b17023SJohn Marino     case RELOAD_FOR_INPUT_ADDRESS:
5863*e4b17023SJohn Marino       time1 = opnum * 4 + 3;
5864*e4b17023SJohn Marino       break;
5865*e4b17023SJohn Marino     case RELOAD_FOR_INPUT:
5866*e4b17023SJohn Marino       /* All RELOAD_FOR_INPUT reloads remain live till the instruction
5867*e4b17023SJohn Marino 	 executes (inclusive).  */
5868*e4b17023SJohn Marino       time1 = copy ? opnum * 4 + 4 : MAX_RECOG_OPERANDS * 4 + 3;
5869*e4b17023SJohn Marino       break;
5870*e4b17023SJohn Marino     case RELOAD_FOR_OPADDR_ADDR:
5871*e4b17023SJohn Marino       /* opnum * 4 + 4
5872*e4b17023SJohn Marino 	 <= (MAX_RECOG_OPERANDS - 1) * 4 + 4 == MAX_RECOG_OPERANDS * 4 */
5873*e4b17023SJohn Marino       time1 = MAX_RECOG_OPERANDS * 4 + 1;
5874*e4b17023SJohn Marino       break;
5875*e4b17023SJohn Marino     case RELOAD_FOR_OPERAND_ADDRESS:
5876*e4b17023SJohn Marino       /* RELOAD_FOR_OPERAND_ADDRESS reloads are live even while the insn
5877*e4b17023SJohn Marino 	 is executed.  */
5878*e4b17023SJohn Marino       time1 = copy ? MAX_RECOG_OPERANDS * 4 + 2 : MAX_RECOG_OPERANDS * 4 + 3;
5879*e4b17023SJohn Marino       break;
5880*e4b17023SJohn Marino     case RELOAD_FOR_OUTADDR_ADDRESS:
5881*e4b17023SJohn Marino       time1 = MAX_RECOG_OPERANDS * 4 + 4 + opnum;
5882*e4b17023SJohn Marino       break;
5883*e4b17023SJohn Marino     case RELOAD_FOR_OUTPUT_ADDRESS:
5884*e4b17023SJohn Marino       time1 = MAX_RECOG_OPERANDS * 4 + 5 + opnum;
5885*e4b17023SJohn Marino       break;
5886*e4b17023SJohn Marino     default:
5887*e4b17023SJohn Marino       time1 = MAX_RECOG_OPERANDS * 5 + 5;
5888*e4b17023SJohn Marino     }
5889*e4b17023SJohn Marino 
5890*e4b17023SJohn Marino   for (i = 0; i < n_reloads; i++)
5891*e4b17023SJohn Marino     {
5892*e4b17023SJohn Marino       rtx reg = rld[i].reg_rtx;
5893*e4b17023SJohn Marino       if (reg && REG_P (reg)
5894*e4b17023SJohn Marino 	  && ((unsigned) regno - true_regnum (reg)
5895*e4b17023SJohn Marino 	      <= hard_regno_nregs[REGNO (reg)][GET_MODE (reg)] - (unsigned) 1)
5896*e4b17023SJohn Marino 	  && i != reloadnum)
5897*e4b17023SJohn Marino 	{
5898*e4b17023SJohn Marino 	  rtx other_input = rld[i].in;
5899*e4b17023SJohn Marino 
5900*e4b17023SJohn Marino 	  /* If the other reload loads the same input value, that
5901*e4b17023SJohn Marino 	     will not cause a conflict only if it's loading it into
5902*e4b17023SJohn Marino 	     the same register.  */
5903*e4b17023SJohn Marino 	  if (true_regnum (reg) != start_regno)
5904*e4b17023SJohn Marino 	    other_input = NULL_RTX;
5905*e4b17023SJohn Marino 	  if (! other_input || ! rtx_equal_p (other_input, value)
5906*e4b17023SJohn Marino 	      || rld[i].out || out)
5907*e4b17023SJohn Marino 	    {
5908*e4b17023SJohn Marino 	      int time2;
5909*e4b17023SJohn Marino 	      switch (rld[i].when_needed)
5910*e4b17023SJohn Marino 		{
5911*e4b17023SJohn Marino 		case RELOAD_FOR_OTHER_ADDRESS:
5912*e4b17023SJohn Marino 		  time2 = 0;
5913*e4b17023SJohn Marino 		  break;
5914*e4b17023SJohn Marino 		case RELOAD_FOR_INPADDR_ADDRESS:
5915*e4b17023SJohn Marino 		  /* find_reloads makes sure that a
5916*e4b17023SJohn Marino 		     RELOAD_FOR_{INP,OP,OUT}ADDR_ADDRESS reload is only used
5917*e4b17023SJohn Marino 		     by at most one - the first -
5918*e4b17023SJohn Marino 		     RELOAD_FOR_{INPUT,OPERAND,OUTPUT}_ADDRESS .  If the
5919*e4b17023SJohn Marino 		     address reload is inherited, the address address reload
5920*e4b17023SJohn Marino 		     goes away, so we can ignore this conflict.  */
5921*e4b17023SJohn Marino 		  if (type == RELOAD_FOR_INPUT_ADDRESS && reloadnum == i + 1
5922*e4b17023SJohn Marino 		      && ignore_address_reloads
5923*e4b17023SJohn Marino 		      /* Unless the RELOAD_FOR_INPUT is an auto_inc expression.
5924*e4b17023SJohn Marino 			 Then the address address is still needed to store
5925*e4b17023SJohn Marino 			 back the new address.  */
5926*e4b17023SJohn Marino 		      && ! rld[reloadnum].out)
5927*e4b17023SJohn Marino 		    continue;
5928*e4b17023SJohn Marino 		  /* Likewise, if a RELOAD_FOR_INPUT can inherit a value, its
5929*e4b17023SJohn Marino 		     RELOAD_FOR_INPUT_ADDRESS / RELOAD_FOR_INPADDR_ADDRESS
5930*e4b17023SJohn Marino 		     reloads go away.  */
5931*e4b17023SJohn Marino 		  if (type == RELOAD_FOR_INPUT && opnum == rld[i].opnum
5932*e4b17023SJohn Marino 		      && ignore_address_reloads
5933*e4b17023SJohn Marino 		      /* Unless we are reloading an auto_inc expression.  */
5934*e4b17023SJohn Marino 		      && ! rld[reloadnum].out)
5935*e4b17023SJohn Marino 		    continue;
5936*e4b17023SJohn Marino 		  time2 = rld[i].opnum * 4 + 2;
5937*e4b17023SJohn Marino 		  break;
5938*e4b17023SJohn Marino 		case RELOAD_FOR_INPUT_ADDRESS:
5939*e4b17023SJohn Marino 		  if (type == RELOAD_FOR_INPUT && opnum == rld[i].opnum
5940*e4b17023SJohn Marino 		      && ignore_address_reloads
5941*e4b17023SJohn Marino 		      && ! rld[reloadnum].out)
5942*e4b17023SJohn Marino 		    continue;
5943*e4b17023SJohn Marino 		  time2 = rld[i].opnum * 4 + 3;
5944*e4b17023SJohn Marino 		  break;
5945*e4b17023SJohn Marino 		case RELOAD_FOR_INPUT:
5946*e4b17023SJohn Marino 		  time2 = rld[i].opnum * 4 + 4;
5947*e4b17023SJohn Marino 		  check_earlyclobber = 1;
5948*e4b17023SJohn Marino 		  break;
5949*e4b17023SJohn Marino 		  /* rld[i].opnum * 4 + 4 <= (MAX_RECOG_OPERAND - 1) * 4 + 4
5950*e4b17023SJohn Marino 		     == MAX_RECOG_OPERAND * 4  */
5951*e4b17023SJohn Marino 		case RELOAD_FOR_OPADDR_ADDR:
5952*e4b17023SJohn Marino 		  if (type == RELOAD_FOR_OPERAND_ADDRESS && reloadnum == i + 1
5953*e4b17023SJohn Marino 		      && ignore_address_reloads
5954*e4b17023SJohn Marino 		      && ! rld[reloadnum].out)
5955*e4b17023SJohn Marino 		    continue;
5956*e4b17023SJohn Marino 		  time2 = MAX_RECOG_OPERANDS * 4 + 1;
5957*e4b17023SJohn Marino 		  break;
5958*e4b17023SJohn Marino 		case RELOAD_FOR_OPERAND_ADDRESS:
5959*e4b17023SJohn Marino 		  time2 = MAX_RECOG_OPERANDS * 4 + 2;
5960*e4b17023SJohn Marino 		  check_earlyclobber = 1;
5961*e4b17023SJohn Marino 		  break;
5962*e4b17023SJohn Marino 		case RELOAD_FOR_INSN:
5963*e4b17023SJohn Marino 		  time2 = MAX_RECOG_OPERANDS * 4 + 3;
5964*e4b17023SJohn Marino 		  break;
5965*e4b17023SJohn Marino 		case RELOAD_FOR_OUTPUT:
5966*e4b17023SJohn Marino 		  /* All RELOAD_FOR_OUTPUT reloads become live just after the
5967*e4b17023SJohn Marino 		     instruction is executed.  */
5968*e4b17023SJohn Marino 		  time2 = MAX_RECOG_OPERANDS * 4 + 4;
5969*e4b17023SJohn Marino 		  break;
5970*e4b17023SJohn Marino 		  /* The first RELOAD_FOR_OUTADDR_ADDRESS reload conflicts with
5971*e4b17023SJohn Marino 		     the RELOAD_FOR_OUTPUT reloads, so assign it the same time
5972*e4b17023SJohn Marino 		     value.  */
5973*e4b17023SJohn Marino 		case RELOAD_FOR_OUTADDR_ADDRESS:
5974*e4b17023SJohn Marino 		  if (type == RELOAD_FOR_OUTPUT_ADDRESS && reloadnum == i + 1
5975*e4b17023SJohn Marino 		      && ignore_address_reloads
5976*e4b17023SJohn Marino 		      && ! rld[reloadnum].out)
5977*e4b17023SJohn Marino 		    continue;
5978*e4b17023SJohn Marino 		  time2 = MAX_RECOG_OPERANDS * 4 + 4 + rld[i].opnum;
5979*e4b17023SJohn Marino 		  break;
5980*e4b17023SJohn Marino 		case RELOAD_FOR_OUTPUT_ADDRESS:
5981*e4b17023SJohn Marino 		  time2 = MAX_RECOG_OPERANDS * 4 + 5 + rld[i].opnum;
5982*e4b17023SJohn Marino 		  break;
5983*e4b17023SJohn Marino 		case RELOAD_OTHER:
5984*e4b17023SJohn Marino 		  /* If there is no conflict in the input part, handle this
5985*e4b17023SJohn Marino 		     like an output reload.  */
5986*e4b17023SJohn Marino 		  if (! rld[i].in || rtx_equal_p (other_input, value))
5987*e4b17023SJohn Marino 		    {
5988*e4b17023SJohn Marino 		      time2 = MAX_RECOG_OPERANDS * 4 + 4;
5989*e4b17023SJohn Marino 		      /* Earlyclobbered outputs must conflict with inputs.  */
5990*e4b17023SJohn Marino 		      if (earlyclobber_operand_p (rld[i].out))
5991*e4b17023SJohn Marino 			time2 = MAX_RECOG_OPERANDS * 4 + 3;
5992*e4b17023SJohn Marino 
5993*e4b17023SJohn Marino 		      break;
5994*e4b17023SJohn Marino 		    }
5995*e4b17023SJohn Marino 		  time2 = 1;
5996*e4b17023SJohn Marino 		  /* RELOAD_OTHER might be live beyond instruction execution,
5997*e4b17023SJohn Marino 		     but this is not obvious when we set time2 = 1.  So check
5998*e4b17023SJohn Marino 		     here if there might be a problem with the new reload
5999*e4b17023SJohn Marino 		     clobbering the register used by the RELOAD_OTHER.  */
6000*e4b17023SJohn Marino 		  if (out)
6001*e4b17023SJohn Marino 		    return 0;
6002*e4b17023SJohn Marino 		  break;
6003*e4b17023SJohn Marino 		default:
6004*e4b17023SJohn Marino 		  return 0;
6005*e4b17023SJohn Marino 		}
6006*e4b17023SJohn Marino 	      if ((time1 >= time2
6007*e4b17023SJohn Marino 		   && (! rld[i].in || rld[i].out
6008*e4b17023SJohn Marino 		       || ! rtx_equal_p (other_input, value)))
6009*e4b17023SJohn Marino 		  || (out && rld[reloadnum].out_reg
6010*e4b17023SJohn Marino 		      && time2 >= MAX_RECOG_OPERANDS * 4 + 3))
6011*e4b17023SJohn Marino 		return 0;
6012*e4b17023SJohn Marino 	    }
6013*e4b17023SJohn Marino 	}
6014*e4b17023SJohn Marino     }
6015*e4b17023SJohn Marino 
6016*e4b17023SJohn Marino   /* Earlyclobbered outputs must conflict with inputs.  */
6017*e4b17023SJohn Marino   if (check_earlyclobber && out && earlyclobber_operand_p (out))
6018*e4b17023SJohn Marino     return 0;
6019*e4b17023SJohn Marino 
6020*e4b17023SJohn Marino   return 1;
6021*e4b17023SJohn Marino }
6022*e4b17023SJohn Marino 
6023*e4b17023SJohn Marino /* Return 1 if the value in reload reg REGNO, as used by a reload
6024*e4b17023SJohn Marino    needed for the part of the insn specified by OPNUM and TYPE,
6025*e4b17023SJohn Marino    may be used to load VALUE into it.
6026*e4b17023SJohn Marino 
6027*e4b17023SJohn Marino    MODE is the mode in which the register is used, this is needed to
6028*e4b17023SJohn Marino    determine how many hard regs to test.
6029*e4b17023SJohn Marino 
6030*e4b17023SJohn Marino    Other read-only reloads with the same value do not conflict
6031*e4b17023SJohn Marino    unless OUT is nonzero and these other reloads have to live while
6032*e4b17023SJohn Marino    output reloads live.
6033*e4b17023SJohn Marino    If OUT is CONST0_RTX, this is a special case: it means that the
6034*e4b17023SJohn Marino    test should not be for using register REGNO as reload register, but
6035*e4b17023SJohn Marino    for copying from register REGNO into the reload register.
6036*e4b17023SJohn Marino 
6037*e4b17023SJohn Marino    RELOADNUM is the number of the reload we want to load this value for;
6038*e4b17023SJohn Marino    a reload does not conflict with itself.
6039*e4b17023SJohn Marino 
6040*e4b17023SJohn Marino    When IGNORE_ADDRESS_RELOADS is set, we can not have conflicts with
6041*e4b17023SJohn Marino    reloads that load an address for the very reload we are considering.
6042*e4b17023SJohn Marino 
6043*e4b17023SJohn Marino    The caller has to make sure that there is no conflict with the return
6044*e4b17023SJohn Marino    register.  */
6045*e4b17023SJohn Marino 
6046*e4b17023SJohn Marino static int
free_for_value_p(int regno,enum machine_mode mode,int opnum,enum reload_type type,rtx value,rtx out,int reloadnum,int ignore_address_reloads)6047*e4b17023SJohn Marino free_for_value_p (int regno, enum machine_mode mode, int opnum,
6048*e4b17023SJohn Marino 		  enum reload_type type, rtx value, rtx out, int reloadnum,
6049*e4b17023SJohn Marino 		  int ignore_address_reloads)
6050*e4b17023SJohn Marino {
6051*e4b17023SJohn Marino   int nregs = hard_regno_nregs[regno][mode];
6052*e4b17023SJohn Marino   while (nregs-- > 0)
6053*e4b17023SJohn Marino     if (! reload_reg_free_for_value_p (regno, regno + nregs, opnum, type,
6054*e4b17023SJohn Marino 				       value, out, reloadnum,
6055*e4b17023SJohn Marino 				       ignore_address_reloads))
6056*e4b17023SJohn Marino       return 0;
6057*e4b17023SJohn Marino   return 1;
6058*e4b17023SJohn Marino }
6059*e4b17023SJohn Marino 
6060*e4b17023SJohn Marino /* Return nonzero if the rtx X is invariant over the current function.  */
6061*e4b17023SJohn Marino /* ??? Actually, the places where we use this expect exactly what is
6062*e4b17023SJohn Marino    tested here, and not everything that is function invariant.  In
6063*e4b17023SJohn Marino    particular, the frame pointer and arg pointer are special cased;
6064*e4b17023SJohn Marino    pic_offset_table_rtx is not, and we must not spill these things to
6065*e4b17023SJohn Marino    memory.  */
6066*e4b17023SJohn Marino 
6067*e4b17023SJohn Marino int
function_invariant_p(const_rtx x)6068*e4b17023SJohn Marino function_invariant_p (const_rtx x)
6069*e4b17023SJohn Marino {
6070*e4b17023SJohn Marino   if (CONSTANT_P (x))
6071*e4b17023SJohn Marino     return 1;
6072*e4b17023SJohn Marino   if (x == frame_pointer_rtx || x == arg_pointer_rtx)
6073*e4b17023SJohn Marino     return 1;
6074*e4b17023SJohn Marino   if (GET_CODE (x) == PLUS
6075*e4b17023SJohn Marino       && (XEXP (x, 0) == frame_pointer_rtx || XEXP (x, 0) == arg_pointer_rtx)
6076*e4b17023SJohn Marino       && GET_CODE (XEXP (x, 1)) == CONST_INT)
6077*e4b17023SJohn Marino     return 1;
6078*e4b17023SJohn Marino   return 0;
6079*e4b17023SJohn Marino }
6080*e4b17023SJohn Marino 
6081*e4b17023SJohn Marino /* Determine whether the reload reg X overlaps any rtx'es used for
6082*e4b17023SJohn Marino    overriding inheritance.  Return nonzero if so.  */
6083*e4b17023SJohn Marino 
6084*e4b17023SJohn Marino static int
conflicts_with_override(rtx x)6085*e4b17023SJohn Marino conflicts_with_override (rtx x)
6086*e4b17023SJohn Marino {
6087*e4b17023SJohn Marino   int i;
6088*e4b17023SJohn Marino   for (i = 0; i < n_reloads; i++)
6089*e4b17023SJohn Marino     if (reload_override_in[i]
6090*e4b17023SJohn Marino 	&& reg_overlap_mentioned_p (x, reload_override_in[i]))
6091*e4b17023SJohn Marino       return 1;
6092*e4b17023SJohn Marino   return 0;
6093*e4b17023SJohn Marino }
6094*e4b17023SJohn Marino 
6095*e4b17023SJohn Marino /* Give an error message saying we failed to find a reload for INSN,
6096*e4b17023SJohn Marino    and clear out reload R.  */
6097*e4b17023SJohn Marino static void
failed_reload(rtx insn,int r)6098*e4b17023SJohn Marino failed_reload (rtx insn, int r)
6099*e4b17023SJohn Marino {
6100*e4b17023SJohn Marino   if (asm_noperands (PATTERN (insn)) < 0)
6101*e4b17023SJohn Marino     /* It's the compiler's fault.  */
6102*e4b17023SJohn Marino     fatal_insn ("could not find a spill register", insn);
6103*e4b17023SJohn Marino 
6104*e4b17023SJohn Marino   /* It's the user's fault; the operand's mode and constraint
6105*e4b17023SJohn Marino      don't match.  Disable this reload so we don't crash in final.  */
6106*e4b17023SJohn Marino   error_for_asm (insn,
6107*e4b17023SJohn Marino 		 "%<asm%> operand constraint incompatible with operand size");
6108*e4b17023SJohn Marino   rld[r].in = 0;
6109*e4b17023SJohn Marino   rld[r].out = 0;
6110*e4b17023SJohn Marino   rld[r].reg_rtx = 0;
6111*e4b17023SJohn Marino   rld[r].optional = 1;
6112*e4b17023SJohn Marino   rld[r].secondary_p = 1;
6113*e4b17023SJohn Marino }
6114*e4b17023SJohn Marino 
6115*e4b17023SJohn Marino /* I is the index in SPILL_REG_RTX of the reload register we are to allocate
6116*e4b17023SJohn Marino    for reload R.  If it's valid, get an rtx for it.  Return nonzero if
6117*e4b17023SJohn Marino    successful.  */
6118*e4b17023SJohn Marino static int
set_reload_reg(int i,int r)6119*e4b17023SJohn Marino set_reload_reg (int i, int r)
6120*e4b17023SJohn Marino {
6121*e4b17023SJohn Marino   /* regno is 'set but not used' if HARD_REGNO_MODE_OK doesn't use its first
6122*e4b17023SJohn Marino      parameter.  */
6123*e4b17023SJohn Marino   int regno ATTRIBUTE_UNUSED;
6124*e4b17023SJohn Marino   rtx reg = spill_reg_rtx[i];
6125*e4b17023SJohn Marino 
6126*e4b17023SJohn Marino   if (reg == 0 || GET_MODE (reg) != rld[r].mode)
6127*e4b17023SJohn Marino     spill_reg_rtx[i] = reg
6128*e4b17023SJohn Marino       = gen_rtx_REG (rld[r].mode, spill_regs[i]);
6129*e4b17023SJohn Marino 
6130*e4b17023SJohn Marino   regno = true_regnum (reg);
6131*e4b17023SJohn Marino 
6132*e4b17023SJohn Marino   /* Detect when the reload reg can't hold the reload mode.
6133*e4b17023SJohn Marino      This used to be one `if', but Sequent compiler can't handle that.  */
6134*e4b17023SJohn Marino   if (HARD_REGNO_MODE_OK (regno, rld[r].mode))
6135*e4b17023SJohn Marino     {
6136*e4b17023SJohn Marino       enum machine_mode test_mode = VOIDmode;
6137*e4b17023SJohn Marino       if (rld[r].in)
6138*e4b17023SJohn Marino 	test_mode = GET_MODE (rld[r].in);
6139*e4b17023SJohn Marino       /* If rld[r].in has VOIDmode, it means we will load it
6140*e4b17023SJohn Marino 	 in whatever mode the reload reg has: to wit, rld[r].mode.
6141*e4b17023SJohn Marino 	 We have already tested that for validity.  */
6142*e4b17023SJohn Marino       /* Aside from that, we need to test that the expressions
6143*e4b17023SJohn Marino 	 to reload from or into have modes which are valid for this
6144*e4b17023SJohn Marino 	 reload register.  Otherwise the reload insns would be invalid.  */
6145*e4b17023SJohn Marino       if (! (rld[r].in != 0 && test_mode != VOIDmode
6146*e4b17023SJohn Marino 	     && ! HARD_REGNO_MODE_OK (regno, test_mode)))
6147*e4b17023SJohn Marino 	if (! (rld[r].out != 0
6148*e4b17023SJohn Marino 	       && ! HARD_REGNO_MODE_OK (regno, GET_MODE (rld[r].out))))
6149*e4b17023SJohn Marino 	  {
6150*e4b17023SJohn Marino 	    /* The reg is OK.  */
6151*e4b17023SJohn Marino 	    last_spill_reg = i;
6152*e4b17023SJohn Marino 
6153*e4b17023SJohn Marino 	    /* Mark as in use for this insn the reload regs we use
6154*e4b17023SJohn Marino 	       for this.  */
6155*e4b17023SJohn Marino 	    mark_reload_reg_in_use (spill_regs[i], rld[r].opnum,
6156*e4b17023SJohn Marino 				    rld[r].when_needed, rld[r].mode);
6157*e4b17023SJohn Marino 
6158*e4b17023SJohn Marino 	    rld[r].reg_rtx = reg;
6159*e4b17023SJohn Marino 	    reload_spill_index[r] = spill_regs[i];
6160*e4b17023SJohn Marino 	    return 1;
6161*e4b17023SJohn Marino 	  }
6162*e4b17023SJohn Marino     }
6163*e4b17023SJohn Marino   return 0;
6164*e4b17023SJohn Marino }
6165*e4b17023SJohn Marino 
6166*e4b17023SJohn Marino /* Find a spill register to use as a reload register for reload R.
6167*e4b17023SJohn Marino    LAST_RELOAD is nonzero if this is the last reload for the insn being
6168*e4b17023SJohn Marino    processed.
6169*e4b17023SJohn Marino 
6170*e4b17023SJohn Marino    Set rld[R].reg_rtx to the register allocated.
6171*e4b17023SJohn Marino 
6172*e4b17023SJohn Marino    We return 1 if successful, or 0 if we couldn't find a spill reg and
6173*e4b17023SJohn Marino    we didn't change anything.  */
6174*e4b17023SJohn Marino 
6175*e4b17023SJohn Marino static int
allocate_reload_reg(struct insn_chain * chain ATTRIBUTE_UNUSED,int r,int last_reload)6176*e4b17023SJohn Marino allocate_reload_reg (struct insn_chain *chain ATTRIBUTE_UNUSED, int r,
6177*e4b17023SJohn Marino 		     int last_reload)
6178*e4b17023SJohn Marino {
6179*e4b17023SJohn Marino   int i, pass, count;
6180*e4b17023SJohn Marino 
6181*e4b17023SJohn Marino   /* If we put this reload ahead, thinking it is a group,
6182*e4b17023SJohn Marino      then insist on finding a group.  Otherwise we can grab a
6183*e4b17023SJohn Marino      reg that some other reload needs.
6184*e4b17023SJohn Marino      (That can happen when we have a 68000 DATA_OR_FP_REG
6185*e4b17023SJohn Marino      which is a group of data regs or one fp reg.)
6186*e4b17023SJohn Marino      We need not be so restrictive if there are no more reloads
6187*e4b17023SJohn Marino      for this insn.
6188*e4b17023SJohn Marino 
6189*e4b17023SJohn Marino      ??? Really it would be nicer to have smarter handling
6190*e4b17023SJohn Marino      for that kind of reg class, where a problem like this is normal.
6191*e4b17023SJohn Marino      Perhaps those classes should be avoided for reloading
6192*e4b17023SJohn Marino      by use of more alternatives.  */
6193*e4b17023SJohn Marino 
6194*e4b17023SJohn Marino   int force_group = rld[r].nregs > 1 && ! last_reload;
6195*e4b17023SJohn Marino 
6196*e4b17023SJohn Marino   /* If we want a single register and haven't yet found one,
6197*e4b17023SJohn Marino      take any reg in the right class and not in use.
6198*e4b17023SJohn Marino      If we want a consecutive group, here is where we look for it.
6199*e4b17023SJohn Marino 
6200*e4b17023SJohn Marino      We use three passes so we can first look for reload regs to
6201*e4b17023SJohn Marino      reuse, which are already in use for other reloads in this insn,
6202*e4b17023SJohn Marino      and only then use additional registers which are not "bad", then
6203*e4b17023SJohn Marino      finally any register.
6204*e4b17023SJohn Marino 
6205*e4b17023SJohn Marino      I think that maximizing reuse is needed to make sure we don't
6206*e4b17023SJohn Marino      run out of reload regs.  Suppose we have three reloads, and
6207*e4b17023SJohn Marino      reloads A and B can share regs.  These need two regs.
6208*e4b17023SJohn Marino      Suppose A and B are given different regs.
6209*e4b17023SJohn Marino      That leaves none for C.  */
6210*e4b17023SJohn Marino   for (pass = 0; pass < 3; pass++)
6211*e4b17023SJohn Marino     {
6212*e4b17023SJohn Marino       /* I is the index in spill_regs.
6213*e4b17023SJohn Marino 	 We advance it round-robin between insns to use all spill regs
6214*e4b17023SJohn Marino 	 equally, so that inherited reloads have a chance
6215*e4b17023SJohn Marino 	 of leapfrogging each other.  */
6216*e4b17023SJohn Marino 
6217*e4b17023SJohn Marino       i = last_spill_reg;
6218*e4b17023SJohn Marino 
6219*e4b17023SJohn Marino       for (count = 0; count < n_spills; count++)
6220*e4b17023SJohn Marino 	{
6221*e4b17023SJohn Marino 	  int rclass = (int) rld[r].rclass;
6222*e4b17023SJohn Marino 	  int regnum;
6223*e4b17023SJohn Marino 
6224*e4b17023SJohn Marino 	  i++;
6225*e4b17023SJohn Marino 	  if (i >= n_spills)
6226*e4b17023SJohn Marino 	    i -= n_spills;
6227*e4b17023SJohn Marino 	  regnum = spill_regs[i];
6228*e4b17023SJohn Marino 
6229*e4b17023SJohn Marino 	  if ((reload_reg_free_p (regnum, rld[r].opnum,
6230*e4b17023SJohn Marino 				  rld[r].when_needed)
6231*e4b17023SJohn Marino 	       || (rld[r].in
6232*e4b17023SJohn Marino 		   /* We check reload_reg_used to make sure we
6233*e4b17023SJohn Marino 		      don't clobber the return register.  */
6234*e4b17023SJohn Marino 		   && ! TEST_HARD_REG_BIT (reload_reg_used, regnum)
6235*e4b17023SJohn Marino 		   && free_for_value_p (regnum, rld[r].mode, rld[r].opnum,
6236*e4b17023SJohn Marino 					rld[r].when_needed, rld[r].in,
6237*e4b17023SJohn Marino 					rld[r].out, r, 1)))
6238*e4b17023SJohn Marino 	      && TEST_HARD_REG_BIT (reg_class_contents[rclass], regnum)
6239*e4b17023SJohn Marino 	      && HARD_REGNO_MODE_OK (regnum, rld[r].mode)
6240*e4b17023SJohn Marino 	      /* Look first for regs to share, then for unshared.  But
6241*e4b17023SJohn Marino 		 don't share regs used for inherited reloads; they are
6242*e4b17023SJohn Marino 		 the ones we want to preserve.  */
6243*e4b17023SJohn Marino 	      && (pass
6244*e4b17023SJohn Marino 		  || (TEST_HARD_REG_BIT (reload_reg_used_at_all,
6245*e4b17023SJohn Marino 					 regnum)
6246*e4b17023SJohn Marino 		      && ! TEST_HARD_REG_BIT (reload_reg_used_for_inherit,
6247*e4b17023SJohn Marino 					      regnum))))
6248*e4b17023SJohn Marino 	    {
6249*e4b17023SJohn Marino 	      int nr = hard_regno_nregs[regnum][rld[r].mode];
6250*e4b17023SJohn Marino 
6251*e4b17023SJohn Marino 	      /* During the second pass we want to avoid reload registers
6252*e4b17023SJohn Marino 		 which are "bad" for this reload.  */
6253*e4b17023SJohn Marino 	      if (pass == 1
6254*e4b17023SJohn Marino 		  && ira_bad_reload_regno (regnum, rld[r].in, rld[r].out))
6255*e4b17023SJohn Marino 		continue;
6256*e4b17023SJohn Marino 
6257*e4b17023SJohn Marino 	      /* Avoid the problem where spilling a GENERAL_OR_FP_REG
6258*e4b17023SJohn Marino 		 (on 68000) got us two FP regs.  If NR is 1,
6259*e4b17023SJohn Marino 		 we would reject both of them.  */
6260*e4b17023SJohn Marino 	      if (force_group)
6261*e4b17023SJohn Marino 		nr = rld[r].nregs;
6262*e4b17023SJohn Marino 	      /* If we need only one reg, we have already won.  */
6263*e4b17023SJohn Marino 	      if (nr == 1)
6264*e4b17023SJohn Marino 		{
6265*e4b17023SJohn Marino 		  /* But reject a single reg if we demand a group.  */
6266*e4b17023SJohn Marino 		  if (force_group)
6267*e4b17023SJohn Marino 		    continue;
6268*e4b17023SJohn Marino 		  break;
6269*e4b17023SJohn Marino 		}
6270*e4b17023SJohn Marino 	      /* Otherwise check that as many consecutive regs as we need
6271*e4b17023SJohn Marino 		 are available here.  */
6272*e4b17023SJohn Marino 	      while (nr > 1)
6273*e4b17023SJohn Marino 		{
6274*e4b17023SJohn Marino 		  int regno = regnum + nr - 1;
6275*e4b17023SJohn Marino 		  if (!(TEST_HARD_REG_BIT (reg_class_contents[rclass], regno)
6276*e4b17023SJohn Marino 			&& spill_reg_order[regno] >= 0
6277*e4b17023SJohn Marino 			&& reload_reg_free_p (regno, rld[r].opnum,
6278*e4b17023SJohn Marino 					      rld[r].when_needed)))
6279*e4b17023SJohn Marino 		    break;
6280*e4b17023SJohn Marino 		  nr--;
6281*e4b17023SJohn Marino 		}
6282*e4b17023SJohn Marino 	      if (nr == 1)
6283*e4b17023SJohn Marino 		break;
6284*e4b17023SJohn Marino 	    }
6285*e4b17023SJohn Marino 	}
6286*e4b17023SJohn Marino 
6287*e4b17023SJohn Marino       /* If we found something on the current pass, omit later passes.  */
6288*e4b17023SJohn Marino       if (count < n_spills)
6289*e4b17023SJohn Marino 	break;
6290*e4b17023SJohn Marino     }
6291*e4b17023SJohn Marino 
6292*e4b17023SJohn Marino   /* We should have found a spill register by now.  */
6293*e4b17023SJohn Marino   if (count >= n_spills)
6294*e4b17023SJohn Marino     return 0;
6295*e4b17023SJohn Marino 
6296*e4b17023SJohn Marino   /* I is the index in SPILL_REG_RTX of the reload register we are to
6297*e4b17023SJohn Marino      allocate.  Get an rtx for it and find its register number.  */
6298*e4b17023SJohn Marino 
6299*e4b17023SJohn Marino   return set_reload_reg (i, r);
6300*e4b17023SJohn Marino }
6301*e4b17023SJohn Marino 
6302*e4b17023SJohn Marino /* Initialize all the tables needed to allocate reload registers.
6303*e4b17023SJohn Marino    CHAIN is the insn currently being processed; SAVE_RELOAD_REG_RTX
6304*e4b17023SJohn Marino    is the array we use to restore the reg_rtx field for every reload.  */
6305*e4b17023SJohn Marino 
6306*e4b17023SJohn Marino static void
choose_reload_regs_init(struct insn_chain * chain,rtx * save_reload_reg_rtx)6307*e4b17023SJohn Marino choose_reload_regs_init (struct insn_chain *chain, rtx *save_reload_reg_rtx)
6308*e4b17023SJohn Marino {
6309*e4b17023SJohn Marino   int i;
6310*e4b17023SJohn Marino 
6311*e4b17023SJohn Marino   for (i = 0; i < n_reloads; i++)
6312*e4b17023SJohn Marino     rld[i].reg_rtx = save_reload_reg_rtx[i];
6313*e4b17023SJohn Marino 
6314*e4b17023SJohn Marino   memset (reload_inherited, 0, MAX_RELOADS);
6315*e4b17023SJohn Marino   memset (reload_inheritance_insn, 0, MAX_RELOADS * sizeof (rtx));
6316*e4b17023SJohn Marino   memset (reload_override_in, 0, MAX_RELOADS * sizeof (rtx));
6317*e4b17023SJohn Marino 
6318*e4b17023SJohn Marino   CLEAR_HARD_REG_SET (reload_reg_used);
6319*e4b17023SJohn Marino   CLEAR_HARD_REG_SET (reload_reg_used_at_all);
6320*e4b17023SJohn Marino   CLEAR_HARD_REG_SET (reload_reg_used_in_op_addr);
6321*e4b17023SJohn Marino   CLEAR_HARD_REG_SET (reload_reg_used_in_op_addr_reload);
6322*e4b17023SJohn Marino   CLEAR_HARD_REG_SET (reload_reg_used_in_insn);
6323*e4b17023SJohn Marino   CLEAR_HARD_REG_SET (reload_reg_used_in_other_addr);
6324*e4b17023SJohn Marino 
6325*e4b17023SJohn Marino   CLEAR_HARD_REG_SET (reg_used_in_insn);
6326*e4b17023SJohn Marino   {
6327*e4b17023SJohn Marino     HARD_REG_SET tmp;
6328*e4b17023SJohn Marino     REG_SET_TO_HARD_REG_SET (tmp, &chain->live_throughout);
6329*e4b17023SJohn Marino     IOR_HARD_REG_SET (reg_used_in_insn, tmp);
6330*e4b17023SJohn Marino     REG_SET_TO_HARD_REG_SET (tmp, &chain->dead_or_set);
6331*e4b17023SJohn Marino     IOR_HARD_REG_SET (reg_used_in_insn, tmp);
6332*e4b17023SJohn Marino     compute_use_by_pseudos (&reg_used_in_insn, &chain->live_throughout);
6333*e4b17023SJohn Marino     compute_use_by_pseudos (&reg_used_in_insn, &chain->dead_or_set);
6334*e4b17023SJohn Marino   }
6335*e4b17023SJohn Marino 
6336*e4b17023SJohn Marino   for (i = 0; i < reload_n_operands; i++)
6337*e4b17023SJohn Marino     {
6338*e4b17023SJohn Marino       CLEAR_HARD_REG_SET (reload_reg_used_in_output[i]);
6339*e4b17023SJohn Marino       CLEAR_HARD_REG_SET (reload_reg_used_in_input[i]);
6340*e4b17023SJohn Marino       CLEAR_HARD_REG_SET (reload_reg_used_in_input_addr[i]);
6341*e4b17023SJohn Marino       CLEAR_HARD_REG_SET (reload_reg_used_in_inpaddr_addr[i]);
6342*e4b17023SJohn Marino       CLEAR_HARD_REG_SET (reload_reg_used_in_output_addr[i]);
6343*e4b17023SJohn Marino       CLEAR_HARD_REG_SET (reload_reg_used_in_outaddr_addr[i]);
6344*e4b17023SJohn Marino     }
6345*e4b17023SJohn Marino 
6346*e4b17023SJohn Marino   COMPL_HARD_REG_SET (reload_reg_unavailable, chain->used_spill_regs);
6347*e4b17023SJohn Marino 
6348*e4b17023SJohn Marino   CLEAR_HARD_REG_SET (reload_reg_used_for_inherit);
6349*e4b17023SJohn Marino 
6350*e4b17023SJohn Marino   for (i = 0; i < n_reloads; i++)
6351*e4b17023SJohn Marino     /* If we have already decided to use a certain register,
6352*e4b17023SJohn Marino        don't use it in another way.  */
6353*e4b17023SJohn Marino     if (rld[i].reg_rtx)
6354*e4b17023SJohn Marino       mark_reload_reg_in_use (REGNO (rld[i].reg_rtx), rld[i].opnum,
6355*e4b17023SJohn Marino 			      rld[i].when_needed, rld[i].mode);
6356*e4b17023SJohn Marino }
6357*e4b17023SJohn Marino 
6358*e4b17023SJohn Marino /* Assign hard reg targets for the pseudo-registers we must reload
6359*e4b17023SJohn Marino    into hard regs for this insn.
6360*e4b17023SJohn Marino    Also output the instructions to copy them in and out of the hard regs.
6361*e4b17023SJohn Marino 
6362*e4b17023SJohn Marino    For machines with register classes, we are responsible for
6363*e4b17023SJohn Marino    finding a reload reg in the proper class.  */
6364*e4b17023SJohn Marino 
6365*e4b17023SJohn Marino static void
choose_reload_regs(struct insn_chain * chain)6366*e4b17023SJohn Marino choose_reload_regs (struct insn_chain *chain)
6367*e4b17023SJohn Marino {
6368*e4b17023SJohn Marino   rtx insn = chain->insn;
6369*e4b17023SJohn Marino   int i, j;
6370*e4b17023SJohn Marino   unsigned int max_group_size = 1;
6371*e4b17023SJohn Marino   enum reg_class group_class = NO_REGS;
6372*e4b17023SJohn Marino   int pass, win, inheritance;
6373*e4b17023SJohn Marino 
6374*e4b17023SJohn Marino   rtx save_reload_reg_rtx[MAX_RELOADS];
6375*e4b17023SJohn Marino 
6376*e4b17023SJohn Marino   /* In order to be certain of getting the registers we need,
6377*e4b17023SJohn Marino      we must sort the reloads into order of increasing register class.
6378*e4b17023SJohn Marino      Then our grabbing of reload registers will parallel the process
6379*e4b17023SJohn Marino      that provided the reload registers.
6380*e4b17023SJohn Marino 
6381*e4b17023SJohn Marino      Also note whether any of the reloads wants a consecutive group of regs.
6382*e4b17023SJohn Marino      If so, record the maximum size of the group desired and what
6383*e4b17023SJohn Marino      register class contains all the groups needed by this insn.  */
6384*e4b17023SJohn Marino 
6385*e4b17023SJohn Marino   for (j = 0; j < n_reloads; j++)
6386*e4b17023SJohn Marino     {
6387*e4b17023SJohn Marino       reload_order[j] = j;
6388*e4b17023SJohn Marino       if (rld[j].reg_rtx != NULL_RTX)
6389*e4b17023SJohn Marino 	{
6390*e4b17023SJohn Marino 	  gcc_assert (REG_P (rld[j].reg_rtx)
6391*e4b17023SJohn Marino 		      && HARD_REGISTER_P (rld[j].reg_rtx));
6392*e4b17023SJohn Marino 	  reload_spill_index[j] = REGNO (rld[j].reg_rtx);
6393*e4b17023SJohn Marino 	}
6394*e4b17023SJohn Marino       else
6395*e4b17023SJohn Marino 	reload_spill_index[j] = -1;
6396*e4b17023SJohn Marino 
6397*e4b17023SJohn Marino       if (rld[j].nregs > 1)
6398*e4b17023SJohn Marino 	{
6399*e4b17023SJohn Marino 	  max_group_size = MAX (rld[j].nregs, max_group_size);
6400*e4b17023SJohn Marino 	  group_class
6401*e4b17023SJohn Marino 	    = reg_class_superunion[(int) rld[j].rclass][(int) group_class];
6402*e4b17023SJohn Marino 	}
6403*e4b17023SJohn Marino 
6404*e4b17023SJohn Marino       save_reload_reg_rtx[j] = rld[j].reg_rtx;
6405*e4b17023SJohn Marino     }
6406*e4b17023SJohn Marino 
6407*e4b17023SJohn Marino   if (n_reloads > 1)
6408*e4b17023SJohn Marino     qsort (reload_order, n_reloads, sizeof (short), reload_reg_class_lower);
6409*e4b17023SJohn Marino 
6410*e4b17023SJohn Marino   /* If -O, try first with inheritance, then turning it off.
6411*e4b17023SJohn Marino      If not -O, don't do inheritance.
6412*e4b17023SJohn Marino      Using inheritance when not optimizing leads to paradoxes
6413*e4b17023SJohn Marino      with fp on the 68k: fp numbers (not NaNs) fail to be equal to themselves
6414*e4b17023SJohn Marino      because one side of the comparison might be inherited.  */
6415*e4b17023SJohn Marino   win = 0;
6416*e4b17023SJohn Marino   for (inheritance = optimize > 0; inheritance >= 0; inheritance--)
6417*e4b17023SJohn Marino     {
6418*e4b17023SJohn Marino       choose_reload_regs_init (chain, save_reload_reg_rtx);
6419*e4b17023SJohn Marino 
6420*e4b17023SJohn Marino       /* Process the reloads in order of preference just found.
6421*e4b17023SJohn Marino 	 Beyond this point, subregs can be found in reload_reg_rtx.
6422*e4b17023SJohn Marino 
6423*e4b17023SJohn Marino 	 This used to look for an existing reloaded home for all of the
6424*e4b17023SJohn Marino 	 reloads, and only then perform any new reloads.  But that could lose
6425*e4b17023SJohn Marino 	 if the reloads were done out of reg-class order because a later
6426*e4b17023SJohn Marino 	 reload with a looser constraint might have an old home in a register
6427*e4b17023SJohn Marino 	 needed by an earlier reload with a tighter constraint.
6428*e4b17023SJohn Marino 
6429*e4b17023SJohn Marino 	 To solve this, we make two passes over the reloads, in the order
6430*e4b17023SJohn Marino 	 described above.  In the first pass we try to inherit a reload
6431*e4b17023SJohn Marino 	 from a previous insn.  If there is a later reload that needs a
6432*e4b17023SJohn Marino 	 class that is a proper subset of the class being processed, we must
6433*e4b17023SJohn Marino 	 also allocate a spill register during the first pass.
6434*e4b17023SJohn Marino 
6435*e4b17023SJohn Marino 	 Then make a second pass over the reloads to allocate any reloads
6436*e4b17023SJohn Marino 	 that haven't been given registers yet.  */
6437*e4b17023SJohn Marino 
6438*e4b17023SJohn Marino       for (j = 0; j < n_reloads; j++)
6439*e4b17023SJohn Marino 	{
6440*e4b17023SJohn Marino 	  int r = reload_order[j];
6441*e4b17023SJohn Marino 	  rtx search_equiv = NULL_RTX;
6442*e4b17023SJohn Marino 
6443*e4b17023SJohn Marino 	  /* Ignore reloads that got marked inoperative.  */
6444*e4b17023SJohn Marino 	  if (rld[r].out == 0 && rld[r].in == 0
6445*e4b17023SJohn Marino 	      && ! rld[r].secondary_p)
6446*e4b17023SJohn Marino 	    continue;
6447*e4b17023SJohn Marino 
6448*e4b17023SJohn Marino 	  /* If find_reloads chose to use reload_in or reload_out as a reload
6449*e4b17023SJohn Marino 	     register, we don't need to chose one.  Otherwise, try even if it
6450*e4b17023SJohn Marino 	     found one since we might save an insn if we find the value lying
6451*e4b17023SJohn Marino 	     around.
6452*e4b17023SJohn Marino 	     Try also when reload_in is a pseudo without a hard reg.  */
6453*e4b17023SJohn Marino 	  if (rld[r].in != 0 && rld[r].reg_rtx != 0
6454*e4b17023SJohn Marino 	      && (rtx_equal_p (rld[r].in, rld[r].reg_rtx)
6455*e4b17023SJohn Marino 		  || (rtx_equal_p (rld[r].out, rld[r].reg_rtx)
6456*e4b17023SJohn Marino 		      && !MEM_P (rld[r].in)
6457*e4b17023SJohn Marino 		      && true_regnum (rld[r].in) < FIRST_PSEUDO_REGISTER)))
6458*e4b17023SJohn Marino 	    continue;
6459*e4b17023SJohn Marino 
6460*e4b17023SJohn Marino #if 0 /* No longer needed for correct operation.
6461*e4b17023SJohn Marino 	 It might give better code, or might not; worth an experiment?  */
6462*e4b17023SJohn Marino 	  /* If this is an optional reload, we can't inherit from earlier insns
6463*e4b17023SJohn Marino 	     until we are sure that any non-optional reloads have been allocated.
6464*e4b17023SJohn Marino 	     The following code takes advantage of the fact that optional reloads
6465*e4b17023SJohn Marino 	     are at the end of reload_order.  */
6466*e4b17023SJohn Marino 	  if (rld[r].optional != 0)
6467*e4b17023SJohn Marino 	    for (i = 0; i < j; i++)
6468*e4b17023SJohn Marino 	      if ((rld[reload_order[i]].out != 0
6469*e4b17023SJohn Marino 		   || rld[reload_order[i]].in != 0
6470*e4b17023SJohn Marino 		   || rld[reload_order[i]].secondary_p)
6471*e4b17023SJohn Marino 		  && ! rld[reload_order[i]].optional
6472*e4b17023SJohn Marino 		  && rld[reload_order[i]].reg_rtx == 0)
6473*e4b17023SJohn Marino 		allocate_reload_reg (chain, reload_order[i], 0);
6474*e4b17023SJohn Marino #endif
6475*e4b17023SJohn Marino 
6476*e4b17023SJohn Marino 	  /* First see if this pseudo is already available as reloaded
6477*e4b17023SJohn Marino 	     for a previous insn.  We cannot try to inherit for reloads
6478*e4b17023SJohn Marino 	     that are smaller than the maximum number of registers needed
6479*e4b17023SJohn Marino 	     for groups unless the register we would allocate cannot be used
6480*e4b17023SJohn Marino 	     for the groups.
6481*e4b17023SJohn Marino 
6482*e4b17023SJohn Marino 	     We could check here to see if this is a secondary reload for
6483*e4b17023SJohn Marino 	     an object that is already in a register of the desired class.
6484*e4b17023SJohn Marino 	     This would avoid the need for the secondary reload register.
6485*e4b17023SJohn Marino 	     But this is complex because we can't easily determine what
6486*e4b17023SJohn Marino 	     objects might want to be loaded via this reload.  So let a
6487*e4b17023SJohn Marino 	     register be allocated here.  In `emit_reload_insns' we suppress
6488*e4b17023SJohn Marino 	     one of the loads in the case described above.  */
6489*e4b17023SJohn Marino 
6490*e4b17023SJohn Marino 	  if (inheritance)
6491*e4b17023SJohn Marino 	    {
6492*e4b17023SJohn Marino 	      int byte = 0;
6493*e4b17023SJohn Marino 	      int regno = -1;
6494*e4b17023SJohn Marino 	      enum machine_mode mode = VOIDmode;
6495*e4b17023SJohn Marino 
6496*e4b17023SJohn Marino 	      if (rld[r].in == 0)
6497*e4b17023SJohn Marino 		;
6498*e4b17023SJohn Marino 	      else if (REG_P (rld[r].in))
6499*e4b17023SJohn Marino 		{
6500*e4b17023SJohn Marino 		  regno = REGNO (rld[r].in);
6501*e4b17023SJohn Marino 		  mode = GET_MODE (rld[r].in);
6502*e4b17023SJohn Marino 		}
6503*e4b17023SJohn Marino 	      else if (REG_P (rld[r].in_reg))
6504*e4b17023SJohn Marino 		{
6505*e4b17023SJohn Marino 		  regno = REGNO (rld[r].in_reg);
6506*e4b17023SJohn Marino 		  mode = GET_MODE (rld[r].in_reg);
6507*e4b17023SJohn Marino 		}
6508*e4b17023SJohn Marino 	      else if (GET_CODE (rld[r].in_reg) == SUBREG
6509*e4b17023SJohn Marino 		       && REG_P (SUBREG_REG (rld[r].in_reg)))
6510*e4b17023SJohn Marino 		{
6511*e4b17023SJohn Marino 		  regno = REGNO (SUBREG_REG (rld[r].in_reg));
6512*e4b17023SJohn Marino 		  if (regno < FIRST_PSEUDO_REGISTER)
6513*e4b17023SJohn Marino 		    regno = subreg_regno (rld[r].in_reg);
6514*e4b17023SJohn Marino 		  else
6515*e4b17023SJohn Marino 		    byte = SUBREG_BYTE (rld[r].in_reg);
6516*e4b17023SJohn Marino 		  mode = GET_MODE (rld[r].in_reg);
6517*e4b17023SJohn Marino 		}
6518*e4b17023SJohn Marino #ifdef AUTO_INC_DEC
6519*e4b17023SJohn Marino 	      else if (GET_RTX_CLASS (GET_CODE (rld[r].in_reg)) == RTX_AUTOINC
6520*e4b17023SJohn Marino 		       && REG_P (XEXP (rld[r].in_reg, 0)))
6521*e4b17023SJohn Marino 		{
6522*e4b17023SJohn Marino 		  regno = REGNO (XEXP (rld[r].in_reg, 0));
6523*e4b17023SJohn Marino 		  mode = GET_MODE (XEXP (rld[r].in_reg, 0));
6524*e4b17023SJohn Marino 		  rld[r].out = rld[r].in;
6525*e4b17023SJohn Marino 		}
6526*e4b17023SJohn Marino #endif
6527*e4b17023SJohn Marino #if 0
6528*e4b17023SJohn Marino 	      /* This won't work, since REGNO can be a pseudo reg number.
6529*e4b17023SJohn Marino 		 Also, it takes much more hair to keep track of all the things
6530*e4b17023SJohn Marino 		 that can invalidate an inherited reload of part of a pseudoreg.  */
6531*e4b17023SJohn Marino 	      else if (GET_CODE (rld[r].in) == SUBREG
6532*e4b17023SJohn Marino 		       && REG_P (SUBREG_REG (rld[r].in)))
6533*e4b17023SJohn Marino 		regno = subreg_regno (rld[r].in);
6534*e4b17023SJohn Marino #endif
6535*e4b17023SJohn Marino 
6536*e4b17023SJohn Marino 	      if (regno >= 0
6537*e4b17023SJohn Marino 		  && reg_last_reload_reg[regno] != 0
6538*e4b17023SJohn Marino 		  && (GET_MODE_SIZE (GET_MODE (reg_last_reload_reg[regno]))
6539*e4b17023SJohn Marino 		      >= GET_MODE_SIZE (mode) + byte)
6540*e4b17023SJohn Marino #ifdef CANNOT_CHANGE_MODE_CLASS
6541*e4b17023SJohn Marino 		  /* Verify that the register it's in can be used in
6542*e4b17023SJohn Marino 		     mode MODE.  */
6543*e4b17023SJohn Marino 		  && !REG_CANNOT_CHANGE_MODE_P (REGNO (reg_last_reload_reg[regno]),
6544*e4b17023SJohn Marino 						GET_MODE (reg_last_reload_reg[regno]),
6545*e4b17023SJohn Marino 						mode)
6546*e4b17023SJohn Marino #endif
6547*e4b17023SJohn Marino 		  )
6548*e4b17023SJohn Marino 		{
6549*e4b17023SJohn Marino 		  enum reg_class rclass = rld[r].rclass, last_class;
6550*e4b17023SJohn Marino 		  rtx last_reg = reg_last_reload_reg[regno];
6551*e4b17023SJohn Marino 
6552*e4b17023SJohn Marino 		  i = REGNO (last_reg);
6553*e4b17023SJohn Marino 		  i += subreg_regno_offset (i, GET_MODE (last_reg), byte, mode);
6554*e4b17023SJohn Marino 		  last_class = REGNO_REG_CLASS (i);
6555*e4b17023SJohn Marino 
6556*e4b17023SJohn Marino 		  if (reg_reloaded_contents[i] == regno
6557*e4b17023SJohn Marino 		      && TEST_HARD_REG_BIT (reg_reloaded_valid, i)
6558*e4b17023SJohn Marino 		      && HARD_REGNO_MODE_OK (i, rld[r].mode)
6559*e4b17023SJohn Marino 		      && (TEST_HARD_REG_BIT (reg_class_contents[(int) rclass], i)
6560*e4b17023SJohn Marino 			  /* Even if we can't use this register as a reload
6561*e4b17023SJohn Marino 			     register, we might use it for reload_override_in,
6562*e4b17023SJohn Marino 			     if copying it to the desired class is cheap
6563*e4b17023SJohn Marino 			     enough.  */
6564*e4b17023SJohn Marino 			  || ((register_move_cost (mode, last_class, rclass)
6565*e4b17023SJohn Marino 			       < memory_move_cost (mode, rclass, true))
6566*e4b17023SJohn Marino 			      && (secondary_reload_class (1, rclass, mode,
6567*e4b17023SJohn Marino 							  last_reg)
6568*e4b17023SJohn Marino 				  == NO_REGS)
6569*e4b17023SJohn Marino #ifdef SECONDARY_MEMORY_NEEDED
6570*e4b17023SJohn Marino 			      && ! SECONDARY_MEMORY_NEEDED (last_class, rclass,
6571*e4b17023SJohn Marino 							    mode)
6572*e4b17023SJohn Marino #endif
6573*e4b17023SJohn Marino 			      ))
6574*e4b17023SJohn Marino 
6575*e4b17023SJohn Marino 		      && (rld[r].nregs == max_group_size
6576*e4b17023SJohn Marino 			  || ! TEST_HARD_REG_BIT (reg_class_contents[(int) group_class],
6577*e4b17023SJohn Marino 						  i))
6578*e4b17023SJohn Marino 		      && free_for_value_p (i, rld[r].mode, rld[r].opnum,
6579*e4b17023SJohn Marino 					   rld[r].when_needed, rld[r].in,
6580*e4b17023SJohn Marino 					   const0_rtx, r, 1))
6581*e4b17023SJohn Marino 		    {
6582*e4b17023SJohn Marino 		      /* If a group is needed, verify that all the subsequent
6583*e4b17023SJohn Marino 			 registers still have their values intact.  */
6584*e4b17023SJohn Marino 		      int nr = hard_regno_nregs[i][rld[r].mode];
6585*e4b17023SJohn Marino 		      int k;
6586*e4b17023SJohn Marino 
6587*e4b17023SJohn Marino 		      for (k = 1; k < nr; k++)
6588*e4b17023SJohn Marino 			if (reg_reloaded_contents[i + k] != regno
6589*e4b17023SJohn Marino 			    || ! TEST_HARD_REG_BIT (reg_reloaded_valid, i + k))
6590*e4b17023SJohn Marino 			  break;
6591*e4b17023SJohn Marino 
6592*e4b17023SJohn Marino 		      if (k == nr)
6593*e4b17023SJohn Marino 			{
6594*e4b17023SJohn Marino 			  int i1;
6595*e4b17023SJohn Marino 			  int bad_for_class;
6596*e4b17023SJohn Marino 
6597*e4b17023SJohn Marino 			  last_reg = (GET_MODE (last_reg) == mode
6598*e4b17023SJohn Marino 				      ? last_reg : gen_rtx_REG (mode, i));
6599*e4b17023SJohn Marino 
6600*e4b17023SJohn Marino 			  bad_for_class = 0;
6601*e4b17023SJohn Marino 			  for (k = 0; k < nr; k++)
6602*e4b17023SJohn Marino 			    bad_for_class |= ! TEST_HARD_REG_BIT (reg_class_contents[(int) rld[r].rclass],
6603*e4b17023SJohn Marino 								  i+k);
6604*e4b17023SJohn Marino 
6605*e4b17023SJohn Marino 			  /* We found a register that contains the
6606*e4b17023SJohn Marino 			     value we need.  If this register is the
6607*e4b17023SJohn Marino 			     same as an `earlyclobber' operand of the
6608*e4b17023SJohn Marino 			     current insn, just mark it as a place to
6609*e4b17023SJohn Marino 			     reload from since we can't use it as the
6610*e4b17023SJohn Marino 			     reload register itself.  */
6611*e4b17023SJohn Marino 
6612*e4b17023SJohn Marino 			  for (i1 = 0; i1 < n_earlyclobbers; i1++)
6613*e4b17023SJohn Marino 			    if (reg_overlap_mentioned_for_reload_p
6614*e4b17023SJohn Marino 				(reg_last_reload_reg[regno],
6615*e4b17023SJohn Marino 				 reload_earlyclobbers[i1]))
6616*e4b17023SJohn Marino 			      break;
6617*e4b17023SJohn Marino 
6618*e4b17023SJohn Marino 			  if (i1 != n_earlyclobbers
6619*e4b17023SJohn Marino 			      || ! (free_for_value_p (i, rld[r].mode,
6620*e4b17023SJohn Marino 						      rld[r].opnum,
6621*e4b17023SJohn Marino 						      rld[r].when_needed, rld[r].in,
6622*e4b17023SJohn Marino 						      rld[r].out, r, 1))
6623*e4b17023SJohn Marino 			      /* Don't use it if we'd clobber a pseudo reg.  */
6624*e4b17023SJohn Marino 			      || (TEST_HARD_REG_BIT (reg_used_in_insn, i)
6625*e4b17023SJohn Marino 				  && rld[r].out
6626*e4b17023SJohn Marino 				  && ! TEST_HARD_REG_BIT (reg_reloaded_dead, i))
6627*e4b17023SJohn Marino 			      /* Don't clobber the frame pointer.  */
6628*e4b17023SJohn Marino 			      || (i == HARD_FRAME_POINTER_REGNUM
6629*e4b17023SJohn Marino 				  && frame_pointer_needed
6630*e4b17023SJohn Marino 				  && rld[r].out)
6631*e4b17023SJohn Marino 			      /* Don't really use the inherited spill reg
6632*e4b17023SJohn Marino 				 if we need it wider than we've got it.  */
6633*e4b17023SJohn Marino 			      || (GET_MODE_SIZE (rld[r].mode)
6634*e4b17023SJohn Marino 				  > GET_MODE_SIZE (mode))
6635*e4b17023SJohn Marino 			      || bad_for_class
6636*e4b17023SJohn Marino 
6637*e4b17023SJohn Marino 			      /* If find_reloads chose reload_out as reload
6638*e4b17023SJohn Marino 				 register, stay with it - that leaves the
6639*e4b17023SJohn Marino 				 inherited register for subsequent reloads.  */
6640*e4b17023SJohn Marino 			      || (rld[r].out && rld[r].reg_rtx
6641*e4b17023SJohn Marino 				  && rtx_equal_p (rld[r].out, rld[r].reg_rtx)))
6642*e4b17023SJohn Marino 			    {
6643*e4b17023SJohn Marino 			      if (! rld[r].optional)
6644*e4b17023SJohn Marino 				{
6645*e4b17023SJohn Marino 				  reload_override_in[r] = last_reg;
6646*e4b17023SJohn Marino 				  reload_inheritance_insn[r]
6647*e4b17023SJohn Marino 				    = reg_reloaded_insn[i];
6648*e4b17023SJohn Marino 				}
6649*e4b17023SJohn Marino 			    }
6650*e4b17023SJohn Marino 			  else
6651*e4b17023SJohn Marino 			    {
6652*e4b17023SJohn Marino 			      int k;
6653*e4b17023SJohn Marino 			      /* We can use this as a reload reg.  */
6654*e4b17023SJohn Marino 			      /* Mark the register as in use for this part of
6655*e4b17023SJohn Marino 				 the insn.  */
6656*e4b17023SJohn Marino 			      mark_reload_reg_in_use (i,
6657*e4b17023SJohn Marino 						      rld[r].opnum,
6658*e4b17023SJohn Marino 						      rld[r].when_needed,
6659*e4b17023SJohn Marino 						      rld[r].mode);
6660*e4b17023SJohn Marino 			      rld[r].reg_rtx = last_reg;
6661*e4b17023SJohn Marino 			      reload_inherited[r] = 1;
6662*e4b17023SJohn Marino 			      reload_inheritance_insn[r]
6663*e4b17023SJohn Marino 				= reg_reloaded_insn[i];
6664*e4b17023SJohn Marino 			      reload_spill_index[r] = i;
6665*e4b17023SJohn Marino 			      for (k = 0; k < nr; k++)
6666*e4b17023SJohn Marino 				SET_HARD_REG_BIT (reload_reg_used_for_inherit,
6667*e4b17023SJohn Marino 						  i + k);
6668*e4b17023SJohn Marino 			    }
6669*e4b17023SJohn Marino 			}
6670*e4b17023SJohn Marino 		    }
6671*e4b17023SJohn Marino 		}
6672*e4b17023SJohn Marino 	    }
6673*e4b17023SJohn Marino 
6674*e4b17023SJohn Marino 	  /* Here's another way to see if the value is already lying around.  */
6675*e4b17023SJohn Marino 	  if (inheritance
6676*e4b17023SJohn Marino 	      && rld[r].in != 0
6677*e4b17023SJohn Marino 	      && ! reload_inherited[r]
6678*e4b17023SJohn Marino 	      && rld[r].out == 0
6679*e4b17023SJohn Marino 	      && (CONSTANT_P (rld[r].in)
6680*e4b17023SJohn Marino 		  || GET_CODE (rld[r].in) == PLUS
6681*e4b17023SJohn Marino 		  || REG_P (rld[r].in)
6682*e4b17023SJohn Marino 		  || MEM_P (rld[r].in))
6683*e4b17023SJohn Marino 	      && (rld[r].nregs == max_group_size
6684*e4b17023SJohn Marino 		  || ! reg_classes_intersect_p (rld[r].rclass, group_class)))
6685*e4b17023SJohn Marino 	    search_equiv = rld[r].in;
6686*e4b17023SJohn Marino 
6687*e4b17023SJohn Marino 	  if (search_equiv)
6688*e4b17023SJohn Marino 	    {
6689*e4b17023SJohn Marino 	      rtx equiv
6690*e4b17023SJohn Marino 		= find_equiv_reg (search_equiv, insn, rld[r].rclass,
6691*e4b17023SJohn Marino 				  -1, NULL, 0, rld[r].mode);
6692*e4b17023SJohn Marino 	      int regno = 0;
6693*e4b17023SJohn Marino 
6694*e4b17023SJohn Marino 	      if (equiv != 0)
6695*e4b17023SJohn Marino 		{
6696*e4b17023SJohn Marino 		  if (REG_P (equiv))
6697*e4b17023SJohn Marino 		    regno = REGNO (equiv);
6698*e4b17023SJohn Marino 		  else
6699*e4b17023SJohn Marino 		    {
6700*e4b17023SJohn Marino 		      /* This must be a SUBREG of a hard register.
6701*e4b17023SJohn Marino 			 Make a new REG since this might be used in an
6702*e4b17023SJohn Marino 			 address and not all machines support SUBREGs
6703*e4b17023SJohn Marino 			 there.  */
6704*e4b17023SJohn Marino 		      gcc_assert (GET_CODE (equiv) == SUBREG);
6705*e4b17023SJohn Marino 		      regno = subreg_regno (equiv);
6706*e4b17023SJohn Marino 		      equiv = gen_rtx_REG (rld[r].mode, regno);
6707*e4b17023SJohn Marino 		      /* If we choose EQUIV as the reload register, but the
6708*e4b17023SJohn Marino 			 loop below decides to cancel the inheritance, we'll
6709*e4b17023SJohn Marino 			 end up reloading EQUIV in rld[r].mode, not the mode
6710*e4b17023SJohn Marino 			 it had originally.  That isn't safe when EQUIV isn't
6711*e4b17023SJohn Marino 			 available as a spill register since its value might
6712*e4b17023SJohn Marino 			 still be live at this point.  */
6713*e4b17023SJohn Marino 		      for (i = regno; i < regno + (int) rld[r].nregs; i++)
6714*e4b17023SJohn Marino 			if (TEST_HARD_REG_BIT (reload_reg_unavailable, i))
6715*e4b17023SJohn Marino 			  equiv = 0;
6716*e4b17023SJohn Marino 		    }
6717*e4b17023SJohn Marino 		}
6718*e4b17023SJohn Marino 
6719*e4b17023SJohn Marino 	      /* If we found a spill reg, reject it unless it is free
6720*e4b17023SJohn Marino 		 and of the desired class.  */
6721*e4b17023SJohn Marino 	      if (equiv != 0)
6722*e4b17023SJohn Marino 		{
6723*e4b17023SJohn Marino 		  int regs_used = 0;
6724*e4b17023SJohn Marino 		  int bad_for_class = 0;
6725*e4b17023SJohn Marino 		  int max_regno = regno + rld[r].nregs;
6726*e4b17023SJohn Marino 
6727*e4b17023SJohn Marino 		  for (i = regno; i < max_regno; i++)
6728*e4b17023SJohn Marino 		    {
6729*e4b17023SJohn Marino 		      regs_used |= TEST_HARD_REG_BIT (reload_reg_used_at_all,
6730*e4b17023SJohn Marino 						      i);
6731*e4b17023SJohn Marino 		      bad_for_class |= ! TEST_HARD_REG_BIT (reg_class_contents[(int) rld[r].rclass],
6732*e4b17023SJohn Marino 							   i);
6733*e4b17023SJohn Marino 		    }
6734*e4b17023SJohn Marino 
6735*e4b17023SJohn Marino 		  if ((regs_used
6736*e4b17023SJohn Marino 		       && ! free_for_value_p (regno, rld[r].mode,
6737*e4b17023SJohn Marino 					      rld[r].opnum, rld[r].when_needed,
6738*e4b17023SJohn Marino 					      rld[r].in, rld[r].out, r, 1))
6739*e4b17023SJohn Marino 		      || bad_for_class)
6740*e4b17023SJohn Marino 		    equiv = 0;
6741*e4b17023SJohn Marino 		}
6742*e4b17023SJohn Marino 
6743*e4b17023SJohn Marino 	      if (equiv != 0 && ! HARD_REGNO_MODE_OK (regno, rld[r].mode))
6744*e4b17023SJohn Marino 		equiv = 0;
6745*e4b17023SJohn Marino 
6746*e4b17023SJohn Marino 	      /* We found a register that contains the value we need.
6747*e4b17023SJohn Marino 		 If this register is the same as an `earlyclobber' operand
6748*e4b17023SJohn Marino 		 of the current insn, just mark it as a place to reload from
6749*e4b17023SJohn Marino 		 since we can't use it as the reload register itself.  */
6750*e4b17023SJohn Marino 
6751*e4b17023SJohn Marino 	      if (equiv != 0)
6752*e4b17023SJohn Marino 		for (i = 0; i < n_earlyclobbers; i++)
6753*e4b17023SJohn Marino 		  if (reg_overlap_mentioned_for_reload_p (equiv,
6754*e4b17023SJohn Marino 							  reload_earlyclobbers[i]))
6755*e4b17023SJohn Marino 		    {
6756*e4b17023SJohn Marino 		      if (! rld[r].optional)
6757*e4b17023SJohn Marino 			reload_override_in[r] = equiv;
6758*e4b17023SJohn Marino 		      equiv = 0;
6759*e4b17023SJohn Marino 		      break;
6760*e4b17023SJohn Marino 		    }
6761*e4b17023SJohn Marino 
6762*e4b17023SJohn Marino 	      /* If the equiv register we have found is explicitly clobbered
6763*e4b17023SJohn Marino 		 in the current insn, it depends on the reload type if we
6764*e4b17023SJohn Marino 		 can use it, use it for reload_override_in, or not at all.
6765*e4b17023SJohn Marino 		 In particular, we then can't use EQUIV for a
6766*e4b17023SJohn Marino 		 RELOAD_FOR_OUTPUT_ADDRESS reload.  */
6767*e4b17023SJohn Marino 
6768*e4b17023SJohn Marino 	      if (equiv != 0)
6769*e4b17023SJohn Marino 		{
6770*e4b17023SJohn Marino 		  if (regno_clobbered_p (regno, insn, rld[r].mode, 2))
6771*e4b17023SJohn Marino 		    switch (rld[r].when_needed)
6772*e4b17023SJohn Marino 		      {
6773*e4b17023SJohn Marino 		      case RELOAD_FOR_OTHER_ADDRESS:
6774*e4b17023SJohn Marino 		      case RELOAD_FOR_INPADDR_ADDRESS:
6775*e4b17023SJohn Marino 		      case RELOAD_FOR_INPUT_ADDRESS:
6776*e4b17023SJohn Marino 		      case RELOAD_FOR_OPADDR_ADDR:
6777*e4b17023SJohn Marino 			break;
6778*e4b17023SJohn Marino 		      case RELOAD_OTHER:
6779*e4b17023SJohn Marino 		      case RELOAD_FOR_INPUT:
6780*e4b17023SJohn Marino 		      case RELOAD_FOR_OPERAND_ADDRESS:
6781*e4b17023SJohn Marino 			if (! rld[r].optional)
6782*e4b17023SJohn Marino 			  reload_override_in[r] = equiv;
6783*e4b17023SJohn Marino 			/* Fall through.  */
6784*e4b17023SJohn Marino 		      default:
6785*e4b17023SJohn Marino 			equiv = 0;
6786*e4b17023SJohn Marino 			break;
6787*e4b17023SJohn Marino 		      }
6788*e4b17023SJohn Marino 		  else if (regno_clobbered_p (regno, insn, rld[r].mode, 1))
6789*e4b17023SJohn Marino 		    switch (rld[r].when_needed)
6790*e4b17023SJohn Marino 		      {
6791*e4b17023SJohn Marino 		      case RELOAD_FOR_OTHER_ADDRESS:
6792*e4b17023SJohn Marino 		      case RELOAD_FOR_INPADDR_ADDRESS:
6793*e4b17023SJohn Marino 		      case RELOAD_FOR_INPUT_ADDRESS:
6794*e4b17023SJohn Marino 		      case RELOAD_FOR_OPADDR_ADDR:
6795*e4b17023SJohn Marino 		      case RELOAD_FOR_OPERAND_ADDRESS:
6796*e4b17023SJohn Marino 		      case RELOAD_FOR_INPUT:
6797*e4b17023SJohn Marino 			break;
6798*e4b17023SJohn Marino 		      case RELOAD_OTHER:
6799*e4b17023SJohn Marino 			if (! rld[r].optional)
6800*e4b17023SJohn Marino 			  reload_override_in[r] = equiv;
6801*e4b17023SJohn Marino 			/* Fall through.  */
6802*e4b17023SJohn Marino 		      default:
6803*e4b17023SJohn Marino 			equiv = 0;
6804*e4b17023SJohn Marino 			break;
6805*e4b17023SJohn Marino 		      }
6806*e4b17023SJohn Marino 		}
6807*e4b17023SJohn Marino 
6808*e4b17023SJohn Marino 	      /* If we found an equivalent reg, say no code need be generated
6809*e4b17023SJohn Marino 		 to load it, and use it as our reload reg.  */
6810*e4b17023SJohn Marino 	      if (equiv != 0
6811*e4b17023SJohn Marino 		  && (regno != HARD_FRAME_POINTER_REGNUM
6812*e4b17023SJohn Marino 		      || !frame_pointer_needed))
6813*e4b17023SJohn Marino 		{
6814*e4b17023SJohn Marino 		  int nr = hard_regno_nregs[regno][rld[r].mode];
6815*e4b17023SJohn Marino 		  int k;
6816*e4b17023SJohn Marino 		  rld[r].reg_rtx = equiv;
6817*e4b17023SJohn Marino 		  reload_spill_index[r] = regno;
6818*e4b17023SJohn Marino 		  reload_inherited[r] = 1;
6819*e4b17023SJohn Marino 
6820*e4b17023SJohn Marino 		  /* If reg_reloaded_valid is not set for this register,
6821*e4b17023SJohn Marino 		     there might be a stale spill_reg_store lying around.
6822*e4b17023SJohn Marino 		     We must clear it, since otherwise emit_reload_insns
6823*e4b17023SJohn Marino 		     might delete the store.  */
6824*e4b17023SJohn Marino 		  if (! TEST_HARD_REG_BIT (reg_reloaded_valid, regno))
6825*e4b17023SJohn Marino 		    spill_reg_store[regno] = NULL_RTX;
6826*e4b17023SJohn Marino 		  /* If any of the hard registers in EQUIV are spill
6827*e4b17023SJohn Marino 		     registers, mark them as in use for this insn.  */
6828*e4b17023SJohn Marino 		  for (k = 0; k < nr; k++)
6829*e4b17023SJohn Marino 		    {
6830*e4b17023SJohn Marino 		      i = spill_reg_order[regno + k];
6831*e4b17023SJohn Marino 		      if (i >= 0)
6832*e4b17023SJohn Marino 			{
6833*e4b17023SJohn Marino 			  mark_reload_reg_in_use (regno, rld[r].opnum,
6834*e4b17023SJohn Marino 						  rld[r].when_needed,
6835*e4b17023SJohn Marino 						  rld[r].mode);
6836*e4b17023SJohn Marino 			  SET_HARD_REG_BIT (reload_reg_used_for_inherit,
6837*e4b17023SJohn Marino 					    regno + k);
6838*e4b17023SJohn Marino 			}
6839*e4b17023SJohn Marino 		    }
6840*e4b17023SJohn Marino 		}
6841*e4b17023SJohn Marino 	    }
6842*e4b17023SJohn Marino 
6843*e4b17023SJohn Marino 	  /* If we found a register to use already, or if this is an optional
6844*e4b17023SJohn Marino 	     reload, we are done.  */
6845*e4b17023SJohn Marino 	  if (rld[r].reg_rtx != 0 || rld[r].optional != 0)
6846*e4b17023SJohn Marino 	    continue;
6847*e4b17023SJohn Marino 
6848*e4b17023SJohn Marino #if 0
6849*e4b17023SJohn Marino 	  /* No longer needed for correct operation.  Might or might
6850*e4b17023SJohn Marino 	     not give better code on the average.  Want to experiment?  */
6851*e4b17023SJohn Marino 
6852*e4b17023SJohn Marino 	  /* See if there is a later reload that has a class different from our
6853*e4b17023SJohn Marino 	     class that intersects our class or that requires less register
6854*e4b17023SJohn Marino 	     than our reload.  If so, we must allocate a register to this
6855*e4b17023SJohn Marino 	     reload now, since that reload might inherit a previous reload
6856*e4b17023SJohn Marino 	     and take the only available register in our class.  Don't do this
6857*e4b17023SJohn Marino 	     for optional reloads since they will force all previous reloads
6858*e4b17023SJohn Marino 	     to be allocated.  Also don't do this for reloads that have been
6859*e4b17023SJohn Marino 	     turned off.  */
6860*e4b17023SJohn Marino 
6861*e4b17023SJohn Marino 	  for (i = j + 1; i < n_reloads; i++)
6862*e4b17023SJohn Marino 	    {
6863*e4b17023SJohn Marino 	      int s = reload_order[i];
6864*e4b17023SJohn Marino 
6865*e4b17023SJohn Marino 	      if ((rld[s].in == 0 && rld[s].out == 0
6866*e4b17023SJohn Marino 		   && ! rld[s].secondary_p)
6867*e4b17023SJohn Marino 		  || rld[s].optional)
6868*e4b17023SJohn Marino 		continue;
6869*e4b17023SJohn Marino 
6870*e4b17023SJohn Marino 	      if ((rld[s].rclass != rld[r].rclass
6871*e4b17023SJohn Marino 		   && reg_classes_intersect_p (rld[r].rclass,
6872*e4b17023SJohn Marino 					       rld[s].rclass))
6873*e4b17023SJohn Marino 		  || rld[s].nregs < rld[r].nregs)
6874*e4b17023SJohn Marino 		break;
6875*e4b17023SJohn Marino 	    }
6876*e4b17023SJohn Marino 
6877*e4b17023SJohn Marino 	  if (i == n_reloads)
6878*e4b17023SJohn Marino 	    continue;
6879*e4b17023SJohn Marino 
6880*e4b17023SJohn Marino 	  allocate_reload_reg (chain, r, j == n_reloads - 1);
6881*e4b17023SJohn Marino #endif
6882*e4b17023SJohn Marino 	}
6883*e4b17023SJohn Marino 
6884*e4b17023SJohn Marino       /* Now allocate reload registers for anything non-optional that
6885*e4b17023SJohn Marino 	 didn't get one yet.  */
6886*e4b17023SJohn Marino       for (j = 0; j < n_reloads; j++)
6887*e4b17023SJohn Marino 	{
6888*e4b17023SJohn Marino 	  int r = reload_order[j];
6889*e4b17023SJohn Marino 
6890*e4b17023SJohn Marino 	  /* Ignore reloads that got marked inoperative.  */
6891*e4b17023SJohn Marino 	  if (rld[r].out == 0 && rld[r].in == 0 && ! rld[r].secondary_p)
6892*e4b17023SJohn Marino 	    continue;
6893*e4b17023SJohn Marino 
6894*e4b17023SJohn Marino 	  /* Skip reloads that already have a register allocated or are
6895*e4b17023SJohn Marino 	     optional.  */
6896*e4b17023SJohn Marino 	  if (rld[r].reg_rtx != 0 || rld[r].optional)
6897*e4b17023SJohn Marino 	    continue;
6898*e4b17023SJohn Marino 
6899*e4b17023SJohn Marino 	  if (! allocate_reload_reg (chain, r, j == n_reloads - 1))
6900*e4b17023SJohn Marino 	    break;
6901*e4b17023SJohn Marino 	}
6902*e4b17023SJohn Marino 
6903*e4b17023SJohn Marino       /* If that loop got all the way, we have won.  */
6904*e4b17023SJohn Marino       if (j == n_reloads)
6905*e4b17023SJohn Marino 	{
6906*e4b17023SJohn Marino 	  win = 1;
6907*e4b17023SJohn Marino 	  break;
6908*e4b17023SJohn Marino 	}
6909*e4b17023SJohn Marino 
6910*e4b17023SJohn Marino       /* Loop around and try without any inheritance.  */
6911*e4b17023SJohn Marino     }
6912*e4b17023SJohn Marino 
6913*e4b17023SJohn Marino   if (! win)
6914*e4b17023SJohn Marino     {
6915*e4b17023SJohn Marino       /* First undo everything done by the failed attempt
6916*e4b17023SJohn Marino 	 to allocate with inheritance.  */
6917*e4b17023SJohn Marino       choose_reload_regs_init (chain, save_reload_reg_rtx);
6918*e4b17023SJohn Marino 
6919*e4b17023SJohn Marino       /* Some sanity tests to verify that the reloads found in the first
6920*e4b17023SJohn Marino 	 pass are identical to the ones we have now.  */
6921*e4b17023SJohn Marino       gcc_assert (chain->n_reloads == n_reloads);
6922*e4b17023SJohn Marino 
6923*e4b17023SJohn Marino       for (i = 0; i < n_reloads; i++)
6924*e4b17023SJohn Marino 	{
6925*e4b17023SJohn Marino 	  if (chain->rld[i].regno < 0 || chain->rld[i].reg_rtx != 0)
6926*e4b17023SJohn Marino 	    continue;
6927*e4b17023SJohn Marino 	  gcc_assert (chain->rld[i].when_needed == rld[i].when_needed);
6928*e4b17023SJohn Marino 	  for (j = 0; j < n_spills; j++)
6929*e4b17023SJohn Marino 	    if (spill_regs[j] == chain->rld[i].regno)
6930*e4b17023SJohn Marino 	      if (! set_reload_reg (j, i))
6931*e4b17023SJohn Marino 		failed_reload (chain->insn, i);
6932*e4b17023SJohn Marino 	}
6933*e4b17023SJohn Marino     }
6934*e4b17023SJohn Marino 
6935*e4b17023SJohn Marino   /* If we thought we could inherit a reload, because it seemed that
6936*e4b17023SJohn Marino      nothing else wanted the same reload register earlier in the insn,
6937*e4b17023SJohn Marino      verify that assumption, now that all reloads have been assigned.
6938*e4b17023SJohn Marino      Likewise for reloads where reload_override_in has been set.  */
6939*e4b17023SJohn Marino 
6940*e4b17023SJohn Marino   /* If doing expensive optimizations, do one preliminary pass that doesn't
6941*e4b17023SJohn Marino      cancel any inheritance, but removes reloads that have been needed only
6942*e4b17023SJohn Marino      for reloads that we know can be inherited.  */
6943*e4b17023SJohn Marino   for (pass = flag_expensive_optimizations; pass >= 0; pass--)
6944*e4b17023SJohn Marino     {
6945*e4b17023SJohn Marino       for (j = 0; j < n_reloads; j++)
6946*e4b17023SJohn Marino 	{
6947*e4b17023SJohn Marino 	  int r = reload_order[j];
6948*e4b17023SJohn Marino 	  rtx check_reg;
6949*e4b17023SJohn Marino 	  if (reload_inherited[r] && rld[r].reg_rtx)
6950*e4b17023SJohn Marino 	    check_reg = rld[r].reg_rtx;
6951*e4b17023SJohn Marino 	  else if (reload_override_in[r]
6952*e4b17023SJohn Marino 		   && (REG_P (reload_override_in[r])
6953*e4b17023SJohn Marino 		       || GET_CODE (reload_override_in[r]) == SUBREG))
6954*e4b17023SJohn Marino 	    check_reg = reload_override_in[r];
6955*e4b17023SJohn Marino 	  else
6956*e4b17023SJohn Marino 	    continue;
6957*e4b17023SJohn Marino 	  if (! free_for_value_p (true_regnum (check_reg), rld[r].mode,
6958*e4b17023SJohn Marino 				  rld[r].opnum, rld[r].when_needed, rld[r].in,
6959*e4b17023SJohn Marino 				  (reload_inherited[r]
6960*e4b17023SJohn Marino 				   ? rld[r].out : const0_rtx),
6961*e4b17023SJohn Marino 				  r, 1))
6962*e4b17023SJohn Marino 	    {
6963*e4b17023SJohn Marino 	      if (pass)
6964*e4b17023SJohn Marino 		continue;
6965*e4b17023SJohn Marino 	      reload_inherited[r] = 0;
6966*e4b17023SJohn Marino 	      reload_override_in[r] = 0;
6967*e4b17023SJohn Marino 	    }
6968*e4b17023SJohn Marino 	  /* If we can inherit a RELOAD_FOR_INPUT, or can use a
6969*e4b17023SJohn Marino 	     reload_override_in, then we do not need its related
6970*e4b17023SJohn Marino 	     RELOAD_FOR_INPUT_ADDRESS / RELOAD_FOR_INPADDR_ADDRESS reloads;
6971*e4b17023SJohn Marino 	     likewise for other reload types.
6972*e4b17023SJohn Marino 	     We handle this by removing a reload when its only replacement
6973*e4b17023SJohn Marino 	     is mentioned in reload_in of the reload we are going to inherit.
6974*e4b17023SJohn Marino 	     A special case are auto_inc expressions; even if the input is
6975*e4b17023SJohn Marino 	     inherited, we still need the address for the output.  We can
6976*e4b17023SJohn Marino 	     recognize them because they have RELOAD_OUT set to RELOAD_IN.
6977*e4b17023SJohn Marino 	     If we succeeded removing some reload and we are doing a preliminary
6978*e4b17023SJohn Marino 	     pass just to remove such reloads, make another pass, since the
6979*e4b17023SJohn Marino 	     removal of one reload might allow us to inherit another one.  */
6980*e4b17023SJohn Marino 	  else if (rld[r].in
6981*e4b17023SJohn Marino 		   && rld[r].out != rld[r].in
6982*e4b17023SJohn Marino 		   && remove_address_replacements (rld[r].in) && pass)
6983*e4b17023SJohn Marino 	    pass = 2;
6984*e4b17023SJohn Marino 	}
6985*e4b17023SJohn Marino     }
6986*e4b17023SJohn Marino 
6987*e4b17023SJohn Marino   /* Now that reload_override_in is known valid,
6988*e4b17023SJohn Marino      actually override reload_in.  */
6989*e4b17023SJohn Marino   for (j = 0; j < n_reloads; j++)
6990*e4b17023SJohn Marino     if (reload_override_in[j])
6991*e4b17023SJohn Marino       rld[j].in = reload_override_in[j];
6992*e4b17023SJohn Marino 
6993*e4b17023SJohn Marino   /* If this reload won't be done because it has been canceled or is
6994*e4b17023SJohn Marino      optional and not inherited, clear reload_reg_rtx so other
6995*e4b17023SJohn Marino      routines (such as subst_reloads) don't get confused.  */
6996*e4b17023SJohn Marino   for (j = 0; j < n_reloads; j++)
6997*e4b17023SJohn Marino     if (rld[j].reg_rtx != 0
6998*e4b17023SJohn Marino 	&& ((rld[j].optional && ! reload_inherited[j])
6999*e4b17023SJohn Marino 	    || (rld[j].in == 0 && rld[j].out == 0
7000*e4b17023SJohn Marino 		&& ! rld[j].secondary_p)))
7001*e4b17023SJohn Marino       {
7002*e4b17023SJohn Marino 	int regno = true_regnum (rld[j].reg_rtx);
7003*e4b17023SJohn Marino 
7004*e4b17023SJohn Marino 	if (spill_reg_order[regno] >= 0)
7005*e4b17023SJohn Marino 	  clear_reload_reg_in_use (regno, rld[j].opnum,
7006*e4b17023SJohn Marino 				   rld[j].when_needed, rld[j].mode);
7007*e4b17023SJohn Marino 	rld[j].reg_rtx = 0;
7008*e4b17023SJohn Marino 	reload_spill_index[j] = -1;
7009*e4b17023SJohn Marino       }
7010*e4b17023SJohn Marino 
7011*e4b17023SJohn Marino   /* Record which pseudos and which spill regs have output reloads.  */
7012*e4b17023SJohn Marino   for (j = 0; j < n_reloads; j++)
7013*e4b17023SJohn Marino     {
7014*e4b17023SJohn Marino       int r = reload_order[j];
7015*e4b17023SJohn Marino 
7016*e4b17023SJohn Marino       i = reload_spill_index[r];
7017*e4b17023SJohn Marino 
7018*e4b17023SJohn Marino       /* I is nonneg if this reload uses a register.
7019*e4b17023SJohn Marino 	 If rld[r].reg_rtx is 0, this is an optional reload
7020*e4b17023SJohn Marino 	 that we opted to ignore.  */
7021*e4b17023SJohn Marino       if (rld[r].out_reg != 0 && REG_P (rld[r].out_reg)
7022*e4b17023SJohn Marino 	  && rld[r].reg_rtx != 0)
7023*e4b17023SJohn Marino 	{
7024*e4b17023SJohn Marino 	  int nregno = REGNO (rld[r].out_reg);
7025*e4b17023SJohn Marino 	  int nr = 1;
7026*e4b17023SJohn Marino 
7027*e4b17023SJohn Marino 	  if (nregno < FIRST_PSEUDO_REGISTER)
7028*e4b17023SJohn Marino 	    nr = hard_regno_nregs[nregno][rld[r].mode];
7029*e4b17023SJohn Marino 
7030*e4b17023SJohn Marino 	  while (--nr >= 0)
7031*e4b17023SJohn Marino 	    SET_REGNO_REG_SET (&reg_has_output_reload,
7032*e4b17023SJohn Marino 			       nregno + nr);
7033*e4b17023SJohn Marino 
7034*e4b17023SJohn Marino 	  if (i >= 0)
7035*e4b17023SJohn Marino 	    add_to_hard_reg_set (&reg_is_output_reload, rld[r].mode, i);
7036*e4b17023SJohn Marino 
7037*e4b17023SJohn Marino 	  gcc_assert (rld[r].when_needed == RELOAD_OTHER
7038*e4b17023SJohn Marino 		      || rld[r].when_needed == RELOAD_FOR_OUTPUT
7039*e4b17023SJohn Marino 		      || rld[r].when_needed == RELOAD_FOR_INSN);
7040*e4b17023SJohn Marino 	}
7041*e4b17023SJohn Marino     }
7042*e4b17023SJohn Marino }
7043*e4b17023SJohn Marino 
7044*e4b17023SJohn Marino /* Deallocate the reload register for reload R.  This is called from
7045*e4b17023SJohn Marino    remove_address_replacements.  */
7046*e4b17023SJohn Marino 
7047*e4b17023SJohn Marino void
deallocate_reload_reg(int r)7048*e4b17023SJohn Marino deallocate_reload_reg (int r)
7049*e4b17023SJohn Marino {
7050*e4b17023SJohn Marino   int regno;
7051*e4b17023SJohn Marino 
7052*e4b17023SJohn Marino   if (! rld[r].reg_rtx)
7053*e4b17023SJohn Marino     return;
7054*e4b17023SJohn Marino   regno = true_regnum (rld[r].reg_rtx);
7055*e4b17023SJohn Marino   rld[r].reg_rtx = 0;
7056*e4b17023SJohn Marino   if (spill_reg_order[regno] >= 0)
7057*e4b17023SJohn Marino     clear_reload_reg_in_use (regno, rld[r].opnum, rld[r].when_needed,
7058*e4b17023SJohn Marino 			     rld[r].mode);
7059*e4b17023SJohn Marino   reload_spill_index[r] = -1;
7060*e4b17023SJohn Marino }
7061*e4b17023SJohn Marino 
7062*e4b17023SJohn Marino /* These arrays are filled by emit_reload_insns and its subroutines.  */
7063*e4b17023SJohn Marino static rtx input_reload_insns[MAX_RECOG_OPERANDS];
7064*e4b17023SJohn Marino static rtx other_input_address_reload_insns = 0;
7065*e4b17023SJohn Marino static rtx other_input_reload_insns = 0;
7066*e4b17023SJohn Marino static rtx input_address_reload_insns[MAX_RECOG_OPERANDS];
7067*e4b17023SJohn Marino static rtx inpaddr_address_reload_insns[MAX_RECOG_OPERANDS];
7068*e4b17023SJohn Marino static rtx output_reload_insns[MAX_RECOG_OPERANDS];
7069*e4b17023SJohn Marino static rtx output_address_reload_insns[MAX_RECOG_OPERANDS];
7070*e4b17023SJohn Marino static rtx outaddr_address_reload_insns[MAX_RECOG_OPERANDS];
7071*e4b17023SJohn Marino static rtx operand_reload_insns = 0;
7072*e4b17023SJohn Marino static rtx other_operand_reload_insns = 0;
7073*e4b17023SJohn Marino static rtx other_output_reload_insns[MAX_RECOG_OPERANDS];
7074*e4b17023SJohn Marino 
7075*e4b17023SJohn Marino /* Values to be put in spill_reg_store are put here first.  Instructions
7076*e4b17023SJohn Marino    must only be placed here if the associated reload register reaches
7077*e4b17023SJohn Marino    the end of the instruction's reload sequence.  */
7078*e4b17023SJohn Marino static rtx new_spill_reg_store[FIRST_PSEUDO_REGISTER];
7079*e4b17023SJohn Marino static HARD_REG_SET reg_reloaded_died;
7080*e4b17023SJohn Marino 
7081*e4b17023SJohn Marino /* Check if *RELOAD_REG is suitable as an intermediate or scratch register
7082*e4b17023SJohn Marino    of class NEW_CLASS with mode NEW_MODE.  Or alternatively, if alt_reload_reg
7083*e4b17023SJohn Marino    is nonzero, if that is suitable.  On success, change *RELOAD_REG to the
7084*e4b17023SJohn Marino    adjusted register, and return true.  Otherwise, return false.  */
7085*e4b17023SJohn Marino static bool
reload_adjust_reg_for_temp(rtx * reload_reg,rtx alt_reload_reg,enum reg_class new_class,enum machine_mode new_mode)7086*e4b17023SJohn Marino reload_adjust_reg_for_temp (rtx *reload_reg, rtx alt_reload_reg,
7087*e4b17023SJohn Marino 			    enum reg_class new_class,
7088*e4b17023SJohn Marino 			    enum machine_mode new_mode)
7089*e4b17023SJohn Marino 
7090*e4b17023SJohn Marino {
7091*e4b17023SJohn Marino   rtx reg;
7092*e4b17023SJohn Marino 
7093*e4b17023SJohn Marino   for (reg = *reload_reg; reg; reg = alt_reload_reg, alt_reload_reg = 0)
7094*e4b17023SJohn Marino     {
7095*e4b17023SJohn Marino       unsigned regno = REGNO (reg);
7096*e4b17023SJohn Marino 
7097*e4b17023SJohn Marino       if (!TEST_HARD_REG_BIT (reg_class_contents[(int) new_class], regno))
7098*e4b17023SJohn Marino 	continue;
7099*e4b17023SJohn Marino       if (GET_MODE (reg) != new_mode)
7100*e4b17023SJohn Marino 	{
7101*e4b17023SJohn Marino 	  if (!HARD_REGNO_MODE_OK (regno, new_mode))
7102*e4b17023SJohn Marino 	    continue;
7103*e4b17023SJohn Marino 	  if (hard_regno_nregs[regno][new_mode]
7104*e4b17023SJohn Marino 	      > hard_regno_nregs[regno][GET_MODE (reg)])
7105*e4b17023SJohn Marino 	    continue;
7106*e4b17023SJohn Marino 	  reg = reload_adjust_reg_for_mode (reg, new_mode);
7107*e4b17023SJohn Marino 	}
7108*e4b17023SJohn Marino       *reload_reg = reg;
7109*e4b17023SJohn Marino       return true;
7110*e4b17023SJohn Marino     }
7111*e4b17023SJohn Marino   return false;
7112*e4b17023SJohn Marino }
7113*e4b17023SJohn Marino 
7114*e4b17023SJohn Marino /* Check if *RELOAD_REG is suitable as a scratch register for the reload
7115*e4b17023SJohn Marino    pattern with insn_code ICODE, or alternatively, if alt_reload_reg is
7116*e4b17023SJohn Marino    nonzero, if that is suitable.  On success, change *RELOAD_REG to the
7117*e4b17023SJohn Marino    adjusted register, and return true.  Otherwise, return false.  */
7118*e4b17023SJohn Marino static bool
reload_adjust_reg_for_icode(rtx * reload_reg,rtx alt_reload_reg,enum insn_code icode)7119*e4b17023SJohn Marino reload_adjust_reg_for_icode (rtx *reload_reg, rtx alt_reload_reg,
7120*e4b17023SJohn Marino 			     enum insn_code icode)
7121*e4b17023SJohn Marino 
7122*e4b17023SJohn Marino {
7123*e4b17023SJohn Marino   enum reg_class new_class = scratch_reload_class (icode);
7124*e4b17023SJohn Marino   enum machine_mode new_mode = insn_data[(int) icode].operand[2].mode;
7125*e4b17023SJohn Marino 
7126*e4b17023SJohn Marino   return reload_adjust_reg_for_temp (reload_reg, alt_reload_reg,
7127*e4b17023SJohn Marino 				     new_class, new_mode);
7128*e4b17023SJohn Marino }
7129*e4b17023SJohn Marino 
7130*e4b17023SJohn Marino /* Generate insns to perform reload RL, which is for the insn in CHAIN and
7131*e4b17023SJohn Marino    has the number J.  OLD contains the value to be used as input.  */
7132*e4b17023SJohn Marino 
7133*e4b17023SJohn Marino static void
emit_input_reload_insns(struct insn_chain * chain,struct reload * rl,rtx old,int j)7134*e4b17023SJohn Marino emit_input_reload_insns (struct insn_chain *chain, struct reload *rl,
7135*e4b17023SJohn Marino 			 rtx old, int j)
7136*e4b17023SJohn Marino {
7137*e4b17023SJohn Marino   rtx insn = chain->insn;
7138*e4b17023SJohn Marino   rtx reloadreg;
7139*e4b17023SJohn Marino   rtx oldequiv_reg = 0;
7140*e4b17023SJohn Marino   rtx oldequiv = 0;
7141*e4b17023SJohn Marino   int special = 0;
7142*e4b17023SJohn Marino   enum machine_mode mode;
7143*e4b17023SJohn Marino   rtx *where;
7144*e4b17023SJohn Marino 
7145*e4b17023SJohn Marino   /* delete_output_reload is only invoked properly if old contains
7146*e4b17023SJohn Marino      the original pseudo register.  Since this is replaced with a
7147*e4b17023SJohn Marino      hard reg when RELOAD_OVERRIDE_IN is set, see if we can
7148*e4b17023SJohn Marino      find the pseudo in RELOAD_IN_REG.  */
7149*e4b17023SJohn Marino   if (reload_override_in[j]
7150*e4b17023SJohn Marino       && REG_P (rl->in_reg))
7151*e4b17023SJohn Marino     {
7152*e4b17023SJohn Marino       oldequiv = old;
7153*e4b17023SJohn Marino       old = rl->in_reg;
7154*e4b17023SJohn Marino     }
7155*e4b17023SJohn Marino   if (oldequiv == 0)
7156*e4b17023SJohn Marino     oldequiv = old;
7157*e4b17023SJohn Marino   else if (REG_P (oldequiv))
7158*e4b17023SJohn Marino     oldequiv_reg = oldequiv;
7159*e4b17023SJohn Marino   else if (GET_CODE (oldequiv) == SUBREG)
7160*e4b17023SJohn Marino     oldequiv_reg = SUBREG_REG (oldequiv);
7161*e4b17023SJohn Marino 
7162*e4b17023SJohn Marino   reloadreg = reload_reg_rtx_for_input[j];
7163*e4b17023SJohn Marino   mode = GET_MODE (reloadreg);
7164*e4b17023SJohn Marino 
7165*e4b17023SJohn Marino   /* If we are reloading from a register that was recently stored in
7166*e4b17023SJohn Marino      with an output-reload, see if we can prove there was
7167*e4b17023SJohn Marino      actually no need to store the old value in it.  */
7168*e4b17023SJohn Marino 
7169*e4b17023SJohn Marino   if (optimize && REG_P (oldequiv)
7170*e4b17023SJohn Marino       && REGNO (oldequiv) < FIRST_PSEUDO_REGISTER
7171*e4b17023SJohn Marino       && spill_reg_store[REGNO (oldequiv)]
7172*e4b17023SJohn Marino       && REG_P (old)
7173*e4b17023SJohn Marino       && (dead_or_set_p (insn, spill_reg_stored_to[REGNO (oldequiv)])
7174*e4b17023SJohn Marino 	  || rtx_equal_p (spill_reg_stored_to[REGNO (oldequiv)],
7175*e4b17023SJohn Marino 			  rl->out_reg)))
7176*e4b17023SJohn Marino     delete_output_reload (insn, j, REGNO (oldequiv), reloadreg);
7177*e4b17023SJohn Marino 
7178*e4b17023SJohn Marino   /* Encapsulate OLDEQUIV into the reload mode, then load RELOADREG from
7179*e4b17023SJohn Marino      OLDEQUIV.  */
7180*e4b17023SJohn Marino 
7181*e4b17023SJohn Marino   while (GET_CODE (oldequiv) == SUBREG && GET_MODE (oldequiv) != mode)
7182*e4b17023SJohn Marino     oldequiv = SUBREG_REG (oldequiv);
7183*e4b17023SJohn Marino   if (GET_MODE (oldequiv) != VOIDmode
7184*e4b17023SJohn Marino       && mode != GET_MODE (oldequiv))
7185*e4b17023SJohn Marino     oldequiv = gen_lowpart_SUBREG (mode, oldequiv);
7186*e4b17023SJohn Marino 
7187*e4b17023SJohn Marino   /* Switch to the right place to emit the reload insns.  */
7188*e4b17023SJohn Marino   switch (rl->when_needed)
7189*e4b17023SJohn Marino     {
7190*e4b17023SJohn Marino     case RELOAD_OTHER:
7191*e4b17023SJohn Marino       where = &other_input_reload_insns;
7192*e4b17023SJohn Marino       break;
7193*e4b17023SJohn Marino     case RELOAD_FOR_INPUT:
7194*e4b17023SJohn Marino       where = &input_reload_insns[rl->opnum];
7195*e4b17023SJohn Marino       break;
7196*e4b17023SJohn Marino     case RELOAD_FOR_INPUT_ADDRESS:
7197*e4b17023SJohn Marino       where = &input_address_reload_insns[rl->opnum];
7198*e4b17023SJohn Marino       break;
7199*e4b17023SJohn Marino     case RELOAD_FOR_INPADDR_ADDRESS:
7200*e4b17023SJohn Marino       where = &inpaddr_address_reload_insns[rl->opnum];
7201*e4b17023SJohn Marino       break;
7202*e4b17023SJohn Marino     case RELOAD_FOR_OUTPUT_ADDRESS:
7203*e4b17023SJohn Marino       where = &output_address_reload_insns[rl->opnum];
7204*e4b17023SJohn Marino       break;
7205*e4b17023SJohn Marino     case RELOAD_FOR_OUTADDR_ADDRESS:
7206*e4b17023SJohn Marino       where = &outaddr_address_reload_insns[rl->opnum];
7207*e4b17023SJohn Marino       break;
7208*e4b17023SJohn Marino     case RELOAD_FOR_OPERAND_ADDRESS:
7209*e4b17023SJohn Marino       where = &operand_reload_insns;
7210*e4b17023SJohn Marino       break;
7211*e4b17023SJohn Marino     case RELOAD_FOR_OPADDR_ADDR:
7212*e4b17023SJohn Marino       where = &other_operand_reload_insns;
7213*e4b17023SJohn Marino       break;
7214*e4b17023SJohn Marino     case RELOAD_FOR_OTHER_ADDRESS:
7215*e4b17023SJohn Marino       where = &other_input_address_reload_insns;
7216*e4b17023SJohn Marino       break;
7217*e4b17023SJohn Marino     default:
7218*e4b17023SJohn Marino       gcc_unreachable ();
7219*e4b17023SJohn Marino     }
7220*e4b17023SJohn Marino 
7221*e4b17023SJohn Marino   push_to_sequence (*where);
7222*e4b17023SJohn Marino 
7223*e4b17023SJohn Marino   /* Auto-increment addresses must be reloaded in a special way.  */
7224*e4b17023SJohn Marino   if (rl->out && ! rl->out_reg)
7225*e4b17023SJohn Marino     {
7226*e4b17023SJohn Marino       /* We are not going to bother supporting the case where a
7227*e4b17023SJohn Marino 	 incremented register can't be copied directly from
7228*e4b17023SJohn Marino 	 OLDEQUIV since this seems highly unlikely.  */
7229*e4b17023SJohn Marino       gcc_assert (rl->secondary_in_reload < 0);
7230*e4b17023SJohn Marino 
7231*e4b17023SJohn Marino       if (reload_inherited[j])
7232*e4b17023SJohn Marino 	oldequiv = reloadreg;
7233*e4b17023SJohn Marino 
7234*e4b17023SJohn Marino       old = XEXP (rl->in_reg, 0);
7235*e4b17023SJohn Marino 
7236*e4b17023SJohn Marino       /* Prevent normal processing of this reload.  */
7237*e4b17023SJohn Marino       special = 1;
7238*e4b17023SJohn Marino       /* Output a special code sequence for this case.  */
7239*e4b17023SJohn Marino       inc_for_reload (reloadreg, oldequiv, rl->out, rl->inc);
7240*e4b17023SJohn Marino     }
7241*e4b17023SJohn Marino 
7242*e4b17023SJohn Marino   /* If we are reloading a pseudo-register that was set by the previous
7243*e4b17023SJohn Marino      insn, see if we can get rid of that pseudo-register entirely
7244*e4b17023SJohn Marino      by redirecting the previous insn into our reload register.  */
7245*e4b17023SJohn Marino 
7246*e4b17023SJohn Marino   else if (optimize && REG_P (old)
7247*e4b17023SJohn Marino 	   && REGNO (old) >= FIRST_PSEUDO_REGISTER
7248*e4b17023SJohn Marino 	   && dead_or_set_p (insn, old)
7249*e4b17023SJohn Marino 	   /* This is unsafe if some other reload
7250*e4b17023SJohn Marino 	      uses the same reg first.  */
7251*e4b17023SJohn Marino 	   && ! conflicts_with_override (reloadreg)
7252*e4b17023SJohn Marino 	   && free_for_value_p (REGNO (reloadreg), rl->mode, rl->opnum,
7253*e4b17023SJohn Marino 				rl->when_needed, old, rl->out, j, 0))
7254*e4b17023SJohn Marino     {
7255*e4b17023SJohn Marino       rtx temp = PREV_INSN (insn);
7256*e4b17023SJohn Marino       while (temp && (NOTE_P (temp) || DEBUG_INSN_P (temp)))
7257*e4b17023SJohn Marino 	temp = PREV_INSN (temp);
7258*e4b17023SJohn Marino       if (temp
7259*e4b17023SJohn Marino 	  && NONJUMP_INSN_P (temp)
7260*e4b17023SJohn Marino 	  && GET_CODE (PATTERN (temp)) == SET
7261*e4b17023SJohn Marino 	  && SET_DEST (PATTERN (temp)) == old
7262*e4b17023SJohn Marino 	  /* Make sure we can access insn_operand_constraint.  */
7263*e4b17023SJohn Marino 	  && asm_noperands (PATTERN (temp)) < 0
7264*e4b17023SJohn Marino 	  /* This is unsafe if operand occurs more than once in current
7265*e4b17023SJohn Marino 	     insn.  Perhaps some occurrences aren't reloaded.  */
7266*e4b17023SJohn Marino 	  && count_occurrences (PATTERN (insn), old, 0) == 1)
7267*e4b17023SJohn Marino 	{
7268*e4b17023SJohn Marino 	  rtx old = SET_DEST (PATTERN (temp));
7269*e4b17023SJohn Marino 	  /* Store into the reload register instead of the pseudo.  */
7270*e4b17023SJohn Marino 	  SET_DEST (PATTERN (temp)) = reloadreg;
7271*e4b17023SJohn Marino 
7272*e4b17023SJohn Marino 	  /* Verify that resulting insn is valid.  */
7273*e4b17023SJohn Marino 	  extract_insn (temp);
7274*e4b17023SJohn Marino 	  if (constrain_operands (1))
7275*e4b17023SJohn Marino 	    {
7276*e4b17023SJohn Marino 	      /* If the previous insn is an output reload, the source is
7277*e4b17023SJohn Marino 		 a reload register, and its spill_reg_store entry will
7278*e4b17023SJohn Marino 		 contain the previous destination.  This is now
7279*e4b17023SJohn Marino 		 invalid.  */
7280*e4b17023SJohn Marino 	      if (REG_P (SET_SRC (PATTERN (temp)))
7281*e4b17023SJohn Marino 		  && REGNO (SET_SRC (PATTERN (temp))) < FIRST_PSEUDO_REGISTER)
7282*e4b17023SJohn Marino 		{
7283*e4b17023SJohn Marino 		  spill_reg_store[REGNO (SET_SRC (PATTERN (temp)))] = 0;
7284*e4b17023SJohn Marino 		  spill_reg_stored_to[REGNO (SET_SRC (PATTERN (temp)))] = 0;
7285*e4b17023SJohn Marino 		}
7286*e4b17023SJohn Marino 
7287*e4b17023SJohn Marino 	      /* If these are the only uses of the pseudo reg,
7288*e4b17023SJohn Marino 		 pretend for GDB it lives in the reload reg we used.  */
7289*e4b17023SJohn Marino 	      if (REG_N_DEATHS (REGNO (old)) == 1
7290*e4b17023SJohn Marino 		  && REG_N_SETS (REGNO (old)) == 1)
7291*e4b17023SJohn Marino 		{
7292*e4b17023SJohn Marino 		  reg_renumber[REGNO (old)] = REGNO (reloadreg);
7293*e4b17023SJohn Marino 		  if (ira_conflicts_p)
7294*e4b17023SJohn Marino 		    /* Inform IRA about the change.  */
7295*e4b17023SJohn Marino 		    ira_mark_allocation_change (REGNO (old));
7296*e4b17023SJohn Marino 		  alter_reg (REGNO (old), -1, false);
7297*e4b17023SJohn Marino 		}
7298*e4b17023SJohn Marino 	      special = 1;
7299*e4b17023SJohn Marino 
7300*e4b17023SJohn Marino 	      /* Adjust any debug insns between temp and insn.  */
7301*e4b17023SJohn Marino 	      while ((temp = NEXT_INSN (temp)) != insn)
7302*e4b17023SJohn Marino 		if (DEBUG_INSN_P (temp))
7303*e4b17023SJohn Marino 		  replace_rtx (PATTERN (temp), old, reloadreg);
7304*e4b17023SJohn Marino 		else
7305*e4b17023SJohn Marino 		  gcc_assert (NOTE_P (temp));
7306*e4b17023SJohn Marino 	    }
7307*e4b17023SJohn Marino 	  else
7308*e4b17023SJohn Marino 	    {
7309*e4b17023SJohn Marino 	      SET_DEST (PATTERN (temp)) = old;
7310*e4b17023SJohn Marino 	    }
7311*e4b17023SJohn Marino 	}
7312*e4b17023SJohn Marino     }
7313*e4b17023SJohn Marino 
7314*e4b17023SJohn Marino   /* We can't do that, so output an insn to load RELOADREG.  */
7315*e4b17023SJohn Marino 
7316*e4b17023SJohn Marino   /* If we have a secondary reload, pick up the secondary register
7317*e4b17023SJohn Marino      and icode, if any.  If OLDEQUIV and OLD are different or
7318*e4b17023SJohn Marino      if this is an in-out reload, recompute whether or not we
7319*e4b17023SJohn Marino      still need a secondary register and what the icode should
7320*e4b17023SJohn Marino      be.  If we still need a secondary register and the class or
7321*e4b17023SJohn Marino      icode is different, go back to reloading from OLD if using
7322*e4b17023SJohn Marino      OLDEQUIV means that we got the wrong type of register.  We
7323*e4b17023SJohn Marino      cannot have different class or icode due to an in-out reload
7324*e4b17023SJohn Marino      because we don't make such reloads when both the input and
7325*e4b17023SJohn Marino      output need secondary reload registers.  */
7326*e4b17023SJohn Marino 
7327*e4b17023SJohn Marino   if (! special && rl->secondary_in_reload >= 0)
7328*e4b17023SJohn Marino     {
7329*e4b17023SJohn Marino       rtx second_reload_reg = 0;
7330*e4b17023SJohn Marino       rtx third_reload_reg = 0;
7331*e4b17023SJohn Marino       int secondary_reload = rl->secondary_in_reload;
7332*e4b17023SJohn Marino       rtx real_oldequiv = oldequiv;
7333*e4b17023SJohn Marino       rtx real_old = old;
7334*e4b17023SJohn Marino       rtx tmp;
7335*e4b17023SJohn Marino       enum insn_code icode;
7336*e4b17023SJohn Marino       enum insn_code tertiary_icode = CODE_FOR_nothing;
7337*e4b17023SJohn Marino 
7338*e4b17023SJohn Marino       /* If OLDEQUIV is a pseudo with a MEM, get the real MEM
7339*e4b17023SJohn Marino 	 and similarly for OLD.
7340*e4b17023SJohn Marino 	 See comments in get_secondary_reload in reload.c.  */
7341*e4b17023SJohn Marino       /* If it is a pseudo that cannot be replaced with its
7342*e4b17023SJohn Marino 	 equivalent MEM, we must fall back to reload_in, which
7343*e4b17023SJohn Marino 	 will have all the necessary substitutions registered.
7344*e4b17023SJohn Marino 	 Likewise for a pseudo that can't be replaced with its
7345*e4b17023SJohn Marino 	 equivalent constant.
7346*e4b17023SJohn Marino 
7347*e4b17023SJohn Marino 	 Take extra care for subregs of such pseudos.  Note that
7348*e4b17023SJohn Marino 	 we cannot use reg_equiv_mem in this case because it is
7349*e4b17023SJohn Marino 	 not in the right mode.  */
7350*e4b17023SJohn Marino 
7351*e4b17023SJohn Marino       tmp = oldequiv;
7352*e4b17023SJohn Marino       if (GET_CODE (tmp) == SUBREG)
7353*e4b17023SJohn Marino 	tmp = SUBREG_REG (tmp);
7354*e4b17023SJohn Marino       if (REG_P (tmp)
7355*e4b17023SJohn Marino 	  && REGNO (tmp) >= FIRST_PSEUDO_REGISTER
7356*e4b17023SJohn Marino 	  && (reg_equiv_memory_loc (REGNO (tmp)) != 0
7357*e4b17023SJohn Marino 	      || reg_equiv_constant (REGNO (tmp)) != 0))
7358*e4b17023SJohn Marino 	{
7359*e4b17023SJohn Marino 	  if (! reg_equiv_mem (REGNO (tmp))
7360*e4b17023SJohn Marino 	      || num_not_at_initial_offset
7361*e4b17023SJohn Marino 	      || GET_CODE (oldequiv) == SUBREG)
7362*e4b17023SJohn Marino 	    real_oldequiv = rl->in;
7363*e4b17023SJohn Marino 	  else
7364*e4b17023SJohn Marino 	    real_oldequiv = reg_equiv_mem (REGNO (tmp));
7365*e4b17023SJohn Marino 	}
7366*e4b17023SJohn Marino 
7367*e4b17023SJohn Marino       tmp = old;
7368*e4b17023SJohn Marino       if (GET_CODE (tmp) == SUBREG)
7369*e4b17023SJohn Marino 	tmp = SUBREG_REG (tmp);
7370*e4b17023SJohn Marino       if (REG_P (tmp)
7371*e4b17023SJohn Marino 	  && REGNO (tmp) >= FIRST_PSEUDO_REGISTER
7372*e4b17023SJohn Marino 	  && (reg_equiv_memory_loc (REGNO (tmp)) != 0
7373*e4b17023SJohn Marino 	      || reg_equiv_constant (REGNO (tmp)) != 0))
7374*e4b17023SJohn Marino 	{
7375*e4b17023SJohn Marino 	  if (! reg_equiv_mem (REGNO (tmp))
7376*e4b17023SJohn Marino 	      || num_not_at_initial_offset
7377*e4b17023SJohn Marino 	      || GET_CODE (old) == SUBREG)
7378*e4b17023SJohn Marino 	    real_old = rl->in;
7379*e4b17023SJohn Marino 	  else
7380*e4b17023SJohn Marino 	    real_old = reg_equiv_mem (REGNO (tmp));
7381*e4b17023SJohn Marino 	}
7382*e4b17023SJohn Marino 
7383*e4b17023SJohn Marino       second_reload_reg = rld[secondary_reload].reg_rtx;
7384*e4b17023SJohn Marino       if (rld[secondary_reload].secondary_in_reload >= 0)
7385*e4b17023SJohn Marino 	{
7386*e4b17023SJohn Marino 	  int tertiary_reload = rld[secondary_reload].secondary_in_reload;
7387*e4b17023SJohn Marino 
7388*e4b17023SJohn Marino 	  third_reload_reg = rld[tertiary_reload].reg_rtx;
7389*e4b17023SJohn Marino 	  tertiary_icode = rld[secondary_reload].secondary_in_icode;
7390*e4b17023SJohn Marino 	  /* We'd have to add more code for quartary reloads.  */
7391*e4b17023SJohn Marino 	  gcc_assert (rld[tertiary_reload].secondary_in_reload < 0);
7392*e4b17023SJohn Marino 	}
7393*e4b17023SJohn Marino       icode = rl->secondary_in_icode;
7394*e4b17023SJohn Marino 
7395*e4b17023SJohn Marino       if ((old != oldequiv && ! rtx_equal_p (old, oldequiv))
7396*e4b17023SJohn Marino 	  || (rl->in != 0 && rl->out != 0))
7397*e4b17023SJohn Marino 	{
7398*e4b17023SJohn Marino 	  secondary_reload_info sri, sri2;
7399*e4b17023SJohn Marino 	  enum reg_class new_class, new_t_class;
7400*e4b17023SJohn Marino 
7401*e4b17023SJohn Marino 	  sri.icode = CODE_FOR_nothing;
7402*e4b17023SJohn Marino 	  sri.prev_sri = NULL;
7403*e4b17023SJohn Marino 	  new_class
7404*e4b17023SJohn Marino 	    = (enum reg_class) targetm.secondary_reload (1, real_oldequiv,
7405*e4b17023SJohn Marino 							 rl->rclass, mode,
7406*e4b17023SJohn Marino 							 &sri);
7407*e4b17023SJohn Marino 
7408*e4b17023SJohn Marino 	  if (new_class == NO_REGS && sri.icode == CODE_FOR_nothing)
7409*e4b17023SJohn Marino 	    second_reload_reg = 0;
7410*e4b17023SJohn Marino 	  else if (new_class == NO_REGS)
7411*e4b17023SJohn Marino 	    {
7412*e4b17023SJohn Marino 	      if (reload_adjust_reg_for_icode (&second_reload_reg,
7413*e4b17023SJohn Marino 					       third_reload_reg,
7414*e4b17023SJohn Marino 					       (enum insn_code) sri.icode))
7415*e4b17023SJohn Marino 		{
7416*e4b17023SJohn Marino 		  icode = (enum insn_code) sri.icode;
7417*e4b17023SJohn Marino 		  third_reload_reg = 0;
7418*e4b17023SJohn Marino 		}
7419*e4b17023SJohn Marino 	      else
7420*e4b17023SJohn Marino 		{
7421*e4b17023SJohn Marino 		  oldequiv = old;
7422*e4b17023SJohn Marino 		  real_oldequiv = real_old;
7423*e4b17023SJohn Marino 		}
7424*e4b17023SJohn Marino 	    }
7425*e4b17023SJohn Marino 	  else if (sri.icode != CODE_FOR_nothing)
7426*e4b17023SJohn Marino 	    /* We currently lack a way to express this in reloads.  */
7427*e4b17023SJohn Marino 	    gcc_unreachable ();
7428*e4b17023SJohn Marino 	  else
7429*e4b17023SJohn Marino 	    {
7430*e4b17023SJohn Marino 	      sri2.icode = CODE_FOR_nothing;
7431*e4b17023SJohn Marino 	      sri2.prev_sri = &sri;
7432*e4b17023SJohn Marino 	      new_t_class
7433*e4b17023SJohn Marino 		= (enum reg_class) targetm.secondary_reload (1, real_oldequiv,
7434*e4b17023SJohn Marino 							     new_class, mode,
7435*e4b17023SJohn Marino 							     &sri);
7436*e4b17023SJohn Marino 	      if (new_t_class == NO_REGS && sri2.icode == CODE_FOR_nothing)
7437*e4b17023SJohn Marino 		{
7438*e4b17023SJohn Marino 		  if (reload_adjust_reg_for_temp (&second_reload_reg,
7439*e4b17023SJohn Marino 						  third_reload_reg,
7440*e4b17023SJohn Marino 						  new_class, mode))
7441*e4b17023SJohn Marino 		    {
7442*e4b17023SJohn Marino 		      third_reload_reg = 0;
7443*e4b17023SJohn Marino 		      tertiary_icode = (enum insn_code) sri2.icode;
7444*e4b17023SJohn Marino 		    }
7445*e4b17023SJohn Marino 		  else
7446*e4b17023SJohn Marino 		    {
7447*e4b17023SJohn Marino 		      oldequiv = old;
7448*e4b17023SJohn Marino 		      real_oldequiv = real_old;
7449*e4b17023SJohn Marino 		    }
7450*e4b17023SJohn Marino 		}
7451*e4b17023SJohn Marino 	      else if (new_t_class == NO_REGS && sri2.icode != CODE_FOR_nothing)
7452*e4b17023SJohn Marino 		{
7453*e4b17023SJohn Marino 		  rtx intermediate = second_reload_reg;
7454*e4b17023SJohn Marino 
7455*e4b17023SJohn Marino 		  if (reload_adjust_reg_for_temp (&intermediate, NULL,
7456*e4b17023SJohn Marino 						  new_class, mode)
7457*e4b17023SJohn Marino 		      && reload_adjust_reg_for_icode (&third_reload_reg, NULL,
7458*e4b17023SJohn Marino 						      ((enum insn_code)
7459*e4b17023SJohn Marino 						       sri2.icode)))
7460*e4b17023SJohn Marino 		    {
7461*e4b17023SJohn Marino 		      second_reload_reg = intermediate;
7462*e4b17023SJohn Marino 		      tertiary_icode = (enum insn_code) sri2.icode;
7463*e4b17023SJohn Marino 		    }
7464*e4b17023SJohn Marino 		  else
7465*e4b17023SJohn Marino 		    {
7466*e4b17023SJohn Marino 		      oldequiv = old;
7467*e4b17023SJohn Marino 		      real_oldequiv = real_old;
7468*e4b17023SJohn Marino 		    }
7469*e4b17023SJohn Marino 		}
7470*e4b17023SJohn Marino 	      else if (new_t_class != NO_REGS && sri2.icode == CODE_FOR_nothing)
7471*e4b17023SJohn Marino 		{
7472*e4b17023SJohn Marino 		  rtx intermediate = second_reload_reg;
7473*e4b17023SJohn Marino 
7474*e4b17023SJohn Marino 		  if (reload_adjust_reg_for_temp (&intermediate, NULL,
7475*e4b17023SJohn Marino 						  new_class, mode)
7476*e4b17023SJohn Marino 		      && reload_adjust_reg_for_temp (&third_reload_reg, NULL,
7477*e4b17023SJohn Marino 						      new_t_class, mode))
7478*e4b17023SJohn Marino 		    {
7479*e4b17023SJohn Marino 		      second_reload_reg = intermediate;
7480*e4b17023SJohn Marino 		      tertiary_icode = (enum insn_code) sri2.icode;
7481*e4b17023SJohn Marino 		    }
7482*e4b17023SJohn Marino 		  else
7483*e4b17023SJohn Marino 		    {
7484*e4b17023SJohn Marino 		      oldequiv = old;
7485*e4b17023SJohn Marino 		      real_oldequiv = real_old;
7486*e4b17023SJohn Marino 		    }
7487*e4b17023SJohn Marino 		}
7488*e4b17023SJohn Marino 	      else
7489*e4b17023SJohn Marino 		{
7490*e4b17023SJohn Marino 		  /* This could be handled more intelligently too.  */
7491*e4b17023SJohn Marino 		  oldequiv = old;
7492*e4b17023SJohn Marino 		  real_oldequiv = real_old;
7493*e4b17023SJohn Marino 		}
7494*e4b17023SJohn Marino 	    }
7495*e4b17023SJohn Marino 	}
7496*e4b17023SJohn Marino 
7497*e4b17023SJohn Marino       /* If we still need a secondary reload register, check
7498*e4b17023SJohn Marino 	 to see if it is being used as a scratch or intermediate
7499*e4b17023SJohn Marino 	 register and generate code appropriately.  If we need
7500*e4b17023SJohn Marino 	 a scratch register, use REAL_OLDEQUIV since the form of
7501*e4b17023SJohn Marino 	 the insn may depend on the actual address if it is
7502*e4b17023SJohn Marino 	 a MEM.  */
7503*e4b17023SJohn Marino 
7504*e4b17023SJohn Marino       if (second_reload_reg)
7505*e4b17023SJohn Marino 	{
7506*e4b17023SJohn Marino 	  if (icode != CODE_FOR_nothing)
7507*e4b17023SJohn Marino 	    {
7508*e4b17023SJohn Marino 	      /* We'd have to add extra code to handle this case.  */
7509*e4b17023SJohn Marino 	      gcc_assert (!third_reload_reg);
7510*e4b17023SJohn Marino 
7511*e4b17023SJohn Marino 	      emit_insn (GEN_FCN (icode) (reloadreg, real_oldequiv,
7512*e4b17023SJohn Marino 					  second_reload_reg));
7513*e4b17023SJohn Marino 	      special = 1;
7514*e4b17023SJohn Marino 	    }
7515*e4b17023SJohn Marino 	  else
7516*e4b17023SJohn Marino 	    {
7517*e4b17023SJohn Marino 	      /* See if we need a scratch register to load the
7518*e4b17023SJohn Marino 		 intermediate register (a tertiary reload).  */
7519*e4b17023SJohn Marino 	      if (tertiary_icode != CODE_FOR_nothing)
7520*e4b17023SJohn Marino 		{
7521*e4b17023SJohn Marino 		  emit_insn ((GEN_FCN (tertiary_icode)
7522*e4b17023SJohn Marino 			      (second_reload_reg, real_oldequiv,
7523*e4b17023SJohn Marino 			       third_reload_reg)));
7524*e4b17023SJohn Marino 		}
7525*e4b17023SJohn Marino 	      else if (third_reload_reg)
7526*e4b17023SJohn Marino 		{
7527*e4b17023SJohn Marino 		  gen_reload (third_reload_reg, real_oldequiv,
7528*e4b17023SJohn Marino 			      rl->opnum,
7529*e4b17023SJohn Marino 			      rl->when_needed);
7530*e4b17023SJohn Marino 		  gen_reload (second_reload_reg, third_reload_reg,
7531*e4b17023SJohn Marino 			      rl->opnum,
7532*e4b17023SJohn Marino 			      rl->when_needed);
7533*e4b17023SJohn Marino 		}
7534*e4b17023SJohn Marino 	      else
7535*e4b17023SJohn Marino 		gen_reload (second_reload_reg, real_oldequiv,
7536*e4b17023SJohn Marino 			    rl->opnum,
7537*e4b17023SJohn Marino 			    rl->when_needed);
7538*e4b17023SJohn Marino 
7539*e4b17023SJohn Marino 	      oldequiv = second_reload_reg;
7540*e4b17023SJohn Marino 	    }
7541*e4b17023SJohn Marino 	}
7542*e4b17023SJohn Marino     }
7543*e4b17023SJohn Marino 
7544*e4b17023SJohn Marino   if (! special && ! rtx_equal_p (reloadreg, oldequiv))
7545*e4b17023SJohn Marino     {
7546*e4b17023SJohn Marino       rtx real_oldequiv = oldequiv;
7547*e4b17023SJohn Marino 
7548*e4b17023SJohn Marino       if ((REG_P (oldequiv)
7549*e4b17023SJohn Marino 	   && REGNO (oldequiv) >= FIRST_PSEUDO_REGISTER
7550*e4b17023SJohn Marino 	   && (reg_equiv_memory_loc (REGNO (oldequiv)) != 0
7551*e4b17023SJohn Marino 	       || reg_equiv_constant (REGNO (oldequiv)) != 0))
7552*e4b17023SJohn Marino 	  || (GET_CODE (oldequiv) == SUBREG
7553*e4b17023SJohn Marino 	      && REG_P (SUBREG_REG (oldequiv))
7554*e4b17023SJohn Marino 	      && (REGNO (SUBREG_REG (oldequiv))
7555*e4b17023SJohn Marino 		  >= FIRST_PSEUDO_REGISTER)
7556*e4b17023SJohn Marino 	      && ((reg_equiv_memory_loc (REGNO (SUBREG_REG (oldequiv))) != 0)
7557*e4b17023SJohn Marino 		  || (reg_equiv_constant (REGNO (SUBREG_REG (oldequiv))) != 0)))
7558*e4b17023SJohn Marino 	  || (CONSTANT_P (oldequiv)
7559*e4b17023SJohn Marino 	      && (targetm.preferred_reload_class (oldequiv,
7560*e4b17023SJohn Marino 						  REGNO_REG_CLASS (REGNO (reloadreg)))
7561*e4b17023SJohn Marino 		  == NO_REGS)))
7562*e4b17023SJohn Marino 	real_oldequiv = rl->in;
7563*e4b17023SJohn Marino       gen_reload (reloadreg, real_oldequiv, rl->opnum,
7564*e4b17023SJohn Marino 		  rl->when_needed);
7565*e4b17023SJohn Marino     }
7566*e4b17023SJohn Marino 
7567*e4b17023SJohn Marino   if (cfun->can_throw_non_call_exceptions)
7568*e4b17023SJohn Marino     copy_reg_eh_region_note_forward (insn, get_insns (), NULL);
7569*e4b17023SJohn Marino 
7570*e4b17023SJohn Marino   /* End this sequence.  */
7571*e4b17023SJohn Marino   *where = get_insns ();
7572*e4b17023SJohn Marino   end_sequence ();
7573*e4b17023SJohn Marino 
7574*e4b17023SJohn Marino   /* Update reload_override_in so that delete_address_reloads_1
7575*e4b17023SJohn Marino      can see the actual register usage.  */
7576*e4b17023SJohn Marino   if (oldequiv_reg)
7577*e4b17023SJohn Marino     reload_override_in[j] = oldequiv;
7578*e4b17023SJohn Marino }
7579*e4b17023SJohn Marino 
7580*e4b17023SJohn Marino /* Generate insns to for the output reload RL, which is for the insn described
7581*e4b17023SJohn Marino    by CHAIN and has the number J.  */
7582*e4b17023SJohn Marino static void
emit_output_reload_insns(struct insn_chain * chain,struct reload * rl,int j)7583*e4b17023SJohn Marino emit_output_reload_insns (struct insn_chain *chain, struct reload *rl,
7584*e4b17023SJohn Marino 			  int j)
7585*e4b17023SJohn Marino {
7586*e4b17023SJohn Marino   rtx reloadreg;
7587*e4b17023SJohn Marino   rtx insn = chain->insn;
7588*e4b17023SJohn Marino   int special = 0;
7589*e4b17023SJohn Marino   rtx old = rl->out;
7590*e4b17023SJohn Marino   enum machine_mode mode;
7591*e4b17023SJohn Marino   rtx p;
7592*e4b17023SJohn Marino   rtx rl_reg_rtx;
7593*e4b17023SJohn Marino 
7594*e4b17023SJohn Marino   if (rl->when_needed == RELOAD_OTHER)
7595*e4b17023SJohn Marino     start_sequence ();
7596*e4b17023SJohn Marino   else
7597*e4b17023SJohn Marino     push_to_sequence (output_reload_insns[rl->opnum]);
7598*e4b17023SJohn Marino 
7599*e4b17023SJohn Marino   rl_reg_rtx = reload_reg_rtx_for_output[j];
7600*e4b17023SJohn Marino   mode = GET_MODE (rl_reg_rtx);
7601*e4b17023SJohn Marino 
7602*e4b17023SJohn Marino   reloadreg = rl_reg_rtx;
7603*e4b17023SJohn Marino 
7604*e4b17023SJohn Marino   /* If we need two reload regs, set RELOADREG to the intermediate
7605*e4b17023SJohn Marino      one, since it will be stored into OLD.  We might need a secondary
7606*e4b17023SJohn Marino      register only for an input reload, so check again here.  */
7607*e4b17023SJohn Marino 
7608*e4b17023SJohn Marino   if (rl->secondary_out_reload >= 0)
7609*e4b17023SJohn Marino     {
7610*e4b17023SJohn Marino       rtx real_old = old;
7611*e4b17023SJohn Marino       int secondary_reload = rl->secondary_out_reload;
7612*e4b17023SJohn Marino       int tertiary_reload = rld[secondary_reload].secondary_out_reload;
7613*e4b17023SJohn Marino 
7614*e4b17023SJohn Marino       if (REG_P (old) && REGNO (old) >= FIRST_PSEUDO_REGISTER
7615*e4b17023SJohn Marino 	  && reg_equiv_mem (REGNO (old)) != 0)
7616*e4b17023SJohn Marino 	real_old = reg_equiv_mem (REGNO (old));
7617*e4b17023SJohn Marino 
7618*e4b17023SJohn Marino       if (secondary_reload_class (0, rl->rclass, mode, real_old) != NO_REGS)
7619*e4b17023SJohn Marino 	{
7620*e4b17023SJohn Marino 	  rtx second_reloadreg = reloadreg;
7621*e4b17023SJohn Marino 	  reloadreg = rld[secondary_reload].reg_rtx;
7622*e4b17023SJohn Marino 
7623*e4b17023SJohn Marino 	  /* See if RELOADREG is to be used as a scratch register
7624*e4b17023SJohn Marino 	     or as an intermediate register.  */
7625*e4b17023SJohn Marino 	  if (rl->secondary_out_icode != CODE_FOR_nothing)
7626*e4b17023SJohn Marino 	    {
7627*e4b17023SJohn Marino 	      /* We'd have to add extra code to handle this case.  */
7628*e4b17023SJohn Marino 	      gcc_assert (tertiary_reload < 0);
7629*e4b17023SJohn Marino 
7630*e4b17023SJohn Marino 	      emit_insn ((GEN_FCN (rl->secondary_out_icode)
7631*e4b17023SJohn Marino 			  (real_old, second_reloadreg, reloadreg)));
7632*e4b17023SJohn Marino 	      special = 1;
7633*e4b17023SJohn Marino 	    }
7634*e4b17023SJohn Marino 	  else
7635*e4b17023SJohn Marino 	    {
7636*e4b17023SJohn Marino 	      /* See if we need both a scratch and intermediate reload
7637*e4b17023SJohn Marino 		 register.  */
7638*e4b17023SJohn Marino 
7639*e4b17023SJohn Marino 	      enum insn_code tertiary_icode
7640*e4b17023SJohn Marino 		= rld[secondary_reload].secondary_out_icode;
7641*e4b17023SJohn Marino 
7642*e4b17023SJohn Marino 	      /* We'd have to add more code for quartary reloads.  */
7643*e4b17023SJohn Marino 	      gcc_assert (tertiary_reload < 0
7644*e4b17023SJohn Marino 			  || rld[tertiary_reload].secondary_out_reload < 0);
7645*e4b17023SJohn Marino 
7646*e4b17023SJohn Marino 	      if (GET_MODE (reloadreg) != mode)
7647*e4b17023SJohn Marino 		reloadreg = reload_adjust_reg_for_mode (reloadreg, mode);
7648*e4b17023SJohn Marino 
7649*e4b17023SJohn Marino 	      if (tertiary_icode != CODE_FOR_nothing)
7650*e4b17023SJohn Marino 		{
7651*e4b17023SJohn Marino 		  rtx third_reloadreg = rld[tertiary_reload].reg_rtx;
7652*e4b17023SJohn Marino 
7653*e4b17023SJohn Marino 		  /* Copy primary reload reg to secondary reload reg.
7654*e4b17023SJohn Marino 		     (Note that these have been swapped above, then
7655*e4b17023SJohn Marino 		     secondary reload reg to OLD using our insn.)  */
7656*e4b17023SJohn Marino 
7657*e4b17023SJohn Marino 		  /* If REAL_OLD is a paradoxical SUBREG, remove it
7658*e4b17023SJohn Marino 		     and try to put the opposite SUBREG on
7659*e4b17023SJohn Marino 		     RELOADREG.  */
7660*e4b17023SJohn Marino 		  strip_paradoxical_subreg (&real_old, &reloadreg);
7661*e4b17023SJohn Marino 
7662*e4b17023SJohn Marino 		  gen_reload (reloadreg, second_reloadreg,
7663*e4b17023SJohn Marino 			      rl->opnum, rl->when_needed);
7664*e4b17023SJohn Marino 		  emit_insn ((GEN_FCN (tertiary_icode)
7665*e4b17023SJohn Marino 			      (real_old, reloadreg, third_reloadreg)));
7666*e4b17023SJohn Marino 		  special = 1;
7667*e4b17023SJohn Marino 		}
7668*e4b17023SJohn Marino 
7669*e4b17023SJohn Marino 	      else
7670*e4b17023SJohn Marino 		{
7671*e4b17023SJohn Marino 		  /* Copy between the reload regs here and then to
7672*e4b17023SJohn Marino 		     OUT later.  */
7673*e4b17023SJohn Marino 
7674*e4b17023SJohn Marino 		  gen_reload (reloadreg, second_reloadreg,
7675*e4b17023SJohn Marino 			      rl->opnum, rl->when_needed);
7676*e4b17023SJohn Marino 		  if (tertiary_reload >= 0)
7677*e4b17023SJohn Marino 		    {
7678*e4b17023SJohn Marino 		      rtx third_reloadreg = rld[tertiary_reload].reg_rtx;
7679*e4b17023SJohn Marino 
7680*e4b17023SJohn Marino 		      gen_reload (third_reloadreg, reloadreg,
7681*e4b17023SJohn Marino 				  rl->opnum, rl->when_needed);
7682*e4b17023SJohn Marino 		      reloadreg = third_reloadreg;
7683*e4b17023SJohn Marino 		    }
7684*e4b17023SJohn Marino 		}
7685*e4b17023SJohn Marino 	    }
7686*e4b17023SJohn Marino 	}
7687*e4b17023SJohn Marino     }
7688*e4b17023SJohn Marino 
7689*e4b17023SJohn Marino   /* Output the last reload insn.  */
7690*e4b17023SJohn Marino   if (! special)
7691*e4b17023SJohn Marino     {
7692*e4b17023SJohn Marino       rtx set;
7693*e4b17023SJohn Marino 
7694*e4b17023SJohn Marino       /* Don't output the last reload if OLD is not the dest of
7695*e4b17023SJohn Marino 	 INSN and is in the src and is clobbered by INSN.  */
7696*e4b17023SJohn Marino       if (! flag_expensive_optimizations
7697*e4b17023SJohn Marino 	  || !REG_P (old)
7698*e4b17023SJohn Marino 	  || !(set = single_set (insn))
7699*e4b17023SJohn Marino 	  || rtx_equal_p (old, SET_DEST (set))
7700*e4b17023SJohn Marino 	  || !reg_mentioned_p (old, SET_SRC (set))
7701*e4b17023SJohn Marino 	  || !((REGNO (old) < FIRST_PSEUDO_REGISTER)
7702*e4b17023SJohn Marino 	       && regno_clobbered_p (REGNO (old), insn, rl->mode, 0)))
7703*e4b17023SJohn Marino 	gen_reload (old, reloadreg, rl->opnum,
7704*e4b17023SJohn Marino 		    rl->when_needed);
7705*e4b17023SJohn Marino     }
7706*e4b17023SJohn Marino 
7707*e4b17023SJohn Marino   /* Look at all insns we emitted, just to be safe.  */
7708*e4b17023SJohn Marino   for (p = get_insns (); p; p = NEXT_INSN (p))
7709*e4b17023SJohn Marino     if (INSN_P (p))
7710*e4b17023SJohn Marino       {
7711*e4b17023SJohn Marino 	rtx pat = PATTERN (p);
7712*e4b17023SJohn Marino 
7713*e4b17023SJohn Marino 	/* If this output reload doesn't come from a spill reg,
7714*e4b17023SJohn Marino 	   clear any memory of reloaded copies of the pseudo reg.
7715*e4b17023SJohn Marino 	   If this output reload comes from a spill reg,
7716*e4b17023SJohn Marino 	   reg_has_output_reload will make this do nothing.  */
7717*e4b17023SJohn Marino 	note_stores (pat, forget_old_reloads_1, NULL);
7718*e4b17023SJohn Marino 
7719*e4b17023SJohn Marino 	if (reg_mentioned_p (rl_reg_rtx, pat))
7720*e4b17023SJohn Marino 	  {
7721*e4b17023SJohn Marino 	    rtx set = single_set (insn);
7722*e4b17023SJohn Marino 	    if (reload_spill_index[j] < 0
7723*e4b17023SJohn Marino 		&& set
7724*e4b17023SJohn Marino 		&& SET_SRC (set) == rl_reg_rtx)
7725*e4b17023SJohn Marino 	      {
7726*e4b17023SJohn Marino 		int src = REGNO (SET_SRC (set));
7727*e4b17023SJohn Marino 
7728*e4b17023SJohn Marino 		reload_spill_index[j] = src;
7729*e4b17023SJohn Marino 		SET_HARD_REG_BIT (reg_is_output_reload, src);
7730*e4b17023SJohn Marino 		if (find_regno_note (insn, REG_DEAD, src))
7731*e4b17023SJohn Marino 		  SET_HARD_REG_BIT (reg_reloaded_died, src);
7732*e4b17023SJohn Marino 	      }
7733*e4b17023SJohn Marino 	    if (HARD_REGISTER_P (rl_reg_rtx))
7734*e4b17023SJohn Marino 	      {
7735*e4b17023SJohn Marino 		int s = rl->secondary_out_reload;
7736*e4b17023SJohn Marino 		set = single_set (p);
7737*e4b17023SJohn Marino 		/* If this reload copies only to the secondary reload
7738*e4b17023SJohn Marino 		   register, the secondary reload does the actual
7739*e4b17023SJohn Marino 		   store.  */
7740*e4b17023SJohn Marino 		if (s >= 0 && set == NULL_RTX)
7741*e4b17023SJohn Marino 		  /* We can't tell what function the secondary reload
7742*e4b17023SJohn Marino 		     has and where the actual store to the pseudo is
7743*e4b17023SJohn Marino 		     made; leave new_spill_reg_store alone.  */
7744*e4b17023SJohn Marino 		  ;
7745*e4b17023SJohn Marino 		else if (s >= 0
7746*e4b17023SJohn Marino 			 && SET_SRC (set) == rl_reg_rtx
7747*e4b17023SJohn Marino 			 && SET_DEST (set) == rld[s].reg_rtx)
7748*e4b17023SJohn Marino 		  {
7749*e4b17023SJohn Marino 		    /* Usually the next instruction will be the
7750*e4b17023SJohn Marino 		       secondary reload insn;  if we can confirm
7751*e4b17023SJohn Marino 		       that it is, setting new_spill_reg_store to
7752*e4b17023SJohn Marino 		       that insn will allow an extra optimization.  */
7753*e4b17023SJohn Marino 		    rtx s_reg = rld[s].reg_rtx;
7754*e4b17023SJohn Marino 		    rtx next = NEXT_INSN (p);
7755*e4b17023SJohn Marino 		    rld[s].out = rl->out;
7756*e4b17023SJohn Marino 		    rld[s].out_reg = rl->out_reg;
7757*e4b17023SJohn Marino 		    set = single_set (next);
7758*e4b17023SJohn Marino 		    if (set && SET_SRC (set) == s_reg
7759*e4b17023SJohn Marino 			&& reload_reg_rtx_reaches_end_p (s_reg, s))
7760*e4b17023SJohn Marino 		      {
7761*e4b17023SJohn Marino 			SET_HARD_REG_BIT (reg_is_output_reload,
7762*e4b17023SJohn Marino 					  REGNO (s_reg));
7763*e4b17023SJohn Marino 			new_spill_reg_store[REGNO (s_reg)] = next;
7764*e4b17023SJohn Marino 		      }
7765*e4b17023SJohn Marino 		  }
7766*e4b17023SJohn Marino 		else if (reload_reg_rtx_reaches_end_p (rl_reg_rtx, j))
7767*e4b17023SJohn Marino 		  new_spill_reg_store[REGNO (rl_reg_rtx)] = p;
7768*e4b17023SJohn Marino 	      }
7769*e4b17023SJohn Marino 	  }
7770*e4b17023SJohn Marino       }
7771*e4b17023SJohn Marino 
7772*e4b17023SJohn Marino   if (rl->when_needed == RELOAD_OTHER)
7773*e4b17023SJohn Marino     {
7774*e4b17023SJohn Marino       emit_insn (other_output_reload_insns[rl->opnum]);
7775*e4b17023SJohn Marino       other_output_reload_insns[rl->opnum] = get_insns ();
7776*e4b17023SJohn Marino     }
7777*e4b17023SJohn Marino   else
7778*e4b17023SJohn Marino     output_reload_insns[rl->opnum] = get_insns ();
7779*e4b17023SJohn Marino 
7780*e4b17023SJohn Marino   if (cfun->can_throw_non_call_exceptions)
7781*e4b17023SJohn Marino     copy_reg_eh_region_note_forward (insn, get_insns (), NULL);
7782*e4b17023SJohn Marino 
7783*e4b17023SJohn Marino   end_sequence ();
7784*e4b17023SJohn Marino }
7785*e4b17023SJohn Marino 
7786*e4b17023SJohn Marino /* Do input reloading for reload RL, which is for the insn described by CHAIN
7787*e4b17023SJohn Marino    and has the number J.  */
7788*e4b17023SJohn Marino static void
do_input_reload(struct insn_chain * chain,struct reload * rl,int j)7789*e4b17023SJohn Marino do_input_reload (struct insn_chain *chain, struct reload *rl, int j)
7790*e4b17023SJohn Marino {
7791*e4b17023SJohn Marino   rtx insn = chain->insn;
7792*e4b17023SJohn Marino   rtx old = (rl->in && MEM_P (rl->in)
7793*e4b17023SJohn Marino 	     ? rl->in_reg : rl->in);
7794*e4b17023SJohn Marino   rtx reg_rtx = rl->reg_rtx;
7795*e4b17023SJohn Marino 
7796*e4b17023SJohn Marino   if (old && reg_rtx)
7797*e4b17023SJohn Marino     {
7798*e4b17023SJohn Marino       enum machine_mode mode;
7799*e4b17023SJohn Marino 
7800*e4b17023SJohn Marino       /* Determine the mode to reload in.
7801*e4b17023SJohn Marino 	 This is very tricky because we have three to choose from.
7802*e4b17023SJohn Marino 	 There is the mode the insn operand wants (rl->inmode).
7803*e4b17023SJohn Marino 	 There is the mode of the reload register RELOADREG.
7804*e4b17023SJohn Marino 	 There is the intrinsic mode of the operand, which we could find
7805*e4b17023SJohn Marino 	 by stripping some SUBREGs.
7806*e4b17023SJohn Marino 	 It turns out that RELOADREG's mode is irrelevant:
7807*e4b17023SJohn Marino 	 we can change that arbitrarily.
7808*e4b17023SJohn Marino 
7809*e4b17023SJohn Marino 	 Consider (SUBREG:SI foo:QI) as an operand that must be SImode;
7810*e4b17023SJohn Marino 	 then the reload reg may not support QImode moves, so use SImode.
7811*e4b17023SJohn Marino 	 If foo is in memory due to spilling a pseudo reg, this is safe,
7812*e4b17023SJohn Marino 	 because the QImode value is in the least significant part of a
7813*e4b17023SJohn Marino 	 slot big enough for a SImode.  If foo is some other sort of
7814*e4b17023SJohn Marino 	 memory reference, then it is impossible to reload this case,
7815*e4b17023SJohn Marino 	 so previous passes had better make sure this never happens.
7816*e4b17023SJohn Marino 
7817*e4b17023SJohn Marino 	 Then consider a one-word union which has SImode and one of its
7818*e4b17023SJohn Marino 	 members is a float, being fetched as (SUBREG:SF union:SI).
7819*e4b17023SJohn Marino 	 We must fetch that as SFmode because we could be loading into
7820*e4b17023SJohn Marino 	 a float-only register.  In this case OLD's mode is correct.
7821*e4b17023SJohn Marino 
7822*e4b17023SJohn Marino 	 Consider an immediate integer: it has VOIDmode.  Here we need
7823*e4b17023SJohn Marino 	 to get a mode from something else.
7824*e4b17023SJohn Marino 
7825*e4b17023SJohn Marino 	 In some cases, there is a fourth mode, the operand's
7826*e4b17023SJohn Marino 	 containing mode.  If the insn specifies a containing mode for
7827*e4b17023SJohn Marino 	 this operand, it overrides all others.
7828*e4b17023SJohn Marino 
7829*e4b17023SJohn Marino 	 I am not sure whether the algorithm here is always right,
7830*e4b17023SJohn Marino 	 but it does the right things in those cases.  */
7831*e4b17023SJohn Marino 
7832*e4b17023SJohn Marino       mode = GET_MODE (old);
7833*e4b17023SJohn Marino       if (mode == VOIDmode)
7834*e4b17023SJohn Marino 	mode = rl->inmode;
7835*e4b17023SJohn Marino 
7836*e4b17023SJohn Marino       /* We cannot use gen_lowpart_common since it can do the wrong thing
7837*e4b17023SJohn Marino 	 when REG_RTX has a multi-word mode.  Note that REG_RTX must
7838*e4b17023SJohn Marino 	 always be a REG here.  */
7839*e4b17023SJohn Marino       if (GET_MODE (reg_rtx) != mode)
7840*e4b17023SJohn Marino 	reg_rtx = reload_adjust_reg_for_mode (reg_rtx, mode);
7841*e4b17023SJohn Marino     }
7842*e4b17023SJohn Marino   reload_reg_rtx_for_input[j] = reg_rtx;
7843*e4b17023SJohn Marino 
7844*e4b17023SJohn Marino   if (old != 0
7845*e4b17023SJohn Marino       /* AUTO_INC reloads need to be handled even if inherited.  We got an
7846*e4b17023SJohn Marino 	 AUTO_INC reload if reload_out is set but reload_out_reg isn't.  */
7847*e4b17023SJohn Marino       && (! reload_inherited[j] || (rl->out && ! rl->out_reg))
7848*e4b17023SJohn Marino       && ! rtx_equal_p (reg_rtx, old)
7849*e4b17023SJohn Marino       && reg_rtx != 0)
7850*e4b17023SJohn Marino     emit_input_reload_insns (chain, rld + j, old, j);
7851*e4b17023SJohn Marino 
7852*e4b17023SJohn Marino   /* When inheriting a wider reload, we have a MEM in rl->in,
7853*e4b17023SJohn Marino      e.g. inheriting a SImode output reload for
7854*e4b17023SJohn Marino      (mem:HI (plus:SI (reg:SI 14 fp) (const_int 10)))  */
7855*e4b17023SJohn Marino   if (optimize && reload_inherited[j] && rl->in
7856*e4b17023SJohn Marino       && MEM_P (rl->in)
7857*e4b17023SJohn Marino       && MEM_P (rl->in_reg)
7858*e4b17023SJohn Marino       && reload_spill_index[j] >= 0
7859*e4b17023SJohn Marino       && TEST_HARD_REG_BIT (reg_reloaded_valid, reload_spill_index[j]))
7860*e4b17023SJohn Marino     rl->in = regno_reg_rtx[reg_reloaded_contents[reload_spill_index[j]]];
7861*e4b17023SJohn Marino 
7862*e4b17023SJohn Marino   /* If we are reloading a register that was recently stored in with an
7863*e4b17023SJohn Marino      output-reload, see if we can prove there was
7864*e4b17023SJohn Marino      actually no need to store the old value in it.  */
7865*e4b17023SJohn Marino 
7866*e4b17023SJohn Marino   if (optimize
7867*e4b17023SJohn Marino       && (reload_inherited[j] || reload_override_in[j])
7868*e4b17023SJohn Marino       && reg_rtx
7869*e4b17023SJohn Marino       && REG_P (reg_rtx)
7870*e4b17023SJohn Marino       && spill_reg_store[REGNO (reg_rtx)] != 0
7871*e4b17023SJohn Marino #if 0
7872*e4b17023SJohn Marino       /* There doesn't seem to be any reason to restrict this to pseudos
7873*e4b17023SJohn Marino 	 and doing so loses in the case where we are copying from a
7874*e4b17023SJohn Marino 	 register of the wrong class.  */
7875*e4b17023SJohn Marino       && !HARD_REGISTER_P (spill_reg_stored_to[REGNO (reg_rtx)])
7876*e4b17023SJohn Marino #endif
7877*e4b17023SJohn Marino       /* The insn might have already some references to stackslots
7878*e4b17023SJohn Marino 	 replaced by MEMs, while reload_out_reg still names the
7879*e4b17023SJohn Marino 	 original pseudo.  */
7880*e4b17023SJohn Marino       && (dead_or_set_p (insn, spill_reg_stored_to[REGNO (reg_rtx)])
7881*e4b17023SJohn Marino 	  || rtx_equal_p (spill_reg_stored_to[REGNO (reg_rtx)], rl->out_reg)))
7882*e4b17023SJohn Marino     delete_output_reload (insn, j, REGNO (reg_rtx), reg_rtx);
7883*e4b17023SJohn Marino }
7884*e4b17023SJohn Marino 
7885*e4b17023SJohn Marino /* Do output reloading for reload RL, which is for the insn described by
7886*e4b17023SJohn Marino    CHAIN and has the number J.
7887*e4b17023SJohn Marino    ??? At some point we need to support handling output reloads of
7888*e4b17023SJohn Marino    JUMP_INSNs or insns that set cc0.  */
7889*e4b17023SJohn Marino static void
do_output_reload(struct insn_chain * chain,struct reload * rl,int j)7890*e4b17023SJohn Marino do_output_reload (struct insn_chain *chain, struct reload *rl, int j)
7891*e4b17023SJohn Marino {
7892*e4b17023SJohn Marino   rtx note, old;
7893*e4b17023SJohn Marino   rtx insn = chain->insn;
7894*e4b17023SJohn Marino   /* If this is an output reload that stores something that is
7895*e4b17023SJohn Marino      not loaded in this same reload, see if we can eliminate a previous
7896*e4b17023SJohn Marino      store.  */
7897*e4b17023SJohn Marino   rtx pseudo = rl->out_reg;
7898*e4b17023SJohn Marino   rtx reg_rtx = rl->reg_rtx;
7899*e4b17023SJohn Marino 
7900*e4b17023SJohn Marino   if (rl->out && reg_rtx)
7901*e4b17023SJohn Marino     {
7902*e4b17023SJohn Marino       enum machine_mode mode;
7903*e4b17023SJohn Marino 
7904*e4b17023SJohn Marino       /* Determine the mode to reload in.
7905*e4b17023SJohn Marino 	 See comments above (for input reloading).  */
7906*e4b17023SJohn Marino       mode = GET_MODE (rl->out);
7907*e4b17023SJohn Marino       if (mode == VOIDmode)
7908*e4b17023SJohn Marino 	{
7909*e4b17023SJohn Marino 	  /* VOIDmode should never happen for an output.  */
7910*e4b17023SJohn Marino 	  if (asm_noperands (PATTERN (insn)) < 0)
7911*e4b17023SJohn Marino 	    /* It's the compiler's fault.  */
7912*e4b17023SJohn Marino 	    fatal_insn ("VOIDmode on an output", insn);
7913*e4b17023SJohn Marino 	  error_for_asm (insn, "output operand is constant in %<asm%>");
7914*e4b17023SJohn Marino 	  /* Prevent crash--use something we know is valid.  */
7915*e4b17023SJohn Marino 	  mode = word_mode;
7916*e4b17023SJohn Marino 	  rl->out = gen_rtx_REG (mode, REGNO (reg_rtx));
7917*e4b17023SJohn Marino 	}
7918*e4b17023SJohn Marino       if (GET_MODE (reg_rtx) != mode)
7919*e4b17023SJohn Marino 	reg_rtx = reload_adjust_reg_for_mode (reg_rtx, mode);
7920*e4b17023SJohn Marino     }
7921*e4b17023SJohn Marino   reload_reg_rtx_for_output[j] = reg_rtx;
7922*e4b17023SJohn Marino 
7923*e4b17023SJohn Marino   if (pseudo
7924*e4b17023SJohn Marino       && optimize
7925*e4b17023SJohn Marino       && REG_P (pseudo)
7926*e4b17023SJohn Marino       && ! rtx_equal_p (rl->in_reg, pseudo)
7927*e4b17023SJohn Marino       && REGNO (pseudo) >= FIRST_PSEUDO_REGISTER
7928*e4b17023SJohn Marino       && reg_last_reload_reg[REGNO (pseudo)])
7929*e4b17023SJohn Marino     {
7930*e4b17023SJohn Marino       int pseudo_no = REGNO (pseudo);
7931*e4b17023SJohn Marino       int last_regno = REGNO (reg_last_reload_reg[pseudo_no]);
7932*e4b17023SJohn Marino 
7933*e4b17023SJohn Marino       /* We don't need to test full validity of last_regno for
7934*e4b17023SJohn Marino 	 inherit here; we only want to know if the store actually
7935*e4b17023SJohn Marino 	 matches the pseudo.  */
7936*e4b17023SJohn Marino       if (TEST_HARD_REG_BIT (reg_reloaded_valid, last_regno)
7937*e4b17023SJohn Marino 	  && reg_reloaded_contents[last_regno] == pseudo_no
7938*e4b17023SJohn Marino 	  && spill_reg_store[last_regno]
7939*e4b17023SJohn Marino 	  && rtx_equal_p (pseudo, spill_reg_stored_to[last_regno]))
7940*e4b17023SJohn Marino 	delete_output_reload (insn, j, last_regno, reg_rtx);
7941*e4b17023SJohn Marino     }
7942*e4b17023SJohn Marino 
7943*e4b17023SJohn Marino   old = rl->out_reg;
7944*e4b17023SJohn Marino   if (old == 0
7945*e4b17023SJohn Marino       || reg_rtx == 0
7946*e4b17023SJohn Marino       || rtx_equal_p (old, reg_rtx))
7947*e4b17023SJohn Marino     return;
7948*e4b17023SJohn Marino 
7949*e4b17023SJohn Marino   /* An output operand that dies right away does need a reload,
7950*e4b17023SJohn Marino      but need not be copied from it.  Show the new location in the
7951*e4b17023SJohn Marino      REG_UNUSED note.  */
7952*e4b17023SJohn Marino   if ((REG_P (old) || GET_CODE (old) == SCRATCH)
7953*e4b17023SJohn Marino       && (note = find_reg_note (insn, REG_UNUSED, old)) != 0)
7954*e4b17023SJohn Marino     {
7955*e4b17023SJohn Marino       XEXP (note, 0) = reg_rtx;
7956*e4b17023SJohn Marino       return;
7957*e4b17023SJohn Marino     }
7958*e4b17023SJohn Marino   /* Likewise for a SUBREG of an operand that dies.  */
7959*e4b17023SJohn Marino   else if (GET_CODE (old) == SUBREG
7960*e4b17023SJohn Marino 	   && REG_P (SUBREG_REG (old))
7961*e4b17023SJohn Marino 	   && 0 != (note = find_reg_note (insn, REG_UNUSED,
7962*e4b17023SJohn Marino 					  SUBREG_REG (old))))
7963*e4b17023SJohn Marino     {
7964*e4b17023SJohn Marino       XEXP (note, 0) = gen_lowpart_common (GET_MODE (old), reg_rtx);
7965*e4b17023SJohn Marino       return;
7966*e4b17023SJohn Marino     }
7967*e4b17023SJohn Marino   else if (GET_CODE (old) == SCRATCH)
7968*e4b17023SJohn Marino     /* If we aren't optimizing, there won't be a REG_UNUSED note,
7969*e4b17023SJohn Marino        but we don't want to make an output reload.  */
7970*e4b17023SJohn Marino     return;
7971*e4b17023SJohn Marino 
7972*e4b17023SJohn Marino   /* If is a JUMP_INSN, we can't support output reloads yet.  */
7973*e4b17023SJohn Marino   gcc_assert (NONJUMP_INSN_P (insn));
7974*e4b17023SJohn Marino 
7975*e4b17023SJohn Marino   emit_output_reload_insns (chain, rld + j, j);
7976*e4b17023SJohn Marino }
7977*e4b17023SJohn Marino 
7978*e4b17023SJohn Marino /* A reload copies values of MODE from register SRC to register DEST.
7979*e4b17023SJohn Marino    Return true if it can be treated for inheritance purposes like a
7980*e4b17023SJohn Marino    group of reloads, each one reloading a single hard register.  The
7981*e4b17023SJohn Marino    caller has already checked that (reg:MODE SRC) and (reg:MODE DEST)
7982*e4b17023SJohn Marino    occupy the same number of hard registers.  */
7983*e4b17023SJohn Marino 
7984*e4b17023SJohn Marino static bool
inherit_piecemeal_p(int dest ATTRIBUTE_UNUSED,int src ATTRIBUTE_UNUSED,enum machine_mode mode ATTRIBUTE_UNUSED)7985*e4b17023SJohn Marino inherit_piecemeal_p (int dest ATTRIBUTE_UNUSED,
7986*e4b17023SJohn Marino 		     int src ATTRIBUTE_UNUSED,
7987*e4b17023SJohn Marino 		     enum machine_mode mode ATTRIBUTE_UNUSED)
7988*e4b17023SJohn Marino {
7989*e4b17023SJohn Marino #ifdef CANNOT_CHANGE_MODE_CLASS
7990*e4b17023SJohn Marino   return (!REG_CANNOT_CHANGE_MODE_P (dest, mode, reg_raw_mode[dest])
7991*e4b17023SJohn Marino 	  && !REG_CANNOT_CHANGE_MODE_P (src, mode, reg_raw_mode[src]));
7992*e4b17023SJohn Marino #else
7993*e4b17023SJohn Marino   return true;
7994*e4b17023SJohn Marino #endif
7995*e4b17023SJohn Marino }
7996*e4b17023SJohn Marino 
7997*e4b17023SJohn Marino /* Output insns to reload values in and out of the chosen reload regs.  */
7998*e4b17023SJohn Marino 
7999*e4b17023SJohn Marino static void
emit_reload_insns(struct insn_chain * chain)8000*e4b17023SJohn Marino emit_reload_insns (struct insn_chain *chain)
8001*e4b17023SJohn Marino {
8002*e4b17023SJohn Marino   rtx insn = chain->insn;
8003*e4b17023SJohn Marino 
8004*e4b17023SJohn Marino   int j;
8005*e4b17023SJohn Marino 
8006*e4b17023SJohn Marino   CLEAR_HARD_REG_SET (reg_reloaded_died);
8007*e4b17023SJohn Marino 
8008*e4b17023SJohn Marino   for (j = 0; j < reload_n_operands; j++)
8009*e4b17023SJohn Marino     input_reload_insns[j] = input_address_reload_insns[j]
8010*e4b17023SJohn Marino       = inpaddr_address_reload_insns[j]
8011*e4b17023SJohn Marino       = output_reload_insns[j] = output_address_reload_insns[j]
8012*e4b17023SJohn Marino       = outaddr_address_reload_insns[j]
8013*e4b17023SJohn Marino       = other_output_reload_insns[j] = 0;
8014*e4b17023SJohn Marino   other_input_address_reload_insns = 0;
8015*e4b17023SJohn Marino   other_input_reload_insns = 0;
8016*e4b17023SJohn Marino   operand_reload_insns = 0;
8017*e4b17023SJohn Marino   other_operand_reload_insns = 0;
8018*e4b17023SJohn Marino 
8019*e4b17023SJohn Marino   /* Dump reloads into the dump file.  */
8020*e4b17023SJohn Marino   if (dump_file)
8021*e4b17023SJohn Marino     {
8022*e4b17023SJohn Marino       fprintf (dump_file, "\nReloads for insn # %d\n", INSN_UID (insn));
8023*e4b17023SJohn Marino       debug_reload_to_stream (dump_file);
8024*e4b17023SJohn Marino     }
8025*e4b17023SJohn Marino 
8026*e4b17023SJohn Marino   for (j = 0; j < n_reloads; j++)
8027*e4b17023SJohn Marino     if (rld[j].reg_rtx && HARD_REGISTER_P (rld[j].reg_rtx))
8028*e4b17023SJohn Marino       {
8029*e4b17023SJohn Marino 	unsigned int i;
8030*e4b17023SJohn Marino 
8031*e4b17023SJohn Marino 	for (i = REGNO (rld[j].reg_rtx); i < END_REGNO (rld[j].reg_rtx); i++)
8032*e4b17023SJohn Marino 	  new_spill_reg_store[i] = 0;
8033*e4b17023SJohn Marino       }
8034*e4b17023SJohn Marino 
8035*e4b17023SJohn Marino   /* Now output the instructions to copy the data into and out of the
8036*e4b17023SJohn Marino      reload registers.  Do these in the order that the reloads were reported,
8037*e4b17023SJohn Marino      since reloads of base and index registers precede reloads of operands
8038*e4b17023SJohn Marino      and the operands may need the base and index registers reloaded.  */
8039*e4b17023SJohn Marino 
8040*e4b17023SJohn Marino   for (j = 0; j < n_reloads; j++)
8041*e4b17023SJohn Marino     {
8042*e4b17023SJohn Marino       do_input_reload (chain, rld + j, j);
8043*e4b17023SJohn Marino       do_output_reload (chain, rld + j, j);
8044*e4b17023SJohn Marino     }
8045*e4b17023SJohn Marino 
8046*e4b17023SJohn Marino   /* Now write all the insns we made for reloads in the order expected by
8047*e4b17023SJohn Marino      the allocation functions.  Prior to the insn being reloaded, we write
8048*e4b17023SJohn Marino      the following reloads:
8049*e4b17023SJohn Marino 
8050*e4b17023SJohn Marino      RELOAD_FOR_OTHER_ADDRESS reloads for input addresses.
8051*e4b17023SJohn Marino 
8052*e4b17023SJohn Marino      RELOAD_OTHER reloads.
8053*e4b17023SJohn Marino 
8054*e4b17023SJohn Marino      For each operand, any RELOAD_FOR_INPADDR_ADDRESS reloads followed
8055*e4b17023SJohn Marino      by any RELOAD_FOR_INPUT_ADDRESS reloads followed by the
8056*e4b17023SJohn Marino      RELOAD_FOR_INPUT reload for the operand.
8057*e4b17023SJohn Marino 
8058*e4b17023SJohn Marino      RELOAD_FOR_OPADDR_ADDRS reloads.
8059*e4b17023SJohn Marino 
8060*e4b17023SJohn Marino      RELOAD_FOR_OPERAND_ADDRESS reloads.
8061*e4b17023SJohn Marino 
8062*e4b17023SJohn Marino      After the insn being reloaded, we write the following:
8063*e4b17023SJohn Marino 
8064*e4b17023SJohn Marino      For each operand, any RELOAD_FOR_OUTADDR_ADDRESS reloads followed
8065*e4b17023SJohn Marino      by any RELOAD_FOR_OUTPUT_ADDRESS reload followed by the
8066*e4b17023SJohn Marino      RELOAD_FOR_OUTPUT reload, followed by any RELOAD_OTHER output
8067*e4b17023SJohn Marino      reloads for the operand.  The RELOAD_OTHER output reloads are
8068*e4b17023SJohn Marino      output in descending order by reload number.  */
8069*e4b17023SJohn Marino 
8070*e4b17023SJohn Marino   emit_insn_before (other_input_address_reload_insns, insn);
8071*e4b17023SJohn Marino   emit_insn_before (other_input_reload_insns, insn);
8072*e4b17023SJohn Marino 
8073*e4b17023SJohn Marino   for (j = 0; j < reload_n_operands; j++)
8074*e4b17023SJohn Marino     {
8075*e4b17023SJohn Marino       emit_insn_before (inpaddr_address_reload_insns[j], insn);
8076*e4b17023SJohn Marino       emit_insn_before (input_address_reload_insns[j], insn);
8077*e4b17023SJohn Marino       emit_insn_before (input_reload_insns[j], insn);
8078*e4b17023SJohn Marino     }
8079*e4b17023SJohn Marino 
8080*e4b17023SJohn Marino   emit_insn_before (other_operand_reload_insns, insn);
8081*e4b17023SJohn Marino   emit_insn_before (operand_reload_insns, insn);
8082*e4b17023SJohn Marino 
8083*e4b17023SJohn Marino   for (j = 0; j < reload_n_operands; j++)
8084*e4b17023SJohn Marino     {
8085*e4b17023SJohn Marino       rtx x = emit_insn_after (outaddr_address_reload_insns[j], insn);
8086*e4b17023SJohn Marino       x = emit_insn_after (output_address_reload_insns[j], x);
8087*e4b17023SJohn Marino       x = emit_insn_after (output_reload_insns[j], x);
8088*e4b17023SJohn Marino       emit_insn_after (other_output_reload_insns[j], x);
8089*e4b17023SJohn Marino     }
8090*e4b17023SJohn Marino 
8091*e4b17023SJohn Marino   /* For all the spill regs newly reloaded in this instruction,
8092*e4b17023SJohn Marino      record what they were reloaded from, so subsequent instructions
8093*e4b17023SJohn Marino      can inherit the reloads.
8094*e4b17023SJohn Marino 
8095*e4b17023SJohn Marino      Update spill_reg_store for the reloads of this insn.
8096*e4b17023SJohn Marino      Copy the elements that were updated in the loop above.  */
8097*e4b17023SJohn Marino 
8098*e4b17023SJohn Marino   for (j = 0; j < n_reloads; j++)
8099*e4b17023SJohn Marino     {
8100*e4b17023SJohn Marino       int r = reload_order[j];
8101*e4b17023SJohn Marino       int i = reload_spill_index[r];
8102*e4b17023SJohn Marino 
8103*e4b17023SJohn Marino       /* If this is a non-inherited input reload from a pseudo, we must
8104*e4b17023SJohn Marino 	 clear any memory of a previous store to the same pseudo.  Only do
8105*e4b17023SJohn Marino 	 something if there will not be an output reload for the pseudo
8106*e4b17023SJohn Marino 	 being reloaded.  */
8107*e4b17023SJohn Marino       if (rld[r].in_reg != 0
8108*e4b17023SJohn Marino 	  && ! (reload_inherited[r] || reload_override_in[r]))
8109*e4b17023SJohn Marino 	{
8110*e4b17023SJohn Marino 	  rtx reg = rld[r].in_reg;
8111*e4b17023SJohn Marino 
8112*e4b17023SJohn Marino 	  if (GET_CODE (reg) == SUBREG)
8113*e4b17023SJohn Marino 	    reg = SUBREG_REG (reg);
8114*e4b17023SJohn Marino 
8115*e4b17023SJohn Marino 	  if (REG_P (reg)
8116*e4b17023SJohn Marino 	      && REGNO (reg) >= FIRST_PSEUDO_REGISTER
8117*e4b17023SJohn Marino 	      && !REGNO_REG_SET_P (&reg_has_output_reload, REGNO (reg)))
8118*e4b17023SJohn Marino 	    {
8119*e4b17023SJohn Marino 	      int nregno = REGNO (reg);
8120*e4b17023SJohn Marino 
8121*e4b17023SJohn Marino 	      if (reg_last_reload_reg[nregno])
8122*e4b17023SJohn Marino 		{
8123*e4b17023SJohn Marino 		  int last_regno = REGNO (reg_last_reload_reg[nregno]);
8124*e4b17023SJohn Marino 
8125*e4b17023SJohn Marino 		  if (reg_reloaded_contents[last_regno] == nregno)
8126*e4b17023SJohn Marino 		    spill_reg_store[last_regno] = 0;
8127*e4b17023SJohn Marino 		}
8128*e4b17023SJohn Marino 	    }
8129*e4b17023SJohn Marino 	}
8130*e4b17023SJohn Marino 
8131*e4b17023SJohn Marino       /* I is nonneg if this reload used a register.
8132*e4b17023SJohn Marino 	 If rld[r].reg_rtx is 0, this is an optional reload
8133*e4b17023SJohn Marino 	 that we opted to ignore.  */
8134*e4b17023SJohn Marino 
8135*e4b17023SJohn Marino       if (i >= 0 && rld[r].reg_rtx != 0)
8136*e4b17023SJohn Marino 	{
8137*e4b17023SJohn Marino 	  int nr = hard_regno_nregs[i][GET_MODE (rld[r].reg_rtx)];
8138*e4b17023SJohn Marino 	  int k;
8139*e4b17023SJohn Marino 
8140*e4b17023SJohn Marino 	  /* For a multi register reload, we need to check if all or part
8141*e4b17023SJohn Marino 	     of the value lives to the end.  */
8142*e4b17023SJohn Marino 	  for (k = 0; k < nr; k++)
8143*e4b17023SJohn Marino 	    if (reload_reg_reaches_end_p (i + k, r))
8144*e4b17023SJohn Marino 	      CLEAR_HARD_REG_BIT (reg_reloaded_valid, i + k);
8145*e4b17023SJohn Marino 
8146*e4b17023SJohn Marino 	  /* Maybe the spill reg contains a copy of reload_out.  */
8147*e4b17023SJohn Marino 	  if (rld[r].out != 0
8148*e4b17023SJohn Marino 	      && (REG_P (rld[r].out)
8149*e4b17023SJohn Marino 		  || (rld[r].out_reg
8150*e4b17023SJohn Marino 		      ? REG_P (rld[r].out_reg)
8151*e4b17023SJohn Marino 		      /* The reload value is an auto-modification of
8152*e4b17023SJohn Marino 			 some kind.  For PRE_INC, POST_INC, PRE_DEC
8153*e4b17023SJohn Marino 			 and POST_DEC, we record an equivalence
8154*e4b17023SJohn Marino 			 between the reload register and the operand
8155*e4b17023SJohn Marino 			 on the optimistic assumption that we can make
8156*e4b17023SJohn Marino 			 the equivalence hold.  reload_as_needed must
8157*e4b17023SJohn Marino 			 then either make it hold or invalidate the
8158*e4b17023SJohn Marino 			 equivalence.
8159*e4b17023SJohn Marino 
8160*e4b17023SJohn Marino 			 PRE_MODIFY and POST_MODIFY addresses are reloaded
8161*e4b17023SJohn Marino 			 somewhat differently, and allowing them here leads
8162*e4b17023SJohn Marino 			 to problems.  */
8163*e4b17023SJohn Marino 		      : (GET_CODE (rld[r].out) != POST_MODIFY
8164*e4b17023SJohn Marino 			 && GET_CODE (rld[r].out) != PRE_MODIFY))))
8165*e4b17023SJohn Marino 	    {
8166*e4b17023SJohn Marino 	      rtx reg;
8167*e4b17023SJohn Marino 
8168*e4b17023SJohn Marino 	      reg = reload_reg_rtx_for_output[r];
8169*e4b17023SJohn Marino 	      if (reload_reg_rtx_reaches_end_p (reg, r))
8170*e4b17023SJohn Marino 		{
8171*e4b17023SJohn Marino 		  enum machine_mode mode = GET_MODE (reg);
8172*e4b17023SJohn Marino 		  int regno = REGNO (reg);
8173*e4b17023SJohn Marino 		  int nregs = hard_regno_nregs[regno][mode];
8174*e4b17023SJohn Marino 		  rtx out = (REG_P (rld[r].out)
8175*e4b17023SJohn Marino 			     ? rld[r].out
8176*e4b17023SJohn Marino 			     : rld[r].out_reg
8177*e4b17023SJohn Marino 			     ? rld[r].out_reg
8178*e4b17023SJohn Marino /* AUTO_INC */		     : XEXP (rld[r].in_reg, 0));
8179*e4b17023SJohn Marino 		  int out_regno = REGNO (out);
8180*e4b17023SJohn Marino 		  int out_nregs = (!HARD_REGISTER_NUM_P (out_regno) ? 1
8181*e4b17023SJohn Marino 				   : hard_regno_nregs[out_regno][mode]);
8182*e4b17023SJohn Marino 		  bool piecemeal;
8183*e4b17023SJohn Marino 
8184*e4b17023SJohn Marino 		  spill_reg_store[regno] = new_spill_reg_store[regno];
8185*e4b17023SJohn Marino 		  spill_reg_stored_to[regno] = out;
8186*e4b17023SJohn Marino 		  reg_last_reload_reg[out_regno] = reg;
8187*e4b17023SJohn Marino 
8188*e4b17023SJohn Marino 		  piecemeal = (HARD_REGISTER_NUM_P (out_regno)
8189*e4b17023SJohn Marino 			       && nregs == out_nregs
8190*e4b17023SJohn Marino 			       && inherit_piecemeal_p (out_regno, regno, mode));
8191*e4b17023SJohn Marino 
8192*e4b17023SJohn Marino 		  /* If OUT_REGNO is a hard register, it may occupy more than
8193*e4b17023SJohn Marino 		     one register.  If it does, say what is in the
8194*e4b17023SJohn Marino 		     rest of the registers assuming that both registers
8195*e4b17023SJohn Marino 		     agree on how many words the object takes.  If not,
8196*e4b17023SJohn Marino 		     invalidate the subsequent registers.  */
8197*e4b17023SJohn Marino 
8198*e4b17023SJohn Marino 		  if (HARD_REGISTER_NUM_P (out_regno))
8199*e4b17023SJohn Marino 		    for (k = 1; k < out_nregs; k++)
8200*e4b17023SJohn Marino 		      reg_last_reload_reg[out_regno + k]
8201*e4b17023SJohn Marino 			= (piecemeal ? regno_reg_rtx[regno + k] : 0);
8202*e4b17023SJohn Marino 
8203*e4b17023SJohn Marino 		  /* Now do the inverse operation.  */
8204*e4b17023SJohn Marino 		  for (k = 0; k < nregs; k++)
8205*e4b17023SJohn Marino 		    {
8206*e4b17023SJohn Marino 		      CLEAR_HARD_REG_BIT (reg_reloaded_dead, regno + k);
8207*e4b17023SJohn Marino 		      reg_reloaded_contents[regno + k]
8208*e4b17023SJohn Marino 			= (!HARD_REGISTER_NUM_P (out_regno) || !piecemeal
8209*e4b17023SJohn Marino 			   ? out_regno
8210*e4b17023SJohn Marino 			   : out_regno + k);
8211*e4b17023SJohn Marino 		      reg_reloaded_insn[regno + k] = insn;
8212*e4b17023SJohn Marino 		      SET_HARD_REG_BIT (reg_reloaded_valid, regno + k);
8213*e4b17023SJohn Marino 		      if (HARD_REGNO_CALL_PART_CLOBBERED (regno + k, mode))
8214*e4b17023SJohn Marino 			SET_HARD_REG_BIT (reg_reloaded_call_part_clobbered,
8215*e4b17023SJohn Marino 					  regno + k);
8216*e4b17023SJohn Marino 		      else
8217*e4b17023SJohn Marino 			CLEAR_HARD_REG_BIT (reg_reloaded_call_part_clobbered,
8218*e4b17023SJohn Marino 					    regno + k);
8219*e4b17023SJohn Marino 		    }
8220*e4b17023SJohn Marino 		}
8221*e4b17023SJohn Marino 	    }
8222*e4b17023SJohn Marino 	  /* Maybe the spill reg contains a copy of reload_in.  Only do
8223*e4b17023SJohn Marino 	     something if there will not be an output reload for
8224*e4b17023SJohn Marino 	     the register being reloaded.  */
8225*e4b17023SJohn Marino 	  else if (rld[r].out_reg == 0
8226*e4b17023SJohn Marino 		   && rld[r].in != 0
8227*e4b17023SJohn Marino 		   && ((REG_P (rld[r].in)
8228*e4b17023SJohn Marino 			&& !HARD_REGISTER_P (rld[r].in)
8229*e4b17023SJohn Marino 			&& !REGNO_REG_SET_P (&reg_has_output_reload,
8230*e4b17023SJohn Marino 					     REGNO (rld[r].in)))
8231*e4b17023SJohn Marino 		       || (REG_P (rld[r].in_reg)
8232*e4b17023SJohn Marino 			   && !REGNO_REG_SET_P (&reg_has_output_reload,
8233*e4b17023SJohn Marino 						REGNO (rld[r].in_reg))))
8234*e4b17023SJohn Marino 		   && !reg_set_p (reload_reg_rtx_for_input[r], PATTERN (insn)))
8235*e4b17023SJohn Marino 	    {
8236*e4b17023SJohn Marino 	      rtx reg;
8237*e4b17023SJohn Marino 
8238*e4b17023SJohn Marino 	      reg = reload_reg_rtx_for_input[r];
8239*e4b17023SJohn Marino 	      if (reload_reg_rtx_reaches_end_p (reg, r))
8240*e4b17023SJohn Marino 		{
8241*e4b17023SJohn Marino 		  enum machine_mode mode;
8242*e4b17023SJohn Marino 		  int regno;
8243*e4b17023SJohn Marino 		  int nregs;
8244*e4b17023SJohn Marino 		  int in_regno;
8245*e4b17023SJohn Marino 		  int in_nregs;
8246*e4b17023SJohn Marino 		  rtx in;
8247*e4b17023SJohn Marino 		  bool piecemeal;
8248*e4b17023SJohn Marino 
8249*e4b17023SJohn Marino 		  mode = GET_MODE (reg);
8250*e4b17023SJohn Marino 		  regno = REGNO (reg);
8251*e4b17023SJohn Marino 		  nregs = hard_regno_nregs[regno][mode];
8252*e4b17023SJohn Marino 		  if (REG_P (rld[r].in)
8253*e4b17023SJohn Marino 		      && REGNO (rld[r].in) >= FIRST_PSEUDO_REGISTER)
8254*e4b17023SJohn Marino 		    in = rld[r].in;
8255*e4b17023SJohn Marino 		  else if (REG_P (rld[r].in_reg))
8256*e4b17023SJohn Marino 		    in = rld[r].in_reg;
8257*e4b17023SJohn Marino 		  else
8258*e4b17023SJohn Marino 		    in = XEXP (rld[r].in_reg, 0);
8259*e4b17023SJohn Marino 		  in_regno = REGNO (in);
8260*e4b17023SJohn Marino 
8261*e4b17023SJohn Marino 		  in_nregs = (!HARD_REGISTER_NUM_P (in_regno) ? 1
8262*e4b17023SJohn Marino 			      : hard_regno_nregs[in_regno][mode]);
8263*e4b17023SJohn Marino 
8264*e4b17023SJohn Marino 		  reg_last_reload_reg[in_regno] = reg;
8265*e4b17023SJohn Marino 
8266*e4b17023SJohn Marino 		  piecemeal = (HARD_REGISTER_NUM_P (in_regno)
8267*e4b17023SJohn Marino 			       && nregs == in_nregs
8268*e4b17023SJohn Marino 			       && inherit_piecemeal_p (regno, in_regno, mode));
8269*e4b17023SJohn Marino 
8270*e4b17023SJohn Marino 		  if (HARD_REGISTER_NUM_P (in_regno))
8271*e4b17023SJohn Marino 		    for (k = 1; k < in_nregs; k++)
8272*e4b17023SJohn Marino 		      reg_last_reload_reg[in_regno + k]
8273*e4b17023SJohn Marino 			= (piecemeal ? regno_reg_rtx[regno + k] : 0);
8274*e4b17023SJohn Marino 
8275*e4b17023SJohn Marino 		  /* Unless we inherited this reload, show we haven't
8276*e4b17023SJohn Marino 		     recently done a store.
8277*e4b17023SJohn Marino 		     Previous stores of inherited auto_inc expressions
8278*e4b17023SJohn Marino 		     also have to be discarded.  */
8279*e4b17023SJohn Marino 		  if (! reload_inherited[r]
8280*e4b17023SJohn Marino 		      || (rld[r].out && ! rld[r].out_reg))
8281*e4b17023SJohn Marino 		    spill_reg_store[regno] = 0;
8282*e4b17023SJohn Marino 
8283*e4b17023SJohn Marino 		  for (k = 0; k < nregs; k++)
8284*e4b17023SJohn Marino 		    {
8285*e4b17023SJohn Marino 		      CLEAR_HARD_REG_BIT (reg_reloaded_dead, regno + k);
8286*e4b17023SJohn Marino 		      reg_reloaded_contents[regno + k]
8287*e4b17023SJohn Marino 			= (!HARD_REGISTER_NUM_P (in_regno) || !piecemeal
8288*e4b17023SJohn Marino 			   ? in_regno
8289*e4b17023SJohn Marino 			   : in_regno + k);
8290*e4b17023SJohn Marino 		      reg_reloaded_insn[regno + k] = insn;
8291*e4b17023SJohn Marino 		      SET_HARD_REG_BIT (reg_reloaded_valid, regno + k);
8292*e4b17023SJohn Marino 		      if (HARD_REGNO_CALL_PART_CLOBBERED (regno + k, mode))
8293*e4b17023SJohn Marino 			SET_HARD_REG_BIT (reg_reloaded_call_part_clobbered,
8294*e4b17023SJohn Marino 					  regno + k);
8295*e4b17023SJohn Marino 		      else
8296*e4b17023SJohn Marino 			CLEAR_HARD_REG_BIT (reg_reloaded_call_part_clobbered,
8297*e4b17023SJohn Marino 					    regno + k);
8298*e4b17023SJohn Marino 		    }
8299*e4b17023SJohn Marino 		}
8300*e4b17023SJohn Marino 	    }
8301*e4b17023SJohn Marino 	}
8302*e4b17023SJohn Marino 
8303*e4b17023SJohn Marino       /* The following if-statement was #if 0'd in 1.34 (or before...).
8304*e4b17023SJohn Marino 	 It's reenabled in 1.35 because supposedly nothing else
8305*e4b17023SJohn Marino 	 deals with this problem.  */
8306*e4b17023SJohn Marino 
8307*e4b17023SJohn Marino       /* If a register gets output-reloaded from a non-spill register,
8308*e4b17023SJohn Marino 	 that invalidates any previous reloaded copy of it.
8309*e4b17023SJohn Marino 	 But forget_old_reloads_1 won't get to see it, because
8310*e4b17023SJohn Marino 	 it thinks only about the original insn.  So invalidate it here.
8311*e4b17023SJohn Marino 	 Also do the same thing for RELOAD_OTHER constraints where the
8312*e4b17023SJohn Marino 	 output is discarded.  */
8313*e4b17023SJohn Marino       if (i < 0
8314*e4b17023SJohn Marino 	  && ((rld[r].out != 0
8315*e4b17023SJohn Marino 	       && (REG_P (rld[r].out)
8316*e4b17023SJohn Marino 		   || (MEM_P (rld[r].out)
8317*e4b17023SJohn Marino 		       && REG_P (rld[r].out_reg))))
8318*e4b17023SJohn Marino 	      || (rld[r].out == 0 && rld[r].out_reg
8319*e4b17023SJohn Marino 		  && REG_P (rld[r].out_reg))))
8320*e4b17023SJohn Marino 	{
8321*e4b17023SJohn Marino 	  rtx out = ((rld[r].out && REG_P (rld[r].out))
8322*e4b17023SJohn Marino 		     ? rld[r].out : rld[r].out_reg);
8323*e4b17023SJohn Marino 	  int out_regno = REGNO (out);
8324*e4b17023SJohn Marino 	  enum machine_mode mode = GET_MODE (out);
8325*e4b17023SJohn Marino 
8326*e4b17023SJohn Marino 	  /* REG_RTX is now set or clobbered by the main instruction.
8327*e4b17023SJohn Marino 	     As the comment above explains, forget_old_reloads_1 only
8328*e4b17023SJohn Marino 	     sees the original instruction, and there is no guarantee
8329*e4b17023SJohn Marino 	     that the original instruction also clobbered REG_RTX.
8330*e4b17023SJohn Marino 	     For example, if find_reloads sees that the input side of
8331*e4b17023SJohn Marino 	     a matched operand pair dies in this instruction, it may
8332*e4b17023SJohn Marino 	     use the input register as the reload register.
8333*e4b17023SJohn Marino 
8334*e4b17023SJohn Marino 	     Calling forget_old_reloads_1 is a waste of effort if
8335*e4b17023SJohn Marino 	     REG_RTX is also the output register.
8336*e4b17023SJohn Marino 
8337*e4b17023SJohn Marino 	     If we know that REG_RTX holds the value of a pseudo
8338*e4b17023SJohn Marino 	     register, the code after the call will record that fact.  */
8339*e4b17023SJohn Marino 	  if (rld[r].reg_rtx && rld[r].reg_rtx != out)
8340*e4b17023SJohn Marino 	    forget_old_reloads_1 (rld[r].reg_rtx, NULL_RTX, NULL);
8341*e4b17023SJohn Marino 
8342*e4b17023SJohn Marino 	  if (!HARD_REGISTER_NUM_P (out_regno))
8343*e4b17023SJohn Marino 	    {
8344*e4b17023SJohn Marino 	      rtx src_reg, store_insn = NULL_RTX;
8345*e4b17023SJohn Marino 
8346*e4b17023SJohn Marino 	      reg_last_reload_reg[out_regno] = 0;
8347*e4b17023SJohn Marino 
8348*e4b17023SJohn Marino 	      /* If we can find a hard register that is stored, record
8349*e4b17023SJohn Marino 		 the storing insn so that we may delete this insn with
8350*e4b17023SJohn Marino 		 delete_output_reload.  */
8351*e4b17023SJohn Marino 	      src_reg = reload_reg_rtx_for_output[r];
8352*e4b17023SJohn Marino 
8353*e4b17023SJohn Marino 	      if (src_reg)
8354*e4b17023SJohn Marino 		{
8355*e4b17023SJohn Marino 		  if (reload_reg_rtx_reaches_end_p (src_reg, r))
8356*e4b17023SJohn Marino 		    store_insn = new_spill_reg_store[REGNO (src_reg)];
8357*e4b17023SJohn Marino 		  else
8358*e4b17023SJohn Marino 		    src_reg = NULL_RTX;
8359*e4b17023SJohn Marino 		}
8360*e4b17023SJohn Marino 	      else
8361*e4b17023SJohn Marino 		{
8362*e4b17023SJohn Marino 		  /* If this is an optional reload, try to find the
8363*e4b17023SJohn Marino 		     source reg from an input reload.  */
8364*e4b17023SJohn Marino 		  rtx set = single_set (insn);
8365*e4b17023SJohn Marino 		  if (set && SET_DEST (set) == rld[r].out)
8366*e4b17023SJohn Marino 		    {
8367*e4b17023SJohn Marino 		      int k;
8368*e4b17023SJohn Marino 
8369*e4b17023SJohn Marino 		      src_reg = SET_SRC (set);
8370*e4b17023SJohn Marino 		      store_insn = insn;
8371*e4b17023SJohn Marino 		      for (k = 0; k < n_reloads; k++)
8372*e4b17023SJohn Marino 			{
8373*e4b17023SJohn Marino 			  if (rld[k].in == src_reg)
8374*e4b17023SJohn Marino 			    {
8375*e4b17023SJohn Marino 			      src_reg = reload_reg_rtx_for_input[k];
8376*e4b17023SJohn Marino 			      break;
8377*e4b17023SJohn Marino 			    }
8378*e4b17023SJohn Marino 			}
8379*e4b17023SJohn Marino 		    }
8380*e4b17023SJohn Marino 		}
8381*e4b17023SJohn Marino 	      if (src_reg && REG_P (src_reg)
8382*e4b17023SJohn Marino 		  && REGNO (src_reg) < FIRST_PSEUDO_REGISTER)
8383*e4b17023SJohn Marino 		{
8384*e4b17023SJohn Marino 		  int src_regno, src_nregs, k;
8385*e4b17023SJohn Marino 		  rtx note;
8386*e4b17023SJohn Marino 
8387*e4b17023SJohn Marino 		  gcc_assert (GET_MODE (src_reg) == mode);
8388*e4b17023SJohn Marino 		  src_regno = REGNO (src_reg);
8389*e4b17023SJohn Marino 		  src_nregs = hard_regno_nregs[src_regno][mode];
8390*e4b17023SJohn Marino 		  /* The place where to find a death note varies with
8391*e4b17023SJohn Marino 		     PRESERVE_DEATH_INFO_REGNO_P .  The condition is not
8392*e4b17023SJohn Marino 		     necessarily checked exactly in the code that moves
8393*e4b17023SJohn Marino 		     notes, so just check both locations.  */
8394*e4b17023SJohn Marino 		  note = find_regno_note (insn, REG_DEAD, src_regno);
8395*e4b17023SJohn Marino 		  if (! note && store_insn)
8396*e4b17023SJohn Marino 		    note = find_regno_note (store_insn, REG_DEAD, src_regno);
8397*e4b17023SJohn Marino 		  for (k = 0; k < src_nregs; k++)
8398*e4b17023SJohn Marino 		    {
8399*e4b17023SJohn Marino 		      spill_reg_store[src_regno + k] = store_insn;
8400*e4b17023SJohn Marino 		      spill_reg_stored_to[src_regno + k] = out;
8401*e4b17023SJohn Marino 		      reg_reloaded_contents[src_regno + k] = out_regno;
8402*e4b17023SJohn Marino 		      reg_reloaded_insn[src_regno + k] = store_insn;
8403*e4b17023SJohn Marino 		      CLEAR_HARD_REG_BIT (reg_reloaded_dead, src_regno + k);
8404*e4b17023SJohn Marino 		      SET_HARD_REG_BIT (reg_reloaded_valid, src_regno + k);
8405*e4b17023SJohn Marino 		      if (HARD_REGNO_CALL_PART_CLOBBERED (src_regno + k,
8406*e4b17023SJohn Marino 							  mode))
8407*e4b17023SJohn Marino 			SET_HARD_REG_BIT (reg_reloaded_call_part_clobbered,
8408*e4b17023SJohn Marino 					  src_regno + k);
8409*e4b17023SJohn Marino 		      else
8410*e4b17023SJohn Marino 			CLEAR_HARD_REG_BIT (reg_reloaded_call_part_clobbered,
8411*e4b17023SJohn Marino 					    src_regno + k);
8412*e4b17023SJohn Marino 		      SET_HARD_REG_BIT (reg_is_output_reload, src_regno + k);
8413*e4b17023SJohn Marino 		      if (note)
8414*e4b17023SJohn Marino 			SET_HARD_REG_BIT (reg_reloaded_died, src_regno);
8415*e4b17023SJohn Marino 		      else
8416*e4b17023SJohn Marino 			CLEAR_HARD_REG_BIT (reg_reloaded_died, src_regno);
8417*e4b17023SJohn Marino 		    }
8418*e4b17023SJohn Marino 		  reg_last_reload_reg[out_regno] = src_reg;
8419*e4b17023SJohn Marino 		  /* We have to set reg_has_output_reload here, or else
8420*e4b17023SJohn Marino 		     forget_old_reloads_1 will clear reg_last_reload_reg
8421*e4b17023SJohn Marino 		     right away.  */
8422*e4b17023SJohn Marino 		  SET_REGNO_REG_SET (&reg_has_output_reload,
8423*e4b17023SJohn Marino 				     out_regno);
8424*e4b17023SJohn Marino 		}
8425*e4b17023SJohn Marino 	    }
8426*e4b17023SJohn Marino 	  else
8427*e4b17023SJohn Marino 	    {
8428*e4b17023SJohn Marino 	      int k, out_nregs = hard_regno_nregs[out_regno][mode];
8429*e4b17023SJohn Marino 
8430*e4b17023SJohn Marino 	      for (k = 0; k < out_nregs; k++)
8431*e4b17023SJohn Marino 		reg_last_reload_reg[out_regno + k] = 0;
8432*e4b17023SJohn Marino 	    }
8433*e4b17023SJohn Marino 	}
8434*e4b17023SJohn Marino     }
8435*e4b17023SJohn Marino   IOR_HARD_REG_SET (reg_reloaded_dead, reg_reloaded_died);
8436*e4b17023SJohn Marino }
8437*e4b17023SJohn Marino 
8438*e4b17023SJohn Marino /* Go through the motions to emit INSN and test if it is strictly valid.
8439*e4b17023SJohn Marino    Return the emitted insn if valid, else return NULL.  */
8440*e4b17023SJohn Marino 
8441*e4b17023SJohn Marino static rtx
emit_insn_if_valid_for_reload(rtx insn)8442*e4b17023SJohn Marino emit_insn_if_valid_for_reload (rtx insn)
8443*e4b17023SJohn Marino {
8444*e4b17023SJohn Marino   rtx last = get_last_insn ();
8445*e4b17023SJohn Marino   int code;
8446*e4b17023SJohn Marino 
8447*e4b17023SJohn Marino   insn = emit_insn (insn);
8448*e4b17023SJohn Marino   code = recog_memoized (insn);
8449*e4b17023SJohn Marino 
8450*e4b17023SJohn Marino   if (code >= 0)
8451*e4b17023SJohn Marino     {
8452*e4b17023SJohn Marino       extract_insn (insn);
8453*e4b17023SJohn Marino       /* We want constrain operands to treat this insn strictly in its
8454*e4b17023SJohn Marino 	 validity determination, i.e., the way it would after reload has
8455*e4b17023SJohn Marino 	 completed.  */
8456*e4b17023SJohn Marino       if (constrain_operands (1))
8457*e4b17023SJohn Marino 	return insn;
8458*e4b17023SJohn Marino     }
8459*e4b17023SJohn Marino 
8460*e4b17023SJohn Marino   delete_insns_since (last);
8461*e4b17023SJohn Marino   return NULL;
8462*e4b17023SJohn Marino }
8463*e4b17023SJohn Marino 
8464*e4b17023SJohn Marino /* Emit code to perform a reload from IN (which may be a reload register) to
8465*e4b17023SJohn Marino    OUT (which may also be a reload register).  IN or OUT is from operand
8466*e4b17023SJohn Marino    OPNUM with reload type TYPE.
8467*e4b17023SJohn Marino 
8468*e4b17023SJohn Marino    Returns first insn emitted.  */
8469*e4b17023SJohn Marino 
8470*e4b17023SJohn Marino static rtx
gen_reload(rtx out,rtx in,int opnum,enum reload_type type)8471*e4b17023SJohn Marino gen_reload (rtx out, rtx in, int opnum, enum reload_type type)
8472*e4b17023SJohn Marino {
8473*e4b17023SJohn Marino   rtx last = get_last_insn ();
8474*e4b17023SJohn Marino   rtx tem;
8475*e4b17023SJohn Marino 
8476*e4b17023SJohn Marino   /* If IN is a paradoxical SUBREG, remove it and try to put the
8477*e4b17023SJohn Marino      opposite SUBREG on OUT.  Likewise for a paradoxical SUBREG on OUT.  */
8478*e4b17023SJohn Marino   if (!strip_paradoxical_subreg (&in, &out))
8479*e4b17023SJohn Marino     strip_paradoxical_subreg (&out, &in);
8480*e4b17023SJohn Marino 
8481*e4b17023SJohn Marino   /* How to do this reload can get quite tricky.  Normally, we are being
8482*e4b17023SJohn Marino      asked to reload a simple operand, such as a MEM, a constant, or a pseudo
8483*e4b17023SJohn Marino      register that didn't get a hard register.  In that case we can just
8484*e4b17023SJohn Marino      call emit_move_insn.
8485*e4b17023SJohn Marino 
8486*e4b17023SJohn Marino      We can also be asked to reload a PLUS that adds a register or a MEM to
8487*e4b17023SJohn Marino      another register, constant or MEM.  This can occur during frame pointer
8488*e4b17023SJohn Marino      elimination and while reloading addresses.  This case is handled by
8489*e4b17023SJohn Marino      trying to emit a single insn to perform the add.  If it is not valid,
8490*e4b17023SJohn Marino      we use a two insn sequence.
8491*e4b17023SJohn Marino 
8492*e4b17023SJohn Marino      Or we can be asked to reload an unary operand that was a fragment of
8493*e4b17023SJohn Marino      an addressing mode, into a register.  If it isn't recognized as-is,
8494*e4b17023SJohn Marino      we try making the unop operand and the reload-register the same:
8495*e4b17023SJohn Marino      (set reg:X (unop:X expr:Y))
8496*e4b17023SJohn Marino      -> (set reg:Y expr:Y) (set reg:X (unop:X reg:Y)).
8497*e4b17023SJohn Marino 
8498*e4b17023SJohn Marino      Finally, we could be called to handle an 'o' constraint by putting
8499*e4b17023SJohn Marino      an address into a register.  In that case, we first try to do this
8500*e4b17023SJohn Marino      with a named pattern of "reload_load_address".  If no such pattern
8501*e4b17023SJohn Marino      exists, we just emit a SET insn and hope for the best (it will normally
8502*e4b17023SJohn Marino      be valid on machines that use 'o').
8503*e4b17023SJohn Marino 
8504*e4b17023SJohn Marino      This entire process is made complex because reload will never
8505*e4b17023SJohn Marino      process the insns we generate here and so we must ensure that
8506*e4b17023SJohn Marino      they will fit their constraints and also by the fact that parts of
8507*e4b17023SJohn Marino      IN might be being reloaded separately and replaced with spill registers.
8508*e4b17023SJohn Marino      Because of this, we are, in some sense, just guessing the right approach
8509*e4b17023SJohn Marino      here.  The one listed above seems to work.
8510*e4b17023SJohn Marino 
8511*e4b17023SJohn Marino      ??? At some point, this whole thing needs to be rethought.  */
8512*e4b17023SJohn Marino 
8513*e4b17023SJohn Marino   if (GET_CODE (in) == PLUS
8514*e4b17023SJohn Marino       && (REG_P (XEXP (in, 0))
8515*e4b17023SJohn Marino 	  || GET_CODE (XEXP (in, 0)) == SUBREG
8516*e4b17023SJohn Marino 	  || MEM_P (XEXP (in, 0)))
8517*e4b17023SJohn Marino       && (REG_P (XEXP (in, 1))
8518*e4b17023SJohn Marino 	  || GET_CODE (XEXP (in, 1)) == SUBREG
8519*e4b17023SJohn Marino 	  || CONSTANT_P (XEXP (in, 1))
8520*e4b17023SJohn Marino 	  || MEM_P (XEXP (in, 1))))
8521*e4b17023SJohn Marino     {
8522*e4b17023SJohn Marino       /* We need to compute the sum of a register or a MEM and another
8523*e4b17023SJohn Marino 	 register, constant, or MEM, and put it into the reload
8524*e4b17023SJohn Marino 	 register.  The best possible way of doing this is if the machine
8525*e4b17023SJohn Marino 	 has a three-operand ADD insn that accepts the required operands.
8526*e4b17023SJohn Marino 
8527*e4b17023SJohn Marino 	 The simplest approach is to try to generate such an insn and see if it
8528*e4b17023SJohn Marino 	 is recognized and matches its constraints.  If so, it can be used.
8529*e4b17023SJohn Marino 
8530*e4b17023SJohn Marino 	 It might be better not to actually emit the insn unless it is valid,
8531*e4b17023SJohn Marino 	 but we need to pass the insn as an operand to `recog' and
8532*e4b17023SJohn Marino 	 `extract_insn' and it is simpler to emit and then delete the insn if
8533*e4b17023SJohn Marino 	 not valid than to dummy things up.  */
8534*e4b17023SJohn Marino 
8535*e4b17023SJohn Marino       rtx op0, op1, tem, insn;
8536*e4b17023SJohn Marino       enum insn_code code;
8537*e4b17023SJohn Marino 
8538*e4b17023SJohn Marino       op0 = find_replacement (&XEXP (in, 0));
8539*e4b17023SJohn Marino       op1 = find_replacement (&XEXP (in, 1));
8540*e4b17023SJohn Marino 
8541*e4b17023SJohn Marino       /* Since constraint checking is strict, commutativity won't be
8542*e4b17023SJohn Marino 	 checked, so we need to do that here to avoid spurious failure
8543*e4b17023SJohn Marino 	 if the add instruction is two-address and the second operand
8544*e4b17023SJohn Marino 	 of the add is the same as the reload reg, which is frequently
8545*e4b17023SJohn Marino 	 the case.  If the insn would be A = B + A, rearrange it so
8546*e4b17023SJohn Marino 	 it will be A = A + B as constrain_operands expects.  */
8547*e4b17023SJohn Marino 
8548*e4b17023SJohn Marino       if (REG_P (XEXP (in, 1))
8549*e4b17023SJohn Marino 	  && REGNO (out) == REGNO (XEXP (in, 1)))
8550*e4b17023SJohn Marino 	tem = op0, op0 = op1, op1 = tem;
8551*e4b17023SJohn Marino 
8552*e4b17023SJohn Marino       if (op0 != XEXP (in, 0) || op1 != XEXP (in, 1))
8553*e4b17023SJohn Marino 	in = gen_rtx_PLUS (GET_MODE (in), op0, op1);
8554*e4b17023SJohn Marino 
8555*e4b17023SJohn Marino       insn = emit_insn_if_valid_for_reload (gen_rtx_SET (VOIDmode, out, in));
8556*e4b17023SJohn Marino       if (insn)
8557*e4b17023SJohn Marino 	return insn;
8558*e4b17023SJohn Marino 
8559*e4b17023SJohn Marino       /* If that failed, we must use a conservative two-insn sequence.
8560*e4b17023SJohn Marino 
8561*e4b17023SJohn Marino 	 Use a move to copy one operand into the reload register.  Prefer
8562*e4b17023SJohn Marino 	 to reload a constant, MEM or pseudo since the move patterns can
8563*e4b17023SJohn Marino 	 handle an arbitrary operand.  If OP1 is not a constant, MEM or
8564*e4b17023SJohn Marino 	 pseudo and OP1 is not a valid operand for an add instruction, then
8565*e4b17023SJohn Marino 	 reload OP1.
8566*e4b17023SJohn Marino 
8567*e4b17023SJohn Marino 	 After reloading one of the operands into the reload register, add
8568*e4b17023SJohn Marino 	 the reload register to the output register.
8569*e4b17023SJohn Marino 
8570*e4b17023SJohn Marino 	 If there is another way to do this for a specific machine, a
8571*e4b17023SJohn Marino 	 DEFINE_PEEPHOLE should be specified that recognizes the sequence
8572*e4b17023SJohn Marino 	 we emit below.  */
8573*e4b17023SJohn Marino 
8574*e4b17023SJohn Marino       code = optab_handler (add_optab, GET_MODE (out));
8575*e4b17023SJohn Marino 
8576*e4b17023SJohn Marino       if (CONSTANT_P (op1) || MEM_P (op1) || GET_CODE (op1) == SUBREG
8577*e4b17023SJohn Marino 	  || (REG_P (op1)
8578*e4b17023SJohn Marino 	      && REGNO (op1) >= FIRST_PSEUDO_REGISTER)
8579*e4b17023SJohn Marino 	  || (code != CODE_FOR_nothing
8580*e4b17023SJohn Marino 	      && !insn_operand_matches (code, 2, op1)))
8581*e4b17023SJohn Marino 	tem = op0, op0 = op1, op1 = tem;
8582*e4b17023SJohn Marino 
8583*e4b17023SJohn Marino       gen_reload (out, op0, opnum, type);
8584*e4b17023SJohn Marino 
8585*e4b17023SJohn Marino       /* If OP0 and OP1 are the same, we can use OUT for OP1.
8586*e4b17023SJohn Marino 	 This fixes a problem on the 32K where the stack pointer cannot
8587*e4b17023SJohn Marino 	 be used as an operand of an add insn.  */
8588*e4b17023SJohn Marino 
8589*e4b17023SJohn Marino       if (rtx_equal_p (op0, op1))
8590*e4b17023SJohn Marino 	op1 = out;
8591*e4b17023SJohn Marino 
8592*e4b17023SJohn Marino       insn = emit_insn_if_valid_for_reload (gen_add2_insn (out, op1));
8593*e4b17023SJohn Marino       if (insn)
8594*e4b17023SJohn Marino 	{
8595*e4b17023SJohn Marino 	  /* Add a REG_EQUIV note so that find_equiv_reg can find it.  */
8596*e4b17023SJohn Marino 	  set_dst_reg_note (insn, REG_EQUIV, in, out);
8597*e4b17023SJohn Marino 	  return insn;
8598*e4b17023SJohn Marino 	}
8599*e4b17023SJohn Marino 
8600*e4b17023SJohn Marino       /* If that failed, copy the address register to the reload register.
8601*e4b17023SJohn Marino 	 Then add the constant to the reload register.  */
8602*e4b17023SJohn Marino 
8603*e4b17023SJohn Marino       gcc_assert (!reg_overlap_mentioned_p (out, op0));
8604*e4b17023SJohn Marino       gen_reload (out, op1, opnum, type);
8605*e4b17023SJohn Marino       insn = emit_insn (gen_add2_insn (out, op0));
8606*e4b17023SJohn Marino       set_dst_reg_note (insn, REG_EQUIV, in, out);
8607*e4b17023SJohn Marino     }
8608*e4b17023SJohn Marino 
8609*e4b17023SJohn Marino #ifdef SECONDARY_MEMORY_NEEDED
8610*e4b17023SJohn Marino   /* If we need a memory location to do the move, do it that way.  */
8611*e4b17023SJohn Marino   else if ((REG_P (in)
8612*e4b17023SJohn Marino             || (GET_CODE (in) == SUBREG && REG_P (SUBREG_REG (in))))
8613*e4b17023SJohn Marino 	   && reg_or_subregno (in) < FIRST_PSEUDO_REGISTER
8614*e4b17023SJohn Marino 	   && (REG_P (out)
8615*e4b17023SJohn Marino 	       || (GET_CODE (out) == SUBREG && REG_P (SUBREG_REG (out))))
8616*e4b17023SJohn Marino 	   && reg_or_subregno (out) < FIRST_PSEUDO_REGISTER
8617*e4b17023SJohn Marino 	   && SECONDARY_MEMORY_NEEDED (REGNO_REG_CLASS (reg_or_subregno (in)),
8618*e4b17023SJohn Marino 				       REGNO_REG_CLASS (reg_or_subregno (out)),
8619*e4b17023SJohn Marino 				       GET_MODE (out)))
8620*e4b17023SJohn Marino     {
8621*e4b17023SJohn Marino       /* Get the memory to use and rewrite both registers to its mode.  */
8622*e4b17023SJohn Marino       rtx loc = get_secondary_mem (in, GET_MODE (out), opnum, type);
8623*e4b17023SJohn Marino 
8624*e4b17023SJohn Marino       if (GET_MODE (loc) != GET_MODE (out))
8625*e4b17023SJohn Marino 	out = gen_rtx_REG (GET_MODE (loc), reg_or_subregno (out));
8626*e4b17023SJohn Marino 
8627*e4b17023SJohn Marino       if (GET_MODE (loc) != GET_MODE (in))
8628*e4b17023SJohn Marino 	in = gen_rtx_REG (GET_MODE (loc), reg_or_subregno (in));
8629*e4b17023SJohn Marino 
8630*e4b17023SJohn Marino       gen_reload (loc, in, opnum, type);
8631*e4b17023SJohn Marino       gen_reload (out, loc, opnum, type);
8632*e4b17023SJohn Marino     }
8633*e4b17023SJohn Marino #endif
8634*e4b17023SJohn Marino   else if (REG_P (out) && UNARY_P (in))
8635*e4b17023SJohn Marino     {
8636*e4b17023SJohn Marino       rtx insn;
8637*e4b17023SJohn Marino       rtx op1;
8638*e4b17023SJohn Marino       rtx out_moded;
8639*e4b17023SJohn Marino       rtx set;
8640*e4b17023SJohn Marino 
8641*e4b17023SJohn Marino       op1 = find_replacement (&XEXP (in, 0));
8642*e4b17023SJohn Marino       if (op1 != XEXP (in, 0))
8643*e4b17023SJohn Marino 	in = gen_rtx_fmt_e (GET_CODE (in), GET_MODE (in), op1);
8644*e4b17023SJohn Marino 
8645*e4b17023SJohn Marino       /* First, try a plain SET.  */
8646*e4b17023SJohn Marino       set = emit_insn_if_valid_for_reload (gen_rtx_SET (VOIDmode, out, in));
8647*e4b17023SJohn Marino       if (set)
8648*e4b17023SJohn Marino 	return set;
8649*e4b17023SJohn Marino 
8650*e4b17023SJohn Marino       /* If that failed, move the inner operand to the reload
8651*e4b17023SJohn Marino 	 register, and try the same unop with the inner expression
8652*e4b17023SJohn Marino 	 replaced with the reload register.  */
8653*e4b17023SJohn Marino 
8654*e4b17023SJohn Marino       if (GET_MODE (op1) != GET_MODE (out))
8655*e4b17023SJohn Marino 	out_moded = gen_rtx_REG (GET_MODE (op1), REGNO (out));
8656*e4b17023SJohn Marino       else
8657*e4b17023SJohn Marino 	out_moded = out;
8658*e4b17023SJohn Marino 
8659*e4b17023SJohn Marino       gen_reload (out_moded, op1, opnum, type);
8660*e4b17023SJohn Marino 
8661*e4b17023SJohn Marino       insn
8662*e4b17023SJohn Marino 	= gen_rtx_SET (VOIDmode, out,
8663*e4b17023SJohn Marino 		       gen_rtx_fmt_e (GET_CODE (in), GET_MODE (in),
8664*e4b17023SJohn Marino 				      out_moded));
8665*e4b17023SJohn Marino       insn = emit_insn_if_valid_for_reload (insn);
8666*e4b17023SJohn Marino       if (insn)
8667*e4b17023SJohn Marino 	{
8668*e4b17023SJohn Marino 	  set_unique_reg_note (insn, REG_EQUIV, in);
8669*e4b17023SJohn Marino 	  return insn;
8670*e4b17023SJohn Marino 	}
8671*e4b17023SJohn Marino 
8672*e4b17023SJohn Marino       fatal_insn ("failure trying to reload:", set);
8673*e4b17023SJohn Marino     }
8674*e4b17023SJohn Marino   /* If IN is a simple operand, use gen_move_insn.  */
8675*e4b17023SJohn Marino   else if (OBJECT_P (in) || GET_CODE (in) == SUBREG)
8676*e4b17023SJohn Marino     {
8677*e4b17023SJohn Marino       tem = emit_insn (gen_move_insn (out, in));
8678*e4b17023SJohn Marino       /* IN may contain a LABEL_REF, if so add a REG_LABEL_OPERAND note.  */
8679*e4b17023SJohn Marino       mark_jump_label (in, tem, 0);
8680*e4b17023SJohn Marino     }
8681*e4b17023SJohn Marino 
8682*e4b17023SJohn Marino #ifdef HAVE_reload_load_address
8683*e4b17023SJohn Marino   else if (HAVE_reload_load_address)
8684*e4b17023SJohn Marino     emit_insn (gen_reload_load_address (out, in));
8685*e4b17023SJohn Marino #endif
8686*e4b17023SJohn Marino 
8687*e4b17023SJohn Marino   /* Otherwise, just write (set OUT IN) and hope for the best.  */
8688*e4b17023SJohn Marino   else
8689*e4b17023SJohn Marino     emit_insn (gen_rtx_SET (VOIDmode, out, in));
8690*e4b17023SJohn Marino 
8691*e4b17023SJohn Marino   /* Return the first insn emitted.
8692*e4b17023SJohn Marino      We can not just return get_last_insn, because there may have
8693*e4b17023SJohn Marino      been multiple instructions emitted.  Also note that gen_move_insn may
8694*e4b17023SJohn Marino      emit more than one insn itself, so we can not assume that there is one
8695*e4b17023SJohn Marino      insn emitted per emit_insn_before call.  */
8696*e4b17023SJohn Marino 
8697*e4b17023SJohn Marino   return last ? NEXT_INSN (last) : get_insns ();
8698*e4b17023SJohn Marino }
8699*e4b17023SJohn Marino 
8700*e4b17023SJohn Marino /* Delete a previously made output-reload whose result we now believe
8701*e4b17023SJohn Marino    is not needed.  First we double-check.
8702*e4b17023SJohn Marino 
8703*e4b17023SJohn Marino    INSN is the insn now being processed.
8704*e4b17023SJohn Marino    LAST_RELOAD_REG is the hard register number for which we want to delete
8705*e4b17023SJohn Marino    the last output reload.
8706*e4b17023SJohn Marino    J is the reload-number that originally used REG.  The caller has made
8707*e4b17023SJohn Marino    certain that reload J doesn't use REG any longer for input.
8708*e4b17023SJohn Marino    NEW_RELOAD_REG is reload register that reload J is using for REG.  */
8709*e4b17023SJohn Marino 
8710*e4b17023SJohn Marino static void
delete_output_reload(rtx insn,int j,int last_reload_reg,rtx new_reload_reg)8711*e4b17023SJohn Marino delete_output_reload (rtx insn, int j, int last_reload_reg, rtx new_reload_reg)
8712*e4b17023SJohn Marino {
8713*e4b17023SJohn Marino   rtx output_reload_insn = spill_reg_store[last_reload_reg];
8714*e4b17023SJohn Marino   rtx reg = spill_reg_stored_to[last_reload_reg];
8715*e4b17023SJohn Marino   int k;
8716*e4b17023SJohn Marino   int n_occurrences;
8717*e4b17023SJohn Marino   int n_inherited = 0;
8718*e4b17023SJohn Marino   rtx i1;
8719*e4b17023SJohn Marino   rtx substed;
8720*e4b17023SJohn Marino   unsigned regno;
8721*e4b17023SJohn Marino   int nregs;
8722*e4b17023SJohn Marino 
8723*e4b17023SJohn Marino   /* It is possible that this reload has been only used to set another reload
8724*e4b17023SJohn Marino      we eliminated earlier and thus deleted this instruction too.  */
8725*e4b17023SJohn Marino   if (INSN_DELETED_P (output_reload_insn))
8726*e4b17023SJohn Marino     return;
8727*e4b17023SJohn Marino 
8728*e4b17023SJohn Marino   /* Get the raw pseudo-register referred to.  */
8729*e4b17023SJohn Marino 
8730*e4b17023SJohn Marino   while (GET_CODE (reg) == SUBREG)
8731*e4b17023SJohn Marino     reg = SUBREG_REG (reg);
8732*e4b17023SJohn Marino   substed = reg_equiv_memory_loc (REGNO (reg));
8733*e4b17023SJohn Marino 
8734*e4b17023SJohn Marino   /* This is unsafe if the operand occurs more often in the current
8735*e4b17023SJohn Marino      insn than it is inherited.  */
8736*e4b17023SJohn Marino   for (k = n_reloads - 1; k >= 0; k--)
8737*e4b17023SJohn Marino     {
8738*e4b17023SJohn Marino       rtx reg2 = rld[k].in;
8739*e4b17023SJohn Marino       if (! reg2)
8740*e4b17023SJohn Marino 	continue;
8741*e4b17023SJohn Marino       if (MEM_P (reg2) || reload_override_in[k])
8742*e4b17023SJohn Marino 	reg2 = rld[k].in_reg;
8743*e4b17023SJohn Marino #ifdef AUTO_INC_DEC
8744*e4b17023SJohn Marino       if (rld[k].out && ! rld[k].out_reg)
8745*e4b17023SJohn Marino 	reg2 = XEXP (rld[k].in_reg, 0);
8746*e4b17023SJohn Marino #endif
8747*e4b17023SJohn Marino       while (GET_CODE (reg2) == SUBREG)
8748*e4b17023SJohn Marino 	reg2 = SUBREG_REG (reg2);
8749*e4b17023SJohn Marino       if (rtx_equal_p (reg2, reg))
8750*e4b17023SJohn Marino 	{
8751*e4b17023SJohn Marino 	  if (reload_inherited[k] || reload_override_in[k] || k == j)
8752*e4b17023SJohn Marino 	    n_inherited++;
8753*e4b17023SJohn Marino 	  else
8754*e4b17023SJohn Marino 	    return;
8755*e4b17023SJohn Marino 	}
8756*e4b17023SJohn Marino     }
8757*e4b17023SJohn Marino   n_occurrences = count_occurrences (PATTERN (insn), reg, 0);
8758*e4b17023SJohn Marino   if (CALL_P (insn) && CALL_INSN_FUNCTION_USAGE (insn))
8759*e4b17023SJohn Marino     n_occurrences += count_occurrences (CALL_INSN_FUNCTION_USAGE (insn),
8760*e4b17023SJohn Marino 					reg, 0);
8761*e4b17023SJohn Marino   if (substed)
8762*e4b17023SJohn Marino     n_occurrences += count_occurrences (PATTERN (insn),
8763*e4b17023SJohn Marino 					eliminate_regs (substed, VOIDmode,
8764*e4b17023SJohn Marino 							NULL_RTX), 0);
8765*e4b17023SJohn Marino   for (i1 = reg_equiv_alt_mem_list (REGNO (reg)); i1; i1 = XEXP (i1, 1))
8766*e4b17023SJohn Marino     {
8767*e4b17023SJohn Marino       gcc_assert (!rtx_equal_p (XEXP (i1, 0), substed));
8768*e4b17023SJohn Marino       n_occurrences += count_occurrences (PATTERN (insn), XEXP (i1, 0), 0);
8769*e4b17023SJohn Marino     }
8770*e4b17023SJohn Marino   if (n_occurrences > n_inherited)
8771*e4b17023SJohn Marino     return;
8772*e4b17023SJohn Marino 
8773*e4b17023SJohn Marino   regno = REGNO (reg);
8774*e4b17023SJohn Marino   if (regno >= FIRST_PSEUDO_REGISTER)
8775*e4b17023SJohn Marino     nregs = 1;
8776*e4b17023SJohn Marino   else
8777*e4b17023SJohn Marino     nregs = hard_regno_nregs[regno][GET_MODE (reg)];
8778*e4b17023SJohn Marino 
8779*e4b17023SJohn Marino   /* If the pseudo-reg we are reloading is no longer referenced
8780*e4b17023SJohn Marino      anywhere between the store into it and here,
8781*e4b17023SJohn Marino      and we're within the same basic block, then the value can only
8782*e4b17023SJohn Marino      pass through the reload reg and end up here.
8783*e4b17023SJohn Marino      Otherwise, give up--return.  */
8784*e4b17023SJohn Marino   for (i1 = NEXT_INSN (output_reload_insn);
8785*e4b17023SJohn Marino        i1 != insn; i1 = NEXT_INSN (i1))
8786*e4b17023SJohn Marino     {
8787*e4b17023SJohn Marino       if (NOTE_INSN_BASIC_BLOCK_P (i1))
8788*e4b17023SJohn Marino 	return;
8789*e4b17023SJohn Marino       if ((NONJUMP_INSN_P (i1) || CALL_P (i1))
8790*e4b17023SJohn Marino 	  && refers_to_regno_p (regno, regno + nregs, PATTERN (i1), NULL))
8791*e4b17023SJohn Marino 	{
8792*e4b17023SJohn Marino 	  /* If this is USE in front of INSN, we only have to check that
8793*e4b17023SJohn Marino 	     there are no more references than accounted for by inheritance.  */
8794*e4b17023SJohn Marino 	  while (NONJUMP_INSN_P (i1) && GET_CODE (PATTERN (i1)) == USE)
8795*e4b17023SJohn Marino 	    {
8796*e4b17023SJohn Marino 	      n_occurrences += rtx_equal_p (reg, XEXP (PATTERN (i1), 0)) != 0;
8797*e4b17023SJohn Marino 	      i1 = NEXT_INSN (i1);
8798*e4b17023SJohn Marino 	    }
8799*e4b17023SJohn Marino 	  if (n_occurrences <= n_inherited && i1 == insn)
8800*e4b17023SJohn Marino 	    break;
8801*e4b17023SJohn Marino 	  return;
8802*e4b17023SJohn Marino 	}
8803*e4b17023SJohn Marino     }
8804*e4b17023SJohn Marino 
8805*e4b17023SJohn Marino   /* We will be deleting the insn.  Remove the spill reg information.  */
8806*e4b17023SJohn Marino   for (k = hard_regno_nregs[last_reload_reg][GET_MODE (reg)]; k-- > 0; )
8807*e4b17023SJohn Marino     {
8808*e4b17023SJohn Marino       spill_reg_store[last_reload_reg + k] = 0;
8809*e4b17023SJohn Marino       spill_reg_stored_to[last_reload_reg + k] = 0;
8810*e4b17023SJohn Marino     }
8811*e4b17023SJohn Marino 
8812*e4b17023SJohn Marino   /* The caller has already checked that REG dies or is set in INSN.
8813*e4b17023SJohn Marino      It has also checked that we are optimizing, and thus some
8814*e4b17023SJohn Marino      inaccuracies in the debugging information are acceptable.
8815*e4b17023SJohn Marino      So we could just delete output_reload_insn.  But in some cases
8816*e4b17023SJohn Marino      we can improve the debugging information without sacrificing
8817*e4b17023SJohn Marino      optimization - maybe even improving the code: See if the pseudo
8818*e4b17023SJohn Marino      reg has been completely replaced with reload regs.  If so, delete
8819*e4b17023SJohn Marino      the store insn and forget we had a stack slot for the pseudo.  */
8820*e4b17023SJohn Marino   if (rld[j].out != rld[j].in
8821*e4b17023SJohn Marino       && REG_N_DEATHS (REGNO (reg)) == 1
8822*e4b17023SJohn Marino       && REG_N_SETS (REGNO (reg)) == 1
8823*e4b17023SJohn Marino       && REG_BASIC_BLOCK (REGNO (reg)) >= NUM_FIXED_BLOCKS
8824*e4b17023SJohn Marino       && find_regno_note (insn, REG_DEAD, REGNO (reg)))
8825*e4b17023SJohn Marino     {
8826*e4b17023SJohn Marino       rtx i2;
8827*e4b17023SJohn Marino 
8828*e4b17023SJohn Marino       /* We know that it was used only between here and the beginning of
8829*e4b17023SJohn Marino 	 the current basic block.  (We also know that the last use before
8830*e4b17023SJohn Marino 	 INSN was the output reload we are thinking of deleting, but never
8831*e4b17023SJohn Marino 	 mind that.)  Search that range; see if any ref remains.  */
8832*e4b17023SJohn Marino       for (i2 = PREV_INSN (insn); i2; i2 = PREV_INSN (i2))
8833*e4b17023SJohn Marino 	{
8834*e4b17023SJohn Marino 	  rtx set = single_set (i2);
8835*e4b17023SJohn Marino 
8836*e4b17023SJohn Marino 	  /* Uses which just store in the pseudo don't count,
8837*e4b17023SJohn Marino 	     since if they are the only uses, they are dead.  */
8838*e4b17023SJohn Marino 	  if (set != 0 && SET_DEST (set) == reg)
8839*e4b17023SJohn Marino 	    continue;
8840*e4b17023SJohn Marino 	  if (LABEL_P (i2)
8841*e4b17023SJohn Marino 	      || JUMP_P (i2))
8842*e4b17023SJohn Marino 	    break;
8843*e4b17023SJohn Marino 	  if ((NONJUMP_INSN_P (i2) || CALL_P (i2))
8844*e4b17023SJohn Marino 	      && reg_mentioned_p (reg, PATTERN (i2)))
8845*e4b17023SJohn Marino 	    {
8846*e4b17023SJohn Marino 	      /* Some other ref remains; just delete the output reload we
8847*e4b17023SJohn Marino 		 know to be dead.  */
8848*e4b17023SJohn Marino 	      delete_address_reloads (output_reload_insn, insn);
8849*e4b17023SJohn Marino 	      delete_insn (output_reload_insn);
8850*e4b17023SJohn Marino 	      return;
8851*e4b17023SJohn Marino 	    }
8852*e4b17023SJohn Marino 	}
8853*e4b17023SJohn Marino 
8854*e4b17023SJohn Marino       /* Delete the now-dead stores into this pseudo.  Note that this
8855*e4b17023SJohn Marino 	 loop also takes care of deleting output_reload_insn.  */
8856*e4b17023SJohn Marino       for (i2 = PREV_INSN (insn); i2; i2 = PREV_INSN (i2))
8857*e4b17023SJohn Marino 	{
8858*e4b17023SJohn Marino 	  rtx set = single_set (i2);
8859*e4b17023SJohn Marino 
8860*e4b17023SJohn Marino 	  if (set != 0 && SET_DEST (set) == reg)
8861*e4b17023SJohn Marino 	    {
8862*e4b17023SJohn Marino 	      delete_address_reloads (i2, insn);
8863*e4b17023SJohn Marino 	      delete_insn (i2);
8864*e4b17023SJohn Marino 	    }
8865*e4b17023SJohn Marino 	  if (LABEL_P (i2)
8866*e4b17023SJohn Marino 	      || JUMP_P (i2))
8867*e4b17023SJohn Marino 	    break;
8868*e4b17023SJohn Marino 	}
8869*e4b17023SJohn Marino 
8870*e4b17023SJohn Marino       /* For the debugging info, say the pseudo lives in this reload reg.  */
8871*e4b17023SJohn Marino       reg_renumber[REGNO (reg)] = REGNO (new_reload_reg);
8872*e4b17023SJohn Marino       if (ira_conflicts_p)
8873*e4b17023SJohn Marino 	/* Inform IRA about the change.  */
8874*e4b17023SJohn Marino 	ira_mark_allocation_change (REGNO (reg));
8875*e4b17023SJohn Marino       alter_reg (REGNO (reg), -1, false);
8876*e4b17023SJohn Marino     }
8877*e4b17023SJohn Marino   else
8878*e4b17023SJohn Marino     {
8879*e4b17023SJohn Marino       delete_address_reloads (output_reload_insn, insn);
8880*e4b17023SJohn Marino       delete_insn (output_reload_insn);
8881*e4b17023SJohn Marino     }
8882*e4b17023SJohn Marino }
8883*e4b17023SJohn Marino 
8884*e4b17023SJohn Marino /* We are going to delete DEAD_INSN.  Recursively delete loads of
8885*e4b17023SJohn Marino    reload registers used in DEAD_INSN that are not used till CURRENT_INSN.
8886*e4b17023SJohn Marino    CURRENT_INSN is being reloaded, so we have to check its reloads too.  */
8887*e4b17023SJohn Marino static void
delete_address_reloads(rtx dead_insn,rtx current_insn)8888*e4b17023SJohn Marino delete_address_reloads (rtx dead_insn, rtx current_insn)
8889*e4b17023SJohn Marino {
8890*e4b17023SJohn Marino   rtx set = single_set (dead_insn);
8891*e4b17023SJohn Marino   rtx set2, dst, prev, next;
8892*e4b17023SJohn Marino   if (set)
8893*e4b17023SJohn Marino     {
8894*e4b17023SJohn Marino       rtx dst = SET_DEST (set);
8895*e4b17023SJohn Marino       if (MEM_P (dst))
8896*e4b17023SJohn Marino 	delete_address_reloads_1 (dead_insn, XEXP (dst, 0), current_insn);
8897*e4b17023SJohn Marino     }
8898*e4b17023SJohn Marino   /* If we deleted the store from a reloaded post_{in,de}c expression,
8899*e4b17023SJohn Marino      we can delete the matching adds.  */
8900*e4b17023SJohn Marino   prev = PREV_INSN (dead_insn);
8901*e4b17023SJohn Marino   next = NEXT_INSN (dead_insn);
8902*e4b17023SJohn Marino   if (! prev || ! next)
8903*e4b17023SJohn Marino     return;
8904*e4b17023SJohn Marino   set = single_set (next);
8905*e4b17023SJohn Marino   set2 = single_set (prev);
8906*e4b17023SJohn Marino   if (! set || ! set2
8907*e4b17023SJohn Marino       || GET_CODE (SET_SRC (set)) != PLUS || GET_CODE (SET_SRC (set2)) != PLUS
8908*e4b17023SJohn Marino       || !CONST_INT_P (XEXP (SET_SRC (set), 1))
8909*e4b17023SJohn Marino       || !CONST_INT_P (XEXP (SET_SRC (set2), 1)))
8910*e4b17023SJohn Marino     return;
8911*e4b17023SJohn Marino   dst = SET_DEST (set);
8912*e4b17023SJohn Marino   if (! rtx_equal_p (dst, SET_DEST (set2))
8913*e4b17023SJohn Marino       || ! rtx_equal_p (dst, XEXP (SET_SRC (set), 0))
8914*e4b17023SJohn Marino       || ! rtx_equal_p (dst, XEXP (SET_SRC (set2), 0))
8915*e4b17023SJohn Marino       || (INTVAL (XEXP (SET_SRC (set), 1))
8916*e4b17023SJohn Marino 	  != -INTVAL (XEXP (SET_SRC (set2), 1))))
8917*e4b17023SJohn Marino     return;
8918*e4b17023SJohn Marino   delete_related_insns (prev);
8919*e4b17023SJohn Marino   delete_related_insns (next);
8920*e4b17023SJohn Marino }
8921*e4b17023SJohn Marino 
8922*e4b17023SJohn Marino /* Subfunction of delete_address_reloads: process registers found in X.  */
8923*e4b17023SJohn Marino static void
delete_address_reloads_1(rtx dead_insn,rtx x,rtx current_insn)8924*e4b17023SJohn Marino delete_address_reloads_1 (rtx dead_insn, rtx x, rtx current_insn)
8925*e4b17023SJohn Marino {
8926*e4b17023SJohn Marino   rtx prev, set, dst, i2;
8927*e4b17023SJohn Marino   int i, j;
8928*e4b17023SJohn Marino   enum rtx_code code = GET_CODE (x);
8929*e4b17023SJohn Marino 
8930*e4b17023SJohn Marino   if (code != REG)
8931*e4b17023SJohn Marino     {
8932*e4b17023SJohn Marino       const char *fmt = GET_RTX_FORMAT (code);
8933*e4b17023SJohn Marino       for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
8934*e4b17023SJohn Marino 	{
8935*e4b17023SJohn Marino 	  if (fmt[i] == 'e')
8936*e4b17023SJohn Marino 	    delete_address_reloads_1 (dead_insn, XEXP (x, i), current_insn);
8937*e4b17023SJohn Marino 	  else if (fmt[i] == 'E')
8938*e4b17023SJohn Marino 	    {
8939*e4b17023SJohn Marino 	      for (j = XVECLEN (x, i) - 1; j >= 0; j--)
8940*e4b17023SJohn Marino 		delete_address_reloads_1 (dead_insn, XVECEXP (x, i, j),
8941*e4b17023SJohn Marino 					  current_insn);
8942*e4b17023SJohn Marino 	    }
8943*e4b17023SJohn Marino 	}
8944*e4b17023SJohn Marino       return;
8945*e4b17023SJohn Marino     }
8946*e4b17023SJohn Marino 
8947*e4b17023SJohn Marino   if (spill_reg_order[REGNO (x)] < 0)
8948*e4b17023SJohn Marino     return;
8949*e4b17023SJohn Marino 
8950*e4b17023SJohn Marino   /* Scan backwards for the insn that sets x.  This might be a way back due
8951*e4b17023SJohn Marino      to inheritance.  */
8952*e4b17023SJohn Marino   for (prev = PREV_INSN (dead_insn); prev; prev = PREV_INSN (prev))
8953*e4b17023SJohn Marino     {
8954*e4b17023SJohn Marino       code = GET_CODE (prev);
8955*e4b17023SJohn Marino       if (code == CODE_LABEL || code == JUMP_INSN)
8956*e4b17023SJohn Marino 	return;
8957*e4b17023SJohn Marino       if (!INSN_P (prev))
8958*e4b17023SJohn Marino 	continue;
8959*e4b17023SJohn Marino       if (reg_set_p (x, PATTERN (prev)))
8960*e4b17023SJohn Marino 	break;
8961*e4b17023SJohn Marino       if (reg_referenced_p (x, PATTERN (prev)))
8962*e4b17023SJohn Marino 	return;
8963*e4b17023SJohn Marino     }
8964*e4b17023SJohn Marino   if (! prev || INSN_UID (prev) < reload_first_uid)
8965*e4b17023SJohn Marino     return;
8966*e4b17023SJohn Marino   /* Check that PREV only sets the reload register.  */
8967*e4b17023SJohn Marino   set = single_set (prev);
8968*e4b17023SJohn Marino   if (! set)
8969*e4b17023SJohn Marino     return;
8970*e4b17023SJohn Marino   dst = SET_DEST (set);
8971*e4b17023SJohn Marino   if (!REG_P (dst)
8972*e4b17023SJohn Marino       || ! rtx_equal_p (dst, x))
8973*e4b17023SJohn Marino     return;
8974*e4b17023SJohn Marino   if (! reg_set_p (dst, PATTERN (dead_insn)))
8975*e4b17023SJohn Marino     {
8976*e4b17023SJohn Marino       /* Check if DST was used in a later insn -
8977*e4b17023SJohn Marino 	 it might have been inherited.  */
8978*e4b17023SJohn Marino       for (i2 = NEXT_INSN (dead_insn); i2; i2 = NEXT_INSN (i2))
8979*e4b17023SJohn Marino 	{
8980*e4b17023SJohn Marino 	  if (LABEL_P (i2))
8981*e4b17023SJohn Marino 	    break;
8982*e4b17023SJohn Marino 	  if (! INSN_P (i2))
8983*e4b17023SJohn Marino 	    continue;
8984*e4b17023SJohn Marino 	  if (reg_referenced_p (dst, PATTERN (i2)))
8985*e4b17023SJohn Marino 	    {
8986*e4b17023SJohn Marino 	      /* If there is a reference to the register in the current insn,
8987*e4b17023SJohn Marino 		 it might be loaded in a non-inherited reload.  If no other
8988*e4b17023SJohn Marino 		 reload uses it, that means the register is set before
8989*e4b17023SJohn Marino 		 referenced.  */
8990*e4b17023SJohn Marino 	      if (i2 == current_insn)
8991*e4b17023SJohn Marino 		{
8992*e4b17023SJohn Marino 		  for (j = n_reloads - 1; j >= 0; j--)
8993*e4b17023SJohn Marino 		    if ((rld[j].reg_rtx == dst && reload_inherited[j])
8994*e4b17023SJohn Marino 			|| reload_override_in[j] == dst)
8995*e4b17023SJohn Marino 		      return;
8996*e4b17023SJohn Marino 		  for (j = n_reloads - 1; j >= 0; j--)
8997*e4b17023SJohn Marino 		    if (rld[j].in && rld[j].reg_rtx == dst)
8998*e4b17023SJohn Marino 		      break;
8999*e4b17023SJohn Marino 		  if (j >= 0)
9000*e4b17023SJohn Marino 		    break;
9001*e4b17023SJohn Marino 		}
9002*e4b17023SJohn Marino 	      return;
9003*e4b17023SJohn Marino 	    }
9004*e4b17023SJohn Marino 	  if (JUMP_P (i2))
9005*e4b17023SJohn Marino 	    break;
9006*e4b17023SJohn Marino 	  /* If DST is still live at CURRENT_INSN, check if it is used for
9007*e4b17023SJohn Marino 	     any reload.  Note that even if CURRENT_INSN sets DST, we still
9008*e4b17023SJohn Marino 	     have to check the reloads.  */
9009*e4b17023SJohn Marino 	  if (i2 == current_insn)
9010*e4b17023SJohn Marino 	    {
9011*e4b17023SJohn Marino 	      for (j = n_reloads - 1; j >= 0; j--)
9012*e4b17023SJohn Marino 		if ((rld[j].reg_rtx == dst && reload_inherited[j])
9013*e4b17023SJohn Marino 		    || reload_override_in[j] == dst)
9014*e4b17023SJohn Marino 		  return;
9015*e4b17023SJohn Marino 	      /* ??? We can't finish the loop here, because dst might be
9016*e4b17023SJohn Marino 		 allocated to a pseudo in this block if no reload in this
9017*e4b17023SJohn Marino 		 block needs any of the classes containing DST - see
9018*e4b17023SJohn Marino 		 spill_hard_reg.  There is no easy way to tell this, so we
9019*e4b17023SJohn Marino 		 have to scan till the end of the basic block.  */
9020*e4b17023SJohn Marino 	    }
9021*e4b17023SJohn Marino 	  if (reg_set_p (dst, PATTERN (i2)))
9022*e4b17023SJohn Marino 	    break;
9023*e4b17023SJohn Marino 	}
9024*e4b17023SJohn Marino     }
9025*e4b17023SJohn Marino   delete_address_reloads_1 (prev, SET_SRC (set), current_insn);
9026*e4b17023SJohn Marino   reg_reloaded_contents[REGNO (dst)] = -1;
9027*e4b17023SJohn Marino   delete_insn (prev);
9028*e4b17023SJohn Marino }
9029*e4b17023SJohn Marino 
9030*e4b17023SJohn Marino /* Output reload-insns to reload VALUE into RELOADREG.
9031*e4b17023SJohn Marino    VALUE is an autoincrement or autodecrement RTX whose operand
9032*e4b17023SJohn Marino    is a register or memory location;
9033*e4b17023SJohn Marino    so reloading involves incrementing that location.
9034*e4b17023SJohn Marino    IN is either identical to VALUE, or some cheaper place to reload from.
9035*e4b17023SJohn Marino 
9036*e4b17023SJohn Marino    INC_AMOUNT is the number to increment or decrement by (always positive).
9037*e4b17023SJohn Marino    This cannot be deduced from VALUE.  */
9038*e4b17023SJohn Marino 
9039*e4b17023SJohn Marino static void
inc_for_reload(rtx reloadreg,rtx in,rtx value,int inc_amount)9040*e4b17023SJohn Marino inc_for_reload (rtx reloadreg, rtx in, rtx value, int inc_amount)
9041*e4b17023SJohn Marino {
9042*e4b17023SJohn Marino   /* REG or MEM to be copied and incremented.  */
9043*e4b17023SJohn Marino   rtx incloc = find_replacement (&XEXP (value, 0));
9044*e4b17023SJohn Marino   /* Nonzero if increment after copying.  */
9045*e4b17023SJohn Marino   int post = (GET_CODE (value) == POST_DEC || GET_CODE (value) == POST_INC
9046*e4b17023SJohn Marino 	      || GET_CODE (value) == POST_MODIFY);
9047*e4b17023SJohn Marino   rtx last;
9048*e4b17023SJohn Marino   rtx inc;
9049*e4b17023SJohn Marino   rtx add_insn;
9050*e4b17023SJohn Marino   int code;
9051*e4b17023SJohn Marino   rtx real_in = in == value ? incloc : in;
9052*e4b17023SJohn Marino 
9053*e4b17023SJohn Marino   /* No hard register is equivalent to this register after
9054*e4b17023SJohn Marino      inc/dec operation.  If REG_LAST_RELOAD_REG were nonzero,
9055*e4b17023SJohn Marino      we could inc/dec that register as well (maybe even using it for
9056*e4b17023SJohn Marino      the source), but I'm not sure it's worth worrying about.  */
9057*e4b17023SJohn Marino   if (REG_P (incloc))
9058*e4b17023SJohn Marino     reg_last_reload_reg[REGNO (incloc)] = 0;
9059*e4b17023SJohn Marino 
9060*e4b17023SJohn Marino   if (GET_CODE (value) == PRE_MODIFY || GET_CODE (value) == POST_MODIFY)
9061*e4b17023SJohn Marino     {
9062*e4b17023SJohn Marino       gcc_assert (GET_CODE (XEXP (value, 1)) == PLUS);
9063*e4b17023SJohn Marino       inc = find_replacement (&XEXP (XEXP (value, 1), 1));
9064*e4b17023SJohn Marino     }
9065*e4b17023SJohn Marino   else
9066*e4b17023SJohn Marino     {
9067*e4b17023SJohn Marino       if (GET_CODE (value) == PRE_DEC || GET_CODE (value) == POST_DEC)
9068*e4b17023SJohn Marino 	inc_amount = -inc_amount;
9069*e4b17023SJohn Marino 
9070*e4b17023SJohn Marino       inc = GEN_INT (inc_amount);
9071*e4b17023SJohn Marino     }
9072*e4b17023SJohn Marino 
9073*e4b17023SJohn Marino   /* If this is post-increment, first copy the location to the reload reg.  */
9074*e4b17023SJohn Marino   if (post && real_in != reloadreg)
9075*e4b17023SJohn Marino     emit_insn (gen_move_insn (reloadreg, real_in));
9076*e4b17023SJohn Marino 
9077*e4b17023SJohn Marino   if (in == value)
9078*e4b17023SJohn Marino     {
9079*e4b17023SJohn Marino       /* See if we can directly increment INCLOC.  Use a method similar to
9080*e4b17023SJohn Marino 	 that in gen_reload.  */
9081*e4b17023SJohn Marino 
9082*e4b17023SJohn Marino       last = get_last_insn ();
9083*e4b17023SJohn Marino       add_insn = emit_insn (gen_rtx_SET (VOIDmode, incloc,
9084*e4b17023SJohn Marino 					 gen_rtx_PLUS (GET_MODE (incloc),
9085*e4b17023SJohn Marino 						       incloc, inc)));
9086*e4b17023SJohn Marino 
9087*e4b17023SJohn Marino       code = recog_memoized (add_insn);
9088*e4b17023SJohn Marino       if (code >= 0)
9089*e4b17023SJohn Marino 	{
9090*e4b17023SJohn Marino 	  extract_insn (add_insn);
9091*e4b17023SJohn Marino 	  if (constrain_operands (1))
9092*e4b17023SJohn Marino 	    {
9093*e4b17023SJohn Marino 	      /* If this is a pre-increment and we have incremented the value
9094*e4b17023SJohn Marino 		 where it lives, copy the incremented value to RELOADREG to
9095*e4b17023SJohn Marino 		 be used as an address.  */
9096*e4b17023SJohn Marino 
9097*e4b17023SJohn Marino 	      if (! post)
9098*e4b17023SJohn Marino 		emit_insn (gen_move_insn (reloadreg, incloc));
9099*e4b17023SJohn Marino 	      return;
9100*e4b17023SJohn Marino 	    }
9101*e4b17023SJohn Marino 	}
9102*e4b17023SJohn Marino       delete_insns_since (last);
9103*e4b17023SJohn Marino     }
9104*e4b17023SJohn Marino 
9105*e4b17023SJohn Marino   /* If couldn't do the increment directly, must increment in RELOADREG.
9106*e4b17023SJohn Marino      The way we do this depends on whether this is pre- or post-increment.
9107*e4b17023SJohn Marino      For pre-increment, copy INCLOC to the reload register, increment it
9108*e4b17023SJohn Marino      there, then save back.  */
9109*e4b17023SJohn Marino 
9110*e4b17023SJohn Marino   if (! post)
9111*e4b17023SJohn Marino     {
9112*e4b17023SJohn Marino       if (in != reloadreg)
9113*e4b17023SJohn Marino 	emit_insn (gen_move_insn (reloadreg, real_in));
9114*e4b17023SJohn Marino       emit_insn (gen_add2_insn (reloadreg, inc));
9115*e4b17023SJohn Marino       emit_insn (gen_move_insn (incloc, reloadreg));
9116*e4b17023SJohn Marino     }
9117*e4b17023SJohn Marino   else
9118*e4b17023SJohn Marino     {
9119*e4b17023SJohn Marino       /* Postincrement.
9120*e4b17023SJohn Marino 	 Because this might be a jump insn or a compare, and because RELOADREG
9121*e4b17023SJohn Marino 	 may not be available after the insn in an input reload, we must do
9122*e4b17023SJohn Marino 	 the incrementation before the insn being reloaded for.
9123*e4b17023SJohn Marino 
9124*e4b17023SJohn Marino 	 We have already copied IN to RELOADREG.  Increment the copy in
9125*e4b17023SJohn Marino 	 RELOADREG, save that back, then decrement RELOADREG so it has
9126*e4b17023SJohn Marino 	 the original value.  */
9127*e4b17023SJohn Marino 
9128*e4b17023SJohn Marino       emit_insn (gen_add2_insn (reloadreg, inc));
9129*e4b17023SJohn Marino       emit_insn (gen_move_insn (incloc, reloadreg));
9130*e4b17023SJohn Marino       if (CONST_INT_P (inc))
9131*e4b17023SJohn Marino 	emit_insn (gen_add2_insn (reloadreg, GEN_INT (-INTVAL (inc))));
9132*e4b17023SJohn Marino       else
9133*e4b17023SJohn Marino 	emit_insn (gen_sub2_insn (reloadreg, inc));
9134*e4b17023SJohn Marino     }
9135*e4b17023SJohn Marino }
9136*e4b17023SJohn Marino 
9137*e4b17023SJohn Marino #ifdef AUTO_INC_DEC
9138*e4b17023SJohn Marino static void
add_auto_inc_notes(rtx insn,rtx x)9139*e4b17023SJohn Marino add_auto_inc_notes (rtx insn, rtx x)
9140*e4b17023SJohn Marino {
9141*e4b17023SJohn Marino   enum rtx_code code = GET_CODE (x);
9142*e4b17023SJohn Marino   const char *fmt;
9143*e4b17023SJohn Marino   int i, j;
9144*e4b17023SJohn Marino 
9145*e4b17023SJohn Marino   if (code == MEM && auto_inc_p (XEXP (x, 0)))
9146*e4b17023SJohn Marino     {
9147*e4b17023SJohn Marino       add_reg_note (insn, REG_INC, XEXP (XEXP (x, 0), 0));
9148*e4b17023SJohn Marino       return;
9149*e4b17023SJohn Marino     }
9150*e4b17023SJohn Marino 
9151*e4b17023SJohn Marino   /* Scan all the operand sub-expressions.  */
9152*e4b17023SJohn Marino   fmt = GET_RTX_FORMAT (code);
9153*e4b17023SJohn Marino   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
9154*e4b17023SJohn Marino     {
9155*e4b17023SJohn Marino       if (fmt[i] == 'e')
9156*e4b17023SJohn Marino 	add_auto_inc_notes (insn, XEXP (x, i));
9157*e4b17023SJohn Marino       else if (fmt[i] == 'E')
9158*e4b17023SJohn Marino 	for (j = XVECLEN (x, i) - 1; j >= 0; j--)
9159*e4b17023SJohn Marino 	  add_auto_inc_notes (insn, XVECEXP (x, i, j));
9160*e4b17023SJohn Marino     }
9161*e4b17023SJohn Marino }
9162*e4b17023SJohn Marino #endif
9163