]>
Commit | Line | Data |
---|---|---|
d6cf7e68 | 1 | /* Communication between reload.c and reload1.c. |
9daf6266 | 2 | Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1997, 1998, |
d3ff0f75 | 3 | 1999, 2000, 2001 Free Software Foundation, Inc. |
d6cf7e68 | 4 | |
f12b58b3 | 5 | This file is part of GCC. |
d6cf7e68 | 6 | |
f12b58b3 | 7 | GCC is free software; you can redistribute it and/or modify it under |
8 | the terms of the GNU General Public License as published by the Free | |
9 | Software Foundation; either version 2, or (at your option) any later | |
10 | version. | |
d6cf7e68 | 11 | |
f12b58b3 | 12 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
13 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 | for more details. | |
d6cf7e68 | 16 | |
17 | You should have received a copy of the GNU General Public License | |
f12b58b3 | 18 | along with GCC; see the file COPYING. If not, write to the Free |
19 | Software Foundation, 59 Temple Place - Suite 330, Boston, MA | |
20 | 02111-1307, USA. */ | |
d6cf7e68 | 21 | |
22 | ||
94ab4c02 | 23 | /* If secondary reloads are the same for inputs and outputs, define those |
24 | macros here. */ | |
25 | ||
26 | #ifdef SECONDARY_RELOAD_CLASS | |
27 | #define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, X) \ | |
28 | SECONDARY_RELOAD_CLASS (CLASS, MODE, X) | |
29 | #define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, X) \ | |
30 | SECONDARY_RELOAD_CLASS (CLASS, MODE, X) | |
31 | #endif | |
32 | ||
33 | /* If either macro is defined, show that we need secondary reloads. */ | |
34 | #if defined(SECONDARY_INPUT_RELOAD_CLASS) || defined(SECONDARY_OUTPUT_RELOAD_CLASS) | |
35 | #define HAVE_SECONDARY_RELOADS | |
36 | #endif | |
37 | ||
3afef759 | 38 | /* If MEMORY_MOVE_COST isn't defined, give it a default here. */ |
39 | #ifndef MEMORY_MOVE_COST | |
40 | #ifdef HAVE_SECONDARY_RELOADS | |
41 | #define MEMORY_MOVE_COST(MODE,CLASS,IN) \ | |
42 | (4 + memory_move_secondary_cost ((MODE), (CLASS), (IN))) | |
43 | #else | |
44 | #define MEMORY_MOVE_COST(MODE,CLASS,IN) 4 | |
45 | #endif | |
46 | #endif | |
0019492d | 47 | extern int memory_move_secondary_cost PARAMS ((enum machine_mode, enum reg_class, int)); |
3afef759 | 48 | |
d6cf7e68 | 49 | /* Maximum number of reloads we can need. */ |
50 | #define MAX_RELOADS (2 * MAX_RECOG_OPERANDS * (MAX_REGS_PER_ADDRESS + 1)) | |
51 | ||
3483d09b | 52 | /* Encode the usage of a reload. The following codes are supported: |
53 | ||
54 | RELOAD_FOR_INPUT reload of an input operand | |
55 | RELOAD_FOR_OUTPUT likewise, for output | |
56 | RELOAD_FOR_INSN a reload that must not conflict with anything | |
57 | used in the insn, but may conflict with | |
58 | something used before or after the insn | |
59 | RELOAD_FOR_INPUT_ADDRESS reload for parts of the address of an object | |
60 | that is an input reload | |
9e53d777 | 61 | RELOAD_FOR_INPADDR_ADDRESS reload needed for RELOAD_FOR_INPUT_ADDRESS |
62 | RELOAD_FOR_OUTPUT_ADDRESS like RELOAD_FOR INPUT_ADDRESS, for output | |
63 | RELOAD_FOR_OUTADDR_ADDRESS reload needed for RELOAD_FOR_OUTPUT_ADDRESS | |
3483d09b | 64 | RELOAD_FOR_OPERAND_ADDRESS reload for the address of a non-reloaded |
65 | operand; these don't conflict with | |
66 | any other addresses. | |
dd2e3797 | 67 | RELOAD_FOR_OPADDR_ADDR reload needed for RELOAD_FOR_OPERAND_ADDRESS |
68 | reloads; usually secondary reloads | |
3483d09b | 69 | RELOAD_OTHER none of the above, usually multiple uses |
70 | RELOAD_FOR_OTHER_ADDRESS reload for part of the address of an input | |
71 | that is marked RELOAD_OTHER. | |
72 | ||
73 | This used to be "enum reload_when_needed" but some debuggers have trouble | |
74 | with an enum tag and variable of the same name. */ | |
75 | ||
76 | enum reload_type | |
d6cf7e68 | 77 | { |
3483d09b | 78 | RELOAD_FOR_INPUT, RELOAD_FOR_OUTPUT, RELOAD_FOR_INSN, |
9e53d777 | 79 | RELOAD_FOR_INPUT_ADDRESS, RELOAD_FOR_INPADDR_ADDRESS, |
80 | RELOAD_FOR_OUTPUT_ADDRESS, RELOAD_FOR_OUTADDR_ADDRESS, | |
dd2e3797 | 81 | RELOAD_FOR_OPERAND_ADDRESS, RELOAD_FOR_OPADDR_ADDR, |
82 | RELOAD_OTHER, RELOAD_FOR_OTHER_ADDRESS | |
d6cf7e68 | 83 | }; |
84 | ||
d8fc4d0b | 85 | #ifdef GCC_INSN_CODES_H |
48666d2c | 86 | /* Each reload is recorded with a structure like this. */ |
87 | struct reload | |
88 | { | |
89 | /* The value to reload from */ | |
90 | rtx in; | |
91 | /* Where to store reload-reg afterward if nec (often the same as | |
92 | reload_in) */ | |
93 | rtx out; | |
94 | ||
95 | /* The class of registers to reload into. */ | |
96 | enum reg_class class; | |
97 | ||
98 | /* The mode this operand should have when reloaded, on input. */ | |
99 | enum machine_mode inmode; | |
100 | /* The mode this operand should have when reloaded, on output. */ | |
101 | enum machine_mode outmode; | |
102 | ||
13592517 | 103 | /* The mode of the reload register. */ |
6258de1a | 104 | enum machine_mode mode; |
13592517 | 105 | |
106 | /* the largest number of registers this reload will require. */ | |
02e7a332 | 107 | unsigned int nregs; |
13592517 | 108 | |
48666d2c | 109 | /* Positive amount to increment or decrement by if |
110 | reload_in is a PRE_DEC, PRE_INC, POST_DEC, POST_INC. | |
111 | Ignored otherwise (don't assume it is zero). */ | |
112 | int inc; | |
113 | /* A reg for which reload_in is the equivalent. | |
114 | If reload_in is a symbol_ref which came from | |
115 | reg_equiv_constant, then this is the pseudo | |
116 | which has that symbol_ref as equivalent. */ | |
117 | rtx in_reg; | |
118 | rtx out_reg; | |
119 | ||
120 | /* Used in find_reload_regs to record the allocated register. */ | |
121 | int regno; | |
122 | /* This is the register to reload into. If it is zero when `find_reloads' | |
123 | returns, you must find a suitable register in the class specified by | |
124 | reload_reg_class, and store here an rtx for that register with mode from | |
125 | reload_inmode or reload_outmode. */ | |
126 | rtx reg_rtx; | |
127 | /* The operand number being reloaded. This is used to group related reloads | |
128 | and need not always be equal to the actual operand number in the insn, | |
129 | though it current will be; for in-out operands, it is one of the two | |
130 | operand numbers. */ | |
131 | int opnum; | |
132 | ||
133 | /* Gives the reload number of a secondary input reload, when needed; | |
134 | otherwise -1. */ | |
135 | int secondary_in_reload; | |
136 | /* Gives the reload number of a secondary output reload, when needed; | |
137 | otherwise -1. */ | |
138 | int secondary_out_reload; | |
139 | /* If a secondary input reload is required, gives the INSN_CODE that uses the | |
140 | secondary reload as a scratch register, or CODE_FOR_nothing if the | |
141 | secondary reload register is to be an intermediate register. */ | |
142 | enum insn_code secondary_in_icode; | |
143 | /* Likewise, for a secondary output reload. */ | |
144 | enum insn_code secondary_out_icode; | |
145 | ||
146 | /* Classifies reload as needed either for addressing an input reload, | |
147 | addressing an output, for addressing a non-reloaded mem ref, or for | |
148 | unspecified purposes (i.e., more than one of the above). */ | |
149 | enum reload_type when_needed; | |
150 | ||
151 | /* Nonzero for an optional reload. Optional reloads are ignored unless the | |
152 | value is already sitting in a register. */ | |
153 | unsigned int optional:1; | |
154 | /* nonzero if this reload shouldn't be combined with another reload. */ | |
155 | unsigned int nocombine:1; | |
156 | /* Nonzero if this is a secondary register for one or more reloads. */ | |
157 | unsigned int secondary_p:1; | |
158 | /* Nonzero if this reload must use a register not already allocated to a | |
159 | group. */ | |
160 | unsigned int nongroup:1; | |
161 | }; | |
162 | ||
163 | extern struct reload rld[MAX_RELOADS]; | |
164 | extern int n_reloads; | |
165 | #endif | |
d6cf7e68 | 166 | |
167 | extern rtx *reg_equiv_constant; | |
c019aa1a | 168 | extern rtx *reg_equiv_memory_loc; |
d6cf7e68 | 169 | extern rtx *reg_equiv_address; |
170 | extern rtx *reg_equiv_mem; | |
171 | ||
172 | /* All the "earlyclobber" operands of the current insn | |
173 | are recorded here. */ | |
174 | extern int n_earlyclobbers; | |
175 | extern rtx reload_earlyclobbers[MAX_RECOG_OPERANDS]; | |
176 | ||
3483d09b | 177 | /* Save the number of operands. */ |
178 | extern int reload_n_operands; | |
179 | ||
d6cf7e68 | 180 | /* First uid used by insns created by reload in this function. |
181 | Used in find_equiv_reg. */ | |
182 | extern int reload_first_uid; | |
183 | ||
184 | /* Nonzero if indirect addressing is supported when the innermost MEM is | |
185 | of the form (MEM (SYMBOL_REF sym)). It is assumed that the level to | |
186 | which these are valid is the same as spill_indirect_levels, above. */ | |
187 | ||
188 | extern char indirect_symref_ok; | |
189 | ||
190 | /* Nonzero if an address (plus (reg frame_pointer) (reg ...)) is valid. */ | |
191 | extern char double_reg_address_ok; | |
192 | ||
93c7b06e | 193 | extern int num_not_at_initial_offset; |
194 | ||
e94a59c6 | 195 | struct needs |
196 | { | |
197 | /* [0] is normal, [1] is nongroup. */ | |
198 | short regs[2][N_REG_CLASSES]; | |
199 | short groups[N_REG_CLASSES]; | |
200 | }; | |
201 | ||
202 | #if defined SET_HARD_REG_BIT && defined CLEAR_REG_SET | |
203 | /* This structure describes instructions which are relevant for reload. | |
204 | Apart from all regular insns, this also includes CODE_LABELs, since they | |
205 | must be examined for register elimination. */ | |
206 | struct insn_chain | |
207 | { | |
208 | /* Links to the neighbour instructions. */ | |
209 | struct insn_chain *next, *prev; | |
210 | ||
211 | /* Link through a chains set up by calculate_needs_all_insns, containing | |
212 | all insns that need reloading. */ | |
213 | struct insn_chain *next_need_reload; | |
214 | ||
215 | /* The basic block this insn is in. */ | |
216 | int block; | |
217 | /* The rtx of the insn. */ | |
218 | rtx insn; | |
219 | /* Register life information: record all live hard registers, and all | |
a570a59f | 220 | live pseudos that have a hard register. */ |
f62c22a7 | 221 | regset_head live_throughout; |
222 | regset_head dead_or_set; | |
e94a59c6 | 223 | |
fbf51e51 | 224 | /* Copies of the global variables computed by find_reloads. */ |
225 | struct reload *rld; | |
226 | int n_reloads; | |
e94a59c6 | 227 | |
228 | /* Indicates which registers have already been used for spills. */ | |
229 | HARD_REG_SET used_spill_regs; | |
230 | ||
231 | /* Describe the needs for reload registers of this insn. */ | |
232 | struct needs need; | |
233 | ||
234 | /* Nonzero if find_reloads said the insn requires reloading. */ | |
235 | unsigned int need_reload:1; | |
dab171c5 | 236 | /* Nonzero if find_reloads needs to be run during reload_as_needed to |
237 | perform modifications on any operands. */ | |
238 | unsigned int need_operand_change:1; | |
e94a59c6 | 239 | /* Nonzero if eliminate_regs_in_insn said it requires eliminations. */ |
240 | unsigned int need_elim:1; | |
241 | /* Nonzero if this insn was inserted by perform_caller_saves. */ | |
242 | unsigned int is_caller_save_insn:1; | |
243 | }; | |
244 | ||
245 | /* A chain of insn_chain structures to describe all non-note insns in | |
246 | a function. */ | |
247 | extern struct insn_chain *reload_insn_chain; | |
248 | ||
249 | /* Allocate a new insn_chain structure. */ | |
0019492d | 250 | extern struct insn_chain *new_insn_chain PARAMS ((void)); |
e94a59c6 | 251 | |
0019492d | 252 | extern void compute_use_by_pseudos PARAMS ((HARD_REG_SET *, regset)); |
e94a59c6 | 253 | #endif |
254 | ||
3483d09b | 255 | /* Functions from reload.c: */ |
256 | ||
257 | /* Return a memory location that will be used to copy X in mode MODE. | |
258 | If we haven't already made a location for this mode in this insn, | |
259 | call find_reloads_address on the location being returned. */ | |
0019492d | 260 | extern rtx get_secondary_mem PARAMS ((rtx, enum machine_mode, |
3483d09b | 261 | int, enum reload_type)); |
262 | ||
263 | /* Clear any secondary memory locations we've made. */ | |
0019492d | 264 | extern void clear_secondary_mem PARAMS ((void)); |
3483d09b | 265 | |
266 | /* Transfer all replacements that used to be in reload FROM to be in | |
267 | reload TO. */ | |
0019492d | 268 | extern void transfer_replacements PARAMS ((int, int)); |
3483d09b | 269 | |
93c7b06e | 270 | /* IN_RTX is the value loaded by a reload that we now decided to inherit, |
271 | or a subpart of it. If we have any replacements registered for IN_RTX, | |
272 | chancel the reloads that were supposed to load them. | |
273 | Return non-zero if we chanceled any reloads. */ | |
0019492d | 274 | extern int remove_address_replacements PARAMS ((rtx in_rtx)); |
524613c6 | 275 | |
3483d09b | 276 | /* Like rtx_equal_p except that it allows a REG and a SUBREG to match |
277 | if they are the same hard reg, and has special hacks for | |
278 | autoincrement and autodecrement. */ | |
0019492d | 279 | extern int operands_match_p PARAMS ((rtx, rtx)); |
3483d09b | 280 | |
3483d09b | 281 | /* Return 1 if altering OP will not modify the value of CLOBBER. */ |
0019492d | 282 | extern int safe_from_earlyclobber PARAMS ((rtx, rtx)); |
3483d09b | 283 | |
284 | /* Search the body of INSN for values that need reloading and record them | |
285 | with push_reload. REPLACE nonzero means record also where the values occur | |
6e43306c | 286 | so that subst_reloads can be used. */ |
0019492d | 287 | extern int find_reloads PARAMS ((rtx, int, int, int, short *)); |
3483d09b | 288 | |
289 | /* Compute the sum of X and Y, making canonicalizations assumed in an | |
290 | address, namely: sum constant integers, surround the sum of two | |
291 | constants with a CONST, put the constant as the second operand, and | |
292 | group the constant on the outermost sum. */ | |
0019492d | 293 | extern rtx form_sum PARAMS ((rtx, rtx)); |
3483d09b | 294 | |
295 | /* Substitute into the current INSN the registers into which we have reloaded | |
296 | the things that need reloading. */ | |
d3ff0f75 | 297 | extern void subst_reloads PARAMS ((rtx)); |
3483d09b | 298 | |
299 | /* Make a copy of any replacements being done into X and move those copies | |
300 | to locations in Y, a copy of X. We only look at the highest level of | |
301 | the RTL. */ | |
0019492d | 302 | extern void copy_replacements PARAMS ((rtx, rtx)); |
3483d09b | 303 | |
f64bc32a | 304 | /* Change any replacements being done to *X to be done to *Y */ |
0019492d | 305 | extern void move_replacements PARAMS ((rtx *x, rtx *y)); |
f64bc32a | 306 | |
3483d09b | 307 | /* If LOC was scheduled to be replaced by something, return the replacement. |
308 | Otherwise, return *LOC. */ | |
0019492d | 309 | extern rtx find_replacement PARAMS ((rtx *)); |
3483d09b | 310 | |
311 | /* Return nonzero if register in range [REGNO, ENDREGNO) | |
312 | appears either explicitly or implicitly in X | |
313 | other than being stored into. */ | |
02e7a332 | 314 | extern int refers_to_regno_for_reload_p PARAMS ((unsigned int, unsigned int, |
315 | rtx, rtx *)); | |
3483d09b | 316 | |
317 | /* Nonzero if modifying X will affect IN. */ | |
0019492d | 318 | extern int reg_overlap_mentioned_for_reload_p PARAMS ((rtx, rtx)); |
3483d09b | 319 | |
320 | /* Return nonzero if anything in X contains a MEM. Look also for pseudo | |
321 | registers. */ | |
0019492d | 322 | extern int refers_to_mem_for_reload_p PARAMS ((rtx)); |
3483d09b | 323 | |
324 | /* Check the insns before INSN to see if there is a suitable register | |
325 | containing the same value as GOAL. */ | |
0019492d | 326 | extern rtx find_equiv_reg PARAMS ((rtx, rtx, enum reg_class, int, short *, |
3483d09b | 327 | int, enum machine_mode)); |
328 | ||
329 | /* Return 1 if register REGNO is the subject of a clobber in insn INSN. */ | |
ab7883ae | 330 | extern int regno_clobbered_p PARAMS ((unsigned int, rtx, enum machine_mode, |
331 | int)); | |
3483d09b | 332 | |
92c7a85c | 333 | /* Return 1 if X is an operand of an insn that is being earlyclobbered. */ |
0019492d | 334 | int earlyclobber_operand_p PARAMS ((rtx)); |
92c7a85c | 335 | |
3483d09b | 336 | /* Functions in reload1.c: */ |
337 | ||
75eb327c | 338 | extern void reload_cse_regs PARAMS ((rtx)); |
0019492d | 339 | extern int reloads_conflict PARAMS ((int, int)); |
cd03a192 | 340 | |
3483d09b | 341 | /* Initialize the reload pass once per compilation. */ |
0019492d | 342 | extern void init_reload PARAMS ((void)); |
3483d09b | 343 | |
344 | /* The reload pass itself. */ | |
bfd0ee98 | 345 | extern int reload PARAMS ((rtx, int)); |
3483d09b | 346 | |
347 | /* Mark the slots in regs_ever_live for the hard regs | |
348 | used by pseudo-reg number REGNO. */ | |
0019492d | 349 | extern void mark_home_live PARAMS ((int)); |
3483d09b | 350 | |
351 | /* Scan X and replace any eliminable registers (such as fp) with a | |
352 | replacement (such as sp), plus an offset. */ | |
0019492d | 353 | extern rtx eliminate_regs PARAMS ((rtx, enum machine_mode, rtx)); |
3483d09b | 354 | |
8b18605f | 355 | /* Emit code to perform a reload from IN (which may be a reload register) to |
356 | OUT (which may also be a reload register). IN or OUT is from operand | |
357 | OPNUM with reload type TYPE. */ | |
0019492d | 358 | extern rtx gen_reload PARAMS ((rtx, rtx, int, enum reload_type)); |
3483d09b | 359 | |
93c7b06e | 360 | /* Deallocate the reload register used by reload number R. */ |
0019492d | 361 | extern void deallocate_reload_reg PARAMS ((int r)); |
93c7b06e | 362 | |
3483d09b | 363 | /* Functions in caller-save.c: */ |
364 | ||
365 | /* Initialize for caller-save. */ | |
0019492d | 366 | extern void init_caller_save PARAMS ((void)); |
3483d09b | 367 | |
368 | /* Initialize save areas by showing that we haven't allocated any yet. */ | |
0019492d | 369 | extern void init_save_areas PARAMS ((void)); |
3483d09b | 370 | |
371 | /* Allocate save areas for any hard registers that might need saving. */ | |
0019492d | 372 | extern void setup_save_areas PARAMS ((void)); |
3483d09b | 373 | |
374 | /* Find the places where hard regs are live across calls and save them. */ | |
0019492d | 375 | extern void save_call_clobbered_regs PARAMS ((void)); |
d740a1dd | 376 | |
377 | /* Replace (subreg (reg)) with the appropriate (reg) for any operands. */ | |
0019492d | 378 | extern void cleanup_subreg_operands PARAMS ((rtx)); |
bfd0ee98 | 379 | |
380 | /* Debugging support. */ | |
381 | extern void debug_reload_to_stream PARAMS ((FILE *)); | |
382 | extern void debug_reload PARAMS ((void)); |