1 /* Building internal representation for IRA.
2 Copyright (C) 2006-2021 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"
29 #include "insn-config.h"
34 #include "sparseset.h"
37 static ira_copy_t
find_allocno_copy (ira_allocno_t
, ira_allocno_t
, rtx_insn
*,
38 ira_loop_tree_node_t
);
40 /* The root of the loop tree corresponding to the all function. */
41 ira_loop_tree_node_t ira_loop_tree_root
;
43 /* Height of the loop tree. */
44 int ira_loop_tree_height
;
46 /* All nodes representing basic blocks are referred through the
47 following array. We cannot use basic block member `aux' for this
48 because it is used for insertion of insns on edges. */
49 ira_loop_tree_node_t ira_bb_nodes
;
51 /* All nodes representing loops are referred through the following
53 ira_loop_tree_node_t ira_loop_nodes
;
55 /* And size of the ira_loop_nodes array. */
56 unsigned int ira_loop_nodes_count
;
58 /* Map regno -> allocnos with given regno (see comments for
59 allocno member `next_regno_allocno'). */
60 ira_allocno_t
*ira_regno_allocno_map
;
62 /* Array of references to all allocnos. The order number of the
63 allocno corresponds to the index in the array. Removed allocnos
64 have NULL element value. */
65 ira_allocno_t
*ira_allocnos
;
67 /* Sizes of the previous array. */
70 /* Count of conflict record structures we've created, used when creating
74 /* Map a conflict id to its conflict record. */
75 ira_object_t
*ira_object_id_map
;
77 /* Array of references to all allocno preferences. The order number
78 of the preference corresponds to the index in the array. */
79 ira_pref_t
*ira_prefs
;
81 /* Size of the previous array. */
84 /* Array of references to all copies. The order number of the copy
85 corresponds to the index in the array. Removed copies have NULL
87 ira_copy_t
*ira_copies
;
89 /* Size of the previous array. */
94 /* LAST_BASIC_BLOCK before generating additional insns because of live
95 range splitting. Emitting insns on a critical edge creates a new
97 static int last_basic_block_before_change
;
99 /* Initialize some members in loop tree node NODE. Use LOOP_NUM for
100 the member loop_num. */
102 init_loop_tree_node (struct ira_loop_tree_node
*node
, int loop_num
)
104 int max_regno
= max_reg_num ();
106 node
->regno_allocno_map
107 = (ira_allocno_t
*) ira_allocate (sizeof (ira_allocno_t
) * max_regno
);
108 memset (node
->regno_allocno_map
, 0, sizeof (ira_allocno_t
) * max_regno
);
109 memset (node
->reg_pressure
, 0, sizeof (node
->reg_pressure
));
110 node
->all_allocnos
= ira_allocate_bitmap ();
111 node
->modified_regnos
= ira_allocate_bitmap ();
112 node
->border_allocnos
= ira_allocate_bitmap ();
113 node
->local_copies
= ira_allocate_bitmap ();
114 node
->loop_num
= loop_num
;
115 node
->children
= NULL
;
116 node
->subloops
= NULL
;
120 /* The following function allocates the loop tree nodes. If
121 CURRENT_LOOPS is NULL, the nodes corresponding to the loops (except
122 the root which corresponds the all function) will be not allocated
123 but nodes will still be allocated for basic blocks. */
125 create_loop_tree_nodes (void)
134 = ((struct ira_loop_tree_node
*)
135 ira_allocate (sizeof (struct ira_loop_tree_node
)
136 * last_basic_block_for_fn (cfun
)));
137 last_basic_block_before_change
= last_basic_block_for_fn (cfun
);
138 for (i
= 0; i
< (unsigned int) last_basic_block_for_fn (cfun
); i
++)
140 ira_bb_nodes
[i
].regno_allocno_map
= NULL
;
141 memset (ira_bb_nodes
[i
].reg_pressure
, 0,
142 sizeof (ira_bb_nodes
[i
].reg_pressure
));
143 ira_bb_nodes
[i
].all_allocnos
= NULL
;
144 ira_bb_nodes
[i
].modified_regnos
= NULL
;
145 ira_bb_nodes
[i
].border_allocnos
= NULL
;
146 ira_bb_nodes
[i
].local_copies
= NULL
;
148 if (current_loops
== NULL
)
150 ira_loop_nodes_count
= 1;
151 ira_loop_nodes
= ((struct ira_loop_tree_node
*)
152 ira_allocate (sizeof (struct ira_loop_tree_node
)));
153 init_loop_tree_node (ira_loop_nodes
, 0);
156 ira_loop_nodes_count
= number_of_loops (cfun
);
157 ira_loop_nodes
= ((struct ira_loop_tree_node
*)
158 ira_allocate (sizeof (struct ira_loop_tree_node
)
159 * ira_loop_nodes_count
));
160 FOR_EACH_VEC_SAFE_ELT (get_loops (cfun
), i
, loop
)
162 if (loop_outer (loop
) != NULL
)
164 ira_loop_nodes
[i
].regno_allocno_map
= NULL
;
166 FOR_EACH_EDGE (e
, ei
, loop
->header
->preds
)
167 if (e
->src
!= loop
->latch
168 && (e
->flags
& EDGE_ABNORMAL
) && EDGE_CRITICAL_P (e
))
175 auto_vec
<edge
> edges
= get_loop_exit_edges (loop
);
176 FOR_EACH_VEC_ELT (edges
, j
, e
)
177 if ((e
->flags
& EDGE_ABNORMAL
) && EDGE_CRITICAL_P (e
))
185 init_loop_tree_node (&ira_loop_nodes
[i
], loop
->num
);
189 /* The function returns TRUE if there are more one allocation
192 more_one_region_p (void)
197 if (current_loops
!= NULL
)
198 FOR_EACH_VEC_SAFE_ELT (get_loops (cfun
), i
, loop
)
199 if (ira_loop_nodes
[i
].regno_allocno_map
!= NULL
200 && ira_loop_tree_root
!= &ira_loop_nodes
[i
])
205 /* Free the loop tree node of a loop. */
207 finish_loop_tree_node (ira_loop_tree_node_t loop
)
209 if (loop
->regno_allocno_map
!= NULL
)
211 ira_assert (loop
->bb
== NULL
);
212 ira_free_bitmap (loop
->local_copies
);
213 ira_free_bitmap (loop
->border_allocnos
);
214 ira_free_bitmap (loop
->modified_regnos
);
215 ira_free_bitmap (loop
->all_allocnos
);
216 ira_free (loop
->regno_allocno_map
);
217 loop
->regno_allocno_map
= NULL
;
221 /* Free the loop tree nodes. */
223 finish_loop_tree_nodes (void)
227 for (i
= 0; i
< ira_loop_nodes_count
; i
++)
228 finish_loop_tree_node (&ira_loop_nodes
[i
]);
229 ira_free (ira_loop_nodes
);
230 for (i
= 0; i
< (unsigned int) last_basic_block_before_change
; i
++)
232 if (ira_bb_nodes
[i
].local_copies
!= NULL
)
233 ira_free_bitmap (ira_bb_nodes
[i
].local_copies
);
234 if (ira_bb_nodes
[i
].border_allocnos
!= NULL
)
235 ira_free_bitmap (ira_bb_nodes
[i
].border_allocnos
);
236 if (ira_bb_nodes
[i
].modified_regnos
!= NULL
)
237 ira_free_bitmap (ira_bb_nodes
[i
].modified_regnos
);
238 if (ira_bb_nodes
[i
].all_allocnos
!= NULL
)
239 ira_free_bitmap (ira_bb_nodes
[i
].all_allocnos
);
240 if (ira_bb_nodes
[i
].regno_allocno_map
!= NULL
)
241 ira_free (ira_bb_nodes
[i
].regno_allocno_map
);
243 ira_free (ira_bb_nodes
);
248 /* The following recursive function adds LOOP to the loop tree
249 hierarchy. LOOP is added only once. If LOOP is NULL we adding
250 loop designating the whole function when CFG loops are not
253 add_loop_to_tree (class loop
*loop
)
257 ira_loop_tree_node_t loop_node
, parent_node
;
259 /* We cannot use loop node access macros here because of potential
260 checking and because the nodes are not initialized enough
262 if (loop
!= NULL
&& loop_outer (loop
) != NULL
)
263 add_loop_to_tree (loop_outer (loop
));
264 loop_num
= loop
!= NULL
? loop
->num
: 0;
265 if (ira_loop_nodes
[loop_num
].regno_allocno_map
!= NULL
266 && ira_loop_nodes
[loop_num
].children
== NULL
)
268 /* We have not added loop node to the tree yet. */
269 loop_node
= &ira_loop_nodes
[loop_num
];
270 loop_node
->loop
= loop
;
271 loop_node
->bb
= NULL
;
276 for (parent
= loop_outer (loop
);
278 parent
= loop_outer (parent
))
279 if (ira_loop_nodes
[parent
->num
].regno_allocno_map
!= NULL
)
284 loop_node
->next
= NULL
;
285 loop_node
->subloop_next
= NULL
;
286 loop_node
->parent
= NULL
;
290 parent_node
= &ira_loop_nodes
[parent
->num
];
291 loop_node
->next
= parent_node
->children
;
292 parent_node
->children
= loop_node
;
293 loop_node
->subloop_next
= parent_node
->subloops
;
294 parent_node
->subloops
= loop_node
;
295 loop_node
->parent
= parent_node
;
300 /* The following recursive function sets up levels of nodes of the
301 tree given its root LOOP_NODE. The enumeration starts with LEVEL.
302 The function returns maximal value of level in the tree + 1. */
304 setup_loop_tree_level (ira_loop_tree_node_t loop_node
, int level
)
306 int height
, max_height
;
307 ira_loop_tree_node_t subloop_node
;
309 ira_assert (loop_node
->bb
== NULL
);
310 loop_node
->level
= level
;
311 max_height
= level
+ 1;
312 for (subloop_node
= loop_node
->subloops
;
313 subloop_node
!= NULL
;
314 subloop_node
= subloop_node
->subloop_next
)
316 ira_assert (subloop_node
->bb
== NULL
);
317 height
= setup_loop_tree_level (subloop_node
, level
+ 1);
318 if (height
> max_height
)
324 /* Create the loop tree. The algorithm is designed to provide correct
325 order of loops (they are ordered by their last loop BB) and basic
326 blocks in the chain formed by member next. */
328 form_loop_tree (void)
332 ira_loop_tree_node_t bb_node
, loop_node
;
334 /* We cannot use loop/bb node access macros because of potential
335 checking and because the nodes are not initialized enough
337 FOR_EACH_BB_FN (bb
, cfun
)
339 bb_node
= &ira_bb_nodes
[bb
->index
];
341 bb_node
->loop
= NULL
;
342 bb_node
->subloops
= NULL
;
343 bb_node
->children
= NULL
;
344 bb_node
->subloop_next
= NULL
;
345 bb_node
->next
= NULL
;
346 if (current_loops
== NULL
)
350 for (parent
= bb
->loop_father
;
352 parent
= loop_outer (parent
))
353 if (ira_loop_nodes
[parent
->num
].regno_allocno_map
!= NULL
)
356 add_loop_to_tree (parent
);
357 loop_node
= &ira_loop_nodes
[parent
== NULL
? 0 : parent
->num
];
358 bb_node
->next
= loop_node
->children
;
359 bb_node
->parent
= loop_node
;
360 loop_node
->children
= bb_node
;
362 ira_loop_tree_root
= IRA_LOOP_NODE_BY_INDEX (0);
363 ira_loop_tree_height
= setup_loop_tree_level (ira_loop_tree_root
, 0);
364 ira_assert (ira_loop_tree_root
->regno_allocno_map
!= NULL
);
369 /* Rebuild IRA_REGNO_ALLOCNO_MAP and REGNO_ALLOCNO_MAPs of the loop
372 rebuild_regno_allocno_maps (void)
375 int max_regno
, regno
;
377 ira_loop_tree_node_t loop_tree_node
;
379 ira_allocno_iterator ai
;
381 ira_assert (current_loops
!= NULL
);
382 max_regno
= max_reg_num ();
383 FOR_EACH_VEC_SAFE_ELT (get_loops (cfun
), l
, loop
)
384 if (ira_loop_nodes
[l
].regno_allocno_map
!= NULL
)
386 ira_free (ira_loop_nodes
[l
].regno_allocno_map
);
387 ira_loop_nodes
[l
].regno_allocno_map
388 = (ira_allocno_t
*) ira_allocate (sizeof (ira_allocno_t
)
390 memset (ira_loop_nodes
[l
].regno_allocno_map
, 0,
391 sizeof (ira_allocno_t
) * max_regno
);
393 ira_free (ira_regno_allocno_map
);
394 ira_regno_allocno_map
395 = (ira_allocno_t
*) ira_allocate (max_regno
* sizeof (ira_allocno_t
));
396 memset (ira_regno_allocno_map
, 0, max_regno
* sizeof (ira_allocno_t
));
397 FOR_EACH_ALLOCNO (a
, ai
)
399 if (ALLOCNO_CAP_MEMBER (a
) != NULL
)
400 /* Caps are not in the regno allocno maps. */
402 regno
= ALLOCNO_REGNO (a
);
403 loop_tree_node
= ALLOCNO_LOOP_TREE_NODE (a
);
404 ALLOCNO_NEXT_REGNO_ALLOCNO (a
) = ira_regno_allocno_map
[regno
];
405 ira_regno_allocno_map
[regno
] = a
;
406 if (loop_tree_node
->regno_allocno_map
[regno
] == NULL
)
407 /* Remember that we can create temporary allocnos to break
408 cycles in register shuffle. */
409 loop_tree_node
->regno_allocno_map
[regno
] = a
;
414 /* Pools for allocnos, allocno live ranges and objects. */
415 static object_allocator
<live_range
> live_range_pool ("live ranges");
416 static object_allocator
<ira_allocno
> allocno_pool ("allocnos");
417 static object_allocator
<ira_object
> object_pool ("objects");
419 /* Vec containing references to all created allocnos. It is a
420 container of array allocnos. */
421 static vec
<ira_allocno_t
> allocno_vec
;
423 /* Vec containing references to all created ira_objects. It is a
424 container of ira_object_id_map. */
425 static vec
<ira_object_t
> ira_object_id_map_vec
;
427 /* Initialize data concerning allocnos. */
429 initiate_allocnos (void)
431 allocno_vec
.create (max_reg_num () * 2);
433 ira_allocnos_num
= 0;
435 ira_object_id_map_vec
.create (max_reg_num () * 2);
436 ira_object_id_map
= NULL
;
437 ira_regno_allocno_map
438 = (ira_allocno_t
*) ira_allocate (max_reg_num ()
439 * sizeof (ira_allocno_t
));
440 memset (ira_regno_allocno_map
, 0, max_reg_num () * sizeof (ira_allocno_t
));
443 /* Create and return an object corresponding to a new allocno A. */
445 ira_create_object (ira_allocno_t a
, int subword
)
447 enum reg_class aclass
= ALLOCNO_CLASS (a
);
448 ira_object_t obj
= object_pool
.allocate ();
450 OBJECT_ALLOCNO (obj
) = a
;
451 OBJECT_SUBWORD (obj
) = subword
;
452 OBJECT_CONFLICT_ID (obj
) = ira_objects_num
;
453 OBJECT_CONFLICT_VEC_P (obj
) = false;
454 OBJECT_CONFLICT_ARRAY (obj
) = NULL
;
455 OBJECT_NUM_CONFLICTS (obj
) = 0;
456 OBJECT_CONFLICT_HARD_REGS (obj
) = ira_no_alloc_regs
;
457 OBJECT_TOTAL_CONFLICT_HARD_REGS (obj
) = ira_no_alloc_regs
;
458 OBJECT_CONFLICT_HARD_REGS (obj
) |= ~reg_class_contents
[aclass
];
459 OBJECT_TOTAL_CONFLICT_HARD_REGS (obj
) |= ~reg_class_contents
[aclass
];
460 OBJECT_MIN (obj
) = INT_MAX
;
461 OBJECT_MAX (obj
) = -1;
462 OBJECT_LIVE_RANGES (obj
) = NULL
;
464 ira_object_id_map_vec
.safe_push (obj
);
466 = ira_object_id_map_vec
.address ();
467 ira_objects_num
= ira_object_id_map_vec
.length ();
472 /* Create and return the allocno corresponding to REGNO in
473 LOOP_TREE_NODE. Add the allocno to the list of allocnos with the
474 same regno if CAP_P is FALSE. */
476 ira_create_allocno (int regno
, bool cap_p
,
477 ira_loop_tree_node_t loop_tree_node
)
481 a
= allocno_pool
.allocate ();
482 ALLOCNO_REGNO (a
) = regno
;
483 ALLOCNO_LOOP_TREE_NODE (a
) = loop_tree_node
;
486 ALLOCNO_NEXT_REGNO_ALLOCNO (a
) = ira_regno_allocno_map
[regno
];
487 ira_regno_allocno_map
[regno
] = a
;
488 if (loop_tree_node
->regno_allocno_map
[regno
] == NULL
)
489 /* Remember that we can create temporary allocnos to break
490 cycles in register shuffle on region borders (see
492 loop_tree_node
->regno_allocno_map
[regno
] = a
;
494 ALLOCNO_CAP (a
) = NULL
;
495 ALLOCNO_CAP_MEMBER (a
) = NULL
;
496 ALLOCNO_NUM (a
) = ira_allocnos_num
;
497 bitmap_set_bit (loop_tree_node
->all_allocnos
, ALLOCNO_NUM (a
));
498 ALLOCNO_NREFS (a
) = 0;
499 ALLOCNO_FREQ (a
) = 0;
500 ALLOCNO_HARD_REGNO (a
) = -1;
501 ALLOCNO_CALL_FREQ (a
) = 0;
502 ALLOCNO_CALLS_CROSSED_NUM (a
) = 0;
503 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a
) = 0;
504 ALLOCNO_CROSSED_CALLS_ABIS (a
) = 0;
505 CLEAR_HARD_REG_SET (ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a
));
507 ALLOCNO_NO_STACK_REG_P (a
) = false;
508 ALLOCNO_TOTAL_NO_STACK_REG_P (a
) = false;
510 ALLOCNO_DONT_REASSIGN_P (a
) = false;
511 ALLOCNO_BAD_SPILL_P (a
) = false;
512 ALLOCNO_ASSIGNED_P (a
) = false;
513 ALLOCNO_MODE (a
) = (regno
< 0 ? VOIDmode
: PSEUDO_REGNO_MODE (regno
));
514 ALLOCNO_WMODE (a
) = ALLOCNO_MODE (a
);
515 ALLOCNO_PREFS (a
) = NULL
;
516 ALLOCNO_COPIES (a
) = NULL
;
517 ALLOCNO_HARD_REG_COSTS (a
) = NULL
;
518 ALLOCNO_CONFLICT_HARD_REG_COSTS (a
) = NULL
;
519 ALLOCNO_UPDATED_HARD_REG_COSTS (a
) = NULL
;
520 ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a
) = NULL
;
521 ALLOCNO_CLASS (a
) = NO_REGS
;
522 ALLOCNO_UPDATED_CLASS_COST (a
) = 0;
523 ALLOCNO_CLASS_COST (a
) = 0;
524 ALLOCNO_MEMORY_COST (a
) = 0;
525 ALLOCNO_UPDATED_MEMORY_COST (a
) = 0;
526 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a
) = 0;
527 ALLOCNO_NUM_OBJECTS (a
) = 0;
529 ALLOCNO_ADD_DATA (a
) = NULL
;
530 allocno_vec
.safe_push (a
);
531 ira_allocnos
= allocno_vec
.address ();
532 ira_allocnos_num
= allocno_vec
.length ();
537 /* Set up register class for A and update its conflict hard
540 ira_set_allocno_class (ira_allocno_t a
, enum reg_class aclass
)
542 ira_allocno_object_iterator oi
;
545 ALLOCNO_CLASS (a
) = aclass
;
546 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, oi
)
548 OBJECT_CONFLICT_HARD_REGS (obj
) |= ~reg_class_contents
[aclass
];
549 OBJECT_TOTAL_CONFLICT_HARD_REGS (obj
) |= ~reg_class_contents
[aclass
];
553 /* Determine the number of objects we should associate with allocno A
554 and allocate them. */
556 ira_create_allocno_objects (ira_allocno_t a
)
558 machine_mode mode
= ALLOCNO_MODE (a
);
559 enum reg_class aclass
= ALLOCNO_CLASS (a
);
560 int n
= ira_reg_class_max_nregs
[aclass
][mode
];
563 if (n
!= 2 || maybe_ne (GET_MODE_SIZE (mode
), n
* UNITS_PER_WORD
))
566 ALLOCNO_NUM_OBJECTS (a
) = n
;
567 for (i
= 0; i
< n
; i
++)
568 ALLOCNO_OBJECT (a
, i
) = ira_create_object (a
, i
);
571 /* For each allocno, set ALLOCNO_NUM_OBJECTS and create the
572 ALLOCNO_OBJECT structures. This must be called after the allocno
573 classes are known. */
575 create_allocno_objects (void)
578 ira_allocno_iterator ai
;
580 FOR_EACH_ALLOCNO (a
, ai
)
581 ira_create_allocno_objects (a
);
584 /* Merge hard register conflict information for all objects associated with
585 allocno TO into the corresponding objects associated with FROM.
586 If TOTAL_ONLY is true, we only merge OBJECT_TOTAL_CONFLICT_HARD_REGS. */
588 merge_hard_reg_conflicts (ira_allocno_t from
, ira_allocno_t to
,
592 gcc_assert (ALLOCNO_NUM_OBJECTS (to
) == ALLOCNO_NUM_OBJECTS (from
));
593 for (i
= 0; i
< ALLOCNO_NUM_OBJECTS (to
); i
++)
595 ira_object_t from_obj
= ALLOCNO_OBJECT (from
, i
);
596 ira_object_t to_obj
= ALLOCNO_OBJECT (to
, i
);
599 OBJECT_CONFLICT_HARD_REGS (to_obj
)
600 |= OBJECT_CONFLICT_HARD_REGS (from_obj
);
601 OBJECT_TOTAL_CONFLICT_HARD_REGS (to_obj
)
602 |= OBJECT_TOTAL_CONFLICT_HARD_REGS (from_obj
);
605 if (!total_only
&& ALLOCNO_NO_STACK_REG_P (from
))
606 ALLOCNO_NO_STACK_REG_P (to
) = true;
607 if (ALLOCNO_TOTAL_NO_STACK_REG_P (from
))
608 ALLOCNO_TOTAL_NO_STACK_REG_P (to
) = true;
612 /* Update hard register conflict information for all objects associated with
613 A to include the regs in SET. */
615 ior_hard_reg_conflicts (ira_allocno_t a
, const_hard_reg_set set
)
617 ira_allocno_object_iterator i
;
620 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, i
)
622 OBJECT_CONFLICT_HARD_REGS (obj
) |= set
;
623 OBJECT_TOTAL_CONFLICT_HARD_REGS (obj
) |= set
;
627 /* Return TRUE if a conflict vector with NUM elements is more
628 profitable than a conflict bit vector for OBJ. */
630 ira_conflict_vector_profitable_p (ira_object_t obj
, int num
)
633 int max
= OBJECT_MAX (obj
);
634 int min
= OBJECT_MIN (obj
);
637 /* We prefer a bit vector in such case because it does not result
641 nw
= (max
- min
+ IRA_INT_BITS
) / IRA_INT_BITS
;
642 return (2 * sizeof (ira_object_t
) * (num
+ 1)
643 < 3 * nw
* sizeof (IRA_INT_TYPE
));
646 /* Allocates and initialize the conflict vector of OBJ for NUM
647 conflicting objects. */
649 ira_allocate_conflict_vec (ira_object_t obj
, int num
)
654 ira_assert (OBJECT_CONFLICT_ARRAY (obj
) == NULL
);
655 num
++; /* for NULL end marker */
656 size
= sizeof (ira_object_t
) * num
;
657 OBJECT_CONFLICT_ARRAY (obj
) = ira_allocate (size
);
658 vec
= (ira_object_t
*) OBJECT_CONFLICT_ARRAY (obj
);
660 OBJECT_NUM_CONFLICTS (obj
) = 0;
661 OBJECT_CONFLICT_ARRAY_SIZE (obj
) = size
;
662 OBJECT_CONFLICT_VEC_P (obj
) = true;
665 /* Allocate and initialize the conflict bit vector of OBJ. */
667 allocate_conflict_bit_vec (ira_object_t obj
)
671 ira_assert (OBJECT_CONFLICT_ARRAY (obj
) == NULL
);
672 size
= ((OBJECT_MAX (obj
) - OBJECT_MIN (obj
) + IRA_INT_BITS
)
673 / IRA_INT_BITS
* sizeof (IRA_INT_TYPE
));
674 OBJECT_CONFLICT_ARRAY (obj
) = ira_allocate (size
);
675 memset (OBJECT_CONFLICT_ARRAY (obj
), 0, size
);
676 OBJECT_CONFLICT_ARRAY_SIZE (obj
) = size
;
677 OBJECT_CONFLICT_VEC_P (obj
) = false;
680 /* Allocate and initialize the conflict vector or conflict bit vector
681 of OBJ for NUM conflicting allocnos whatever is more profitable. */
683 ira_allocate_object_conflicts (ira_object_t obj
, int num
)
685 if (ira_conflict_vector_profitable_p (obj
, num
))
686 ira_allocate_conflict_vec (obj
, num
);
688 allocate_conflict_bit_vec (obj
);
691 /* Add OBJ2 to the conflicts of OBJ1. */
693 add_to_conflicts (ira_object_t obj1
, ira_object_t obj2
)
698 if (OBJECT_CONFLICT_VEC_P (obj1
))
700 ira_object_t
*vec
= OBJECT_CONFLICT_VEC (obj1
);
701 int curr_num
= OBJECT_NUM_CONFLICTS (obj1
);
703 if (OBJECT_CONFLICT_ARRAY_SIZE (obj1
) < num
* sizeof (ira_object_t
))
705 ira_object_t
*newvec
;
706 size
= (3 * num
/ 2 + 1) * sizeof (ira_allocno_t
);
707 newvec
= (ira_object_t
*) ira_allocate (size
);
708 memcpy (newvec
, vec
, curr_num
* sizeof (ira_object_t
));
711 OBJECT_CONFLICT_ARRAY (obj1
) = vec
;
712 OBJECT_CONFLICT_ARRAY_SIZE (obj1
) = size
;
716 OBJECT_NUM_CONFLICTS (obj1
)++;
720 int nw
, added_head_nw
, id
;
721 IRA_INT_TYPE
*vec
= OBJECT_CONFLICT_BITVEC (obj1
);
723 id
= OBJECT_CONFLICT_ID (obj2
);
724 if (OBJECT_MIN (obj1
) > id
)
726 /* Expand head of the bit vector. */
727 added_head_nw
= (OBJECT_MIN (obj1
) - id
- 1) / IRA_INT_BITS
+ 1;
728 nw
= (OBJECT_MAX (obj1
) - OBJECT_MIN (obj1
)) / IRA_INT_BITS
+ 1;
729 size
= (nw
+ added_head_nw
) * sizeof (IRA_INT_TYPE
);
730 if (OBJECT_CONFLICT_ARRAY_SIZE (obj1
) >= size
)
732 memmove ((char *) vec
+ added_head_nw
* sizeof (IRA_INT_TYPE
),
733 vec
, nw
* sizeof (IRA_INT_TYPE
));
734 memset (vec
, 0, added_head_nw
* sizeof (IRA_INT_TYPE
));
739 = (3 * (nw
+ added_head_nw
) / 2 + 1) * sizeof (IRA_INT_TYPE
);
740 vec
= (IRA_INT_TYPE
*) ira_allocate (size
);
741 memcpy ((char *) vec
+ added_head_nw
* sizeof (IRA_INT_TYPE
),
742 OBJECT_CONFLICT_ARRAY (obj1
), nw
* sizeof (IRA_INT_TYPE
));
743 memset (vec
, 0, added_head_nw
* sizeof (IRA_INT_TYPE
));
745 + (nw
+ added_head_nw
) * sizeof (IRA_INT_TYPE
),
746 0, size
- (nw
+ added_head_nw
) * sizeof (IRA_INT_TYPE
));
747 ira_free (OBJECT_CONFLICT_ARRAY (obj1
));
748 OBJECT_CONFLICT_ARRAY (obj1
) = vec
;
749 OBJECT_CONFLICT_ARRAY_SIZE (obj1
) = size
;
751 OBJECT_MIN (obj1
) -= added_head_nw
* IRA_INT_BITS
;
753 else if (OBJECT_MAX (obj1
) < id
)
755 nw
= (id
- OBJECT_MIN (obj1
)) / IRA_INT_BITS
+ 1;
756 size
= nw
* sizeof (IRA_INT_TYPE
);
757 if (OBJECT_CONFLICT_ARRAY_SIZE (obj1
) < size
)
759 /* Expand tail of the bit vector. */
760 size
= (3 * nw
/ 2 + 1) * sizeof (IRA_INT_TYPE
);
761 vec
= (IRA_INT_TYPE
*) ira_allocate (size
);
762 memcpy (vec
, OBJECT_CONFLICT_ARRAY (obj1
), OBJECT_CONFLICT_ARRAY_SIZE (obj1
));
763 memset ((char *) vec
+ OBJECT_CONFLICT_ARRAY_SIZE (obj1
),
764 0, size
- OBJECT_CONFLICT_ARRAY_SIZE (obj1
));
765 ira_free (OBJECT_CONFLICT_ARRAY (obj1
));
766 OBJECT_CONFLICT_ARRAY (obj1
) = vec
;
767 OBJECT_CONFLICT_ARRAY_SIZE (obj1
) = size
;
769 OBJECT_MAX (obj1
) = id
;
771 SET_MINMAX_SET_BIT (vec
, id
, OBJECT_MIN (obj1
), OBJECT_MAX (obj1
));
775 /* Add OBJ1 to the conflicts of OBJ2 and vice versa. */
777 ira_add_conflict (ira_object_t obj1
, ira_object_t obj2
)
779 add_to_conflicts (obj1
, obj2
);
780 add_to_conflicts (obj2
, obj1
);
783 /* Clear all conflicts of OBJ. */
785 clear_conflicts (ira_object_t obj
)
787 if (OBJECT_CONFLICT_VEC_P (obj
))
789 OBJECT_NUM_CONFLICTS (obj
) = 0;
790 OBJECT_CONFLICT_VEC (obj
)[0] = NULL
;
792 else if (OBJECT_CONFLICT_ARRAY_SIZE (obj
) != 0)
796 nw
= (OBJECT_MAX (obj
) - OBJECT_MIN (obj
)) / IRA_INT_BITS
+ 1;
797 memset (OBJECT_CONFLICT_BITVEC (obj
), 0, nw
* sizeof (IRA_INT_TYPE
));
801 /* The array used to find duplications in conflict vectors of
803 static int *conflict_check
;
805 /* The value used to mark allocation presence in conflict vector of
806 the current allocno. */
807 static int curr_conflict_check_tick
;
809 /* Remove duplications in conflict vector of OBJ. */
811 compress_conflict_vec (ira_object_t obj
)
813 ira_object_t
*vec
, conflict_obj
;
816 ira_assert (OBJECT_CONFLICT_VEC_P (obj
));
817 vec
= OBJECT_CONFLICT_VEC (obj
);
818 curr_conflict_check_tick
++;
819 for (i
= j
= 0; (conflict_obj
= vec
[i
]) != NULL
; i
++)
821 int id
= OBJECT_CONFLICT_ID (conflict_obj
);
822 if (conflict_check
[id
] != curr_conflict_check_tick
)
824 conflict_check
[id
] = curr_conflict_check_tick
;
825 vec
[j
++] = conflict_obj
;
828 OBJECT_NUM_CONFLICTS (obj
) = j
;
832 /* Remove duplications in conflict vectors of all allocnos. */
834 compress_conflict_vecs (void)
837 ira_object_iterator oi
;
839 conflict_check
= (int *) ira_allocate (sizeof (int) * ira_objects_num
);
840 memset (conflict_check
, 0, sizeof (int) * ira_objects_num
);
841 curr_conflict_check_tick
= 0;
842 FOR_EACH_OBJECT (obj
, oi
)
844 if (OBJECT_CONFLICT_VEC_P (obj
))
845 compress_conflict_vec (obj
);
847 ira_free (conflict_check
);
850 /* This recursive function outputs allocno A and if it is a cap the
851 function outputs its members. */
853 ira_print_expanded_allocno (ira_allocno_t a
)
857 fprintf (ira_dump_file
, " a%d(r%d", ALLOCNO_NUM (a
), ALLOCNO_REGNO (a
));
858 if ((bb
= ALLOCNO_LOOP_TREE_NODE (a
)->bb
) != NULL
)
859 fprintf (ira_dump_file
, ",b%d", bb
->index
);
861 fprintf (ira_dump_file
, ",l%d", ALLOCNO_LOOP_TREE_NODE (a
)->loop_num
);
862 if (ALLOCNO_CAP_MEMBER (a
) != NULL
)
864 fprintf (ira_dump_file
, ":");
865 ira_print_expanded_allocno (ALLOCNO_CAP_MEMBER (a
));
867 fprintf (ira_dump_file
, ")");
870 /* Create and return the cap representing allocno A in the
873 create_cap_allocno (ira_allocno_t a
)
876 ira_loop_tree_node_t parent
;
877 enum reg_class aclass
;
879 parent
= ALLOCNO_LOOP_TREE_NODE (a
)->parent
;
880 cap
= ira_create_allocno (ALLOCNO_REGNO (a
), true, parent
);
881 ALLOCNO_MODE (cap
) = ALLOCNO_MODE (a
);
882 ALLOCNO_WMODE (cap
) = ALLOCNO_WMODE (a
);
883 aclass
= ALLOCNO_CLASS (a
);
884 ira_set_allocno_class (cap
, aclass
);
885 ira_create_allocno_objects (cap
);
886 ALLOCNO_CAP_MEMBER (cap
) = a
;
887 ALLOCNO_CAP (a
) = cap
;
888 ALLOCNO_CLASS_COST (cap
) = ALLOCNO_CLASS_COST (a
);
889 ALLOCNO_MEMORY_COST (cap
) = ALLOCNO_MEMORY_COST (a
);
890 ira_allocate_and_copy_costs
891 (&ALLOCNO_HARD_REG_COSTS (cap
), aclass
, ALLOCNO_HARD_REG_COSTS (a
));
892 ira_allocate_and_copy_costs
893 (&ALLOCNO_CONFLICT_HARD_REG_COSTS (cap
), aclass
,
894 ALLOCNO_CONFLICT_HARD_REG_COSTS (a
));
895 ALLOCNO_BAD_SPILL_P (cap
) = ALLOCNO_BAD_SPILL_P (a
);
896 ALLOCNO_NREFS (cap
) = ALLOCNO_NREFS (a
);
897 ALLOCNO_FREQ (cap
) = ALLOCNO_FREQ (a
);
898 ALLOCNO_CALL_FREQ (cap
) = ALLOCNO_CALL_FREQ (a
);
900 merge_hard_reg_conflicts (a
, cap
, false);
902 ALLOCNO_CALLS_CROSSED_NUM (cap
) = ALLOCNO_CALLS_CROSSED_NUM (a
);
903 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (cap
) = ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a
);
904 ALLOCNO_CROSSED_CALLS_ABIS (cap
) = ALLOCNO_CROSSED_CALLS_ABIS (a
);
905 ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (cap
)
906 = ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (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_pool
.allocate ();
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_pool
.allocate ();
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
;
986 for (first
= last
= NULL
; r1
!= NULL
&& r2
!= NULL
;)
988 if (r1
->start
< r2
->start
)
990 if (r1
->start
<= r2
->finish
+ 1)
992 /* Intersected ranges: merge r1 and r2 into r1. */
993 r1
->start
= r2
->start
;
994 if (r1
->finish
< r2
->finish
)
995 r1
->finish
= r2
->finish
;
996 live_range_t temp
= r2
;
998 ira_finish_live_range (temp
);
1001 /* To try to merge with subsequent ranges in r1. */
1008 /* Add r1 to the result. */
1019 /* To try to merge with subsequent ranges in r2. */
1031 ira_assert (r1
->next
== NULL
);
1033 else if (r2
!= NULL
)
1039 ira_assert (r2
->next
== NULL
);
1043 ira_assert (last
->next
== NULL
);
1048 /* Return TRUE if live ranges R1 and R2 intersect. */
1050 ira_live_ranges_intersect_p (live_range_t r1
, live_range_t r2
)
1052 /* Remember the live ranges are always kept ordered. */
1053 while (r1
!= NULL
&& r2
!= NULL
)
1055 if (r1
->start
> r2
->finish
)
1057 else if (r2
->start
> r1
->finish
)
1065 /* Free allocno live range R. */
1067 ira_finish_live_range (live_range_t r
)
1069 live_range_pool
.remove (r
);
1072 /* Free list of allocno live ranges starting with R. */
1074 ira_finish_live_range_list (live_range_t r
)
1076 live_range_t next_r
;
1078 for (; r
!= NULL
; r
= next_r
)
1081 ira_finish_live_range (r
);
1085 /* Free updated register costs of allocno A. */
1087 ira_free_allocno_updated_costs (ira_allocno_t a
)
1089 enum reg_class aclass
;
1091 aclass
= ALLOCNO_CLASS (a
);
1092 if (ALLOCNO_UPDATED_HARD_REG_COSTS (a
) != NULL
)
1093 ira_free_cost_vector (ALLOCNO_UPDATED_HARD_REG_COSTS (a
), aclass
);
1094 ALLOCNO_UPDATED_HARD_REG_COSTS (a
) = NULL
;
1095 if (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a
) != NULL
)
1096 ira_free_cost_vector (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a
),
1098 ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a
) = NULL
;
1101 /* Free and nullify all cost vectors allocated earlier for allocno
1104 ira_free_allocno_costs (ira_allocno_t a
)
1106 enum reg_class aclass
= ALLOCNO_CLASS (a
);
1108 ira_allocno_object_iterator oi
;
1110 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, oi
)
1112 ira_finish_live_range_list (OBJECT_LIVE_RANGES (obj
));
1113 ira_object_id_map
[OBJECT_CONFLICT_ID (obj
)] = NULL
;
1114 if (OBJECT_CONFLICT_ARRAY (obj
) != NULL
)
1115 ira_free (OBJECT_CONFLICT_ARRAY (obj
));
1116 object_pool
.remove (obj
);
1119 ira_allocnos
[ALLOCNO_NUM (a
)] = NULL
;
1120 if (ALLOCNO_HARD_REG_COSTS (a
) != NULL
)
1121 ira_free_cost_vector (ALLOCNO_HARD_REG_COSTS (a
), aclass
);
1122 if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a
) != NULL
)
1123 ira_free_cost_vector (ALLOCNO_CONFLICT_HARD_REG_COSTS (a
), aclass
);
1124 if (ALLOCNO_UPDATED_HARD_REG_COSTS (a
) != NULL
)
1125 ira_free_cost_vector (ALLOCNO_UPDATED_HARD_REG_COSTS (a
), aclass
);
1126 if (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a
) != NULL
)
1127 ira_free_cost_vector (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a
),
1129 ALLOCNO_HARD_REG_COSTS (a
) = NULL
;
1130 ALLOCNO_CONFLICT_HARD_REG_COSTS (a
) = NULL
;
1131 ALLOCNO_UPDATED_HARD_REG_COSTS (a
) = NULL
;
1132 ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a
) = NULL
;
1135 /* Free the memory allocated for allocno A. */
1137 finish_allocno (ira_allocno_t a
)
1139 ira_free_allocno_costs (a
);
1140 allocno_pool
.remove (a
);
1143 /* Free the memory allocated for all allocnos. */
1145 finish_allocnos (void)
1148 ira_allocno_iterator ai
;
1150 FOR_EACH_ALLOCNO (a
, ai
)
1152 ira_free (ira_regno_allocno_map
);
1153 ira_object_id_map_vec
.release ();
1154 allocno_vec
.release ();
1155 allocno_pool
.release ();
1156 object_pool
.release ();
1157 live_range_pool
.release ();
1162 /* Pools for allocno preferences. */
1163 static object_allocator
<ira_allocno_pref
> pref_pool ("prefs");
1165 /* Vec containing references to all created preferences. It is a
1166 container of array ira_prefs. */
1167 static vec
<ira_pref_t
> pref_vec
;
1169 /* The function initializes data concerning allocno prefs. */
1171 initiate_prefs (void)
1173 pref_vec
.create (get_max_uid ());
1178 /* Return pref for A and HARD_REGNO if any. */
1180 find_allocno_pref (ira_allocno_t a
, int hard_regno
)
1184 for (pref
= ALLOCNO_PREFS (a
); pref
!= NULL
; pref
= pref
->next_pref
)
1185 if (pref
->allocno
== a
&& pref
->hard_regno
== hard_regno
)
1190 /* Create and return pref with given attributes A, HARD_REGNO, and FREQ. */
1192 ira_create_pref (ira_allocno_t a
, int hard_regno
, int freq
)
1196 pref
= pref_pool
.allocate ();
1197 pref
->num
= ira_prefs_num
;
1199 pref
->hard_regno
= hard_regno
;
1201 pref_vec
.safe_push (pref
);
1202 ira_prefs
= pref_vec
.address ();
1203 ira_prefs_num
= pref_vec
.length ();
1207 /* Attach a pref PREF to the corresponding allocno. */
1209 add_allocno_pref_to_list (ira_pref_t pref
)
1211 ira_allocno_t a
= pref
->allocno
;
1213 pref
->next_pref
= ALLOCNO_PREFS (a
);
1214 ALLOCNO_PREFS (a
) = pref
;
1217 /* Create (or update frequency if the pref already exists) the pref of
1218 allocnos A preferring HARD_REGNO with frequency FREQ. */
1220 ira_add_allocno_pref (ira_allocno_t a
, int hard_regno
, int freq
)
1226 if ((pref
= find_allocno_pref (a
, hard_regno
)) != NULL
)
1231 pref
= ira_create_pref (a
, hard_regno
, freq
);
1232 ira_assert (a
!= NULL
);
1233 add_allocno_pref_to_list (pref
);
1236 /* Print info about PREF into file F. */
1238 print_pref (FILE *f
, ira_pref_t pref
)
1240 fprintf (f
, " pref%d:a%d(r%d)<-hr%d@%d\n", pref
->num
,
1241 ALLOCNO_NUM (pref
->allocno
), ALLOCNO_REGNO (pref
->allocno
),
1242 pref
->hard_regno
, pref
->freq
);
1245 /* Print info about PREF into stderr. */
1247 ira_debug_pref (ira_pref_t pref
)
1249 print_pref (stderr
, pref
);
1252 /* Print info about all prefs into file F. */
1254 print_prefs (FILE *f
)
1257 ira_pref_iterator pi
;
1259 FOR_EACH_PREF (pref
, pi
)
1260 print_pref (f
, pref
);
1263 /* Print info about all prefs into stderr. */
1265 ira_debug_prefs (void)
1267 print_prefs (stderr
);
1270 /* Print info about prefs involving allocno A into file F. */
1272 print_allocno_prefs (FILE *f
, ira_allocno_t a
)
1276 fprintf (f
, " a%d(r%d):", ALLOCNO_NUM (a
), ALLOCNO_REGNO (a
));
1277 for (pref
= ALLOCNO_PREFS (a
); pref
!= NULL
; pref
= pref
->next_pref
)
1278 fprintf (f
, " pref%d:hr%d@%d", pref
->num
, pref
->hard_regno
, pref
->freq
);
1282 /* Print info about prefs involving allocno A into stderr. */
1284 ira_debug_allocno_prefs (ira_allocno_t a
)
1286 print_allocno_prefs (stderr
, a
);
1289 /* The function frees memory allocated for PREF. */
1291 finish_pref (ira_pref_t pref
)
1293 ira_prefs
[pref
->num
] = NULL
;
1294 pref_pool
.remove (pref
);
1297 /* Remove PREF from the list of allocno prefs and free memory for
1300 ira_remove_pref (ira_pref_t pref
)
1302 ira_pref_t cpref
, prev
;
1304 if (internal_flag_ira_verbose
> 1 && ira_dump_file
!= NULL
)
1305 fprintf (ira_dump_file
, " Removing pref%d:hr%d@%d\n",
1306 pref
->num
, pref
->hard_regno
, pref
->freq
);
1307 for (prev
= NULL
, cpref
= ALLOCNO_PREFS (pref
->allocno
);
1309 prev
= cpref
, cpref
= cpref
->next_pref
)
1312 ira_assert (cpref
!= NULL
);
1314 ALLOCNO_PREFS (pref
->allocno
) = pref
->next_pref
;
1316 prev
->next_pref
= pref
->next_pref
;
1320 /* Remove all prefs of allocno A. */
1322 ira_remove_allocno_prefs (ira_allocno_t a
)
1324 ira_pref_t pref
, next_pref
;
1326 for (pref
= ALLOCNO_PREFS (a
); pref
!= NULL
; pref
= next_pref
)
1328 next_pref
= pref
->next_pref
;
1331 ALLOCNO_PREFS (a
) = NULL
;
1334 /* Free memory allocated for all prefs. */
1339 ira_pref_iterator pi
;
1341 FOR_EACH_PREF (pref
, pi
)
1343 pref_vec
.release ();
1344 pref_pool
.release ();
1349 /* Pools for copies. */
1350 static object_allocator
<ira_allocno_copy
> copy_pool ("copies");
1352 /* Vec containing references to all created copies. It is a
1353 container of array ira_copies. */
1354 static vec
<ira_copy_t
> copy_vec
;
1356 /* The function initializes data concerning allocno copies. */
1358 initiate_copies (void)
1360 copy_vec
.create (get_max_uid ());
1365 /* Return copy connecting A1 and A2 and originated from INSN of
1366 LOOP_TREE_NODE if any. */
1368 find_allocno_copy (ira_allocno_t a1
, ira_allocno_t a2
, rtx_insn
*insn
,
1369 ira_loop_tree_node_t loop_tree_node
)
1371 ira_copy_t cp
, next_cp
;
1372 ira_allocno_t another_a
;
1374 for (cp
= ALLOCNO_COPIES (a1
); cp
!= NULL
; cp
= next_cp
)
1376 if (cp
->first
== a1
)
1378 next_cp
= cp
->next_first_allocno_copy
;
1379 another_a
= cp
->second
;
1381 else if (cp
->second
== a1
)
1383 next_cp
= cp
->next_second_allocno_copy
;
1384 another_a
= cp
->first
;
1388 if (another_a
== a2
&& cp
->insn
== insn
1389 && cp
->loop_tree_node
== loop_tree_node
)
1395 /* Create and return copy with given attributes LOOP_TREE_NODE, FIRST,
1396 SECOND, FREQ, CONSTRAINT_P, and INSN. */
1398 ira_create_copy (ira_allocno_t first
, ira_allocno_t second
, int freq
,
1399 bool constraint_p
, rtx_insn
*insn
,
1400 ira_loop_tree_node_t loop_tree_node
)
1404 cp
= copy_pool
.allocate ();
1405 cp
->num
= ira_copies_num
;
1407 cp
->second
= second
;
1409 cp
->constraint_p
= constraint_p
;
1411 cp
->loop_tree_node
= loop_tree_node
;
1412 copy_vec
.safe_push (cp
);
1413 ira_copies
= copy_vec
.address ();
1414 ira_copies_num
= copy_vec
.length ();
1418 /* Attach a copy CP to allocnos involved into the copy. */
1420 add_allocno_copy_to_list (ira_copy_t cp
)
1422 ira_allocno_t first
= cp
->first
, second
= cp
->second
;
1424 cp
->prev_first_allocno_copy
= NULL
;
1425 cp
->prev_second_allocno_copy
= NULL
;
1426 cp
->next_first_allocno_copy
= ALLOCNO_COPIES (first
);
1427 if (cp
->next_first_allocno_copy
!= NULL
)
1429 if (cp
->next_first_allocno_copy
->first
== first
)
1430 cp
->next_first_allocno_copy
->prev_first_allocno_copy
= cp
;
1432 cp
->next_first_allocno_copy
->prev_second_allocno_copy
= cp
;
1434 cp
->next_second_allocno_copy
= ALLOCNO_COPIES (second
);
1435 if (cp
->next_second_allocno_copy
!= NULL
)
1437 if (cp
->next_second_allocno_copy
->second
== second
)
1438 cp
->next_second_allocno_copy
->prev_second_allocno_copy
= cp
;
1440 cp
->next_second_allocno_copy
->prev_first_allocno_copy
= cp
;
1442 ALLOCNO_COPIES (first
) = cp
;
1443 ALLOCNO_COPIES (second
) = cp
;
1446 /* Make a copy CP a canonical copy where number of the
1447 first allocno is less than the second one. */
1449 swap_allocno_copy_ends_if_necessary (ira_copy_t cp
)
1451 if (ALLOCNO_NUM (cp
->first
) <= ALLOCNO_NUM (cp
->second
))
1454 std::swap (cp
->first
, cp
->second
);
1455 std::swap (cp
->prev_first_allocno_copy
, cp
->prev_second_allocno_copy
);
1456 std::swap (cp
->next_first_allocno_copy
, cp
->next_second_allocno_copy
);
1459 /* Create (or update frequency if the copy already exists) and return
1460 the copy of allocnos FIRST and SECOND with frequency FREQ
1461 corresponding to move insn INSN (if any) and originated from
1464 ira_add_allocno_copy (ira_allocno_t first
, ira_allocno_t second
, int freq
,
1465 bool constraint_p
, rtx_insn
*insn
,
1466 ira_loop_tree_node_t loop_tree_node
)
1470 if ((cp
= find_allocno_copy (first
, second
, insn
, loop_tree_node
)) != NULL
)
1475 cp
= ira_create_copy (first
, second
, freq
, constraint_p
, insn
,
1477 ira_assert (first
!= NULL
&& second
!= NULL
);
1478 add_allocno_copy_to_list (cp
);
1479 swap_allocno_copy_ends_if_necessary (cp
);
1483 /* Print info about copy CP into file F. */
1485 print_copy (FILE *f
, ira_copy_t cp
)
1487 fprintf (f
, " cp%d:a%d(r%d)<->a%d(r%d)@%d:%s\n", cp
->num
,
1488 ALLOCNO_NUM (cp
->first
), ALLOCNO_REGNO (cp
->first
),
1489 ALLOCNO_NUM (cp
->second
), ALLOCNO_REGNO (cp
->second
), cp
->freq
,
1491 ? "move" : cp
->constraint_p
? "constraint" : "shuffle");
1495 debug (ira_allocno_copy
&ref
)
1497 print_copy (stderr
, &ref
);
1501 debug (ira_allocno_copy
*ptr
)
1506 fprintf (stderr
, "<nil>\n");
1509 /* Print info about copy CP into stderr. */
1511 ira_debug_copy (ira_copy_t cp
)
1513 print_copy (stderr
, cp
);
1516 /* Print info about all copies into file F. */
1518 print_copies (FILE *f
)
1521 ira_copy_iterator ci
;
1523 FOR_EACH_COPY (cp
, ci
)
1527 /* Print info about all copies into stderr. */
1529 ira_debug_copies (void)
1531 print_copies (stderr
);
1534 /* Print info about copies involving allocno A into file F. */
1536 print_allocno_copies (FILE *f
, ira_allocno_t a
)
1538 ira_allocno_t another_a
;
1539 ira_copy_t cp
, next_cp
;
1541 fprintf (f
, " a%d(r%d):", ALLOCNO_NUM (a
), ALLOCNO_REGNO (a
));
1542 for (cp
= ALLOCNO_COPIES (a
); cp
!= NULL
; cp
= next_cp
)
1546 next_cp
= cp
->next_first_allocno_copy
;
1547 another_a
= cp
->second
;
1549 else if (cp
->second
== a
)
1551 next_cp
= cp
->next_second_allocno_copy
;
1552 another_a
= cp
->first
;
1556 fprintf (f
, " cp%d:a%d(r%d)@%d", cp
->num
,
1557 ALLOCNO_NUM (another_a
), ALLOCNO_REGNO (another_a
), cp
->freq
);
1563 debug (ira_allocno
&ref
)
1565 print_allocno_copies (stderr
, &ref
);
1569 debug (ira_allocno
*ptr
)
1574 fprintf (stderr
, "<nil>\n");
1578 /* Print info about copies involving allocno A into stderr. */
1580 ira_debug_allocno_copies (ira_allocno_t a
)
1582 print_allocno_copies (stderr
, a
);
1585 /* The function frees memory allocated for copy CP. */
1587 finish_copy (ira_copy_t cp
)
1589 copy_pool
.remove (cp
);
1593 /* Free memory allocated for all copies. */
1595 finish_copies (void)
1598 ira_copy_iterator ci
;
1600 FOR_EACH_COPY (cp
, ci
)
1602 copy_vec
.release ();
1603 copy_pool
.release ();
1608 /* Pools for cost vectors. It is defined only for allocno classes. */
1609 static pool_allocator
*cost_vector_pool
[N_REG_CLASSES
];
1611 /* The function initiates work with hard register cost vectors. It
1612 creates allocation pool for each allocno class. */
1614 initiate_cost_vectors (void)
1617 enum reg_class aclass
;
1619 for (i
= 0; i
< ira_allocno_classes_num
; i
++)
1621 aclass
= ira_allocno_classes
[i
];
1622 cost_vector_pool
[aclass
] = new pool_allocator
1623 ("cost vectors", sizeof (int) * (ira_class_hard_regs_num
[aclass
]));
1627 /* Allocate and return a cost vector VEC for ACLASS. */
1629 ira_allocate_cost_vector (reg_class_t aclass
)
1631 return (int*) cost_vector_pool
[(int) aclass
]->allocate ();
1634 /* Free a cost vector VEC for ACLASS. */
1636 ira_free_cost_vector (int *vec
, reg_class_t aclass
)
1638 ira_assert (vec
!= NULL
);
1639 cost_vector_pool
[(int) aclass
]->remove (vec
);
1642 /* Finish work with hard register cost vectors. Release allocation
1643 pool for each allocno class. */
1645 finish_cost_vectors (void)
1648 enum reg_class aclass
;
1650 for (i
= 0; i
< ira_allocno_classes_num
; i
++)
1652 aclass
= ira_allocno_classes
[i
];
1653 delete cost_vector_pool
[aclass
];
1659 /* Compute a post-ordering of the reverse control flow of the loop body
1660 designated by the children nodes of LOOP_NODE, whose body nodes in
1661 pre-order are input as LOOP_PREORDER. Return a VEC with a post-order
1662 of the reverse loop body.
1664 For the post-order of the reverse CFG, we visit the basic blocks in
1665 LOOP_PREORDER array in the reverse order of where they appear.
1666 This is important: We do not just want to compute a post-order of
1667 the reverse CFG, we want to make a best-guess for a visiting order that
1668 minimizes the number of chain elements per allocno live range. If the
1669 blocks would be visited in a different order, we would still compute a
1670 correct post-ordering but it would be less likely that two nodes
1671 connected by an edge in the CFG are neighbors in the topsort. */
1673 static vec
<ira_loop_tree_node_t
>
1674 ira_loop_tree_body_rev_postorder (ira_loop_tree_node_t loop_node ATTRIBUTE_UNUSED
,
1675 vec
<ira_loop_tree_node_t
> loop_preorder
)
1677 vec
<ira_loop_tree_node_t
> topsort_nodes
= vNULL
;
1678 unsigned int n_loop_preorder
;
1680 n_loop_preorder
= loop_preorder
.length ();
1681 if (n_loop_preorder
!= 0)
1683 ira_loop_tree_node_t subloop_node
;
1685 auto_vec
<ira_loop_tree_node_t
> dfs_stack
;
1687 /* This is a bit of strange abuse of the BB_VISITED flag: We use
1688 the flag to mark blocks we still have to visit to add them to
1689 our post-order. Define an alias to avoid confusion. */
1690 #define BB_TO_VISIT BB_VISITED
1692 FOR_EACH_VEC_ELT (loop_preorder
, i
, subloop_node
)
1694 gcc_checking_assert (! (subloop_node
->bb
->flags
& BB_TO_VISIT
));
1695 subloop_node
->bb
->flags
|= BB_TO_VISIT
;
1698 topsort_nodes
.create (n_loop_preorder
);
1699 dfs_stack
.create (n_loop_preorder
);
1701 FOR_EACH_VEC_ELT_REVERSE (loop_preorder
, i
, subloop_node
)
1703 if (! (subloop_node
->bb
->flags
& BB_TO_VISIT
))
1706 subloop_node
->bb
->flags
&= ~BB_TO_VISIT
;
1707 dfs_stack
.quick_push (subloop_node
);
1708 while (! dfs_stack
.is_empty ())
1713 ira_loop_tree_node_t n
= dfs_stack
.last ();
1714 FOR_EACH_EDGE (e
, ei
, n
->bb
->preds
)
1716 ira_loop_tree_node_t pred_node
;
1717 basic_block pred_bb
= e
->src
;
1719 if (e
->src
== ENTRY_BLOCK_PTR_FOR_FN (cfun
))
1722 pred_node
= IRA_BB_NODE_BY_INDEX (pred_bb
->index
);
1724 && (pred_node
->bb
->flags
& BB_TO_VISIT
))
1726 pred_node
->bb
->flags
&= ~BB_TO_VISIT
;
1727 dfs_stack
.quick_push (pred_node
);
1730 if (n
== dfs_stack
.last ())
1733 topsort_nodes
.quick_push (n
);
1741 gcc_assert (topsort_nodes
.length () == n_loop_preorder
);
1742 return topsort_nodes
;
1745 /* The current loop tree node and its regno allocno map. */
1746 ira_loop_tree_node_t ira_curr_loop_tree_node
;
1747 ira_allocno_t
*ira_curr_regno_allocno_map
;
1749 /* This recursive function traverses loop tree with root LOOP_NODE
1750 calling non-null functions PREORDER_FUNC and POSTORDER_FUNC
1751 correspondingly in preorder and postorder. The function sets up
1752 IRA_CURR_LOOP_TREE_NODE and IRA_CURR_REGNO_ALLOCNO_MAP. If BB_P,
1753 basic block nodes of LOOP_NODE is also processed (before its
1756 If BB_P is set and POSTORDER_FUNC is given, the basic blocks in
1757 the loop are passed in the *reverse* post-order of the *reverse*
1758 CFG. This is only used by ira_create_allocno_live_ranges, which
1759 wants to visit basic blocks in this order to minimize the number
1760 of elements per live range chain.
1761 Note that the loop tree nodes are still visited in the normal,
1762 forward post-order of the loop tree. */
1765 ira_traverse_loop_tree (bool bb_p
, ira_loop_tree_node_t loop_node
,
1766 void (*preorder_func
) (ira_loop_tree_node_t
),
1767 void (*postorder_func
) (ira_loop_tree_node_t
))
1769 ira_loop_tree_node_t subloop_node
;
1771 ira_assert (loop_node
->bb
== NULL
);
1772 ira_curr_loop_tree_node
= loop_node
;
1773 ira_curr_regno_allocno_map
= ira_curr_loop_tree_node
->regno_allocno_map
;
1775 if (preorder_func
!= NULL
)
1776 (*preorder_func
) (loop_node
);
1780 auto_vec
<ira_loop_tree_node_t
> loop_preorder
;
1783 /* Add all nodes to the set of nodes to visit. The IRA loop tree
1784 is set up such that nodes in the loop body appear in a pre-order
1785 of their place in the CFG. */
1786 for (subloop_node
= loop_node
->children
;
1787 subloop_node
!= NULL
;
1788 subloop_node
= subloop_node
->next
)
1789 if (subloop_node
->bb
!= NULL
)
1790 loop_preorder
.safe_push (subloop_node
);
1792 if (preorder_func
!= NULL
)
1793 FOR_EACH_VEC_ELT (loop_preorder
, i
, subloop_node
)
1794 (*preorder_func
) (subloop_node
);
1796 if (postorder_func
!= NULL
)
1798 vec
<ira_loop_tree_node_t
> loop_rev_postorder
=
1799 ira_loop_tree_body_rev_postorder (loop_node
, loop_preorder
);
1800 FOR_EACH_VEC_ELT_REVERSE (loop_rev_postorder
, i
, subloop_node
)
1801 (*postorder_func
) (subloop_node
);
1802 loop_rev_postorder
.release ();
1806 for (subloop_node
= loop_node
->subloops
;
1807 subloop_node
!= NULL
;
1808 subloop_node
= subloop_node
->subloop_next
)
1810 ira_assert (subloop_node
->bb
== NULL
);
1811 ira_traverse_loop_tree (bb_p
, subloop_node
,
1812 preorder_func
, postorder_func
);
1815 ira_curr_loop_tree_node
= loop_node
;
1816 ira_curr_regno_allocno_map
= ira_curr_loop_tree_node
->regno_allocno_map
;
1818 if (postorder_func
!= NULL
)
1819 (*postorder_func
) (loop_node
);
1824 /* The basic block currently being processed. */
1825 static basic_block curr_bb
;
1827 /* This recursive function creates allocnos corresponding to
1828 pseudo-registers containing in X. True OUTPUT_P means that X is
1829 an lvalue. PARENT corresponds to the parent expression of X. */
1831 create_insn_allocnos (rtx x
, rtx outer
, bool output_p
)
1835 enum rtx_code code
= GET_CODE (x
);
1841 if ((regno
= REGNO (x
)) >= FIRST_PSEUDO_REGISTER
)
1845 if ((a
= ira_curr_regno_allocno_map
[regno
]) == NULL
)
1847 a
= ira_create_allocno (regno
, false, ira_curr_loop_tree_node
);
1848 if (outer
!= NULL
&& GET_CODE (outer
) == SUBREG
)
1850 machine_mode wmode
= GET_MODE (outer
);
1851 if (partial_subreg_p (ALLOCNO_WMODE (a
), wmode
))
1852 ALLOCNO_WMODE (a
) = wmode
;
1856 ALLOCNO_NREFS (a
)++;
1857 ALLOCNO_FREQ (a
) += REG_FREQ_FROM_BB (curr_bb
);
1859 bitmap_set_bit (ira_curr_loop_tree_node
->modified_regnos
, regno
);
1863 else if (code
== SET
)
1865 create_insn_allocnos (SET_DEST (x
), NULL
, true);
1866 create_insn_allocnos (SET_SRC (x
), NULL
, false);
1869 else if (code
== CLOBBER
)
1871 create_insn_allocnos (XEXP (x
, 0), NULL
, true);
1874 else if (code
== MEM
)
1876 create_insn_allocnos (XEXP (x
, 0), NULL
, false);
1879 else if (code
== PRE_DEC
|| code
== POST_DEC
|| code
== PRE_INC
||
1880 code
== POST_INC
|| code
== POST_MODIFY
|| code
== PRE_MODIFY
)
1882 create_insn_allocnos (XEXP (x
, 0), NULL
, true);
1883 create_insn_allocnos (XEXP (x
, 0), NULL
, false);
1887 fmt
= GET_RTX_FORMAT (code
);
1888 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1891 create_insn_allocnos (XEXP (x
, i
), x
, output_p
);
1892 else if (fmt
[i
] == 'E')
1893 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1894 create_insn_allocnos (XVECEXP (x
, i
, j
), x
, output_p
);
1898 /* Create allocnos corresponding to pseudo-registers living in the
1899 basic block represented by the corresponding loop tree node
1902 create_bb_allocnos (ira_loop_tree_node_t bb_node
)
1909 curr_bb
= bb
= bb_node
->bb
;
1910 ira_assert (bb
!= NULL
);
1911 FOR_BB_INSNS_REVERSE (bb
, insn
)
1912 if (NONDEBUG_INSN_P (insn
))
1913 create_insn_allocnos (PATTERN (insn
), NULL
, false);
1914 /* It might be a allocno living through from one subloop to
1916 EXECUTE_IF_SET_IN_REG_SET (df_get_live_in (bb
), FIRST_PSEUDO_REGISTER
, i
, bi
)
1917 if (ira_curr_regno_allocno_map
[i
] == NULL
)
1918 ira_create_allocno (i
, false, ira_curr_loop_tree_node
);
1921 /* Create allocnos corresponding to pseudo-registers living on edge E
1922 (a loop entry or exit). Also mark the allocnos as living on the
1925 create_loop_allocnos (edge e
)
1928 bitmap live_in_regs
, border_allocnos
;
1930 ira_loop_tree_node_t parent
;
1932 live_in_regs
= df_get_live_in (e
->dest
);
1933 border_allocnos
= ira_curr_loop_tree_node
->border_allocnos
;
1934 EXECUTE_IF_SET_IN_REG_SET (df_get_live_out (e
->src
),
1935 FIRST_PSEUDO_REGISTER
, i
, bi
)
1936 if (bitmap_bit_p (live_in_regs
, i
))
1938 if (ira_curr_regno_allocno_map
[i
] == NULL
)
1940 /* The order of creations is important for right
1941 ira_regno_allocno_map. */
1942 if ((parent
= ira_curr_loop_tree_node
->parent
) != NULL
1943 && parent
->regno_allocno_map
[i
] == NULL
)
1944 ira_create_allocno (i
, false, parent
);
1945 ira_create_allocno (i
, false, ira_curr_loop_tree_node
);
1947 bitmap_set_bit (border_allocnos
,
1948 ALLOCNO_NUM (ira_curr_regno_allocno_map
[i
]));
1952 /* Create allocnos corresponding to pseudo-registers living in loop
1953 represented by the corresponding loop tree node LOOP_NODE. This
1954 function is called by ira_traverse_loop_tree. */
1956 create_loop_tree_node_allocnos (ira_loop_tree_node_t loop_node
)
1958 if (loop_node
->bb
!= NULL
)
1959 create_bb_allocnos (loop_node
);
1960 else if (loop_node
!= ira_loop_tree_root
)
1966 ira_assert (current_loops
!= NULL
);
1967 FOR_EACH_EDGE (e
, ei
, loop_node
->loop
->header
->preds
)
1968 if (e
->src
!= loop_node
->loop
->latch
)
1969 create_loop_allocnos (e
);
1971 auto_vec
<edge
> edges
= get_loop_exit_edges (loop_node
->loop
);
1972 FOR_EACH_VEC_ELT (edges
, i
, e
)
1973 create_loop_allocnos (e
);
1977 /* Propagate information about allocnos modified inside the loop given
1978 by its LOOP_TREE_NODE to its parent. */
1980 propagate_modified_regnos (ira_loop_tree_node_t loop_tree_node
)
1982 if (loop_tree_node
== ira_loop_tree_root
)
1984 ira_assert (loop_tree_node
->bb
== NULL
);
1985 bitmap_ior_into (loop_tree_node
->parent
->modified_regnos
,
1986 loop_tree_node
->modified_regnos
);
1989 /* Propagate new info about allocno A (see comments about accumulated
1990 info in allocno definition) to the corresponding allocno on upper
1991 loop tree level. So allocnos on upper levels accumulate
1992 information about the corresponding allocnos in nested regions.
1993 The new info means allocno info finally calculated in this
1996 propagate_allocno_info (void)
1999 ira_allocno_t a
, parent_a
;
2000 ira_loop_tree_node_t parent
;
2001 enum reg_class aclass
;
2003 if (flag_ira_region
!= IRA_REGION_ALL
2004 && flag_ira_region
!= IRA_REGION_MIXED
)
2006 for (i
= max_reg_num () - 1; i
>= FIRST_PSEUDO_REGISTER
; i
--)
2007 for (a
= ira_regno_allocno_map
[i
];
2009 a
= ALLOCNO_NEXT_REGNO_ALLOCNO (a
))
2010 if ((parent
= ALLOCNO_LOOP_TREE_NODE (a
)->parent
) != NULL
2011 && (parent_a
= parent
->regno_allocno_map
[i
]) != NULL
2012 /* There are no caps yet at this point. So use
2013 border_allocnos to find allocnos for the propagation. */
2014 && bitmap_bit_p (ALLOCNO_LOOP_TREE_NODE (a
)->border_allocnos
,
2017 if (! ALLOCNO_BAD_SPILL_P (a
))
2018 ALLOCNO_BAD_SPILL_P (parent_a
) = false;
2019 ALLOCNO_NREFS (parent_a
) += ALLOCNO_NREFS (a
);
2020 ALLOCNO_FREQ (parent_a
) += ALLOCNO_FREQ (a
);
2021 ALLOCNO_CALL_FREQ (parent_a
) += ALLOCNO_CALL_FREQ (a
);
2022 merge_hard_reg_conflicts (a
, parent_a
, true);
2023 ALLOCNO_CALLS_CROSSED_NUM (parent_a
)
2024 += ALLOCNO_CALLS_CROSSED_NUM (a
);
2025 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (parent_a
)
2026 += ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a
);
2027 ALLOCNO_CROSSED_CALLS_ABIS (parent_a
)
2028 |= ALLOCNO_CROSSED_CALLS_ABIS (a
);
2029 ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (parent_a
)
2030 |= ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a
);
2031 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a
)
2032 += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a
);
2033 aclass
= ALLOCNO_CLASS (a
);
2034 ira_assert (aclass
== ALLOCNO_CLASS (parent_a
));
2035 ira_allocate_and_accumulate_costs
2036 (&ALLOCNO_HARD_REG_COSTS (parent_a
), aclass
,
2037 ALLOCNO_HARD_REG_COSTS (a
));
2038 ira_allocate_and_accumulate_costs
2039 (&ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a
),
2041 ALLOCNO_CONFLICT_HARD_REG_COSTS (a
));
2042 ALLOCNO_CLASS_COST (parent_a
)
2043 += ALLOCNO_CLASS_COST (a
);
2044 ALLOCNO_MEMORY_COST (parent_a
) += ALLOCNO_MEMORY_COST (a
);
2048 /* Create allocnos corresponding to pseudo-registers in the current
2049 function. Traverse the loop tree for this. */
2051 create_allocnos (void)
2053 /* We need to process BB first to correctly link allocnos by member
2054 next_regno_allocno. */
2055 ira_traverse_loop_tree (true, ira_loop_tree_root
,
2056 create_loop_tree_node_allocnos
, NULL
);
2058 ira_traverse_loop_tree (false, ira_loop_tree_root
, NULL
,
2059 propagate_modified_regnos
);
2064 /* The page contains function to remove some regions from a separate
2065 register allocation. We remove regions whose separate allocation
2066 will hardly improve the result. As a result we speed up regional
2067 register allocation. */
2069 /* The function changes the object in range list given by R to OBJ. */
2071 change_object_in_range_list (live_range_t r
, ira_object_t obj
)
2073 for (; r
!= NULL
; r
= r
->next
)
2077 /* Move all live ranges associated with allocno FROM to allocno TO. */
2079 move_allocno_live_ranges (ira_allocno_t from
, ira_allocno_t to
)
2082 int n
= ALLOCNO_NUM_OBJECTS (from
);
2084 gcc_assert (n
== ALLOCNO_NUM_OBJECTS (to
));
2086 for (i
= 0; i
< n
; i
++)
2088 ira_object_t from_obj
= ALLOCNO_OBJECT (from
, i
);
2089 ira_object_t to_obj
= ALLOCNO_OBJECT (to
, i
);
2090 live_range_t lr
= OBJECT_LIVE_RANGES (from_obj
);
2092 if (internal_flag_ira_verbose
> 4 && ira_dump_file
!= NULL
)
2094 fprintf (ira_dump_file
,
2095 " Moving ranges of a%dr%d to a%dr%d: ",
2096 ALLOCNO_NUM (from
), ALLOCNO_REGNO (from
),
2097 ALLOCNO_NUM (to
), ALLOCNO_REGNO (to
));
2098 ira_print_live_range_list (ira_dump_file
, lr
);
2100 change_object_in_range_list (lr
, to_obj
);
2101 OBJECT_LIVE_RANGES (to_obj
)
2102 = ira_merge_live_ranges (lr
, OBJECT_LIVE_RANGES (to_obj
));
2103 OBJECT_LIVE_RANGES (from_obj
) = NULL
;
2108 copy_allocno_live_ranges (ira_allocno_t from
, ira_allocno_t to
)
2111 int n
= ALLOCNO_NUM_OBJECTS (from
);
2113 gcc_assert (n
== ALLOCNO_NUM_OBJECTS (to
));
2115 for (i
= 0; i
< n
; i
++)
2117 ira_object_t from_obj
= ALLOCNO_OBJECT (from
, i
);
2118 ira_object_t to_obj
= ALLOCNO_OBJECT (to
, i
);
2119 live_range_t lr
= OBJECT_LIVE_RANGES (from_obj
);
2121 if (internal_flag_ira_verbose
> 4 && ira_dump_file
!= NULL
)
2123 fprintf (ira_dump_file
, " Copying ranges of a%dr%d to a%dr%d: ",
2124 ALLOCNO_NUM (from
), ALLOCNO_REGNO (from
),
2125 ALLOCNO_NUM (to
), ALLOCNO_REGNO (to
));
2126 ira_print_live_range_list (ira_dump_file
, lr
);
2128 lr
= ira_copy_live_range_list (lr
);
2129 change_object_in_range_list (lr
, to_obj
);
2130 OBJECT_LIVE_RANGES (to_obj
)
2131 = ira_merge_live_ranges (lr
, OBJECT_LIVE_RANGES (to_obj
));
2135 /* Return TRUE if NODE represents a loop with low register
2138 low_pressure_loop_node_p (ira_loop_tree_node_t node
)
2141 enum reg_class pclass
;
2143 if (node
->bb
!= NULL
)
2146 for (i
= 0; i
< ira_pressure_classes_num
; i
++)
2148 pclass
= ira_pressure_classes
[i
];
2149 if (node
->reg_pressure
[pclass
] > ira_class_hard_regs_num
[pclass
]
2150 && ira_class_hard_regs_num
[pclass
] > 1)
2157 /* Return TRUE if LOOP has a complex enter or exit edge. We don't
2158 form a region from such loop if the target use stack register
2159 because reg-stack.c cannot deal with such edges. */
2161 loop_with_complex_edge_p (class loop
*loop
)
2168 FOR_EACH_EDGE (e
, ei
, loop
->header
->preds
)
2169 if (e
->flags
& EDGE_EH
)
2171 auto_vec
<edge
> edges
= get_loop_exit_edges (loop
);
2173 FOR_EACH_VEC_ELT (edges
, i
, e
)
2174 if (e
->flags
& EDGE_COMPLEX
)
2183 /* Sort loops for marking them for removal. We put already marked
2184 loops first, then less frequent loops next, and then outer loops
2187 loop_compare_func (const void *v1p
, const void *v2p
)
2190 ira_loop_tree_node_t l1
= *(const ira_loop_tree_node_t
*) v1p
;
2191 ira_loop_tree_node_t l2
= *(const ira_loop_tree_node_t
*) v2p
;
2193 ira_assert (l1
->parent
!= NULL
&& l2
->parent
!= NULL
);
2194 if (l1
->to_remove_p
&& ! l2
->to_remove_p
)
2196 if (! l1
->to_remove_p
&& l2
->to_remove_p
)
2198 if ((diff
= l1
->loop
->header
->count
.to_frequency (cfun
)
2199 - l2
->loop
->header
->count
.to_frequency (cfun
)) != 0)
2201 if ((diff
= (int) loop_depth (l1
->loop
) - (int) loop_depth (l2
->loop
)) != 0)
2203 /* Make sorting stable. */
2204 return l1
->loop_num
- l2
->loop_num
;
2207 /* Mark loops which should be removed from regional allocation. We
2208 remove a loop with low register pressure inside another loop with
2209 register pressure. In this case a separate allocation of the loop
2210 hardly helps (for irregular register file architecture it could
2211 help by choosing a better hard register in the loop but we prefer
2212 faster allocation even in this case). We also remove cheap loops
2213 if there are more than param_ira_max_loops_num of them. Loop with EH
2214 exit or enter edges are removed too because the allocation might
2215 require put pseudo moves on the EH edges (we could still do this
2216 for pseudos with caller saved hard registers in some cases but it
2217 is impossible to say here or during top-down allocation pass what
2218 hard register the pseudos get finally). */
2220 mark_loops_for_removal (void)
2223 ira_loop_tree_node_t
*sorted_loops
;
2226 ira_assert (current_loops
!= NULL
);
2228 = (ira_loop_tree_node_t
*) ira_allocate (sizeof (ira_loop_tree_node_t
)
2229 * number_of_loops (cfun
));
2230 for (n
= i
= 0; vec_safe_iterate (get_loops (cfun
), i
, &loop
); i
++)
2231 if (ira_loop_nodes
[i
].regno_allocno_map
!= NULL
)
2233 if (ira_loop_nodes
[i
].parent
== NULL
)
2235 /* Don't remove the root. */
2236 ira_loop_nodes
[i
].to_remove_p
= false;
2239 sorted_loops
[n
++] = &ira_loop_nodes
[i
];
2240 ira_loop_nodes
[i
].to_remove_p
2241 = ((low_pressure_loop_node_p (ira_loop_nodes
[i
].parent
)
2242 && low_pressure_loop_node_p (&ira_loop_nodes
[i
]))
2244 || loop_with_complex_edge_p (ira_loop_nodes
[i
].loop
)
2248 qsort (sorted_loops
, n
, sizeof (ira_loop_tree_node_t
), loop_compare_func
);
2249 for (i
= 0; i
< n
- param_ira_max_loops_num
; i
++)
2251 sorted_loops
[i
]->to_remove_p
= true;
2252 if (internal_flag_ira_verbose
> 1 && ira_dump_file
!= NULL
)
2255 " Mark loop %d (header %d, freq %d, depth %d) for removal (%s)\n",
2256 sorted_loops
[i
]->loop_num
, sorted_loops
[i
]->loop
->header
->index
,
2257 sorted_loops
[i
]->loop
->header
->count
.to_frequency (cfun
),
2258 loop_depth (sorted_loops
[i
]->loop
),
2259 low_pressure_loop_node_p (sorted_loops
[i
]->parent
)
2260 && low_pressure_loop_node_p (sorted_loops
[i
])
2261 ? "low pressure" : "cheap loop");
2263 ira_free (sorted_loops
);
2266 /* Mark all loops but root for removing. */
2268 mark_all_loops_for_removal (void)
2273 ira_assert (current_loops
!= NULL
);
2274 FOR_EACH_VEC_SAFE_ELT (get_loops (cfun
), i
, loop
)
2275 if (ira_loop_nodes
[i
].regno_allocno_map
!= NULL
)
2277 if (ira_loop_nodes
[i
].parent
== NULL
)
2279 /* Don't remove the root. */
2280 ira_loop_nodes
[i
].to_remove_p
= false;
2283 ira_loop_nodes
[i
].to_remove_p
= true;
2284 if (internal_flag_ira_verbose
> 1 && ira_dump_file
!= NULL
)
2287 " Mark loop %d (header %d, freq %d, depth %d) for removal\n",
2288 ira_loop_nodes
[i
].loop_num
,
2289 ira_loop_nodes
[i
].loop
->header
->index
,
2290 ira_loop_nodes
[i
].loop
->header
->count
.to_frequency (cfun
),
2291 loop_depth (ira_loop_nodes
[i
].loop
));
2295 /* Definition of vector of loop tree nodes. */
2297 /* Vec containing references to all removed loop tree nodes. */
2298 static vec
<ira_loop_tree_node_t
> removed_loop_vec
;
2300 /* Vec containing references to all children of loop tree nodes. */
2301 static vec
<ira_loop_tree_node_t
> children_vec
;
2303 /* Remove subregions of NODE if their separate allocation will not
2304 improve the result. */
2306 remove_uneccesary_loop_nodes_from_loop_tree (ira_loop_tree_node_t node
)
2310 ira_loop_tree_node_t subnode
;
2312 remove_p
= node
->to_remove_p
;
2314 children_vec
.safe_push (node
);
2315 start
= children_vec
.length ();
2316 for (subnode
= node
->children
; subnode
!= NULL
; subnode
= subnode
->next
)
2317 if (subnode
->bb
== NULL
)
2318 remove_uneccesary_loop_nodes_from_loop_tree (subnode
);
2320 children_vec
.safe_push (subnode
);
2321 node
->children
= node
->subloops
= NULL
;
2324 removed_loop_vec
.safe_push (node
);
2327 while (children_vec
.length () > start
)
2329 subnode
= children_vec
.pop ();
2330 subnode
->parent
= node
;
2331 subnode
->next
= node
->children
;
2332 node
->children
= subnode
;
2333 if (subnode
->bb
== NULL
)
2335 subnode
->subloop_next
= node
->subloops
;
2336 node
->subloops
= subnode
;
2341 /* Return TRUE if NODE is inside PARENT. */
2343 loop_is_inside_p (ira_loop_tree_node_t node
, ira_loop_tree_node_t parent
)
2345 for (node
= node
->parent
; node
!= NULL
; node
= node
->parent
)
2351 /* Sort allocnos according to their order in regno allocno list. */
2353 regno_allocno_order_compare_func (const void *v1p
, const void *v2p
)
2355 ira_allocno_t a1
= *(const ira_allocno_t
*) v1p
;
2356 ira_allocno_t a2
= *(const ira_allocno_t
*) v2p
;
2357 ira_loop_tree_node_t n1
= ALLOCNO_LOOP_TREE_NODE (a1
);
2358 ira_loop_tree_node_t n2
= ALLOCNO_LOOP_TREE_NODE (a2
);
2360 if (loop_is_inside_p (n1
, n2
))
2362 else if (loop_is_inside_p (n2
, n1
))
2364 /* If allocnos are equally good, sort by allocno numbers, so that
2365 the results of qsort leave nothing to chance. We put allocnos
2366 with higher number first in the list because it is the original
2367 order for allocnos from loops on the same levels. */
2368 return ALLOCNO_NUM (a2
) - ALLOCNO_NUM (a1
);
2371 /* This array is used to sort allocnos to restore allocno order in
2372 the regno allocno list. */
2373 static ira_allocno_t
*regno_allocnos
;
2375 /* Restore allocno order for REGNO in the regno allocno list. */
2377 ira_rebuild_regno_allocno_list (int regno
)
2382 for (n
= 0, a
= ira_regno_allocno_map
[regno
];
2384 a
= ALLOCNO_NEXT_REGNO_ALLOCNO (a
))
2385 regno_allocnos
[n
++] = a
;
2387 qsort (regno_allocnos
, n
, sizeof (ira_allocno_t
),
2388 regno_allocno_order_compare_func
);
2389 for (i
= 1; i
< n
; i
++)
2390 ALLOCNO_NEXT_REGNO_ALLOCNO (regno_allocnos
[i
- 1]) = regno_allocnos
[i
];
2391 ALLOCNO_NEXT_REGNO_ALLOCNO (regno_allocnos
[n
- 1]) = NULL
;
2392 ira_regno_allocno_map
[regno
] = regno_allocnos
[0];
2393 if (internal_flag_ira_verbose
> 1 && ira_dump_file
!= NULL
)
2394 fprintf (ira_dump_file
, " Rebuilding regno allocno list for %d\n", regno
);
2397 /* Propagate info from allocno FROM_A to allocno A. */
2399 propagate_some_info_from_allocno (ira_allocno_t a
, ira_allocno_t from_a
)
2401 enum reg_class aclass
;
2403 merge_hard_reg_conflicts (from_a
, a
, false);
2404 ALLOCNO_NREFS (a
) += ALLOCNO_NREFS (from_a
);
2405 ALLOCNO_FREQ (a
) += ALLOCNO_FREQ (from_a
);
2406 ALLOCNO_CALL_FREQ (a
) += ALLOCNO_CALL_FREQ (from_a
);
2407 ALLOCNO_CALLS_CROSSED_NUM (a
) += ALLOCNO_CALLS_CROSSED_NUM (from_a
);
2408 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a
)
2409 += ALLOCNO_CHEAP_CALLS_CROSSED_NUM (from_a
);
2410 ALLOCNO_CROSSED_CALLS_ABIS (a
) |= ALLOCNO_CROSSED_CALLS_ABIS (from_a
);
2411 ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a
)
2412 |= ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (from_a
);
2414 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a
)
2415 += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (from_a
);
2416 if (! ALLOCNO_BAD_SPILL_P (from_a
))
2417 ALLOCNO_BAD_SPILL_P (a
) = false;
2418 aclass
= ALLOCNO_CLASS (from_a
);
2419 ira_assert (aclass
== ALLOCNO_CLASS (a
));
2420 ira_allocate_and_accumulate_costs (&ALLOCNO_HARD_REG_COSTS (a
), aclass
,
2421 ALLOCNO_HARD_REG_COSTS (from_a
));
2422 ira_allocate_and_accumulate_costs (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a
),
2424 ALLOCNO_CONFLICT_HARD_REG_COSTS (from_a
));
2425 ALLOCNO_CLASS_COST (a
) += ALLOCNO_CLASS_COST (from_a
);
2426 ALLOCNO_MEMORY_COST (a
) += ALLOCNO_MEMORY_COST (from_a
);
2429 /* Remove allocnos from loops removed from the allocation
2432 remove_unnecessary_allocnos (void)
2435 bool merged_p
, rebuild_p
;
2436 ira_allocno_t a
, prev_a
, next_a
, parent_a
;
2437 ira_loop_tree_node_t a_node
, parent
;
2440 regno_allocnos
= NULL
;
2441 for (regno
= max_reg_num () - 1; regno
>= FIRST_PSEUDO_REGISTER
; regno
--)
2444 for (prev_a
= NULL
, a
= ira_regno_allocno_map
[regno
];
2448 next_a
= ALLOCNO_NEXT_REGNO_ALLOCNO (a
);
2449 a_node
= ALLOCNO_LOOP_TREE_NODE (a
);
2450 if (! a_node
->to_remove_p
)
2454 for (parent
= a_node
->parent
;
2455 (parent_a
= parent
->regno_allocno_map
[regno
]) == NULL
2456 && parent
->to_remove_p
;
2457 parent
= parent
->parent
)
2459 if (parent_a
== NULL
)
2461 /* There are no allocnos with the same regno in
2462 upper region -- just move the allocno to the
2465 ALLOCNO_LOOP_TREE_NODE (a
) = parent
;
2466 parent
->regno_allocno_map
[regno
] = a
;
2467 bitmap_set_bit (parent
->all_allocnos
, ALLOCNO_NUM (a
));
2472 /* Remove the allocno and update info of allocno in
2473 the upper region. */
2475 ira_regno_allocno_map
[regno
] = next_a
;
2477 ALLOCNO_NEXT_REGNO_ALLOCNO (prev_a
) = next_a
;
2478 move_allocno_live_ranges (a
, parent_a
);
2480 propagate_some_info_from_allocno (parent_a
, a
);
2481 /* Remove it from the corresponding regno allocno
2482 map to avoid info propagation of subsequent
2483 allocno into this already removed allocno. */
2484 a_node
->regno_allocno_map
[regno
] = NULL
;
2485 ira_remove_allocno_prefs (a
);
2491 /* We need to restore the order in regno allocno list. */
2493 if (regno_allocnos
== NULL
)
2495 = (ira_allocno_t
*) ira_allocate (sizeof (ira_allocno_t
)
2496 * ira_allocnos_num
);
2497 ira_rebuild_regno_allocno_list (regno
);
2501 ira_rebuild_start_finish_chains ();
2502 if (regno_allocnos
!= NULL
)
2503 ira_free (regno_allocnos
);
2506 /* Remove allocnos from all loops but the root. */
2508 remove_low_level_allocnos (void)
2511 bool merged_p
, propagate_p
;
2512 ira_allocno_t a
, top_a
;
2513 ira_loop_tree_node_t a_node
, parent
;
2514 ira_allocno_iterator ai
;
2517 FOR_EACH_ALLOCNO (a
, ai
)
2519 a_node
= ALLOCNO_LOOP_TREE_NODE (a
);
2520 if (a_node
== ira_loop_tree_root
|| ALLOCNO_CAP_MEMBER (a
) != NULL
)
2522 regno
= ALLOCNO_REGNO (a
);
2523 if ((top_a
= ira_loop_tree_root
->regno_allocno_map
[regno
]) == NULL
)
2525 ALLOCNO_LOOP_TREE_NODE (a
) = ira_loop_tree_root
;
2526 ira_loop_tree_root
->regno_allocno_map
[regno
] = a
;
2529 propagate_p
= a_node
->parent
->regno_allocno_map
[regno
] == NULL
;
2530 /* Remove the allocno and update info of allocno in the upper
2532 move_allocno_live_ranges (a
, top_a
);
2535 propagate_some_info_from_allocno (top_a
, a
);
2537 FOR_EACH_ALLOCNO (a
, ai
)
2539 a_node
= ALLOCNO_LOOP_TREE_NODE (a
);
2540 if (a_node
== ira_loop_tree_root
)
2542 parent
= a_node
->parent
;
2543 regno
= ALLOCNO_REGNO (a
);
2544 if (ALLOCNO_CAP_MEMBER (a
) != NULL
)
2545 ira_assert (ALLOCNO_CAP (a
) != NULL
);
2546 else if (ALLOCNO_CAP (a
) == NULL
)
2547 ira_assert (parent
->regno_allocno_map
[regno
] != NULL
);
2549 FOR_EACH_ALLOCNO (a
, ai
)
2551 regno
= ALLOCNO_REGNO (a
);
2552 if (ira_loop_tree_root
->regno_allocno_map
[regno
] == a
)
2555 ira_allocno_object_iterator oi
;
2557 ira_regno_allocno_map
[regno
] = a
;
2558 ALLOCNO_NEXT_REGNO_ALLOCNO (a
) = NULL
;
2559 ALLOCNO_CAP_MEMBER (a
) = NULL
;
2560 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, oi
)
2561 OBJECT_CONFLICT_HARD_REGS (obj
)
2562 = OBJECT_TOTAL_CONFLICT_HARD_REGS (obj
);
2564 if (ALLOCNO_TOTAL_NO_STACK_REG_P (a
))
2565 ALLOCNO_NO_STACK_REG_P (a
) = true;
2570 ira_remove_allocno_prefs (a
);
2575 ira_rebuild_start_finish_chains ();
2578 /* Remove loops from consideration. We remove all loops except for
2579 root if ALL_P or loops for which a separate allocation will not
2580 improve the result. We have to do this after allocno creation and
2581 their costs and allocno class evaluation because only after that
2582 the register pressure can be known and is calculated. */
2584 remove_unnecessary_regions (bool all_p
)
2586 if (current_loops
== NULL
)
2589 mark_all_loops_for_removal ();
2591 mark_loops_for_removal ();
2592 children_vec
.create (last_basic_block_for_fn (cfun
)
2593 + number_of_loops (cfun
));
2594 removed_loop_vec
.create (last_basic_block_for_fn (cfun
)
2595 + number_of_loops (cfun
));
2596 remove_uneccesary_loop_nodes_from_loop_tree (ira_loop_tree_root
);
2597 children_vec
.release ();
2599 remove_low_level_allocnos ();
2601 remove_unnecessary_allocnos ();
2602 while (removed_loop_vec
.length () > 0)
2603 finish_loop_tree_node (removed_loop_vec
.pop ());
2604 removed_loop_vec
.release ();
2609 /* At this point true value of allocno attribute bad_spill_p means
2610 that there is an insn where allocno occurs and where the allocno
2611 cannot be used as memory. The function updates the attribute, now
2612 it can be true only for allocnos which cannot be used as memory in
2613 an insn and in whose live ranges there is other allocno deaths.
2614 Spilling allocnos with true value will not improve the code because
2615 it will not make other allocnos colorable and additional reloads
2616 for the corresponding pseudo will be generated in reload pass for
2617 each insn it occurs.
2619 This is a trick mentioned in one classic article of Chaitin etc
2620 which is frequently omitted in other implementations of RA based on
2623 update_bad_spill_attribute (void)
2627 ira_allocno_iterator ai
;
2628 ira_allocno_object_iterator aoi
;
2631 enum reg_class aclass
;
2632 bitmap_head dead_points
[N_REG_CLASSES
];
2634 for (i
= 0; i
< ira_allocno_classes_num
; i
++)
2636 aclass
= ira_allocno_classes
[i
];
2637 bitmap_initialize (&dead_points
[aclass
], ®_obstack
);
2639 FOR_EACH_ALLOCNO (a
, ai
)
2641 aclass
= ALLOCNO_CLASS (a
);
2642 if (aclass
== NO_REGS
)
2644 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, aoi
)
2645 for (r
= OBJECT_LIVE_RANGES (obj
); r
!= NULL
; r
= r
->next
)
2646 bitmap_set_bit (&dead_points
[aclass
], r
->finish
);
2648 FOR_EACH_ALLOCNO (a
, ai
)
2650 aclass
= ALLOCNO_CLASS (a
);
2651 if (aclass
== NO_REGS
)
2653 if (! ALLOCNO_BAD_SPILL_P (a
))
2655 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, aoi
)
2657 for (r
= OBJECT_LIVE_RANGES (obj
); r
!= NULL
; r
= r
->next
)
2659 for (i
= r
->start
+ 1; i
< r
->finish
; i
++)
2660 if (bitmap_bit_p (&dead_points
[aclass
], i
))
2667 ALLOCNO_BAD_SPILL_P (a
) = false;
2672 for (i
= 0; i
< ira_allocno_classes_num
; i
++)
2674 aclass
= ira_allocno_classes
[i
];
2675 bitmap_clear (&dead_points
[aclass
]);
2681 /* Set up minimal and maximal live range points for allocnos. */
2683 setup_min_max_allocno_live_range_point (void)
2686 ira_allocno_t a
, parent_a
, cap
;
2687 ira_allocno_iterator ai
;
2688 #ifdef ENABLE_IRA_CHECKING
2689 ira_object_iterator oi
;
2693 ira_loop_tree_node_t parent
;
2695 FOR_EACH_ALLOCNO (a
, ai
)
2697 int n
= ALLOCNO_NUM_OBJECTS (a
);
2699 for (i
= 0; i
< n
; i
++)
2701 ira_object_t obj
= ALLOCNO_OBJECT (a
, i
);
2702 r
= OBJECT_LIVE_RANGES (obj
);
2705 OBJECT_MAX (obj
) = r
->finish
;
2706 for (; r
->next
!= NULL
; r
= r
->next
)
2708 OBJECT_MIN (obj
) = r
->start
;
2711 for (i
= max_reg_num () - 1; i
>= FIRST_PSEUDO_REGISTER
; i
--)
2712 for (a
= ira_regno_allocno_map
[i
];
2714 a
= ALLOCNO_NEXT_REGNO_ALLOCNO (a
))
2717 int n
= ALLOCNO_NUM_OBJECTS (a
);
2719 for (j
= 0; j
< n
; j
++)
2721 ira_object_t obj
= ALLOCNO_OBJECT (a
, j
);
2722 ira_object_t parent_obj
;
2724 if (OBJECT_MAX (obj
) < 0)
2726 /* The object is not used and hence does not live. */
2727 ira_assert (OBJECT_LIVE_RANGES (obj
) == NULL
);
2728 OBJECT_MAX (obj
) = 0;
2729 OBJECT_MIN (obj
) = 1;
2732 ira_assert (ALLOCNO_CAP_MEMBER (a
) == NULL
);
2733 /* Accumulation of range info. */
2734 if (ALLOCNO_CAP (a
) != NULL
)
2736 for (cap
= ALLOCNO_CAP (a
); cap
!= NULL
; cap
= ALLOCNO_CAP (cap
))
2738 ira_object_t cap_obj
= ALLOCNO_OBJECT (cap
, j
);
2739 if (OBJECT_MAX (cap_obj
) < OBJECT_MAX (obj
))
2740 OBJECT_MAX (cap_obj
) = OBJECT_MAX (obj
);
2741 if (OBJECT_MIN (cap_obj
) > OBJECT_MIN (obj
))
2742 OBJECT_MIN (cap_obj
) = OBJECT_MIN (obj
);
2746 if ((parent
= ALLOCNO_LOOP_TREE_NODE (a
)->parent
) == NULL
)
2748 parent_a
= parent
->regno_allocno_map
[i
];
2749 parent_obj
= ALLOCNO_OBJECT (parent_a
, j
);
2750 if (OBJECT_MAX (parent_obj
) < OBJECT_MAX (obj
))
2751 OBJECT_MAX (parent_obj
) = OBJECT_MAX (obj
);
2752 if (OBJECT_MIN (parent_obj
) > OBJECT_MIN (obj
))
2753 OBJECT_MIN (parent_obj
) = OBJECT_MIN (obj
);
2756 #ifdef ENABLE_IRA_CHECKING
2757 FOR_EACH_OBJECT (obj
, oi
)
2759 if ((OBJECT_MIN (obj
) >= 0 && OBJECT_MIN (obj
) <= ira_max_point
)
2760 && (OBJECT_MAX (obj
) >= 0 && OBJECT_MAX (obj
) <= ira_max_point
))
2767 /* Sort allocnos according to their live ranges. Allocnos with
2768 smaller allocno class are put first unless we use priority
2769 coloring. Allocnos with the same class are ordered according
2770 their start (min). Allocnos with the same start are ordered
2771 according their finish (max). */
2773 object_range_compare_func (const void *v1p
, const void *v2p
)
2776 ira_object_t obj1
= *(const ira_object_t
*) v1p
;
2777 ira_object_t obj2
= *(const ira_object_t
*) v2p
;
2778 ira_allocno_t a1
= OBJECT_ALLOCNO (obj1
);
2779 ira_allocno_t a2
= OBJECT_ALLOCNO (obj2
);
2781 if ((diff
= OBJECT_MIN (obj1
) - OBJECT_MIN (obj2
)) != 0)
2783 if ((diff
= OBJECT_MAX (obj1
) - OBJECT_MAX (obj2
)) != 0)
2785 return ALLOCNO_NUM (a1
) - ALLOCNO_NUM (a2
);
2788 /* Sort ira_object_id_map and set up conflict id of allocnos. */
2790 sort_conflict_id_map (void)
2794 ira_allocno_iterator ai
;
2797 FOR_EACH_ALLOCNO (a
, ai
)
2799 ira_allocno_object_iterator oi
;
2802 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, oi
)
2803 ira_object_id_map
[num
++] = obj
;
2806 qsort (ira_object_id_map
, num
, sizeof (ira_object_t
),
2807 object_range_compare_func
);
2808 for (i
= 0; i
< num
; i
++)
2810 ira_object_t obj
= ira_object_id_map
[i
];
2812 gcc_assert (obj
!= NULL
);
2813 OBJECT_CONFLICT_ID (obj
) = i
;
2815 for (i
= num
; i
< ira_objects_num
; i
++)
2816 ira_object_id_map
[i
] = NULL
;
2819 /* Set up minimal and maximal conflict ids of allocnos with which
2820 given allocno can conflict. */
2822 setup_min_max_conflict_allocno_ids (void)
2825 int i
, j
, min
, max
, start
, finish
, first_not_finished
, filled_area_start
;
2826 int *live_range_min
, *last_lived
;
2827 int word0_min
, word0_max
;
2829 ira_allocno_iterator ai
;
2831 live_range_min
= (int *) ira_allocate (sizeof (int) * ira_objects_num
);
2833 first_not_finished
= -1;
2834 for (i
= 0; i
< ira_objects_num
; i
++)
2836 ira_object_t obj
= ira_object_id_map
[i
];
2841 a
= OBJECT_ALLOCNO (obj
);
2845 aclass
= ALLOCNO_CLASS (a
);
2847 first_not_finished
= i
;
2851 start
= OBJECT_MIN (obj
);
2852 /* If we skip an allocno, the allocno with smaller ids will
2853 be also skipped because of the secondary sorting the
2854 range finishes (see function
2855 object_range_compare_func). */
2856 while (first_not_finished
< i
2857 && start
> OBJECT_MAX (ira_object_id_map
2858 [first_not_finished
]))
2859 first_not_finished
++;
2860 min
= first_not_finished
;
2863 /* We could increase min further in this case but it is good
2866 live_range_min
[i
] = OBJECT_MIN (obj
);
2867 OBJECT_MIN (obj
) = min
;
2869 last_lived
= (int *) ira_allocate (sizeof (int) * ira_max_point
);
2871 filled_area_start
= -1;
2872 for (i
= ira_objects_num
- 1; i
>= 0; i
--)
2874 ira_object_t obj
= ira_object_id_map
[i
];
2879 a
= OBJECT_ALLOCNO (obj
);
2882 aclass
= ALLOCNO_CLASS (a
);
2883 for (j
= 0; j
< ira_max_point
; j
++)
2885 filled_area_start
= ira_max_point
;
2887 min
= live_range_min
[i
];
2888 finish
= OBJECT_MAX (obj
);
2889 max
= last_lived
[finish
];
2891 /* We could decrease max further in this case but it is good
2893 max
= OBJECT_CONFLICT_ID (obj
) - 1;
2894 OBJECT_MAX (obj
) = max
;
2895 /* In filling, we can go further A range finish to recognize
2896 intersection quickly because if the finish of subsequently
2897 processed allocno (it has smaller conflict id) range is
2898 further A range finish than they are definitely intersected
2899 (the reason for this is the allocnos with bigger conflict id
2900 have their range starts not smaller than allocnos with
2902 for (j
= min
; j
< filled_area_start
; j
++)
2904 filled_area_start
= min
;
2906 ira_free (last_lived
);
2907 ira_free (live_range_min
);
2909 /* For allocnos with more than one object, we may later record extra conflicts in
2910 subobject 0 that we cannot really know about here.
2911 For now, simply widen the min/max range of these subobjects. */
2913 word0_min
= INT_MAX
;
2914 word0_max
= INT_MIN
;
2916 FOR_EACH_ALLOCNO (a
, ai
)
2918 int n
= ALLOCNO_NUM_OBJECTS (a
);
2923 obj0
= ALLOCNO_OBJECT (a
, 0);
2924 if (OBJECT_CONFLICT_ID (obj0
) < word0_min
)
2925 word0_min
= OBJECT_CONFLICT_ID (obj0
);
2926 if (OBJECT_CONFLICT_ID (obj0
) > word0_max
)
2927 word0_max
= OBJECT_CONFLICT_ID (obj0
);
2929 FOR_EACH_ALLOCNO (a
, ai
)
2931 int n
= ALLOCNO_NUM_OBJECTS (a
);
2936 obj0
= ALLOCNO_OBJECT (a
, 0);
2937 if (OBJECT_MIN (obj0
) > word0_min
)
2938 OBJECT_MIN (obj0
) = word0_min
;
2939 if (OBJECT_MAX (obj0
) < word0_max
)
2940 OBJECT_MAX (obj0
) = word0_max
;
2950 ira_allocno_iterator ai
;
2951 ira_loop_tree_node_t loop_tree_node
;
2953 FOR_EACH_ALLOCNO (a
, ai
)
2955 if (ALLOCNO_LOOP_TREE_NODE (a
) == ira_loop_tree_root
)
2957 if (ALLOCNO_CAP_MEMBER (a
) != NULL
)
2958 create_cap_allocno (a
);
2959 else if (ALLOCNO_CAP (a
) == NULL
)
2961 loop_tree_node
= ALLOCNO_LOOP_TREE_NODE (a
);
2962 if (!bitmap_bit_p (loop_tree_node
->border_allocnos
, ALLOCNO_NUM (a
)))
2963 create_cap_allocno (a
);
2970 /* The page contains code transforming more one region internal
2971 representation (IR) to one region IR which is necessary for reload.
2972 This transformation is called IR flattening. We might just rebuild
2973 the IR for one region but we don't do it because it takes a lot of
2976 /* Map: regno -> allocnos which will finally represent the regno for
2977 IR with one region. */
2978 static ira_allocno_t
*regno_top_level_allocno_map
;
2980 /* Find the allocno that corresponds to A at a level one higher up in the
2981 loop tree. Returns NULL if A is a cap, or if it has no parent. */
2983 ira_parent_allocno (ira_allocno_t a
)
2985 ira_loop_tree_node_t parent
;
2987 if (ALLOCNO_CAP (a
) != NULL
)
2990 parent
= ALLOCNO_LOOP_TREE_NODE (a
)->parent
;
2994 return parent
->regno_allocno_map
[ALLOCNO_REGNO (a
)];
2997 /* Find the allocno that corresponds to A at a level one higher up in the
2998 loop tree. If ALLOCNO_CAP is set for A, return that. */
3000 ira_parent_or_cap_allocno (ira_allocno_t a
)
3002 if (ALLOCNO_CAP (a
) != NULL
)
3003 return ALLOCNO_CAP (a
);
3005 return ira_parent_allocno (a
);
3008 /* Process all allocnos originated from pseudo REGNO and copy live
3009 ranges, hard reg conflicts, and allocno stack reg attributes from
3010 low level allocnos to final allocnos which are destinations of
3011 removed stores at a loop exit. Return true if we copied live
3014 copy_info_to_removed_store_destinations (int regno
)
3017 ira_allocno_t parent_a
= NULL
;
3018 ira_loop_tree_node_t parent
;
3022 for (a
= ira_regno_allocno_map
[regno
];
3024 a
= ALLOCNO_NEXT_REGNO_ALLOCNO (a
))
3026 if (a
!= regno_top_level_allocno_map
[REGNO (allocno_emit_reg (a
))])
3027 /* This allocno will be removed. */
3030 /* Caps will be removed. */
3031 ira_assert (ALLOCNO_CAP_MEMBER (a
) == NULL
);
3032 for (parent
= ALLOCNO_LOOP_TREE_NODE (a
)->parent
;
3034 parent
= parent
->parent
)
3035 if ((parent_a
= parent
->regno_allocno_map
[regno
]) == NULL
3037 == regno_top_level_allocno_map
[REGNO
3038 (allocno_emit_reg (parent_a
))]
3039 && ALLOCNO_EMIT_DATA (parent_a
)->mem_optimized_dest_p
))
3041 if (parent
== NULL
|| parent_a
== NULL
)
3044 copy_allocno_live_ranges (a
, parent_a
);
3045 merge_hard_reg_conflicts (a
, parent_a
, true);
3047 ALLOCNO_CALL_FREQ (parent_a
) += ALLOCNO_CALL_FREQ (a
);
3048 ALLOCNO_CALLS_CROSSED_NUM (parent_a
)
3049 += ALLOCNO_CALLS_CROSSED_NUM (a
);
3050 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (parent_a
)
3051 += ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a
);
3052 ALLOCNO_CROSSED_CALLS_ABIS (parent_a
)
3053 |= ALLOCNO_CROSSED_CALLS_ABIS (a
);
3054 ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (parent_a
)
3055 |= ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a
);
3056 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a
)
3057 += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a
);
3063 /* Flatten the IR. In other words, this function transforms IR as if
3064 it were built with one region (without loops). We could make it
3065 much simpler by rebuilding IR with one region, but unfortunately it
3066 takes a lot of time. MAX_REGNO_BEFORE_EMIT and
3067 IRA_MAX_POINT_BEFORE_EMIT are correspondingly MAX_REG_NUM () and
3068 IRA_MAX_POINT before emitting insns on the loop borders. */
3070 ira_flattening (int max_regno_before_emit
, int ira_max_point_before_emit
)
3075 bool new_pseudos_p
, merged_p
, mem_dest_p
;
3077 enum reg_class aclass
;
3078 ira_allocno_t a
, parent_a
, first
, second
, node_first
, node_second
;
3080 ira_loop_tree_node_t node
;
3082 ira_allocno_iterator ai
;
3083 ira_copy_iterator ci
;
3085 regno_top_level_allocno_map
3086 = (ira_allocno_t
*) ira_allocate (max_reg_num ()
3087 * sizeof (ira_allocno_t
));
3088 memset (regno_top_level_allocno_map
, 0,
3089 max_reg_num () * sizeof (ira_allocno_t
));
3090 new_pseudos_p
= merged_p
= false;
3091 FOR_EACH_ALLOCNO (a
, ai
)
3093 ira_allocno_object_iterator oi
;
3096 if (ALLOCNO_CAP_MEMBER (a
) != NULL
)
3097 /* Caps are not in the regno allocno maps and they are never
3098 will be transformed into allocnos existing after IR
3101 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, oi
)
3102 OBJECT_TOTAL_CONFLICT_HARD_REGS (obj
)
3103 = OBJECT_CONFLICT_HARD_REGS (obj
);
3105 ALLOCNO_TOTAL_NO_STACK_REG_P (a
) = ALLOCNO_NO_STACK_REG_P (a
);
3108 /* Fix final allocno attributes. */
3109 for (i
= max_regno_before_emit
- 1; i
>= FIRST_PSEUDO_REGISTER
; i
--)
3112 for (a
= ira_regno_allocno_map
[i
];
3114 a
= ALLOCNO_NEXT_REGNO_ALLOCNO (a
))
3116 ira_emit_data_t parent_data
, data
= ALLOCNO_EMIT_DATA (a
);
3118 ira_assert (ALLOCNO_CAP_MEMBER (a
) == NULL
);
3119 if (data
->somewhere_renamed_p
)
3120 new_pseudos_p
= true;
3121 parent_a
= ira_parent_allocno (a
);
3122 if (parent_a
== NULL
)
3124 ALLOCNO_COPIES (a
) = NULL
;
3125 regno_top_level_allocno_map
[REGNO (data
->reg
)] = a
;
3128 ira_assert (ALLOCNO_CAP_MEMBER (parent_a
) == NULL
);
3130 if (data
->mem_optimized_dest
!= NULL
)
3132 parent_data
= ALLOCNO_EMIT_DATA (parent_a
);
3133 if (REGNO (data
->reg
) == REGNO (parent_data
->reg
))
3135 merge_hard_reg_conflicts (a
, parent_a
, true);
3136 move_allocno_live_ranges (a
, parent_a
);
3138 parent_data
->mem_optimized_dest_p
3139 = (parent_data
->mem_optimized_dest_p
3140 || data
->mem_optimized_dest_p
);
3143 new_pseudos_p
= true;
3146 ALLOCNO_NREFS (parent_a
) -= ALLOCNO_NREFS (a
);
3147 ALLOCNO_FREQ (parent_a
) -= ALLOCNO_FREQ (a
);
3148 ALLOCNO_CALL_FREQ (parent_a
) -= ALLOCNO_CALL_FREQ (a
);
3149 ALLOCNO_CALLS_CROSSED_NUM (parent_a
)
3150 -= ALLOCNO_CALLS_CROSSED_NUM (a
);
3151 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (parent_a
)
3152 -= ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a
);
3153 /* Assume that ALLOCNO_CROSSED_CALLS_ABIS and
3154 ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS stay the same.
3155 We'd need to rebuild the IR to do better. */
3156 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a
)
3157 -= ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a
);
3158 ira_assert (ALLOCNO_CALLS_CROSSED_NUM (parent_a
) >= 0
3159 && ALLOCNO_NREFS (parent_a
) >= 0
3160 && ALLOCNO_FREQ (parent_a
) >= 0);
3161 aclass
= ALLOCNO_CLASS (parent_a
);
3162 hard_regs_num
= ira_class_hard_regs_num
[aclass
];
3163 if (ALLOCNO_HARD_REG_COSTS (a
) != NULL
3164 && ALLOCNO_HARD_REG_COSTS (parent_a
) != NULL
)
3165 for (j
= 0; j
< hard_regs_num
; j
++)
3166 ALLOCNO_HARD_REG_COSTS (parent_a
)[j
]
3167 -= ALLOCNO_HARD_REG_COSTS (a
)[j
];
3168 if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a
) != NULL
3169 && ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a
) != NULL
)
3170 for (j
= 0; j
< hard_regs_num
; j
++)
3171 ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a
)[j
]
3172 -= ALLOCNO_CONFLICT_HARD_REG_COSTS (a
)[j
];
3173 ALLOCNO_CLASS_COST (parent_a
)
3174 -= ALLOCNO_CLASS_COST (a
);
3175 ALLOCNO_MEMORY_COST (parent_a
) -= ALLOCNO_MEMORY_COST (a
);
3176 parent_a
= ira_parent_allocno (parent_a
);
3177 if (parent_a
== NULL
)
3180 ALLOCNO_COPIES (a
) = NULL
;
3181 regno_top_level_allocno_map
[REGNO (data
->reg
)] = a
;
3183 if (mem_dest_p
&& copy_info_to_removed_store_destinations (i
))
3186 ira_assert (new_pseudos_p
|| ira_max_point_before_emit
== ira_max_point
);
3187 if (merged_p
|| ira_max_point_before_emit
!= ira_max_point
)
3188 ira_rebuild_start_finish_chains ();
3191 sparseset objects_live
;
3193 /* Rebuild conflicts. */
3194 FOR_EACH_ALLOCNO (a
, ai
)
3196 ira_allocno_object_iterator oi
;
3199 if (a
!= regno_top_level_allocno_map
[REGNO (allocno_emit_reg (a
))]
3200 || ALLOCNO_CAP_MEMBER (a
) != NULL
)
3202 FOR_EACH_ALLOCNO_OBJECT (a
, obj
, oi
)
3204 for (r
= OBJECT_LIVE_RANGES (obj
); r
!= NULL
; r
= r
->next
)
3205 ira_assert (r
->object
== obj
);
3206 clear_conflicts (obj
);
3209 objects_live
= sparseset_alloc (ira_objects_num
);
3210 for (i
= 0; i
< ira_max_point
; i
++)
3212 for (r
= ira_start_point_ranges
[i
]; r
!= NULL
; r
= r
->start_next
)
3214 ira_object_t obj
= r
->object
;
3216 a
= OBJECT_ALLOCNO (obj
);
3217 if (a
!= regno_top_level_allocno_map
[REGNO (allocno_emit_reg (a
))]
3218 || ALLOCNO_CAP_MEMBER (a
) != NULL
)
3221 aclass
= ALLOCNO_CLASS (a
);
3222 EXECUTE_IF_SET_IN_SPARSESET (objects_live
, n
)
3224 ira_object_t live_obj
= ira_object_id_map
[n
];
3225 ira_allocno_t live_a
= OBJECT_ALLOCNO (live_obj
);
3226 enum reg_class live_aclass
= ALLOCNO_CLASS (live_a
);
3228 if (ira_reg_classes_intersect_p
[aclass
][live_aclass
]
3229 /* Don't set up conflict for the allocno with itself. */
3231 ira_add_conflict (obj
, live_obj
);
3233 sparseset_set_bit (objects_live
, OBJECT_CONFLICT_ID (obj
));
3236 for (r
= ira_finish_point_ranges
[i
]; r
!= NULL
; r
= r
->finish_next
)
3237 sparseset_clear_bit (objects_live
, OBJECT_CONFLICT_ID (r
->object
));
3239 sparseset_free (objects_live
);
3240 compress_conflict_vecs ();
3242 /* Mark some copies for removing and change allocnos in the rest
3244 FOR_EACH_COPY (cp
, ci
)
3246 if (ALLOCNO_CAP_MEMBER (cp
->first
) != NULL
3247 || ALLOCNO_CAP_MEMBER (cp
->second
) != NULL
)
3249 if (internal_flag_ira_verbose
> 4 && ira_dump_file
!= NULL
)
3251 (ira_dump_file
, " Remove cp%d:%c%dr%d-%c%dr%d\n",
3252 cp
->num
, ALLOCNO_CAP_MEMBER (cp
->first
) != NULL
? 'c' : 'a',
3253 ALLOCNO_NUM (cp
->first
),
3254 REGNO (allocno_emit_reg (cp
->first
)),
3255 ALLOCNO_CAP_MEMBER (cp
->second
) != NULL
? 'c' : 'a',
3256 ALLOCNO_NUM (cp
->second
),
3257 REGNO (allocno_emit_reg (cp
->second
)));
3258 cp
->loop_tree_node
= NULL
;
3262 = regno_top_level_allocno_map
[REGNO (allocno_emit_reg (cp
->first
))];
3264 = regno_top_level_allocno_map
[REGNO (allocno_emit_reg (cp
->second
))];
3265 node
= cp
->loop_tree_node
;
3267 keep_p
= true; /* It copy generated in ira-emit.c. */
3270 /* Check that the copy was not propagated from level on
3271 which we will have different pseudos. */
3272 node_first
= node
->regno_allocno_map
[ALLOCNO_REGNO (cp
->first
)];
3273 node_second
= node
->regno_allocno_map
[ALLOCNO_REGNO (cp
->second
)];
3274 keep_p
= ((REGNO (allocno_emit_reg (first
))
3275 == REGNO (allocno_emit_reg (node_first
)))
3276 && (REGNO (allocno_emit_reg (second
))
3277 == REGNO (allocno_emit_reg (node_second
))));
3281 cp
->loop_tree_node
= ira_loop_tree_root
;
3283 cp
->second
= second
;
3287 cp
->loop_tree_node
= NULL
;
3288 if (internal_flag_ira_verbose
> 4 && ira_dump_file
!= NULL
)
3289 fprintf (ira_dump_file
, " Remove cp%d:a%dr%d-a%dr%d\n",
3290 cp
->num
, ALLOCNO_NUM (cp
->first
),
3291 REGNO (allocno_emit_reg (cp
->first
)),
3292 ALLOCNO_NUM (cp
->second
),
3293 REGNO (allocno_emit_reg (cp
->second
)));
3296 /* Remove unnecessary allocnos on lower levels of the loop tree. */
3297 FOR_EACH_ALLOCNO (a
, ai
)
3299 if (a
!= regno_top_level_allocno_map
[REGNO (allocno_emit_reg (a
))]
3300 || ALLOCNO_CAP_MEMBER (a
) != NULL
)
3302 if (internal_flag_ira_verbose
> 4 && ira_dump_file
!= NULL
)
3303 fprintf (ira_dump_file
, " Remove a%dr%d\n",
3304 ALLOCNO_NUM (a
), REGNO (allocno_emit_reg (a
)));
3305 ira_remove_allocno_prefs (a
);
3309 ALLOCNO_LOOP_TREE_NODE (a
) = ira_loop_tree_root
;
3310 ALLOCNO_REGNO (a
) = REGNO (allocno_emit_reg (a
));
3311 ALLOCNO_CAP (a
) = NULL
;
3312 /* Restore updated costs for assignments from reload. */
3313 ALLOCNO_UPDATED_MEMORY_COST (a
) = ALLOCNO_MEMORY_COST (a
);
3314 ALLOCNO_UPDATED_CLASS_COST (a
) = ALLOCNO_CLASS_COST (a
);
3315 if (! ALLOCNO_ASSIGNED_P (a
))
3316 ira_free_allocno_updated_costs (a
);
3317 ira_assert (ALLOCNO_UPDATED_HARD_REG_COSTS (a
) == NULL
);
3318 ira_assert (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a
) == NULL
);
3320 /* Remove unnecessary copies. */
3321 FOR_EACH_COPY (cp
, ci
)
3323 if (cp
->loop_tree_node
== NULL
)
3325 ira_copies
[cp
->num
] = NULL
;
3330 (ALLOCNO_LOOP_TREE_NODE (cp
->first
) == ira_loop_tree_root
3331 && ALLOCNO_LOOP_TREE_NODE (cp
->second
) == ira_loop_tree_root
);
3332 add_allocno_copy_to_list (cp
);
3333 swap_allocno_copy_ends_if_necessary (cp
);
3335 rebuild_regno_allocno_maps ();
3336 if (ira_max_point
!= ira_max_point_before_emit
)
3337 ira_compress_allocno_live_ranges ();
3338 ira_free (regno_top_level_allocno_map
);
3343 #ifdef ENABLE_IRA_CHECKING
3344 /* Check creation of all allocnos. Allocnos on lower levels should
3345 have allocnos or caps on all upper levels. */
3347 check_allocno_creation (void)
3350 ira_allocno_iterator ai
;
3351 ira_loop_tree_node_t loop_tree_node
;
3353 FOR_EACH_ALLOCNO (a
, ai
)
3355 loop_tree_node
= ALLOCNO_LOOP_TREE_NODE (a
);
3356 ira_assert (bitmap_bit_p (loop_tree_node
->all_allocnos
,
3358 if (loop_tree_node
== ira_loop_tree_root
)
3360 if (ALLOCNO_CAP_MEMBER (a
) != NULL
)
3361 ira_assert (ALLOCNO_CAP (a
) != NULL
);
3362 else if (ALLOCNO_CAP (a
) == NULL
)
3363 ira_assert (loop_tree_node
->parent
3364 ->regno_allocno_map
[ALLOCNO_REGNO (a
)] != NULL
3365 && bitmap_bit_p (loop_tree_node
->border_allocnos
,
3371 /* Identify allocnos which prefer a register class with a single hard register.
3372 Adjust ALLOCNO_CONFLICT_HARD_REG_COSTS so that conflicting allocnos are
3373 less likely to use the preferred singleton register. */
3375 update_conflict_hard_reg_costs (void)
3378 ira_allocno_iterator ai
;
3381 FOR_EACH_ALLOCNO (a
, ai
)
3383 reg_class_t aclass
= ALLOCNO_CLASS (a
);
3384 reg_class_t pref
= reg_preferred_class (ALLOCNO_REGNO (a
));
3385 int singleton
= ira_class_singleton
[pref
][ALLOCNO_MODE (a
)];
3388 index
= ira_class_hard_reg_index
[(int) aclass
][singleton
];
3391 if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a
) == NULL
3392 || ALLOCNO_HARD_REG_COSTS (a
) == NULL
)
3395 for (i
= ira_class_hard_regs_num
[(int) aclass
] - 1; i
>= 0; i
--)
3396 if (ALLOCNO_HARD_REG_COSTS (a
)[i
] > ALLOCNO_CLASS_COST (a
)
3397 && min
> ALLOCNO_HARD_REG_COSTS (a
)[i
])
3398 min
= ALLOCNO_HARD_REG_COSTS (a
)[i
];
3401 ira_allocate_and_set_costs (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a
),
3403 ALLOCNO_CONFLICT_HARD_REG_COSTS (a
)[index
]
3404 -= min
- ALLOCNO_CLASS_COST (a
);
3408 /* Create a internal representation (IR) for IRA (allocnos, copies,
3409 loop tree nodes). The function returns TRUE if we generate loop
3410 structure (besides nodes representing all function and the basic
3411 blocks) for regional allocation. A true return means that we
3412 really need to flatten IR before the reload. */
3419 initiate_cost_vectors ();
3420 initiate_allocnos ();
3423 create_loop_tree_nodes ();
3427 create_allocno_objects ();
3428 ira_create_allocno_live_ranges ();
3429 remove_unnecessary_regions (false);
3430 ira_compress_allocno_live_ranges ();
3431 update_bad_spill_attribute ();
3432 loops_p
= more_one_region_p ();
3435 propagate_allocno_info ();
3438 ira_tune_allocno_costs ();
3439 #ifdef ENABLE_IRA_CHECKING
3440 check_allocno_creation ();
3442 setup_min_max_allocno_live_range_point ();
3443 sort_conflict_id_map ();
3444 setup_min_max_conflict_allocno_ids ();
3445 ira_build_conflicts ();
3446 update_conflict_hard_reg_costs ();
3447 if (! ira_conflicts_p
)
3450 ira_allocno_iterator ai
;
3452 /* Remove all regions but root one. */
3455 remove_unnecessary_regions (true);
3458 /* We don't save hard registers around calls for fast allocation
3459 -- add caller clobbered registers as conflicting ones to
3460 allocno crossing calls. */
3461 FOR_EACH_ALLOCNO (a
, ai
)
3462 if (ALLOCNO_CALLS_CROSSED_NUM (a
) != 0)
3463 ior_hard_reg_conflicts (a
, ira_need_caller_save_regs (a
));
3465 if (internal_flag_ira_verbose
> 2 && ira_dump_file
!= NULL
)
3466 print_copies (ira_dump_file
);
3467 if (internal_flag_ira_verbose
> 2 && ira_dump_file
!= NULL
)
3468 print_prefs (ira_dump_file
);
3469 if (internal_flag_ira_verbose
> 0 && ira_dump_file
!= NULL
)
3474 ira_allocno_iterator ai
;
3479 FOR_EACH_ALLOCNO (a
, ai
)
3481 int j
, nobj
= ALLOCNO_NUM_OBJECTS (a
);
3485 for (j
= 0; j
< nobj
; j
++)
3487 ira_object_t obj
= ALLOCNO_OBJECT (a
, j
);
3488 n
+= OBJECT_NUM_CONFLICTS (obj
);
3489 for (r
= OBJECT_LIVE_RANGES (obj
); r
!= NULL
; r
= r
->next
)
3493 fprintf (ira_dump_file
, " regions=%d, blocks=%d, points=%d\n",
3494 current_loops
== NULL
? 1 : number_of_loops (cfun
),
3495 n_basic_blocks_for_fn (cfun
), ira_max_point
);
3496 fprintf (ira_dump_file
,
3497 " allocnos=%d (big %d), copies=%d, conflicts=%d, ranges=%d\n",
3498 ira_allocnos_num
, nr_big
, ira_copies_num
, n
, nr
);
3503 /* Release the data created by function ira_build. */
3507 finish_loop_tree_nodes ();
3511 finish_cost_vectors ();
3512 ira_finish_allocno_live_ranges ();