OSDN Git Service

gcc/fortran:
[pf3gnuchains/gcc-fork.git] / gcc / regs.h
1 /* Define per-register tables for data flow info and register allocation.
2    Copyright (C) 1987, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2003, 2004, 2005, 2006, 2007 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 2, 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 COPYING.  If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, USA.  */
21
22 #ifndef GCC_REGS_H
23 #define GCC_REGS_H
24
25 #include "varray.h"
26 #include "obstack.h"
27 #include "hard-reg-set.h"
28 #include "basic-block.h"
29
30 #define REG_BYTES(R) mode_size[(int) GET_MODE (R)]
31
32 /* When you only have the mode of a pseudo register before it has a hard
33    register chosen for it, this reports the size of each hard register
34    a pseudo in such a mode would get allocated to.  A target may
35    override this.  */
36
37 #ifndef REGMODE_NATURAL_SIZE
38 #define REGMODE_NATURAL_SIZE(MODE)      UNITS_PER_WORD
39 #endif
40
41 #ifndef SMALL_REGISTER_CLASSES
42 #define SMALL_REGISTER_CLASSES 0
43 #endif
44
45 /* Maximum register number used in this function, plus one.  */
46
47 extern int max_regno;
48
49 /* REG_N_REFS and REG_N_SETS are initialized by a call to
50    regstat_init_n_sets_and_refs from the current values of
51    DF_REG_DEF_COUNT and DF_REG_USE_COUNT.  REG_N_REFS and REG_N_SETS
52    should only be used if a pass need to change these values in some
53    magical way or or the pass needs to have accurate values for these
54    and is not using incremental df scanning.
55
56    At the end of a pass that uses REG_N_REFS and REG_N_SETS, a call
57    should be made to regstat_free_n_sets_and_refs.  
58
59    Local alloc seems to play pretty loose with these values.
60    REG_N_REFS is set to 0 if the register is used in an asm.
61    Furthermore, local_alloc calls regclass to hack both REG_N_REFS and
62    REG_N_SETS for three address insns.  Other passes seem to have
63    other special values.  */
64
65
66
67 /* Structure to hold values for REG_N_SETS (i) and REG_N_REFS (i). */
68
69 struct regstat_n_sets_and_refs_t
70 {
71   int sets;                     /* # of times (REG n) is set */
72   int refs;                     /* # of times (REG n) is used or set */
73 };
74
75 extern struct regstat_n_sets_and_refs_t *regstat_n_sets_and_refs;
76
77 /* Indexed by n, gives number of times (REG n) is used or set.  */
78 static inline int
79 REG_N_REFS(int regno)
80 {
81   return regstat_n_sets_and_refs[regno].refs;
82 }
83
84 /* Indexed by n, gives number of times (REG n) is used or set.  */
85 #define SET_REG_N_REFS(N,V) (regstat_n_sets_and_refs[N].refs = V)
86 #define INC_REG_N_REFS(N,V) (regstat_n_sets_and_refs[N].refs += V)
87
88 /* Indexed by n, gives number of times (REG n) is set.  */
89 static inline int
90 REG_N_SETS (int regno)
91 {
92   return regstat_n_sets_and_refs[regno].sets;
93 }
94
95 /* Indexed by n, gives number of times (REG n) is set.  */
96 #define SET_REG_N_SETS(N,V) (regstat_n_sets_and_refs[N].sets = V)
97 #define INC_REG_N_SETS(N,V) (regstat_n_sets_and_refs[N].sets += V)
98
99
100 /* Functions defined in reg-stat.c.  */
101 extern void regstat_init_n_sets_and_refs (void);
102 extern void regstat_free_n_sets_and_refs (void);
103 extern void regstat_compute_ri (void);
104 extern void regstat_free_ri (void);
105 extern bitmap regstat_get_setjmp_crosses (void);
106 extern void regstat_compute_calls_crossed (void);
107 extern void regstat_free_calls_crossed (void);
108
109
110 /* Register information indexed by register number.  This structure is
111    initialized by calling regstat_compute_ri and is destroyed by
112    calling regstat_free_ri.  */
113 struct reg_info_t
114 {
115   int freq;                     /* # estimated frequency (REG n) is used or set */
116   int deaths;                   /* # of times (REG n) dies */
117   int live_length;              /* # of instructions (REG n) is live */
118   int calls_crossed;            /* # of calls (REG n) is live across */
119   int throw_calls_crossed;      /* # of calls that may throw (REG n) is live across */
120   int basic_block;              /* # of basic blocks (REG n) is used in */
121 };
122
123 extern struct reg_info_t *reg_info_p;
124
125 /* The number allocated elements of reg_info_p.  */
126 extern size_t reg_info_p_size;
127
128 /* Estimate frequency of references to register N.  */
129
130 #define REG_FREQ(N) (reg_info_p[N].freq)
131
132 /* The weights for each insn varries from 0 to REG_FREQ_BASE.
133    This constant does not need to be high, as in infrequently executed
134    regions we want to count instructions equivalently to optimize for
135    size instead of speed.  */
136 #define REG_FREQ_MAX 1000
137
138 /* Compute register frequency from the BB frequency.  When optimizing for size,
139    or profile driven feedback is available and the function is never executed,
140    frequency is always equivalent.  Otherwise rescale the basic block
141    frequency.  */
142 #define REG_FREQ_FROM_BB(bb) (optimize_size                                   \
143                               || (flag_branch_probabilities                   \
144                                   && !ENTRY_BLOCK_PTR->count)                 \
145                               ? REG_FREQ_MAX                                  \
146                               : ((bb)->frequency * REG_FREQ_MAX / BB_FREQ_MAX)\
147                               ? ((bb)->frequency * REG_FREQ_MAX / BB_FREQ_MAX)\
148                               : 1)
149
150 /* Indexed by N, gives number of insns in which register N dies.
151    Note that if register N is live around loops, it can die
152    in transitions between basic blocks, and that is not counted here.
153    So this is only a reliable indicator of how many regions of life there are
154    for registers that are contained in one basic block.  */
155
156 #define REG_N_DEATHS(N) (reg_info_p[N].deaths)
157
158 /* Get the number of consecutive words required to hold pseudo-reg N.  */
159
160 #define PSEUDO_REGNO_SIZE(N) \
161   ((GET_MODE_SIZE (PSEUDO_REGNO_MODE (N)) + UNITS_PER_WORD - 1)         \
162    / UNITS_PER_WORD)
163
164 /* Get the number of bytes required to hold pseudo-reg N.  */
165
166 #define PSEUDO_REGNO_BYTES(N) \
167   GET_MODE_SIZE (PSEUDO_REGNO_MODE (N))
168
169 /* Get the machine mode of pseudo-reg N.  */
170
171 #define PSEUDO_REGNO_MODE(N) GET_MODE (regno_reg_rtx[N])
172
173 /* Indexed by N, gives number of CALL_INSNS across which (REG n) is live.  */
174
175 #define REG_N_CALLS_CROSSED(N)  (reg_info_p[N].calls_crossed)
176
177 /* Indexed by N, gives number of CALL_INSNS that may throw, across which
178    (REG n) is live.  */
179
180 #define REG_N_THROWING_CALLS_CROSSED(N) (reg_info_p[N].throw_calls_crossed)
181
182 /* Total number of instructions at which (REG n) is live.  The larger
183    this is, the less priority (REG n) gets for allocation in a hard
184    register (in global-alloc).  This is set in df-problems.c whenever
185    register info is requested and remains valid for the rest of the
186    compilation of the function; it is used to control register
187    allocation.
188
189    local-alloc.c may alter this number to change the priority.
190
191    Negative values are special.
192    -1 is used to mark a pseudo reg which has a constant or memory equivalent
193    and is used infrequently enough that it should not get a hard register.
194    -2 is used to mark a pseudo reg for a parameter, when a frame pointer
195    is not required.  global.c makes an allocno for this but does
196    not try to assign a hard register to it.  */
197
198 #define REG_LIVE_LENGTH(N)  (reg_info_p[N].live_length)
199
200 /* Indexed by n, gives number of basic block that  (REG n) is used in.
201    If the value is REG_BLOCK_GLOBAL (-1),
202    it means (REG n) is used in more than one basic block.
203    REG_BLOCK_UNKNOWN (0) means it hasn't been seen yet so we don't know.
204    This information remains valid for the rest of the compilation
205    of the current function; it is used to control register allocation.  */
206
207 #define REG_BLOCK_UNKNOWN 0
208 #define REG_BLOCK_GLOBAL -1
209
210 #define REG_BASIC_BLOCK(N) (reg_info_p[N].basic_block)
211
212 /* Vector of substitutions of register numbers,
213    used to map pseudo regs into hardware regs.
214
215    This can't be folded into reg_n_info without changing all of the
216    machine dependent directories, since the reload functions
217    in the machine dependent files access it.  */
218
219 extern short *reg_renumber;
220
221 /* Vector indexed by machine mode saying whether there are regs of that mode.  */
222
223 extern bool have_regs_of_mode [MAX_MACHINE_MODE];
224
225 /* For each hard register, the widest mode object that it can contain.
226    This will be a MODE_INT mode if the register can hold integers.  Otherwise
227    it will be a MODE_FLOAT or a MODE_CC mode, whichever is valid for the
228    register.  */
229
230 extern enum machine_mode reg_raw_mode[FIRST_PSEUDO_REGISTER];
231
232 /* Flag set by local-alloc or global-alloc if they decide to allocate
233    something in a call-clobbered register.  */
234
235 extern int caller_save_needed;
236
237 /* Predicate to decide whether to give a hard reg to a pseudo which
238    is referenced REFS times and would need to be saved and restored
239    around a call CALLS times.  */
240
241 #ifndef CALLER_SAVE_PROFITABLE
242 #define CALLER_SAVE_PROFITABLE(REFS, CALLS)  (4 * (CALLS) < (REFS))
243 #endif
244
245 /* On most machines a register class is likely to be spilled if it
246    only has one register.  */
247 #ifndef CLASS_LIKELY_SPILLED_P
248 #define CLASS_LIKELY_SPILLED_P(CLASS) (reg_class_size[(int) (CLASS)] == 1)
249 #endif
250
251 /* Select a register mode required for caller save of hard regno REGNO.  */
252 #ifndef HARD_REGNO_CALLER_SAVE_MODE
253 #define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) \
254   choose_hard_reg_mode (REGNO, NREGS, false)
255 #endif
256
257 /* Registers that get partially clobbered by a call in a given mode.
258    These must not be call used registers.  */
259 #ifndef HARD_REGNO_CALL_PART_CLOBBERED
260 #define HARD_REGNO_CALL_PART_CLOBBERED(REGNO, MODE) 0
261 #endif
262
263 /* Specify number of hard registers given machine mode occupy.  */
264 extern unsigned char hard_regno_nregs[FIRST_PSEUDO_REGISTER][MAX_MACHINE_MODE];
265
266 /* Return an exclusive upper bound on the registers occupied by hard
267    register (reg:MODE REGNO).  */
268
269 static inline unsigned int
270 end_hard_regno (enum machine_mode mode, unsigned int regno)
271 {
272   return regno + hard_regno_nregs[regno][(int) mode];
273 }
274
275 /* Likewise for hard register X.  */
276
277 #define END_HARD_REGNO(X) end_hard_regno (GET_MODE (X), REGNO (X))
278
279 /* Likewise for hard or pseudo register X.  */
280
281 #define END_REGNO(X) (HARD_REGISTER_P (X) ? END_HARD_REGNO (X) : REGNO (X) + 1)
282
283 /* Add to REGS all the registers required to store a value of mode MODE
284    in register REGNO.  */
285
286 static inline void
287 add_to_hard_reg_set (HARD_REG_SET *regs, enum machine_mode mode,
288                      unsigned int regno)
289 {
290   unsigned int end_regno;
291
292   end_regno = end_hard_regno (mode, regno);
293   do
294     SET_HARD_REG_BIT (*regs, regno);
295   while (++regno < end_regno);
296 }
297
298 /* Likewise, but remove the registers.  */
299
300 static inline void
301 remove_from_hard_reg_set (HARD_REG_SET *regs, enum machine_mode mode,
302                           unsigned int regno)
303 {
304   unsigned int end_regno;
305
306   end_regno = end_hard_regno (mode, regno);
307   do
308     CLEAR_HARD_REG_BIT (*regs, regno);
309   while (++regno < end_regno);
310 }
311
312 /* Return true if REGS contains the whole of (reg:MODE REGNO).  */
313
314 static inline bool
315 in_hard_reg_set_p (const HARD_REG_SET regs, enum machine_mode mode,
316                    unsigned int regno)
317 {
318   unsigned int end_regno;
319
320   if (!TEST_HARD_REG_BIT (regs, regno))
321     return false;
322
323   end_regno = end_hard_regno (mode, regno);
324   while (++regno < end_regno)
325     if (!TEST_HARD_REG_BIT (regs, regno))
326       return false;
327
328   return true;
329 }
330
331 /* Return true if (reg:MODE REGNO) includes an element of REGS.  */
332
333 static inline bool
334 overlaps_hard_reg_set_p (const HARD_REG_SET regs, enum machine_mode mode,
335                          unsigned int regno)
336 {
337   unsigned int end_regno;
338
339   if (TEST_HARD_REG_BIT (regs, regno))
340     return true;
341
342   end_regno = end_hard_regno (mode, regno);
343   while (++regno < end_regno)
344     if (TEST_HARD_REG_BIT (regs, regno))
345       return true;
346
347   return false;
348 }
349
350 #endif /* GCC_REGS_H */