]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/ira-build.c
alpha.c (alpha_split_lock_test_and_set): Move memory barrier to below the test-and...
[thirdparty/gcc.git] / gcc / ira-build.c
CommitLineData
058e97ec
VM
1/* Building internal representation for IRA.
2 Copyright (C) 2006, 2007, 2008
3 Free Software Foundation, Inc.
4 Contributed by Vladimir Makarov <vmakarov@redhat.com>.
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 3, or (at your option) any later
11version.
12
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
17
18You should have received a copy of the GNU General Public License
19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
21
22#include "config.h"
23#include "system.h"
24#include "coretypes.h"
25#include "tm.h"
26#include "rtl.h"
27#include "tm_p.h"
28#include "target.h"
29#include "regs.h"
30#include "flags.h"
31#include "hard-reg-set.h"
32#include "basic-block.h"
33#include "insn-config.h"
34#include "recog.h"
35#include "toplev.h"
36#include "params.h"
37#include "df.h"
38#include "output.h"
39#include "reload.h"
40#include "sparseset.h"
41#include "ira-int.h"
42
43static ira_copy_t find_allocno_copy (ira_allocno_t, ira_allocno_t, rtx,
44 ira_loop_tree_node_t);
45
46/* The root of the loop tree corresponding to the all function. */
47ira_loop_tree_node_t ira_loop_tree_root;
48
49/* Height of the loop tree. */
50int ira_loop_tree_height;
51
52/* All nodes representing basic blocks are referred through the
53 following array. We can not use basic block member `aux' for this
54 because it is used for insertion of insns on edges. */
55ira_loop_tree_node_t ira_bb_nodes;
56
57/* All nodes representing loops are referred through the following
58 array. */
59ira_loop_tree_node_t ira_loop_nodes;
60
61/* Map regno -> allocnos with given regno (see comments for
62 allocno member `next_regno_allocno'). */
63ira_allocno_t *ira_regno_allocno_map;
64
65/* Array of references to all allocnos. The order number of the
66 allocno corresponds to the index in the array. Removed allocnos
67 have NULL element value. */
68ira_allocno_t *ira_allocnos;
69
70/* Sizes of the previous array. */
71int ira_allocnos_num;
72
73/* Map conflict id -> allocno with given conflict id (see comments for
74 allocno member `conflict_id'). */
75ira_allocno_t *ira_conflict_id_allocno_map;
76
77/* Array of references to all copies. The order number of the copy
78 corresponds to the index in the array. Removed copies have NULL
79 element value. */
80ira_copy_t *ira_copies;
81
82/* Size of the previous array. */
83int ira_copies_num;
84
85\f
86
87/* LAST_BASIC_BLOCK before generating additional insns because of live
88 range splitting. Emitting insns on a critical edge creates a new
89 basic block. */
90static int last_basic_block_before_change;
91
92/* The following function allocates the loop tree nodes. If LOOPS_P
93 is FALSE, the nodes corresponding to the loops (except the root
94 which corresponds the all function) will be not allocated but nodes
95 will still be allocated for basic blocks. */
96static void
97create_loop_tree_nodes (bool loops_p)
98{
99 unsigned int i, j;
100 int max_regno;
101 bool skip_p;
102 edge_iterator ei;
103 edge e;
104 VEC (edge, heap) *edges;
105 loop_p loop;
106
107 ira_bb_nodes
108 = ((struct ira_loop_tree_node *)
109 ira_allocate (sizeof (struct ira_loop_tree_node) * last_basic_block));
110 last_basic_block_before_change = last_basic_block;
111 for (i = 0; i < (unsigned int) last_basic_block; i++)
112 {
113 ira_bb_nodes[i].regno_allocno_map = NULL;
114 memset (ira_bb_nodes[i].reg_pressure, 0,
115 sizeof (ira_bb_nodes[i].reg_pressure));
116 ira_bb_nodes[i].mentioned_allocnos = NULL;
117 ira_bb_nodes[i].modified_regnos = NULL;
118 ira_bb_nodes[i].border_allocnos = NULL;
119 ira_bb_nodes[i].local_copies = NULL;
120 }
121 ira_loop_nodes = ((struct ira_loop_tree_node *)
122 ira_allocate (sizeof (struct ira_loop_tree_node)
123 * VEC_length (loop_p, ira_loops.larray)));
124 max_regno = max_reg_num ();
125 for (i = 0; VEC_iterate (loop_p, ira_loops.larray, i, loop); i++)
126 {
127 if (loop != ira_loops.tree_root)
128 {
129 ira_loop_nodes[i].regno_allocno_map = NULL;
130 if (! loops_p)
131 continue;
132 skip_p = false;
133 FOR_EACH_EDGE (e, ei, loop->header->preds)
134 if (e->src != loop->latch
135 && (e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e))
136 {
137 skip_p = true;
138 break;
139 }
140 if (skip_p)
141 continue;
142 edges = get_loop_exit_edges (loop);
143 for (j = 0; VEC_iterate (edge, edges, j, e); j++)
144 if ((e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e))
145 {
146 skip_p = true;
147 break;
148 }
149 VEC_free (edge, heap, edges);
150 if (skip_p)
151 continue;
152 }
153 ira_loop_nodes[i].regno_allocno_map
154 = (ira_allocno_t *) ira_allocate (sizeof (ira_allocno_t) * max_regno);
155 memset (ira_loop_nodes[i].regno_allocno_map, 0,
156 sizeof (ira_allocno_t) * max_regno);
157 memset (ira_loop_nodes[i].reg_pressure, 0,
158 sizeof (ira_loop_nodes[i].reg_pressure));
159 ira_loop_nodes[i].mentioned_allocnos = ira_allocate_bitmap ();
160 ira_loop_nodes[i].modified_regnos = ira_allocate_bitmap ();
161 ira_loop_nodes[i].border_allocnos = ira_allocate_bitmap ();
162 ira_loop_nodes[i].local_copies = ira_allocate_bitmap ();
163 }
164}
165
166/* The function returns TRUE if there are more one allocation
167 region. */
168static bool
169more_one_region_p (void)
170{
171 unsigned int i;
172 loop_p loop;
173
174 for (i = 0; VEC_iterate (loop_p, ira_loops.larray, i, loop); i++)
175 if (ira_loop_nodes[i].regno_allocno_map != NULL
176 && ira_loop_tree_root != &ira_loop_nodes[i])
177 return true;
178 return false;
179}
180
181/* Free the loop tree node of a loop. */
182static void
183finish_loop_tree_node (ira_loop_tree_node_t loop)
184{
185 if (loop->regno_allocno_map != NULL)
186 {
187 ira_assert (loop->bb == NULL);
188 ira_free_bitmap (loop->local_copies);
189 ira_free_bitmap (loop->border_allocnos);
190 ira_free_bitmap (loop->modified_regnos);
191 ira_free_bitmap (loop->mentioned_allocnos);
192 ira_free (loop->regno_allocno_map);
193 loop->regno_allocno_map = NULL;
194 }
195}
196
197/* Free the loop tree nodes. */
198static void
199finish_loop_tree_nodes (void)
200{
201 unsigned int i;
202 loop_p loop;
203
204 for (i = 0; VEC_iterate (loop_p, ira_loops.larray, i, loop); i++)
205 finish_loop_tree_node (&ira_loop_nodes[i]);
206 ira_free (ira_loop_nodes);
207 for (i = 0; i < (unsigned int) last_basic_block_before_change; i++)
208 {
209 if (ira_bb_nodes[i].local_copies != NULL)
210 ira_free_bitmap (ira_bb_nodes[i].local_copies);
211 if (ira_bb_nodes[i].border_allocnos != NULL)
212 ira_free_bitmap (ira_bb_nodes[i].border_allocnos);
213 if (ira_bb_nodes[i].modified_regnos != NULL)
214 ira_free_bitmap (ira_bb_nodes[i].modified_regnos);
215 if (ira_bb_nodes[i].mentioned_allocnos != NULL)
216 ira_free_bitmap (ira_bb_nodes[i].mentioned_allocnos);
217 if (ira_bb_nodes[i].regno_allocno_map != NULL)
218 ira_free (ira_bb_nodes[i].regno_allocno_map);
219 }
220 ira_free (ira_bb_nodes);
221}
222
223\f
224
225/* The following recursive function adds LOOP to the loop tree
226 hierarchy. LOOP is added only once. */
227static void
228add_loop_to_tree (struct loop *loop)
229{
230 struct loop *parent;
231 ira_loop_tree_node_t loop_node, parent_node;
232
233 /* We can not use loop node access macros here because of potential
234 checking and because the nodes are not initialized enough
235 yet. */
236 if (loop_outer (loop) != NULL)
237 add_loop_to_tree (loop_outer (loop));
238 if (ira_loop_nodes[loop->num].regno_allocno_map != NULL
239 && ira_loop_nodes[loop->num].children == NULL)
240 {
241 /* We have not added loop node to the tree yet. */
242 loop_node = &ira_loop_nodes[loop->num];
243 loop_node->loop = loop;
244 loop_node->bb = NULL;
245 for (parent = loop_outer (loop);
246 parent != NULL;
247 parent = loop_outer (parent))
248 if (ira_loop_nodes[parent->num].regno_allocno_map != NULL)
249 break;
250 if (parent == NULL)
251 {
252 loop_node->next = NULL;
253 loop_node->subloop_next = NULL;
254 loop_node->parent = NULL;
255 }
256 else
257 {
258 parent_node = &ira_loop_nodes[parent->num];
259 loop_node->next = parent_node->children;
260 parent_node->children = loop_node;
261 loop_node->subloop_next = parent_node->subloops;
262 parent_node->subloops = loop_node;
263 loop_node->parent = parent_node;
264 }
265 }
266}
267
268/* The following recursive function sets up levels of nodes of the
269 tree given its root LOOP_NODE. The enumeration starts with LEVEL.
270 The function returns maximal value of level in the tree + 1. */
271static int
272setup_loop_tree_level (ira_loop_tree_node_t loop_node, int level)
273{
274 int height, max_height;
275 ira_loop_tree_node_t subloop_node;
276
277 ira_assert (loop_node->bb == NULL);
278 loop_node->level = level;
279 max_height = level + 1;
280 for (subloop_node = loop_node->subloops;
281 subloop_node != NULL;
282 subloop_node = subloop_node->subloop_next)
283 {
284 ira_assert (subloop_node->bb == NULL);
285 height = setup_loop_tree_level (subloop_node, level + 1);
286 if (height > max_height)
287 max_height = height;
288 }
289 return max_height;
290}
291
292/* Create the loop tree. The algorithm is designed to provide correct
293 order of loops (they are ordered by their last loop BB) and basic
294 blocks in the chain formed by member next. */
295static void
296form_loop_tree (void)
297{
298 unsigned int i;
299 basic_block bb;
300 struct loop *parent;
301 ira_loop_tree_node_t bb_node, loop_node;
302 loop_p loop;
303
304 /* We can not use loop/bb node access macros because of potential
305 checking and because the nodes are not initialized enough
306 yet. */
307 for (i = 0; VEC_iterate (loop_p, ira_loops.larray, i, loop); i++)
308 if (ira_loop_nodes[i].regno_allocno_map != NULL)
309 {
310 ira_loop_nodes[i].children = NULL;
311 ira_loop_nodes[i].subloops = NULL;
312 }
313 FOR_EACH_BB_REVERSE (bb)
314 {
315 bb_node = &ira_bb_nodes[bb->index];
316 bb_node->bb = bb;
317 bb_node->loop = NULL;
318 bb_node->subloops = NULL;
319 bb_node->children = NULL;
320 bb_node->subloop_next = NULL;
321 bb_node->next = NULL;
322 for (parent = bb->loop_father;
323 parent != NULL;
324 parent = loop_outer (parent))
325 if (ira_loop_nodes[parent->num].regno_allocno_map != NULL)
326 break;
327 add_loop_to_tree (parent);
328 loop_node = &ira_loop_nodes[parent->num];
329 bb_node->next = loop_node->children;
330 bb_node->parent = loop_node;
331 loop_node->children = bb_node;
332 }
333 ira_loop_tree_root = IRA_LOOP_NODE_BY_INDEX (ira_loops.tree_root->num);
334 ira_loop_tree_height = setup_loop_tree_level (ira_loop_tree_root, 0);
335 ira_assert (ira_loop_tree_root->regno_allocno_map != NULL);
336}
337
338\f
339
340/* Rebuild IRA_REGNO_ALLOCNO_MAP and REGNO_ALLOCNO_MAPs of the loop
341 tree nodes. */
342static void
343rebuild_regno_allocno_maps (void)
344{
345 unsigned int l;
346 int max_regno, regno;
347 ira_allocno_t a;
348 ira_loop_tree_node_t loop_tree_node;
349 loop_p loop;
350 ira_allocno_iterator ai;
351
352 max_regno = max_reg_num ();
353 for (l = 0; VEC_iterate (loop_p, ira_loops.larray, l, loop); l++)
354 if (ira_loop_nodes[l].regno_allocno_map != NULL)
355 {
356 ira_free (ira_loop_nodes[l].regno_allocno_map);
357 ira_loop_nodes[l].regno_allocno_map
358 = (ira_allocno_t *) ira_allocate (sizeof (ira_allocno_t)
359 * max_regno);
360 memset (ira_loop_nodes[l].regno_allocno_map, 0,
361 sizeof (ira_allocno_t) * max_regno);
362 }
363 ira_free (ira_regno_allocno_map);
364 ira_regno_allocno_map
365 = (ira_allocno_t *) ira_allocate (max_regno * sizeof (ira_allocno_t));
366 memset (ira_regno_allocno_map, 0, max_regno * sizeof (ira_allocno_t));
367 FOR_EACH_ALLOCNO (a, ai)
368 {
369 if (ALLOCNO_CAP_MEMBER (a) != NULL)
370 /* Caps are not in the regno allocno maps. */
371 continue;
372 regno = ALLOCNO_REGNO (a);
373 loop_tree_node = ALLOCNO_LOOP_TREE_NODE (a);
374 ALLOCNO_NEXT_REGNO_ALLOCNO (a) = ira_regno_allocno_map[regno];
375 ira_regno_allocno_map[regno] = a;
376 if (loop_tree_node->regno_allocno_map[regno] == NULL)
377 /* Remember that we can create temporary allocnos to break
378 cycles in register shuffle. */
379 loop_tree_node->regno_allocno_map[regno] = a;
380 }
381}
382
383\f
384
385/* Pools for allocnos and allocno live ranges. */
386static alloc_pool allocno_pool, allocno_live_range_pool;
387
388/* Vec containing references to all created allocnos. It is a
389 container of array allocnos. */
390static VEC(ira_allocno_t,heap) *allocno_vec;
391
392/* Vec containing references to all created allocnos. It is a
393 container of ira_conflict_id_allocno_map. */
394static VEC(ira_allocno_t,heap) *ira_conflict_id_allocno_map_vec;
395
396/* Initialize data concerning allocnos. */
397static void
398initiate_allocnos (void)
399{
400 allocno_live_range_pool
401 = create_alloc_pool ("allocno live ranges",
402 sizeof (struct ira_allocno_live_range), 100);
403 allocno_pool
404 = create_alloc_pool ("allocnos", sizeof (struct ira_allocno), 100);
405 allocno_vec = VEC_alloc (ira_allocno_t, heap, max_reg_num () * 2);
406 ira_allocnos = NULL;
407 ira_allocnos_num = 0;
408 ira_conflict_id_allocno_map_vec
409 = VEC_alloc (ira_allocno_t, heap, max_reg_num () * 2);
410 ira_conflict_id_allocno_map = NULL;
411 ira_regno_allocno_map
412 = (ira_allocno_t *) ira_allocate (max_reg_num () * sizeof (ira_allocno_t));
413 memset (ira_regno_allocno_map, 0, max_reg_num () * sizeof (ira_allocno_t));
414}
415
416/* Create and return the allocno corresponding to REGNO in
417 LOOP_TREE_NODE. Add the allocno to the list of allocnos with the
418 same regno if CAP_P is FALSE. */
419ira_allocno_t
420ira_create_allocno (int regno, bool cap_p, ira_loop_tree_node_t loop_tree_node)
421{
422 ira_allocno_t a;
423
424 a = (ira_allocno_t) pool_alloc (allocno_pool);
425 ALLOCNO_REGNO (a) = regno;
426 ALLOCNO_LOOP_TREE_NODE (a) = loop_tree_node;
427 if (! cap_p)
428 {
429 ALLOCNO_NEXT_REGNO_ALLOCNO (a) = ira_regno_allocno_map[regno];
430 ira_regno_allocno_map[regno] = a;
431 if (loop_tree_node->regno_allocno_map[regno] == NULL)
432 /* Remember that we can create temporary allocnos to break
433 cycles in register shuffle on region borders (see
434 ira-emit.c). */
435 loop_tree_node->regno_allocno_map[regno] = a;
436 }
437 ALLOCNO_CAP (a) = NULL;
438 ALLOCNO_CAP_MEMBER (a) = NULL;
439 ALLOCNO_NUM (a) = ira_allocnos_num;
440 ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a) = NULL;
441 ALLOCNO_CONFLICT_ALLOCNOS_NUM (a) = 0;
442 COPY_HARD_REG_SET (ALLOCNO_CONFLICT_HARD_REGS (a), ira_no_alloc_regs);
443 COPY_HARD_REG_SET (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a), ira_no_alloc_regs);
444 ALLOCNO_NREFS (a) = 0;
445 ALLOCNO_FREQ (a) = 1;
446 ALLOCNO_HARD_REGNO (a) = -1;
447 ALLOCNO_CALL_FREQ (a) = 0;
448 ALLOCNO_CALLS_CROSSED_NUM (a) = 0;
449#ifdef STACK_REGS
450 ALLOCNO_NO_STACK_REG_P (a) = false;
451 ALLOCNO_TOTAL_NO_STACK_REG_P (a) = false;
452#endif
453 ALLOCNO_MEM_OPTIMIZED_DEST (a) = NULL;
454 ALLOCNO_MEM_OPTIMIZED_DEST_P (a) = false;
455 ALLOCNO_SOMEWHERE_RENAMED_P (a) = false;
456 ALLOCNO_CHILD_RENAMED_P (a) = false;
457 ALLOCNO_DONT_REASSIGN_P (a) = false;
458 ALLOCNO_IN_GRAPH_P (a) = false;
459 ALLOCNO_ASSIGNED_P (a) = false;
460 ALLOCNO_MAY_BE_SPILLED_P (a) = false;
461 ALLOCNO_SPLAY_REMOVED_P (a) = false;
462 ALLOCNO_CONFLICT_VEC_P (a) = false;
463 ALLOCNO_MODE (a) = (regno < 0 ? VOIDmode : PSEUDO_REGNO_MODE (regno));
464 ALLOCNO_COPIES (a) = NULL;
465 ALLOCNO_HARD_REG_COSTS (a) = NULL;
466 ALLOCNO_CONFLICT_HARD_REG_COSTS (a) = NULL;
467 ALLOCNO_UPDATED_HARD_REG_COSTS (a) = NULL;
468 ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) = NULL;
469 ALLOCNO_LEFT_CONFLICTS_NUM (a) = -1;
470 ALLOCNO_COVER_CLASS (a) = NO_REGS;
471 ALLOCNO_COVER_CLASS_COST (a) = 0;
472 ALLOCNO_MEMORY_COST (a) = 0;
473 ALLOCNO_UPDATED_MEMORY_COST (a) = 0;
474 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a) = 0;
475 ALLOCNO_NEXT_BUCKET_ALLOCNO (a) = NULL;
476 ALLOCNO_PREV_BUCKET_ALLOCNO (a) = NULL;
477 ALLOCNO_FIRST_COALESCED_ALLOCNO (a) = a;
478 ALLOCNO_NEXT_COALESCED_ALLOCNO (a) = a;
479 ALLOCNO_LIVE_RANGES (a) = NULL;
480 ALLOCNO_MIN (a) = INT_MAX;
481 ALLOCNO_MAX (a) = -1;
482 ALLOCNO_CONFLICT_ID (a) = ira_allocnos_num;
483 VEC_safe_push (ira_allocno_t, heap, allocno_vec, a);
484 ira_allocnos = VEC_address (ira_allocno_t, allocno_vec);
485 ira_allocnos_num = VEC_length (ira_allocno_t, allocno_vec);
486 VEC_safe_push (ira_allocno_t, heap, ira_conflict_id_allocno_map_vec, a);
487 ira_conflict_id_allocno_map
488 = VEC_address (ira_allocno_t, ira_conflict_id_allocno_map_vec);
489 return a;
490}
491
492/* Set up cover class for A and update its conflict hard registers. */
493void
494ira_set_allocno_cover_class (ira_allocno_t a, enum reg_class cover_class)
495{
496 ALLOCNO_COVER_CLASS (a) = cover_class;
497 IOR_COMPL_HARD_REG_SET (ALLOCNO_CONFLICT_HARD_REGS (a),
498 reg_class_contents[cover_class]);
499 IOR_COMPL_HARD_REG_SET (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a),
500 reg_class_contents[cover_class]);
501}
502
503/* Return TRUE if the conflict vector with NUM elements is more
504 profitable than conflict bit vector for A. */
505bool
506ira_conflict_vector_profitable_p (ira_allocno_t a, int num)
507{
508 int nw;
509
510 if (ALLOCNO_MAX (a) < ALLOCNO_MIN (a))
511 /* We prefer bit vector in such case because it does not result in
512 allocation. */
513 return false;
514
515 nw = (ALLOCNO_MAX (a) - ALLOCNO_MIN (a) + IRA_INT_BITS) / IRA_INT_BITS;
516 return (2 * sizeof (ira_allocno_t) * (num + 1)
517 < 3 * nw * sizeof (IRA_INT_TYPE));
518}
519
520/* Allocates and initialize the conflict vector of A for NUM
521 conflicting allocnos. */
522void
523ira_allocate_allocno_conflict_vec (ira_allocno_t a, int num)
524{
525 int size;
526 ira_allocno_t *vec;
527
528 ira_assert (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a) == NULL);
529 num++; /* for NULL end marker */
530 size = sizeof (ira_allocno_t) * num;
531 ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a) = ira_allocate (size);
532 vec = (ira_allocno_t *) ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a);
533 vec[0] = NULL;
534 ALLOCNO_CONFLICT_ALLOCNOS_NUM (a) = 0;
535 ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a) = size;
536 ALLOCNO_CONFLICT_VEC_P (a) = true;
537}
538
539/* Allocate and initialize the conflict bit vector of A. */
540static void
541allocate_allocno_conflict_bit_vec (ira_allocno_t a)
542{
543 unsigned int size;
544
545 ira_assert (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a) == NULL);
546 size = ((ALLOCNO_MAX (a) - ALLOCNO_MIN (a) + IRA_INT_BITS)
547 / IRA_INT_BITS * sizeof (IRA_INT_TYPE));
548 ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a) = ira_allocate (size);
549 memset (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a), 0, size);
550 ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a) = size;
551 ALLOCNO_CONFLICT_VEC_P (a) = false;
552}
553
554/* Allocate and initialize the conflict vector or conflict bit vector
555 of A for NUM conflicting allocnos whatever is more profitable. */
556void
557ira_allocate_allocno_conflicts (ira_allocno_t a, int num)
558{
559 if (ira_conflict_vector_profitable_p (a, num))
560 ira_allocate_allocno_conflict_vec (a, num);
561 else
562 allocate_allocno_conflict_bit_vec (a);
563}
564
565/* Add A2 to the conflicts of A1. */
566static void
567add_to_allocno_conflicts (ira_allocno_t a1, ira_allocno_t a2)
568{
569 int num;
570 unsigned int size;
571
572 if (ALLOCNO_CONFLICT_VEC_P (a1))
573 {
574 ira_allocno_t *vec;
575
576 num = ALLOCNO_CONFLICT_ALLOCNOS_NUM (a1) + 2;
577 if (ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1)
578 >= num * sizeof (ira_allocno_t))
579 vec = (ira_allocno_t *) ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1);
580 else
581 {
582 size = (3 * num / 2 + 1) * sizeof (ira_allocno_t);
583 vec = (ira_allocno_t *) ira_allocate (size);
584 memcpy (vec, ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1),
585 sizeof (ira_allocno_t) * ALLOCNO_CONFLICT_ALLOCNOS_NUM (a1));
586 ira_free (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1));
587 ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1) = vec;
588 ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1) = size;
589 }
590 vec[num - 2] = a2;
591 vec[num - 1] = NULL;
592 ALLOCNO_CONFLICT_ALLOCNOS_NUM (a1)++;
593 }
594 else
595 {
596 int nw, added_head_nw, id;
597 IRA_INT_TYPE *vec;
598
599 id = ALLOCNO_CONFLICT_ID (a2);
600 vec = (IRA_INT_TYPE *) ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1);
601 if (ALLOCNO_MIN (a1) > id)
602 {
603 /* Expand head of the bit vector. */
604 added_head_nw = (ALLOCNO_MIN (a1) - id - 1) / IRA_INT_BITS + 1;
605 nw = (ALLOCNO_MAX (a1) - ALLOCNO_MIN (a1)) / IRA_INT_BITS + 1;
606 size = (nw + added_head_nw) * sizeof (IRA_INT_TYPE);
607 if (ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1) >= size)
608 {
609 memmove ((char *) vec + added_head_nw * sizeof (IRA_INT_TYPE),
610 vec, nw * sizeof (IRA_INT_TYPE));
611 memset (vec, 0, added_head_nw * sizeof (IRA_INT_TYPE));
612 }
613 else
614 {
615 size
616 = (3 * (nw + added_head_nw) / 2 + 1) * sizeof (IRA_INT_TYPE);
617 vec = (IRA_INT_TYPE *) ira_allocate (size);
618 memcpy ((char *) vec + added_head_nw * sizeof (IRA_INT_TYPE),
619 ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1),
620 nw * sizeof (IRA_INT_TYPE));
621 memset (vec, 0, added_head_nw * sizeof (IRA_INT_TYPE));
622 memset ((char *) vec
623 + (nw + added_head_nw) * sizeof (IRA_INT_TYPE),
624 0, size - (nw + added_head_nw) * sizeof (IRA_INT_TYPE));
625 ira_free (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1));
626 ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1) = vec;
627 ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1) = size;
628 }
629 ALLOCNO_MIN (a1) -= added_head_nw * IRA_INT_BITS;
630 }
631 else if (ALLOCNO_MAX (a1) < id)
632 {
633 nw = (id - ALLOCNO_MIN (a1)) / IRA_INT_BITS + 1;
634 size = nw * sizeof (IRA_INT_TYPE);
635 if (ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1) < size)
636 {
637 /* Expand tail of the bit vector. */
638 size = (3 * nw / 2 + 1) * sizeof (IRA_INT_TYPE);
639 vec = (IRA_INT_TYPE *) ira_allocate (size);
640 memcpy (vec, ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1),
641 ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1));
642 memset ((char *) vec + ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1),
643 0, size - ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1));
644 ira_free (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1));
645 ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a1) = vec;
646 ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a1) = size;
647 }
648 ALLOCNO_MAX (a1) = id;
649 }
650 SET_ALLOCNO_SET_BIT (vec, id, ALLOCNO_MIN (a1), ALLOCNO_MAX (a1));
651 }
652}
653
654/* Add A1 to the conflicts of A2 and vise versa. */
655void
656ira_add_allocno_conflict (ira_allocno_t a1, ira_allocno_t a2)
657{
658 add_to_allocno_conflicts (a1, a2);
659 add_to_allocno_conflicts (a2, a1);
660}
661
662/* Clear all conflicts of allocno A. */
663static void
664clear_allocno_conflicts (ira_allocno_t a)
665{
666 if (ALLOCNO_CONFLICT_VEC_P (a))
667 {
668 ALLOCNO_CONFLICT_ALLOCNOS_NUM (a) = 0;
669 ((ira_allocno_t *) ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a))[0] = NULL;
670 }
671 else if (ALLOCNO_CONFLICT_ALLOCNO_ARRAY_SIZE (a) != 0)
672 {
673 int nw;
674
675 nw = (ALLOCNO_MAX (a) - ALLOCNO_MIN (a)) / IRA_INT_BITS + 1;
676 memset (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a), 0,
677 nw * sizeof (IRA_INT_TYPE));
678 }
679}
680
681/* The array used to find duplications in conflict vectors of
682 allocnos. */
683static int *allocno_conflict_check;
684
685/* The value used to mark allocation presence in conflict vector of
686 the current allocno. */
687static int curr_allocno_conflict_check_tick;
688
689/* Remove duplications in conflict vector of A. */
690static void
691compress_allocno_conflict_vec (ira_allocno_t a)
692{
693 ira_allocno_t *vec, conflict_a;
694 int i, j;
695
696 ira_assert (ALLOCNO_CONFLICT_VEC_P (a));
697 vec = (ira_allocno_t *) ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a);
698 curr_allocno_conflict_check_tick++;
699 for (i = j = 0; (conflict_a = vec[i]) != NULL; i++)
700 {
701 if (allocno_conflict_check[ALLOCNO_NUM (conflict_a)]
702 != curr_allocno_conflict_check_tick)
703 {
704 allocno_conflict_check[ALLOCNO_NUM (conflict_a)]
705 = curr_allocno_conflict_check_tick;
706 vec[j++] = conflict_a;
707 }
708 }
709 ALLOCNO_CONFLICT_ALLOCNOS_NUM (a) = j;
710 vec[j] = NULL;
711}
712
713/* Remove duplications in conflict vectors of all allocnos. */
714static void
715compress_conflict_vecs (void)
716{
717 ira_allocno_t a;
718 ira_allocno_iterator ai;
719
720 allocno_conflict_check
721 = (int *) ira_allocate (sizeof (int) * ira_allocnos_num);
722 memset (allocno_conflict_check, 0, sizeof (int) * ira_allocnos_num);
723 curr_allocno_conflict_check_tick = 0;
724 FOR_EACH_ALLOCNO (a, ai)
725 if (ALLOCNO_CONFLICT_VEC_P (a))
726 compress_allocno_conflict_vec (a);
727 ira_free (allocno_conflict_check);
728}
729
730/* This recursive function outputs allocno A and if it is a cap the
731 function outputs its members. */
732void
733ira_print_expanded_allocno (ira_allocno_t a)
734{
735 basic_block bb;
736
737 fprintf (ira_dump_file, " a%d(r%d", ALLOCNO_NUM (a), ALLOCNO_REGNO (a));
738 if ((bb = ALLOCNO_LOOP_TREE_NODE (a)->bb) != NULL)
739 fprintf (ira_dump_file, ",b%d", bb->index);
740 else
741 fprintf (ira_dump_file, ",l%d", ALLOCNO_LOOP_TREE_NODE (a)->loop->num);
742 if (ALLOCNO_CAP_MEMBER (a) != NULL)
743 {
744 fprintf (ira_dump_file, ":");
745 ira_print_expanded_allocno (ALLOCNO_CAP_MEMBER (a));
746 }
747 fprintf (ira_dump_file, ")");
748}
749
750/* Create and return the cap representing allocno A in the
751 parent loop. */
752static ira_allocno_t
753create_cap_allocno (ira_allocno_t a)
754{
755 ira_allocno_t cap;
756 ira_loop_tree_node_t parent;
757 enum reg_class cover_class;
758
759 ira_assert (ALLOCNO_FIRST_COALESCED_ALLOCNO (a) == a
760 && ALLOCNO_NEXT_COALESCED_ALLOCNO (a) == a);
761 parent = ALLOCNO_LOOP_TREE_NODE (a)->parent;
762 cap = ira_create_allocno (ALLOCNO_REGNO (a), true, parent);
763 ALLOCNO_MODE (cap) = ALLOCNO_MODE (a);
764 cover_class = ALLOCNO_COVER_CLASS (a);
765 ira_set_allocno_cover_class (cap, cover_class);
766 ALLOCNO_AVAILABLE_REGS_NUM (cap) = ALLOCNO_AVAILABLE_REGS_NUM (a);
767 ALLOCNO_CAP_MEMBER (cap) = a;
768 bitmap_set_bit (parent->mentioned_allocnos, ALLOCNO_NUM (cap));
769 ALLOCNO_CAP (a) = cap;
770 ALLOCNO_COVER_CLASS_COST (cap) = ALLOCNO_COVER_CLASS_COST (a);
771 ALLOCNO_MEMORY_COST (cap) = ALLOCNO_MEMORY_COST (a);
772 ALLOCNO_UPDATED_MEMORY_COST (cap) = ALLOCNO_UPDATED_MEMORY_COST (a);
773 ira_allocate_and_copy_costs
774 (&ALLOCNO_HARD_REG_COSTS (cap), cover_class, ALLOCNO_HARD_REG_COSTS (a));
775 ira_allocate_and_copy_costs
776 (&ALLOCNO_CONFLICT_HARD_REG_COSTS (cap), cover_class,
777 ALLOCNO_CONFLICT_HARD_REG_COSTS (a));
778 ALLOCNO_NREFS (cap) = ALLOCNO_NREFS (a);
779 ALLOCNO_FREQ (cap) = ALLOCNO_FREQ (a);
780 ALLOCNO_CALL_FREQ (cap) = ALLOCNO_CALL_FREQ (a);
781 IOR_HARD_REG_SET (ALLOCNO_CONFLICT_HARD_REGS (cap),
782 ALLOCNO_CONFLICT_HARD_REGS (a));
783 IOR_HARD_REG_SET (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (cap),
784 ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a));
785 ALLOCNO_CALLS_CROSSED_NUM (cap) = ALLOCNO_CALLS_CROSSED_NUM (a);
786#ifdef STACK_REGS
787 ALLOCNO_NO_STACK_REG_P (cap) = ALLOCNO_NO_STACK_REG_P (a);
788 ALLOCNO_TOTAL_NO_STACK_REG_P (cap) = ALLOCNO_TOTAL_NO_STACK_REG_P (a);
789#endif
790 if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
791 {
792 fprintf (ira_dump_file, " Creating cap ");
793 ira_print_expanded_allocno (cap);
794 fprintf (ira_dump_file, "\n");
795 }
796 return cap;
797}
798
799/* Create and return allocno live range with given attributes. */
800allocno_live_range_t
801ira_create_allocno_live_range (ira_allocno_t a, int start, int finish,
802 allocno_live_range_t next)
803{
804 allocno_live_range_t p;
805
806 p = (allocno_live_range_t) pool_alloc (allocno_live_range_pool);
807 p->allocno = a;
808 p->start = start;
809 p->finish = finish;
810 p->next = next;
811 return p;
812}
813
814/* Copy allocno live range R and return the result. */
815static allocno_live_range_t
816copy_allocno_live_range (allocno_live_range_t r)
817{
818 allocno_live_range_t p;
819
820 p = (allocno_live_range_t) pool_alloc (allocno_live_range_pool);
821 *p = *r;
822 return p;
823}
824
825/* Copy allocno live range list given by its head R and return the
826 result. */
827static allocno_live_range_t
828copy_allocno_live_range_list (allocno_live_range_t r)
829{
830 allocno_live_range_t p, first, last;
831
832 if (r == NULL)
833 return NULL;
834 for (first = last = NULL; r != NULL; r = r->next)
835 {
836 p = copy_allocno_live_range (r);
837 if (first == NULL)
838 first = p;
839 else
840 last->next = p;
841 last = p;
842 }
843 return first;
844}
845
846/* Free allocno live range R. */
847void
848ira_finish_allocno_live_range (allocno_live_range_t r)
849{
850 pool_free (allocno_live_range_pool, r);
851}
852
853/* Free updated register costs of allocno A. */
854void
855ira_free_allocno_updated_costs (ira_allocno_t a)
856{
857 enum reg_class cover_class;
858
859 cover_class = ALLOCNO_COVER_CLASS (a);
860 if (ALLOCNO_UPDATED_HARD_REG_COSTS (a) != NULL)
861 ira_free_cost_vector (ALLOCNO_UPDATED_HARD_REG_COSTS (a), cover_class);
862 ALLOCNO_UPDATED_HARD_REG_COSTS (a) = NULL;
863 if (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) != NULL)
864 ira_free_cost_vector (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a),
865 cover_class);
866 ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) = NULL;
867}
868
869/* Free the memory allocated for allocno A. */
870static void
871finish_allocno (ira_allocno_t a)
872{
873 allocno_live_range_t r, next_r;
874 enum reg_class cover_class = ALLOCNO_COVER_CLASS (a);
875
876 ira_allocnos[ALLOCNO_NUM (a)] = NULL;
877 ira_conflict_id_allocno_map[ALLOCNO_CONFLICT_ID (a)] = NULL;
878 if (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a) != NULL)
879 ira_free (ALLOCNO_CONFLICT_ALLOCNO_ARRAY (a));
880 if (ALLOCNO_HARD_REG_COSTS (a) != NULL)
881 ira_free_cost_vector (ALLOCNO_HARD_REG_COSTS (a), cover_class);
882 if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a) != NULL)
883 ira_free_cost_vector (ALLOCNO_CONFLICT_HARD_REG_COSTS (a), cover_class);
884 if (ALLOCNO_UPDATED_HARD_REG_COSTS (a) != NULL)
885 ira_free_cost_vector (ALLOCNO_UPDATED_HARD_REG_COSTS (a), cover_class);
886 if (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) != NULL)
887 ira_free_cost_vector (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a),
888 cover_class);
889 for (r = ALLOCNO_LIVE_RANGES (a); r != NULL; r = next_r)
890 {
891 next_r = r->next;
892 ira_finish_allocno_live_range (r);
893 }
894 pool_free (allocno_pool, a);
895}
896
897/* Free the memory allocated for all allocnos. */
898static void
899finish_allocnos (void)
900{
901 ira_allocno_t a;
902 ira_allocno_iterator ai;
903
904 FOR_EACH_ALLOCNO (a, ai)
905 finish_allocno (a);
906 ira_free (ira_regno_allocno_map);
907 VEC_free (ira_allocno_t, heap, ira_conflict_id_allocno_map_vec);
908 VEC_free (ira_allocno_t, heap, allocno_vec);
909 free_alloc_pool (allocno_pool);
910 free_alloc_pool (allocno_live_range_pool);
911}
912
913\f
914
915/* Pools for copies. */
916static alloc_pool copy_pool;
917
918/* Vec containing references to all created copies. It is a
919 container of array ira_copies. */
920static VEC(ira_copy_t,heap) *copy_vec;
921
922/* The function initializes data concerning allocno copies. */
923static void
924initiate_copies (void)
925{
926 copy_pool
927 = create_alloc_pool ("copies", sizeof (struct ira_allocno_copy), 100);
928 copy_vec = VEC_alloc (ira_copy_t, heap, get_max_uid ());
929 ira_copies = NULL;
930 ira_copies_num = 0;
931}
932
933/* Return copy connecting A1 and A2 and originated from INSN of
934 LOOP_TREE_NODE if any. */
935static ira_copy_t
936find_allocno_copy (ira_allocno_t a1, ira_allocno_t a2, rtx insn,
937 ira_loop_tree_node_t loop_tree_node)
938{
939 ira_copy_t cp, next_cp;
940 ira_allocno_t another_a;
941
942 for (cp = ALLOCNO_COPIES (a1); cp != NULL; cp = next_cp)
943 {
944 if (cp->first == a1)
945 {
946 next_cp = cp->next_first_allocno_copy;
947 another_a = cp->second;
948 }
949 else if (cp->second == a1)
950 {
951 next_cp = cp->next_second_allocno_copy;
952 another_a = cp->first;
953 }
954 else
955 gcc_unreachable ();
956 if (another_a == a2 && cp->insn == insn
957 && cp->loop_tree_node == loop_tree_node)
958 return cp;
959 }
960 return NULL;
961}
962
963/* Create and return copy with given attributes LOOP_TREE_NODE, FIRST,
964 SECOND, FREQ, and INSN. */
965ira_copy_t
966ira_create_copy (ira_allocno_t first, ira_allocno_t second, int freq, rtx insn,
967 ira_loop_tree_node_t loop_tree_node)
968{
969 ira_copy_t cp;
970
971 cp = (ira_copy_t) pool_alloc (copy_pool);
972 cp->num = ira_copies_num;
973 cp->first = first;
974 cp->second = second;
975 cp->freq = freq;
976 cp->insn = insn;
977 cp->loop_tree_node = loop_tree_node;
978 VEC_safe_push (ira_copy_t, heap, copy_vec, cp);
979 ira_copies = VEC_address (ira_copy_t, copy_vec);
980 ira_copies_num = VEC_length (ira_copy_t, copy_vec);
981 return cp;
982}
983
984/* Attach a copy CP to allocnos involved into the copy. */
985void
986ira_add_allocno_copy_to_list (ira_copy_t cp)
987{
988 ira_allocno_t first = cp->first, second = cp->second;
989
990 cp->prev_first_allocno_copy = NULL;
991 cp->prev_second_allocno_copy = NULL;
992 cp->next_first_allocno_copy = ALLOCNO_COPIES (first);
993 if (cp->next_first_allocno_copy != NULL)
994 {
995 if (cp->next_first_allocno_copy->first == first)
996 cp->next_first_allocno_copy->prev_first_allocno_copy = cp;
997 else
998 cp->next_first_allocno_copy->prev_second_allocno_copy = cp;
999 }
1000 cp->next_second_allocno_copy = ALLOCNO_COPIES (second);
1001 if (cp->next_second_allocno_copy != NULL)
1002 {
1003 if (cp->next_second_allocno_copy->second == second)
1004 cp->next_second_allocno_copy->prev_second_allocno_copy = cp;
1005 else
1006 cp->next_second_allocno_copy->prev_first_allocno_copy = cp;
1007 }
1008 ALLOCNO_COPIES (first) = cp;
1009 ALLOCNO_COPIES (second) = cp;
1010}
1011
1012/* Detach a copy CP from allocnos involved into the copy. */
1013void
1014ira_remove_allocno_copy_from_list (ira_copy_t cp)
1015{
1016 ira_allocno_t first = cp->first, second = cp->second;
1017 ira_copy_t prev, next;
1018
1019 next = cp->next_first_allocno_copy;
1020 prev = cp->prev_first_allocno_copy;
1021 if (prev == NULL)
1022 ALLOCNO_COPIES (first) = next;
1023 else if (prev->first == first)
1024 prev->next_first_allocno_copy = next;
1025 else
1026 prev->next_second_allocno_copy = next;
1027 if (next != NULL)
1028 {
1029 if (next->first == first)
1030 next->prev_first_allocno_copy = prev;
1031 else
1032 next->prev_second_allocno_copy = prev;
1033 }
1034 cp->prev_first_allocno_copy = cp->next_first_allocno_copy = NULL;
1035
1036 next = cp->next_second_allocno_copy;
1037 prev = cp->prev_second_allocno_copy;
1038 if (prev == NULL)
1039 ALLOCNO_COPIES (second) = next;
1040 else if (prev->second == second)
1041 prev->next_second_allocno_copy = next;
1042 else
1043 prev->next_first_allocno_copy = next;
1044 if (next != NULL)
1045 {
1046 if (next->second == second)
1047 next->prev_second_allocno_copy = prev;
1048 else
1049 next->prev_first_allocno_copy = prev;
1050 }
1051 cp->prev_second_allocno_copy = cp->next_second_allocno_copy = NULL;
1052}
1053
1054/* Make a copy CP a canonical copy where number of the
1055 first allocno is less than the second one. */
1056void
1057ira_swap_allocno_copy_ends_if_necessary (ira_copy_t cp)
1058{
1059 ira_allocno_t temp;
1060 ira_copy_t temp_cp;
1061
1062 if (ALLOCNO_NUM (cp->first) <= ALLOCNO_NUM (cp->second))
1063 return;
1064
1065 temp = cp->first;
1066 cp->first = cp->second;
1067 cp->second = temp;
1068
1069 temp_cp = cp->prev_first_allocno_copy;
1070 cp->prev_first_allocno_copy = cp->prev_second_allocno_copy;
1071 cp->prev_second_allocno_copy = temp_cp;
1072
1073 temp_cp = cp->next_first_allocno_copy;
1074 cp->next_first_allocno_copy = cp->next_second_allocno_copy;
1075 cp->next_second_allocno_copy = temp_cp;
1076}
1077
1078/* Create (or update frequency if the copy already exists) and return
1079 the copy of allocnos FIRST and SECOND with frequency FREQ
1080 corresponding to move insn INSN (if any) and originated from
1081 LOOP_TREE_NODE. */
1082ira_copy_t
1083ira_add_allocno_copy (ira_allocno_t first, ira_allocno_t second, int freq,
1084 rtx insn, ira_loop_tree_node_t loop_tree_node)
1085{
1086 ira_copy_t cp;
1087
1088 if ((cp = find_allocno_copy (first, second, insn, loop_tree_node)) != NULL)
1089 {
1090 cp->freq += freq;
1091 return cp;
1092 }
1093 cp = ira_create_copy (first, second, freq, insn, loop_tree_node);
1094 ira_assert (first != NULL && second != NULL);
1095 ira_add_allocno_copy_to_list (cp);
1096 ira_swap_allocno_copy_ends_if_necessary (cp);
1097 return cp;
1098}
1099
1100/* Print info about copies involving allocno A into file F. */
1101static void
1102print_allocno_copies (FILE *f, ira_allocno_t a)
1103{
1104 ira_allocno_t another_a;
1105 ira_copy_t cp, next_cp;
1106
1107 fprintf (f, " a%d(r%d):", ALLOCNO_NUM (a), ALLOCNO_REGNO (a));
1108 for (cp = ALLOCNO_COPIES (a); cp != NULL; cp = next_cp)
1109 {
1110 if (cp->first == a)
1111 {
1112 next_cp = cp->next_first_allocno_copy;
1113 another_a = cp->second;
1114 }
1115 else if (cp->second == a)
1116 {
1117 next_cp = cp->next_second_allocno_copy;
1118 another_a = cp->first;
1119 }
1120 else
1121 gcc_unreachable ();
1122 fprintf (f, " cp%d:a%d(r%d)@%d", cp->num,
1123 ALLOCNO_NUM (another_a), ALLOCNO_REGNO (another_a), cp->freq);
1124 }
1125 fprintf (f, "\n");
1126}
1127
1128/* Print info about copies involving allocno A into stderr. */
1129void
1130ira_debug_allocno_copies (ira_allocno_t a)
1131{
1132 print_allocno_copies (stderr, a);
1133}
1134
1135/* The function frees memory allocated for copy CP. */
1136static void
1137finish_copy (ira_copy_t cp)
1138{
1139 pool_free (copy_pool, cp);
1140}
1141
1142
1143/* Free memory allocated for all copies. */
1144static void
1145finish_copies (void)
1146{
1147 ira_copy_t cp;
1148 ira_copy_iterator ci;
1149
1150 FOR_EACH_COPY (cp, ci)
1151 finish_copy (cp);
1152 VEC_free (ira_copy_t, heap, copy_vec);
1153 free_alloc_pool (copy_pool);
1154}
1155
1156\f
1157
1158/* Pools for cost vectors. It is defined only for cover classes. */
1159static alloc_pool cost_vector_pool[N_REG_CLASSES];
1160
1161/* The function initiates work with hard register cost vectors. It
1162 creates allocation pool for each cover class. */
1163static void
1164initiate_cost_vectors (void)
1165{
1166 int i;
1167 enum reg_class cover_class;
1168
1169 for (i = 0; i < ira_reg_class_cover_size; i++)
1170 {
1171 cover_class = ira_reg_class_cover[i];
1172 cost_vector_pool[cover_class]
1173 = create_alloc_pool ("cost vectors",
1174 sizeof (int)
1175 * ira_class_hard_regs_num[cover_class],
1176 100);
1177 }
1178}
1179
1180/* Allocate and return a cost vector VEC for COVER_CLASS. */
1181int *
1182ira_allocate_cost_vector (enum reg_class cover_class)
1183{
1184 return (int *) pool_alloc (cost_vector_pool[cover_class]);
1185}
1186
1187/* Free a cost vector VEC for COVER_CLASS. */
1188void
1189ira_free_cost_vector (int *vec, enum reg_class cover_class)
1190{
1191 ira_assert (vec != NULL);
1192 pool_free (cost_vector_pool[cover_class], vec);
1193}
1194
1195/* Finish work with hard register cost vectors. Release allocation
1196 pool for each cover class. */
1197static void
1198finish_cost_vectors (void)
1199{
1200 int i;
1201 enum reg_class cover_class;
1202
1203 for (i = 0; i < ira_reg_class_cover_size; i++)
1204 {
1205 cover_class = ira_reg_class_cover[i];
1206 free_alloc_pool (cost_vector_pool[cover_class]);
1207 }
1208}
1209
1210\f
1211
1212/* The current loop tree node and its regno allocno map. */
1213ira_loop_tree_node_t ira_curr_loop_tree_node;
1214ira_allocno_t *ira_curr_regno_allocno_map;
1215
1216/* This recursive function traverses loop tree with root LOOP_NODE
1217 calling non-null functions PREORDER_FUNC and POSTORDER_FUNC
1218 correspondingly in preorder and postorder. The function sets up
1219 IRA_CURR_LOOP_TREE_NODE and IRA_CURR_REGNO_ALLOCNO_MAP. If BB_P,
1220 basic block nodes of LOOP_NODE is also processed (before its
1221 subloop nodes). */
1222void
1223ira_traverse_loop_tree (bool bb_p, ira_loop_tree_node_t loop_node,
1224 void (*preorder_func) (ira_loop_tree_node_t),
1225 void (*postorder_func) (ira_loop_tree_node_t))
1226{
1227 ira_loop_tree_node_t subloop_node;
1228
1229 ira_assert (loop_node->bb == NULL);
1230 ira_curr_loop_tree_node = loop_node;
1231 ira_curr_regno_allocno_map = ira_curr_loop_tree_node->regno_allocno_map;
1232
1233 if (preorder_func != NULL)
1234 (*preorder_func) (loop_node);
1235
1236 if (bb_p)
1237 for (subloop_node = loop_node->children;
1238 subloop_node != NULL;
1239 subloop_node = subloop_node->next)
1240 if (subloop_node->bb != NULL)
1241 {
1242 if (preorder_func != NULL)
1243 (*preorder_func) (subloop_node);
1244
1245 if (postorder_func != NULL)
1246 (*postorder_func) (subloop_node);
1247 }
1248
1249 for (subloop_node = loop_node->subloops;
1250 subloop_node != NULL;
1251 subloop_node = subloop_node->subloop_next)
1252 {
1253 ira_assert (subloop_node->bb == NULL);
1254 ira_traverse_loop_tree (bb_p, subloop_node,
1255 preorder_func, postorder_func);
1256 }
1257
1258 ira_curr_loop_tree_node = loop_node;
1259 ira_curr_regno_allocno_map = ira_curr_loop_tree_node->regno_allocno_map;
1260
1261 if (postorder_func != NULL)
1262 (*postorder_func) (loop_node);
1263}
1264
1265\f
1266
1267/* The basic block currently being processed. */
1268static basic_block curr_bb;
1269
1270/* This recursive function creates allocnos corresponding to
1271 pseudo-registers containing in X. True OUTPUT_P means that X is
1272 a lvalue. */
1273static void
1274create_insn_allocnos (rtx x, bool output_p)
1275{
1276 int i, j;
1277 const char *fmt;
1278 enum rtx_code code = GET_CODE (x);
1279
1280 if (code == REG)
1281 {
1282 int regno;
1283
1284 if ((regno = REGNO (x)) >= FIRST_PSEUDO_REGISTER)
1285 {
1286 ira_allocno_t a;
1287
1288 if ((a = ira_curr_regno_allocno_map[regno]) == NULL)
1289 a = ira_create_allocno (regno, false, ira_curr_loop_tree_node);
1290
1291 ALLOCNO_NREFS (a)++;
1292 ALLOCNO_FREQ (a) += REG_FREQ_FROM_BB (curr_bb);
1293 bitmap_set_bit (ira_curr_loop_tree_node->mentioned_allocnos,
1294 ALLOCNO_NUM (a));
1295 if (output_p)
1296 bitmap_set_bit (ira_curr_loop_tree_node->modified_regnos, regno);
1297 }
1298 return;
1299 }
1300 else if (code == SET)
1301 {
1302 create_insn_allocnos (SET_DEST (x), true);
1303 create_insn_allocnos (SET_SRC (x), false);
1304 return;
1305 }
1306 else if (code == CLOBBER)
1307 {
1308 create_insn_allocnos (XEXP (x, 0), true);
1309 return;
1310 }
1311 else if (code == MEM)
1312 {
1313 create_insn_allocnos (XEXP (x, 0), false);
1314 return;
1315 }
1316 else if (code == PRE_DEC || code == POST_DEC || code == PRE_INC ||
1317 code == POST_INC || code == POST_MODIFY || code == PRE_MODIFY)
1318 {
1319 create_insn_allocnos (XEXP (x, 0), true);
1320 create_insn_allocnos (XEXP (x, 0), false);
1321 return;
1322 }
1323
1324 fmt = GET_RTX_FORMAT (code);
1325 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1326 {
1327 if (fmt[i] == 'e')
1328 create_insn_allocnos (XEXP (x, i), output_p);
1329 else if (fmt[i] == 'E')
1330 for (j = 0; j < XVECLEN (x, i); j++)
1331 create_insn_allocnos (XVECEXP (x, i, j), output_p);
1332 }
1333}
1334
1335/* Create allocnos corresponding to pseudo-registers living in the
1336 basic block represented by the corresponding loop tree node
1337 BB_NODE. */
1338static void
1339create_bb_allocnos (ira_loop_tree_node_t bb_node)
1340{
1341 basic_block bb;
1342 rtx insn;
1343 unsigned int i;
1344 bitmap_iterator bi;
1345
1346 curr_bb = bb = bb_node->bb;
1347 ira_assert (bb != NULL);
1348 FOR_BB_INSNS (bb, insn)
1349 if (INSN_P (insn))
1350 create_insn_allocnos (PATTERN (insn), false);
1351 /* It might be a allocno living through from one subloop to
1352 another. */
1353 EXECUTE_IF_SET_IN_REG_SET (DF_LR_IN (bb), FIRST_PSEUDO_REGISTER, i, bi)
1354 if (ira_curr_regno_allocno_map[i] == NULL)
1355 ira_create_allocno (i, false, ira_curr_loop_tree_node);
1356}
1357
1358/* Create allocnos corresponding to pseudo-registers living on edge E
1359 (a loop entry or exit). Also mark the allocnos as living on the
1360 loop border. */
1361static void
1362create_loop_allocnos (edge e)
1363{
1364 unsigned int i;
1365 bitmap live_in_regs, border_allocnos;
1366 bitmap_iterator bi;
1367 ira_loop_tree_node_t parent;
1368
1369 live_in_regs = DF_LR_IN (e->dest);
1370 border_allocnos = ira_curr_loop_tree_node->border_allocnos;
1371 EXECUTE_IF_SET_IN_REG_SET (DF_LR_OUT (e->src),
1372 FIRST_PSEUDO_REGISTER, i, bi)
1373 if (bitmap_bit_p (live_in_regs, i))
1374 {
1375 if (ira_curr_regno_allocno_map[i] == NULL)
1376 {
1377 /* The order of creations is important for right
1378 ira_regno_allocno_map. */
1379 if ((parent = ira_curr_loop_tree_node->parent) != NULL
1380 && parent->regno_allocno_map[i] == NULL)
1381 ira_create_allocno (i, false, parent);
1382 ira_create_allocno (i, false, ira_curr_loop_tree_node);
1383 }
1384 bitmap_set_bit (border_allocnos,
1385 ALLOCNO_NUM (ira_curr_regno_allocno_map[i]));
1386 }
1387}
1388
1389/* Create allocnos corresponding to pseudo-registers living in loop
1390 represented by the corresponding loop tree node LOOP_NODE. This
1391 function is called by ira_traverse_loop_tree. */
1392static void
1393create_loop_tree_node_allocnos (ira_loop_tree_node_t loop_node)
1394{
1395 if (loop_node->bb != NULL)
1396 create_bb_allocnos (loop_node);
1397 else if (loop_node != ira_loop_tree_root)
1398 {
1399 int i;
1400 edge_iterator ei;
1401 edge e;
1402 VEC (edge, heap) *edges;
1403
1404 FOR_EACH_EDGE (e, ei, loop_node->loop->header->preds)
1405 if (e->src != loop_node->loop->latch)
1406 create_loop_allocnos (e);
1407
1408 edges = get_loop_exit_edges (loop_node->loop);
1409 for (i = 0; VEC_iterate (edge, edges, i, e); i++)
1410 create_loop_allocnos (e);
1411 VEC_free (edge, heap, edges);
1412 }
1413}
1414
1415/* Propagate information about allocnos modified inside the loop given
1416 by its LOOP_TREE_NODE to its parent. */
1417static void
1418propagate_modified_regnos (ira_loop_tree_node_t loop_tree_node)
1419{
1420 if (loop_tree_node == ira_loop_tree_root)
1421 return;
1422 ira_assert (loop_tree_node->bb == NULL);
1423 bitmap_ior_into (loop_tree_node->parent->modified_regnos,
1424 loop_tree_node->modified_regnos);
1425}
1426
1427/* Propagate new info about allocno A (see comments about accumulated
1428 info in allocno definition) to the corresponding allocno on upper
1429 loop tree level. So allocnos on upper levels accumulate
1430 information about the corresponding allocnos in nested regions.
1431 The new info means allocno info finally calculated in this
1432 file. */
1433static void
1434propagate_allocno_info (void)
1435{
1436 int i;
1437 ira_allocno_t a, parent_a;
1438 ira_loop_tree_node_t parent;
1439 enum reg_class cover_class;
1440
1441 if (flag_ira_algorithm != IRA_ALGORITHM_REGIONAL
1442 && flag_ira_algorithm != IRA_ALGORITHM_MIXED)
1443 return;
1444 for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
1445 for (a = ira_regno_allocno_map[i];
1446 a != NULL;
1447 a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
1448 if ((parent = ALLOCNO_LOOP_TREE_NODE (a)->parent) != NULL
1449 && (parent_a = parent->regno_allocno_map[i]) != NULL
1450 /* There are no caps yet at this point. So use
1451 border_allocnos to find allocnos for the propagation. */
1452 && bitmap_bit_p (ALLOCNO_LOOP_TREE_NODE (a)->border_allocnos,
1453 ALLOCNO_NUM (a)))
1454 {
1455 ALLOCNO_NREFS (parent_a) += ALLOCNO_NREFS (a);
1456 ALLOCNO_FREQ (parent_a) += ALLOCNO_FREQ (a);
1457 ALLOCNO_CALL_FREQ (parent_a) += ALLOCNO_CALL_FREQ (a);
1458#ifdef STACK_REGS
1459 if (ALLOCNO_TOTAL_NO_STACK_REG_P (a))
1460 ALLOCNO_TOTAL_NO_STACK_REG_P (parent_a) = true;
1461#endif
1462 IOR_HARD_REG_SET (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (parent_a),
1463 ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a));
1464 ALLOCNO_CALLS_CROSSED_NUM (parent_a)
1465 += ALLOCNO_CALLS_CROSSED_NUM (a);
1466 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a)
1467 += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a);
1468 cover_class = ALLOCNO_COVER_CLASS (a);
1469 ira_assert (cover_class == ALLOCNO_COVER_CLASS (parent_a));
1470 ira_allocate_and_accumulate_costs
1471 (&ALLOCNO_HARD_REG_COSTS (parent_a), cover_class,
1472 ALLOCNO_HARD_REG_COSTS (a));
1473 ira_allocate_and_accumulate_costs
1474 (&ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a),
1475 cover_class,
1476 ALLOCNO_CONFLICT_HARD_REG_COSTS (a));
1477 ALLOCNO_COVER_CLASS_COST (parent_a)
1478 += ALLOCNO_COVER_CLASS_COST (a);
1479 ALLOCNO_MEMORY_COST (parent_a) += ALLOCNO_MEMORY_COST (a);
1480 ALLOCNO_UPDATED_MEMORY_COST (parent_a)
1481 += ALLOCNO_UPDATED_MEMORY_COST (a);
1482 }
1483}
1484
1485/* Create allocnos corresponding to pseudo-registers in the current
1486 function. Traverse the loop tree for this. */
1487static void
1488create_allocnos (void)
1489{
1490 /* We need to process BB first to correctly link allocnos by member
1491 next_regno_allocno. */
1492 ira_traverse_loop_tree (true, ira_loop_tree_root,
1493 create_loop_tree_node_allocnos, NULL);
1494 if (optimize)
1495 ira_traverse_loop_tree (false, ira_loop_tree_root, NULL,
1496 propagate_modified_regnos);
1497}
1498
1499\f
1500
1501/* The page contains function to remove some regions from a separate
1502 register allocation. We remove regions whose separate allocation
1503 will hardly improve the result. As a result we speed up regional
1504 register allocation. */
1505
1506/* Merge ranges R1 and R2 and returns the result. The function
1507 maintains the order of ranges and tries to minimize number of the
1508 result ranges. */
1509static allocno_live_range_t
1510merge_ranges (allocno_live_range_t r1, allocno_live_range_t r2)
1511{
1512 allocno_live_range_t first, last, temp;
1513
1514 if (r1 == NULL)
1515 return r2;
1516 if (r2 == NULL)
1517 return r1;
1518 for (first = last = NULL; r1 != NULL && r2 != NULL;)
1519 {
1520 if (r1->start < r2->start)
1521 {
1522 temp = r1;
1523 r1 = r2;
1524 r2 = temp;
1525 }
1526 if (r1->start <= r2->finish + 1)
1527 {
1528 /* Intersected ranges: merge r1 and r2 into r1. */
1529 r1->start = r2->start;
1530 if (r1->finish < r2->finish)
1531 r1->finish = r2->finish;
1532 temp = r2;
1533 r2 = r2->next;
1534 ira_finish_allocno_live_range (temp);
1535 if (r2 == NULL)
1536 {
1537 /* To try to merge with subsequent ranges in r1. */
1538 r2 = r1->next;
1539 r1->next = NULL;
1540 }
1541 }
1542 else
1543 {
1544 /* Add r1 to the result. */
1545 if (first == NULL)
1546 first = last = r1;
1547 else
1548 {
1549 last->next = r1;
1550 last = r1;
1551 }
1552 r1 = r1->next;
1553 if (r1 == NULL)
1554 {
1555 /* To try to merge with subsequent ranges in r2. */
1556 r1 = r2->next;
1557 r2->next = NULL;
1558 }
1559 }
1560 }
1561 if (r1 != NULL)
1562 {
1563 if (first == NULL)
1564 first = r1;
1565 else
1566 last->next = r1;
1567 ira_assert (r1->next == NULL);
1568 }
1569 else if (r2 != NULL)
1570 {
1571 if (first == NULL)
1572 first = r2;
1573 else
1574 last->next = r2;
1575 ira_assert (r2->next == NULL);
1576 }
1577 else
1578 {
1579 ira_assert (last->next == NULL);
1580 }
1581 return first;
1582}
1583
1584/* The function changes allocno in range list given by R onto A. */
1585static void
1586change_allocno_in_range_list (allocno_live_range_t r, ira_allocno_t a)
1587{
1588 for (; r != NULL; r = r->next)
1589 r->allocno = a;
1590}
1591
1592/* Return TRUE if NODE represents a loop with low register
1593 pressure. */
1594static bool
1595low_pressure_loop_node_p (ira_loop_tree_node_t node)
1596{
1597 int i;
1598 enum reg_class cover_class;
1599
1600 if (node->bb != NULL)
1601 return false;
1602
1603 for (i = 0; i < ira_reg_class_cover_size; i++)
1604 {
1605 cover_class = ira_reg_class_cover[i];
1606 if (node->reg_pressure[cover_class]
1607 > ira_available_class_regs[cover_class])
1608 return false;
1609 }
1610 return true;
1611}
1612
1613/* Return TRUE if NODE represents a loop with should be removed from
1614 regional allocation. We remove a loop with low register pressure
1615 inside another loop with register pressure. In this case a
1616 separate allocation of the loop hardly helps (for irregular
1617 register file architecture it could help by choosing a better hard
1618 register in the loop but we prefer faster allocation even in this
1619 case). */
1620static bool
1621loop_node_to_be_removed_p (ira_loop_tree_node_t node)
1622{
1623 return (node->parent != NULL && low_pressure_loop_node_p (node->parent)
1624 && low_pressure_loop_node_p (node));
1625}
1626
1627/* Definition of vector of loop tree nodes. */
1628DEF_VEC_P(ira_loop_tree_node_t);
1629DEF_VEC_ALLOC_P(ira_loop_tree_node_t, heap);
1630
1631/* Vec containing references to all removed loop tree nodes. */
1632static VEC(ira_loop_tree_node_t,heap) *removed_loop_vec;
1633
1634/* Vec containing references to all children of loop tree nodes. */
1635static VEC(ira_loop_tree_node_t,heap) *children_vec;
1636
1637/* Remove subregions of NODE if their separate allocation will not
1638 improve the result. */
1639static void
1640remove_uneccesary_loop_nodes_from_loop_tree (ira_loop_tree_node_t node)
1641{
1642 unsigned int start;
1643 bool remove_p;
1644 ira_loop_tree_node_t subnode;
1645
1646 remove_p = loop_node_to_be_removed_p (node);
1647 if (! remove_p)
1648 VEC_safe_push (ira_loop_tree_node_t, heap, children_vec, node);
1649 start = VEC_length (ira_loop_tree_node_t, children_vec);
1650 for (subnode = node->children; subnode != NULL; subnode = subnode->next)
1651 if (subnode->bb == NULL)
1652 remove_uneccesary_loop_nodes_from_loop_tree (subnode);
1653 else
1654 VEC_safe_push (ira_loop_tree_node_t, heap, children_vec, subnode);
1655 node->children = node->subloops = NULL;
1656 if (remove_p)
1657 {
1658 VEC_safe_push (ira_loop_tree_node_t, heap, removed_loop_vec, node);
1659 return;
1660 }
1661 while (VEC_length (ira_loop_tree_node_t, children_vec) > start)
1662 {
1663 subnode = VEC_pop (ira_loop_tree_node_t, children_vec);
1664 subnode->parent = node;
1665 subnode->next = node->children;
1666 node->children = subnode;
1667 if (subnode->bb == NULL)
1668 {
1669 subnode->subloop_next = node->subloops;
1670 node->subloops = subnode;
1671 }
1672 }
1673}
1674
1675/* Remove allocnos from loops removed from the allocation
1676 consideration. */
1677static void
1678remove_unnecessary_allocnos (void)
1679{
1680 int regno;
1681 bool merged_p;
1682 enum reg_class cover_class;
1683 ira_allocno_t a, prev_a, next_a, parent_a;
1684 ira_loop_tree_node_t a_node, parent;
1685 allocno_live_range_t r;
1686
1687 merged_p = false;
1688 for (regno = max_reg_num () - 1; regno >= FIRST_PSEUDO_REGISTER; regno--)
1689 for (prev_a = NULL, a = ira_regno_allocno_map[regno];
1690 a != NULL;
1691 a = next_a)
1692 {
1693 next_a = ALLOCNO_NEXT_REGNO_ALLOCNO (a);
1694 a_node = ALLOCNO_LOOP_TREE_NODE (a);
1695 if (! loop_node_to_be_removed_p (a_node))
1696 prev_a = a;
1697 else
1698 {
1699 for (parent = a_node->parent;
1700 (parent_a = parent->regno_allocno_map[regno]) == NULL
1701 && loop_node_to_be_removed_p (parent);
1702 parent = parent->parent)
1703 ;
1704 if (parent_a == NULL)
1705 {
1706 /* There are no allocnos with the same regno in upper
1707 region -- just move the allocno to the upper
1708 region. */
1709 prev_a = a;
1710 ALLOCNO_LOOP_TREE_NODE (a) = parent;
1711 parent->regno_allocno_map[regno] = a;
1712 bitmap_set_bit (parent->mentioned_allocnos, ALLOCNO_NUM (a));
1713 }
1714 else
1715 {
1716 /* Remove the allocno and update info of allocno in
1717 the upper region. */
1718 if (prev_a == NULL)
1719 ira_regno_allocno_map[regno] = next_a;
1720 else
1721 ALLOCNO_NEXT_REGNO_ALLOCNO (prev_a) = next_a;
1722 r = ALLOCNO_LIVE_RANGES (a);
1723 change_allocno_in_range_list (r, parent_a);
1724 ALLOCNO_LIVE_RANGES (parent_a)
1725 = merge_ranges (r, ALLOCNO_LIVE_RANGES (parent_a));
1726 merged_p = true;
1727 ALLOCNO_LIVE_RANGES (a) = NULL;
1728 IOR_HARD_REG_SET (ALLOCNO_CONFLICT_HARD_REGS (parent_a),
1729 ALLOCNO_CONFLICT_HARD_REGS (a));
1730#ifdef STACK_REGS
1731 if (ALLOCNO_NO_STACK_REG_P (a))
1732 ALLOCNO_NO_STACK_REG_P (parent_a) = true;
1733#endif
1734 ALLOCNO_NREFS (parent_a) += ALLOCNO_NREFS (a);
1735 ALLOCNO_FREQ (parent_a) += ALLOCNO_FREQ (a);
1736 ALLOCNO_CALL_FREQ (parent_a) += ALLOCNO_CALL_FREQ (a);
1737 IOR_HARD_REG_SET
1738 (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (parent_a),
1739 ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a));
1740 ALLOCNO_CALLS_CROSSED_NUM (parent_a)
1741 += ALLOCNO_CALLS_CROSSED_NUM (a);
1742 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a)
1743 += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a);
1744#ifdef STACK_REGS
1745 if (ALLOCNO_TOTAL_NO_STACK_REG_P (a))
1746 ALLOCNO_TOTAL_NO_STACK_REG_P (parent_a) = true;
1747#endif
1748 cover_class = ALLOCNO_COVER_CLASS (a);
1749 ira_assert (cover_class == ALLOCNO_COVER_CLASS (parent_a));
1750 ira_allocate_and_accumulate_costs
1751 (&ALLOCNO_HARD_REG_COSTS (parent_a), cover_class,
1752 ALLOCNO_HARD_REG_COSTS (a));
1753 ira_allocate_and_accumulate_costs
1754 (&ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a),
1755 cover_class,
1756 ALLOCNO_CONFLICT_HARD_REG_COSTS (a));
1757 ALLOCNO_COVER_CLASS_COST (parent_a)
1758 += ALLOCNO_COVER_CLASS_COST (a);
1759 ALLOCNO_MEMORY_COST (parent_a) += ALLOCNO_MEMORY_COST (a);
1760 ALLOCNO_UPDATED_MEMORY_COST (parent_a)
1761 += ALLOCNO_UPDATED_MEMORY_COST (a);
1762 finish_allocno (a);
1763 }
1764 }
1765 }
1766 if (merged_p)
1767 ira_rebuild_start_finish_chains ();
1768}
1769
1770/* Remove loops from consideration. We remove loops for which a
1771 separate allocation will not improve the result. We have to do
1772 this after allocno creation and their costs and cover class
1773 evaluation because only after that the register pressure can be
1774 known and is calculated. */
1775static void
1776remove_unnecessary_regions (void)
1777{
1778 children_vec
1779 = VEC_alloc (ira_loop_tree_node_t, heap,
1780 last_basic_block + VEC_length (loop_p, ira_loops.larray));
1781 removed_loop_vec
1782 = VEC_alloc (ira_loop_tree_node_t, heap,
1783 last_basic_block + VEC_length (loop_p, ira_loops.larray));
1784 remove_uneccesary_loop_nodes_from_loop_tree (ira_loop_tree_root) ;
1785 VEC_free (ira_loop_tree_node_t, heap, children_vec);
1786 remove_unnecessary_allocnos ();
1787 while (VEC_length (ira_loop_tree_node_t, removed_loop_vec) > 0)
1788 finish_loop_tree_node (VEC_pop (ira_loop_tree_node_t, removed_loop_vec));
1789 VEC_free (ira_loop_tree_node_t, heap, removed_loop_vec);
1790}
1791
1792\f
1793
1794/* Set up minimal and maximal live range points for allocnos. */
1795static void
1796setup_min_max_allocno_live_range_point (void)
1797{
1798 int i;
1799 ira_allocno_t a, parent_a, cap;
1800 ira_allocno_iterator ai;
1801 allocno_live_range_t r;
1802 ira_loop_tree_node_t parent;
1803
1804 FOR_EACH_ALLOCNO (a, ai)
1805 {
1806 r = ALLOCNO_LIVE_RANGES (a);
1807 if (r == NULL)
1808 continue;
1809 ALLOCNO_MAX (a) = r->finish;
1810 for (; r->next != NULL; r = r->next)
1811 ;
1812 ALLOCNO_MIN (a) = r->start;
1813 }
1814 for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
1815 for (a = ira_regno_allocno_map[i];
1816 a != NULL;
1817 a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
1818 {
1819 if (ALLOCNO_MAX (a) < 0)
1820 continue;
1821 ira_assert (ALLOCNO_CAP_MEMBER (a) == NULL);
1822 /* Accumulation of range info. */
1823 if (ALLOCNO_CAP (a) != NULL)
1824 {
1825 for (cap = ALLOCNO_CAP (a); cap != NULL; cap = ALLOCNO_CAP (cap))
1826 {
1827 if (ALLOCNO_MAX (cap) < ALLOCNO_MAX (a))
1828 ALLOCNO_MAX (cap) = ALLOCNO_MAX (a);
1829 if (ALLOCNO_MIN (cap) > ALLOCNO_MIN (a))
1830 ALLOCNO_MIN (cap) = ALLOCNO_MIN (a);
1831 }
1832 continue;
1833 }
1834 if ((parent = ALLOCNO_LOOP_TREE_NODE (a)->parent) == NULL)
1835 continue;
1836 parent_a = parent->regno_allocno_map[i];
1837 if (ALLOCNO_MAX (parent_a) < ALLOCNO_MAX (a))
1838 ALLOCNO_MAX (parent_a) = ALLOCNO_MAX (a);
1839 if (ALLOCNO_MIN (parent_a) > ALLOCNO_MIN (a))
1840 ALLOCNO_MIN (parent_a) = ALLOCNO_MIN (a);
1841 }
1842#ifdef ENABLE_IRA_CHECKING
1843 FOR_EACH_ALLOCNO (a, ai)
1844 {
1845 if ((0 <= ALLOCNO_MIN (a) && ALLOCNO_MIN (a) <= ira_max_point)
1846 && (0 <= ALLOCNO_MAX (a) && ALLOCNO_MAX (a) <= ira_max_point))
1847 continue;
1848 gcc_unreachable ();
1849 }
1850#endif
1851}
1852
1853/* Sort allocnos according to their live ranges. Allocnos with
1854 smaller cover class are put first. Allocnos with the same cove
1855 class are ordered according their start (min). Allocnos with the
1856 same start are ordered according their finish (max). */
1857static int
1858allocno_range_compare_func (const void *v1p, const void *v2p)
1859{
1860 int diff;
1861 ira_allocno_t a1 = *(const ira_allocno_t *) v1p;
1862 ira_allocno_t a2 = *(const ira_allocno_t *) v2p;
1863
1864 if ((diff = ALLOCNO_COVER_CLASS (a1) - ALLOCNO_COVER_CLASS (a2)) != 0)
1865 return diff;
1866 if ((diff = ALLOCNO_MIN (a1) - ALLOCNO_MIN (a2)) != 0)
1867 return diff;
1868 if ((diff = ALLOCNO_MAX (a1) - ALLOCNO_MAX (a2)) != 0)
1869 return diff;
1870 return ALLOCNO_NUM (a1) - ALLOCNO_NUM (a2);
1871}
1872
1873/* Sort ira_conflict_id_allocno_map and set up conflict id of
1874 allocnos. */
1875static void
1876sort_conflict_id_allocno_map (void)
1877{
1878 int i, num;
1879 ira_allocno_t a;
1880 ira_allocno_iterator ai;
1881
1882 num = 0;
1883 FOR_EACH_ALLOCNO (a, ai)
1884 ira_conflict_id_allocno_map[num++] = a;
1885 qsort (ira_conflict_id_allocno_map, num, sizeof (ira_allocno_t),
1886 allocno_range_compare_func);
1887 for (i = 0; i < num; i++)
1888 if ((a = ira_conflict_id_allocno_map[i]) != NULL)
1889 ALLOCNO_CONFLICT_ID (a) = i;
1890 for (i = num; i < ira_allocnos_num; i++)
1891 ira_conflict_id_allocno_map[i] = NULL;
1892}
1893
1894/* Set up minimal and maximal conflict ids of allocnos with which
1895 given allocno can conflict. */
1896static void
1897setup_min_max_conflict_allocno_ids (void)
1898{
1899 enum reg_class cover_class;
1900 int i, j, min, max, start, finish, first_not_finished, filled_area_start;
1901 int *live_range_min, *last_lived;
1902 ira_allocno_t a;
1903
1904 live_range_min = (int *) ira_allocate (sizeof (int) * ira_allocnos_num);
1905 cover_class = -1;
1906 first_not_finished = -1;
1907 for (i = 0; i < ira_allocnos_num; i++)
1908 {
1909 a = ira_conflict_id_allocno_map[i];
1910 if (a == NULL)
1911 continue;
1912 if (cover_class != ALLOCNO_COVER_CLASS (a))
1913 {
1914 cover_class = ALLOCNO_COVER_CLASS (a);
1915 min = i;
1916 first_not_finished = i;
1917 }
1918 else
1919 {
1920 start = ALLOCNO_MIN (a);
1921 /* If we skip an allocno, the allocno with smaller ids will
1922 be also skipped because of the secondary sorting the
1923 range finishes (see function
1924 allocno_range_compare_func). */
1925 while (first_not_finished < i
1926 && start > ALLOCNO_MAX (ira_conflict_id_allocno_map
1927 [first_not_finished]))
1928 first_not_finished++;
1929 min = first_not_finished;
1930 }
1931 if (min == i)
1932 /* We could increase min further in this case but it is good
1933 enough. */
1934 min++;
1935 live_range_min[i] = ALLOCNO_MIN (a);
1936 ALLOCNO_MIN (a) = min;
1937 }
1938 last_lived = (int *) ira_allocate (sizeof (int) * ira_max_point);
1939 cover_class = -1;
1940 filled_area_start = -1;
1941 for (i = ira_allocnos_num - 1; i >= 0; i--)
1942 {
1943 a = ira_conflict_id_allocno_map[i];
1944 if (a == NULL)
1945 continue;
1946 if (cover_class != ALLOCNO_COVER_CLASS (a))
1947 {
1948 cover_class = ALLOCNO_COVER_CLASS (a);
1949 for (j = 0; j < ira_max_point; j++)
1950 last_lived[j] = -1;
1951 filled_area_start = ira_max_point;
1952 }
1953 min = live_range_min[i];
1954 finish = ALLOCNO_MAX (a);
1955 max = last_lived[finish];
1956 if (max < 0)
1957 /* We could decrease max further in this case but it is good
1958 enough. */
1959 max = ALLOCNO_CONFLICT_ID (a) - 1;
1960 ALLOCNO_MAX (a) = max;
1961 /* In filling, we can go further A range finish to recognize
1962 intersection quickly because if the finish of subsequently
1963 processed allocno (it has smaller conflict id) range is
1964 further A range finish than they are definitely intersected
1965 (the reason for this is the allocnos with bigger conflict id
1966 have their range starts not smaller than allocnos with
1967 smaller ids. */
1968 for (j = min; j < filled_area_start; j++)
1969 last_lived[j] = i;
1970 filled_area_start = min;
1971 }
1972 ira_free (last_lived);
1973 ira_free (live_range_min);
1974}
1975
1976\f
1977
1978static void
1979create_caps (void)
1980{
1981 ira_allocno_t a;
1982 ira_allocno_iterator ai;
1983 ira_loop_tree_node_t loop_tree_node;
1984
1985 FOR_EACH_ALLOCNO (a, ai)
1986 {
1987 if (ALLOCNO_LOOP_TREE_NODE (a) == ira_loop_tree_root)
1988 continue;
1989 if (ALLOCNO_CAP_MEMBER (a) != NULL)
1990 create_cap_allocno (a);
1991 else if (ALLOCNO_CAP (a) == NULL)
1992 {
1993 loop_tree_node = ALLOCNO_LOOP_TREE_NODE (a);
1994 if (!bitmap_bit_p (loop_tree_node->border_allocnos, ALLOCNO_NUM (a)))
1995 create_cap_allocno (a);
1996 }
1997 }
1998}
1999
2000\f
2001
2002/* The page contains code transforming more one region internal
2003 representation (IR) to one region IR which is necessary for reload.
2004 This transformation is called IR flattening. We might just rebuild
2005 the IR for one region but we don't do it because it takes a lot of
2006 time. */
2007
2008/* This recursive function returns immediate common dominator of two
2009 loop tree nodes N1 and N2. */
2010static ira_loop_tree_node_t
2011common_loop_tree_node_dominator (ira_loop_tree_node_t n1,
2012 ira_loop_tree_node_t n2)
2013{
2014 ira_assert (n1 != NULL && n2 != NULL);
2015 if (n1 == n2)
2016 return n1;
2017 if (n1->level < n2->level)
2018 return common_loop_tree_node_dominator (n1, n2->parent);
2019 else if (n1->level > n2->level)
2020 return common_loop_tree_node_dominator (n1->parent, n2);
2021 else
2022 return common_loop_tree_node_dominator (n1->parent, n2->parent);
2023}
2024
2025/* Flatten the IR. In other words, this function transforms IR as if
2026 it were built with one region (without loops). We could make it
2027 much simpler by rebuilding IR with one region, but unfortunately it
2028 takes a lot of time. MAX_REGNO_BEFORE_EMIT and
2029 IRA_MAX_POINT_BEFORE_EMIT are correspondingly MAX_REG_NUM () and
2030 IRA_MAX_POINT before emitting insns on the loop borders. */
2031void
2032ira_flattening (int max_regno_before_emit, int ira_max_point_before_emit)
2033{
2034 int i, j, num;
2035 bool propagate_p, stop_p, keep_p;
2036 int hard_regs_num;
2037 bool new_pseudos_p, merged_p;
2038 unsigned int n;
2039 enum reg_class cover_class;
2040 ira_allocno_t a, parent_a, first, second, node_first, node_second;
2041 ira_allocno_t dominator_a;
2042 ira_copy_t cp;
2043 ira_loop_tree_node_t parent, node, dominator;
2044 allocno_live_range_t r;
2045 ira_allocno_iterator ai;
2046 ira_copy_iterator ci;
2047 sparseset allocnos_live;
2048 /* Map: regno -> allocnos which will finally represent the regno for
2049 IR with one region. */
2050 ira_allocno_t *regno_top_level_allocno_map;
2051 bool *allocno_propagated_p;
2052
2053 regno_top_level_allocno_map
2054 = (ira_allocno_t *) ira_allocate (max_reg_num () * sizeof (ira_allocno_t));
2055 memset (regno_top_level_allocno_map, 0,
2056 max_reg_num () * sizeof (ira_allocno_t));
2057 allocno_propagated_p
2058 = (bool *) ira_allocate (ira_allocnos_num * sizeof (bool));
2059 memset (allocno_propagated_p, 0, ira_allocnos_num * sizeof (bool));
2060 new_pseudos_p = merged_p = false;
2061 /* Fix final allocno attributes. */
2062 for (i = max_regno_before_emit - 1; i >= FIRST_PSEUDO_REGISTER; i--)
2063 {
2064 propagate_p = false;
2065 for (a = ira_regno_allocno_map[i];
2066 a != NULL;
2067 a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
2068 {
2069 ira_assert (ALLOCNO_CAP_MEMBER (a) == NULL);
2070 if (ALLOCNO_SOMEWHERE_RENAMED_P (a))
2071 new_pseudos_p = true;
2072 if (ALLOCNO_CAP (a) != NULL
2073 || (parent = ALLOCNO_LOOP_TREE_NODE (a)->parent) == NULL
2074 || ((parent_a = parent->regno_allocno_map[ALLOCNO_REGNO (a)])
2075 == NULL))
2076 {
2077 ALLOCNO_COPIES (a) = NULL;
2078 regno_top_level_allocno_map[REGNO (ALLOCNO_REG (a))] = a;
2079 continue;
2080 }
2081 ira_assert (ALLOCNO_CAP_MEMBER (parent_a) == NULL);
2082 if (propagate_p)
2083 {
2084 if (!allocno_propagated_p [ALLOCNO_NUM (parent_a)])
2085 COPY_HARD_REG_SET (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (parent_a),
2086 ALLOCNO_CONFLICT_HARD_REGS (parent_a));
2087 IOR_HARD_REG_SET (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (parent_a),
2088 ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a));
2089#ifdef STACK_REGS
2090 if (!allocno_propagated_p [ALLOCNO_NUM (parent_a)])
2091 ALLOCNO_TOTAL_NO_STACK_REG_P (parent_a)
2092 = ALLOCNO_NO_STACK_REG_P (parent_a);
2093 ALLOCNO_TOTAL_NO_STACK_REG_P (parent_a)
2094 = (ALLOCNO_TOTAL_NO_STACK_REG_P (parent_a)
2095 || ALLOCNO_TOTAL_NO_STACK_REG_P (a));
2096#endif
2097 allocno_propagated_p [ALLOCNO_NUM (parent_a)] = true;
2098 }
2099 if (REGNO (ALLOCNO_REG (a)) == REGNO (ALLOCNO_REG (parent_a)))
2100 {
2101 if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL)
2102 {
2103 fprintf (ira_dump_file,
2104 " Moving ranges of a%dr%d to a%dr%d: ",
2105 ALLOCNO_NUM (a), REGNO (ALLOCNO_REG (a)),
2106 ALLOCNO_NUM (parent_a),
2107 REGNO (ALLOCNO_REG (parent_a)));
2108 ira_print_live_range_list (ira_dump_file,
2109 ALLOCNO_LIVE_RANGES (a));
2110 }
2111 change_allocno_in_range_list (ALLOCNO_LIVE_RANGES (a), parent_a);
2112 ALLOCNO_LIVE_RANGES (parent_a)
2113 = merge_ranges (ALLOCNO_LIVE_RANGES (a),
2114 ALLOCNO_LIVE_RANGES (parent_a));
2115 merged_p = true;
2116 ALLOCNO_LIVE_RANGES (a) = NULL;
2117 ALLOCNO_MEM_OPTIMIZED_DEST_P (parent_a)
2118 = (ALLOCNO_MEM_OPTIMIZED_DEST_P (parent_a)
2119 || ALLOCNO_MEM_OPTIMIZED_DEST_P (a));
2120 continue;
2121 }
2122 new_pseudos_p = true;
2123 propagate_p = true;
2124 first = ALLOCNO_MEM_OPTIMIZED_DEST (a) == NULL ? NULL : a;
2125 stop_p = false;
2126 for (;;)
2127 {
2128 if (first == NULL
2129 && ALLOCNO_MEM_OPTIMIZED_DEST (parent_a) != NULL)
2130 first = parent_a;
2131 ALLOCNO_NREFS (parent_a) -= ALLOCNO_NREFS (a);
2132 ALLOCNO_FREQ (parent_a) -= ALLOCNO_FREQ (a);
2133 if (first != NULL
2134 && ALLOCNO_MEM_OPTIMIZED_DEST (first) == parent_a)
2135 stop_p = true;
2136 else if (!stop_p)
2137 {
2138 ALLOCNO_CALL_FREQ (parent_a) -= ALLOCNO_CALL_FREQ (a);
2139 ALLOCNO_CALLS_CROSSED_NUM (parent_a)
2140 -= ALLOCNO_CALLS_CROSSED_NUM (a);
2141 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a)
2142 -= ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a);
2143 }
2144 ira_assert (ALLOCNO_CALLS_CROSSED_NUM (parent_a) >= 0
2145 && ALLOCNO_NREFS (parent_a) >= 0
2146 && ALLOCNO_FREQ (parent_a) >= 0);
2147 cover_class = ALLOCNO_COVER_CLASS (parent_a);
2148 hard_regs_num = ira_class_hard_regs_num[cover_class];
2149 if (ALLOCNO_HARD_REG_COSTS (a) != NULL
2150 && ALLOCNO_HARD_REG_COSTS (parent_a) != NULL)
2151 for (j = 0; j < hard_regs_num; j++)
2152 ALLOCNO_HARD_REG_COSTS (parent_a)[j]
2153 -= ALLOCNO_HARD_REG_COSTS (a)[j];
2154 if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a) != NULL
2155 && ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a) != NULL)
2156 for (j = 0; j < hard_regs_num; j++)
2157 ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a)[j]
2158 -= ALLOCNO_CONFLICT_HARD_REG_COSTS (a)[j];
2159 ALLOCNO_COVER_CLASS_COST (parent_a)
2160 -= ALLOCNO_COVER_CLASS_COST (a);
2161 ALLOCNO_MEMORY_COST (parent_a) -= ALLOCNO_MEMORY_COST (a);
2162 if (ALLOCNO_CAP (parent_a) != NULL
2163 || (parent
2164 = ALLOCNO_LOOP_TREE_NODE (parent_a)->parent) == NULL
2165 || (parent_a = (parent->regno_allocno_map
2166 [ALLOCNO_REGNO (parent_a)])) == NULL)
2167 break;
2168 }
2169 if (first != NULL)
2170 {
2171 parent_a = ALLOCNO_MEM_OPTIMIZED_DEST (first);
2172 dominator = common_loop_tree_node_dominator
2173 (ALLOCNO_LOOP_TREE_NODE (parent_a),
2174 ALLOCNO_LOOP_TREE_NODE (first));
2175 dominator_a = dominator->regno_allocno_map[ALLOCNO_REGNO (a)];
2176 ira_assert (parent_a != NULL);
2177 stop_p = first != a;
2178 /* Remember that exit can be to a grandparent (not only
2179 to a parent) or a child of the grandparent. */
2180 for (first = a;;)
2181 {
2182 if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL)
2183 {
2184 fprintf
2185 (ira_dump_file,
2186 " Coping ranges of a%dr%d to a%dr%d: ",
2187 ALLOCNO_NUM (first), REGNO (ALLOCNO_REG (first)),
2188 ALLOCNO_NUM (parent_a),
2189 REGNO (ALLOCNO_REG (parent_a)));
2190 ira_print_live_range_list (ira_dump_file,
2191 ALLOCNO_LIVE_RANGES (first));
2192 }
2193 r = copy_allocno_live_range_list (ALLOCNO_LIVE_RANGES
2194 (first));
2195 change_allocno_in_range_list (r, parent_a);
2196 ALLOCNO_LIVE_RANGES (parent_a)
2197 = merge_ranges (r, ALLOCNO_LIVE_RANGES (parent_a));
2198 merged_p = true;
2199 if (stop_p)
2200 break;
2201 parent = ALLOCNO_LOOP_TREE_NODE (first)->parent;
2202 ira_assert (parent != NULL);
2203 first = parent->regno_allocno_map[ALLOCNO_REGNO (a)];
2204 ira_assert (first != NULL);
2205 if (first == dominator_a)
2206 break;
2207 }
2208 }
2209 ALLOCNO_COPIES (a) = NULL;
2210 regno_top_level_allocno_map[REGNO (ALLOCNO_REG (a))] = a;
2211 }
2212 }
2213 ira_free (allocno_propagated_p);
2214 ira_assert (new_pseudos_p || ira_max_point_before_emit == ira_max_point);
2215 if (merged_p || ira_max_point_before_emit != ira_max_point)
2216 ira_rebuild_start_finish_chains ();
2217 if (new_pseudos_p)
2218 {
2219 /* Rebuild conflicts. */
2220 FOR_EACH_ALLOCNO (a, ai)
2221 {
2222 if (a != regno_top_level_allocno_map[REGNO (ALLOCNO_REG (a))]
2223 || ALLOCNO_CAP_MEMBER (a) != NULL)
2224 continue;
2225 for (r = ALLOCNO_LIVE_RANGES (a); r != NULL; r = r->next)
2226 ira_assert (r->allocno == a);
2227 clear_allocno_conflicts (a);
2228 }
2229 allocnos_live = sparseset_alloc (ira_allocnos_num);
2230 for (i = 0; i < ira_max_point; i++)
2231 {
2232 for (r = ira_start_point_ranges[i]; r != NULL; r = r->start_next)
2233 {
2234 a = r->allocno;
2235 if (a != regno_top_level_allocno_map[REGNO (ALLOCNO_REG (a))]
2236 || ALLOCNO_CAP_MEMBER (a) != NULL)
2237 continue;
2238 num = ALLOCNO_NUM (a);
2239 cover_class = ALLOCNO_COVER_CLASS (a);
2240 sparseset_set_bit (allocnos_live, num);
2241 EXECUTE_IF_SET_IN_SPARSESET (allocnos_live, n)
2242 {
2243 ira_allocno_t live_a = ira_allocnos[n];
2244
2245 if (cover_class == ALLOCNO_COVER_CLASS (live_a)
2246 /* Don't set up conflict for the allocno with itself. */
2247 && num != (int) n)
2248 ira_add_allocno_conflict (a, live_a);
2249 }
2250 }
2251
2252 for (r = ira_finish_point_ranges[i]; r != NULL; r = r->finish_next)
2253 sparseset_clear_bit (allocnos_live, ALLOCNO_NUM (r->allocno));
2254 }
2255 sparseset_free (allocnos_live);
2256 compress_conflict_vecs ();
2257 }
2258 /* Mark some copies for removing and change allocnos in the rest
2259 copies. */
2260 FOR_EACH_COPY (cp, ci)
2261 {
2262 if (ALLOCNO_CAP_MEMBER (cp->first) != NULL
2263 || ALLOCNO_CAP_MEMBER (cp->second) != NULL)
2264 {
2265 if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL)
2266 fprintf
2267 (ira_dump_file, " Remove cp%d:%c%dr%d-%c%dr%d\n",
2268 cp->num, ALLOCNO_CAP_MEMBER (cp->first) != NULL ? 'c' : 'a',
2269 ALLOCNO_NUM (cp->first), REGNO (ALLOCNO_REG (cp->first)),
2270 ALLOCNO_CAP_MEMBER (cp->second) != NULL ? 'c' : 'a',
2271 ALLOCNO_NUM (cp->second), REGNO (ALLOCNO_REG (cp->second)));
2272 cp->loop_tree_node = NULL;
2273 continue;
2274 }
2275 first = regno_top_level_allocno_map[REGNO (ALLOCNO_REG (cp->first))];
2276 second = regno_top_level_allocno_map[REGNO (ALLOCNO_REG (cp->second))];
2277 node = cp->loop_tree_node;
2278 if (node == NULL)
2279 keep_p = true; /* It copy generated in ira-emit.c. */
2280 else
2281 {
2282 /* Check that the copy was not propagated from level on
2283 which we will have different pseudos. */
2284 node_first = node->regno_allocno_map[ALLOCNO_REGNO (cp->first)];
2285 node_second = node->regno_allocno_map[ALLOCNO_REGNO (cp->second)];
2286 keep_p = ((REGNO (ALLOCNO_REG (first))
2287 == REGNO (ALLOCNO_REG (node_first)))
2288 && (REGNO (ALLOCNO_REG (second))
2289 == REGNO (ALLOCNO_REG (node_second))));
2290 }
2291 if (keep_p)
2292 {
2293 cp->loop_tree_node = ira_loop_tree_root;
2294 cp->first = first;
2295 cp->second = second;
2296 }
2297 else
2298 {
2299 cp->loop_tree_node = NULL;
2300 if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL)
2301 fprintf (ira_dump_file, " Remove cp%d:a%dr%d-a%dr%d\n",
2302 cp->num, ALLOCNO_NUM (cp->first),
2303 REGNO (ALLOCNO_REG (cp->first)), ALLOCNO_NUM (cp->second),
2304 REGNO (ALLOCNO_REG (cp->second)));
2305 }
2306 }
2307 /* Remove unnecessary allocnos on lower levels of the loop tree. */
2308 FOR_EACH_ALLOCNO (a, ai)
2309 {
2310 if (a != regno_top_level_allocno_map[REGNO (ALLOCNO_REG (a))]
2311 || ALLOCNO_CAP_MEMBER (a) != NULL)
2312 {
2313 if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL)
2314 fprintf (ira_dump_file, " Remove a%dr%d\n",
2315 ALLOCNO_NUM (a), REGNO (ALLOCNO_REG (a)));
2316 finish_allocno (a);
2317 continue;
2318 }
2319 ALLOCNO_LOOP_TREE_NODE (a) = ira_loop_tree_root;
2320 ALLOCNO_REGNO (a) = REGNO (ALLOCNO_REG (a));
2321 ALLOCNO_CAP (a) = NULL;
2322 ALLOCNO_UPDATED_MEMORY_COST (a) = ALLOCNO_MEMORY_COST (a);
2323 if (! ALLOCNO_ASSIGNED_P (a))
2324 ira_free_allocno_updated_costs (a);
2325 ira_assert (ALLOCNO_UPDATED_HARD_REG_COSTS (a) == NULL);
2326 ira_assert (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) == NULL);
2327 }
2328 /* Remove unnecessary copies. */
2329 FOR_EACH_COPY (cp, ci)
2330 {
2331 if (cp->loop_tree_node == NULL)
2332 {
2333 ira_copies[cp->num] = NULL;
2334 finish_copy (cp);
2335 continue;
2336 }
2337 ira_assert
2338 (ALLOCNO_LOOP_TREE_NODE (cp->first) == ira_loop_tree_root
2339 && ALLOCNO_LOOP_TREE_NODE (cp->second) == ira_loop_tree_root);
2340 ira_add_allocno_copy_to_list (cp);
2341 ira_swap_allocno_copy_ends_if_necessary (cp);
2342 }
2343 rebuild_regno_allocno_maps ();
2344 ira_free (regno_top_level_allocno_map);
2345}
2346
2347\f
2348
2349#ifdef ENABLE_IRA_CHECKING
2350/* Check creation of all allocnos. Allocnos on lower levels should
2351 have allocnos or caps on all upper levels. */
2352static void
2353check_allocno_creation (void)
2354{
2355 ira_allocno_t a;
2356 ira_allocno_iterator ai;
2357 ira_loop_tree_node_t loop_tree_node;
2358
2359 FOR_EACH_ALLOCNO (a, ai)
2360 {
2361 if (ALLOCNO_LOOP_TREE_NODE (a) == ira_loop_tree_root)
2362 continue;
2363 if (ALLOCNO_CAP_MEMBER (a) != NULL)
2364 {
2365 ira_assert (ALLOCNO_CAP (a) != NULL);
2366 }
2367 else if (ALLOCNO_CAP (a) == NULL)
2368 {
2369 loop_tree_node = ALLOCNO_LOOP_TREE_NODE (a);
2370 ira_assert (loop_tree_node->parent
2371 ->regno_allocno_map[ALLOCNO_REGNO (a)] != NULL
2372 && bitmap_bit_p (loop_tree_node->border_allocnos,
2373 ALLOCNO_NUM (a)));
2374 }
2375 }
2376}
2377#endif
2378
2379/* Create a internal representation (IR) for IRA (allocnos, copies,
2380 loop tree nodes). If LOOPS_P is FALSE the nodes corresponding to
2381 the loops (except the root which corresponds the all function) and
2382 correspondingly allocnos for the loops will be not created. Such
2383 parameter value is used for Chaitin-Briggs coloring. The function
2384 returns TRUE if we generate loop structure (besides nodes
2385 representing all function and the basic blocks) for regional
2386 allocation. A true return means that we really need to flatten IR
2387 before the reload. */
2388bool
2389ira_build (bool loops_p)
2390{
2391 df_analyze ();
2392
2393 initiate_cost_vectors ();
2394 initiate_allocnos ();
2395 initiate_copies ();
2396 create_loop_tree_nodes (loops_p);
2397 form_loop_tree ();
2398 create_allocnos ();
2399 ira_costs ();
2400 ira_create_allocno_live_ranges ();
2401 remove_unnecessary_regions ();
2402 loops_p = more_one_region_p ();
2403 if (loops_p)
2404 {
2405 propagate_allocno_info ();
2406 create_caps ();
2407 }
2408 ira_tune_allocno_costs_and_cover_classes ();
2409#ifdef ENABLE_IRA_CHECKING
2410 check_allocno_creation ();
2411#endif
2412 setup_min_max_allocno_live_range_point ();
2413 sort_conflict_id_allocno_map ();
2414 setup_min_max_conflict_allocno_ids ();
2415 ira_build_conflicts ();
2416 if (internal_flag_ira_verbose > 0 && ira_dump_file != NULL)
2417 {
2418 int n, nr;
2419 ira_allocno_t a;
2420 allocno_live_range_t r;
2421 ira_allocno_iterator ai;
2422
2423 n = 0;
2424 FOR_EACH_ALLOCNO (a, ai)
2425 n += ALLOCNO_CONFLICT_ALLOCNOS_NUM (a);
2426 nr = 0;
2427 FOR_EACH_ALLOCNO (a, ai)
2428 for (r = ALLOCNO_LIVE_RANGES (a); r != NULL; r = r->next)
2429 nr++;
2430 fprintf (ira_dump_file, " regions=%d, blocks=%d, points=%d\n",
2431 VEC_length (loop_p, ira_loops.larray), n_basic_blocks,
2432 ira_max_point);
2433 fprintf (ira_dump_file,
2434 " allocnos=%d, copies=%d, conflicts=%d, ranges=%d\n",
2435 ira_allocnos_num, ira_copies_num, n, nr);
2436 }
2437 return loops_p;
2438}
2439
2440/* Release the data created by function ira_build. */
2441void
2442ira_destroy (void)
2443{
2444 finish_loop_tree_nodes ();
2445 finish_copies ();
2446 finish_allocnos ();
2447 finish_cost_vectors ();
2448 ira_finish_allocno_live_ranges ();
2449}