ira-int.h revision 1.6 1 1.1 mrg /* Integrated Register Allocator (IRA) intercommunication header file.
2 1.5 mrg Copyright (C) 2006-2015 Free Software Foundation, Inc.
3 1.1 mrg Contributed by Vladimir Makarov <vmakarov (at) redhat.com>.
4 1.1 mrg
5 1.1 mrg This file is part of GCC.
6 1.1 mrg
7 1.1 mrg GCC is free software; you can redistribute it and/or modify it under
8 1.1 mrg the terms of the GNU General Public License as published by the Free
9 1.1 mrg Software Foundation; either version 3, or (at your option) any later
10 1.1 mrg version.
11 1.1 mrg
12 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 1.1 mrg for more details.
16 1.1 mrg
17 1.1 mrg You should have received a copy of the GNU General Public License
18 1.1 mrg along with GCC; see the file COPYING3. If not see
19 1.1 mrg <http://www.gnu.org/licenses/>. */
20 1.1 mrg
21 1.5 mrg #ifndef GCC_IRA_INT_H
22 1.5 mrg #define GCC_IRA_INT_H
23 1.5 mrg
24 1.1 mrg #include "cfgloop.h"
25 1.1 mrg #include "ira.h"
26 1.1 mrg #include "alloc-pool.h"
27 1.1 mrg
28 1.1 mrg /* To provide consistency in naming, all IRA external variables,
29 1.1 mrg functions, common typedefs start with prefix ira_. */
30 1.1 mrg
31 1.1 mrg #ifdef ENABLE_CHECKING
32 1.1 mrg #define ENABLE_IRA_CHECKING
33 1.1 mrg #endif
34 1.1 mrg
35 1.1 mrg #ifdef ENABLE_IRA_CHECKING
36 1.1 mrg #define ira_assert(c) gcc_assert (c)
37 1.1 mrg #else
38 1.1 mrg /* Always define and include C, so that warnings for empty body in an
39 1.5 mrg 'if' statement and unused variable do not occur. */
40 1.1 mrg #define ira_assert(c) ((void)(0 && (c)))
41 1.1 mrg #endif
42 1.1 mrg
43 1.1 mrg /* Compute register frequency from edge frequency FREQ. It is
44 1.1 mrg analogous to REG_FREQ_FROM_BB. When optimizing for size, or
45 1.1 mrg profile driven feedback is available and the function is never
46 1.1 mrg executed, frequency is always equivalent. Otherwise rescale the
47 1.1 mrg edge frequency. */
48 1.5 mrg #define REG_FREQ_FROM_EDGE_FREQ(freq) \
49 1.5 mrg (optimize_function_for_size_p (cfun) \
50 1.5 mrg ? REG_FREQ_MAX : (freq * REG_FREQ_MAX / BB_FREQ_MAX) \
51 1.1 mrg ? (freq * REG_FREQ_MAX / BB_FREQ_MAX) : 1)
52 1.1 mrg
53 1.1 mrg /* A modified value of flag `-fira-verbose' used internally. */
54 1.1 mrg extern int internal_flag_ira_verbose;
55 1.1 mrg
56 1.1 mrg /* Dump file of the allocator if it is not NULL. */
57 1.1 mrg extern FILE *ira_dump_file;
58 1.1 mrg
59 1.1 mrg /* Typedefs for pointers to allocno live range, allocno, and copy of
60 1.1 mrg allocnos. */
61 1.3 mrg typedef struct live_range *live_range_t;
62 1.1 mrg typedef struct ira_allocno *ira_allocno_t;
63 1.5 mrg typedef struct ira_allocno_pref *ira_pref_t;
64 1.1 mrg typedef struct ira_allocno_copy *ira_copy_t;
65 1.3 mrg typedef struct ira_object *ira_object_t;
66 1.1 mrg
67 1.1 mrg /* Definition of vector of allocnos and copies. */
68 1.1 mrg
69 1.1 mrg /* Typedef for pointer to the subsequent structure. */
70 1.1 mrg typedef struct ira_loop_tree_node *ira_loop_tree_node_t;
71 1.1 mrg
72 1.3 mrg typedef unsigned short move_table[N_REG_CLASSES];
73 1.3 mrg
74 1.1 mrg /* In general case, IRA is a regional allocator. The regions are
75 1.1 mrg nested and form a tree. Currently regions are natural loops. The
76 1.1 mrg following structure describes loop tree node (representing basic
77 1.1 mrg block or loop). We need such tree because the loop tree from
78 1.1 mrg cfgloop.h is not convenient for the optimization: basic blocks are
79 1.1 mrg not a part of the tree from cfgloop.h. We also use the nodes for
80 1.1 mrg storing additional information about basic blocks/loops for the
81 1.1 mrg register allocation purposes. */
82 1.1 mrg struct ira_loop_tree_node
83 1.1 mrg {
84 1.1 mrg /* The node represents basic block if children == NULL. */
85 1.1 mrg basic_block bb; /* NULL for loop. */
86 1.3 mrg /* NULL for BB or for loop tree root if we did not build CFG loop tree. */
87 1.3 mrg struct loop *loop;
88 1.1 mrg /* NEXT/SUBLOOP_NEXT is the next node/loop-node of the same parent.
89 1.1 mrg SUBLOOP_NEXT is always NULL for BBs. */
90 1.1 mrg ira_loop_tree_node_t subloop_next, next;
91 1.1 mrg /* CHILDREN/SUBLOOPS is the first node/loop-node immediately inside
92 1.1 mrg the node. They are NULL for BBs. */
93 1.1 mrg ira_loop_tree_node_t subloops, children;
94 1.1 mrg /* The node immediately containing given node. */
95 1.1 mrg ira_loop_tree_node_t parent;
96 1.1 mrg
97 1.1 mrg /* Loop level in range [0, ira_loop_tree_height). */
98 1.1 mrg int level;
99 1.1 mrg
100 1.1 mrg /* All the following members are defined only for nodes representing
101 1.1 mrg loops. */
102 1.1 mrg
103 1.3 mrg /* The loop number from CFG loop tree. The root number is 0. */
104 1.3 mrg int loop_num;
105 1.3 mrg
106 1.1 mrg /* True if the loop was marked for removal from the register
107 1.1 mrg allocation. */
108 1.1 mrg bool to_remove_p;
109 1.1 mrg
110 1.1 mrg /* Allocnos in the loop corresponding to their regnos. If it is
111 1.1 mrg NULL the loop does not form a separate register allocation region
112 1.1 mrg (e.g. because it has abnormal enter/exit edges and we can not put
113 1.1 mrg code for register shuffling on the edges if a different
114 1.1 mrg allocation is used for a pseudo-register on different sides of
115 1.1 mrg the edges). Caps are not in the map (remember we can have more
116 1.1 mrg one cap with the same regno in a region). */
117 1.1 mrg ira_allocno_t *regno_allocno_map;
118 1.1 mrg
119 1.1 mrg /* True if there is an entry to given loop not from its parent (or
120 1.1 mrg grandparent) basic block. For example, it is possible for two
121 1.1 mrg adjacent loops inside another loop. */
122 1.1 mrg bool entered_from_non_parent_p;
123 1.1 mrg
124 1.1 mrg /* Maximal register pressure inside loop for given register class
125 1.3 mrg (defined only for the pressure classes). */
126 1.1 mrg int reg_pressure[N_REG_CLASSES];
127 1.1 mrg
128 1.1 mrg /* Numbers of allocnos referred or living in the loop node (except
129 1.1 mrg for its subloops). */
130 1.1 mrg bitmap all_allocnos;
131 1.1 mrg
132 1.1 mrg /* Numbers of allocnos living at the loop borders. */
133 1.1 mrg bitmap border_allocnos;
134 1.1 mrg
135 1.1 mrg /* Regnos of pseudos modified in the loop node (including its
136 1.1 mrg subloops). */
137 1.1 mrg bitmap modified_regnos;
138 1.1 mrg
139 1.1 mrg /* Numbers of copies referred in the corresponding loop. */
140 1.1 mrg bitmap local_copies;
141 1.1 mrg };
142 1.1 mrg
143 1.1 mrg /* The root of the loop tree corresponding to the all function. */
144 1.1 mrg extern ira_loop_tree_node_t ira_loop_tree_root;
145 1.1 mrg
146 1.1 mrg /* Height of the loop tree. */
147 1.1 mrg extern int ira_loop_tree_height;
148 1.1 mrg
149 1.1 mrg /* All nodes representing basic blocks are referred through the
150 1.1 mrg following array. We can not use basic block member `aux' for this
151 1.1 mrg because it is used for insertion of insns on edges. */
152 1.1 mrg extern ira_loop_tree_node_t ira_bb_nodes;
153 1.1 mrg
154 1.1 mrg /* Two access macros to the nodes representing basic blocks. */
155 1.1 mrg #if defined ENABLE_IRA_CHECKING && (GCC_VERSION >= 2007)
156 1.1 mrg #define IRA_BB_NODE_BY_INDEX(index) __extension__ \
157 1.3 mrg (({ ira_loop_tree_node_t _node = (&ira_bb_nodes[index]); \
158 1.1 mrg if (_node->children != NULL || _node->loop != NULL || _node->bb == NULL)\
159 1.1 mrg { \
160 1.1 mrg fprintf (stderr, \
161 1.1 mrg "\n%s: %d: error in %s: it is not a block node\n", \
162 1.1 mrg __FILE__, __LINE__, __FUNCTION__); \
163 1.1 mrg gcc_unreachable (); \
164 1.1 mrg } \
165 1.1 mrg _node; }))
166 1.1 mrg #else
167 1.1 mrg #define IRA_BB_NODE_BY_INDEX(index) (&ira_bb_nodes[index])
168 1.1 mrg #endif
169 1.1 mrg
170 1.1 mrg #define IRA_BB_NODE(bb) IRA_BB_NODE_BY_INDEX ((bb)->index)
171 1.1 mrg
172 1.1 mrg /* All nodes representing loops are referred through the following
173 1.1 mrg array. */
174 1.1 mrg extern ira_loop_tree_node_t ira_loop_nodes;
175 1.1 mrg
176 1.1 mrg /* Two access macros to the nodes representing loops. */
177 1.1 mrg #if defined ENABLE_IRA_CHECKING && (GCC_VERSION >= 2007)
178 1.1 mrg #define IRA_LOOP_NODE_BY_INDEX(index) __extension__ \
179 1.3 mrg (({ ira_loop_tree_node_t const _node = (&ira_loop_nodes[index]); \
180 1.3 mrg if (_node->children == NULL || _node->bb != NULL \
181 1.3 mrg || (_node->loop == NULL && current_loops != NULL)) \
182 1.1 mrg { \
183 1.1 mrg fprintf (stderr, \
184 1.1 mrg "\n%s: %d: error in %s: it is not a loop node\n", \
185 1.1 mrg __FILE__, __LINE__, __FUNCTION__); \
186 1.1 mrg gcc_unreachable (); \
187 1.1 mrg } \
188 1.1 mrg _node; }))
189 1.1 mrg #else
190 1.1 mrg #define IRA_LOOP_NODE_BY_INDEX(index) (&ira_loop_nodes[index])
191 1.1 mrg #endif
192 1.1 mrg
193 1.1 mrg #define IRA_LOOP_NODE(loop) IRA_LOOP_NODE_BY_INDEX ((loop)->num)
194 1.1 mrg
195 1.1 mrg
196 1.1 mrg /* The structure describes program points where a given allocno lives.
198 1.3 mrg If the live ranges of two allocnos are intersected, the allocnos
199 1.3 mrg are in conflict. */
200 1.1 mrg struct live_range
201 1.3 mrg {
202 1.3 mrg /* Object whose live range is described by given structure. */
203 1.1 mrg ira_object_t object;
204 1.1 mrg /* Program point range. */
205 1.1 mrg int start, finish;
206 1.1 mrg /* Next structure describing program points where the allocno
207 1.3 mrg lives. */
208 1.1 mrg live_range_t next;
209 1.3 mrg /* Pointer to structures with the same start/finish. */
210 1.1 mrg live_range_t start_next, finish_next;
211 1.1 mrg };
212 1.1 mrg
213 1.1 mrg /* Program points are enumerated by numbers from range
214 1.1 mrg 0..IRA_MAX_POINT-1. There are approximately two times more program
215 1.1 mrg points than insns. Program points are places in the program where
216 1.1 mrg liveness info can be changed. In most general case (there are more
217 1.1 mrg complicated cases too) some program points correspond to places
218 1.1 mrg where input operand dies and other ones correspond to places where
219 1.1 mrg output operands are born. */
220 1.1 mrg extern int ira_max_point;
221 1.1 mrg
222 1.1 mrg /* Arrays of size IRA_MAX_POINT mapping a program point to the allocno
223 1.3 mrg live ranges with given start/finish point. */
224 1.3 mrg extern live_range_t *ira_start_point_ranges, *ira_finish_point_ranges;
225 1.3 mrg
226 1.3 mrg /* A structure representing conflict information for an allocno
227 1.3 mrg (or one of its subwords). */
228 1.3 mrg struct ira_object
229 1.3 mrg {
230 1.3 mrg /* The allocno associated with this record. */
231 1.3 mrg ira_allocno_t allocno;
232 1.3 mrg /* Vector of accumulated conflicting conflict_redords with NULL end
233 1.3 mrg marker (if OBJECT_CONFLICT_VEC_P is true) or conflict bit vector
234 1.3 mrg otherwise. */
235 1.3 mrg void *conflicts_array;
236 1.3 mrg /* Pointer to structures describing at what program point the
237 1.3 mrg object lives. We always maintain the list in such way that *the
238 1.3 mrg ranges in the list are not intersected and ordered by decreasing
239 1.3 mrg their program points*. */
240 1.3 mrg live_range_t live_ranges;
241 1.3 mrg /* The subword within ALLOCNO which is represented by this object.
242 1.3 mrg Zero means the lowest-order subword (or the entire allocno in case
243 1.3 mrg it is not being tracked in subwords). */
244 1.3 mrg int subword;
245 1.3 mrg /* Allocated size of the conflicts array. */
246 1.3 mrg unsigned int conflicts_array_size;
247 1.3 mrg /* A unique number for every instance of this structure, which is used
248 1.3 mrg to represent it in conflict bit vectors. */
249 1.3 mrg int id;
250 1.3 mrg /* Before building conflicts, MIN and MAX are initialized to
251 1.3 mrg correspondingly minimal and maximal points of the accumulated
252 1.3 mrg live ranges. Afterwards, they hold the minimal and maximal ids
253 1.3 mrg of other ira_objects that this one can conflict with. */
254 1.3 mrg int min, max;
255 1.3 mrg /* Initial and accumulated hard registers conflicting with this
256 1.3 mrg object and as a consequences can not be assigned to the allocno.
257 1.3 mrg All non-allocatable hard regs and hard regs of register classes
258 1.3 mrg different from given allocno one are included in the sets. */
259 1.3 mrg HARD_REG_SET conflict_hard_regs, total_conflict_hard_regs;
260 1.3 mrg /* Number of accumulated conflicts in the vector of conflicting
261 1.3 mrg objects. */
262 1.3 mrg int num_accumulated_conflicts;
263 1.3 mrg /* TRUE if conflicts are represented by a vector of pointers to
264 1.3 mrg ira_object structures. Otherwise, we use a bit vector indexed
265 1.3 mrg by conflict ID numbers. */
266 1.3 mrg unsigned int conflict_vec_p : 1;
267 1.1 mrg };
268 1.1 mrg
269 1.1 mrg /* A structure representing an allocno (allocation entity). Allocno
270 1.1 mrg represents a pseudo-register in an allocation region. If
271 1.1 mrg pseudo-register does not live in a region but it lives in the
272 1.1 mrg nested regions, it is represented in the region by special allocno
273 1.1 mrg called *cap*. There may be more one cap representing the same
274 1.1 mrg pseudo-register in region. It means that the corresponding
275 1.1 mrg pseudo-register lives in more one non-intersected subregion. */
276 1.1 mrg struct ira_allocno
277 1.1 mrg {
278 1.1 mrg /* The allocno order number starting with 0. Each allocno has an
279 1.1 mrg unique number and the number is never changed for the
280 1.1 mrg allocno. */
281 1.1 mrg int num;
282 1.1 mrg /* Regno for allocno or cap. */
283 1.1 mrg int regno;
284 1.1 mrg /* Mode of the allocno which is the mode of the corresponding
285 1.3 mrg pseudo-register. */
286 1.5 mrg ENUM_BITFIELD (machine_mode) mode : 8;
287 1.5 mrg /* Widest mode of the allocno which in at least one case could be
288 1.5 mrg for paradoxical subregs where wmode > mode. */
289 1.3 mrg ENUM_BITFIELD (machine_mode) wmode : 8;
290 1.3 mrg /* Register class which should be used for allocation for given
291 1.3 mrg allocno. NO_REGS means that we should use memory. */
292 1.3 mrg ENUM_BITFIELD (reg_class) aclass : 16;
293 1.3 mrg /* During the reload, value TRUE means that we should not reassign a
294 1.3 mrg hard register to the allocno got memory earlier. It is set up
295 1.3 mrg when we removed memory-memory move insn before each iteration of
296 1.3 mrg the reload. */
297 1.3 mrg unsigned int dont_reassign_p : 1;
298 1.3 mrg #ifdef STACK_REGS
299 1.3 mrg /* Set to TRUE if allocno can't be assigned to the stack hard
300 1.3 mrg register correspondingly in this region and area including the
301 1.3 mrg region and all its subregions recursively. */
302 1.3 mrg unsigned int no_stack_reg_p : 1, total_no_stack_reg_p : 1;
303 1.3 mrg #endif
304 1.3 mrg /* TRUE value means that there is no sense to spill the allocno
305 1.3 mrg during coloring because the spill will result in additional
306 1.3 mrg reloads in reload pass. */
307 1.3 mrg unsigned int bad_spill_p : 1;
308 1.3 mrg /* TRUE if a hard register or memory has been assigned to the
309 1.3 mrg allocno. */
310 1.3 mrg unsigned int assigned_p : 1;
311 1.3 mrg /* TRUE if conflicts for given allocno are represented by vector of
312 1.3 mrg pointers to the conflicting allocnos. Otherwise, we use a bit
313 1.3 mrg vector where a bit with given index represents allocno with the
314 1.3 mrg same number. */
315 1.1 mrg unsigned int conflict_vec_p : 1;
316 1.1 mrg /* Hard register assigned to given allocno. Negative value means
317 1.1 mrg that memory was allocated to the allocno. During the reload,
318 1.1 mrg spilled allocno has value equal to the corresponding stack slot
319 1.1 mrg number (0, ...) - 2. Value -1 is used for allocnos spilled by the
320 1.1 mrg reload (at this point pseudo-register has only one allocno) which
321 1.5 mrg did not get stack slot yet. */
322 1.1 mrg signed int hard_regno : 16;
323 1.1 mrg /* Allocnos with the same regno are linked by the following member.
324 1.1 mrg Allocnos corresponding to inner loops are first in the list (it
325 1.1 mrg corresponds to depth-first traverse of the loops). */
326 1.1 mrg ira_allocno_t next_regno_allocno;
327 1.1 mrg /* There may be different allocnos with the same regno in different
328 1.1 mrg regions. Allocnos are bound to the corresponding loop tree node.
329 1.1 mrg Pseudo-register may have only one regular allocno with given loop
330 1.1 mrg tree node but more than one cap (see comments above). */
331 1.1 mrg ira_loop_tree_node_t loop_tree_node;
332 1.1 mrg /* Accumulated usage references of the allocno. Here and below,
333 1.1 mrg word 'accumulated' means info for given region and all nested
334 1.1 mrg subregions. In this case, 'accumulated' means sum of references
335 1.1 mrg of the corresponding pseudo-register in this region and in all
336 1.1 mrg nested subregions recursively. */
337 1.1 mrg int nrefs;
338 1.1 mrg /* Accumulated frequency of usage of the allocno. */
339 1.1 mrg int freq;
340 1.3 mrg /* Minimal accumulated and updated costs of usage register of the
341 1.3 mrg allocno class. */
342 1.1 mrg int class_cost, updated_class_cost;
343 1.1 mrg /* Minimal accumulated, and updated costs of memory for the allocno.
344 1.1 mrg At the allocation start, the original and updated costs are
345 1.1 mrg equal. The updated cost may be changed after finishing
346 1.1 mrg allocation in a region and starting allocation in a subregion.
347 1.1 mrg The change reflects the cost of spill/restore code on the
348 1.1 mrg subregion border if we assign memory to the pseudo in the
349 1.1 mrg subregion. */
350 1.1 mrg int memory_cost, updated_memory_cost;
351 1.1 mrg /* Accumulated number of points where the allocno lives and there is
352 1.1 mrg excess pressure for its class. Excess pressure for a register
353 1.1 mrg class at some point means that there are more allocnos of given
354 1.1 mrg register class living at the point than number of hard-registers
355 1.1 mrg of the class available for the allocation. */
356 1.5 mrg int excess_pressure_points_num;
357 1.5 mrg /* Allocno hard reg preferences. */
358 1.1 mrg ira_pref_t allocno_prefs;
359 1.1 mrg /* Copies to other non-conflicting allocnos. The copies can
360 1.1 mrg represent move insn or potential move insn usually because of two
361 1.1 mrg operand insn constraints. */
362 1.1 mrg ira_copy_t allocno_copies;
363 1.1 mrg /* It is a allocno (cap) representing given allocno on upper loop tree
364 1.1 mrg level. */
365 1.1 mrg ira_allocno_t cap;
366 1.1 mrg /* It is a link to allocno (cap) on lower loop level represented by
367 1.1 mrg given cap. Null if given allocno is not a cap. */
368 1.3 mrg ira_allocno_t cap_member;
369 1.3 mrg /* The number of objects tracked in the following array. */
370 1.3 mrg int num_objects;
371 1.3 mrg /* An array of structures describing conflict information and live
372 1.3 mrg ranges for each object associated with the allocno. There may be
373 1.3 mrg more than one such object in cases where the allocno represents a
374 1.3 mrg multi-word register. */
375 1.1 mrg ira_object_t objects[2];
376 1.1 mrg /* Accumulated frequency of calls which given allocno
377 1.1 mrg intersects. */
378 1.1 mrg int call_freq;
379 1.1 mrg /* Accumulated number of the intersected calls. */
380 1.3 mrg int calls_crossed_num;
381 1.3 mrg /* The number of calls across which it is live, but which should not
382 1.3 mrg affect register preferences. */
383 1.5 mrg int cheap_calls_crossed_num;
384 1.5 mrg /* Registers clobbered by intersected calls. */
385 1.1 mrg HARD_REG_SET crossed_calls_clobbered_regs;
386 1.3 mrg /* Array of usage costs (accumulated and the one updated during
387 1.1 mrg coloring) for each hard register of the allocno class. The
388 1.3 mrg member value can be NULL if all costs are the same and equal to
389 1.1 mrg CLASS_COST. For example, the costs of two different hard
390 1.1 mrg registers can be different if one hard register is callee-saved
391 1.1 mrg and another one is callee-used and the allocno lives through
392 1.1 mrg calls. Another example can be case when for some insn the
393 1.1 mrg corresponding pseudo-register value should be put in specific
394 1.3 mrg register class (e.g. AREG for x86) which is a strict subset of
395 1.3 mrg the allocno class (GENERAL_REGS for x86). We have updated costs
396 1.3 mrg to reflect the situation when the usage cost of a hard register
397 1.3 mrg is decreased because the allocno is connected to another allocno
398 1.3 mrg by a copy and the another allocno has been assigned to the hard
399 1.1 mrg register. */
400 1.1 mrg int *hard_reg_costs, *updated_hard_reg_costs;
401 1.1 mrg /* Array of decreasing costs (accumulated and the one updated during
402 1.3 mrg coloring) for allocnos conflicting with given allocno for hard
403 1.3 mrg regno of the allocno class. The member value can be NULL if all
404 1.3 mrg costs are the same. These costs are used to reflect preferences
405 1.3 mrg of other allocnos not assigned yet during assigning to given
406 1.1 mrg allocno. */
407 1.3 mrg int *conflict_hard_reg_costs, *updated_conflict_hard_reg_costs;
408 1.3 mrg /* Different additional data. It is used to decrease size of
409 1.3 mrg allocno data footprint. */
410 1.1 mrg void *add_data;
411 1.1 mrg };
412 1.3 mrg
413 1.1 mrg
414 1.1 mrg /* All members of the allocno structures should be accessed only
415 1.1 mrg through the following macros. */
416 1.1 mrg #define ALLOCNO_NUM(A) ((A)->num)
417 1.1 mrg #define ALLOCNO_REGNO(A) ((A)->regno)
418 1.1 mrg #define ALLOCNO_REG(A) ((A)->reg)
419 1.1 mrg #define ALLOCNO_NEXT_REGNO_ALLOCNO(A) ((A)->next_regno_allocno)
420 1.1 mrg #define ALLOCNO_LOOP_TREE_NODE(A) ((A)->loop_tree_node)
421 1.1 mrg #define ALLOCNO_CAP(A) ((A)->cap)
422 1.1 mrg #define ALLOCNO_CAP_MEMBER(A) ((A)->cap_member)
423 1.1 mrg #define ALLOCNO_NREFS(A) ((A)->nrefs)
424 1.1 mrg #define ALLOCNO_FREQ(A) ((A)->freq)
425 1.1 mrg #define ALLOCNO_HARD_REGNO(A) ((A)->hard_regno)
426 1.1 mrg #define ALLOCNO_CALL_FREQ(A) ((A)->call_freq)
427 1.3 mrg #define ALLOCNO_CALLS_CROSSED_NUM(A) ((A)->calls_crossed_num)
428 1.5 mrg #define ALLOCNO_CHEAP_CALLS_CROSSED_NUM(A) ((A)->cheap_calls_crossed_num)
429 1.5 mrg #define ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS(A) \
430 1.1 mrg ((A)->crossed_calls_clobbered_regs)
431 1.1 mrg #define ALLOCNO_MEM_OPTIMIZED_DEST(A) ((A)->mem_optimized_dest)
432 1.1 mrg #define ALLOCNO_MEM_OPTIMIZED_DEST_P(A) ((A)->mem_optimized_dest_p)
433 1.1 mrg #define ALLOCNO_SOMEWHERE_RENAMED_P(A) ((A)->somewhere_renamed_p)
434 1.1 mrg #define ALLOCNO_CHILD_RENAMED_P(A) ((A)->child_renamed_p)
435 1.1 mrg #define ALLOCNO_DONT_REASSIGN_P(A) ((A)->dont_reassign_p)
436 1.1 mrg #ifdef STACK_REGS
437 1.1 mrg #define ALLOCNO_NO_STACK_REG_P(A) ((A)->no_stack_reg_p)
438 1.1 mrg #define ALLOCNO_TOTAL_NO_STACK_REG_P(A) ((A)->total_no_stack_reg_p)
439 1.1 mrg #endif
440 1.1 mrg #define ALLOCNO_BAD_SPILL_P(A) ((A)->bad_spill_p)
441 1.1 mrg #define ALLOCNO_ASSIGNED_P(A) ((A)->assigned_p)
442 1.5 mrg #define ALLOCNO_MODE(A) ((A)->mode)
443 1.5 mrg #define ALLOCNO_WMODE(A) ((A)->wmode)
444 1.1 mrg #define ALLOCNO_PREFS(A) ((A)->allocno_prefs)
445 1.1 mrg #define ALLOCNO_COPIES(A) ((A)->allocno_copies)
446 1.1 mrg #define ALLOCNO_HARD_REG_COSTS(A) ((A)->hard_reg_costs)
447 1.1 mrg #define ALLOCNO_UPDATED_HARD_REG_COSTS(A) ((A)->updated_hard_reg_costs)
448 1.1 mrg #define ALLOCNO_CONFLICT_HARD_REG_COSTS(A) \
449 1.1 mrg ((A)->conflict_hard_reg_costs)
450 1.1 mrg #define ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS(A) \
451 1.3 mrg ((A)->updated_conflict_hard_reg_costs)
452 1.3 mrg #define ALLOCNO_CLASS(A) ((A)->aclass)
453 1.3 mrg #define ALLOCNO_CLASS_COST(A) ((A)->class_cost)
454 1.1 mrg #define ALLOCNO_UPDATED_CLASS_COST(A) ((A)->updated_class_cost)
455 1.1 mrg #define ALLOCNO_MEMORY_COST(A) ((A)->memory_cost)
456 1.3 mrg #define ALLOCNO_UPDATED_MEMORY_COST(A) ((A)->updated_memory_cost)
457 1.3 mrg #define ALLOCNO_EXCESS_PRESSURE_POINTS_NUM(A) \
458 1.3 mrg ((A)->excess_pressure_points_num)
459 1.3 mrg #define ALLOCNO_OBJECT(A,N) ((A)->objects[N])
460 1.3 mrg #define ALLOCNO_NUM_OBJECTS(A) ((A)->num_objects)
461 1.3 mrg #define ALLOCNO_ADD_DATA(A) ((A)->add_data)
462 1.3 mrg
463 1.3 mrg /* Typedef for pointer to the subsequent structure. */
464 1.3 mrg typedef struct ira_emit_data *ira_emit_data_t;
465 1.3 mrg
466 1.3 mrg /* Allocno bound data used for emit pseudo live range split insns and
467 1.3 mrg to flattening IR. */
468 1.3 mrg struct ira_emit_data
469 1.3 mrg {
470 1.3 mrg /* TRUE if the allocno assigned to memory was a destination of
471 1.3 mrg removed move (see ira-emit.c) at loop exit because the value of
472 1.3 mrg the corresponding pseudo-register is not changed inside the
473 1.3 mrg loop. */
474 1.3 mrg unsigned int mem_optimized_dest_p : 1;
475 1.3 mrg /* TRUE if the corresponding pseudo-register has disjoint live
476 1.3 mrg ranges and the other allocnos of the pseudo-register except this
477 1.3 mrg one changed REG. */
478 1.3 mrg unsigned int somewhere_renamed_p : 1;
479 1.3 mrg /* TRUE if allocno with the same REGNO in a subregion has been
480 1.3 mrg renamed, in other words, got a new pseudo-register. */
481 1.3 mrg unsigned int child_renamed_p : 1;
482 1.3 mrg /* Final rtx representation of the allocno. */
483 1.3 mrg rtx reg;
484 1.3 mrg /* Non NULL if we remove restoring value from given allocno to
485 1.3 mrg MEM_OPTIMIZED_DEST at loop exit (see ira-emit.c) because the
486 1.3 mrg allocno value is not changed inside the loop. */
487 1.3 mrg ira_allocno_t mem_optimized_dest;
488 1.3 mrg };
489 1.3 mrg
490 1.3 mrg #define ALLOCNO_EMIT_DATA(a) ((ira_emit_data_t) ALLOCNO_ADD_DATA (a))
491 1.3 mrg
492 1.3 mrg /* Data used to emit live range split insns and to flattening IR. */
493 1.3 mrg extern ira_emit_data_t ira_allocno_emit_data;
494 1.3 mrg
495 1.3 mrg /* Abbreviation for frequent emit data access. */
496 1.3 mrg static inline rtx
497 1.3 mrg allocno_emit_reg (ira_allocno_t a)
498 1.3 mrg {
499 1.3 mrg return ALLOCNO_EMIT_DATA (a)->reg;
500 1.3 mrg }
501 1.3 mrg
502 1.3 mrg #define OBJECT_ALLOCNO(O) ((O)->allocno)
503 1.3 mrg #define OBJECT_SUBWORD(O) ((O)->subword)
504 1.3 mrg #define OBJECT_CONFLICT_ARRAY(O) ((O)->conflicts_array)
505 1.3 mrg #define OBJECT_CONFLICT_VEC(O) ((ira_object_t *)(O)->conflicts_array)
506 1.3 mrg #define OBJECT_CONFLICT_BITVEC(O) ((IRA_INT_TYPE *)(O)->conflicts_array)
507 1.3 mrg #define OBJECT_CONFLICT_ARRAY_SIZE(O) ((O)->conflicts_array_size)
508 1.3 mrg #define OBJECT_CONFLICT_VEC_P(O) ((O)->conflict_vec_p)
509 1.3 mrg #define OBJECT_NUM_CONFLICTS(O) ((O)->num_accumulated_conflicts)
510 1.3 mrg #define OBJECT_CONFLICT_HARD_REGS(O) ((O)->conflict_hard_regs)
511 1.3 mrg #define OBJECT_TOTAL_CONFLICT_HARD_REGS(O) ((O)->total_conflict_hard_regs)
512 1.3 mrg #define OBJECT_MIN(O) ((O)->min)
513 1.3 mrg #define OBJECT_MAX(O) ((O)->max)
514 1.3 mrg #define OBJECT_CONFLICT_ID(O) ((O)->id)
515 1.1 mrg #define OBJECT_LIVE_RANGES(O) ((O)->live_ranges)
516 1.1 mrg
517 1.1 mrg /* Map regno -> allocnos with given regno (see comments for
518 1.1 mrg allocno member `next_regno_allocno'). */
519 1.1 mrg extern ira_allocno_t *ira_regno_allocno_map;
520 1.1 mrg
521 1.1 mrg /* Array of references to all allocnos. The order number of the
522 1.1 mrg allocno corresponds to the index in the array. Removed allocnos
523 1.1 mrg have NULL element value. */
524 1.1 mrg extern ira_allocno_t *ira_allocnos;
525 1.3 mrg
526 1.1 mrg /* The size of the previous array. */
527 1.1 mrg extern int ira_allocnos_num;
528 1.3 mrg
529 1.3 mrg /* Map a conflict id to its corresponding ira_object structure. */
530 1.3 mrg extern ira_object_t *ira_object_id_map;
531 1.3 mrg
532 1.3 mrg /* The size of the previous array. */
533 1.1 mrg extern int ira_objects_num;
534 1.5 mrg
535 1.5 mrg /* The following structure represents a hard register preference of
536 1.5 mrg allocno. The preference represent move insns or potential move
537 1.5 mrg insns usually because of two operand insn constraints. One move
538 1.5 mrg operand is a hard register. */
539 1.5 mrg struct ira_allocno_pref
540 1.5 mrg {
541 1.5 mrg /* The unique order number of the preference node starting with 0. */
542 1.5 mrg int num;
543 1.5 mrg /* Preferred hard register. */
544 1.5 mrg int hard_regno;
545 1.5 mrg /* Accumulated execution frequency of insns from which the
546 1.5 mrg preference created. */
547 1.5 mrg int freq;
548 1.5 mrg /* Given allocno. */
549 1.5 mrg ira_allocno_t allocno;
550 1.5 mrg /* All preferences with the same allocno are linked by the following
551 1.5 mrg member. */
552 1.5 mrg ira_pref_t next_pref;
553 1.5 mrg };
554 1.5 mrg
555 1.5 mrg /* Array of references to all allocno preferences. The order number
556 1.5 mrg of the preference corresponds to the index in the array. */
557 1.5 mrg extern ira_pref_t *ira_prefs;
558 1.5 mrg
559 1.5 mrg /* Size of the previous array. */
560 1.5 mrg extern int ira_prefs_num;
561 1.1 mrg
562 1.1 mrg /* The following structure represents a copy of two allocnos. The
563 1.1 mrg copies represent move insns or potential move insns usually because
564 1.1 mrg of two operand insn constraints. To remove register shuffle, we
565 1.1 mrg also create copies between allocno which is output of an insn and
566 1.1 mrg allocno becoming dead in the insn. */
567 1.1 mrg struct ira_allocno_copy
568 1.1 mrg {
569 1.1 mrg /* The unique order number of the copy node starting with 0. */
570 1.1 mrg int num;
571 1.1 mrg /* Allocnos connected by the copy. The first allocno should have
572 1.1 mrg smaller order number than the second one. */
573 1.1 mrg ira_allocno_t first, second;
574 1.1 mrg /* Execution frequency of the copy. */
575 1.1 mrg int freq;
576 1.1 mrg bool constraint_p;
577 1.1 mrg /* It is a move insn which is an origin of the copy. The member
578 1.1 mrg value for the copy representing two operand insn constraints or
579 1.1 mrg for the copy created to remove register shuffle is NULL. In last
580 1.1 mrg case the copy frequency is smaller than the corresponding insn
581 1.5 mrg execution frequency. */
582 1.1 mrg rtx_insn *insn;
583 1.1 mrg /* All copies with the same allocno as FIRST are linked by the two
584 1.1 mrg following members. */
585 1.1 mrg ira_copy_t prev_first_allocno_copy, next_first_allocno_copy;
586 1.1 mrg /* All copies with the same allocno as SECOND are linked by the two
587 1.1 mrg following members. */
588 1.1 mrg ira_copy_t prev_second_allocno_copy, next_second_allocno_copy;
589 1.1 mrg /* Region from which given copy is originated. */
590 1.1 mrg ira_loop_tree_node_t loop_tree_node;
591 1.1 mrg };
592 1.1 mrg
593 1.1 mrg /* Array of references to all copies. The order number of the copy
594 1.1 mrg corresponds to the index in the array. Removed copies have NULL
595 1.1 mrg element value. */
596 1.1 mrg extern ira_copy_t *ira_copies;
597 1.1 mrg
598 1.1 mrg /* Size of the previous array. */
599 1.1 mrg extern int ira_copies_num;
600 1.1 mrg
601 1.1 mrg /* The following structure describes a stack slot used for spilled
602 1.1 mrg pseudo-registers. */
603 1.1 mrg struct ira_spilled_reg_stack_slot
604 1.1 mrg {
605 1.3 mrg /* pseudo-registers assigned to the stack slot. */
606 1.1 mrg bitmap_head spilled_regs;
607 1.1 mrg /* RTL representation of the stack slot. */
608 1.1 mrg rtx mem;
609 1.1 mrg /* Size of the stack slot. */
610 1.1 mrg unsigned int width;
611 1.1 mrg };
612 1.1 mrg
613 1.1 mrg /* The number of elements in the following array. */
614 1.1 mrg extern int ira_spilled_reg_stack_slots_num;
615 1.1 mrg
616 1.1 mrg /* The following array contains info about spilled pseudo-registers
617 1.1 mrg stack slots used in current function so far. */
618 1.1 mrg extern struct ira_spilled_reg_stack_slot *ira_spilled_reg_stack_slots;
619 1.1 mrg
620 1.1 mrg /* Correspondingly overall cost of the allocation, cost of the
621 1.1 mrg allocnos assigned to hard-registers, cost of the allocnos assigned
622 1.1 mrg to memory, cost of loads, stores and register move insns generated
623 1.5 mrg for pseudo-register live range splitting (see ira-emit.c). */
624 1.5 mrg extern int64_t ira_overall_cost;
625 1.5 mrg extern int64_t ira_reg_cost, ira_mem_cost;
626 1.1 mrg extern int64_t ira_load_cost, ira_store_cost, ira_shuffle_cost;
627 1.1 mrg extern int ira_move_loops_num, ira_additional_jumps_num;
628 1.3 mrg
629 1.3 mrg
630 1.3 mrg /* This page contains a bitset implementation called 'min/max sets' used to
632 1.3 mrg record conflicts in IRA.
633 1.3 mrg They are named min/maxs set since we keep track of a minimum and a maximum
634 1.3 mrg bit number for each set representing the bounds of valid elements. Otherwise,
635 1.3 mrg the implementation resembles sbitmaps in that we store an array of integers
636 1.3 mrg whose bits directly represent the members of the set. */
637 1.3 mrg
638 1.1 mrg /* The type used as elements in the array, and the number of bits in
639 1.1 mrg this type. */
640 1.1 mrg
641 1.1 mrg #define IRA_INT_BITS HOST_BITS_PER_WIDE_INT
642 1.1 mrg #define IRA_INT_TYPE HOST_WIDE_INT
643 1.1 mrg
644 1.1 mrg /* Set, clear or test bit number I in R, a bit vector of elements with
645 1.1 mrg minimal index and maximal index equal correspondingly to MIN and
646 1.1 mrg MAX. */
647 1.3 mrg #if defined ENABLE_IRA_CHECKING && (GCC_VERSION >= 2007)
648 1.1 mrg
649 1.1 mrg #define SET_MINMAX_SET_BIT(R, I, MIN, MAX) __extension__ \
650 1.1 mrg (({ int _min = (MIN), _max = (MAX), _i = (I); \
651 1.1 mrg if (_i < _min || _i > _max) \
652 1.1 mrg { \
653 1.1 mrg fprintf (stderr, \
654 1.1 mrg "\n%s: %d: error in %s: %d not in range [%d,%d]\n", \
655 1.1 mrg __FILE__, __LINE__, __FUNCTION__, _i, _min, _max); \
656 1.1 mrg gcc_unreachable (); \
657 1.1 mrg } \
658 1.1 mrg ((R)[(unsigned) (_i - _min) / IRA_INT_BITS] \
659 1.1 mrg |= ((IRA_INT_TYPE) 1 << ((unsigned) (_i - _min) % IRA_INT_BITS))); }))
660 1.3 mrg
661 1.1 mrg
662 1.1 mrg #define CLEAR_MINMAX_SET_BIT(R, I, MIN, MAX) __extension__ \
663 1.1 mrg (({ int _min = (MIN), _max = (MAX), _i = (I); \
664 1.1 mrg if (_i < _min || _i > _max) \
665 1.1 mrg { \
666 1.1 mrg fprintf (stderr, \
667 1.1 mrg "\n%s: %d: error in %s: %d not in range [%d,%d]\n", \
668 1.1 mrg __FILE__, __LINE__, __FUNCTION__, _i, _min, _max); \
669 1.1 mrg gcc_unreachable (); \
670 1.1 mrg } \
671 1.1 mrg ((R)[(unsigned) (_i - _min) / IRA_INT_BITS] \
672 1.3 mrg &= ~((IRA_INT_TYPE) 1 << ((unsigned) (_i - _min) % IRA_INT_BITS))); }))
673 1.1 mrg
674 1.1 mrg #define TEST_MINMAX_SET_BIT(R, I, MIN, MAX) __extension__ \
675 1.1 mrg (({ int _min = (MIN), _max = (MAX), _i = (I); \
676 1.1 mrg if (_i < _min || _i > _max) \
677 1.1 mrg { \
678 1.1 mrg fprintf (stderr, \
679 1.1 mrg "\n%s: %d: error in %s: %d not in range [%d,%d]\n", \
680 1.1 mrg __FILE__, __LINE__, __FUNCTION__, _i, _min, _max); \
681 1.1 mrg gcc_unreachable (); \
682 1.1 mrg } \
683 1.1 mrg ((R)[(unsigned) (_i - _min) / IRA_INT_BITS] \
684 1.1 mrg & ((IRA_INT_TYPE) 1 << ((unsigned) (_i - _min) % IRA_INT_BITS))); }))
685 1.1 mrg
686 1.3 mrg #else
687 1.1 mrg
688 1.1 mrg #define SET_MINMAX_SET_BIT(R, I, MIN, MAX) \
689 1.1 mrg ((R)[(unsigned) ((I) - (MIN)) / IRA_INT_BITS] \
690 1.3 mrg |= ((IRA_INT_TYPE) 1 << ((unsigned) ((I) - (MIN)) % IRA_INT_BITS)))
691 1.1 mrg
692 1.1 mrg #define CLEAR_MINMAX_SET_BIT(R, I, MIN, MAX) \
693 1.1 mrg ((R)[(unsigned) ((I) - (MIN)) / IRA_INT_BITS] \
694 1.3 mrg &= ~((IRA_INT_TYPE) 1 << ((unsigned) ((I) - (MIN)) % IRA_INT_BITS)))
695 1.1 mrg
696 1.1 mrg #define TEST_MINMAX_SET_BIT(R, I, MIN, MAX) \
697 1.1 mrg ((R)[(unsigned) ((I) - (MIN)) / IRA_INT_BITS] \
698 1.1 mrg & ((IRA_INT_TYPE) 1 << ((unsigned) ((I) - (MIN)) % IRA_INT_BITS)))
699 1.1 mrg
700 1.3 mrg #endif
701 1.5 mrg
702 1.1 mrg /* The iterator for min/max sets. */
703 1.3 mrg struct minmax_set_iterator {
704 1.1 mrg
705 1.1 mrg /* Array containing the bit vector. */
706 1.1 mrg IRA_INT_TYPE *vec;
707 1.1 mrg
708 1.1 mrg /* The number of the current element in the vector. */
709 1.1 mrg unsigned int word_num;
710 1.1 mrg
711 1.1 mrg /* The number of bits in the bit vector. */
712 1.1 mrg unsigned int nel;
713 1.1 mrg
714 1.1 mrg /* The current bit index of the bit vector. */
715 1.1 mrg unsigned int bit_num;
716 1.1 mrg
717 1.1 mrg /* Index corresponding to the 1st bit of the bit vector. */
718 1.1 mrg int start_val;
719 1.1 mrg
720 1.5 mrg /* The word of the bit vector currently visited. */
721 1.1 mrg unsigned IRA_INT_TYPE word;
722 1.3 mrg };
723 1.3 mrg
724 1.1 mrg /* Initialize the iterator I for bit vector VEC containing minimal and
725 1.3 mrg maximal values MIN and MAX. */
726 1.3 mrg static inline void
727 1.1 mrg minmax_set_iter_init (minmax_set_iterator *i, IRA_INT_TYPE *vec, int min,
728 1.1 mrg int max)
729 1.1 mrg {
730 1.1 mrg i->vec = vec;
731 1.1 mrg i->word_num = 0;
732 1.1 mrg i->nel = max < min ? 0 : max - min + 1;
733 1.1 mrg i->start_val = min;
734 1.1 mrg i->bit_num = 0;
735 1.1 mrg i->word = i->nel == 0 ? 0 : vec[0];
736 1.1 mrg }
737 1.3 mrg
738 1.1 mrg /* Return TRUE if we have more allocnos to visit, in which case *N is
739 1.1 mrg set to the number of the element to be visited. Otherwise, return
740 1.3 mrg FALSE. */
741 1.1 mrg static inline bool
742 1.1 mrg minmax_set_iter_cond (minmax_set_iterator *i, int *n)
743 1.1 mrg {
744 1.1 mrg /* Skip words that are zeros. */
745 1.1 mrg for (; i->word == 0; i->word = i->vec[i->word_num])
746 1.1 mrg {
747 1.1 mrg i->word_num++;
748 1.1 mrg i->bit_num = i->word_num * IRA_INT_BITS;
749 1.1 mrg
750 1.1 mrg /* If we have reached the end, break. */
751 1.1 mrg if (i->bit_num >= i->nel)
752 1.1 mrg return false;
753 1.1 mrg }
754 1.1 mrg
755 1.1 mrg /* Skip bits that are zero. */
756 1.1 mrg for (; (i->word & 1) == 0; i->word >>= 1)
757 1.1 mrg i->bit_num++;
758 1.1 mrg
759 1.1 mrg *n = (int) i->bit_num + i->start_val;
760 1.1 mrg
761 1.1 mrg return true;
762 1.3 mrg }
763 1.1 mrg
764 1.3 mrg /* Advance to the next element in the set. */
765 1.1 mrg static inline void
766 1.1 mrg minmax_set_iter_next (minmax_set_iterator *i)
767 1.1 mrg {
768 1.1 mrg i->word >>= 1;
769 1.1 mrg i->bit_num++;
770 1.3 mrg }
771 1.1 mrg
772 1.1 mrg /* Loop over all elements of a min/max set given by bit vector VEC and
773 1.3 mrg their minimal and maximal values MIN and MAX. In each iteration, N
774 1.3 mrg is set to the number of next allocno. ITER is an instance of
775 1.3 mrg minmax_set_iterator used to iterate over the set. */
776 1.3 mrg #define FOR_EACH_BIT_IN_MINMAX_SET(VEC, MIN, MAX, N, ITER) \
777 1.3 mrg for (minmax_set_iter_init (&(ITER), (VEC), (MIN), (MAX)); \
778 1.3 mrg minmax_set_iter_cond (&(ITER), &(N)); \
779 1.3 mrg minmax_set_iter_next (&(ITER)))
780 1.5 mrg
781 1.5 mrg struct target_ira_int {
783 1.5 mrg ~target_ira_int ();
784 1.5 mrg
785 1.3 mrg void free_ira_costs ();
786 1.3 mrg void free_register_move_costs ();
787 1.6 mrg
788 1.3 mrg /* Initialized once. It is a maximal possible size of the allocated
789 1.3 mrg struct costs. */
790 1.3 mrg size_t x_max_struct_costs_size;
791 1.3 mrg
792 1.3 mrg /* Allocated and initialized once, and used to initialize cost values
793 1.3 mrg for each insn. */
794 1.3 mrg struct costs *x_init_cost;
795 1.3 mrg
796 1.3 mrg /* Allocated once, and used for temporary purposes. */
797 1.3 mrg struct costs *x_temp_costs;
798 1.3 mrg
799 1.3 mrg /* Allocated once, and used for the cost calculation. */
800 1.3 mrg struct costs *x_op_costs[MAX_RECOG_OPERANDS];
801 1.3 mrg struct costs *x_this_op_costs[MAX_RECOG_OPERANDS];
802 1.3 mrg
803 1.3 mrg /* Hard registers that can not be used for the register allocator for
804 1.3 mrg all functions of the current compilation unit. */
805 1.3 mrg HARD_REG_SET x_no_unit_alloc_regs;
806 1.3 mrg
807 1.3 mrg /* Map: hard regs X modes -> set of hard registers for storing value
808 1.3 mrg of given mode starting with given hard register. */
809 1.3 mrg HARD_REG_SET (x_ira_reg_mode_hard_regset
810 1.3 mrg [FIRST_PSEUDO_REGISTER][NUM_MACHINE_MODES]);
811 1.3 mrg
812 1.3 mrg /* Maximum cost of moving from a register in one class to a register
813 1.3 mrg in another class. Based on TARGET_REGISTER_MOVE_COST. */
814 1.3 mrg move_table *x_ira_register_move_cost[MAX_MACHINE_MODE];
815 1.3 mrg
816 1.3 mrg /* Similar, but here we don't have to move if the first index is a
817 1.3 mrg subset of the second so in that case the cost is zero. */
818 1.3 mrg move_table *x_ira_may_move_in_cost[MAX_MACHINE_MODE];
819 1.3 mrg
820 1.3 mrg /* Similar, but here we don't have to move if the first index is a
821 1.3 mrg superset of the second so in that case the cost is zero. */
822 1.3 mrg move_table *x_ira_may_move_out_cost[MAX_MACHINE_MODE];
823 1.3 mrg
824 1.3 mrg /* Keep track of the last mode we initialized move costs for. */
825 1.3 mrg int x_last_mode_for_init_move_cost;
826 1.3 mrg
827 1.3 mrg /* Array analog of the macro MEMORY_MOVE_COST but they contain maximal
828 1.3 mrg cost not minimal. */
829 1.3 mrg short int x_ira_max_memory_move_cost[MAX_MACHINE_MODE][N_REG_CLASSES][2];
830 1.3 mrg
831 1.3 mrg /* Map class->true if class is a possible allocno class, false
832 1.3 mrg otherwise. */
833 1.3 mrg bool x_ira_reg_allocno_class_p[N_REG_CLASSES];
834 1.3 mrg
835 1.3 mrg /* Map class->true if class is a pressure class, false otherwise. */
836 1.3 mrg bool x_ira_reg_pressure_class_p[N_REG_CLASSES];
837 1.3 mrg
838 1.3 mrg /* Array of the number of hard registers of given class which are
839 1.3 mrg available for allocation. The order is defined by the hard
840 1.3 mrg register numbers. */
841 1.3 mrg short x_ira_non_ordered_class_hard_regs[N_REG_CLASSES][FIRST_PSEUDO_REGISTER];
842 1.3 mrg
843 1.3 mrg /* Index (in ira_class_hard_regs; for given register class and hard
844 1.3 mrg register (in general case a hard register can belong to several
845 1.3 mrg register classes;. The index is negative for hard registers
846 1.3 mrg unavailable for the allocation. */
847 1.3 mrg short x_ira_class_hard_reg_index[N_REG_CLASSES][FIRST_PSEUDO_REGISTER];
848 1.3 mrg
849 1.3 mrg /* Index [CL][M] contains R if R appears somewhere in a register of the form:
850 1.3 mrg
851 1.3 mrg (reg:M R'), R' not in x_ira_prohibited_class_mode_regs[CL][M]
852 1.3 mrg
853 1.3 mrg For example, if:
854 1.3 mrg
855 1.3 mrg - (reg:M 2) is valid and occupies two registers;
856 1.3 mrg - register 2 belongs to CL; and
857 1.3 mrg - register 3 belongs to the same pressure class as CL
858 1.3 mrg
859 1.3 mrg then (reg:M 2) contributes to [CL][M] and registers 2 and 3 will be
860 1.3 mrg in the set. */
861 1.3 mrg HARD_REG_SET x_ira_useful_class_mode_regs[N_REG_CLASSES][NUM_MACHINE_MODES];
862 1.3 mrg
863 1.3 mrg /* The value is number of elements in the subsequent array. */
864 1.3 mrg int x_ira_important_classes_num;
865 1.3 mrg
866 1.3 mrg /* The array containing all non-empty classes. Such classes is
867 1.3 mrg important for calculation of the hard register usage costs. */
868 1.3 mrg enum reg_class x_ira_important_classes[N_REG_CLASSES];
869 1.3 mrg
870 1.3 mrg /* The array containing indexes of important classes in the previous
871 1.3 mrg array. The array elements are defined only for important
872 1.3 mrg classes. */
873 1.3 mrg int x_ira_important_class_nums[N_REG_CLASSES];
874 1.3 mrg
875 1.3 mrg /* Map class->true if class is an uniform class, false otherwise. */
876 1.3 mrg bool x_ira_uniform_class_p[N_REG_CLASSES];
877 1.3 mrg
878 1.3 mrg /* The biggest important class inside of intersection of the two
879 1.3 mrg classes (that is calculated taking only hard registers available
880 1.3 mrg for allocation into account;. If the both classes contain no hard
881 1.3 mrg registers available for allocation, the value is calculated with
882 1.3 mrg taking all hard-registers including fixed ones into account. */
883 1.3 mrg enum reg_class x_ira_reg_class_intersect[N_REG_CLASSES][N_REG_CLASSES];
884 1.3 mrg
885 1.3 mrg /* Classes with end marker LIM_REG_CLASSES which are intersected with
886 1.3 mrg given class (the first index). That includes given class itself.
887 1.3 mrg This is calculated taking only hard registers available for
888 1.3 mrg allocation into account. */
889 1.3 mrg enum reg_class x_ira_reg_class_super_classes[N_REG_CLASSES][N_REG_CLASSES];
890 1.3 mrg
891 1.3 mrg /* The biggest (smallest) important class inside of (covering) union
892 1.3 mrg of the two classes (that is calculated taking only hard registers
893 1.3 mrg available for allocation into account). If the both classes
894 1.3 mrg contain no hard registers available for allocation, the value is
895 1.3 mrg calculated with taking all hard-registers including fixed ones
896 1.3 mrg into account. In other words, the value is the corresponding
897 1.3 mrg reg_class_subunion (reg_class_superunion) value. */
898 1.3 mrg enum reg_class x_ira_reg_class_subunion[N_REG_CLASSES][N_REG_CLASSES];
899 1.3 mrg enum reg_class x_ira_reg_class_superunion[N_REG_CLASSES][N_REG_CLASSES];
900 1.3 mrg
901 1.3 mrg /* For each reg class, table listing all the classes contained in it
902 1.3 mrg (excluding the class itself. Non-allocatable registers are
903 1.3 mrg excluded from the consideration). */
904 1.3 mrg enum reg_class x_alloc_reg_class_subclasses[N_REG_CLASSES][N_REG_CLASSES];
905 1.3 mrg
906 1.3 mrg /* Array whose values are hard regset of hard registers for which
907 1.3 mrg move of the hard register in given mode into itself is
908 1.3 mrg prohibited. */
909 1.3 mrg HARD_REG_SET x_ira_prohibited_mode_move_regs[NUM_MACHINE_MODES];
910 1.3 mrg
911 1.3 mrg /* Flag of that the above array has been initialized. */
912 1.3 mrg bool x_ira_prohibited_mode_move_regs_initialized_p;
913 1.3 mrg };
914 1.3 mrg
915 1.3 mrg extern struct target_ira_int default_target_ira_int;
916 1.3 mrg #if SWITCHABLE_TARGET
917 1.3 mrg extern struct target_ira_int *this_target_ira_int;
918 1.1 mrg #else
919 1.3 mrg #define this_target_ira_int (&default_target_ira_int)
920 1.3 mrg #endif
921 1.3 mrg
922 1.3 mrg #define ira_reg_mode_hard_regset \
923 1.3 mrg (this_target_ira_int->x_ira_reg_mode_hard_regset)
924 1.3 mrg #define ira_register_move_cost \
925 1.3 mrg (this_target_ira_int->x_ira_register_move_cost)
926 1.3 mrg #define ira_max_memory_move_cost \
927 1.3 mrg (this_target_ira_int->x_ira_max_memory_move_cost)
928 1.3 mrg #define ira_may_move_in_cost \
929 1.3 mrg (this_target_ira_int->x_ira_may_move_in_cost)
930 1.3 mrg #define ira_may_move_out_cost \
931 1.3 mrg (this_target_ira_int->x_ira_may_move_out_cost)
932 1.3 mrg #define ira_reg_allocno_class_p \
933 1.3 mrg (this_target_ira_int->x_ira_reg_allocno_class_p)
934 1.3 mrg #define ira_reg_pressure_class_p \
935 1.3 mrg (this_target_ira_int->x_ira_reg_pressure_class_p)
936 1.3 mrg #define ira_non_ordered_class_hard_regs \
937 1.3 mrg (this_target_ira_int->x_ira_non_ordered_class_hard_regs)
938 1.3 mrg #define ira_class_hard_reg_index \
939 1.3 mrg (this_target_ira_int->x_ira_class_hard_reg_index)
940 1.3 mrg #define ira_useful_class_mode_regs \
941 1.3 mrg (this_target_ira_int->x_ira_useful_class_mode_regs)
942 1.3 mrg #define ira_important_classes_num \
943 1.3 mrg (this_target_ira_int->x_ira_important_classes_num)
944 1.3 mrg #define ira_important_classes \
945 1.3 mrg (this_target_ira_int->x_ira_important_classes)
946 1.3 mrg #define ira_important_class_nums \
947 1.3 mrg (this_target_ira_int->x_ira_important_class_nums)
948 1.3 mrg #define ira_uniform_class_p \
949 1.3 mrg (this_target_ira_int->x_ira_uniform_class_p)
950 1.3 mrg #define ira_reg_class_intersect \
951 1.3 mrg (this_target_ira_int->x_ira_reg_class_intersect)
952 1.3 mrg #define ira_reg_class_super_classes \
953 1.3 mrg (this_target_ira_int->x_ira_reg_class_super_classes)
954 1.3 mrg #define ira_reg_class_subunion \
955 1.3 mrg (this_target_ira_int->x_ira_reg_class_subunion)
956 1.3 mrg #define ira_reg_class_superunion \
957 1.3 mrg (this_target_ira_int->x_ira_reg_class_superunion)
958 1.1 mrg #define ira_prohibited_mode_move_regs \
959 1.1 mrg (this_target_ira_int->x_ira_prohibited_mode_move_regs)
960 1.1 mrg
961 1.1 mrg /* ira.c: */
963 1.1 mrg
964 1.1 mrg extern void *ira_allocate (size_t);
965 1.1 mrg extern void ira_free (void *addr);
966 1.3 mrg extern bitmap ira_allocate_bitmap (void);
967 1.5 mrg extern void ira_free_bitmap (bitmap);
968 1.5 mrg extern void ira_print_disposition (FILE *);
969 1.5 mrg extern void ira_debug_disposition (void);
970 1.1 mrg extern void ira_debug_allocno_classes (void);
971 1.1 mrg extern void ira_init_register_move_cost (machine_mode);
972 1.1 mrg extern void ira_setup_alts (rtx_insn *insn, HARD_REG_SET &alts);
973 1.1 mrg extern int ira_get_dup_out_num (int op_num, HARD_REG_SET &alts);
974 1.1 mrg
975 1.1 mrg /* ira-build.c */
976 1.1 mrg
977 1.5 mrg /* The current loop tree node and its regno allocno map. */
978 1.5 mrg extern ira_loop_tree_node_t ira_curr_loop_tree_node;
979 1.5 mrg extern ira_allocno_t *ira_curr_regno_allocno_map;
980 1.5 mrg
981 1.1 mrg extern void ira_debug_pref (ira_pref_t);
982 1.5 mrg extern void ira_debug_prefs (void);
983 1.5 mrg extern void ira_debug_allocno_prefs (ira_allocno_t);
984 1.5 mrg
985 1.1 mrg extern void ira_debug_copy (ira_copy_t);
986 1.1 mrg extern void debug (ira_allocno_copy &ref);
987 1.5 mrg extern void debug (ira_allocno_copy *ptr);
988 1.5 mrg
989 1.1 mrg extern void ira_debug_copies (void);
990 1.1 mrg extern void ira_debug_allocno_copies (ira_allocno_t);
991 1.1 mrg extern void debug (ira_allocno &ref);
992 1.1 mrg extern void debug (ira_allocno *ptr);
993 1.3 mrg
994 1.3 mrg extern void ira_traverse_loop_tree (bool, ira_loop_tree_node_t,
995 1.1 mrg void (*) (ira_loop_tree_node_t),
996 1.3 mrg void (*) (ira_loop_tree_node_t));
997 1.3 mrg extern ira_allocno_t ira_parent_allocno (ira_allocno_t);
998 1.3 mrg extern ira_allocno_t ira_parent_or_cap_allocno (ira_allocno_t);
999 1.3 mrg extern ira_allocno_t ira_create_allocno (int, bool, ira_loop_tree_node_t);
1000 1.3 mrg extern void ira_create_allocno_objects (ira_allocno_t);
1001 1.3 mrg extern void ira_set_allocno_class (ira_allocno_t, enum reg_class);
1002 1.1 mrg extern bool ira_conflict_vector_profitable_p (ira_object_t, int);
1003 1.3 mrg extern void ira_allocate_conflict_vec (ira_object_t, int);
1004 1.3 mrg extern void ira_allocate_object_conflicts (ira_object_t, int);
1005 1.3 mrg extern void ior_hard_reg_conflicts (ira_allocno_t, HARD_REG_SET *);
1006 1.3 mrg extern void ira_print_expanded_allocno (ira_allocno_t);
1007 1.3 mrg extern void ira_add_live_range_to_object (ira_object_t, int, int);
1008 1.3 mrg extern live_range_t ira_create_live_range (ira_object_t, int, int,
1009 1.3 mrg live_range_t);
1010 1.3 mrg extern live_range_t ira_copy_live_range_list (live_range_t);
1011 1.1 mrg extern live_range_t ira_merge_live_ranges (live_range_t, live_range_t);
1012 1.5 mrg extern bool ira_live_ranges_intersect_p (live_range_t, live_range_t);
1013 1.5 mrg extern void ira_finish_live_range (live_range_t);
1014 1.5 mrg extern void ira_finish_live_range_list (live_range_t);
1015 1.5 mrg extern void ira_free_allocno_updated_costs (ira_allocno_t);
1016 1.1 mrg extern ira_pref_t ira_create_pref (ira_allocno_t, int, int);
1017 1.5 mrg extern void ira_add_allocno_pref (ira_allocno_t, int, int);
1018 1.5 mrg extern void ira_remove_pref (ira_pref_t);
1019 1.1 mrg extern void ira_remove_allocno_prefs (ira_allocno_t);
1020 1.5 mrg extern ira_copy_t ira_create_copy (ira_allocno_t, ira_allocno_t,
1021 1.5 mrg int, bool, rtx_insn *,
1022 1.1 mrg ira_loop_tree_node_t);
1023 1.3 mrg extern ira_copy_t ira_add_allocno_copy (ira_allocno_t, ira_allocno_t, int,
1024 1.3 mrg bool, rtx_insn *,
1025 1.1 mrg ira_loop_tree_node_t);
1026 1.1 mrg
1027 1.3 mrg extern int *ira_allocate_cost_vector (reg_class_t);
1028 1.1 mrg extern void ira_free_cost_vector (int *, reg_class_t);
1029 1.1 mrg
1030 1.1 mrg extern void ira_flattening (int, int);
1031 1.1 mrg extern bool ira_build (void);
1032 1.1 mrg extern void ira_destroy (void);
1033 1.1 mrg
1034 1.3 mrg /* ira-costs.c */
1035 1.1 mrg extern void ira_init_costs_once (void);
1036 1.1 mrg extern void ira_init_costs (void);
1037 1.1 mrg extern void ira_costs (void);
1038 1.1 mrg extern void ira_tune_allocno_costs (void);
1039 1.3 mrg
1040 1.5 mrg /* ira-lives.c */
1041 1.5 mrg
1042 1.3 mrg extern void ira_rebuild_start_finish_chains (void);
1043 1.1 mrg extern void ira_print_live_range_list (FILE *, live_range_t);
1044 1.1 mrg extern void debug (live_range &ref);
1045 1.1 mrg extern void debug (live_range *ptr);
1046 1.1 mrg extern void ira_debug_live_range_list (live_range_t);
1047 1.1 mrg extern void ira_debug_allocno_live_ranges (ira_allocno_t);
1048 1.5 mrg extern void ira_debug_live_ranges (void);
1049 1.5 mrg extern void ira_create_allocno_live_ranges (void);
1050 1.1 mrg extern void ira_compress_allocno_live_ranges (void);
1051 1.1 mrg extern void ira_finish_allocno_live_ranges (void);
1052 1.1 mrg extern void ira_implicitly_set_insn_hard_regs (HARD_REG_SET *,
1053 1.1 mrg alternative_mask);
1054 1.1 mrg
1055 1.1 mrg /* ira-conflicts.c */
1056 1.3 mrg extern void ira_debug_conflicts (bool);
1057 1.1 mrg extern void ira_build_conflicts (void);
1058 1.1 mrg
1059 1.1 mrg /* ira-color.c */
1060 1.1 mrg extern void ira_debug_hard_regs_forest (void);
1061 1.1 mrg extern int ira_loop_edge_freq (ira_loop_tree_node_t, int, bool);
1062 1.1 mrg extern void ira_reassign_conflict_allocnos (int);
1063 1.1 mrg extern void ira_initiate_assign (void);
1064 1.3 mrg extern void ira_finish_assign (void);
1065 1.3 mrg extern void ira_color (void);
1066 1.1 mrg
1067 1.1 mrg /* ira-emit.c */
1068 1.1 mrg extern void ira_initiate_emit_data (void);
1069 1.1 mrg extern void ira_finish_emit_data (void);
1070 1.3 mrg extern void ira_emit (bool);
1071 1.3 mrg
1072 1.3 mrg
1073 1.1 mrg
1075 1.3 mrg /* Return true if equivalence of pseudo REGNO is not a lvalue. */
1076 1.3 mrg static inline bool
1077 1.3 mrg ira_equiv_no_lvalue_p (int regno)
1078 1.3 mrg {
1079 1.3 mrg if (regno >= ira_reg_equiv_len)
1080 1.1 mrg return false;
1081 1.1 mrg return (ira_reg_equiv[regno].constant != NULL_RTX
1082 1.3 mrg || ira_reg_equiv[regno].invariant != NULL_RTX
1083 1.3 mrg || (ira_reg_equiv[regno].memory != NULL_RTX
1084 1.3 mrg && MEM_READONLY_P (ira_reg_equiv[regno].memory)));
1085 1.3 mrg }
1086 1.5 mrg
1087 1.1 mrg
1088 1.1 mrg
1090 1.1 mrg /* Initialize register costs for MODE if necessary. */
1091 1.1 mrg static inline void
1092 1.1 mrg ira_init_register_move_cost_if_necessary (machine_mode mode)
1093 1.1 mrg {
1094 1.1 mrg if (ira_register_move_cost[mode] == NULL)
1095 1.5 mrg ira_init_register_move_cost (mode);
1096 1.1 mrg }
1097 1.1 mrg
1098 1.5 mrg
1099 1.1 mrg
1101 1.1 mrg /* The iterator for all allocnos. */
1102 1.1 mrg struct ira_allocno_iterator {
1103 1.1 mrg /* The number of the current element in IRA_ALLOCNOS. */
1104 1.1 mrg int n;
1105 1.1 mrg };
1106 1.1 mrg
1107 1.1 mrg /* Initialize the iterator I. */
1108 1.1 mrg static inline void
1109 1.1 mrg ira_allocno_iter_init (ira_allocno_iterator *i)
1110 1.1 mrg {
1111 1.1 mrg i->n = 0;
1112 1.1 mrg }
1113 1.1 mrg
1114 1.1 mrg /* Return TRUE if we have more allocnos to visit, in which case *A is
1115 1.1 mrg set to the allocno to be visited. Otherwise, return FALSE. */
1116 1.1 mrg static inline bool
1117 1.1 mrg ira_allocno_iter_cond (ira_allocno_iterator *i, ira_allocno_t *a)
1118 1.1 mrg {
1119 1.1 mrg int n;
1120 1.1 mrg
1121 1.1 mrg for (n = i->n; n < ira_allocnos_num; n++)
1122 1.1 mrg if (ira_allocnos[n] != NULL)
1123 1.1 mrg {
1124 1.1 mrg *a = ira_allocnos[n];
1125 1.1 mrg i->n = n + 1;
1126 1.1 mrg return true;
1127 1.1 mrg }
1128 1.1 mrg return false;
1129 1.1 mrg }
1130 1.3 mrg
1131 1.3 mrg /* Loop over all allocnos. In each iteration, A is set to the next
1132 1.5 mrg allocno. ITER is an instance of ira_allocno_iterator used to iterate
1133 1.3 mrg the allocnos. */
1134 1.3 mrg #define FOR_EACH_ALLOCNO(A, ITER) \
1135 1.5 mrg for (ira_allocno_iter_init (&(ITER)); \
1136 1.3 mrg ira_allocno_iter_cond (&(ITER), &(A));)
1137 1.3 mrg
1138 1.3 mrg /* The iterator for all objects. */
1140 1.3 mrg struct ira_object_iterator {
1141 1.3 mrg /* The number of the current element in ira_object_id_map. */
1142 1.3 mrg int n;
1143 1.3 mrg };
1144 1.3 mrg
1145 1.3 mrg /* Initialize the iterator I. */
1146 1.3 mrg static inline void
1147 1.3 mrg ira_object_iter_init (ira_object_iterator *i)
1148 1.3 mrg {
1149 1.3 mrg i->n = 0;
1150 1.3 mrg }
1151 1.3 mrg
1152 1.3 mrg /* Return TRUE if we have more objects to visit, in which case *OBJ is
1153 1.3 mrg set to the object to be visited. Otherwise, return FALSE. */
1154 1.3 mrg static inline bool
1155 1.3 mrg ira_object_iter_cond (ira_object_iterator *i, ira_object_t *obj)
1156 1.3 mrg {
1157 1.3 mrg int n;
1158 1.3 mrg
1159 1.3 mrg for (n = i->n; n < ira_objects_num; n++)
1160 1.1 mrg if (ira_object_id_map[n] != NULL)
1161 1.3 mrg {
1162 1.3 mrg *obj = ira_object_id_map[n];
1163 1.3 mrg i->n = n + 1;
1164 1.3 mrg return true;
1165 1.3 mrg }
1166 1.3 mrg return false;
1167 1.3 mrg }
1168 1.3 mrg
1169 1.5 mrg /* Loop over all objects. In each iteration, OBJ is set to the next
1170 1.3 mrg object. ITER is an instance of ira_object_iterator used to iterate
1171 1.3 mrg the objects. */
1172 1.5 mrg #define FOR_EACH_OBJECT(OBJ, ITER) \
1173 1.1 mrg for (ira_object_iter_init (&(ITER)); \
1174 1.3 mrg ira_object_iter_cond (&(ITER), &(OBJ));)
1175 1.3 mrg
1176 1.3 mrg /* The iterator for objects associated with an allocno. */
1178 1.3 mrg struct ira_allocno_object_iterator {
1179 1.3 mrg /* The number of the element the allocno's object array. */
1180 1.3 mrg int n;
1181 1.3 mrg };
1182 1.3 mrg
1183 1.3 mrg /* Initialize the iterator I. */
1184 1.3 mrg static inline void
1185 1.3 mrg ira_allocno_object_iter_init (ira_allocno_object_iterator *i)
1186 1.3 mrg {
1187 1.3 mrg i->n = 0;
1188 1.3 mrg }
1189 1.3 mrg
1190 1.3 mrg /* Return TRUE if we have more objects to visit in allocno A, in which
1191 1.3 mrg case *O is set to the object to be visited. Otherwise, return
1192 1.3 mrg FALSE. */
1193 1.3 mrg static inline bool
1194 1.3 mrg ira_allocno_object_iter_cond (ira_allocno_object_iterator *i, ira_allocno_t a,
1195 1.3 mrg ira_object_t *o)
1196 1.3 mrg {
1197 1.3 mrg int n = i->n++;
1198 1.3 mrg if (n < ALLOCNO_NUM_OBJECTS (a))
1199 1.3 mrg {
1200 1.3 mrg *o = ALLOCNO_OBJECT (a, n);
1201 1.3 mrg return true;
1202 1.3 mrg }
1203 1.1 mrg return false;
1204 1.1 mrg }
1205 1.5 mrg
1206 1.5 mrg /* Loop over all objects associated with allocno A. In each
1207 1.5 mrg iteration, O is set to the next object. ITER is an instance of
1208 1.5 mrg ira_allocno_object_iterator used to iterate the conflicts. */
1209 1.5 mrg #define FOR_EACH_ALLOCNO_OBJECT(A, O, ITER) \
1210 1.5 mrg for (ira_allocno_object_iter_init (&(ITER)); \
1211 1.5 mrg ira_allocno_object_iter_cond (&(ITER), (A), &(O));)
1212 1.5 mrg
1213 1.5 mrg
1215 1.5 mrg /* The iterator for prefs. */
1216 1.5 mrg struct ira_pref_iterator {
1217 1.5 mrg /* The number of the current element in IRA_PREFS. */
1218 1.5 mrg int n;
1219 1.5 mrg };
1220 1.5 mrg
1221 1.5 mrg /* Initialize the iterator I. */
1222 1.5 mrg static inline void
1223 1.5 mrg ira_pref_iter_init (ira_pref_iterator *i)
1224 1.5 mrg {
1225 1.5 mrg i->n = 0;
1226 1.5 mrg }
1227 1.5 mrg
1228 1.5 mrg /* Return TRUE if we have more prefs to visit, in which case *PREF is
1229 1.5 mrg set to the pref to be visited. Otherwise, return FALSE. */
1230 1.5 mrg static inline bool
1231 1.5 mrg ira_pref_iter_cond (ira_pref_iterator *i, ira_pref_t *pref)
1232 1.5 mrg {
1233 1.5 mrg int n;
1234 1.5 mrg
1235 1.5 mrg for (n = i->n; n < ira_prefs_num; n++)
1236 1.5 mrg if (ira_prefs[n] != NULL)
1237 1.5 mrg {
1238 1.5 mrg *pref = ira_prefs[n];
1239 1.5 mrg i->n = n + 1;
1240 1.5 mrg return true;
1241 1.5 mrg }
1242 1.5 mrg return false;
1243 1.1 mrg }
1244 1.5 mrg
1245 1.1 mrg /* Loop over all prefs. In each iteration, P is set to the next
1246 1.1 mrg pref. ITER is an instance of ira_pref_iterator used to iterate
1247 1.5 mrg the prefs. */
1248 1.1 mrg #define FOR_EACH_PREF(P, ITER) \
1249 1.1 mrg for (ira_pref_iter_init (&(ITER)); \
1250 1.1 mrg ira_pref_iter_cond (&(ITER), &(P));)
1251 1.1 mrg
1252 1.1 mrg
1254 1.1 mrg /* The iterator for copies. */
1255 1.1 mrg struct ira_copy_iterator {
1256 1.1 mrg /* The number of the current element in IRA_COPIES. */
1257 1.1 mrg int n;
1258 1.1 mrg };
1259 1.1 mrg
1260 1.1 mrg /* Initialize the iterator I. */
1261 1.1 mrg static inline void
1262 1.1 mrg ira_copy_iter_init (ira_copy_iterator *i)
1263 1.1 mrg {
1264 1.1 mrg i->n = 0;
1265 1.1 mrg }
1266 1.1 mrg
1267 1.1 mrg /* Return TRUE if we have more copies to visit, in which case *CP is
1268 1.1 mrg set to the copy to be visited. Otherwise, return FALSE. */
1269 1.1 mrg static inline bool
1270 1.1 mrg ira_copy_iter_cond (ira_copy_iterator *i, ira_copy_t *cp)
1271 1.1 mrg {
1272 1.1 mrg int n;
1273 1.1 mrg
1274 1.1 mrg for (n = i->n; n < ira_copies_num; n++)
1275 1.1 mrg if (ira_copies[n] != NULL)
1276 1.1 mrg {
1277 1.1 mrg *cp = ira_copies[n];
1278 1.1 mrg i->n = n + 1;
1279 1.1 mrg return true;
1280 1.3 mrg }
1281 1.5 mrg return false;
1282 1.1 mrg }
1283 1.1 mrg
1284 1.3 mrg /* Loop over all copies. In each iteration, C is set to the next
1285 1.1 mrg copy. ITER is an instance of ira_copy_iterator used to iterate
1286 1.1 mrg the copies. */
1287 1.1 mrg #define FOR_EACH_COPY(C, ITER) \
1288 1.1 mrg for (ira_copy_iter_init (&(ITER)); \
1289 1.1 mrg ira_copy_iter_cond (&(ITER), &(C));)
1290 1.3 mrg
1291 1.1 mrg /* The iterator for object conflicts. */
1293 1.1 mrg struct ira_object_conflict_iterator {
1294 1.3 mrg
1295 1.1 mrg /* TRUE if the conflicts are represented by vector of allocnos. */
1296 1.1 mrg bool conflict_vec_p;
1297 1.1 mrg
1298 1.3 mrg /* The conflict vector or conflict bit vector. */
1299 1.1 mrg void *vec;
1300 1.1 mrg
1301 1.3 mrg /* The number of the current element in the vector (of type
1302 1.3 mrg ira_object_t or IRA_INT_TYPE). */
1303 1.1 mrg unsigned int word_num;
1304 1.1 mrg
1305 1.1 mrg /* The bit vector size. It is defined only if
1306 1.3 mrg OBJECT_CONFLICT_VEC_P is FALSE. */
1307 1.1 mrg unsigned int size;
1308 1.5 mrg
1309 1.1 mrg /* The current bit index of bit vector. It is defined only if
1310 1.1 mrg OBJECT_CONFLICT_VEC_P is FALSE. */
1311 1.1 mrg unsigned int bit_num;
1312 1.3 mrg
1313 1.3 mrg /* The object id corresponding to the 1st bit of the bit vector. It
1314 1.1 mrg is defined only if OBJECT_CONFLICT_VEC_P is FALSE. */
1315 1.3 mrg int base_conflict_id;
1316 1.3 mrg
1317 1.1 mrg /* The word of bit vector currently visited. It is defined only if
1318 1.3 mrg OBJECT_CONFLICT_VEC_P is FALSE. */
1319 1.1 mrg unsigned IRA_INT_TYPE word;
1320 1.1 mrg };
1321 1.1 mrg
1322 1.3 mrg /* Initialize the iterator I with ALLOCNO conflicts. */
1323 1.1 mrg static inline void
1324 1.1 mrg ira_object_conflict_iter_init (ira_object_conflict_iterator *i,
1325 1.3 mrg ira_object_t obj)
1326 1.1 mrg {
1327 1.1 mrg i->conflict_vec_p = OBJECT_CONFLICT_VEC_P (obj);
1328 1.1 mrg i->vec = OBJECT_CONFLICT_ARRAY (obj);
1329 1.3 mrg i->word_num = 0;
1330 1.1 mrg if (i->conflict_vec_p)
1331 1.1 mrg i->size = i->bit_num = i->base_conflict_id = i->word = 0;
1332 1.1 mrg else
1333 1.1 mrg {
1334 1.1 mrg if (OBJECT_MIN (obj) > OBJECT_MAX (obj))
1335 1.1 mrg i->size = 0;
1336 1.1 mrg else
1337 1.1 mrg i->size = ((OBJECT_MAX (obj) - OBJECT_MIN (obj)
1338 1.3 mrg + IRA_INT_BITS)
1339 1.3 mrg / IRA_INT_BITS) * sizeof (IRA_INT_TYPE);
1340 1.1 mrg i->bit_num = 0;
1341 1.3 mrg i->base_conflict_id = OBJECT_MIN (obj);
1342 1.1 mrg i->word = (i->size == 0 ? 0 : ((IRA_INT_TYPE *) i->vec)[0]);
1343 1.3 mrg }
1344 1.1 mrg }
1345 1.3 mrg
1346 1.3 mrg /* Return TRUE if we have more conflicting allocnos to visit, in which
1347 1.1 mrg case *A is set to the allocno to be visited. Otherwise, return
1348 1.1 mrg FALSE. */
1349 1.1 mrg static inline bool
1350 1.1 mrg ira_object_conflict_iter_cond (ira_object_conflict_iterator *i,
1351 1.3 mrg ira_object_t *pobj)
1352 1.3 mrg {
1353 1.3 mrg ira_object_t obj;
1354 1.1 mrg
1355 1.3 mrg if (i->conflict_vec_p)
1356 1.1 mrg {
1357 1.1 mrg obj = ((ira_object_t *) i->vec)[i->word_num++];
1358 1.1 mrg if (obj == NULL)
1359 1.1 mrg return false;
1360 1.1 mrg }
1361 1.1 mrg else
1362 1.1 mrg {
1363 1.3 mrg unsigned IRA_INT_TYPE word = i->word;
1364 1.1 mrg unsigned int bit_num = i->bit_num;
1365 1.1 mrg
1366 1.1 mrg /* Skip words that are zeros. */
1367 1.3 mrg for (; word == 0; word = ((IRA_INT_TYPE *) i->vec)[i->word_num])
1368 1.3 mrg {
1369 1.1 mrg i->word_num++;
1370 1.3 mrg
1371 1.3 mrg /* If we have reached the end, break. */
1372 1.3 mrg if (i->word_num * sizeof (IRA_INT_TYPE) >= i->size)
1373 1.3 mrg return false;
1374 1.1 mrg
1375 1.3 mrg bit_num = i->word_num * IRA_INT_BITS;
1376 1.3 mrg }
1377 1.1 mrg
1378 1.1 mrg /* Skip bits that are zero. */
1379 1.3 mrg for (; (word & 1) == 0; word >>= 1)
1380 1.3 mrg bit_num++;
1381 1.3 mrg
1382 1.3 mrg obj = ira_object_id_map[bit_num + i->base_conflict_id];
1383 1.3 mrg i->bit_num = bit_num + 1;
1384 1.3 mrg i->word = word >> 1;
1385 1.3 mrg }
1386 1.3 mrg
1387 1.3 mrg *pobj = obj;
1388 1.3 mrg return true;
1389 1.3 mrg }
1390 1.3 mrg
1391 1.3 mrg /* Loop over all objects conflicting with OBJ. In each iteration,
1392 1.5 mrg CONF is set to the next conflicting object. ITER is an instance
1393 1.3 mrg of ira_object_conflict_iterator used to iterate the conflicts. */
1394 1.1 mrg #define FOR_EACH_OBJECT_CONFLICT(OBJ, CONF, ITER) \
1395 1.3 mrg for (ira_object_conflict_iter_init (&(ITER), (OBJ)); \
1396 1.3 mrg ira_object_conflict_iter_cond (&(ITER), &(CONF));)
1397 1.3 mrg
1398 1.3 mrg
1399 1.3 mrg
1401 1.3 mrg /* The function returns TRUE if at least one hard register from ones
1402 1.1 mrg starting with HARD_REGNO and containing value of MODE are in set
1403 1.1 mrg HARD_REGSET. */
1404 1.3 mrg static inline bool
1405 1.3 mrg ira_hard_reg_set_intersection_p (int hard_regno, machine_mode mode,
1406 1.3 mrg HARD_REG_SET hard_regset)
1407 1.3 mrg {
1408 1.3 mrg int i;
1409 1.1 mrg
1410 1.3 mrg gcc_assert (hard_regno >= 0);
1411 1.3 mrg for (i = hard_regno_nregs[hard_regno][mode] - 1; i >= 0; i--)
1412 1.3 mrg if (TEST_HARD_REG_BIT (hard_regset, hard_regno + i))
1413 1.3 mrg return true;
1414 1.3 mrg return false;
1415 1.1 mrg }
1416 1.1 mrg
1417 1.3 mrg /* Return number of hard registers in hard register SET. */
1418 1.1 mrg static inline int
1419 1.1 mrg hard_reg_set_size (HARD_REG_SET set)
1420 1.5 mrg {
1421 1.3 mrg int i, size;
1422 1.1 mrg
1423 1.1 mrg for (size = i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1424 1.1 mrg if (TEST_HARD_REG_BIT (set, i))
1425 1.1 mrg size++;
1426 1.1 mrg return size;
1427 1.3 mrg }
1428 1.1 mrg
1429 1.1 mrg /* The function returns TRUE if hard registers starting with
1430 1.1 mrg HARD_REGNO and containing value of MODE are fully in set
1431 1.1 mrg HARD_REGSET. */
1432 1.1 mrg static inline bool
1433 1.1 mrg ira_hard_reg_in_set_p (int hard_regno, machine_mode mode,
1434 1.1 mrg HARD_REG_SET hard_regset)
1435 1.1 mrg {
1436 1.1 mrg int i;
1437 1.1 mrg
1438 1.3 mrg ira_assert (hard_regno >= 0);
1439 1.1 mrg for (i = hard_regno_nregs[hard_regno][mode] - 1; i >= 0; i--)
1440 1.1 mrg if (!TEST_HARD_REG_BIT (hard_regset, hard_regno + i))
1441 1.3 mrg return false;
1442 1.1 mrg return true;
1443 1.1 mrg }
1444 1.1 mrg
1445 1.1 mrg
1446 1.1 mrg
1448 1.3 mrg /* To save memory we use a lazy approach for allocation and
1449 1.3 mrg initialization of the cost vectors. We do this only when it is
1450 1.1 mrg really necessary. */
1451 1.1 mrg
1452 1.1 mrg /* Allocate cost vector *VEC for hard registers of ACLASS and
1453 1.1 mrg initialize the elements by VAL if it is necessary */
1454 1.3 mrg static inline void
1455 1.3 mrg ira_allocate_and_set_costs (int **vec, reg_class_t aclass, int val)
1456 1.1 mrg {
1457 1.3 mrg int i, *reg_costs;
1458 1.1 mrg int len;
1459 1.1 mrg
1460 1.1 mrg if (*vec != NULL)
1461 1.1 mrg return;
1462 1.1 mrg *vec = reg_costs = ira_allocate_cost_vector (aclass);
1463 1.3 mrg len = ira_class_hard_regs_num[(int) aclass];
1464 1.3 mrg for (i = 0; i < len; i++)
1465 1.1 mrg reg_costs[i] = val;
1466 1.1 mrg }
1467 1.1 mrg
1468 1.3 mrg /* Allocate cost vector *VEC for hard registers of ACLASS and copy
1469 1.3 mrg values of vector SRC into the vector if it is necessary */
1470 1.1 mrg static inline void
1471 1.3 mrg ira_allocate_and_copy_costs (int **vec, enum reg_class aclass, int *src)
1472 1.1 mrg {
1473 1.1 mrg int len;
1474 1.1 mrg
1475 1.1 mrg if (*vec != NULL || src == NULL)
1476 1.1 mrg return;
1477 1.3 mrg *vec = ira_allocate_cost_vector (aclass);
1478 1.1 mrg len = ira_class_hard_regs_num[aclass];
1479 1.1 mrg memcpy (*vec, src, sizeof (int) * len);
1480 1.3 mrg }
1481 1.1 mrg
1482 1.1 mrg /* Allocate cost vector *VEC for hard registers of ACLASS and add
1483 1.1 mrg values of vector SRC into the vector if it is necessary */
1484 1.1 mrg static inline void
1485 1.1 mrg ira_allocate_and_accumulate_costs (int **vec, enum reg_class aclass, int *src)
1486 1.1 mrg {
1487 1.3 mrg int i, len;
1488 1.3 mrg
1489 1.3 mrg if (src == NULL)
1490 1.1 mrg return;
1491 1.3 mrg len = ira_class_hard_regs_num[aclass];
1492 1.1 mrg if (*vec == NULL)
1493 1.1 mrg {
1494 1.1 mrg *vec = ira_allocate_cost_vector (aclass);
1495 1.1 mrg memset (*vec, 0, sizeof (int) * len);
1496 1.1 mrg }
1497 1.1 mrg for (i = 0; i < len; i++)
1498 1.1 mrg (*vec)[i] += src[i];
1499 1.3 mrg }
1500 1.3 mrg
1501 1.1 mrg /* Allocate cost vector *VEC for hard registers of ACLASS and copy
1502 1.1 mrg values of vector SRC into the vector or initialize it by VAL (if
1503 1.1 mrg SRC is null). */
1504 1.1 mrg static inline void
1505 1.1 mrg ira_allocate_and_set_or_copy_costs (int **vec, enum reg_class aclass,
1506 1.1 mrg int val, int *src)
1507 1.1 mrg {
1508 1.1 mrg int i, *reg_costs;
1509 1.3 mrg int len;
1510 1.3 mrg
1511 1.3 mrg if (*vec != NULL)
1512 1.5 mrg return;
1513 1.5 mrg *vec = reg_costs = ira_allocate_cost_vector (aclass);
1514 len = ira_class_hard_regs_num[aclass];
1515 if (src != NULL)
1516 memcpy (reg_costs, src, sizeof (int) * len);
1517 else
1518 {
1519 for (i = 0; i < len; i++)
1520 reg_costs[i] = val;
1521 }
1522 }
1523
1524 extern rtx ira_create_new_reg (rtx);
1525 extern int first_moveable_pseudo, last_moveable_pseudo;
1526
1527 #endif /* GCC_IRA_INT_H */
1528