Mercurial > hg > CbC > CbC_gcc
comparison gcc/reload.h @ 0:a06113de4d67
first commit
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2009 14:47:48 +0900 |
parents | |
children | 77e2b8dfacca |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:a06113de4d67 |
---|---|
1 /* Communication between reload.c, reload1.c and the rest of compiler. | |
2 Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1997, 1998, 1999, | |
3 2000, 2001, 2003, 2004, 2007, 2008 Free Software Foundation, Inc. | |
4 | |
5 This file is part of GCC. | |
6 | |
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 3, or (at your option) any later | |
10 version. | |
11 | |
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. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with GCC; see the file COPYING3. If not see | |
19 <http://www.gnu.org/licenses/>. */ | |
20 | |
21 | |
22 /* If secondary reloads are the same for inputs and outputs, define those | |
23 macros here. */ | |
24 | |
25 #ifdef SECONDARY_RELOAD_CLASS | |
26 #define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, X) \ | |
27 SECONDARY_RELOAD_CLASS (CLASS, MODE, X) | |
28 #define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, X) \ | |
29 SECONDARY_RELOAD_CLASS (CLASS, MODE, X) | |
30 #endif | |
31 | |
32 /* If MEMORY_MOVE_COST isn't defined, give it a default here. */ | |
33 #ifndef MEMORY_MOVE_COST | |
34 #define MEMORY_MOVE_COST(MODE,CLASS,IN) \ | |
35 (4 + memory_move_secondary_cost ((MODE), (CLASS), (IN))) | |
36 #endif | |
37 extern int memory_move_secondary_cost (enum machine_mode, enum reg_class, int); | |
38 | |
39 /* Maximum number of reloads we can need. */ | |
40 #define MAX_RELOADS (2 * MAX_RECOG_OPERANDS * (MAX_REGS_PER_ADDRESS + 1)) | |
41 | |
42 /* Encode the usage of a reload. The following codes are supported: | |
43 | |
44 RELOAD_FOR_INPUT reload of an input operand | |
45 RELOAD_FOR_OUTPUT likewise, for output | |
46 RELOAD_FOR_INSN a reload that must not conflict with anything | |
47 used in the insn, but may conflict with | |
48 something used before or after the insn | |
49 RELOAD_FOR_INPUT_ADDRESS reload for parts of the address of an object | |
50 that is an input reload | |
51 RELOAD_FOR_INPADDR_ADDRESS reload needed for RELOAD_FOR_INPUT_ADDRESS | |
52 RELOAD_FOR_OUTPUT_ADDRESS like RELOAD_FOR INPUT_ADDRESS, for output | |
53 RELOAD_FOR_OUTADDR_ADDRESS reload needed for RELOAD_FOR_OUTPUT_ADDRESS | |
54 RELOAD_FOR_OPERAND_ADDRESS reload for the address of a non-reloaded | |
55 operand; these don't conflict with | |
56 any other addresses. | |
57 RELOAD_FOR_OPADDR_ADDR reload needed for RELOAD_FOR_OPERAND_ADDRESS | |
58 reloads; usually secondary reloads | |
59 RELOAD_OTHER none of the above, usually multiple uses | |
60 RELOAD_FOR_OTHER_ADDRESS reload for part of the address of an input | |
61 that is marked RELOAD_OTHER. | |
62 | |
63 This used to be "enum reload_when_needed" but some debuggers have trouble | |
64 with an enum tag and variable of the same name. */ | |
65 | |
66 enum reload_type | |
67 { | |
68 RELOAD_FOR_INPUT, RELOAD_FOR_OUTPUT, RELOAD_FOR_INSN, | |
69 RELOAD_FOR_INPUT_ADDRESS, RELOAD_FOR_INPADDR_ADDRESS, | |
70 RELOAD_FOR_OUTPUT_ADDRESS, RELOAD_FOR_OUTADDR_ADDRESS, | |
71 RELOAD_FOR_OPERAND_ADDRESS, RELOAD_FOR_OPADDR_ADDR, | |
72 RELOAD_OTHER, RELOAD_FOR_OTHER_ADDRESS | |
73 }; | |
74 | |
75 #ifdef GCC_INSN_CODES_H | |
76 /* Each reload is recorded with a structure like this. */ | |
77 struct reload | |
78 { | |
79 /* The value to reload from */ | |
80 rtx in; | |
81 /* Where to store reload-reg afterward if nec (often the same as | |
82 reload_in) */ | |
83 rtx out; | |
84 | |
85 /* The class of registers to reload into. */ | |
86 enum reg_class rclass; | |
87 | |
88 /* The mode this operand should have when reloaded, on input. */ | |
89 enum machine_mode inmode; | |
90 /* The mode this operand should have when reloaded, on output. */ | |
91 enum machine_mode outmode; | |
92 | |
93 /* The mode of the reload register. */ | |
94 enum machine_mode mode; | |
95 | |
96 /* the largest number of registers this reload will require. */ | |
97 unsigned int nregs; | |
98 | |
99 /* Positive amount to increment or decrement by if | |
100 reload_in is a PRE_DEC, PRE_INC, POST_DEC, POST_INC. | |
101 Ignored otherwise (don't assume it is zero). */ | |
102 int inc; | |
103 /* A reg for which reload_in is the equivalent. | |
104 If reload_in is a symbol_ref which came from | |
105 reg_equiv_constant, then this is the pseudo | |
106 which has that symbol_ref as equivalent. */ | |
107 rtx in_reg; | |
108 rtx out_reg; | |
109 | |
110 /* Used in find_reload_regs to record the allocated register. */ | |
111 int regno; | |
112 /* This is the register to reload into. If it is zero when `find_reloads' | |
113 returns, you must find a suitable register in the class specified by | |
114 reload_reg_class, and store here an rtx for that register with mode from | |
115 reload_inmode or reload_outmode. */ | |
116 rtx reg_rtx; | |
117 /* The operand number being reloaded. This is used to group related reloads | |
118 and need not always be equal to the actual operand number in the insn, | |
119 though it current will be; for in-out operands, it is one of the two | |
120 operand numbers. */ | |
121 int opnum; | |
122 | |
123 /* Gives the reload number of a secondary input reload, when needed; | |
124 otherwise -1. */ | |
125 int secondary_in_reload; | |
126 /* Gives the reload number of a secondary output reload, when needed; | |
127 otherwise -1. */ | |
128 int secondary_out_reload; | |
129 /* If a secondary input reload is required, gives the INSN_CODE that uses the | |
130 secondary reload as a scratch register, or CODE_FOR_nothing if the | |
131 secondary reload register is to be an intermediate register. */ | |
132 enum insn_code secondary_in_icode; | |
133 /* Likewise, for a secondary output reload. */ | |
134 enum insn_code secondary_out_icode; | |
135 | |
136 /* Classifies reload as needed either for addressing an input reload, | |
137 addressing an output, for addressing a non-reloaded mem ref, or for | |
138 unspecified purposes (i.e., more than one of the above). */ | |
139 enum reload_type when_needed; | |
140 | |
141 /* Nonzero for an optional reload. Optional reloads are ignored unless the | |
142 value is already sitting in a register. */ | |
143 unsigned int optional:1; | |
144 /* nonzero if this reload shouldn't be combined with another reload. */ | |
145 unsigned int nocombine:1; | |
146 /* Nonzero if this is a secondary register for one or more reloads. */ | |
147 unsigned int secondary_p:1; | |
148 /* Nonzero if this reload must use a register not already allocated to a | |
149 group. */ | |
150 unsigned int nongroup:1; | |
151 }; | |
152 | |
153 extern struct reload rld[MAX_RELOADS]; | |
154 extern int n_reloads; | |
155 #endif | |
156 | |
157 extern GTY (()) VEC(rtx,gc) *reg_equiv_memory_loc_vec; | |
158 extern rtx *reg_equiv_constant; | |
159 extern rtx *reg_equiv_invariant; | |
160 extern rtx *reg_equiv_memory_loc; | |
161 extern rtx *reg_equiv_address; | |
162 extern rtx *reg_equiv_mem; | |
163 extern rtx *reg_equiv_alt_mem_list; | |
164 | |
165 /* Element N is the list of insns that initialized reg N from its equivalent | |
166 constant or memory slot. */ | |
167 extern GTY((length("reg_equiv_init_size"))) rtx *reg_equiv_init; | |
168 | |
169 /* The size of the previous array, for GC purposes. */ | |
170 extern GTY(()) int reg_equiv_init_size; | |
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 | |
177 /* Save the number of operands. */ | |
178 extern int reload_n_operands; | |
179 | |
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 | |
193 extern int num_not_at_initial_offset; | |
194 | |
195 #if defined SET_HARD_REG_BIT && defined CLEAR_REG_SET | |
196 /* This structure describes instructions which are relevant for reload. | |
197 Apart from all regular insns, this also includes CODE_LABELs, since they | |
198 must be examined for register elimination. */ | |
199 struct insn_chain | |
200 { | |
201 /* Links to the neighbor instructions. */ | |
202 struct insn_chain *next, *prev; | |
203 | |
204 /* Link through a chains set up by calculate_needs_all_insns, containing | |
205 all insns that need reloading. */ | |
206 struct insn_chain *next_need_reload; | |
207 | |
208 /* The rtx of the insn. */ | |
209 rtx insn; | |
210 | |
211 /* The basic block this insn is in. */ | |
212 int block; | |
213 | |
214 /* Nonzero if find_reloads said the insn requires reloading. */ | |
215 unsigned int need_reload:1; | |
216 /* Nonzero if find_reloads needs to be run during reload_as_needed to | |
217 perform modifications on any operands. */ | |
218 unsigned int need_operand_change:1; | |
219 /* Nonzero if eliminate_regs_in_insn said it requires eliminations. */ | |
220 unsigned int need_elim:1; | |
221 /* Nonzero if this insn was inserted by perform_caller_saves. */ | |
222 unsigned int is_caller_save_insn:1; | |
223 | |
224 /* Register life information: record all live hard registers, and | |
225 all live pseudos that have a hard register. This set also | |
226 contains pseudos spilled by IRA. */ | |
227 regset_head live_throughout; | |
228 regset_head dead_or_set; | |
229 | |
230 /* Copies of the global variables computed by find_reloads. */ | |
231 struct reload *rld; | |
232 int n_reloads; | |
233 | |
234 /* Indicates which registers have already been used for spills. */ | |
235 HARD_REG_SET used_spill_regs; | |
236 }; | |
237 | |
238 /* A chain of insn_chain structures to describe all non-note insns in | |
239 a function. */ | |
240 extern struct insn_chain *reload_insn_chain; | |
241 | |
242 /* Allocate a new insn_chain structure. */ | |
243 extern struct insn_chain *new_insn_chain (void); | |
244 | |
245 extern void compute_use_by_pseudos (HARD_REG_SET *, regset); | |
246 #endif | |
247 | |
248 /* Functions from reload.c: */ | |
249 | |
250 extern enum reg_class secondary_reload_class (bool, enum reg_class, | |
251 enum machine_mode, rtx); | |
252 | |
253 #ifdef GCC_INSN_CODES_H | |
254 extern enum reg_class scratch_reload_class (enum insn_code); | |
255 #endif | |
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. */ | |
260 extern rtx get_secondary_mem (rtx, enum machine_mode, int, enum reload_type); | |
261 | |
262 /* Clear any secondary memory locations we've made. */ | |
263 extern void clear_secondary_mem (void); | |
264 | |
265 /* Transfer all replacements that used to be in reload FROM to be in | |
266 reload TO. */ | |
267 extern void transfer_replacements (int, int); | |
268 | |
269 /* IN_RTX is the value loaded by a reload that we now decided to inherit, | |
270 or a subpart of it. If we have any replacements registered for IN_RTX, | |
271 cancel the reloads that were supposed to load them. | |
272 Return nonzero if we canceled any reloads. */ | |
273 extern int remove_address_replacements (rtx in_rtx); | |
274 | |
275 /* Like rtx_equal_p except that it allows a REG and a SUBREG to match | |
276 if they are the same hard reg, and has special hacks for | |
277 autoincrement and autodecrement. */ | |
278 extern int operands_match_p (rtx, rtx); | |
279 | |
280 /* Return 1 if altering OP will not modify the value of CLOBBER. */ | |
281 extern int safe_from_earlyclobber (rtx, rtx); | |
282 | |
283 /* Search the body of INSN for values that need reloading and record them | |
284 with push_reload. REPLACE nonzero means record also where the values occur | |
285 so that subst_reloads can be used. */ | |
286 extern int find_reloads (rtx, int, int, int, short *); | |
287 | |
288 /* Compute the sum of X and Y, making canonicalizations assumed in an | |
289 address, namely: sum constant integers, surround the sum of two | |
290 constants with a CONST, put the constant as the second operand, and | |
291 group the constant on the outermost sum. */ | |
292 extern rtx form_sum (rtx, rtx); | |
293 | |
294 /* Substitute into the current INSN the registers into which we have reloaded | |
295 the things that need reloading. */ | |
296 extern void subst_reloads (rtx); | |
297 | |
298 /* Make a copy of any replacements being done into X and move those copies | |
299 to locations in Y, a copy of X. We only look at the highest level of | |
300 the RTL. */ | |
301 extern void copy_replacements (rtx, rtx); | |
302 | |
303 /* Change any replacements being done to *X to be done to *Y */ | |
304 extern void move_replacements (rtx *x, rtx *y); | |
305 | |
306 /* If LOC was scheduled to be replaced by something, return the replacement. | |
307 Otherwise, return *LOC. */ | |
308 extern rtx find_replacement (rtx *); | |
309 | |
310 /* Nonzero if modifying X will affect IN. */ | |
311 extern int reg_overlap_mentioned_for_reload_p (rtx, rtx); | |
312 | |
313 /* Check the insns before INSN to see if there is a suitable register | |
314 containing the same value as GOAL. */ | |
315 extern rtx find_equiv_reg (rtx, rtx, enum reg_class, int, short *, | |
316 int, enum machine_mode); | |
317 | |
318 /* Return 1 if register REGNO is the subject of a clobber in insn INSN. */ | |
319 extern int regno_clobbered_p (unsigned int, rtx, enum machine_mode, int); | |
320 | |
321 /* Return 1 if X is an operand of an insn that is being earlyclobbered. */ | |
322 extern int earlyclobber_operand_p (rtx); | |
323 | |
324 /* Record one reload that needs to be performed. */ | |
325 extern int push_reload (rtx, rtx, rtx *, rtx *, enum reg_class, | |
326 enum machine_mode, enum machine_mode, | |
327 int, int, int, enum reload_type); | |
328 | |
329 /* Functions in postreload.c: */ | |
330 extern void reload_cse_regs (rtx); | |
331 | |
332 /* Functions in reload1.c: */ | |
333 | |
334 /* Initialize the reload pass once per compilation. */ | |
335 extern void init_reload (void); | |
336 | |
337 /* The reload pass itself. */ | |
338 extern int reload (rtx, int); | |
339 | |
340 /* Mark the slots in regs_ever_live for the hard regs | |
341 used by pseudo-reg number REGNO. */ | |
342 extern void mark_home_live (int); | |
343 | |
344 /* Scan X and replace any eliminable registers (such as fp) with a | |
345 replacement (such as sp), plus an offset. */ | |
346 extern rtx eliminate_regs (rtx, enum machine_mode, rtx); | |
347 extern bool elimination_target_reg_p (rtx); | |
348 | |
349 /* Deallocate the reload register used by reload number R. */ | |
350 extern void deallocate_reload_reg (int r); | |
351 | |
352 /* Functions in caller-save.c: */ | |
353 | |
354 /* Initialize for caller-save. */ | |
355 extern void init_caller_save (void); | |
356 | |
357 /* Initialize save areas by showing that we haven't allocated any yet. */ | |
358 extern void init_save_areas (void); | |
359 | |
360 /* Allocate save areas for any hard registers that might need saving. */ | |
361 extern void setup_save_areas (void); | |
362 | |
363 /* Find the places where hard regs are live across calls and save them. */ | |
364 extern void save_call_clobbered_regs (void); | |
365 | |
366 /* Replace (subreg (reg)) with the appropriate (reg) for any operands. */ | |
367 extern void cleanup_subreg_operands (rtx); | |
368 | |
369 /* Debugging support. */ | |
370 extern void debug_reload_to_stream (FILE *); | |
371 extern void debug_reload (void); | |
372 | |
373 /* Compute the actual register we should reload to, in case we're | |
374 reloading to/from a register that is wider than a word. */ | |
375 extern rtx reload_adjust_reg_for_mode (rtx, enum machine_mode); |