1 /* Building internal representation for IRA.
2 Copyright (C) 2006-2013 Free Software Foundation, Inc.
3 Contributed by Vladimir Makarov <vmakarov@redhat.com>.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
30 #include "hard-reg-set.h"
31 #include "basic-block.h"
32 #include "insn-config.h"
34 #include "diagnostic-core.h"
38 #include "sparseset.h"
40 #include "emit-rtl.h" /* FIXME: Can go away once crtl is moved to rtl.h. */
42 static ira_copy_t
find_allocno_copy (ira_allocno_t
, ira_allocno_t
, rtx
,
43 ira_loop_tree_node_t
);
45 /* The root of the loop tree corresponding to the all function. */
46 ira_loop_tree_node_t ira_loop_tree_root
;
48 /* Height of the loop tree. */
49 int ira_loop_tree_height
;
51 /* All nodes representing basic blocks are referred through the
52 following array. We can not use basic block member `aux' for this
53 because it is used for insertion of insns on edges. */
54 ira_loop_tree_node_t ira_bb_nodes
;
56 /* All nodes representing loops are referred through the following
58 ira_loop_tree_node_t ira_loop_nodes
;
60 /* And size of the ira_loop_nodes array. */
61 unsigned int ira_loop_nodes_count
;
63 /* Map regno -> allocnos with given regno (see comments for
64 allocno member `next_regno_allocno'). */
65 ira_allocno_t
*ira_regno_allocno_map
;
67 /* Array of references to all allocnos. The order number of the
68 allocno corresponds to the index in the array. Removed allocnos
69 have NULL element value. */
70 ira_allocno_t
*ira_allocnos
;
72 /* Sizes of the previous array. */
75 /* Count of conflict record structures we've created, used when creating
79 /* Map a conflict id to its conflict record. */
80 ira_object_t
*ira_object_id_map
;
82 /* Array of references to all copies. The order number of the copy
83 corresponds to the index in the array. Removed copies have NULL
85 ira_copy_t
*ira_copies
;
87 /* Size of the previous array. */
92 /* LAST_BASIC_BLOCK before generating additional insns because of live
93 range splitting. Emitting insns on a critical edge creates a new
95 static int last_basic_block_before_change
;
97 /* Initialize some members in loop tree node NODE. Use LOOP_NUM for
98 the member loop_num. */
100 init_loop_tree_node (struct ira_loop_tree_node
*node
, int loop_num
)
102 int max_regno
= max_reg_num ();
104 node
->regno_allocno_map
105 = (ira_allocno_t
*) ira_allocate (sizeof (ira_allocno_t
) * max_regno
);
106 memset (node
->regno_allocno_map
, 0, sizeof (ira_allocno_t
) * max_regno
);
107 memset (node
->reg_pressure
, 0, sizeof (node
->reg_pressure
));
108 node
->all_allocnos
= ira_allocate_bitmap ();
109 node
->modified_regnos
= ira_allocate_bitmap ();
110 node
->border_allocnos
= ira_allocate_bitmap ();
111 node
->local_copies
= ira_allocate_bitmap ();
112 node
->loop_num
= loop_num
;
113 node
->children
= NULL
;
114 node
->subloops
= NULL
;
118 /* The following function allocates the loop tree nodes. If
119 CURRENT_LOOPS is NULL, the nodes corresponding to the loops (except
120 the root which corresponds the all function) will be not allocated
121 but nodes will still be allocated for basic blocks. */
123 create_loop_tree_nodes (void)
133 = ((struct ira_loop_tree_node
*)
134 ira_allocate (sizeof (struct ira_loop_tree_node
) * last_basic_block
));
135 last_basic_block_before_change
= last_basic_block
;
136 for (i
= 0; i
< (unsigned int) last_basic_block
; i
++)
138 ira_bb_nodes
[i
].regno_allocno_map
= NULL
;
139 memset (ira_bb_nodes
[i
].reg_pressure
, 0,
140 sizeof (ira_bb_nodes
[i
].reg_pressure
));
141 ira_bb_nodes
[i
].all_allocnos
= NULL
;
142 ira_bb_nodes
[i
].modified_regnos
= NULL
;
143 ira_bb_nodes
[i
].border_allocnos
= NULL
;
144 ira_bb_nodes
[i
].local_copies
= NULL
;
146 if (current_loops
== NULL
)
148 ira_loop_nodes_count
= 1;
149 ira_loop_nodes
= ((struct ira_loop_tree_node
*)
150 ira_allocate (sizeof (struct ira_loop_tree_node
)));
151 init_loop_tree_node (ira_loop_nodes
, 0);
154 ira_loop_nodes_count
= number_of_loops ();
155 ira_loop_nodes
= ((struct ira_loop_tree_node
*)
156 ira_allocate (sizeof (struct ira_loop_tree_node
)
157 * ira_loop_nodes_count
));
158 FOR_EACH_VEC_SAFE_ELT (get_loops (), i
, loop
)
160 if (loop_outer (loop
) != NULL
)
162 ira_loop_nodes
[i
].regno_allocno_map
= NULL
;
164 FOR_EACH_EDGE (e
, ei
, loop
->header
->preds
)
165 if (e
->src
!= loop
->latch
166 && (e
->flags
& EDGE_ABNORMAL
) && EDGE_CRITICAL_P (e
))
173 edges
= get_loop_exit_edges (loop
);
174 FOR_EACH_VEC_ELT (edges
, j
, e
)
175 if ((e
->flags
& EDGE_ABNORMAL
) && EDGE_CRITICAL_P (e
))
184 init_loop_tree_node (&ira_loop_nodes
[i
], loop
->num
);
188 /* The function returns TRUE if there are more one allocation
191 more_one_region_p (void)
196 if (current_loops
!= NULL
)
197 FOR_EACH_VEC_SAFE_ELT (get_loops (), i
, loop
)
198 if (ira_loop_nodes
[i
].regno_allocno_map
!= NULL
199 && ira_loop_tree_root
!= &ira_loop_nodes
[i
])
204 /* Free the loop tree node of a loop. */
206 finish_loop_tree_node (ira_loop_tree_node_t loop
)
208 if (loop
->regno_allocno_map
!= NULL
)
210 ira_assert (loop
->bb
== NULL
);
211 ira_free_bitmap (loop
->local_copies
);
212 ira_free_bitmap (loop
->border_allocnos
);
213 ira_free_bitmap (loop
->modified_regnos
);
214 ira_free_bitmap (loop
->all_allocnos
);
215 ira_free (loop
->regno_allocno_map
);
216 loop
->regno_allocno_map
= NULL
;
220 /* Free the loop tree nodes. */
222 finish_loop_tree_nodes (void)
226 for (i
= 0; i
< ira_loop_nodes_count
; i
++)
227 finish_loop_tree_node (&ira_loop_nodes
[i
]);
228 ira_free (ira_loop_nodes
);
229 for (i
= 0; i
< (unsigned int) last_basic_block_before_change
; i
++)
231 if (ira_bb_nodes
[i
].local_copies
!= NULL
)
232 ira_free_bitmap (ira_bb_nodes
[i
].local_copies
);
233 if (ira_bb_nodes
[i
].border_allocnos
!= NULL
)
234 ira_free_bitmap (ira_bb_nodes
[i
].border_allocnos
);
235 if (ira_bb_nodes
[i
].modified_regnos
!= NULL
)
236 ira_free_bitmap (ira_bb_nodes
[i
].modified_regnos
);
237 if (ira_bb_nodes
[i
].all_allocnos
!= NULL
)
238 ira_free_bitmap (ira_bb_nodes
[i
].all_allocnos
);
239 if (ira_bb_nodes
[i
].regno_allocno_map
!= NULL
)
240 ira_free (ira_bb_nodes
[i
].regno_allocno_map
);
242 ira_free (ira_bb_nodes
);
247 /* The following recursive function adds LOOP to the loop tree
248 hierarchy. LOOP is added only once. If LOOP is NULL we adding
249 loop designating the whole function when CFG loops are not
252 add_loop_to_tree (struct loop
*loop
)
256 ira_loop_tree_node_t loop_node
, parent_node
;
258 /* We can not use loop node access macros here because of potential
259 checking and because the nodes are not initialized enough
261 if (loop
!= NULL
&& loop_outer (loop
) != NULL
)
262 add_loop_to_tree (loop_outer (loop
));
263 loop_num
= loop
!= NULL
? loop
->num
: 0;
264 if (ira_loop_nodes
[loop_num
].regno_allocno_map
!= NULL
265 && ira_loop_nodes
[loop_num
].children
== NULL
)
267 /* We have not added loop node to the tree yet. */
268 loop_node
= &ira_loop_nodes
[loop_num
];
269 loop_node
->loop
= loop
;
270 loop_node
->bb
= NULL
;
275 for (parent
= loop_outer (loop
);
277 parent
= loop_outer (parent
))
278 if (ira_loop_nodes
[parent
->num
].regno_allocno_map
!= NULL
)
283 loop_node
->next
= NULL
;
284 loop_node
->subloop_next
= NULL
;
285 loop_node
->parent
= NULL
;
289 parent_node
= &ira_loop_nodes
[parent
->num
];
290 loop_node
->next
= parent_node
->children
;
291 parent_node
->children
= loop_node
;
292 loop_node
->subloop_next
= parent_node
->subloops
;
293 parent_node
->subloops
= loop_node
;
294 loop_node
->parent
= parent_node
;
299 /* The following recursive function sets up levels of nodes of the
300 tree given its root LOOP_NODE. The enumeration starts with LEVEL.
301 The function returns maximal value of level in the tree + 1. */
303 setup_loop_tree_level (ira_loop_tree_node_t loop_node
, int level
)
305 int height
, max_height
;
306 ira_loop_tree_node_t subloop_node
;
308 ira_assert (loop_node
->bb
== NULL
);
309 loop_node
->level
= level
;
310 max_height
= level
+ 1;
311 for (subloop_node
= loop_node
->subloops
;
312 subloop_node
!= NULL
;
313 subloop_node
= subloop_node
->subloop_next
)
315 ira_assert (subloop_node
->bb
== NULL
);
316 height
= setup_loop_tree_level (subloop_node
, level
+ 1);
317 if (height
> max_height
)
323 /* Create the loop tree. The algorithm is designed to provide correct
324 order of loops (they are ordered by their last loop BB) and basic
325 blocks in the chain formed by member next. */
327 form_loop_tree (void)
331 ira_loop_tree_node_t bb_node
, loop_node
;
333 /* We can not use loop/bb node access macros because of potential
334 checking and because the nodes are not initialized enough
338 bb_node
= &ira_bb_nodes
[bb
->index
];
340 bb_node
->loop
= NULL
;
341 bb_node
->subloops
= NULL
;
342 bb_node
->children
= NULL
;
343 bb_node
->subloop_next
= NULL
;
344 bb_node
->next
= NULL
;
345 if (current_loops
== NULL
)
349 for (parent
= bb
->loop_father
;
351 parent
= loop_outer (parent
))
352 if (ira_loop_nodes
[parent
->num
].regno_allocno_map
!= NULL
)
355 add_loop_to_tree (parent
);
356 loop_node
= &ira_loop_nodes
[parent
== NULL
? 0 : parent
->num
];
357 bb_node
->next
= loop_node
->children
;
358 bb_node
->parent
= loop_node
;
359 loop_node
->children
= bb_node
;
361 ira_loop_tree_root
= IRA_LOOP_NODE_BY_INDEX (0);
362 ira_loop_tree_height
= setup_loop_tree_level (ira_loop_tree_root
, 0);
363 ira_assert (ira_loop_tree_root
->regno_allocno_map
!= NULL
);
368 /* Rebuild IRA_REGNO_ALLOCNO_MAP and REGNO_ALLOCNO_MAPs of the loop
371 rebuild_regno_allocno_maps (void)
374 int max_regno
, regno
;
376 ira_loop_tree_node_t loop_tree_node
;
378 ira_allocno_iterator ai
;
380 ira_assert (current_loops
!= NULL
);
381 max_regno
= max_reg_num ();
382 FOR_EACH_VEC_SAFE_ELT (get_loops (), l
, loop
)
383 if (ira_loop_nodes
[l
].regno_allocno_map
!= NULL
)
385 ira_free (ira_loop_nodes
[l
].regno_allocno_map
);
386 ira_loop_nodes
[l
].regno_allocno_map
387 = (ira_allocno_t
*) ira_allocate (sizeof (ira_allocno_t
)
389 memset (ira_loop_nodes
[l
].regno_allocno_map
, 0,
390 sizeof (ira_allocno_t
) * max_regno
);
392 ira_free (ira_regno_allocno_map
);
393 ira_regno_allocno_map
394 = (ira_allocno_t
*) ira_allocate (max_regno
* sizeof (ira_allocno_t
));
395 memset (ira_regno_allocno_map
, 0, max_regno
* sizeof (ira_allocno_t
));
396 FOR_EACH_ALLOCNO (a
, ai
)
398 if (ALLOCNO_CAP_MEMBER (a
) != NULL
)
399 /* Caps are not in the regno allocno maps. */
401 regno
= ALLOCNO_REGNO (a
);
402 loop_tree_node
= ALLOCNO_LOOP_TREE_NODE (a
);
403 ALLOCNO_NEXT_REGNO_ALLOCNO (a
) = ira_regno_allocno_map
[regno
];
404 ira_regno_allocno_map
[regno
] = a
;
405 if (loop_tree_node
->regno_allocno_map
[regno
] == NULL
)
406 /* Remember that we can create temporary allocnos to break
407 cycles in register shuffle. */
408 loop_tree_node
->regno_allocno_map
[regno
] = a
;
413 /* Pools for allocnos, allocno live ranges and objects. */
414 static alloc_pool allocno_pool
, live_range_pool
, object_pool
;
416 /* Vec containing references to all created allocnos. It is a
417 container of array allocnos. */
418 static vec
<ira_allocno_t
> allocno_vec
;
420 /* Vec containing references to all created ira_objects. It is a
421 container of ira_object_id_map. */
422 static vec
<ira_object_t
> ira_object_id_map_vec
;
424 /* Initialize data concerning allocnos. */
426 initiate_allocnos (void)
429 = create_alloc_pool ("live ranges",
430 sizeof (struct live_range
), 100);
432 = create_alloc_pool ("allocnos", sizeof (struct ira_allocno
), 100);
434 = create_alloc_pool ("objects", sizeof (struct ira_object
), 100);
435 allocno_vec
.create (max_reg_num () * 2);
437 ira_allocnos_num
= 0;
439 ira_object_id_map_vec
.create (max_reg_num () * 2);
440 ira_object_id_map
= NULL
;
441 ira_regno_allocno_map
442 = (ira_allocno_t
*) ira_allocate (max_reg_num ()
443 * sizeof (ira_allocno_t
));
444 memset (ira_regno_allocno_map
, 0, max_reg_num () * sizeof (ira_allocno_t
));
447 /* Create and return an object corresponding to a new allocno A. */
449 ira_create_object (ira_allocno_t a
, int subword
)
451 enum reg_class aclass
= ALLOCNO_CLASS (a
);
452 ira_object_t obj
= (ira_object_t
) pool_alloc (object_pool
);
454 OBJECT_ALLOCNO (obj
) = a
;
455 OBJECT_SUBWORD (obj
) = subword
;
456 OBJECT_CONFLICT_ID (obj
) = ira_objects_num
;
457 OBJECT_CONFLICT_VEC_P (obj
) = false;
458 OBJECT_CONFLICT_ARRAY (obj
) = NULL
;
459 OBJECT_NUM_CONFLICTS (obj
) = 0;
460 COPY_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj
), ira_no_alloc_regs
);
461 COPY_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj
), ira_no_alloc_regs
);
462 IOR_COMPL_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj
),
463 reg_class_contents
[aclass
]);
464 IOR_COMPL_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj
),
465 reg_class_contents
[aclass
]);
466 OBJECT_MIN (obj
) = INT_MAX
;
467 OBJECT_MAX (obj
) = -1;
468 OBJECT_LIVE_RANGES (obj
) = NULL
;
470 ira_object_id_map_vec
.safe_push (obj
);
472 = ira_object_id_map_vec
.address ();
473 ira_objects_num
= ira_object_id_map_vec
.length ();
478 /* Create and return the allocno corresponding to REGNO in
479 LOOP_TREE_NODE. Add the allocno to the list of allocnos with the
480 same regno if CAP_P is FALSE. */
482 ira_create_allocno (int regno
, bool cap_p
,
483 ira_loop_tree_node_t loop_tree_node
)
487 a
= (ira_allocno_t
) pool_alloc (allocno_pool
);
488 ALLOCNO_REGNO (a
) = regno
;
489 ALLOCNO_LOOP_TREE_NODE (a
) = loop_tree_node
;
492 ALLOCNO_NEXT_REGNO_ALLOCNO (a
) = ira_regno_allocno_map
[regno
];
493 ira_regno_allocno_map
[regno
] = a
;
494 if (loop_tree_node
->regno_allocno_map
[regno
] == NULL
)
495 /* Remember that we can create temporary allocnos to break
496 cycles in register shuffle on region borders (see
498 loop_tree_node
->regno_allocno_map
[regno
] = a
;
500 ALLOCNO_CAP (a
) = NULL
;
501 ALLOCNO_CAP_MEMBER (a
) = NULL
;
502 ALLOCNO_NUM (a
) = ira_allocnos_num
;
503 bitmap_set_bit (loop_tree_node
->all_allocnos
, ALLOCNO_NUM (a
));
504 ALLOCNO_NREFS (a
) = 0;
505 ALLOCNO_FREQ (a
) = 0;
506 ALLOCNO_HARD_REGNO (a
) = -1;
507 ALLOCNO_CALL_FREQ (a
) = 0;
508 ALLOCNO_CALLS_CROSSED_NUM (a
) = 0;
509 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a
) = 0;
511 ALLOCNO_NO_STACK_REG_P (a
) = false;
512 ALLOCNO_TOTAL_NO_STACK_REG_P (a
) = false;
514 ALLOCNO_DONT_REASSIGN_P (a
) = false;
515 ALLOCNO_BAD_SPILL_P (a
) = false;
516 ALLOCNO_ASSIGNED_P (a
) = false;
517 ALLOCNO_MODE (a
) = (regno
< 0 ? VOIDmode
: PSEUDO_REGNO_MODE (regno
));
518 ALLOCNO_COPIES (a
) = NULL
;
519 ALLOCNO_HARD_REG_COSTS (a
) = NULL
;
520 ALLOCNO_CONFLICT_HARD_REG_COSTS (a
) = NULL
;
521 ALLOCNO_UPDATED_HARD_REG_COSTS (a
) = NULL
;
522 ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a
) = NULL
;
523 ALLOCNO_CLASS (a
) = NO_REGS
;
524 ALLOCNO_UPDATED_CLASS_COST (a
) = 0;
525 ALLOCNO_CLASS_COST (a
) = 0;
526 ALLOCNO_MEMORY_COST (a
) = 0;
527 ALLOCNO_UPDATED_MEMORY_COST (a
) = 0;
528 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a
) = 0;
529 ALLOCNO_NUM_OBJECTS (a
) = 0;
531 ALLOCNO_ADD_DATA (a
) = NULL
;
532 allocno_vec
.safe_push (a
);
533 ira_allocnos
= allocno_vec
.address ();
534 ira_allocnos_num
= allocno_vec
.length ();
539 /* Set up register class for A and update its conflict hard
542 ira_set_allocno_class (ira_allocno_t a
, enum reg_class aclass
)
544 ira_allocno_object_iterator oi
;
547 ALLOCNO_CLASS (a
) = aclass
;
548 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, oi
)
550 IOR_COMPL_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj
),
551 reg_class_contents
[aclass
]);
552 IOR_COMPL_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj
),
553 reg_class_contents
[aclass
]);
557 /* Determine the number of objects we should associate with allocno A
558 and allocate them. */
560 ira_create_allocno_objects (ira_allocno_t a
)
562 enum machine_mode mode
= ALLOCNO_MODE (a
);
563 enum reg_class aclass
= ALLOCNO_CLASS (a
);
564 int n
= ira_reg_class_max_nregs
[aclass
][mode
];
567 if (GET_MODE_SIZE (mode
) != 2 * UNITS_PER_WORD
|| n
!= 2)
570 ALLOCNO_NUM_OBJECTS (a
) = n
;
571 for (i
= 0; i
< n
; i
++)
572 ALLOCNO_OBJECT (a
, i
) = ira_create_object (a
, i
);
575 /* For each allocno, set ALLOCNO_NUM_OBJECTS and create the
576 ALLOCNO_OBJECT structures. This must be called after the allocno
577 classes are known. */
579 create_allocno_objects (void)
582 ira_allocno_iterator ai
;
584 FOR_EACH_ALLOCNO (a
, ai
)
585 ira_create_allocno_objects (a
);
588 /* Merge hard register conflict information for all objects associated with
589 allocno TO into the corresponding objects associated with FROM.
590 If TOTAL_ONLY is true, we only merge OBJECT_TOTAL_CONFLICT_HARD_REGS. */
592 merge_hard_reg_conflicts (ira_allocno_t from
, ira_allocno_t to
,
596 gcc_assert (ALLOCNO_NUM_OBJECTS (to
) == ALLOCNO_NUM_OBJECTS (from
));
597 for (i
= 0; i
< ALLOCNO_NUM_OBJECTS (to
); i
++)
599 ira_object_t from_obj
= ALLOCNO_OBJECT (from
, i
);
600 ira_object_t to_obj
= ALLOCNO_OBJECT (to
, i
);
603 IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (to_obj
),
604 OBJECT_CONFLICT_HARD_REGS (from_obj
));
605 IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (to_obj
),
606 OBJECT_TOTAL_CONFLICT_HARD_REGS (from_obj
));
609 if (!total_only
&& ALLOCNO_NO_STACK_REG_P (from
))
610 ALLOCNO_NO_STACK_REG_P (to
) = true;
611 if (ALLOCNO_TOTAL_NO_STACK_REG_P (from
))
612 ALLOCNO_TOTAL_NO_STACK_REG_P (to
) = true;
616 /* Update hard register conflict information for all objects associated with
617 A to include the regs in SET. */
619 ior_hard_reg_conflicts (ira_allocno_t a
, HARD_REG_SET
*set
)
621 ira_allocno_object_iterator i
;
624 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, i
)
626 IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj
), *set
);
627 IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj
), *set
);
631 /* Return TRUE if a conflict vector with NUM elements is more
632 profitable than a conflict bit vector for OBJ. */
634 ira_conflict_vector_profitable_p (ira_object_t obj
, int num
)
637 int max
= OBJECT_MAX (obj
);
638 int min
= OBJECT_MIN (obj
);
641 /* We prefer a bit vector in such case because it does not result
645 nw
= (max
- min
+ IRA_INT_BITS
) / IRA_INT_BITS
;
646 return (2 * sizeof (ira_object_t
) * (num
+ 1)
647 < 3 * nw
* sizeof (IRA_INT_TYPE
));
650 /* Allocates and initialize the conflict vector of OBJ for NUM
651 conflicting objects. */
653 ira_allocate_conflict_vec (ira_object_t obj
, int num
)
658 ira_assert (OBJECT_CONFLICT_ARRAY (obj
) == NULL
);
659 num
++; /* for NULL end marker */
660 size
= sizeof (ira_object_t
) * num
;
661 OBJECT_CONFLICT_ARRAY (obj
) = ira_allocate (size
);
662 vec
= (ira_object_t
*) OBJECT_CONFLICT_ARRAY (obj
);
664 OBJECT_NUM_CONFLICTS (obj
) = 0;
665 OBJECT_CONFLICT_ARRAY_SIZE (obj
) = size
;
666 OBJECT_CONFLICT_VEC_P (obj
) = true;
669 /* Allocate and initialize the conflict bit vector of OBJ. */
671 allocate_conflict_bit_vec (ira_object_t obj
)
675 ira_assert (OBJECT_CONFLICT_ARRAY (obj
) == NULL
);
676 size
= ((OBJECT_MAX (obj
) - OBJECT_MIN (obj
) + IRA_INT_BITS
)
677 / IRA_INT_BITS
* sizeof (IRA_INT_TYPE
));
678 OBJECT_CONFLICT_ARRAY (obj
) = ira_allocate (size
);
679 memset (OBJECT_CONFLICT_ARRAY (obj
), 0, size
);
680 OBJECT_CONFLICT_ARRAY_SIZE (obj
) = size
;
681 OBJECT_CONFLICT_VEC_P (obj
) = false;
684 /* Allocate and initialize the conflict vector or conflict bit vector
685 of OBJ for NUM conflicting allocnos whatever is more profitable. */
687 ira_allocate_object_conflicts (ira_object_t obj
, int num
)
689 if (ira_conflict_vector_profitable_p (obj
, num
))
690 ira_allocate_conflict_vec (obj
, num
);
692 allocate_conflict_bit_vec (obj
);
695 /* Add OBJ2 to the conflicts of OBJ1. */
697 add_to_conflicts (ira_object_t obj1
, ira_object_t obj2
)
702 if (OBJECT_CONFLICT_VEC_P (obj1
))
704 ira_object_t
*vec
= OBJECT_CONFLICT_VEC (obj1
);
705 int curr_num
= OBJECT_NUM_CONFLICTS (obj1
);
707 if (OBJECT_CONFLICT_ARRAY_SIZE (obj1
) < num
* sizeof (ira_object_t
))
709 ira_object_t
*newvec
;
710 size
= (3 * num
/ 2 + 1) * sizeof (ira_allocno_t
);
711 newvec
= (ira_object_t
*) ira_allocate (size
);
712 memcpy (newvec
, vec
, curr_num
* sizeof (ira_object_t
));
715 OBJECT_CONFLICT_ARRAY (obj1
) = vec
;
716 OBJECT_CONFLICT_ARRAY_SIZE (obj1
) = size
;
720 OBJECT_NUM_CONFLICTS (obj1
)++;
724 int nw
, added_head_nw
, id
;
725 IRA_INT_TYPE
*vec
= OBJECT_CONFLICT_BITVEC (obj1
);
727 id
= OBJECT_CONFLICT_ID (obj2
);
728 if (OBJECT_MIN (obj1
) > id
)
730 /* Expand head of the bit vector. */
731 added_head_nw
= (OBJECT_MIN (obj1
) - id
- 1) / IRA_INT_BITS
+ 1;
732 nw
= (OBJECT_MAX (obj1
) - OBJECT_MIN (obj1
)) / IRA_INT_BITS
+ 1;
733 size
= (nw
+ added_head_nw
) * sizeof (IRA_INT_TYPE
);
734 if (OBJECT_CONFLICT_ARRAY_SIZE (obj1
) >= size
)
736 memmove ((char *) vec
+ added_head_nw
* sizeof (IRA_INT_TYPE
),
737 vec
, nw
* sizeof (IRA_INT_TYPE
));
738 memset (vec
, 0, added_head_nw
* sizeof (IRA_INT_TYPE
));
743 = (3 * (nw
+ added_head_nw
) / 2 + 1) * sizeof (IRA_INT_TYPE
);
744 vec
= (IRA_INT_TYPE
*) ira_allocate (size
);
745 memcpy ((char *) vec
+ added_head_nw
* sizeof (IRA_INT_TYPE
),
746 OBJECT_CONFLICT_ARRAY (obj1
), nw
* sizeof (IRA_INT_TYPE
));
747 memset (vec
, 0, added_head_nw
* sizeof (IRA_INT_TYPE
));
749 + (nw
+ added_head_nw
) * sizeof (IRA_INT_TYPE
),
750 0, size
- (nw
+ added_head_nw
) * sizeof (IRA_INT_TYPE
));
751 ira_free (OBJECT_CONFLICT_ARRAY (obj1
));
752 OBJECT_CONFLICT_ARRAY (obj1
) = vec
;
753 OBJECT_CONFLICT_ARRAY_SIZE (obj1
) = size
;
755 OBJECT_MIN (obj1
) -= added_head_nw
* IRA_INT_BITS
;
757 else if (OBJECT_MAX (obj1
) < id
)
759 nw
= (id
- OBJECT_MIN (obj1
)) / IRA_INT_BITS
+ 1;
760 size
= nw
* sizeof (IRA_INT_TYPE
);
761 if (OBJECT_CONFLICT_ARRAY_SIZE (obj1
) < size
)
763 /* Expand tail of the bit vector. */
764 size
= (3 * nw
/ 2 + 1) * sizeof (IRA_INT_TYPE
);
765 vec
= (IRA_INT_TYPE
*) ira_allocate (size
);
766 memcpy (vec
, OBJECT_CONFLICT_ARRAY (obj1
), OBJECT_CONFLICT_ARRAY_SIZE (obj1
));
767 memset ((char *) vec
+ OBJECT_CONFLICT_ARRAY_SIZE (obj1
),
768 0, size
- OBJECT_CONFLICT_ARRAY_SIZE (obj1
));
769 ira_free (OBJECT_CONFLICT_ARRAY (obj1
));
770 OBJECT_CONFLICT_ARRAY (obj1
) = vec
;
771 OBJECT_CONFLICT_ARRAY_SIZE (obj1
) = size
;
773 OBJECT_MAX (obj1
) = id
;
775 SET_MINMAX_SET_BIT (vec
, id
, OBJECT_MIN (obj1
), OBJECT_MAX (obj1
));
779 /* Add OBJ1 to the conflicts of OBJ2 and vice versa. */
781 ira_add_conflict (ira_object_t obj1
, ira_object_t obj2
)
783 add_to_conflicts (obj1
, obj2
);
784 add_to_conflicts (obj2
, obj1
);
787 /* Clear all conflicts of OBJ. */
789 clear_conflicts (ira_object_t obj
)
791 if (OBJECT_CONFLICT_VEC_P (obj
))
793 OBJECT_NUM_CONFLICTS (obj
) = 0;
794 OBJECT_CONFLICT_VEC (obj
)[0] = NULL
;
796 else if (OBJECT_CONFLICT_ARRAY_SIZE (obj
) != 0)
800 nw
= (OBJECT_MAX (obj
) - OBJECT_MIN (obj
)) / IRA_INT_BITS
+ 1;
801 memset (OBJECT_CONFLICT_BITVEC (obj
), 0, nw
* sizeof (IRA_INT_TYPE
));
805 /* The array used to find duplications in conflict vectors of
807 static int *conflict_check
;
809 /* The value used to mark allocation presence in conflict vector of
810 the current allocno. */
811 static int curr_conflict_check_tick
;
813 /* Remove duplications in conflict vector of OBJ. */
815 compress_conflict_vec (ira_object_t obj
)
817 ira_object_t
*vec
, conflict_obj
;
820 ira_assert (OBJECT_CONFLICT_VEC_P (obj
));
821 vec
= OBJECT_CONFLICT_VEC (obj
);
822 curr_conflict_check_tick
++;
823 for (i
= j
= 0; (conflict_obj
= vec
[i
]) != NULL
; i
++)
825 int id
= OBJECT_CONFLICT_ID (conflict_obj
);
826 if (conflict_check
[id
] != curr_conflict_check_tick
)
828 conflict_check
[id
] = curr_conflict_check_tick
;
829 vec
[j
++] = conflict_obj
;
832 OBJECT_NUM_CONFLICTS (obj
) = j
;
836 /* Remove duplications in conflict vectors of all allocnos. */
838 compress_conflict_vecs (void)
841 ira_object_iterator oi
;
843 conflict_check
= (int *) ira_allocate (sizeof (int) * ira_objects_num
);
844 memset (conflict_check
, 0, sizeof (int) * ira_objects_num
);
845 curr_conflict_check_tick
= 0;
846 FOR_EACH_OBJECT (obj
, oi
)
848 if (OBJECT_CONFLICT_VEC_P (obj
))
849 compress_conflict_vec (obj
);
851 ira_free (conflict_check
);
854 /* This recursive function outputs allocno A and if it is a cap the
855 function outputs its members. */
857 ira_print_expanded_allocno (ira_allocno_t a
)
861 fprintf (ira_dump_file
, " a%d(r%d", ALLOCNO_NUM (a
), ALLOCNO_REGNO (a
));
862 if ((bb
= ALLOCNO_LOOP_TREE_NODE (a
)->bb
) != NULL
)
863 fprintf (ira_dump_file
, ",b%d", bb
->index
);
865 fprintf (ira_dump_file
, ",l%d", ALLOCNO_LOOP_TREE_NODE (a
)->loop_num
);
866 if (ALLOCNO_CAP_MEMBER (a
) != NULL
)
868 fprintf (ira_dump_file
, ":");
869 ira_print_expanded_allocno (ALLOCNO_CAP_MEMBER (a
));
871 fprintf (ira_dump_file
, ")");
874 /* Create and return the cap representing allocno A in the
877 create_cap_allocno (ira_allocno_t a
)
880 ira_loop_tree_node_t parent
;
881 enum reg_class aclass
;
883 parent
= ALLOCNO_LOOP_TREE_NODE (a
)->parent
;
884 cap
= ira_create_allocno (ALLOCNO_REGNO (a
), true, parent
);
885 ALLOCNO_MODE (cap
) = ALLOCNO_MODE (a
);
886 aclass
= ALLOCNO_CLASS (a
);
887 ira_set_allocno_class (cap
, aclass
);
888 ira_create_allocno_objects (cap
);
889 ALLOCNO_CAP_MEMBER (cap
) = a
;
890 ALLOCNO_CAP (a
) = cap
;
891 ALLOCNO_CLASS_COST (cap
) = ALLOCNO_CLASS_COST (a
);
892 ALLOCNO_MEMORY_COST (cap
) = ALLOCNO_MEMORY_COST (a
);
893 ira_allocate_and_copy_costs
894 (&ALLOCNO_HARD_REG_COSTS (cap
), aclass
, ALLOCNO_HARD_REG_COSTS (a
));
895 ira_allocate_and_copy_costs
896 (&ALLOCNO_CONFLICT_HARD_REG_COSTS (cap
), aclass
,
897 ALLOCNO_CONFLICT_HARD_REG_COSTS (a
));
898 ALLOCNO_BAD_SPILL_P (cap
) = ALLOCNO_BAD_SPILL_P (a
);
899 ALLOCNO_NREFS (cap
) = ALLOCNO_NREFS (a
);
900 ALLOCNO_FREQ (cap
) = ALLOCNO_FREQ (a
);
901 ALLOCNO_CALL_FREQ (cap
) = ALLOCNO_CALL_FREQ (a
);
903 merge_hard_reg_conflicts (a
, cap
, false);
905 ALLOCNO_CALLS_CROSSED_NUM (cap
) = ALLOCNO_CALLS_CROSSED_NUM (a
);
906 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (cap
) = ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a
);
907 if (internal_flag_ira_verbose
> 2 && ira_dump_file
!= NULL
)
909 fprintf (ira_dump_file
, " Creating cap ");
910 ira_print_expanded_allocno (cap
);
911 fprintf (ira_dump_file
, "\n");
916 /* Create and return a live range for OBJECT with given attributes. */
918 ira_create_live_range (ira_object_t obj
, int start
, int finish
,
923 p
= (live_range_t
) pool_alloc (live_range_pool
);
931 /* Create a new live range for OBJECT and queue it at the head of its
934 ira_add_live_range_to_object (ira_object_t object
, int start
, int finish
)
937 p
= ira_create_live_range (object
, start
, finish
,
938 OBJECT_LIVE_RANGES (object
));
939 OBJECT_LIVE_RANGES (object
) = p
;
942 /* Copy allocno live range R and return the result. */
944 copy_live_range (live_range_t r
)
948 p
= (live_range_t
) pool_alloc (live_range_pool
);
953 /* Copy allocno live range list given by its head R and return the
956 ira_copy_live_range_list (live_range_t r
)
958 live_range_t p
, first
, last
;
962 for (first
= last
= NULL
; r
!= NULL
; r
= r
->next
)
964 p
= copy_live_range (r
);
974 /* Merge ranges R1 and R2 and returns the result. The function
975 maintains the order of ranges and tries to minimize number of the
978 ira_merge_live_ranges (live_range_t r1
, live_range_t r2
)
980 live_range_t first
, last
, temp
;
986 for (first
= last
= NULL
; r1
!= NULL
&& r2
!= NULL
;)
988 if (r1
->start
< r2
->start
)
994 if (r1
->start
<= r2
->finish
+ 1)
996 /* Intersected ranges: merge r1 and r2 into r1. */
997 r1
->start
= r2
->start
;
998 if (r1
->finish
< r2
->finish
)
999 r1
->finish
= r2
->finish
;
1002 ira_finish_live_range (temp
);
1005 /* To try to merge with subsequent ranges in r1. */
1012 /* Add r1 to the result. */
1023 /* To try to merge with subsequent ranges in r2. */
1035 ira_assert (r1
->next
== NULL
);
1037 else if (r2
!= NULL
)
1043 ira_assert (r2
->next
== NULL
);
1047 ira_assert (last
->next
== NULL
);
1052 /* Return TRUE if live ranges R1 and R2 intersect. */
1054 ira_live_ranges_intersect_p (live_range_t r1
, live_range_t r2
)
1056 /* Remember the live ranges are always kept ordered. */
1057 while (r1
!= NULL
&& r2
!= NULL
)
1059 if (r1
->start
> r2
->finish
)
1061 else if (r2
->start
> r1
->finish
)
1069 /* Free allocno live range R. */
1071 ira_finish_live_range (live_range_t r
)
1073 pool_free (live_range_pool
, r
);
1076 /* Free list of allocno live ranges starting with R. */
1078 ira_finish_live_range_list (live_range_t r
)
1080 live_range_t next_r
;
1082 for (; r
!= NULL
; r
= next_r
)
1085 ira_finish_live_range (r
);
1089 /* Free updated register costs of allocno A. */
1091 ira_free_allocno_updated_costs (ira_allocno_t a
)
1093 enum reg_class aclass
;
1095 aclass
= ALLOCNO_CLASS (a
);
1096 if (ALLOCNO_UPDATED_HARD_REG_COSTS (a
) != NULL
)
1097 ira_free_cost_vector (ALLOCNO_UPDATED_HARD_REG_COSTS (a
), aclass
);
1098 ALLOCNO_UPDATED_HARD_REG_COSTS (a
) = NULL
;
1099 if (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a
) != NULL
)
1100 ira_free_cost_vector (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a
),
1102 ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a
) = NULL
;
1105 /* Free and nullify all cost vectors allocated earlier for allocno
1108 ira_free_allocno_costs (ira_allocno_t a
)
1110 enum reg_class aclass
= ALLOCNO_CLASS (a
);
1112 ira_allocno_object_iterator oi
;
1114 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, oi
)
1116 ira_finish_live_range_list (OBJECT_LIVE_RANGES (obj
));
1117 ira_object_id_map
[OBJECT_CONFLICT_ID (obj
)] = NULL
;
1118 if (OBJECT_CONFLICT_ARRAY (obj
) != NULL
)
1119 ira_free (OBJECT_CONFLICT_ARRAY (obj
));
1120 pool_free (object_pool
, obj
);
1123 ira_allocnos
[ALLOCNO_NUM (a
)] = NULL
;
1124 if (ALLOCNO_HARD_REG_COSTS (a
) != NULL
)
1125 ira_free_cost_vector (ALLOCNO_HARD_REG_COSTS (a
), aclass
);
1126 if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a
) != NULL
)
1127 ira_free_cost_vector (ALLOCNO_CONFLICT_HARD_REG_COSTS (a
), aclass
);
1128 if (ALLOCNO_UPDATED_HARD_REG_COSTS (a
) != NULL
)
1129 ira_free_cost_vector (ALLOCNO_UPDATED_HARD_REG_COSTS (a
), aclass
);
1130 if (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a
) != NULL
)
1131 ira_free_cost_vector (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a
),
1133 ALLOCNO_HARD_REG_COSTS (a
) = NULL
;
1134 ALLOCNO_CONFLICT_HARD_REG_COSTS (a
) = NULL
;
1135 ALLOCNO_UPDATED_HARD_REG_COSTS (a
) = NULL
;
1136 ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a
) = NULL
;
1139 /* Free the memory allocated for allocno A. */
1141 finish_allocno (ira_allocno_t a
)
1143 ira_free_allocno_costs (a
);
1144 pool_free (allocno_pool
, a
);
1147 /* Free the memory allocated for all allocnos. */
1149 finish_allocnos (void)
1152 ira_allocno_iterator ai
;
1154 FOR_EACH_ALLOCNO (a
, ai
)
1156 ira_free (ira_regno_allocno_map
);
1157 ira_object_id_map_vec
.release ();
1158 allocno_vec
.release ();
1159 free_alloc_pool (allocno_pool
);
1160 free_alloc_pool (object_pool
);
1161 free_alloc_pool (live_range_pool
);
1166 /* Pools for copies. */
1167 static alloc_pool copy_pool
;
1169 /* Vec containing references to all created copies. It is a
1170 container of array ira_copies. */
1171 static vec
<ira_copy_t
> copy_vec
;
1173 /* The function initializes data concerning allocno copies. */
1175 initiate_copies (void)
1178 = create_alloc_pool ("copies", sizeof (struct ira_allocno_copy
), 100);
1179 copy_vec
.create (get_max_uid ());
1184 /* Return copy connecting A1 and A2 and originated from INSN of
1185 LOOP_TREE_NODE if any. */
1187 find_allocno_copy (ira_allocno_t a1
, ira_allocno_t a2
, rtx insn
,
1188 ira_loop_tree_node_t loop_tree_node
)
1190 ira_copy_t cp
, next_cp
;
1191 ira_allocno_t another_a
;
1193 for (cp
= ALLOCNO_COPIES (a1
); cp
!= NULL
; cp
= next_cp
)
1195 if (cp
->first
== a1
)
1197 next_cp
= cp
->next_first_allocno_copy
;
1198 another_a
= cp
->second
;
1200 else if (cp
->second
== a1
)
1202 next_cp
= cp
->next_second_allocno_copy
;
1203 another_a
= cp
->first
;
1207 if (another_a
== a2
&& cp
->insn
== insn
1208 && cp
->loop_tree_node
== loop_tree_node
)
1214 /* Create and return copy with given attributes LOOP_TREE_NODE, FIRST,
1215 SECOND, FREQ, CONSTRAINT_P, and INSN. */
1217 ira_create_copy (ira_allocno_t first
, ira_allocno_t second
, int freq
,
1218 bool constraint_p
, rtx insn
,
1219 ira_loop_tree_node_t loop_tree_node
)
1223 cp
= (ira_copy_t
) pool_alloc (copy_pool
);
1224 cp
->num
= ira_copies_num
;
1226 cp
->second
= second
;
1228 cp
->constraint_p
= constraint_p
;
1230 cp
->loop_tree_node
= loop_tree_node
;
1231 copy_vec
.safe_push (cp
);
1232 ira_copies
= copy_vec
.address ();
1233 ira_copies_num
= copy_vec
.length ();
1237 /* Attach a copy CP to allocnos involved into the copy. */
1239 ira_add_allocno_copy_to_list (ira_copy_t cp
)
1241 ira_allocno_t first
= cp
->first
, second
= cp
->second
;
1243 cp
->prev_first_allocno_copy
= NULL
;
1244 cp
->prev_second_allocno_copy
= NULL
;
1245 cp
->next_first_allocno_copy
= ALLOCNO_COPIES (first
);
1246 if (cp
->next_first_allocno_copy
!= NULL
)
1248 if (cp
->next_first_allocno_copy
->first
== first
)
1249 cp
->next_first_allocno_copy
->prev_first_allocno_copy
= cp
;
1251 cp
->next_first_allocno_copy
->prev_second_allocno_copy
= cp
;
1253 cp
->next_second_allocno_copy
= ALLOCNO_COPIES (second
);
1254 if (cp
->next_second_allocno_copy
!= NULL
)
1256 if (cp
->next_second_allocno_copy
->second
== second
)
1257 cp
->next_second_allocno_copy
->prev_second_allocno_copy
= cp
;
1259 cp
->next_second_allocno_copy
->prev_first_allocno_copy
= cp
;
1261 ALLOCNO_COPIES (first
) = cp
;
1262 ALLOCNO_COPIES (second
) = cp
;
1265 /* Make a copy CP a canonical copy where number of the
1266 first allocno is less than the second one. */
1268 ira_swap_allocno_copy_ends_if_necessary (ira_copy_t cp
)
1273 if (ALLOCNO_NUM (cp
->first
) <= ALLOCNO_NUM (cp
->second
))
1277 cp
->first
= cp
->second
;
1280 temp_cp
= cp
->prev_first_allocno_copy
;
1281 cp
->prev_first_allocno_copy
= cp
->prev_second_allocno_copy
;
1282 cp
->prev_second_allocno_copy
= temp_cp
;
1284 temp_cp
= cp
->next_first_allocno_copy
;
1285 cp
->next_first_allocno_copy
= cp
->next_second_allocno_copy
;
1286 cp
->next_second_allocno_copy
= temp_cp
;
1289 /* Create (or update frequency if the copy already exists) and return
1290 the copy of allocnos FIRST and SECOND with frequency FREQ
1291 corresponding to move insn INSN (if any) and originated from
1294 ira_add_allocno_copy (ira_allocno_t first
, ira_allocno_t second
, int freq
,
1295 bool constraint_p
, rtx insn
,
1296 ira_loop_tree_node_t loop_tree_node
)
1300 if ((cp
= find_allocno_copy (first
, second
, insn
, loop_tree_node
)) != NULL
)
1305 cp
= ira_create_copy (first
, second
, freq
, constraint_p
, insn
,
1307 ira_assert (first
!= NULL
&& second
!= NULL
);
1308 ira_add_allocno_copy_to_list (cp
);
1309 ira_swap_allocno_copy_ends_if_necessary (cp
);
1313 /* Print info about copy CP into file F. */
1315 print_copy (FILE *f
, ira_copy_t cp
)
1317 fprintf (f
, " cp%d:a%d(r%d)<->a%d(r%d)@%d:%s\n", cp
->num
,
1318 ALLOCNO_NUM (cp
->first
), ALLOCNO_REGNO (cp
->first
),
1319 ALLOCNO_NUM (cp
->second
), ALLOCNO_REGNO (cp
->second
), cp
->freq
,
1321 ? "move" : cp
->constraint_p
? "constraint" : "shuffle");
1325 debug (ira_allocno_copy
&ref
)
1327 print_copy (stderr
, &ref
);
1331 debug (ira_allocno_copy
*ptr
)
1336 fprintf (stderr
, "<nil>\n");
1339 /* Print info about copy CP into stderr. */
1341 ira_debug_copy (ira_copy_t cp
)
1343 print_copy (stderr
, cp
);
1346 /* Print info about all copies into file F. */
1348 print_copies (FILE *f
)
1351 ira_copy_iterator ci
;
1353 FOR_EACH_COPY (cp
, ci
)
1357 /* Print info about all copies into stderr. */
1359 ira_debug_copies (void)
1361 print_copies (stderr
);
1364 /* Print info about copies involving allocno A into file F. */
1366 print_allocno_copies (FILE *f
, ira_allocno_t a
)
1368 ira_allocno_t another_a
;
1369 ira_copy_t cp
, next_cp
;
1371 fprintf (f
, " a%d(r%d):", ALLOCNO_NUM (a
), ALLOCNO_REGNO (a
));
1372 for (cp
= ALLOCNO_COPIES (a
); cp
!= NULL
; cp
= next_cp
)
1376 next_cp
= cp
->next_first_allocno_copy
;
1377 another_a
= cp
->second
;
1379 else if (cp
->second
== a
)
1381 next_cp
= cp
->next_second_allocno_copy
;
1382 another_a
= cp
->first
;
1386 fprintf (f
, " cp%d:a%d(r%d)@%d", cp
->num
,
1387 ALLOCNO_NUM (another_a
), ALLOCNO_REGNO (another_a
), cp
->freq
);
1393 debug (ira_allocno
&ref
)
1395 print_allocno_copies (stderr
, &ref
);
1399 debug (ira_allocno
*ptr
)
1404 fprintf (stderr
, "<nil>\n");
1408 /* Print info about copies involving allocno A into stderr. */
1410 ira_debug_allocno_copies (ira_allocno_t a
)
1412 print_allocno_copies (stderr
, a
);
1415 /* The function frees memory allocated for copy CP. */
1417 finish_copy (ira_copy_t cp
)
1419 pool_free (copy_pool
, cp
);
1423 /* Free memory allocated for all copies. */
1425 finish_copies (void)
1428 ira_copy_iterator ci
;
1430 FOR_EACH_COPY (cp
, ci
)
1432 copy_vec
.release ();
1433 free_alloc_pool (copy_pool
);
1438 /* Pools for cost vectors. It is defined only for allocno classes. */
1439 static alloc_pool cost_vector_pool
[N_REG_CLASSES
];
1441 /* The function initiates work with hard register cost vectors. It
1442 creates allocation pool for each allocno class. */
1444 initiate_cost_vectors (void)
1447 enum reg_class aclass
;
1449 for (i
= 0; i
< ira_allocno_classes_num
; i
++)
1451 aclass
= ira_allocno_classes
[i
];
1452 cost_vector_pool
[aclass
]
1453 = create_alloc_pool ("cost vectors",
1454 sizeof (int) * ira_class_hard_regs_num
[aclass
],
1459 /* Allocate and return a cost vector VEC for ACLASS. */
1461 ira_allocate_cost_vector (reg_class_t aclass
)
1463 return (int *) pool_alloc (cost_vector_pool
[(int) aclass
]);
1466 /* Free a cost vector VEC for ACLASS. */
1468 ira_free_cost_vector (int *vec
, reg_class_t aclass
)
1470 ira_assert (vec
!= NULL
);
1471 pool_free (cost_vector_pool
[(int) aclass
], vec
);
1474 /* Finish work with hard register cost vectors. Release allocation
1475 pool for each allocno class. */
1477 finish_cost_vectors (void)
1480 enum reg_class aclass
;
1482 for (i
= 0; i
< ira_allocno_classes_num
; i
++)
1484 aclass
= ira_allocno_classes
[i
];
1485 free_alloc_pool (cost_vector_pool
[aclass
]);
1491 /* Compute a post-ordering of the reverse control flow of the loop body
1492 designated by the children nodes of LOOP_NODE, whose body nodes in
1493 pre-order are input as LOOP_PREORDER. Return a VEC with a post-order
1494 of the reverse loop body.
1496 For the post-order of the reverse CFG, we visit the basic blocks in
1497 LOOP_PREORDER array in the reverse order of where they appear.
1498 This is important: We do not just want to compute a post-order of
1499 the reverse CFG, we want to make a best-guess for a visiting order that
1500 minimizes the number of chain elements per allocno live range. If the
1501 blocks would be visited in a different order, we would still compute a
1502 correct post-ordering but it would be less likely that two nodes
1503 connected by an edge in the CFG are neighbours in the topsort. */
1505 static vec
<ira_loop_tree_node_t
>
1506 ira_loop_tree_body_rev_postorder (ira_loop_tree_node_t loop_node ATTRIBUTE_UNUSED
,
1507 vec
<ira_loop_tree_node_t
> loop_preorder
)
1509 vec
<ira_loop_tree_node_t
> topsort_nodes
= vNULL
;
1510 unsigned int n_loop_preorder
;
1512 n_loop_preorder
= loop_preorder
.length ();
1513 if (n_loop_preorder
!= 0)
1515 ira_loop_tree_node_t subloop_node
;
1517 vec
<ira_loop_tree_node_t
> dfs_stack
;
1519 /* This is a bit of strange abuse of the BB_VISITED flag: We use
1520 the flag to mark blocks we still have to visit to add them to
1521 our post-order. Define an alias to avoid confusion. */
1522 #define BB_TO_VISIT BB_VISITED
1524 FOR_EACH_VEC_ELT (loop_preorder
, i
, subloop_node
)
1526 gcc_checking_assert (! (subloop_node
->bb
->flags
& BB_TO_VISIT
));
1527 subloop_node
->bb
->flags
|= BB_TO_VISIT
;
1530 topsort_nodes
.create (n_loop_preorder
);
1531 dfs_stack
.create (n_loop_preorder
);
1533 FOR_EACH_VEC_ELT_REVERSE (loop_preorder
, i
, subloop_node
)
1535 if (! (subloop_node
->bb
->flags
& BB_TO_VISIT
))
1538 subloop_node
->bb
->flags
&= ~BB_TO_VISIT
;
1539 dfs_stack
.quick_push (subloop_node
);
1540 while (! dfs_stack
.is_empty ())
1545 ira_loop_tree_node_t n
= dfs_stack
.last ();
1546 FOR_EACH_EDGE (e
, ei
, n
->bb
->preds
)
1548 ira_loop_tree_node_t pred_node
;
1549 basic_block pred_bb
= e
->src
;
1551 if (e
->src
== ENTRY_BLOCK_PTR
)
1554 pred_node
= IRA_BB_NODE_BY_INDEX (pred_bb
->index
);
1556 && (pred_node
->bb
->flags
& BB_TO_VISIT
))
1558 pred_node
->bb
->flags
&= ~BB_TO_VISIT
;
1559 dfs_stack
.quick_push (pred_node
);
1562 if (n
== dfs_stack
.last ())
1565 topsort_nodes
.quick_push (n
);
1571 dfs_stack
.release ();
1574 gcc_assert (topsort_nodes
.length () == n_loop_preorder
);
1575 return topsort_nodes
;
1578 /* The current loop tree node and its regno allocno map. */
1579 ira_loop_tree_node_t ira_curr_loop_tree_node
;
1580 ira_allocno_t
*ira_curr_regno_allocno_map
;
1582 /* This recursive function traverses loop tree with root LOOP_NODE
1583 calling non-null functions PREORDER_FUNC and POSTORDER_FUNC
1584 correspondingly in preorder and postorder. The function sets up
1585 IRA_CURR_LOOP_TREE_NODE and IRA_CURR_REGNO_ALLOCNO_MAP. If BB_P,
1586 basic block nodes of LOOP_NODE is also processed (before its
1589 If BB_P is set and POSTORDER_FUNC is given, the basic blocks in
1590 the loop are passed in the *reverse* post-order of the *reverse*
1591 CFG. This is only used by ira_create_allocno_live_ranges, which
1592 wants to visit basic blocks in this order to minimize the number
1593 of elements per live range chain.
1594 Note that the loop tree nodes are still visited in the normal,
1595 forward post-order of the loop tree. */
1598 ira_traverse_loop_tree (bool bb_p
, ira_loop_tree_node_t loop_node
,
1599 void (*preorder_func
) (ira_loop_tree_node_t
),
1600 void (*postorder_func
) (ira_loop_tree_node_t
))
1602 ira_loop_tree_node_t subloop_node
;
1604 ira_assert (loop_node
->bb
== NULL
);
1605 ira_curr_loop_tree_node
= loop_node
;
1606 ira_curr_regno_allocno_map
= ira_curr_loop_tree_node
->regno_allocno_map
;
1608 if (preorder_func
!= NULL
)
1609 (*preorder_func
) (loop_node
);
1613 vec
<ira_loop_tree_node_t
>
1614 loop_preorder
= vNULL
;
1617 /* Add all nodes to the set of nodes to visit. The IRA loop tree
1618 is set up such that nodes in the loop body appear in a pre-order
1619 of their place in the CFG. */
1620 for (subloop_node
= loop_node
->children
;
1621 subloop_node
!= NULL
;
1622 subloop_node
= subloop_node
->next
)
1623 if (subloop_node
->bb
!= NULL
)
1624 loop_preorder
.safe_push (subloop_node
);
1626 if (preorder_func
!= NULL
)
1627 FOR_EACH_VEC_ELT (loop_preorder
, i
, subloop_node
)
1628 (*preorder_func
) (subloop_node
);
1630 if (postorder_func
!= NULL
)
1632 vec
<ira_loop_tree_node_t
> loop_rev_postorder
=
1633 ira_loop_tree_body_rev_postorder (loop_node
, loop_preorder
);
1634 FOR_EACH_VEC_ELT_REVERSE (loop_rev_postorder
, i
, subloop_node
)
1635 (*postorder_func
) (subloop_node
);
1636 loop_rev_postorder
.release ();
1639 loop_preorder
.release ();
1642 for (subloop_node
= loop_node
->subloops
;
1643 subloop_node
!= NULL
;
1644 subloop_node
= subloop_node
->subloop_next
)
1646 ira_assert (subloop_node
->bb
== NULL
);
1647 ira_traverse_loop_tree (bb_p
, subloop_node
,
1648 preorder_func
, postorder_func
);
1651 ira_curr_loop_tree_node
= loop_node
;
1652 ira_curr_regno_allocno_map
= ira_curr_loop_tree_node
->regno_allocno_map
;
1654 if (postorder_func
!= NULL
)
1655 (*postorder_func
) (loop_node
);
1660 /* The basic block currently being processed. */
1661 static basic_block curr_bb
;
1663 /* This recursive function creates allocnos corresponding to
1664 pseudo-registers containing in X. True OUTPUT_P means that X is
1667 create_insn_allocnos (rtx x
, bool output_p
)
1671 enum rtx_code code
= GET_CODE (x
);
1677 if ((regno
= REGNO (x
)) >= FIRST_PSEUDO_REGISTER
)
1681 if ((a
= ira_curr_regno_allocno_map
[regno
]) == NULL
)
1682 a
= ira_create_allocno (regno
, false, ira_curr_loop_tree_node
);
1684 ALLOCNO_NREFS (a
)++;
1685 ALLOCNO_FREQ (a
) += REG_FREQ_FROM_BB (curr_bb
);
1687 bitmap_set_bit (ira_curr_loop_tree_node
->modified_regnos
, regno
);
1691 else if (code
== SET
)
1693 create_insn_allocnos (SET_DEST (x
), true);
1694 create_insn_allocnos (SET_SRC (x
), false);
1697 else if (code
== CLOBBER
)
1699 create_insn_allocnos (XEXP (x
, 0), true);
1702 else if (code
== MEM
)
1704 create_insn_allocnos (XEXP (x
, 0), false);
1707 else if (code
== PRE_DEC
|| code
== POST_DEC
|| code
== PRE_INC
||
1708 code
== POST_INC
|| code
== POST_MODIFY
|| code
== PRE_MODIFY
)
1710 create_insn_allocnos (XEXP (x
, 0), true);
1711 create_insn_allocnos (XEXP (x
, 0), false);
1715 fmt
= GET_RTX_FORMAT (code
);
1716 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1719 create_insn_allocnos (XEXP (x
, i
), output_p
);
1720 else if (fmt
[i
] == 'E')
1721 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1722 create_insn_allocnos (XVECEXP (x
, i
, j
), output_p
);
1726 /* Create allocnos corresponding to pseudo-registers living in the
1727 basic block represented by the corresponding loop tree node
1730 create_bb_allocnos (ira_loop_tree_node_t bb_node
)
1737 curr_bb
= bb
= bb_node
->bb
;
1738 ira_assert (bb
!= NULL
);
1739 FOR_BB_INSNS_REVERSE (bb
, insn
)
1740 if (NONDEBUG_INSN_P (insn
))
1741 create_insn_allocnos (PATTERN (insn
), false);
1742 /* It might be a allocno living through from one subloop to
1744 EXECUTE_IF_SET_IN_REG_SET (df_get_live_in (bb
), FIRST_PSEUDO_REGISTER
, i
, bi
)
1745 if (ira_curr_regno_allocno_map
[i
] == NULL
)
1746 ira_create_allocno (i
, false, ira_curr_loop_tree_node
);
1749 /* Create allocnos corresponding to pseudo-registers living on edge E
1750 (a loop entry or exit). Also mark the allocnos as living on the
1753 create_loop_allocnos (edge e
)
1756 bitmap live_in_regs
, border_allocnos
;
1758 ira_loop_tree_node_t parent
;
1760 live_in_regs
= df_get_live_in (e
->dest
);
1761 border_allocnos
= ira_curr_loop_tree_node
->border_allocnos
;
1762 EXECUTE_IF_SET_IN_REG_SET (df_get_live_out (e
->src
),
1763 FIRST_PSEUDO_REGISTER
, i
, bi
)
1764 if (bitmap_bit_p (live_in_regs
, i
))
1766 if (ira_curr_regno_allocno_map
[i
] == NULL
)
1768 /* The order of creations is important for right
1769 ira_regno_allocno_map. */
1770 if ((parent
= ira_curr_loop_tree_node
->parent
) != NULL
1771 && parent
->regno_allocno_map
[i
] == NULL
)
1772 ira_create_allocno (i
, false, parent
);
1773 ira_create_allocno (i
, false, ira_curr_loop_tree_node
);
1775 bitmap_set_bit (border_allocnos
,
1776 ALLOCNO_NUM (ira_curr_regno_allocno_map
[i
]));
1780 /* Create allocnos corresponding to pseudo-registers living in loop
1781 represented by the corresponding loop tree node LOOP_NODE. This
1782 function is called by ira_traverse_loop_tree. */
1784 create_loop_tree_node_allocnos (ira_loop_tree_node_t loop_node
)
1786 if (loop_node
->bb
!= NULL
)
1787 create_bb_allocnos (loop_node
);
1788 else if (loop_node
!= ira_loop_tree_root
)
1795 ira_assert (current_loops
!= NULL
);
1796 FOR_EACH_EDGE (e
, ei
, loop_node
->loop
->header
->preds
)
1797 if (e
->src
!= loop_node
->loop
->latch
)
1798 create_loop_allocnos (e
);
1800 edges
= get_loop_exit_edges (loop_node
->loop
);
1801 FOR_EACH_VEC_ELT (edges
, i
, e
)
1802 create_loop_allocnos (e
);
1807 /* Propagate information about allocnos modified inside the loop given
1808 by its LOOP_TREE_NODE to its parent. */
1810 propagate_modified_regnos (ira_loop_tree_node_t loop_tree_node
)
1812 if (loop_tree_node
== ira_loop_tree_root
)
1814 ira_assert (loop_tree_node
->bb
== NULL
);
1815 bitmap_ior_into (loop_tree_node
->parent
->modified_regnos
,
1816 loop_tree_node
->modified_regnos
);
1819 /* Propagate new info about allocno A (see comments about accumulated
1820 info in allocno definition) to the corresponding allocno on upper
1821 loop tree level. So allocnos on upper levels accumulate
1822 information about the corresponding allocnos in nested regions.
1823 The new info means allocno info finally calculated in this
1826 propagate_allocno_info (void)
1829 ira_allocno_t a
, parent_a
;
1830 ira_loop_tree_node_t parent
;
1831 enum reg_class aclass
;
1833 if (flag_ira_region
!= IRA_REGION_ALL
1834 && flag_ira_region
!= IRA_REGION_MIXED
)
1836 for (i
= max_reg_num () - 1; i
>= FIRST_PSEUDO_REGISTER
; i
--)
1837 for (a
= ira_regno_allocno_map
[i
];
1839 a
= ALLOCNO_NEXT_REGNO_ALLOCNO (a
))
1840 if ((parent
= ALLOCNO_LOOP_TREE_NODE (a
)->parent
) != NULL
1841 && (parent_a
= parent
->regno_allocno_map
[i
]) != NULL
1842 /* There are no caps yet at this point. So use
1843 border_allocnos to find allocnos for the propagation. */
1844 && bitmap_bit_p (ALLOCNO_LOOP_TREE_NODE (a
)->border_allocnos
,
1847 if (! ALLOCNO_BAD_SPILL_P (a
))
1848 ALLOCNO_BAD_SPILL_P (parent_a
) = false;
1849 ALLOCNO_NREFS (parent_a
) += ALLOCNO_NREFS (a
);
1850 ALLOCNO_FREQ (parent_a
) += ALLOCNO_FREQ (a
);
1851 ALLOCNO_CALL_FREQ (parent_a
) += ALLOCNO_CALL_FREQ (a
);
1852 merge_hard_reg_conflicts (a
, parent_a
, true);
1853 ALLOCNO_CALLS_CROSSED_NUM (parent_a
)
1854 += ALLOCNO_CALLS_CROSSED_NUM (a
);
1855 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (parent_a
)
1856 += ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a
);
1857 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a
)
1858 += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a
);
1859 aclass
= ALLOCNO_CLASS (a
);
1860 ira_assert (aclass
== ALLOCNO_CLASS (parent_a
));
1861 ira_allocate_and_accumulate_costs
1862 (&ALLOCNO_HARD_REG_COSTS (parent_a
), aclass
,
1863 ALLOCNO_HARD_REG_COSTS (a
));
1864 ira_allocate_and_accumulate_costs
1865 (&ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a
),
1867 ALLOCNO_CONFLICT_HARD_REG_COSTS (a
));
1868 ALLOCNO_CLASS_COST (parent_a
)
1869 += ALLOCNO_CLASS_COST (a
);
1870 ALLOCNO_MEMORY_COST (parent_a
) += ALLOCNO_MEMORY_COST (a
);
1874 /* Create allocnos corresponding to pseudo-registers in the current
1875 function. Traverse the loop tree for this. */
1877 create_allocnos (void)
1879 /* We need to process BB first to correctly link allocnos by member
1880 next_regno_allocno. */
1881 ira_traverse_loop_tree (true, ira_loop_tree_root
,
1882 create_loop_tree_node_allocnos
, NULL
);
1884 ira_traverse_loop_tree (false, ira_loop_tree_root
, NULL
,
1885 propagate_modified_regnos
);
1890 /* The page contains function to remove some regions from a separate
1891 register allocation. We remove regions whose separate allocation
1892 will hardly improve the result. As a result we speed up regional
1893 register allocation. */
1895 /* The function changes the object in range list given by R to OBJ. */
1897 change_object_in_range_list (live_range_t r
, ira_object_t obj
)
1899 for (; r
!= NULL
; r
= r
->next
)
1903 /* Move all live ranges associated with allocno FROM to allocno TO. */
1905 move_allocno_live_ranges (ira_allocno_t from
, ira_allocno_t to
)
1908 int n
= ALLOCNO_NUM_OBJECTS (from
);
1910 gcc_assert (n
== ALLOCNO_NUM_OBJECTS (to
));
1912 for (i
= 0; i
< n
; i
++)
1914 ira_object_t from_obj
= ALLOCNO_OBJECT (from
, i
);
1915 ira_object_t to_obj
= ALLOCNO_OBJECT (to
, i
);
1916 live_range_t lr
= OBJECT_LIVE_RANGES (from_obj
);
1918 if (internal_flag_ira_verbose
> 4 && ira_dump_file
!= NULL
)
1920 fprintf (ira_dump_file
,
1921 " Moving ranges of a%dr%d to a%dr%d: ",
1922 ALLOCNO_NUM (from
), ALLOCNO_REGNO (from
),
1923 ALLOCNO_NUM (to
), ALLOCNO_REGNO (to
));
1924 ira_print_live_range_list (ira_dump_file
, lr
);
1926 change_object_in_range_list (lr
, to_obj
);
1927 OBJECT_LIVE_RANGES (to_obj
)
1928 = ira_merge_live_ranges (lr
, OBJECT_LIVE_RANGES (to_obj
));
1929 OBJECT_LIVE_RANGES (from_obj
) = NULL
;
1934 copy_allocno_live_ranges (ira_allocno_t from
, ira_allocno_t to
)
1937 int n
= ALLOCNO_NUM_OBJECTS (from
);
1939 gcc_assert (n
== ALLOCNO_NUM_OBJECTS (to
));
1941 for (i
= 0; i
< n
; i
++)
1943 ira_object_t from_obj
= ALLOCNO_OBJECT (from
, i
);
1944 ira_object_t to_obj
= ALLOCNO_OBJECT (to
, i
);
1945 live_range_t lr
= OBJECT_LIVE_RANGES (from_obj
);
1947 if (internal_flag_ira_verbose
> 4 && ira_dump_file
!= NULL
)
1949 fprintf (ira_dump_file
, " Copying ranges of a%dr%d to a%dr%d: ",
1950 ALLOCNO_NUM (from
), ALLOCNO_REGNO (from
),
1951 ALLOCNO_NUM (to
), ALLOCNO_REGNO (to
));
1952 ira_print_live_range_list (ira_dump_file
, lr
);
1954 lr
= ira_copy_live_range_list (lr
);
1955 change_object_in_range_list (lr
, to_obj
);
1956 OBJECT_LIVE_RANGES (to_obj
)
1957 = ira_merge_live_ranges (lr
, OBJECT_LIVE_RANGES (to_obj
));
1961 /* Return TRUE if NODE represents a loop with low register
1964 low_pressure_loop_node_p (ira_loop_tree_node_t node
)
1967 enum reg_class pclass
;
1969 if (node
->bb
!= NULL
)
1972 for (i
= 0; i
< ira_pressure_classes_num
; i
++)
1974 pclass
= ira_pressure_classes
[i
];
1975 if (node
->reg_pressure
[pclass
] > ira_class_hard_regs_num
[pclass
]
1976 && ira_class_hard_regs_num
[pclass
] > 1)
1983 /* Return TRUE if LOOP has a complex enter or exit edge. We don't
1984 form a region from such loop if the target use stack register
1985 because reg-stack.c can not deal with such edges. */
1987 loop_with_complex_edge_p (struct loop
*loop
)
1995 FOR_EACH_EDGE (e
, ei
, loop
->header
->preds
)
1996 if (e
->flags
& EDGE_EH
)
1998 edges
= get_loop_exit_edges (loop
);
2000 FOR_EACH_VEC_ELT (edges
, i
, e
)
2001 if (e
->flags
& EDGE_COMPLEX
)
2011 /* Sort loops for marking them for removal. We put already marked
2012 loops first, then less frequent loops next, and then outer loops
2015 loop_compare_func (const void *v1p
, const void *v2p
)
2018 ira_loop_tree_node_t l1
= *(const ira_loop_tree_node_t
*) v1p
;
2019 ira_loop_tree_node_t l2
= *(const ira_loop_tree_node_t
*) v2p
;
2021 ira_assert (l1
->parent
!= NULL
&& l2
->parent
!= NULL
);
2022 if (l1
->to_remove_p
&& ! l2
->to_remove_p
)
2024 if (! l1
->to_remove_p
&& l2
->to_remove_p
)
2026 if ((diff
= l1
->loop
->header
->frequency
- l2
->loop
->header
->frequency
) != 0)
2028 if ((diff
= (int) loop_depth (l1
->loop
) - (int) loop_depth (l2
->loop
)) != 0)
2030 /* Make sorting stable. */
2031 return l1
->loop_num
- l2
->loop_num
;
2034 /* Mark loops which should be removed from regional allocation. We
2035 remove a loop with low register pressure inside another loop with
2036 register pressure. In this case a separate allocation of the loop
2037 hardly helps (for irregular register file architecture it could
2038 help by choosing a better hard register in the loop but we prefer
2039 faster allocation even in this case). We also remove cheap loops
2040 if there are more than IRA_MAX_LOOPS_NUM of them. Loop with EH
2041 exit or enter edges are removed too because the allocation might
2042 require put pseudo moves on the EH edges (we could still do this
2043 for pseudos with caller saved hard registers in some cases but it
2044 is impossible to say here or during top-down allocation pass what
2045 hard register the pseudos get finally). */
2047 mark_loops_for_removal (void)
2050 ira_loop_tree_node_t
*sorted_loops
;
2053 ira_assert (current_loops
!= NULL
);
2055 = (ira_loop_tree_node_t
*) ira_allocate (sizeof (ira_loop_tree_node_t
)
2056 * number_of_loops ());
2057 for (n
= i
= 0; vec_safe_iterate (get_loops (), i
, &loop
); i
++)
2058 if (ira_loop_nodes
[i
].regno_allocno_map
!= NULL
)
2060 if (ira_loop_nodes
[i
].parent
== NULL
)
2062 /* Don't remove the root. */
2063 ira_loop_nodes
[i
].to_remove_p
= false;
2066 sorted_loops
[n
++] = &ira_loop_nodes
[i
];
2067 ira_loop_nodes
[i
].to_remove_p
2068 = ((low_pressure_loop_node_p (ira_loop_nodes
[i
].parent
)
2069 && low_pressure_loop_node_p (&ira_loop_nodes
[i
]))
2071 || loop_with_complex_edge_p (ira_loop_nodes
[i
].loop
)
2075 qsort (sorted_loops
, n
, sizeof (ira_loop_tree_node_t
), loop_compare_func
);
2076 for (i
= 0; n
- i
+ 1 > IRA_MAX_LOOPS_NUM
; i
++)
2078 sorted_loops
[i
]->to_remove_p
= true;
2079 if (internal_flag_ira_verbose
> 1 && ira_dump_file
!= NULL
)
2082 " Mark loop %d (header %d, freq %d, depth %d) for removal (%s)\n",
2083 sorted_loops
[i
]->loop_num
, sorted_loops
[i
]->loop
->header
->index
,
2084 sorted_loops
[i
]->loop
->header
->frequency
,
2085 loop_depth (sorted_loops
[i
]->loop
),
2086 low_pressure_loop_node_p (sorted_loops
[i
]->parent
)
2087 && low_pressure_loop_node_p (sorted_loops
[i
])
2088 ? "low pressure" : "cheap loop");
2090 ira_free (sorted_loops
);
2093 /* Mark all loops but root for removing. */
2095 mark_all_loops_for_removal (void)
2100 ira_assert (current_loops
!= NULL
);
2101 FOR_EACH_VEC_SAFE_ELT (get_loops (), i
, loop
)
2102 if (ira_loop_nodes
[i
].regno_allocno_map
!= NULL
)
2104 if (ira_loop_nodes
[i
].parent
== NULL
)
2106 /* Don't remove the root. */
2107 ira_loop_nodes
[i
].to_remove_p
= false;
2110 ira_loop_nodes
[i
].to_remove_p
= true;
2111 if (internal_flag_ira_verbose
> 1 && ira_dump_file
!= NULL
)
2114 " Mark loop %d (header %d, freq %d, depth %d) for removal\n",
2115 ira_loop_nodes
[i
].loop_num
,
2116 ira_loop_nodes
[i
].loop
->header
->index
,
2117 ira_loop_nodes
[i
].loop
->header
->frequency
,
2118 loop_depth (ira_loop_nodes
[i
].loop
));
2122 /* Definition of vector of loop tree nodes. */
2124 /* Vec containing references to all removed loop tree nodes. */
2125 static vec
<ira_loop_tree_node_t
> removed_loop_vec
;
2127 /* Vec containing references to all children of loop tree nodes. */
2128 static vec
<ira_loop_tree_node_t
> children_vec
;
2130 /* Remove subregions of NODE if their separate allocation will not
2131 improve the result. */
2133 remove_uneccesary_loop_nodes_from_loop_tree (ira_loop_tree_node_t node
)
2137 ira_loop_tree_node_t subnode
;
2139 remove_p
= node
->to_remove_p
;
2141 children_vec
.safe_push (node
);
2142 start
= children_vec
.length ();
2143 for (subnode
= node
->children
; subnode
!= NULL
; subnode
= subnode
->next
)
2144 if (subnode
->bb
== NULL
)
2145 remove_uneccesary_loop_nodes_from_loop_tree (subnode
);
2147 children_vec
.safe_push (subnode
);
2148 node
->children
= node
->subloops
= NULL
;
2151 removed_loop_vec
.safe_push (node
);
2154 while (children_vec
.length () > start
)
2156 subnode
= children_vec
.pop ();
2157 subnode
->parent
= node
;
2158 subnode
->next
= node
->children
;
2159 node
->children
= subnode
;
2160 if (subnode
->bb
== NULL
)
2162 subnode
->subloop_next
= node
->subloops
;
2163 node
->subloops
= subnode
;
2168 /* Return TRUE if NODE is inside PARENT. */
2170 loop_is_inside_p (ira_loop_tree_node_t node
, ira_loop_tree_node_t parent
)
2172 for (node
= node
->parent
; node
!= NULL
; node
= node
->parent
)
2178 /* Sort allocnos according to their order in regno allocno list. */
2180 regno_allocno_order_compare_func (const void *v1p
, const void *v2p
)
2182 ira_allocno_t a1
= *(const ira_allocno_t
*) v1p
;
2183 ira_allocno_t a2
= *(const ira_allocno_t
*) v2p
;
2184 ira_loop_tree_node_t n1
= ALLOCNO_LOOP_TREE_NODE (a1
);
2185 ira_loop_tree_node_t n2
= ALLOCNO_LOOP_TREE_NODE (a2
);
2187 if (loop_is_inside_p (n1
, n2
))
2189 else if (loop_is_inside_p (n2
, n1
))
2191 /* If allocnos are equally good, sort by allocno numbers, so that
2192 the results of qsort leave nothing to chance. We put allocnos
2193 with higher number first in the list because it is the original
2194 order for allocnos from loops on the same levels. */
2195 return ALLOCNO_NUM (a2
) - ALLOCNO_NUM (a1
);
2198 /* This array is used to sort allocnos to restore allocno order in
2199 the regno allocno list. */
2200 static ira_allocno_t
*regno_allocnos
;
2202 /* Restore allocno order for REGNO in the regno allocno list. */
2204 ira_rebuild_regno_allocno_list (int regno
)
2209 for (n
= 0, a
= ira_regno_allocno_map
[regno
];
2211 a
= ALLOCNO_NEXT_REGNO_ALLOCNO (a
))
2212 regno_allocnos
[n
++] = a
;
2214 qsort (regno_allocnos
, n
, sizeof (ira_allocno_t
),
2215 regno_allocno_order_compare_func
);
2216 for (i
= 1; i
< n
; i
++)
2217 ALLOCNO_NEXT_REGNO_ALLOCNO (regno_allocnos
[i
- 1]) = regno_allocnos
[i
];
2218 ALLOCNO_NEXT_REGNO_ALLOCNO (regno_allocnos
[n
- 1]) = NULL
;
2219 ira_regno_allocno_map
[regno
] = regno_allocnos
[0];
2220 if (internal_flag_ira_verbose
> 1 && ira_dump_file
!= NULL
)
2221 fprintf (ira_dump_file
, " Rebuilding regno allocno list for %d\n", regno
);
2224 /* Propagate info from allocno FROM_A to allocno A. */
2226 propagate_some_info_from_allocno (ira_allocno_t a
, ira_allocno_t from_a
)
2228 enum reg_class aclass
;
2230 merge_hard_reg_conflicts (from_a
, a
, false);
2231 ALLOCNO_NREFS (a
) += ALLOCNO_NREFS (from_a
);
2232 ALLOCNO_FREQ (a
) += ALLOCNO_FREQ (from_a
);
2233 ALLOCNO_CALL_FREQ (a
) += ALLOCNO_CALL_FREQ (from_a
);
2234 ALLOCNO_CALLS_CROSSED_NUM (a
) += ALLOCNO_CALLS_CROSSED_NUM (from_a
);
2235 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a
)
2236 += ALLOCNO_CHEAP_CALLS_CROSSED_NUM (from_a
);
2237 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a
)
2238 += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (from_a
);
2239 if (! ALLOCNO_BAD_SPILL_P (from_a
))
2240 ALLOCNO_BAD_SPILL_P (a
) = false;
2241 aclass
= ALLOCNO_CLASS (from_a
);
2242 ira_assert (aclass
== ALLOCNO_CLASS (a
));
2243 ira_allocate_and_accumulate_costs (&ALLOCNO_HARD_REG_COSTS (a
), aclass
,
2244 ALLOCNO_HARD_REG_COSTS (from_a
));
2245 ira_allocate_and_accumulate_costs (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a
),
2247 ALLOCNO_CONFLICT_HARD_REG_COSTS (from_a
));
2248 ALLOCNO_CLASS_COST (a
) += ALLOCNO_CLASS_COST (from_a
);
2249 ALLOCNO_MEMORY_COST (a
) += ALLOCNO_MEMORY_COST (from_a
);
2252 /* Remove allocnos from loops removed from the allocation
2255 remove_unnecessary_allocnos (void)
2258 bool merged_p
, rebuild_p
;
2259 ira_allocno_t a
, prev_a
, next_a
, parent_a
;
2260 ira_loop_tree_node_t a_node
, parent
;
2263 regno_allocnos
= NULL
;
2264 for (regno
= max_reg_num () - 1; regno
>= FIRST_PSEUDO_REGISTER
; regno
--)
2267 for (prev_a
= NULL
, a
= ira_regno_allocno_map
[regno
];
2271 next_a
= ALLOCNO_NEXT_REGNO_ALLOCNO (a
);
2272 a_node
= ALLOCNO_LOOP_TREE_NODE (a
);
2273 if (! a_node
->to_remove_p
)
2277 for (parent
= a_node
->parent
;
2278 (parent_a
= parent
->regno_allocno_map
[regno
]) == NULL
2279 && parent
->to_remove_p
;
2280 parent
= parent
->parent
)
2282 if (parent_a
== NULL
)
2284 /* There are no allocnos with the same regno in
2285 upper region -- just move the allocno to the
2288 ALLOCNO_LOOP_TREE_NODE (a
) = parent
;
2289 parent
->regno_allocno_map
[regno
] = a
;
2290 bitmap_set_bit (parent
->all_allocnos
, ALLOCNO_NUM (a
));
2295 /* Remove the allocno and update info of allocno in
2296 the upper region. */
2298 ira_regno_allocno_map
[regno
] = next_a
;
2300 ALLOCNO_NEXT_REGNO_ALLOCNO (prev_a
) = next_a
;
2301 move_allocno_live_ranges (a
, parent_a
);
2303 propagate_some_info_from_allocno (parent_a
, a
);
2304 /* Remove it from the corresponding regno allocno
2305 map to avoid info propagation of subsequent
2306 allocno into this already removed allocno. */
2307 a_node
->regno_allocno_map
[regno
] = NULL
;
2313 /* We need to restore the order in regno allocno list. */
2315 if (regno_allocnos
== NULL
)
2317 = (ira_allocno_t
*) ira_allocate (sizeof (ira_allocno_t
)
2318 * ira_allocnos_num
);
2319 ira_rebuild_regno_allocno_list (regno
);
2323 ira_rebuild_start_finish_chains ();
2324 if (regno_allocnos
!= NULL
)
2325 ira_free (regno_allocnos
);
2328 /* Remove allocnos from all loops but the root. */
2330 remove_low_level_allocnos (void)
2333 bool merged_p
, propagate_p
;
2334 ira_allocno_t a
, top_a
;
2335 ira_loop_tree_node_t a_node
, parent
;
2336 ira_allocno_iterator ai
;
2339 FOR_EACH_ALLOCNO (a
, ai
)
2341 a_node
= ALLOCNO_LOOP_TREE_NODE (a
);
2342 if (a_node
== ira_loop_tree_root
|| ALLOCNO_CAP_MEMBER (a
) != NULL
)
2344 regno
= ALLOCNO_REGNO (a
);
2345 if ((top_a
= ira_loop_tree_root
->regno_allocno_map
[regno
]) == NULL
)
2347 ALLOCNO_LOOP_TREE_NODE (a
) = ira_loop_tree_root
;
2348 ira_loop_tree_root
->regno_allocno_map
[regno
] = a
;
2351 propagate_p
= a_node
->parent
->regno_allocno_map
[regno
] == NULL
;
2352 /* Remove the allocno and update info of allocno in the upper
2354 move_allocno_live_ranges (a
, top_a
);
2357 propagate_some_info_from_allocno (top_a
, a
);
2359 FOR_EACH_ALLOCNO (a
, ai
)
2361 a_node
= ALLOCNO_LOOP_TREE_NODE (a
);
2362 if (a_node
== ira_loop_tree_root
)
2364 parent
= a_node
->parent
;
2365 regno
= ALLOCNO_REGNO (a
);
2366 if (ALLOCNO_CAP_MEMBER (a
) != NULL
)
2367 ira_assert (ALLOCNO_CAP (a
) != NULL
);
2368 else if (ALLOCNO_CAP (a
) == NULL
)
2369 ira_assert (parent
->regno_allocno_map
[regno
] != NULL
);
2371 FOR_EACH_ALLOCNO (a
, ai
)
2373 regno
= ALLOCNO_REGNO (a
);
2374 if (ira_loop_tree_root
->regno_allocno_map
[regno
] == a
)
2377 ira_allocno_object_iterator oi
;
2379 ira_regno_allocno_map
[regno
] = a
;
2380 ALLOCNO_NEXT_REGNO_ALLOCNO (a
) = NULL
;
2381 ALLOCNO_CAP_MEMBER (a
) = NULL
;
2382 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, oi
)
2383 COPY_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj
),
2384 OBJECT_TOTAL_CONFLICT_HARD_REGS (obj
));
2386 if (ALLOCNO_TOTAL_NO_STACK_REG_P (a
))
2387 ALLOCNO_NO_STACK_REG_P (a
) = true;
2394 ira_rebuild_start_finish_chains ();
2397 /* Remove loops from consideration. We remove all loops except for
2398 root if ALL_P or loops for which a separate allocation will not
2399 improve the result. We have to do this after allocno creation and
2400 their costs and allocno class evaluation because only after that
2401 the register pressure can be known and is calculated. */
2403 remove_unnecessary_regions (bool all_p
)
2405 if (current_loops
== NULL
)
2408 mark_all_loops_for_removal ();
2410 mark_loops_for_removal ();
2411 children_vec
.create(last_basic_block
+ number_of_loops ());
2412 removed_loop_vec
.create(last_basic_block
+ number_of_loops ());
2413 remove_uneccesary_loop_nodes_from_loop_tree (ira_loop_tree_root
);
2414 children_vec
.release ();
2416 remove_low_level_allocnos ();
2418 remove_unnecessary_allocnos ();
2419 while (removed_loop_vec
.length () > 0)
2420 finish_loop_tree_node (removed_loop_vec
.pop ());
2421 removed_loop_vec
.release ();
2426 /* At this point true value of allocno attribute bad_spill_p means
2427 that there is an insn where allocno occurs and where the allocno
2428 can not be used as memory. The function updates the attribute, now
2429 it can be true only for allocnos which can not be used as memory in
2430 an insn and in whose live ranges there is other allocno deaths.
2431 Spilling allocnos with true value will not improve the code because
2432 it will not make other allocnos colorable and additional reloads
2433 for the corresponding pseudo will be generated in reload pass for
2434 each insn it occurs.
2436 This is a trick mentioned in one classic article of Chaitin etc
2437 which is frequently omitted in other implementations of RA based on
2440 update_bad_spill_attribute (void)
2444 ira_allocno_iterator ai
;
2445 ira_allocno_object_iterator aoi
;
2448 enum reg_class aclass
;
2449 bitmap_head dead_points
[N_REG_CLASSES
];
2451 for (i
= 0; i
< ira_allocno_classes_num
; i
++)
2453 aclass
= ira_allocno_classes
[i
];
2454 bitmap_initialize (&dead_points
[aclass
], ®_obstack
);
2456 FOR_EACH_ALLOCNO (a
, ai
)
2458 aclass
= ALLOCNO_CLASS (a
);
2459 if (aclass
== NO_REGS
)
2461 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, aoi
)
2462 for (r
= OBJECT_LIVE_RANGES (obj
); r
!= NULL
; r
= r
->next
)
2463 bitmap_set_bit (&dead_points
[aclass
], r
->finish
);
2465 FOR_EACH_ALLOCNO (a
, ai
)
2467 aclass
= ALLOCNO_CLASS (a
);
2468 if (aclass
== NO_REGS
)
2470 if (! ALLOCNO_BAD_SPILL_P (a
))
2472 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, aoi
)
2474 for (r
= OBJECT_LIVE_RANGES (obj
); r
!= NULL
; r
= r
->next
)
2476 for (i
= r
->start
+ 1; i
< r
->finish
; i
++)
2477 if (bitmap_bit_p (&dead_points
[aclass
], i
))
2484 ALLOCNO_BAD_SPILL_P (a
) = false;
2489 for (i
= 0; i
< ira_allocno_classes_num
; i
++)
2491 aclass
= ira_allocno_classes
[i
];
2492 bitmap_clear (&dead_points
[aclass
]);
2498 /* Set up minimal and maximal live range points for allocnos. */
2500 setup_min_max_allocno_live_range_point (void)
2503 ira_allocno_t a
, parent_a
, cap
;
2504 ira_allocno_iterator ai
;
2505 #ifdef ENABLE_IRA_CHECKING
2506 ira_object_iterator oi
;
2510 ira_loop_tree_node_t parent
;
2512 FOR_EACH_ALLOCNO (a
, ai
)
2514 int n
= ALLOCNO_NUM_OBJECTS (a
);
2516 for (i
= 0; i
< n
; i
++)
2518 ira_object_t obj
= ALLOCNO_OBJECT (a
, i
);
2519 r
= OBJECT_LIVE_RANGES (obj
);
2522 OBJECT_MAX (obj
) = r
->finish
;
2523 for (; r
->next
!= NULL
; r
= r
->next
)
2525 OBJECT_MIN (obj
) = r
->start
;
2528 for (i
= max_reg_num () - 1; i
>= FIRST_PSEUDO_REGISTER
; i
--)
2529 for (a
= ira_regno_allocno_map
[i
];
2531 a
= ALLOCNO_NEXT_REGNO_ALLOCNO (a
))
2534 int n
= ALLOCNO_NUM_OBJECTS (a
);
2536 for (j
= 0; j
< n
; j
++)
2538 ira_object_t obj
= ALLOCNO_OBJECT (a
, j
);
2539 ira_object_t parent_obj
;
2541 if (OBJECT_MAX (obj
) < 0)
2543 ira_assert (ALLOCNO_CAP_MEMBER (a
) == NULL
);
2544 /* Accumulation of range info. */
2545 if (ALLOCNO_CAP (a
) != NULL
)
2547 for (cap
= ALLOCNO_CAP (a
); cap
!= NULL
; cap
= ALLOCNO_CAP (cap
))
2549 ira_object_t cap_obj
= ALLOCNO_OBJECT (cap
, j
);
2550 if (OBJECT_MAX (cap_obj
) < OBJECT_MAX (obj
))
2551 OBJECT_MAX (cap_obj
) = OBJECT_MAX (obj
);
2552 if (OBJECT_MIN (cap_obj
) > OBJECT_MIN (obj
))
2553 OBJECT_MIN (cap_obj
) = OBJECT_MIN (obj
);
2557 if ((parent
= ALLOCNO_LOOP_TREE_NODE (a
)->parent
) == NULL
)
2559 parent_a
= parent
->regno_allocno_map
[i
];
2560 parent_obj
= ALLOCNO_OBJECT (parent_a
, j
);
2561 if (OBJECT_MAX (parent_obj
) < OBJECT_MAX (obj
))
2562 OBJECT_MAX (parent_obj
) = OBJECT_MAX (obj
);
2563 if (OBJECT_MIN (parent_obj
) > OBJECT_MIN (obj
))
2564 OBJECT_MIN (parent_obj
) = OBJECT_MIN (obj
);
2567 #ifdef ENABLE_IRA_CHECKING
2568 FOR_EACH_OBJECT (obj
, oi
)
2570 if ((0 <= OBJECT_MIN (obj
) && OBJECT_MIN (obj
) <= ira_max_point
)
2571 && (0 <= OBJECT_MAX (obj
) && OBJECT_MAX (obj
) <= ira_max_point
))
2578 /* Sort allocnos according to their live ranges. Allocnos with
2579 smaller allocno class are put first unless we use priority
2580 coloring. Allocnos with the same class are ordered according
2581 their start (min). Allocnos with the same start are ordered
2582 according their finish (max). */
2584 object_range_compare_func (const void *v1p
, const void *v2p
)
2587 ira_object_t obj1
= *(const ira_object_t
*) v1p
;
2588 ira_object_t obj2
= *(const ira_object_t
*) v2p
;
2589 ira_allocno_t a1
= OBJECT_ALLOCNO (obj1
);
2590 ira_allocno_t a2
= OBJECT_ALLOCNO (obj2
);
2592 if ((diff
= OBJECT_MIN (obj1
) - OBJECT_MIN (obj2
)) != 0)
2594 if ((diff
= OBJECT_MAX (obj1
) - OBJECT_MAX (obj2
)) != 0)
2596 return ALLOCNO_NUM (a1
) - ALLOCNO_NUM (a2
);
2599 /* Sort ira_object_id_map and set up conflict id of allocnos. */
2601 sort_conflict_id_map (void)
2605 ira_allocno_iterator ai
;
2608 FOR_EACH_ALLOCNO (a
, ai
)
2610 ira_allocno_object_iterator oi
;
2613 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, oi
)
2614 ira_object_id_map
[num
++] = obj
;
2616 qsort (ira_object_id_map
, num
, sizeof (ira_object_t
),
2617 object_range_compare_func
);
2618 for (i
= 0; i
< num
; i
++)
2620 ira_object_t obj
= ira_object_id_map
[i
];
2622 gcc_assert (obj
!= NULL
);
2623 OBJECT_CONFLICT_ID (obj
) = i
;
2625 for (i
= num
; i
< ira_objects_num
; i
++)
2626 ira_object_id_map
[i
] = NULL
;
2629 /* Set up minimal and maximal conflict ids of allocnos with which
2630 given allocno can conflict. */
2632 setup_min_max_conflict_allocno_ids (void)
2635 int i
, j
, min
, max
, start
, finish
, first_not_finished
, filled_area_start
;
2636 int *live_range_min
, *last_lived
;
2637 int word0_min
, word0_max
;
2639 ira_allocno_iterator ai
;
2641 live_range_min
= (int *) ira_allocate (sizeof (int) * ira_objects_num
);
2643 first_not_finished
= -1;
2644 for (i
= 0; i
< ira_objects_num
; i
++)
2646 ira_object_t obj
= ira_object_id_map
[i
];
2651 a
= OBJECT_ALLOCNO (obj
);
2655 aclass
= ALLOCNO_CLASS (a
);
2657 first_not_finished
= i
;
2661 start
= OBJECT_MIN (obj
);
2662 /* If we skip an allocno, the allocno with smaller ids will
2663 be also skipped because of the secondary sorting the
2664 range finishes (see function
2665 object_range_compare_func). */
2666 while (first_not_finished
< i
2667 && start
> OBJECT_MAX (ira_object_id_map
2668 [first_not_finished
]))
2669 first_not_finished
++;
2670 min
= first_not_finished
;
2673 /* We could increase min further in this case but it is good
2676 live_range_min
[i
] = OBJECT_MIN (obj
);
2677 OBJECT_MIN (obj
) = min
;
2679 last_lived
= (int *) ira_allocate (sizeof (int) * ira_max_point
);
2681 filled_area_start
= -1;
2682 for (i
= ira_objects_num
- 1; i
>= 0; i
--)
2684 ira_object_t obj
= ira_object_id_map
[i
];
2689 a
= OBJECT_ALLOCNO (obj
);
2692 aclass
= ALLOCNO_CLASS (a
);
2693 for (j
= 0; j
< ira_max_point
; j
++)
2695 filled_area_start
= ira_max_point
;
2697 min
= live_range_min
[i
];
2698 finish
= OBJECT_MAX (obj
);
2699 max
= last_lived
[finish
];
2701 /* We could decrease max further in this case but it is good
2703 max
= OBJECT_CONFLICT_ID (obj
) - 1;
2704 OBJECT_MAX (obj
) = max
;
2705 /* In filling, we can go further A range finish to recognize
2706 intersection quickly because if the finish of subsequently
2707 processed allocno (it has smaller conflict id) range is
2708 further A range finish than they are definitely intersected
2709 (the reason for this is the allocnos with bigger conflict id
2710 have their range starts not smaller than allocnos with
2712 for (j
= min
; j
< filled_area_start
; j
++)
2714 filled_area_start
= min
;
2716 ira_free (last_lived
);
2717 ira_free (live_range_min
);
2719 /* For allocnos with more than one object, we may later record extra conflicts in
2720 subobject 0 that we cannot really know about here.
2721 For now, simply widen the min/max range of these subobjects. */
2723 word0_min
= INT_MAX
;
2724 word0_max
= INT_MIN
;
2726 FOR_EACH_ALLOCNO (a
, ai
)
2728 int n
= ALLOCNO_NUM_OBJECTS (a
);
2733 obj0
= ALLOCNO_OBJECT (a
, 0);
2734 if (OBJECT_CONFLICT_ID (obj0
) < word0_min
)
2735 word0_min
= OBJECT_CONFLICT_ID (obj0
);
2736 if (OBJECT_CONFLICT_ID (obj0
) > word0_max
)
2737 word0_max
= OBJECT_CONFLICT_ID (obj0
);
2739 FOR_EACH_ALLOCNO (a
, ai
)
2741 int n
= ALLOCNO_NUM_OBJECTS (a
);
2746 obj0
= ALLOCNO_OBJECT (a
, 0);
2747 if (OBJECT_MIN (obj0
) > word0_min
)
2748 OBJECT_MIN (obj0
) = word0_min
;
2749 if (OBJECT_MAX (obj0
) < word0_max
)
2750 OBJECT_MAX (obj0
) = word0_max
;
2760 ira_allocno_iterator ai
;
2761 ira_loop_tree_node_t loop_tree_node
;
2763 FOR_EACH_ALLOCNO (a
, ai
)
2765 if (ALLOCNO_LOOP_TREE_NODE (a
) == ira_loop_tree_root
)
2767 if (ALLOCNO_CAP_MEMBER (a
) != NULL
)
2768 create_cap_allocno (a
);
2769 else if (ALLOCNO_CAP (a
) == NULL
)
2771 loop_tree_node
= ALLOCNO_LOOP_TREE_NODE (a
);
2772 if (!bitmap_bit_p (loop_tree_node
->border_allocnos
, ALLOCNO_NUM (a
)))
2773 create_cap_allocno (a
);
2780 /* The page contains code transforming more one region internal
2781 representation (IR) to one region IR which is necessary for reload.
2782 This transformation is called IR flattening. We might just rebuild
2783 the IR for one region but we don't do it because it takes a lot of
2786 /* Map: regno -> allocnos which will finally represent the regno for
2787 IR with one region. */
2788 static ira_allocno_t
*regno_top_level_allocno_map
;
2790 /* Find the allocno that corresponds to A at a level one higher up in the
2791 loop tree. Returns NULL if A is a cap, or if it has no parent. */
2793 ira_parent_allocno (ira_allocno_t a
)
2795 ira_loop_tree_node_t parent
;
2797 if (ALLOCNO_CAP (a
) != NULL
)
2800 parent
= ALLOCNO_LOOP_TREE_NODE (a
)->parent
;
2804 return parent
->regno_allocno_map
[ALLOCNO_REGNO (a
)];
2807 /* Find the allocno that corresponds to A at a level one higher up in the
2808 loop tree. If ALLOCNO_CAP is set for A, return that. */
2810 ira_parent_or_cap_allocno (ira_allocno_t a
)
2812 if (ALLOCNO_CAP (a
) != NULL
)
2813 return ALLOCNO_CAP (a
);
2815 return ira_parent_allocno (a
);
2818 /* Process all allocnos originated from pseudo REGNO and copy live
2819 ranges, hard reg conflicts, and allocno stack reg attributes from
2820 low level allocnos to final allocnos which are destinations of
2821 removed stores at a loop exit. Return true if we copied live
2824 copy_info_to_removed_store_destinations (int regno
)
2827 ira_allocno_t parent_a
= NULL
;
2828 ira_loop_tree_node_t parent
;
2832 for (a
= ira_regno_allocno_map
[regno
];
2834 a
= ALLOCNO_NEXT_REGNO_ALLOCNO (a
))
2836 if (a
!= regno_top_level_allocno_map
[REGNO (allocno_emit_reg (a
))])
2837 /* This allocno will be removed. */
2840 /* Caps will be removed. */
2841 ira_assert (ALLOCNO_CAP_MEMBER (a
) == NULL
);
2842 for (parent
= ALLOCNO_LOOP_TREE_NODE (a
)->parent
;
2844 parent
= parent
->parent
)
2845 if ((parent_a
= parent
->regno_allocno_map
[regno
]) == NULL
2847 == regno_top_level_allocno_map
[REGNO
2848 (allocno_emit_reg (parent_a
))]
2849 && ALLOCNO_EMIT_DATA (parent_a
)->mem_optimized_dest_p
))
2851 if (parent
== NULL
|| parent_a
== NULL
)
2854 copy_allocno_live_ranges (a
, parent_a
);
2855 merge_hard_reg_conflicts (a
, parent_a
, true);
2857 ALLOCNO_CALL_FREQ (parent_a
) += ALLOCNO_CALL_FREQ (a
);
2858 ALLOCNO_CALLS_CROSSED_NUM (parent_a
)
2859 += ALLOCNO_CALLS_CROSSED_NUM (a
);
2860 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (parent_a
)
2861 += ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a
);
2862 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a
)
2863 += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a
);
2869 /* Flatten the IR. In other words, this function transforms IR as if
2870 it were built with one region (without loops). We could make it
2871 much simpler by rebuilding IR with one region, but unfortunately it
2872 takes a lot of time. MAX_REGNO_BEFORE_EMIT and
2873 IRA_MAX_POINT_BEFORE_EMIT are correspondingly MAX_REG_NUM () and
2874 IRA_MAX_POINT before emitting insns on the loop borders. */
2876 ira_flattening (int max_regno_before_emit
, int ira_max_point_before_emit
)
2881 bool new_pseudos_p
, merged_p
, mem_dest_p
;
2883 enum reg_class aclass
;
2884 ira_allocno_t a
, parent_a
, first
, second
, node_first
, node_second
;
2886 ira_loop_tree_node_t node
;
2888 ira_allocno_iterator ai
;
2889 ira_copy_iterator ci
;
2891 regno_top_level_allocno_map
2892 = (ira_allocno_t
*) ira_allocate (max_reg_num ()
2893 * sizeof (ira_allocno_t
));
2894 memset (regno_top_level_allocno_map
, 0,
2895 max_reg_num () * sizeof (ira_allocno_t
));
2896 new_pseudos_p
= merged_p
= false;
2897 FOR_EACH_ALLOCNO (a
, ai
)
2899 ira_allocno_object_iterator oi
;
2902 if (ALLOCNO_CAP_MEMBER (a
) != NULL
)
2903 /* Caps are not in the regno allocno maps and they are never
2904 will be transformed into allocnos existing after IR
2907 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, oi
)
2908 COPY_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj
),
2909 OBJECT_CONFLICT_HARD_REGS (obj
));
2911 ALLOCNO_TOTAL_NO_STACK_REG_P (a
) = ALLOCNO_NO_STACK_REG_P (a
);
2914 /* Fix final allocno attributes. */
2915 for (i
= max_regno_before_emit
- 1; i
>= FIRST_PSEUDO_REGISTER
; i
--)
2918 for (a
= ira_regno_allocno_map
[i
];
2920 a
= ALLOCNO_NEXT_REGNO_ALLOCNO (a
))
2922 ira_emit_data_t parent_data
, data
= ALLOCNO_EMIT_DATA (a
);
2924 ira_assert (ALLOCNO_CAP_MEMBER (a
) == NULL
);
2925 if (data
->somewhere_renamed_p
)
2926 new_pseudos_p
= true;
2927 parent_a
= ira_parent_allocno (a
);
2928 if (parent_a
== NULL
)
2930 ALLOCNO_COPIES (a
) = NULL
;
2931 regno_top_level_allocno_map
[REGNO (data
->reg
)] = a
;
2934 ira_assert (ALLOCNO_CAP_MEMBER (parent_a
) == NULL
);
2936 if (data
->mem_optimized_dest
!= NULL
)
2938 parent_data
= ALLOCNO_EMIT_DATA (parent_a
);
2939 if (REGNO (data
->reg
) == REGNO (parent_data
->reg
))
2941 merge_hard_reg_conflicts (a
, parent_a
, true);
2942 move_allocno_live_ranges (a
, parent_a
);
2944 parent_data
->mem_optimized_dest_p
2945 = (parent_data
->mem_optimized_dest_p
2946 || data
->mem_optimized_dest_p
);
2949 new_pseudos_p
= true;
2952 ALLOCNO_NREFS (parent_a
) -= ALLOCNO_NREFS (a
);
2953 ALLOCNO_FREQ (parent_a
) -= ALLOCNO_FREQ (a
);
2954 ALLOCNO_CALL_FREQ (parent_a
) -= ALLOCNO_CALL_FREQ (a
);
2955 ALLOCNO_CALLS_CROSSED_NUM (parent_a
)
2956 -= ALLOCNO_CALLS_CROSSED_NUM (a
);
2957 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (parent_a
)
2958 -= ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a
);
2959 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a
)
2960 -= ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a
);
2961 ira_assert (ALLOCNO_CALLS_CROSSED_NUM (parent_a
) >= 0
2962 && ALLOCNO_NREFS (parent_a
) >= 0
2963 && ALLOCNO_FREQ (parent_a
) >= 0);
2964 aclass
= ALLOCNO_CLASS (parent_a
);
2965 hard_regs_num
= ira_class_hard_regs_num
[aclass
];
2966 if (ALLOCNO_HARD_REG_COSTS (a
) != NULL
2967 && ALLOCNO_HARD_REG_COSTS (parent_a
) != NULL
)
2968 for (j
= 0; j
< hard_regs_num
; j
++)
2969 ALLOCNO_HARD_REG_COSTS (parent_a
)[j
]
2970 -= ALLOCNO_HARD_REG_COSTS (a
)[j
];
2971 if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a
) != NULL
2972 && ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a
) != NULL
)
2973 for (j
= 0; j
< hard_regs_num
; j
++)
2974 ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a
)[j
]
2975 -= ALLOCNO_CONFLICT_HARD_REG_COSTS (a
)[j
];
2976 ALLOCNO_CLASS_COST (parent_a
)
2977 -= ALLOCNO_CLASS_COST (a
);
2978 ALLOCNO_MEMORY_COST (parent_a
) -= ALLOCNO_MEMORY_COST (a
);
2979 parent_a
= ira_parent_allocno (parent_a
);
2980 if (parent_a
== NULL
)
2983 ALLOCNO_COPIES (a
) = NULL
;
2984 regno_top_level_allocno_map
[REGNO (data
->reg
)] = a
;
2986 if (mem_dest_p
&& copy_info_to_removed_store_destinations (i
))
2989 ira_assert (new_pseudos_p
|| ira_max_point_before_emit
== ira_max_point
);
2990 if (merged_p
|| ira_max_point_before_emit
!= ira_max_point
)
2991 ira_rebuild_start_finish_chains ();
2994 sparseset objects_live
;
2996 /* Rebuild conflicts. */
2997 FOR_EACH_ALLOCNO (a
, ai
)
2999 ira_allocno_object_iterator oi
;
3002 if (a
!= regno_top_level_allocno_map
[REGNO (allocno_emit_reg (a
))]
3003 || ALLOCNO_CAP_MEMBER (a
) != NULL
)
3005 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, oi
)
3007 for (r
= OBJECT_LIVE_RANGES (obj
); r
!= NULL
; r
= r
->next
)
3008 ira_assert (r
->object
== obj
);
3009 clear_conflicts (obj
);
3012 objects_live
= sparseset_alloc (ira_objects_num
);
3013 for (i
= 0; i
< ira_max_point
; i
++)
3015 for (r
= ira_start_point_ranges
[i
]; r
!= NULL
; r
= r
->start_next
)
3017 ira_object_t obj
= r
->object
;
3019 a
= OBJECT_ALLOCNO (obj
);
3020 if (a
!= regno_top_level_allocno_map
[REGNO (allocno_emit_reg (a
))]
3021 || ALLOCNO_CAP_MEMBER (a
) != NULL
)
3024 aclass
= ALLOCNO_CLASS (a
);
3025 sparseset_set_bit (objects_live
, OBJECT_CONFLICT_ID (obj
));
3026 EXECUTE_IF_SET_IN_SPARSESET (objects_live
, n
)
3028 ira_object_t live_obj
= ira_object_id_map
[n
];
3029 ira_allocno_t live_a
= OBJECT_ALLOCNO (live_obj
);
3030 enum reg_class live_aclass
= ALLOCNO_CLASS (live_a
);
3032 if (ira_reg_classes_intersect_p
[aclass
][live_aclass
]
3033 /* Don't set up conflict for the allocno with itself. */
3035 ira_add_conflict (obj
, live_obj
);
3039 for (r
= ira_finish_point_ranges
[i
]; r
!= NULL
; r
= r
->finish_next
)
3040 sparseset_clear_bit (objects_live
, OBJECT_CONFLICT_ID (r
->object
));
3042 sparseset_free (objects_live
);
3043 compress_conflict_vecs ();
3045 /* Mark some copies for removing and change allocnos in the rest
3047 FOR_EACH_COPY (cp
, ci
)
3049 if (ALLOCNO_CAP_MEMBER (cp
->first
) != NULL
3050 || ALLOCNO_CAP_MEMBER (cp
->second
) != NULL
)
3052 if (internal_flag_ira_verbose
> 4 && ira_dump_file
!= NULL
)
3054 (ira_dump_file
, " Remove cp%d:%c%dr%d-%c%dr%d\n",
3055 cp
->num
, ALLOCNO_CAP_MEMBER (cp
->first
) != NULL
? 'c' : 'a',
3056 ALLOCNO_NUM (cp
->first
),
3057 REGNO (allocno_emit_reg (cp
->first
)),
3058 ALLOCNO_CAP_MEMBER (cp
->second
) != NULL
? 'c' : 'a',
3059 ALLOCNO_NUM (cp
->second
),
3060 REGNO (allocno_emit_reg (cp
->second
)));
3061 cp
->loop_tree_node
= NULL
;
3065 = regno_top_level_allocno_map
[REGNO (allocno_emit_reg (cp
->first
))];
3067 = regno_top_level_allocno_map
[REGNO (allocno_emit_reg (cp
->second
))];
3068 node
= cp
->loop_tree_node
;
3070 keep_p
= true; /* It copy generated in ira-emit.c. */
3073 /* Check that the copy was not propagated from level on
3074 which we will have different pseudos. */
3075 node_first
= node
->regno_allocno_map
[ALLOCNO_REGNO (cp
->first
)];
3076 node_second
= node
->regno_allocno_map
[ALLOCNO_REGNO (cp
->second
)];
3077 keep_p
= ((REGNO (allocno_emit_reg (first
))
3078 == REGNO (allocno_emit_reg (node_first
)))
3079 && (REGNO (allocno_emit_reg (second
))
3080 == REGNO (allocno_emit_reg (node_second
))));
3084 cp
->loop_tree_node
= ira_loop_tree_root
;
3086 cp
->second
= second
;
3090 cp
->loop_tree_node
= NULL
;
3091 if (internal_flag_ira_verbose
> 4 && ira_dump_file
!= NULL
)
3092 fprintf (ira_dump_file
, " Remove cp%d:a%dr%d-a%dr%d\n",
3093 cp
->num
, ALLOCNO_NUM (cp
->first
),
3094 REGNO (allocno_emit_reg (cp
->first
)),
3095 ALLOCNO_NUM (cp
->second
),
3096 REGNO (allocno_emit_reg (cp
->second
)));
3099 /* Remove unnecessary allocnos on lower levels of the loop tree. */
3100 FOR_EACH_ALLOCNO (a
, ai
)
3102 if (a
!= regno_top_level_allocno_map
[REGNO (allocno_emit_reg (a
))]
3103 || ALLOCNO_CAP_MEMBER (a
) != NULL
)
3105 if (internal_flag_ira_verbose
> 4 && ira_dump_file
!= NULL
)
3106 fprintf (ira_dump_file
, " Remove a%dr%d\n",
3107 ALLOCNO_NUM (a
), REGNO (allocno_emit_reg (a
)));
3111 ALLOCNO_LOOP_TREE_NODE (a
) = ira_loop_tree_root
;
3112 ALLOCNO_REGNO (a
) = REGNO (allocno_emit_reg (a
));
3113 ALLOCNO_CAP (a
) = NULL
;
3114 /* Restore updated costs for assignments from reload. */
3115 ALLOCNO_UPDATED_MEMORY_COST (a
) = ALLOCNO_MEMORY_COST (a
);
3116 ALLOCNO_UPDATED_CLASS_COST (a
) = ALLOCNO_CLASS_COST (a
);
3117 if (! ALLOCNO_ASSIGNED_P (a
))
3118 ira_free_allocno_updated_costs (a
);
3119 ira_assert (ALLOCNO_UPDATED_HARD_REG_COSTS (a
) == NULL
);
3120 ira_assert (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a
) == NULL
);
3122 /* Remove unnecessary copies. */
3123 FOR_EACH_COPY (cp
, ci
)
3125 if (cp
->loop_tree_node
== NULL
)
3127 ira_copies
[cp
->num
] = NULL
;
3132 (ALLOCNO_LOOP_TREE_NODE (cp
->first
) == ira_loop_tree_root
3133 && ALLOCNO_LOOP_TREE_NODE (cp
->second
) == ira_loop_tree_root
);
3134 ira_add_allocno_copy_to_list (cp
);
3135 ira_swap_allocno_copy_ends_if_necessary (cp
);
3137 rebuild_regno_allocno_maps ();
3138 if (ira_max_point
!= ira_max_point_before_emit
)
3139 ira_compress_allocno_live_ranges ();
3140 ira_free (regno_top_level_allocno_map
);
3145 #ifdef ENABLE_IRA_CHECKING
3146 /* Check creation of all allocnos. Allocnos on lower levels should
3147 have allocnos or caps on all upper levels. */
3149 check_allocno_creation (void)
3152 ira_allocno_iterator ai
;
3153 ira_loop_tree_node_t loop_tree_node
;
3155 FOR_EACH_ALLOCNO (a
, ai
)
3157 loop_tree_node
= ALLOCNO_LOOP_TREE_NODE (a
);
3158 ira_assert (bitmap_bit_p (loop_tree_node
->all_allocnos
,
3160 if (loop_tree_node
== ira_loop_tree_root
)
3162 if (ALLOCNO_CAP_MEMBER (a
) != NULL
)
3163 ira_assert (ALLOCNO_CAP (a
) != NULL
);
3164 else if (ALLOCNO_CAP (a
) == NULL
)
3165 ira_assert (loop_tree_node
->parent
3166 ->regno_allocno_map
[ALLOCNO_REGNO (a
)] != NULL
3167 && bitmap_bit_p (loop_tree_node
->border_allocnos
,
3173 /* Identify allocnos which prefer a register class with a single hard register.
3174 Adjust ALLOCNO_CONFLICT_HARD_REG_COSTS so that conflicting allocnos are
3175 less likely to use the preferred singleton register. */
3177 update_conflict_hard_reg_costs (void)
3180 ira_allocno_iterator ai
;
3183 FOR_EACH_ALLOCNO (a
, ai
)
3185 reg_class_t aclass
= ALLOCNO_CLASS (a
);
3186 reg_class_t pref
= reg_preferred_class (ALLOCNO_REGNO (a
));
3187 int singleton
= ira_class_singleton
[pref
][ALLOCNO_MODE (a
)];
3190 index
= ira_class_hard_reg_index
[(int) aclass
][singleton
];
3193 if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a
) == NULL
3194 || ALLOCNO_HARD_REG_COSTS (a
) == NULL
)
3197 for (i
= ira_class_hard_regs_num
[(int) aclass
] - 1; i
>= 0; i
--)
3198 if (ALLOCNO_HARD_REG_COSTS (a
)[i
] > ALLOCNO_CLASS_COST (a
)
3199 && min
> ALLOCNO_HARD_REG_COSTS (a
)[i
])
3200 min
= ALLOCNO_HARD_REG_COSTS (a
)[i
];
3203 ira_allocate_and_set_costs (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a
),
3205 ALLOCNO_CONFLICT_HARD_REG_COSTS (a
)[index
]
3206 -= min
- ALLOCNO_CLASS_COST (a
);
3210 /* Create a internal representation (IR) for IRA (allocnos, copies,
3211 loop tree nodes). The function returns TRUE if we generate loop
3212 structure (besides nodes representing all function and the basic
3213 blocks) for regional allocation. A true return means that we
3214 really need to flatten IR before the reload. */
3221 initiate_cost_vectors ();
3222 initiate_allocnos ();
3224 create_loop_tree_nodes ();
3228 create_allocno_objects ();
3229 ira_create_allocno_live_ranges ();
3230 remove_unnecessary_regions (false);
3231 ira_compress_allocno_live_ranges ();
3232 update_bad_spill_attribute ();
3233 loops_p
= more_one_region_p ();
3236 propagate_allocno_info ();
3239 ira_tune_allocno_costs ();
3240 #ifdef ENABLE_IRA_CHECKING
3241 check_allocno_creation ();
3243 setup_min_max_allocno_live_range_point ();
3244 sort_conflict_id_map ();
3245 setup_min_max_conflict_allocno_ids ();
3246 ira_build_conflicts ();
3247 update_conflict_hard_reg_costs ();
3248 if (! ira_conflicts_p
)
3251 ira_allocno_iterator ai
;
3253 /* Remove all regions but root one. */
3256 remove_unnecessary_regions (true);
3259 /* We don't save hard registers around calls for fast allocation
3260 -- add caller clobbered registers as conflicting ones to
3261 allocno crossing calls. */
3262 FOR_EACH_ALLOCNO (a
, ai
)
3263 if (ALLOCNO_CALLS_CROSSED_NUM (a
) != 0)
3264 ior_hard_reg_conflicts (a
, &call_used_reg_set
);
3266 if (internal_flag_ira_verbose
> 2 && ira_dump_file
!= NULL
)
3267 print_copies (ira_dump_file
);
3268 if (internal_flag_ira_verbose
> 0 && ira_dump_file
!= NULL
)
3273 ira_allocno_iterator ai
;
3278 FOR_EACH_ALLOCNO (a
, ai
)
3280 int j
, nobj
= ALLOCNO_NUM_OBJECTS (a
);
3284 for (j
= 0; j
< nobj
; j
++)
3286 ira_object_t obj
= ALLOCNO_OBJECT (a
, j
);
3287 n
+= OBJECT_NUM_CONFLICTS (obj
);
3288 for (r
= OBJECT_LIVE_RANGES (obj
); r
!= NULL
; r
= r
->next
)
3292 fprintf (ira_dump_file
, " regions=%d, blocks=%d, points=%d\n",
3293 current_loops
== NULL
? 1 : number_of_loops (),
3294 n_basic_blocks
, ira_max_point
);
3295 fprintf (ira_dump_file
,
3296 " allocnos=%d (big %d), copies=%d, conflicts=%d, ranges=%d\n",
3297 ira_allocnos_num
, nr_big
, ira_copies_num
, n
, nr
);
3302 /* Release the data created by function ira_build. */
3306 finish_loop_tree_nodes ();
3309 finish_cost_vectors ();
3310 ira_finish_allocno_live_ranges ();