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 < ®_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 < ®_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 < ®_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 = ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 < ®_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 (®_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 (®_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 (®s_to_forget);
4588*e4b17023SJohn Marino note_stores (PATTERN (insn), forget_old_reloads_1, ®s_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 (®s_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 (®_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 (®s_to_forget);
4706*e4b17023SJohn Marino CLEAR_REG_SET (®s_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 (®_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 (®_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 (®_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 (®_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 (®_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 (®_used_in_insn, &chain->live_throughout);
6333*e4b17023SJohn Marino compute_use_by_pseudos (®_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 (®_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 (®_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 (®_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 (®_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 (®_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 (®_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