1 /* Building internal representation for IRA.
2    Copyright (C) 2006-2022 Free Software Foundation, Inc.
3    Contributed by Vladimir Makarov <vmakarov@redhat.com>.
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11 
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "backend.h"
25 #include "target.h"
26 #include "rtl.h"
27 #include "predict.h"
28 #include "df.h"
29 #include "insn-config.h"
30 #include "regs.h"
31 #include "memmodel.h"
32 #include "ira.h"
33 #include "ira-int.h"
34 #include "sparseset.h"
35 #include "cfgloop.h"
36 
37 static ira_copy_t find_allocno_copy (ira_allocno_t, ira_allocno_t, rtx_insn *,
38                                              ira_loop_tree_node_t);
39 
40 /* The root of the loop tree corresponding to the all function.  */
41 ira_loop_tree_node_t ira_loop_tree_root;
42 
43 /* Height of the loop tree.  */
44 int ira_loop_tree_height;
45 
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;
50 
51 /* All nodes representing loops are referred through the following
52    array.  */
53 ira_loop_tree_node_t ira_loop_nodes;
54 
55 /* And size of the ira_loop_nodes array.  */
56 unsigned int ira_loop_nodes_count;
57 
58 /* Map regno -> allocnos with given regno (see comments for
59    allocno member `next_regno_allocno').  */
60 ira_allocno_t *ira_regno_allocno_map;
61 
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;
66 
67 /* Sizes of the previous array.  */
68 int ira_allocnos_num;
69 
70 /* Count of conflict record structures we've created, used when creating
71    a new conflict id.  */
72 int ira_objects_num;
73 
74 /* Map a conflict id to its conflict record.  */
75 ira_object_t *ira_object_id_map;
76 
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;
80 
81 /* Size of the previous array.  */
82 int ira_prefs_num;
83 
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
86    element value.  */
87 ira_copy_t *ira_copies;
88 
89 /* Size of the previous array.  */
90 int ira_copies_num;
91 
92 
93 
94 /* LAST_BASIC_BLOCK before generating additional insns because of live
95    range splitting.  Emitting insns on a critical edge creates a new
96    basic block.  */
97 static int last_basic_block_before_change;
98 
99 /* Initialize some members in loop tree node NODE.  Use LOOP_NUM for
100    the member loop_num.  */
101 static void
init_loop_tree_node(struct ira_loop_tree_node * node,int loop_num)102 init_loop_tree_node (struct ira_loop_tree_node *node, int loop_num)
103 {
104   int max_regno = max_reg_num ();
105 
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;
117 }
118 
119 
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.  */
124 static void
create_loop_tree_nodes(void)125 create_loop_tree_nodes (void)
126 {
127   unsigned int i, j;
128   bool skip_p;
129   edge_iterator ei;
130   edge e;
131   loop_p loop;
132 
133   ira_bb_nodes
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++)
139     {
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;
147     }
148   if (current_loops == NULL)
149     {
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);
154       return;
155     }
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)
161     {
162       if (loop_outer (loop) != NULL)
163           {
164             ira_loop_nodes[i].regno_allocno_map = NULL;
165             skip_p = false;
166             FOR_EACH_EDGE (e, ei, loop->header->preds)
167               if (e->src != loop->latch
168                     && (e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e))
169                 {
170                     skip_p = true;
171                     break;
172                 }
173             if (skip_p)
174               continue;
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))
178                 {
179                     skip_p = true;
180                     break;
181                 }
182             if (skip_p)
183               continue;
184           }
185       init_loop_tree_node (&ira_loop_nodes[i], loop->num);
186     }
187 }
188 
189 /* The function returns TRUE if there are more one allocation
190    region.  */
191 static bool
more_one_region_p(void)192 more_one_region_p (void)
193 {
194   unsigned int i;
195   loop_p loop;
196 
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])
201           return true;
202   return false;
203 }
204 
205 /* Free the loop tree node of a loop.  */
206 static void
finish_loop_tree_node(ira_loop_tree_node_t loop)207 finish_loop_tree_node (ira_loop_tree_node_t loop)
208 {
209   if (loop->regno_allocno_map != NULL)
210     {
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;
218     }
219 }
220 
221 /* Free the loop tree nodes.  */
222 static void
finish_loop_tree_nodes(void)223 finish_loop_tree_nodes (void)
224 {
225   unsigned int i;
226 
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++)
231     {
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);
242     }
243   ira_free (ira_bb_nodes);
244 }
245 
246 
247 
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
251    built.  */
252 static void
add_loop_to_tree(class loop * loop)253 add_loop_to_tree (class loop *loop)
254 {
255   int loop_num;
256   class loop *parent;
257   ira_loop_tree_node_t loop_node, parent_node;
258 
259   /* We cannot use loop node access macros here because of potential
260      checking and because the nodes are not initialized enough
261      yet.  */
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)
267     {
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;
272       if (loop == NULL)
273           parent = NULL;
274       else
275           {
276             for (parent = loop_outer (loop);
277                  parent != NULL;
278                  parent = loop_outer (parent))
279               if (ira_loop_nodes[parent->num].regno_allocno_map != NULL)
280                 break;
281           }
282       if (parent == NULL)
283           {
284             loop_node->next = NULL;
285             loop_node->subloop_next = NULL;
286             loop_node->parent = NULL;
287           }
288       else
289           {
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;
296           }
297     }
298 }
299 
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.  */
303 static int
setup_loop_tree_level(ira_loop_tree_node_t loop_node,int level)304 setup_loop_tree_level (ira_loop_tree_node_t loop_node, int level)
305 {
306   int height, max_height;
307   ira_loop_tree_node_t subloop_node;
308 
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)
315     {
316       ira_assert (subloop_node->bb == NULL);
317       height = setup_loop_tree_level (subloop_node, level + 1);
318       if (height > max_height)
319           max_height = height;
320     }
321   return max_height;
322 }
323 
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.  */
327 static void
form_loop_tree(void)328 form_loop_tree (void)
329 {
330   basic_block bb;
331   class loop *parent;
332   ira_loop_tree_node_t bb_node, loop_node;
333 
334   /* We cannot use loop/bb node access macros because of potential
335      checking and because the nodes are not initialized enough
336      yet.  */
337   FOR_EACH_BB_FN (bb, cfun)
338     {
339       bb_node = &ira_bb_nodes[bb->index];
340       bb_node->bb = bb;
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)
347           parent = NULL;
348       else
349           {
350             for (parent = bb->loop_father;
351                  parent != NULL;
352                  parent = loop_outer (parent))
353               if (ira_loop_nodes[parent->num].regno_allocno_map != NULL)
354                 break;
355           }
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;
361     }
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);
365 }
366 
367 
368 
369 /* Rebuild IRA_REGNO_ALLOCNO_MAP and REGNO_ALLOCNO_MAPs of the loop
370    tree nodes.  */
371 static void
rebuild_regno_allocno_maps(void)372 rebuild_regno_allocno_maps (void)
373 {
374   unsigned int l;
375   int max_regno, regno;
376   ira_allocno_t a;
377   ira_loop_tree_node_t loop_tree_node;
378   loop_p loop;
379   ira_allocno_iterator ai;
380 
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)
385       {
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)
389                                                       * max_regno);
390           memset (ira_loop_nodes[l].regno_allocno_map, 0,
391                     sizeof (ira_allocno_t) * max_regno);
392       }
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)
398     {
399       if (ALLOCNO_CAP_MEMBER (a) != NULL)
400           /* Caps are not in the regno allocno maps.  */
401           continue;
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;
410     }
411 }
412 
413 
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");
418 
419 /* Vec containing references to all created allocnos.  It is a
420    container of array allocnos.  */
421 static vec<ira_allocno_t> allocno_vec;
422 
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;
426 
427 /* Initialize data concerning allocnos.  */
428 static void
initiate_allocnos(void)429 initiate_allocnos (void)
430 {
431   allocno_vec.create (max_reg_num () * 2);
432   ira_allocnos = NULL;
433   ira_allocnos_num = 0;
434   ira_objects_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));
441 }
442 
443 /* Create and return an object corresponding to a new allocno A.  */
444 static ira_object_t
ira_create_object(ira_allocno_t a,int subword)445 ira_create_object (ira_allocno_t a, int subword)
446 {
447   enum reg_class aclass = ALLOCNO_CLASS (a);
448   ira_object_t obj = object_pool.allocate ();
449 
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;
463 
464   ira_object_id_map_vec.safe_push (obj);
465   ira_object_id_map
466     = ira_object_id_map_vec.address ();
467   ira_objects_num = ira_object_id_map_vec.length ();
468 
469   return obj;
470 }
471 
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.  */
475 ira_allocno_t
ira_create_allocno(int regno,bool cap_p,ira_loop_tree_node_t loop_tree_node)476 ira_create_allocno (int regno, bool cap_p,
477                         ira_loop_tree_node_t loop_tree_node)
478 {
479   ira_allocno_t a;
480 
481   a = allocno_pool.allocate ();
482   ALLOCNO_REGNO (a) = regno;
483   ALLOCNO_LOOP_TREE_NODE (a) = loop_tree_node;
484   if (! cap_p)
485     {
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
491              ira-emit.cc).  */
492           loop_tree_node->regno_allocno_map[regno] = a;
493     }
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_MIGHT_CONFLICT_WITH_PARENT_P (a) = false;
501   ALLOCNO_HARD_REGNO (a) = -1;
502   ALLOCNO_CALL_FREQ (a) = 0;
503   ALLOCNO_CALLS_CROSSED_NUM (a) = 0;
504   ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a) = 0;
505   ALLOCNO_CROSSED_CALLS_ABIS (a) = 0;
506   CLEAR_HARD_REG_SET (ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a));
507 #ifdef STACK_REGS
508   ALLOCNO_NO_STACK_REG_P (a) = false;
509   ALLOCNO_TOTAL_NO_STACK_REG_P (a) = false;
510 #endif
511   ALLOCNO_DONT_REASSIGN_P (a) = false;
512   ALLOCNO_BAD_SPILL_P (a) = false;
513   ALLOCNO_ASSIGNED_P (a) = false;
514   ALLOCNO_MODE (a) = (regno < 0 ? VOIDmode : PSEUDO_REGNO_MODE (regno));
515   ALLOCNO_WMODE (a) = ALLOCNO_MODE (a);
516   ALLOCNO_PREFS (a) = NULL;
517   ALLOCNO_COPIES (a) = NULL;
518   ALLOCNO_HARD_REG_COSTS (a) = NULL;
519   ALLOCNO_CONFLICT_HARD_REG_COSTS (a) = NULL;
520   ALLOCNO_UPDATED_HARD_REG_COSTS (a) = NULL;
521   ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) = NULL;
522   ALLOCNO_CLASS (a) = NO_REGS;
523   ALLOCNO_UPDATED_CLASS_COST (a) = 0;
524   ALLOCNO_CLASS_COST (a) = 0;
525   ALLOCNO_MEMORY_COST (a) = 0;
526   ALLOCNO_UPDATED_MEMORY_COST (a) = 0;
527   ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a) = 0;
528   ALLOCNO_NUM_OBJECTS (a) = 0;
529 
530   ALLOCNO_ADD_DATA (a) = NULL;
531   allocno_vec.safe_push (a);
532   ira_allocnos = allocno_vec.address ();
533   ira_allocnos_num = allocno_vec.length ();
534 
535   return a;
536 }
537 
538 /* Set up register class for A and update its conflict hard
539    registers.  */
540 void
ira_set_allocno_class(ira_allocno_t a,enum reg_class aclass)541 ira_set_allocno_class (ira_allocno_t a, enum reg_class aclass)
542 {
543   ira_allocno_object_iterator oi;
544   ira_object_t obj;
545 
546   ALLOCNO_CLASS (a) = aclass;
547   FOR_EACH_ALLOCNO_OBJECT (a, obj, oi)
548     {
549       OBJECT_CONFLICT_HARD_REGS (obj) |= ~reg_class_contents[aclass];
550       OBJECT_TOTAL_CONFLICT_HARD_REGS (obj) |= ~reg_class_contents[aclass];
551     }
552 }
553 
554 /* Determine the number of objects we should associate with allocno A
555    and allocate them.  */
556 void
ira_create_allocno_objects(ira_allocno_t a)557 ira_create_allocno_objects (ira_allocno_t a)
558 {
559   machine_mode mode = ALLOCNO_MODE (a);
560   enum reg_class aclass = ALLOCNO_CLASS (a);
561   int n = ira_reg_class_max_nregs[aclass][mode];
562   int i;
563 
564   if (n != 2 || maybe_ne (GET_MODE_SIZE (mode), n * UNITS_PER_WORD))
565     n = 1;
566 
567   ALLOCNO_NUM_OBJECTS (a) = n;
568   for (i = 0; i < n; i++)
569     ALLOCNO_OBJECT (a, i) = ira_create_object (a, i);
570 }
571 
572 /* For each allocno, set ALLOCNO_NUM_OBJECTS and create the
573    ALLOCNO_OBJECT structures.  This must be called after the allocno
574    classes are known.  */
575 static void
create_allocno_objects(void)576 create_allocno_objects (void)
577 {
578   ira_allocno_t a;
579   ira_allocno_iterator ai;
580 
581   FOR_EACH_ALLOCNO (a, ai)
582     ira_create_allocno_objects (a);
583 }
584 
585 /* Merge hard register conflict information for all objects associated with
586    allocno TO into the corresponding objects associated with FROM.
587    If TOTAL_ONLY is true, we only merge OBJECT_TOTAL_CONFLICT_HARD_REGS.  */
588 static void
merge_hard_reg_conflicts(ira_allocno_t from,ira_allocno_t to,bool total_only)589 merge_hard_reg_conflicts (ira_allocno_t from, ira_allocno_t to,
590                                 bool total_only)
591 {
592   int i;
593   gcc_assert (ALLOCNO_NUM_OBJECTS (to) == ALLOCNO_NUM_OBJECTS (from));
594   for (i = 0; i < ALLOCNO_NUM_OBJECTS (to); i++)
595     {
596       ira_object_t from_obj = ALLOCNO_OBJECT (from, i);
597       ira_object_t to_obj = ALLOCNO_OBJECT (to, i);
598 
599       if (!total_only)
600           OBJECT_CONFLICT_HARD_REGS (to_obj)
601             |= OBJECT_CONFLICT_HARD_REGS (from_obj);
602       OBJECT_TOTAL_CONFLICT_HARD_REGS (to_obj)
603           |= OBJECT_TOTAL_CONFLICT_HARD_REGS (from_obj);
604     }
605 #ifdef STACK_REGS
606   if (!total_only && ALLOCNO_NO_STACK_REG_P (from))
607     ALLOCNO_NO_STACK_REG_P (to) = true;
608   if (ALLOCNO_TOTAL_NO_STACK_REG_P (from))
609     ALLOCNO_TOTAL_NO_STACK_REG_P (to) = true;
610 #endif
611 }
612 
613 /* Update hard register conflict information for all objects associated with
614    A to include the regs in SET.  */
615 void
ior_hard_reg_conflicts(ira_allocno_t a,const_hard_reg_set set)616 ior_hard_reg_conflicts (ira_allocno_t a, const_hard_reg_set set)
617 {
618   ira_allocno_object_iterator i;
619   ira_object_t obj;
620 
621   FOR_EACH_ALLOCNO_OBJECT (a, obj, i)
622     {
623       OBJECT_CONFLICT_HARD_REGS (obj) |= set;
624       OBJECT_TOTAL_CONFLICT_HARD_REGS (obj) |= set;
625     }
626 }
627 
628 /* Return TRUE if a conflict vector with NUM elements is more
629    profitable than a conflict bit vector for OBJ.  */
630 bool
ira_conflict_vector_profitable_p(ira_object_t obj,int num)631 ira_conflict_vector_profitable_p (ira_object_t obj, int num)
632 {
633   int nbytes;
634   int max = OBJECT_MAX (obj);
635   int min = OBJECT_MIN (obj);
636 
637   if (max < min)
638     /* We prefer a bit vector in such case because it does not result
639        in allocation.  */
640     return false;
641 
642   nbytes = (max - min) / 8 + 1;
643   STATIC_ASSERT (sizeof (ira_object_t) <= 8);
644   /* Don't use sizeof (ira_object_t), use constant 8.  Size of ira_object_t (a
645      pointer) is different on 32-bit and 64-bit targets.  Usage sizeof
646      (ira_object_t) can result in different code generation by GCC built as 32-
647      and 64-bit program.  In any case the profitability is just an estimation
648      and border cases are rare.  */
649   return (2 * 8 /* sizeof (ira_object_t) */ * (num + 1) < 3 * nbytes);
650 }
651 
652 /* Allocates and initialize the conflict vector of OBJ for NUM
653    conflicting objects.  */
654 void
ira_allocate_conflict_vec(ira_object_t obj,int num)655 ira_allocate_conflict_vec (ira_object_t obj, int num)
656 {
657   int size;
658   ira_object_t *vec;
659 
660   ira_assert (OBJECT_CONFLICT_ARRAY (obj) == NULL);
661   num++; /* for NULL end marker  */
662   size = sizeof (ira_object_t) * num;
663   OBJECT_CONFLICT_ARRAY (obj) = ira_allocate (size);
664   vec = (ira_object_t *) OBJECT_CONFLICT_ARRAY (obj);
665   vec[0] = NULL;
666   OBJECT_NUM_CONFLICTS (obj) = 0;
667   OBJECT_CONFLICT_ARRAY_SIZE (obj) = size;
668   OBJECT_CONFLICT_VEC_P (obj) = true;
669 }
670 
671 /* Allocate and initialize the conflict bit vector of OBJ.  */
672 static void
allocate_conflict_bit_vec(ira_object_t obj)673 allocate_conflict_bit_vec (ira_object_t obj)
674 {
675   unsigned int size;
676 
677   ira_assert (OBJECT_CONFLICT_ARRAY (obj) == NULL);
678   size = ((OBJECT_MAX (obj) - OBJECT_MIN (obj) + IRA_INT_BITS)
679             / IRA_INT_BITS * sizeof (IRA_INT_TYPE));
680   OBJECT_CONFLICT_ARRAY (obj) = ira_allocate (size);
681   memset (OBJECT_CONFLICT_ARRAY (obj), 0, size);
682   OBJECT_CONFLICT_ARRAY_SIZE (obj) = size;
683   OBJECT_CONFLICT_VEC_P (obj) = false;
684 }
685 
686 /* Allocate and initialize the conflict vector or conflict bit vector
687    of OBJ for NUM conflicting allocnos whatever is more profitable.  */
688 void
ira_allocate_object_conflicts(ira_object_t obj,int num)689 ira_allocate_object_conflicts (ira_object_t obj, int num)
690 {
691   if (ira_conflict_vector_profitable_p (obj, num))
692     ira_allocate_conflict_vec (obj, num);
693   else
694     allocate_conflict_bit_vec (obj);
695 }
696 
697 /* Add OBJ2 to the conflicts of OBJ1.  */
698 static void
add_to_conflicts(ira_object_t obj1,ira_object_t obj2)699 add_to_conflicts (ira_object_t obj1, ira_object_t obj2)
700 {
701   int num;
702   unsigned int size;
703 
704   if (OBJECT_CONFLICT_VEC_P (obj1))
705     {
706       ira_object_t *vec = OBJECT_CONFLICT_VEC (obj1);
707       int curr_num = OBJECT_NUM_CONFLICTS (obj1);
708       num = curr_num + 2;
709       if (OBJECT_CONFLICT_ARRAY_SIZE (obj1) < num * sizeof (ira_object_t))
710           {
711             ira_object_t *newvec;
712             size = (3 * num / 2 + 1) * sizeof (ira_allocno_t);
713             newvec = (ira_object_t *) ira_allocate (size);
714             memcpy (newvec, vec, curr_num * sizeof (ira_object_t));
715             ira_free (vec);
716             vec = newvec;
717             OBJECT_CONFLICT_ARRAY (obj1) = vec;
718             OBJECT_CONFLICT_ARRAY_SIZE (obj1) = size;
719           }
720       vec[num - 2] = obj2;
721       vec[num - 1] = NULL;
722       OBJECT_NUM_CONFLICTS (obj1)++;
723     }
724   else
725     {
726       int nw, added_head_nw, id;
727       IRA_INT_TYPE *vec = OBJECT_CONFLICT_BITVEC (obj1);
728 
729       id = OBJECT_CONFLICT_ID (obj2);
730       if (OBJECT_MIN (obj1) > id)
731           {
732             /* Expand head of the bit vector.  */
733             added_head_nw = (OBJECT_MIN (obj1) - id - 1) / IRA_INT_BITS + 1;
734             nw = (OBJECT_MAX (obj1) - OBJECT_MIN (obj1)) / IRA_INT_BITS + 1;
735             size = (nw + added_head_nw) * sizeof (IRA_INT_TYPE);
736             if (OBJECT_CONFLICT_ARRAY_SIZE (obj1) >= size)
737               {
738                 memmove ((char *) vec + added_head_nw * sizeof (IRA_INT_TYPE),
739                            vec, nw * sizeof (IRA_INT_TYPE));
740                 memset (vec, 0, added_head_nw * sizeof (IRA_INT_TYPE));
741               }
742             else
743               {
744                 size
745                     = (3 * (nw + added_head_nw) / 2 + 1) * sizeof (IRA_INT_TYPE);
746                 vec = (IRA_INT_TYPE *) ira_allocate (size);
747                 memcpy ((char *) vec + added_head_nw * sizeof (IRA_INT_TYPE),
748                           OBJECT_CONFLICT_ARRAY (obj1), nw * sizeof (IRA_INT_TYPE));
749                 memset (vec, 0, added_head_nw * sizeof (IRA_INT_TYPE));
750                 memset ((char *) vec
751                           + (nw + added_head_nw) * sizeof (IRA_INT_TYPE),
752                           0, size - (nw + added_head_nw) * sizeof (IRA_INT_TYPE));
753                 ira_free (OBJECT_CONFLICT_ARRAY (obj1));
754                 OBJECT_CONFLICT_ARRAY (obj1) = vec;
755                 OBJECT_CONFLICT_ARRAY_SIZE (obj1) = size;
756               }
757             OBJECT_MIN (obj1) -= added_head_nw * IRA_INT_BITS;
758           }
759       else if (OBJECT_MAX (obj1) < id)
760           {
761             nw = (id - OBJECT_MIN (obj1)) / IRA_INT_BITS + 1;
762             size = nw * sizeof (IRA_INT_TYPE);
763             if (OBJECT_CONFLICT_ARRAY_SIZE (obj1) < size)
764               {
765                 /* Expand tail of the bit vector.  */
766                 size = (3 * nw / 2 + 1) * sizeof (IRA_INT_TYPE);
767                 vec = (IRA_INT_TYPE *) ira_allocate (size);
768                 memcpy (vec, OBJECT_CONFLICT_ARRAY (obj1), OBJECT_CONFLICT_ARRAY_SIZE (obj1));
769                 memset ((char *) vec + OBJECT_CONFLICT_ARRAY_SIZE (obj1),
770                           0, size - OBJECT_CONFLICT_ARRAY_SIZE (obj1));
771                 ira_free (OBJECT_CONFLICT_ARRAY (obj1));
772                 OBJECT_CONFLICT_ARRAY (obj1) = vec;
773                 OBJECT_CONFLICT_ARRAY_SIZE (obj1) = size;
774               }
775             OBJECT_MAX (obj1) = id;
776           }
777       SET_MINMAX_SET_BIT (vec, id, OBJECT_MIN (obj1), OBJECT_MAX (obj1));
778     }
779 }
780 
781 /* Add OBJ1 to the conflicts of OBJ2 and vice versa.  */
782 static void
ira_add_conflict(ira_object_t obj1,ira_object_t obj2)783 ira_add_conflict (ira_object_t obj1, ira_object_t obj2)
784 {
785   add_to_conflicts (obj1, obj2);
786   add_to_conflicts (obj2, obj1);
787 }
788 
789 /* Clear all conflicts of OBJ.  */
790 static void
clear_conflicts(ira_object_t obj)791 clear_conflicts (ira_object_t obj)
792 {
793   if (OBJECT_CONFLICT_VEC_P (obj))
794     {
795       OBJECT_NUM_CONFLICTS (obj) = 0;
796       OBJECT_CONFLICT_VEC (obj)[0] = NULL;
797     }
798   else if (OBJECT_CONFLICT_ARRAY_SIZE (obj) != 0)
799     {
800       int nw;
801 
802       nw = (OBJECT_MAX (obj) - OBJECT_MIN (obj)) / IRA_INT_BITS + 1;
803       memset (OBJECT_CONFLICT_BITVEC (obj), 0, nw * sizeof (IRA_INT_TYPE));
804     }
805 }
806 
807 /* The array used to find duplications in conflict vectors of
808    allocnos.  */
809 static int *conflict_check;
810 
811 /* The value used to mark allocation presence in conflict vector of
812    the current allocno.  */
813 static int curr_conflict_check_tick;
814 
815 /* Remove duplications in conflict vector of OBJ.  */
816 static void
compress_conflict_vec(ira_object_t obj)817 compress_conflict_vec (ira_object_t obj)
818 {
819   ira_object_t *vec, conflict_obj;
820   int i, j;
821 
822   ira_assert (OBJECT_CONFLICT_VEC_P (obj));
823   vec = OBJECT_CONFLICT_VEC (obj);
824   curr_conflict_check_tick++;
825   for (i = j = 0; (conflict_obj = vec[i]) != NULL; i++)
826     {
827       int id = OBJECT_CONFLICT_ID (conflict_obj);
828       if (conflict_check[id] != curr_conflict_check_tick)
829           {
830             conflict_check[id] = curr_conflict_check_tick;
831             vec[j++] = conflict_obj;
832           }
833     }
834   OBJECT_NUM_CONFLICTS (obj) = j;
835   vec[j] = NULL;
836 }
837 
838 /* Remove duplications in conflict vectors of all allocnos.  */
839 static void
compress_conflict_vecs(void)840 compress_conflict_vecs (void)
841 {
842   ira_object_t obj;
843   ira_object_iterator oi;
844 
845   conflict_check = (int *) ira_allocate (sizeof (int) * ira_objects_num);
846   memset (conflict_check, 0, sizeof (int) * ira_objects_num);
847   curr_conflict_check_tick = 0;
848   FOR_EACH_OBJECT (obj, oi)
849     {
850       if (OBJECT_CONFLICT_VEC_P (obj))
851           compress_conflict_vec (obj);
852     }
853   ira_free (conflict_check);
854 }
855 
856 /* This recursive function outputs allocno A and if it is a cap the
857    function outputs its members.  */
858 void
ira_print_expanded_allocno(ira_allocno_t a)859 ira_print_expanded_allocno (ira_allocno_t a)
860 {
861   basic_block bb;
862 
863   fprintf (ira_dump_file, " a%d(r%d", ALLOCNO_NUM (a), ALLOCNO_REGNO (a));
864   if ((bb = ALLOCNO_LOOP_TREE_NODE (a)->bb) != NULL)
865     fprintf (ira_dump_file, ",b%d", bb->index);
866   else
867     fprintf (ira_dump_file, ",l%d", ALLOCNO_LOOP_TREE_NODE (a)->loop_num);
868   if (ALLOCNO_CAP_MEMBER (a) != NULL)
869     {
870       fprintf (ira_dump_file, ":");
871       ira_print_expanded_allocno (ALLOCNO_CAP_MEMBER (a));
872     }
873   fprintf (ira_dump_file, ")");
874 }
875 
876 /* Create and return the cap representing allocno A in the
877    parent loop.  */
878 static ira_allocno_t
create_cap_allocno(ira_allocno_t a)879 create_cap_allocno (ira_allocno_t a)
880 {
881   ira_allocno_t cap;
882   ira_loop_tree_node_t parent;
883   enum reg_class aclass;
884 
885   parent = ALLOCNO_LOOP_TREE_NODE (a)->parent;
886   cap = ira_create_allocno (ALLOCNO_REGNO (a), true, parent);
887   ALLOCNO_MODE (cap) = ALLOCNO_MODE (a);
888   ALLOCNO_WMODE (cap) = ALLOCNO_WMODE (a);
889   aclass = ALLOCNO_CLASS (a);
890   ira_set_allocno_class (cap, aclass);
891   ira_create_allocno_objects (cap);
892   ALLOCNO_CAP_MEMBER (cap) = a;
893   ALLOCNO_CAP (a) = cap;
894   ALLOCNO_CLASS_COST (cap) = ALLOCNO_CLASS_COST (a);
895   ALLOCNO_MEMORY_COST (cap) = ALLOCNO_MEMORY_COST (a);
896   ira_allocate_and_copy_costs
897     (&ALLOCNO_HARD_REG_COSTS (cap), aclass, ALLOCNO_HARD_REG_COSTS (a));
898   ira_allocate_and_copy_costs
899     (&ALLOCNO_CONFLICT_HARD_REG_COSTS (cap), aclass,
900      ALLOCNO_CONFLICT_HARD_REG_COSTS (a));
901   ALLOCNO_BAD_SPILL_P (cap) = ALLOCNO_BAD_SPILL_P (a);
902   ALLOCNO_NREFS (cap) = ALLOCNO_NREFS (a);
903   ALLOCNO_FREQ (cap) = ALLOCNO_FREQ (a);
904   ALLOCNO_CALL_FREQ (cap) = ALLOCNO_CALL_FREQ (a);
905 
906   merge_hard_reg_conflicts (a, cap, false);
907 
908   ALLOCNO_CALLS_CROSSED_NUM (cap) = ALLOCNO_CALLS_CROSSED_NUM (a);
909   ALLOCNO_CHEAP_CALLS_CROSSED_NUM (cap) = ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a);
910   ALLOCNO_CROSSED_CALLS_ABIS (cap) = ALLOCNO_CROSSED_CALLS_ABIS (a);
911   ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (cap)
912     = ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a);
913   if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
914     {
915       fprintf (ira_dump_file, "    Creating cap ");
916       ira_print_expanded_allocno (cap);
917       fprintf (ira_dump_file, "\n");
918     }
919   return cap;
920 }
921 
922 /* Create and return a live range for OBJECT with given attributes.  */
923 live_range_t
ira_create_live_range(ira_object_t obj,int start,int finish,live_range_t next)924 ira_create_live_range (ira_object_t obj, int start, int finish,
925                            live_range_t next)
926 {
927   live_range_t p;
928 
929   p = live_range_pool.allocate ();
930   p->object = obj;
931   p->start = start;
932   p->finish = finish;
933   p->next = next;
934   return p;
935 }
936 
937 /* Create a new live range for OBJECT and queue it at the head of its
938    live range list.  */
939 void
ira_add_live_range_to_object(ira_object_t object,int start,int finish)940 ira_add_live_range_to_object (ira_object_t object, int start, int finish)
941 {
942   live_range_t p;
943   p = ira_create_live_range (object, start, finish,
944                                    OBJECT_LIVE_RANGES (object));
945   OBJECT_LIVE_RANGES (object) = p;
946 }
947 
948 /* Copy allocno live range R and return the result.  */
949 static live_range_t
copy_live_range(live_range_t r)950 copy_live_range (live_range_t r)
951 {
952   live_range_t p;
953 
954   p = live_range_pool.allocate ();
955   *p = *r;
956   return p;
957 }
958 
959 /* Copy allocno live range list given by its head R and return the
960    result.  */
961 live_range_t
ira_copy_live_range_list(live_range_t r)962 ira_copy_live_range_list (live_range_t r)
963 {
964   live_range_t p, first, last;
965 
966   if (r == NULL)
967     return NULL;
968   for (first = last = NULL; r != NULL; r = r->next)
969     {
970       p = copy_live_range (r);
971       if (first == NULL)
972           first = p;
973       else
974           last->next = p;
975       last = p;
976     }
977   return first;
978 }
979 
980 /* Merge ranges R1 and R2 and returns the result.  The function
981    maintains the order of ranges and tries to minimize number of the
982    result ranges.  */
983 live_range_t
ira_merge_live_ranges(live_range_t r1,live_range_t r2)984 ira_merge_live_ranges (live_range_t r1, live_range_t r2)
985 {
986   live_range_t first, last;
987 
988   if (r1 == NULL)
989     return r2;
990   if (r2 == NULL)
991     return r1;
992   for (first = last = NULL; r1 != NULL && r2 != NULL;)
993     {
994       if (r1->start < r2->start)
995           std::swap (r1, r2);
996       if (r1->start <= r2->finish + 1)
997           {
998             /* Intersected ranges: merge r1 and r2 into r1.  */
999             r1->start = r2->start;
1000             if (r1->finish < r2->finish)
1001               r1->finish = r2->finish;
1002             live_range_t temp = r2;
1003             r2 = r2->next;
1004             ira_finish_live_range (temp);
1005             if (r2 == NULL)
1006               {
1007                 /* To try to merge with subsequent ranges in r1.  */
1008                 r2 = r1->next;
1009                 r1->next = NULL;
1010               }
1011           }
1012       else
1013           {
1014             /* Add r1 to the result.  */
1015             if (first == NULL)
1016               first = last = r1;
1017             else
1018               {
1019                 last->next = r1;
1020                 last = r1;
1021               }
1022             r1 = r1->next;
1023             if (r1 == NULL)
1024               {
1025                 /* To try to merge with subsequent ranges in r2.  */
1026                 r1 = r2->next;
1027                 r2->next = NULL;
1028               }
1029           }
1030     }
1031   if (r1 != NULL)
1032     {
1033       if (first == NULL)
1034           first = r1;
1035       else
1036           last->next = r1;
1037       ira_assert (r1->next == NULL);
1038     }
1039   else if (r2 != NULL)
1040     {
1041       if (first == NULL)
1042           first = r2;
1043       else
1044           last->next = r2;
1045       ira_assert (r2->next == NULL);
1046     }
1047   else
1048     {
1049       ira_assert (last->next == NULL);
1050     }
1051   return first;
1052 }
1053 
1054 /* Return TRUE if live ranges R1 and R2 intersect.  */
1055 bool
ira_live_ranges_intersect_p(live_range_t r1,live_range_t r2)1056 ira_live_ranges_intersect_p (live_range_t r1, live_range_t r2)
1057 {
1058   /* Remember the live ranges are always kept ordered.  */
1059   while (r1 != NULL && r2 != NULL)
1060     {
1061       if (r1->start > r2->finish)
1062           r1 = r1->next;
1063       else if (r2->start > r1->finish)
1064           r2 = r2->next;
1065       else
1066           return true;
1067     }
1068   return false;
1069 }
1070 
1071 /* Free allocno live range R.  */
1072 void
ira_finish_live_range(live_range_t r)1073 ira_finish_live_range (live_range_t r)
1074 {
1075   live_range_pool.remove (r);
1076 }
1077 
1078 /* Free list of allocno live ranges starting with R.  */
1079 void
ira_finish_live_range_list(live_range_t r)1080 ira_finish_live_range_list (live_range_t r)
1081 {
1082   live_range_t next_r;
1083 
1084   for (; r != NULL; r = next_r)
1085     {
1086       next_r = r->next;
1087       ira_finish_live_range (r);
1088     }
1089 }
1090 
1091 /* Free updated register costs of allocno A.  */
1092 void
ira_free_allocno_updated_costs(ira_allocno_t a)1093 ira_free_allocno_updated_costs (ira_allocno_t a)
1094 {
1095   enum reg_class aclass;
1096 
1097   aclass = ALLOCNO_CLASS (a);
1098   if (ALLOCNO_UPDATED_HARD_REG_COSTS (a) != NULL)
1099     ira_free_cost_vector (ALLOCNO_UPDATED_HARD_REG_COSTS (a), aclass);
1100   ALLOCNO_UPDATED_HARD_REG_COSTS (a) = NULL;
1101   if (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) != NULL)
1102     ira_free_cost_vector (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a),
1103                                 aclass);
1104   ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) = NULL;
1105 }
1106 
1107 /* Free and nullify all cost vectors allocated earlier for allocno
1108    A.  */
1109 static void
ira_free_allocno_costs(ira_allocno_t a)1110 ira_free_allocno_costs (ira_allocno_t a)
1111 {
1112   enum reg_class aclass = ALLOCNO_CLASS (a);
1113   ira_object_t obj;
1114   ira_allocno_object_iterator oi;
1115 
1116   FOR_EACH_ALLOCNO_OBJECT (a, obj, oi)
1117     {
1118       ira_finish_live_range_list (OBJECT_LIVE_RANGES (obj));
1119       ira_object_id_map[OBJECT_CONFLICT_ID (obj)] = NULL;
1120       if (OBJECT_CONFLICT_ARRAY (obj) != NULL)
1121           ira_free (OBJECT_CONFLICT_ARRAY (obj));
1122       object_pool.remove (obj);
1123     }
1124 
1125   ira_allocnos[ALLOCNO_NUM (a)] = NULL;
1126   if (ALLOCNO_HARD_REG_COSTS (a) != NULL)
1127     ira_free_cost_vector (ALLOCNO_HARD_REG_COSTS (a), aclass);
1128   if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a) != NULL)
1129     ira_free_cost_vector (ALLOCNO_CONFLICT_HARD_REG_COSTS (a), aclass);
1130   if (ALLOCNO_UPDATED_HARD_REG_COSTS (a) != NULL)
1131     ira_free_cost_vector (ALLOCNO_UPDATED_HARD_REG_COSTS (a), aclass);
1132   if (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) != NULL)
1133     ira_free_cost_vector (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a),
1134                                 aclass);
1135   ALLOCNO_HARD_REG_COSTS (a) = NULL;
1136   ALLOCNO_CONFLICT_HARD_REG_COSTS (a) = NULL;
1137   ALLOCNO_UPDATED_HARD_REG_COSTS (a) = NULL;
1138   ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) = NULL;
1139 }
1140 
1141 /* Free the memory allocated for allocno A.  */
1142 static void
finish_allocno(ira_allocno_t a)1143 finish_allocno (ira_allocno_t a)
1144 {
1145   ira_free_allocno_costs (a);
1146   allocno_pool.remove (a);
1147 }
1148 
1149 /* Free the memory allocated for all allocnos.  */
1150 static void
finish_allocnos(void)1151 finish_allocnos (void)
1152 {
1153   ira_allocno_t a;
1154   ira_allocno_iterator ai;
1155 
1156   FOR_EACH_ALLOCNO (a, ai)
1157     finish_allocno (a);
1158   ira_free (ira_regno_allocno_map);
1159   ira_object_id_map_vec.release ();
1160   allocno_vec.release ();
1161   allocno_pool.release ();
1162   object_pool.release ();
1163   live_range_pool.release ();
1164 }
1165 
1166 
1167 
1168 /* Pools for allocno preferences.  */
1169 static object_allocator <ira_allocno_pref> pref_pool ("prefs");
1170 
1171 /* Vec containing references to all created preferences.  It is a
1172    container of array ira_prefs.  */
1173 static vec<ira_pref_t> pref_vec;
1174 
1175 /* The function initializes data concerning allocno prefs.  */
1176 static void
initiate_prefs(void)1177 initiate_prefs (void)
1178 {
1179   pref_vec.create (get_max_uid ());
1180   ira_prefs = NULL;
1181   ira_prefs_num = 0;
1182 }
1183 
1184 /* Return pref for A and HARD_REGNO if any.  */
1185 static ira_pref_t
find_allocno_pref(ira_allocno_t a,int hard_regno)1186 find_allocno_pref (ira_allocno_t a, int hard_regno)
1187 {
1188   ira_pref_t pref;
1189 
1190   for (pref = ALLOCNO_PREFS (a); pref != NULL; pref = pref->next_pref)
1191     if (pref->allocno == a && pref->hard_regno == hard_regno)
1192       return pref;
1193   return NULL;
1194 }
1195 
1196 /* Create and return pref with given attributes A, HARD_REGNO, and FREQ.  */
1197 ira_pref_t
ira_create_pref(ira_allocno_t a,int hard_regno,int freq)1198 ira_create_pref (ira_allocno_t a, int hard_regno, int freq)
1199 {
1200   ira_pref_t pref;
1201 
1202   pref = pref_pool.allocate ();
1203   pref->num = ira_prefs_num;
1204   pref->allocno = a;
1205   pref->hard_regno = hard_regno;
1206   pref->freq = freq;
1207   pref_vec.safe_push (pref);
1208   ira_prefs = pref_vec.address ();
1209   ira_prefs_num = pref_vec.length ();
1210   return pref;
1211 }
1212 
1213 /* Attach a pref PREF to the corresponding allocno.  */
1214 static void
add_allocno_pref_to_list(ira_pref_t pref)1215 add_allocno_pref_to_list (ira_pref_t pref)
1216 {
1217   ira_allocno_t a = pref->allocno;
1218 
1219   pref->next_pref = ALLOCNO_PREFS (a);
1220   ALLOCNO_PREFS (a) = pref;
1221 }
1222 
1223 /* Create (or update frequency if the pref already exists) the pref of
1224    allocnos A preferring HARD_REGNO with frequency FREQ.  */
1225 void
ira_add_allocno_pref(ira_allocno_t a,int hard_regno,int freq)1226 ira_add_allocno_pref (ira_allocno_t a, int hard_regno, int freq)
1227 {
1228   ira_pref_t pref;
1229 
1230   if (freq <= 0)
1231     return;
1232   if ((pref = find_allocno_pref (a, hard_regno)) != NULL)
1233     {
1234       pref->freq += freq;
1235       return;
1236     }
1237   pref = ira_create_pref (a, hard_regno, freq);
1238   ira_assert (a != NULL);
1239   add_allocno_pref_to_list (pref);
1240 }
1241 
1242 /* Print info about PREF into file F.  */
1243 static void
print_pref(FILE * f,ira_pref_t pref)1244 print_pref (FILE *f, ira_pref_t pref)
1245 {
1246   fprintf (f, "  pref%d:a%d(r%d)<-hr%d@%d\n", pref->num,
1247              ALLOCNO_NUM (pref->allocno), ALLOCNO_REGNO (pref->allocno),
1248              pref->hard_regno, pref->freq);
1249 }
1250 
1251 /* Print info about PREF into stderr.  */
1252 void
ira_debug_pref(ira_pref_t pref)1253 ira_debug_pref (ira_pref_t pref)
1254 {
1255   print_pref (stderr, pref);
1256 }
1257 
1258 /* Print info about all prefs into file F.  */
1259 static void
print_prefs(FILE * f)1260 print_prefs (FILE *f)
1261 {
1262   ira_pref_t pref;
1263   ira_pref_iterator pi;
1264 
1265   FOR_EACH_PREF (pref, pi)
1266     print_pref (f, pref);
1267 }
1268 
1269 /* Print info about all prefs into stderr.  */
1270 void
ira_debug_prefs(void)1271 ira_debug_prefs (void)
1272 {
1273   print_prefs (stderr);
1274 }
1275 
1276 /* Print info about prefs involving allocno A into file F.  */
1277 static void
print_allocno_prefs(FILE * f,ira_allocno_t a)1278 print_allocno_prefs (FILE *f, ira_allocno_t a)
1279 {
1280   ira_pref_t pref;
1281 
1282   fprintf (f, " a%d(r%d):", ALLOCNO_NUM (a), ALLOCNO_REGNO (a));
1283   for (pref = ALLOCNO_PREFS (a); pref != NULL; pref = pref->next_pref)
1284     fprintf (f, " pref%d:hr%d@%d", pref->num, pref->hard_regno, pref->freq);
1285   fprintf (f, "\n");
1286 }
1287 
1288 /* Print info about prefs involving allocno A into stderr.  */
1289 void
ira_debug_allocno_prefs(ira_allocno_t a)1290 ira_debug_allocno_prefs (ira_allocno_t a)
1291 {
1292   print_allocno_prefs (stderr, a);
1293 }
1294 
1295 /* The function frees memory allocated for PREF.  */
1296 static void
finish_pref(ira_pref_t pref)1297 finish_pref (ira_pref_t pref)
1298 {
1299   ira_prefs[pref->num] = NULL;
1300   pref_pool.remove (pref);
1301 }
1302 
1303 /* Remove PREF from the list of allocno prefs and free memory for
1304    it.  */
1305 void
ira_remove_pref(ira_pref_t pref)1306 ira_remove_pref (ira_pref_t pref)
1307 {
1308   ira_pref_t cpref, prev;
1309 
1310   if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
1311     fprintf (ira_dump_file, " Removing pref%d:hr%d@%d\n",
1312                pref->num, pref->hard_regno, pref->freq);
1313   for (prev = NULL, cpref = ALLOCNO_PREFS (pref->allocno);
1314        cpref != NULL;
1315        prev = cpref, cpref = cpref->next_pref)
1316     if (cpref == pref)
1317       break;
1318   ira_assert (cpref != NULL);
1319   if (prev == NULL)
1320     ALLOCNO_PREFS (pref->allocno) = pref->next_pref;
1321   else
1322     prev->next_pref = pref->next_pref;
1323   finish_pref (pref);
1324 }
1325 
1326 /* Remove all prefs of allocno A.  */
1327 void
ira_remove_allocno_prefs(ira_allocno_t a)1328 ira_remove_allocno_prefs (ira_allocno_t a)
1329 {
1330   ira_pref_t pref, next_pref;
1331 
1332   for (pref = ALLOCNO_PREFS (a); pref != NULL; pref = next_pref)
1333     {
1334       next_pref = pref->next_pref;
1335       finish_pref (pref);
1336     }
1337   ALLOCNO_PREFS (a) = NULL;
1338 }
1339 
1340 /* Free memory allocated for all prefs.  */
1341 static void
finish_prefs(void)1342 finish_prefs (void)
1343 {
1344   ira_pref_t pref;
1345   ira_pref_iterator pi;
1346 
1347   FOR_EACH_PREF (pref, pi)
1348     finish_pref (pref);
1349   pref_vec.release ();
1350   pref_pool.release ();
1351 }
1352 
1353 
1354 
1355 /* Pools for copies.  */
1356 static object_allocator<ira_allocno_copy> copy_pool ("copies");
1357 
1358 /* Vec containing references to all created copies.  It is a
1359    container of array ira_copies.  */
1360 static vec<ira_copy_t> copy_vec;
1361 
1362 /* The function initializes data concerning allocno copies.  */
1363 static void
initiate_copies(void)1364 initiate_copies (void)
1365 {
1366   copy_vec.create (get_max_uid ());
1367   ira_copies = NULL;
1368   ira_copies_num = 0;
1369 }
1370 
1371 /* Return copy connecting A1 and A2 and originated from INSN of
1372    LOOP_TREE_NODE if any.  */
1373 static ira_copy_t
find_allocno_copy(ira_allocno_t a1,ira_allocno_t a2,rtx_insn * insn,ira_loop_tree_node_t loop_tree_node)1374 find_allocno_copy (ira_allocno_t a1, ira_allocno_t a2, rtx_insn *insn,
1375                        ira_loop_tree_node_t loop_tree_node)
1376 {
1377   ira_copy_t cp, next_cp;
1378   ira_allocno_t another_a;
1379 
1380   for (cp = ALLOCNO_COPIES (a1); cp != NULL; cp = next_cp)
1381     {
1382       if (cp->first == a1)
1383           {
1384             next_cp = cp->next_first_allocno_copy;
1385             another_a = cp->second;
1386           }
1387       else if (cp->second == a1)
1388           {
1389             next_cp = cp->next_second_allocno_copy;
1390             another_a = cp->first;
1391           }
1392       else
1393           gcc_unreachable ();
1394       if (another_a == a2 && cp->insn == insn
1395             && cp->loop_tree_node == loop_tree_node)
1396           return cp;
1397     }
1398   return NULL;
1399 }
1400 
1401 /* Create and return copy with given attributes LOOP_TREE_NODE, FIRST,
1402    SECOND, FREQ, CONSTRAINT_P, and INSN.  */
1403 ira_copy_t
ira_create_copy(ira_allocno_t first,ira_allocno_t second,int freq,bool constraint_p,rtx_insn * insn,ira_loop_tree_node_t loop_tree_node)1404 ira_create_copy (ira_allocno_t first, ira_allocno_t second, int freq,
1405                      bool constraint_p, rtx_insn *insn,
1406                      ira_loop_tree_node_t loop_tree_node)
1407 {
1408   ira_copy_t cp;
1409 
1410   cp = copy_pool.allocate ();
1411   cp->num = ira_copies_num;
1412   cp->first = first;
1413   cp->second = second;
1414   cp->freq = freq;
1415   cp->constraint_p = constraint_p;
1416   cp->insn = insn;
1417   cp->loop_tree_node = loop_tree_node;
1418   copy_vec.safe_push (cp);
1419   ira_copies = copy_vec.address ();
1420   ira_copies_num = copy_vec.length ();
1421   return cp;
1422 }
1423 
1424 /* Attach a copy CP to allocnos involved into the copy.  */
1425 static void
add_allocno_copy_to_list(ira_copy_t cp)1426 add_allocno_copy_to_list (ira_copy_t cp)
1427 {
1428   ira_allocno_t first = cp->first, second = cp->second;
1429 
1430   cp->prev_first_allocno_copy = NULL;
1431   cp->prev_second_allocno_copy = NULL;
1432   cp->next_first_allocno_copy = ALLOCNO_COPIES (first);
1433   if (cp->next_first_allocno_copy != NULL)
1434     {
1435       if (cp->next_first_allocno_copy->first == first)
1436           cp->next_first_allocno_copy->prev_first_allocno_copy = cp;
1437       else
1438           cp->next_first_allocno_copy->prev_second_allocno_copy = cp;
1439     }
1440   cp->next_second_allocno_copy = ALLOCNO_COPIES (second);
1441   if (cp->next_second_allocno_copy != NULL)
1442     {
1443       if (cp->next_second_allocno_copy->second == second)
1444           cp->next_second_allocno_copy->prev_second_allocno_copy = cp;
1445       else
1446           cp->next_second_allocno_copy->prev_first_allocno_copy = cp;
1447     }
1448   ALLOCNO_COPIES (first) = cp;
1449   ALLOCNO_COPIES (second) = cp;
1450 }
1451 
1452 /* Make a copy CP a canonical copy where number of the
1453    first allocno is less than the second one.  */
1454 static void
swap_allocno_copy_ends_if_necessary(ira_copy_t cp)1455 swap_allocno_copy_ends_if_necessary (ira_copy_t cp)
1456 {
1457   if (ALLOCNO_NUM (cp->first) <= ALLOCNO_NUM (cp->second))
1458     return;
1459 
1460   std::swap (cp->first, cp->second);
1461   std::swap (cp->prev_first_allocno_copy, cp->prev_second_allocno_copy);
1462   std::swap (cp->next_first_allocno_copy, cp->next_second_allocno_copy);
1463 }
1464 
1465 /* Create (or update frequency if the copy already exists) and return
1466    the copy of allocnos FIRST and SECOND with frequency FREQ
1467    corresponding to move insn INSN (if any) and originated from
1468    LOOP_TREE_NODE.  */
1469 ira_copy_t
ira_add_allocno_copy(ira_allocno_t first,ira_allocno_t second,int freq,bool constraint_p,rtx_insn * insn,ira_loop_tree_node_t loop_tree_node)1470 ira_add_allocno_copy (ira_allocno_t first, ira_allocno_t second, int freq,
1471                           bool constraint_p, rtx_insn *insn,
1472                           ira_loop_tree_node_t loop_tree_node)
1473 {
1474   ira_copy_t cp;
1475 
1476   if ((cp = find_allocno_copy (first, second, insn, loop_tree_node)) != NULL)
1477     {
1478       cp->freq += freq;
1479       return cp;
1480     }
1481   cp = ira_create_copy (first, second, freq, constraint_p, insn,
1482                               loop_tree_node);
1483   ira_assert (first != NULL && second != NULL);
1484   add_allocno_copy_to_list (cp);
1485   swap_allocno_copy_ends_if_necessary (cp);
1486   return cp;
1487 }
1488 
1489 /* Print info about copy CP into file F.  */
1490 static void
print_copy(FILE * f,ira_copy_t cp)1491 print_copy (FILE *f, ira_copy_t cp)
1492 {
1493   fprintf (f, "  cp%d:a%d(r%d)<->a%d(r%d)@%d:%s\n", cp->num,
1494              ALLOCNO_NUM (cp->first), ALLOCNO_REGNO (cp->first),
1495              ALLOCNO_NUM (cp->second), ALLOCNO_REGNO (cp->second), cp->freq,
1496              cp->insn != NULL
1497              ? "move" : cp->constraint_p ? "constraint" : "shuffle");
1498 }
1499 
1500 DEBUG_FUNCTION void
debug(ira_allocno_copy & ref)1501 debug (ira_allocno_copy &ref)
1502 {
1503   print_copy (stderr, &ref);
1504 }
1505 
1506 DEBUG_FUNCTION void
debug(ira_allocno_copy * ptr)1507 debug (ira_allocno_copy *ptr)
1508 {
1509   if (ptr)
1510     debug (*ptr);
1511   else
1512     fprintf (stderr, "<nil>\n");
1513 }
1514 
1515 /* Print info about copy CP into stderr.  */
1516 void
ira_debug_copy(ira_copy_t cp)1517 ira_debug_copy (ira_copy_t cp)
1518 {
1519   print_copy (stderr, cp);
1520 }
1521 
1522 /* Print info about all copies into file F.  */
1523 static void
print_copies(FILE * f)1524 print_copies (FILE *f)
1525 {
1526   ira_copy_t cp;
1527   ira_copy_iterator ci;
1528 
1529   FOR_EACH_COPY (cp, ci)
1530     print_copy (f, cp);
1531 }
1532 
1533 /* Print info about all copies into stderr.  */
1534 void
ira_debug_copies(void)1535 ira_debug_copies (void)
1536 {
1537   print_copies (stderr);
1538 }
1539 
1540 /* Print info about copies involving allocno A into file F.  */
1541 static void
print_allocno_copies(FILE * f,ira_allocno_t a)1542 print_allocno_copies (FILE *f, ira_allocno_t a)
1543 {
1544   ira_allocno_t another_a;
1545   ira_copy_t cp, next_cp;
1546 
1547   fprintf (f, " a%d(r%d):", ALLOCNO_NUM (a), ALLOCNO_REGNO (a));
1548   for (cp = ALLOCNO_COPIES (a); cp != NULL; cp = next_cp)
1549     {
1550       if (cp->first == a)
1551           {
1552             next_cp = cp->next_first_allocno_copy;
1553             another_a = cp->second;
1554           }
1555       else if (cp->second == a)
1556           {
1557             next_cp = cp->next_second_allocno_copy;
1558             another_a = cp->first;
1559           }
1560       else
1561           gcc_unreachable ();
1562       fprintf (f, " cp%d:a%d(r%d)@%d", cp->num,
1563                  ALLOCNO_NUM (another_a), ALLOCNO_REGNO (another_a), cp->freq);
1564     }
1565   fprintf (f, "\n");
1566 }
1567 
1568 DEBUG_FUNCTION void
debug(ira_allocno & ref)1569 debug (ira_allocno &ref)
1570 {
1571   print_allocno_copies (stderr, &ref);
1572 }
1573 
1574 DEBUG_FUNCTION void
debug(ira_allocno * ptr)1575 debug (ira_allocno *ptr)
1576 {
1577   if (ptr)
1578     debug (*ptr);
1579   else
1580     fprintf (stderr, "<nil>\n");
1581 }
1582 
1583 
1584 /* Print info about copies involving allocno A into stderr.  */
1585 void
ira_debug_allocno_copies(ira_allocno_t a)1586 ira_debug_allocno_copies (ira_allocno_t a)
1587 {
1588   print_allocno_copies (stderr, a);
1589 }
1590 
1591 /* The function frees memory allocated for copy CP.  */
1592 static void
finish_copy(ira_copy_t cp)1593 finish_copy (ira_copy_t cp)
1594 {
1595   copy_pool.remove (cp);
1596 }
1597 
1598 
1599 /* Free memory allocated for all copies.  */
1600 static void
finish_copies(void)1601 finish_copies (void)
1602 {
1603   ira_copy_t cp;
1604   ira_copy_iterator ci;
1605 
1606   FOR_EACH_COPY (cp, ci)
1607     finish_copy (cp);
1608   copy_vec.release ();
1609   copy_pool.release ();
1610 }
1611 
1612 
1613 
1614 /* Pools for cost vectors.  It is defined only for allocno classes.  */
1615 static pool_allocator *cost_vector_pool[N_REG_CLASSES];
1616 
1617 /* The function initiates work with hard register cost vectors.  It
1618    creates allocation pool for each allocno class.  */
1619 static void
initiate_cost_vectors(void)1620 initiate_cost_vectors (void)
1621 {
1622   int i;
1623   enum reg_class aclass;
1624 
1625   for (i = 0; i < ira_allocno_classes_num; i++)
1626     {
1627       aclass = ira_allocno_classes[i];
1628       cost_vector_pool[aclass] = new pool_allocator
1629           ("cost vectors", sizeof (int) * (ira_class_hard_regs_num[aclass]));
1630     }
1631 }
1632 
1633 /* Allocate and return a cost vector VEC for ACLASS.  */
1634 int *
ira_allocate_cost_vector(reg_class_t aclass)1635 ira_allocate_cost_vector (reg_class_t aclass)
1636 {
1637   return (int*) cost_vector_pool[(int) aclass]->allocate ();
1638 }
1639 
1640 /* Free a cost vector VEC for ACLASS.  */
1641 void
ira_free_cost_vector(int * vec,reg_class_t aclass)1642 ira_free_cost_vector (int *vec, reg_class_t aclass)
1643 {
1644   ira_assert (vec != NULL);
1645   cost_vector_pool[(int) aclass]->remove (vec);
1646 }
1647 
1648 /* Finish work with hard register cost vectors.  Release allocation
1649    pool for each allocno class.  */
1650 static void
finish_cost_vectors(void)1651 finish_cost_vectors (void)
1652 {
1653   int i;
1654   enum reg_class aclass;
1655 
1656   for (i = 0; i < ira_allocno_classes_num; i++)
1657     {
1658       aclass = ira_allocno_classes[i];
1659       delete cost_vector_pool[aclass];
1660     }
1661 }
1662 
1663 
1664 
1665 /* Compute a post-ordering of the reverse control flow of the loop body
1666    designated by the children nodes of LOOP_NODE, whose body nodes in
1667    pre-order are input as LOOP_PREORDER.  Return a VEC with a post-order
1668    of the reverse loop body.
1669 
1670    For the post-order of the reverse CFG, we visit the basic blocks in
1671    LOOP_PREORDER array in the reverse order of where they appear.
1672    This is important: We do not just want to compute a post-order of
1673    the reverse CFG, we want to make a best-guess for a visiting order that
1674    minimizes the number of chain elements per allocno live range.  If the
1675    blocks would be visited in a different order, we would still compute a
1676    correct post-ordering but it would be less likely that two nodes
1677    connected by an edge in the CFG are neighbors in the topsort.  */
1678 
1679 static vec<ira_loop_tree_node_t>
ira_loop_tree_body_rev_postorder(ira_loop_tree_node_t loop_node ATTRIBUTE_UNUSED,const vec<ira_loop_tree_node_t> & loop_preorder)1680 ira_loop_tree_body_rev_postorder (ira_loop_tree_node_t loop_node ATTRIBUTE_UNUSED,
1681                                           const vec<ira_loop_tree_node_t> &loop_preorder)
1682 {
1683   vec<ira_loop_tree_node_t> topsort_nodes = vNULL;
1684   unsigned int n_loop_preorder;
1685 
1686   n_loop_preorder = loop_preorder.length ();
1687   if (n_loop_preorder != 0)
1688     {
1689       ira_loop_tree_node_t subloop_node;
1690       unsigned int i;
1691       auto_vec<ira_loop_tree_node_t> dfs_stack;
1692 
1693       /* This is a bit of strange abuse of the BB_VISITED flag:  We use
1694            the flag to mark blocks we still have to visit to add them to
1695            our post-order.  Define an alias to avoid confusion.  */
1696 #define BB_TO_VISIT BB_VISITED
1697 
1698       FOR_EACH_VEC_ELT (loop_preorder, i, subloop_node)
1699           {
1700             gcc_checking_assert (! (subloop_node->bb->flags & BB_TO_VISIT));
1701             subloop_node->bb->flags |= BB_TO_VISIT;
1702           }
1703 
1704       topsort_nodes.create (n_loop_preorder);
1705       dfs_stack.create (n_loop_preorder);
1706 
1707       FOR_EACH_VEC_ELT_REVERSE (loop_preorder, i, subloop_node)
1708           {
1709             if (! (subloop_node->bb->flags & BB_TO_VISIT))
1710               continue;
1711 
1712             subloop_node->bb->flags &= ~BB_TO_VISIT;
1713             dfs_stack.quick_push (subloop_node);
1714             while (! dfs_stack.is_empty ())
1715               {
1716                 edge e;
1717                 edge_iterator ei;
1718 
1719                 ira_loop_tree_node_t n = dfs_stack.last ();
1720                 FOR_EACH_EDGE (e, ei, n->bb->preds)
1721                     {
1722                       ira_loop_tree_node_t pred_node;
1723                       basic_block pred_bb = e->src;
1724 
1725                       if (e->src == ENTRY_BLOCK_PTR_FOR_FN (cfun))
1726                         continue;
1727 
1728                       pred_node = IRA_BB_NODE_BY_INDEX (pred_bb->index);
1729                       if (pred_node != n
1730                           && (pred_node->bb->flags & BB_TO_VISIT))
1731                         {
1732                           pred_node->bb->flags &= ~BB_TO_VISIT;
1733                           dfs_stack.quick_push (pred_node);
1734                         }
1735                     }
1736                 if (n == dfs_stack.last ())
1737                     {
1738                       dfs_stack.pop ();
1739                       topsort_nodes.quick_push (n);
1740                     }
1741               }
1742           }
1743 
1744 #undef BB_TO_VISIT
1745     }
1746 
1747   gcc_assert (topsort_nodes.length () == n_loop_preorder);
1748   return topsort_nodes;
1749 }
1750 
1751 /* The current loop tree node and its regno allocno map.  */
1752 ira_loop_tree_node_t ira_curr_loop_tree_node;
1753 ira_allocno_t *ira_curr_regno_allocno_map;
1754 
1755 /* This recursive function traverses loop tree with root LOOP_NODE
1756    calling non-null functions PREORDER_FUNC and POSTORDER_FUNC
1757    correspondingly in preorder and postorder.  The function sets up
1758    IRA_CURR_LOOP_TREE_NODE and IRA_CURR_REGNO_ALLOCNO_MAP.  If BB_P,
1759    basic block nodes of LOOP_NODE is also processed (before its
1760    subloop nodes).
1761 
1762    If BB_P is set and POSTORDER_FUNC is given, the basic blocks in
1763    the loop are passed in the *reverse* post-order of the *reverse*
1764    CFG.  This is only used by ira_create_allocno_live_ranges, which
1765    wants to visit basic blocks in this order to minimize the number
1766    of elements per live range chain.
1767    Note that the loop tree nodes are still visited in the normal,
1768    forward post-order of  the loop tree.  */
1769 
1770 void
ira_traverse_loop_tree(bool bb_p,ira_loop_tree_node_t loop_node,void (* preorder_func)(ira_loop_tree_node_t),void (* postorder_func)(ira_loop_tree_node_t))1771 ira_traverse_loop_tree (bool bb_p, ira_loop_tree_node_t loop_node,
1772                               void (*preorder_func) (ira_loop_tree_node_t),
1773                               void (*postorder_func) (ira_loop_tree_node_t))
1774 {
1775   ira_loop_tree_node_t subloop_node;
1776 
1777   ira_assert (loop_node->bb == NULL);
1778   ira_curr_loop_tree_node = loop_node;
1779   ira_curr_regno_allocno_map = ira_curr_loop_tree_node->regno_allocno_map;
1780 
1781   if (preorder_func != NULL)
1782     (*preorder_func) (loop_node);
1783 
1784   if (bb_p)
1785     {
1786       auto_vec<ira_loop_tree_node_t> loop_preorder;
1787       unsigned int i;
1788 
1789       /* Add all nodes to the set of nodes to visit.  The IRA loop tree
1790            is set up such that nodes in the loop body appear in a pre-order
1791            of their place in the CFG.  */
1792       for (subloop_node = loop_node->children;
1793              subloop_node != NULL;
1794              subloop_node = subloop_node->next)
1795           if (subloop_node->bb != NULL)
1796             loop_preorder.safe_push (subloop_node);
1797 
1798       if (preorder_func != NULL)
1799           FOR_EACH_VEC_ELT (loop_preorder, i, subloop_node)
1800             (*preorder_func) (subloop_node);
1801 
1802       if (postorder_func != NULL)
1803           {
1804             vec<ira_loop_tree_node_t> loop_rev_postorder =
1805               ira_loop_tree_body_rev_postorder (loop_node, loop_preorder);
1806             FOR_EACH_VEC_ELT_REVERSE (loop_rev_postorder, i, subloop_node)
1807               (*postorder_func) (subloop_node);
1808             loop_rev_postorder.release ();
1809           }
1810     }
1811 
1812   for (subloop_node = loop_node->subloops;
1813        subloop_node != NULL;
1814        subloop_node = subloop_node->subloop_next)
1815     {
1816       ira_assert (subloop_node->bb == NULL);
1817       ira_traverse_loop_tree (bb_p, subloop_node,
1818                                     preorder_func, postorder_func);
1819     }
1820 
1821   ira_curr_loop_tree_node = loop_node;
1822   ira_curr_regno_allocno_map = ira_curr_loop_tree_node->regno_allocno_map;
1823 
1824   if (postorder_func != NULL)
1825     (*postorder_func) (loop_node);
1826 }
1827 
1828 
1829 
1830 /* The basic block currently being processed.  */
1831 static basic_block curr_bb;
1832 
1833 /* This recursive function creates allocnos corresponding to
1834    pseudo-registers containing in X.  True OUTPUT_P means that X is
1835    an lvalue.  PARENT corresponds to the parent expression of X.  */
1836 static void
create_insn_allocnos(rtx x,rtx outer,bool output_p)1837 create_insn_allocnos (rtx x, rtx outer, bool output_p)
1838 {
1839   int i, j;
1840   const char *fmt;
1841   enum rtx_code code = GET_CODE (x);
1842 
1843   if (code == REG)
1844     {
1845       int regno;
1846 
1847       if ((regno = REGNO (x)) >= FIRST_PSEUDO_REGISTER)
1848           {
1849             ira_allocno_t a;
1850 
1851             if ((a = ira_curr_regno_allocno_map[regno]) == NULL)
1852               {
1853                 a = ira_create_allocno (regno, false, ira_curr_loop_tree_node);
1854                 if (outer != NULL && GET_CODE (outer) == SUBREG)
1855                     {
1856                       machine_mode wmode = GET_MODE (outer);
1857                       if (partial_subreg_p (ALLOCNO_WMODE (a), wmode))
1858                         ALLOCNO_WMODE (a) = wmode;
1859                     }
1860               }
1861 
1862             ALLOCNO_NREFS (a)++;
1863             ALLOCNO_FREQ (a) += REG_FREQ_FROM_BB (curr_bb);
1864             if (output_p)
1865               bitmap_set_bit (ira_curr_loop_tree_node->modified_regnos, regno);
1866           }
1867       return;
1868     }
1869   else if (code == SET)
1870     {
1871       create_insn_allocnos (SET_DEST (x), NULL, true);
1872       create_insn_allocnos (SET_SRC (x), NULL, false);
1873       return;
1874     }
1875   else if (code == CLOBBER)
1876     {
1877       create_insn_allocnos (XEXP (x, 0), NULL, true);
1878       return;
1879     }
1880   else if (code == MEM)
1881     {
1882       create_insn_allocnos (XEXP (x, 0), NULL, false);
1883       return;
1884     }
1885   else if (code == PRE_DEC || code == POST_DEC || code == PRE_INC ||
1886              code == POST_INC || code == POST_MODIFY || code == PRE_MODIFY)
1887     {
1888       create_insn_allocnos (XEXP (x, 0), NULL, true);
1889       create_insn_allocnos (XEXP (x, 0), NULL, false);
1890       return;
1891     }
1892 
1893   fmt = GET_RTX_FORMAT (code);
1894   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1895     {
1896       if (fmt[i] == 'e')
1897           create_insn_allocnos (XEXP (x, i), x, output_p);
1898       else if (fmt[i] == 'E')
1899           for (j = 0; j < XVECLEN (x, i); j++)
1900             create_insn_allocnos (XVECEXP (x, i, j), x, output_p);
1901     }
1902 }
1903 
1904 /* Create allocnos corresponding to pseudo-registers living in the
1905    basic block represented by the corresponding loop tree node
1906    BB_NODE.  */
1907 static void
create_bb_allocnos(ira_loop_tree_node_t bb_node)1908 create_bb_allocnos (ira_loop_tree_node_t bb_node)
1909 {
1910   basic_block bb;
1911   rtx_insn *insn;
1912   unsigned int i;
1913   bitmap_iterator bi;
1914 
1915   curr_bb = bb = bb_node->bb;
1916   ira_assert (bb != NULL);
1917   FOR_BB_INSNS_REVERSE (bb, insn)
1918     if (NONDEBUG_INSN_P (insn))
1919       create_insn_allocnos (PATTERN (insn), NULL, false);
1920   /* It might be a allocno living through from one subloop to
1921      another.  */
1922   EXECUTE_IF_SET_IN_REG_SET (df_get_live_in (bb), FIRST_PSEUDO_REGISTER, i, bi)
1923     if (ira_curr_regno_allocno_map[i] == NULL)
1924       ira_create_allocno (i, false, ira_curr_loop_tree_node);
1925 }
1926 
1927 /* Create allocnos corresponding to pseudo-registers living on edge E
1928    (a loop entry or exit).  Also mark the allocnos as living on the
1929    loop border. */
1930 static void
create_loop_allocnos(edge e)1931 create_loop_allocnos (edge e)
1932 {
1933   unsigned int i;
1934   bitmap live_in_regs, border_allocnos;
1935   bitmap_iterator bi;
1936   ira_loop_tree_node_t parent;
1937 
1938   live_in_regs = df_get_live_in (e->dest);
1939   border_allocnos = ira_curr_loop_tree_node->border_allocnos;
1940   EXECUTE_IF_SET_IN_REG_SET (df_get_live_out (e->src),
1941                                    FIRST_PSEUDO_REGISTER, i, bi)
1942     if (bitmap_bit_p (live_in_regs, i))
1943       {
1944           if (ira_curr_regno_allocno_map[i] == NULL)
1945             {
1946               /* The order of creations is important for right
1947                  ira_regno_allocno_map.  */
1948               if ((parent = ira_curr_loop_tree_node->parent) != NULL
1949                     && parent->regno_allocno_map[i] == NULL)
1950                 ira_create_allocno (i, false, parent);
1951               ira_create_allocno (i, false, ira_curr_loop_tree_node);
1952             }
1953           bitmap_set_bit (border_allocnos,
1954                               ALLOCNO_NUM (ira_curr_regno_allocno_map[i]));
1955       }
1956 }
1957 
1958 /* Create allocnos corresponding to pseudo-registers living in loop
1959    represented by the corresponding loop tree node LOOP_NODE.  This
1960    function is called by ira_traverse_loop_tree.  */
1961 static void
create_loop_tree_node_allocnos(ira_loop_tree_node_t loop_node)1962 create_loop_tree_node_allocnos (ira_loop_tree_node_t loop_node)
1963 {
1964   if (loop_node->bb != NULL)
1965     create_bb_allocnos (loop_node);
1966   else if (loop_node != ira_loop_tree_root)
1967     {
1968       int i;
1969       edge_iterator ei;
1970       edge e;
1971 
1972       ira_assert (current_loops != NULL);
1973       FOR_EACH_EDGE (e, ei, loop_node->loop->header->preds)
1974           if (e->src != loop_node->loop->latch)
1975             create_loop_allocnos (e);
1976 
1977       auto_vec<edge> edges = get_loop_exit_edges (loop_node->loop);
1978       FOR_EACH_VEC_ELT (edges, i, e)
1979           create_loop_allocnos (e);
1980     }
1981 }
1982 
1983 /* Propagate information about allocnos modified inside the loop given
1984    by its LOOP_TREE_NODE to its parent.  */
1985 static void
propagate_modified_regnos(ira_loop_tree_node_t loop_tree_node)1986 propagate_modified_regnos (ira_loop_tree_node_t loop_tree_node)
1987 {
1988   if (loop_tree_node == ira_loop_tree_root)
1989     return;
1990   ira_assert (loop_tree_node->bb == NULL);
1991   bitmap_ior_into (loop_tree_node->parent->modified_regnos,
1992                        loop_tree_node->modified_regnos);
1993 }
1994 
1995 /* Propagate ALLOCNO_HARD_REG_COSTS from A to PARENT_A.  Use SPILL_COST
1996    as the cost of spilling a register throughout A (which we have to do
1997    for PARENT_A allocations that conflict with A).  */
1998 static void
ira_propagate_hard_reg_costs(ira_allocno_t parent_a,ira_allocno_t a,int spill_cost)1999 ira_propagate_hard_reg_costs (ira_allocno_t parent_a, ira_allocno_t a,
2000                                     int spill_cost)
2001 {
2002   HARD_REG_SET conflicts = ira_total_conflict_hard_regs (a);
2003   if (ira_caller_save_loop_spill_p (parent_a, a, spill_cost))
2004     conflicts |= ira_need_caller_save_regs (a);
2005   conflicts &= ~ira_total_conflict_hard_regs (parent_a);
2006 
2007   auto costs = ALLOCNO_HARD_REG_COSTS (a);
2008   if (!hard_reg_set_empty_p (conflicts))
2009     ALLOCNO_MIGHT_CONFLICT_WITH_PARENT_P (a) = true;
2010   else if (!costs)
2011     return;
2012 
2013   auto aclass = ALLOCNO_CLASS (a);
2014   ira_allocate_and_set_costs (&ALLOCNO_HARD_REG_COSTS (parent_a),
2015                                     aclass, ALLOCNO_CLASS_COST (parent_a));
2016   auto parent_costs = ALLOCNO_HARD_REG_COSTS (parent_a);
2017   for (int i = 0; i < ira_class_hard_regs_num[aclass]; ++i)
2018     if (TEST_HARD_REG_BIT (conflicts, ira_class_hard_regs[aclass][i]))
2019       parent_costs[i] += spill_cost;
2020     else if (costs)
2021       /* The cost to A of allocating this register to PARENT_A can't
2022            be more than the cost of spilling the register throughout A.  */
2023       parent_costs[i] += MIN (costs[i], spill_cost);
2024 }
2025 
2026 /* Propagate new info about allocno A (see comments about accumulated
2027    info in allocno definition) to the corresponding allocno on upper
2028    loop tree level.  So allocnos on upper levels accumulate
2029    information about the corresponding allocnos in nested regions.
2030    The new info means allocno info finally calculated in this
2031    file.  */
2032 static void
propagate_allocno_info(void)2033 propagate_allocno_info (void)
2034 {
2035   int i;
2036   ira_allocno_t a, parent_a;
2037   ira_loop_tree_node_t parent;
2038   enum reg_class aclass;
2039 
2040   if (flag_ira_region != IRA_REGION_ALL
2041       && flag_ira_region != IRA_REGION_MIXED)
2042     return;
2043   for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
2044     for (a = ira_regno_allocno_map[i];
2045            a != NULL;
2046            a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
2047       if ((parent = ALLOCNO_LOOP_TREE_NODE (a)->parent) != NULL
2048             && (parent_a = parent->regno_allocno_map[i]) != NULL
2049             /* There are no caps yet at this point.  So use
2050                border_allocnos to find allocnos for the propagation.  */
2051             && bitmap_bit_p (ALLOCNO_LOOP_TREE_NODE (a)->border_allocnos,
2052                                  ALLOCNO_NUM (a)))
2053           {
2054             /* Calculate the cost of storing to memory on entry to A's loop,
2055                referencing as memory within A's loop, and restoring from
2056                memory on exit from A's loop.  */
2057             ira_loop_border_costs border_costs (a);
2058             int spill_cost = INT_MAX;
2059             if (ira_subloop_allocnos_can_differ_p (parent_a))
2060               spill_cost = (border_costs.spill_inside_loop_cost ()
2061                                 + ALLOCNO_MEMORY_COST (a));
2062 
2063             if (! ALLOCNO_BAD_SPILL_P (a))
2064               ALLOCNO_BAD_SPILL_P (parent_a) = false;
2065             ALLOCNO_NREFS (parent_a) += ALLOCNO_NREFS (a);
2066             ALLOCNO_FREQ (parent_a) += ALLOCNO_FREQ (a);
2067 
2068             /* If A's allocation can differ from PARENT_A's, we can if necessary
2069                spill PARENT_A on entry to A's loop and restore it afterwards.
2070                Doing that has cost SPILL_COST.  */
2071             if (!ira_subloop_allocnos_can_differ_p (parent_a))
2072               merge_hard_reg_conflicts (a, parent_a, true);
2073 
2074             if (!ira_caller_save_loop_spill_p (parent_a, a, spill_cost))
2075               {
2076                 ALLOCNO_CALL_FREQ (parent_a) += ALLOCNO_CALL_FREQ (a);
2077                 ALLOCNO_CALLS_CROSSED_NUM (parent_a)
2078                     += ALLOCNO_CALLS_CROSSED_NUM (a);
2079                 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (parent_a)
2080                     += ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a);
2081                 ALLOCNO_CROSSED_CALLS_ABIS (parent_a)
2082                     |= ALLOCNO_CROSSED_CALLS_ABIS (a);
2083                 ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (parent_a)
2084                     |= ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a);
2085               }
2086             ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a)
2087               += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a);
2088             aclass = ALLOCNO_CLASS (a);
2089             ira_assert (aclass == ALLOCNO_CLASS (parent_a));
2090             ira_propagate_hard_reg_costs (parent_a, a, spill_cost);
2091             ira_allocate_and_accumulate_costs
2092               (&ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a),
2093                aclass,
2094                ALLOCNO_CONFLICT_HARD_REG_COSTS (a));
2095             /* The cost to A of allocating a register to PARENT_A can't be
2096                more than the cost of spilling the register throughout A.  */
2097             ALLOCNO_CLASS_COST (parent_a)
2098               += MIN (ALLOCNO_CLASS_COST (a), spill_cost);
2099             ALLOCNO_MEMORY_COST (parent_a) += ALLOCNO_MEMORY_COST (a);
2100           }
2101 }
2102 
2103 /* Create allocnos corresponding to pseudo-registers in the current
2104    function.  Traverse the loop tree for this.  */
2105 static void
create_allocnos(void)2106 create_allocnos (void)
2107 {
2108   /* We need to process BB first to correctly link allocnos by member
2109      next_regno_allocno.  */
2110   ira_traverse_loop_tree (true, ira_loop_tree_root,
2111                                 create_loop_tree_node_allocnos, NULL);
2112   if (optimize)
2113     ira_traverse_loop_tree (false, ira_loop_tree_root, NULL,
2114                                   propagate_modified_regnos);
2115 }
2116 
2117 
2118 
2119 /* The page contains function to remove some regions from a separate
2120    register allocation.  We remove regions whose separate allocation
2121    will hardly improve the result.  As a result we speed up regional
2122    register allocation.  */
2123 
2124 /* The function changes the object in range list given by R to OBJ.  */
2125 static void
change_object_in_range_list(live_range_t r,ira_object_t obj)2126 change_object_in_range_list (live_range_t r, ira_object_t obj)
2127 {
2128   for (; r != NULL; r = r->next)
2129     r->object = obj;
2130 }
2131 
2132 /* Move all live ranges associated with allocno FROM to allocno TO.  */
2133 static void
move_allocno_live_ranges(ira_allocno_t from,ira_allocno_t to)2134 move_allocno_live_ranges (ira_allocno_t from, ira_allocno_t to)
2135 {
2136   int i;
2137   int n = ALLOCNO_NUM_OBJECTS (from);
2138 
2139   gcc_assert (n == ALLOCNO_NUM_OBJECTS (to));
2140 
2141   for (i = 0; i < n; i++)
2142     {
2143       ira_object_t from_obj = ALLOCNO_OBJECT (from, i);
2144       ira_object_t to_obj = ALLOCNO_OBJECT (to, i);
2145       live_range_t lr = OBJECT_LIVE_RANGES (from_obj);
2146 
2147       if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL)
2148           {
2149             fprintf (ira_dump_file,
2150                        "      Moving ranges of a%dr%d to a%dr%d: ",
2151                        ALLOCNO_NUM (from), ALLOCNO_REGNO (from),
2152                        ALLOCNO_NUM (to), ALLOCNO_REGNO (to));
2153             ira_print_live_range_list (ira_dump_file, lr);
2154           }
2155       change_object_in_range_list (lr, to_obj);
2156       OBJECT_LIVE_RANGES (to_obj)
2157           = ira_merge_live_ranges (lr, OBJECT_LIVE_RANGES (to_obj));
2158       OBJECT_LIVE_RANGES (from_obj) = NULL;
2159     }
2160 }
2161 
2162 static void
copy_allocno_live_ranges(ira_allocno_t from,ira_allocno_t to)2163 copy_allocno_live_ranges (ira_allocno_t from, ira_allocno_t to)
2164 {
2165   int i;
2166   int n = ALLOCNO_NUM_OBJECTS (from);
2167 
2168   gcc_assert (n == ALLOCNO_NUM_OBJECTS (to));
2169 
2170   for (i = 0; i < n; i++)
2171     {
2172       ira_object_t from_obj = ALLOCNO_OBJECT (from, i);
2173       ira_object_t to_obj = ALLOCNO_OBJECT (to, i);
2174       live_range_t lr = OBJECT_LIVE_RANGES (from_obj);
2175 
2176       if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL)
2177           {
2178             fprintf (ira_dump_file, "      Copying ranges of a%dr%d to a%dr%d: ",
2179                        ALLOCNO_NUM (from), ALLOCNO_REGNO (from),
2180                        ALLOCNO_NUM (to), ALLOCNO_REGNO (to));
2181             ira_print_live_range_list (ira_dump_file, lr);
2182           }
2183       lr = ira_copy_live_range_list (lr);
2184       change_object_in_range_list (lr, to_obj);
2185       OBJECT_LIVE_RANGES (to_obj)
2186           = ira_merge_live_ranges (lr, OBJECT_LIVE_RANGES (to_obj));
2187     }
2188 }
2189 
2190 /* Return TRUE if NODE represents a loop with low register
2191    pressure.  */
2192 static bool
low_pressure_loop_node_p(ira_loop_tree_node_t node)2193 low_pressure_loop_node_p (ira_loop_tree_node_t node)
2194 {
2195   int i;
2196   enum reg_class pclass;
2197 
2198   if (node->bb != NULL)
2199     return false;
2200 
2201   for (i = 0; i < ira_pressure_classes_num; i++)
2202     {
2203       pclass = ira_pressure_classes[i];
2204       if (node->reg_pressure[pclass] > ira_class_hard_regs_num[pclass]
2205             && ira_class_hard_regs_num[pclass] > 1)
2206           return false;
2207     }
2208   return true;
2209 }
2210 
2211 #ifdef STACK_REGS
2212 /* Return TRUE if LOOP has a complex enter or exit edge.  We don't
2213    form a region from such loop if the target use stack register
2214    because reg-stack.cc cannot deal with such edges.  */
2215 static bool
loop_with_complex_edge_p(class loop * loop)2216 loop_with_complex_edge_p (class loop *loop)
2217 {
2218   int i;
2219   edge_iterator ei;
2220   edge e;
2221   bool res;
2222 
2223   FOR_EACH_EDGE (e, ei, loop->header->preds)
2224     if (e->flags & EDGE_EH)
2225       return true;
2226   auto_vec<edge> edges = get_loop_exit_edges (loop);
2227   res = false;
2228   FOR_EACH_VEC_ELT (edges, i, e)
2229     if (e->flags & EDGE_COMPLEX)
2230       {
2231           res = true;
2232           break;
2233       }
2234   return res;
2235 }
2236 #endif
2237 
2238 /* Sort loops for marking them for removal.  We put already marked
2239    loops first, then less frequent loops next, and then outer loops
2240    next.  */
2241 static int
loop_compare_func(const void * v1p,const void * v2p)2242 loop_compare_func (const void *v1p, const void *v2p)
2243 {
2244   int diff;
2245   ira_loop_tree_node_t l1 = *(const ira_loop_tree_node_t *) v1p;
2246   ira_loop_tree_node_t l2 = *(const ira_loop_tree_node_t *) v2p;
2247 
2248   ira_assert (l1->parent != NULL && l2->parent != NULL);
2249   if (l1->to_remove_p && ! l2->to_remove_p)
2250     return -1;
2251   if (! l1->to_remove_p && l2->to_remove_p)
2252     return 1;
2253   if ((diff = l1->loop->header->count.to_frequency (cfun)
2254                 - l2->loop->header->count.to_frequency (cfun)) != 0)
2255     return diff;
2256   if ((diff = (int) loop_depth (l1->loop) - (int) loop_depth (l2->loop)) != 0)
2257     return diff;
2258   /* Make sorting stable.  */
2259   return l1->loop_num - l2->loop_num;
2260 }
2261 
2262 /* Mark loops which should be removed from regional allocation.  We
2263    remove a loop with low register pressure inside another loop with
2264    register pressure.  In this case a separate allocation of the loop
2265    hardly helps (for irregular register file architecture it could
2266    help by choosing a better hard register in the loop but we prefer
2267    faster allocation even in this case).  We also remove cheap loops
2268    if there are more than param_ira_max_loops_num of them.  Loop with EH
2269    exit or enter edges are removed too because the allocation might
2270    require put pseudo moves on the EH edges (we could still do this
2271    for pseudos with caller saved hard registers in some cases but it
2272    is impossible to say here or during top-down allocation pass what
2273    hard register the pseudos get finally).  */
2274 static void
mark_loops_for_removal(void)2275 mark_loops_for_removal (void)
2276 {
2277   int i, n;
2278   ira_loop_tree_node_t *sorted_loops;
2279   loop_p loop;
2280 
2281   ira_assert (current_loops != NULL);
2282   sorted_loops
2283     = (ira_loop_tree_node_t *) ira_allocate (sizeof (ira_loop_tree_node_t)
2284                                                        * number_of_loops (cfun));
2285   for (n = i = 0; vec_safe_iterate (get_loops (cfun), i, &loop); i++)
2286     if (ira_loop_nodes[i].regno_allocno_map != NULL)
2287       {
2288           if (ira_loop_nodes[i].parent == NULL)
2289             {
2290               /* Don't remove the root.  */
2291               ira_loop_nodes[i].to_remove_p = false;
2292               continue;
2293             }
2294           sorted_loops[n++] = &ira_loop_nodes[i];
2295           ira_loop_nodes[i].to_remove_p
2296             = ((low_pressure_loop_node_p (ira_loop_nodes[i].parent)
2297                 && low_pressure_loop_node_p (&ira_loop_nodes[i]))
2298 #ifdef STACK_REGS
2299                || loop_with_complex_edge_p (ira_loop_nodes[i].loop)
2300 #endif
2301                );
2302       }
2303   qsort (sorted_loops, n, sizeof (ira_loop_tree_node_t), loop_compare_func);
2304   for (i = 0; i < n - param_ira_max_loops_num; i++)
2305     {
2306       sorted_loops[i]->to_remove_p = true;
2307       if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
2308           fprintf
2309             (ira_dump_file,
2310              "  Mark loop %d (header %d, freq %d, depth %d) for removal (%s)\n",
2311              sorted_loops[i]->loop_num, sorted_loops[i]->loop->header->index,
2312              sorted_loops[i]->loop->header->count.to_frequency (cfun),
2313              loop_depth (sorted_loops[i]->loop),
2314              low_pressure_loop_node_p (sorted_loops[i]->parent)
2315              && low_pressure_loop_node_p (sorted_loops[i])
2316              ? "low pressure" : "cheap loop");
2317     }
2318   ira_free (sorted_loops);
2319 }
2320 
2321 /* Mark all loops but root for removing.  */
2322 static void
mark_all_loops_for_removal(void)2323 mark_all_loops_for_removal (void)
2324 {
2325   int i;
2326   loop_p loop;
2327 
2328   ira_assert (current_loops != NULL);
2329   FOR_EACH_VEC_SAFE_ELT (get_loops (cfun), i, loop)
2330     if (ira_loop_nodes[i].regno_allocno_map != NULL)
2331       {
2332           if (ira_loop_nodes[i].parent == NULL)
2333             {
2334               /* Don't remove the root.  */
2335               ira_loop_nodes[i].to_remove_p = false;
2336               continue;
2337             }
2338           ira_loop_nodes[i].to_remove_p = true;
2339           if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
2340             fprintf
2341               (ira_dump_file,
2342                "  Mark loop %d (header %d, freq %d, depth %d) for removal\n",
2343                ira_loop_nodes[i].loop_num,
2344                ira_loop_nodes[i].loop->header->index,
2345                ira_loop_nodes[i].loop->header->count.to_frequency (cfun),
2346                loop_depth (ira_loop_nodes[i].loop));
2347       }
2348 }
2349 
2350 /* Definition of vector of loop tree nodes.  */
2351 
2352 /* Vec containing references to all removed loop tree nodes.  */
2353 static vec<ira_loop_tree_node_t> removed_loop_vec;
2354 
2355 /* Vec containing references to all children of loop tree nodes.  */
2356 static vec<ira_loop_tree_node_t> children_vec;
2357 
2358 /* Remove subregions of NODE if their separate allocation will not
2359    improve the result.  */
2360 static void
remove_uneccesary_loop_nodes_from_loop_tree(ira_loop_tree_node_t node)2361 remove_uneccesary_loop_nodes_from_loop_tree (ira_loop_tree_node_t node)
2362 {
2363   unsigned int start;
2364   bool remove_p;
2365   ira_loop_tree_node_t subnode;
2366 
2367   remove_p = node->to_remove_p;
2368   if (! remove_p)
2369     children_vec.safe_push (node);
2370   start = children_vec.length ();
2371   for (subnode = node->children; subnode != NULL; subnode = subnode->next)
2372     if (subnode->bb == NULL)
2373       remove_uneccesary_loop_nodes_from_loop_tree (subnode);
2374     else
2375       children_vec.safe_push (subnode);
2376   node->children = node->subloops = NULL;
2377   if (remove_p)
2378     {
2379       removed_loop_vec.safe_push (node);
2380       return;
2381     }
2382   while (children_vec.length () > start)
2383     {
2384       subnode = children_vec.pop ();
2385       subnode->parent = node;
2386       subnode->next = node->children;
2387       node->children = subnode;
2388       if (subnode->bb == NULL)
2389           {
2390             subnode->subloop_next = node->subloops;
2391             node->subloops = subnode;
2392           }
2393     }
2394 }
2395 
2396 /* Return TRUE if NODE is inside PARENT.  */
2397 static bool
loop_is_inside_p(ira_loop_tree_node_t node,ira_loop_tree_node_t parent)2398 loop_is_inside_p (ira_loop_tree_node_t node, ira_loop_tree_node_t parent)
2399 {
2400   for (node = node->parent; node != NULL; node = node->parent)
2401     if (node == parent)
2402       return true;
2403   return false;
2404 }
2405 
2406 /* Sort allocnos according to their order in regno allocno list.  */
2407 static int
regno_allocno_order_compare_func(const void * v1p,const void * v2p)2408 regno_allocno_order_compare_func (const void *v1p, const void *v2p)
2409 {
2410   ira_allocno_t a1 = *(const ira_allocno_t *) v1p;
2411   ira_allocno_t a2 = *(const ira_allocno_t *) v2p;
2412   ira_loop_tree_node_t n1 = ALLOCNO_LOOP_TREE_NODE (a1);
2413   ira_loop_tree_node_t n2 = ALLOCNO_LOOP_TREE_NODE (a2);
2414 
2415   if (loop_is_inside_p (n1, n2))
2416     return -1;
2417   else if (loop_is_inside_p (n2, n1))
2418     return 1;
2419   /* If allocnos are equally good, sort by allocno numbers, so that
2420      the results of qsort leave nothing to chance.  We put allocnos
2421      with higher number first in the list because it is the original
2422      order for allocnos from loops on the same levels.  */
2423   return ALLOCNO_NUM (a2) - ALLOCNO_NUM (a1);
2424 }
2425 
2426 /* This array is used to sort allocnos to restore allocno order in
2427    the regno allocno list.  */
2428 static ira_allocno_t *regno_allocnos;
2429 
2430 /* Restore allocno order for REGNO in the regno allocno list.  */
2431 static void
ira_rebuild_regno_allocno_list(int regno)2432 ira_rebuild_regno_allocno_list (int regno)
2433 {
2434   int i, n;
2435   ira_allocno_t a;
2436 
2437   for (n = 0, a = ira_regno_allocno_map[regno];
2438        a != NULL;
2439        a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
2440     regno_allocnos[n++] = a;
2441   ira_assert (n > 0);
2442   qsort (regno_allocnos, n, sizeof (ira_allocno_t),
2443            regno_allocno_order_compare_func);
2444   for (i = 1; i < n; i++)
2445     ALLOCNO_NEXT_REGNO_ALLOCNO (regno_allocnos[i - 1]) = regno_allocnos[i];
2446   ALLOCNO_NEXT_REGNO_ALLOCNO (regno_allocnos[n - 1]) = NULL;
2447   ira_regno_allocno_map[regno] = regno_allocnos[0];
2448   if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
2449     fprintf (ira_dump_file, " Rebuilding regno allocno list for %d\n", regno);
2450 }
2451 
2452 /* Propagate info from allocno FROM_A to allocno A.  */
2453 static void
propagate_some_info_from_allocno(ira_allocno_t a,ira_allocno_t from_a)2454 propagate_some_info_from_allocno (ira_allocno_t a, ira_allocno_t from_a)
2455 {
2456   enum reg_class aclass;
2457 
2458   merge_hard_reg_conflicts (from_a, a, false);
2459   ALLOCNO_NREFS (a) += ALLOCNO_NREFS (from_a);
2460   ALLOCNO_FREQ (a) += ALLOCNO_FREQ (from_a);
2461   ALLOCNO_CALL_FREQ (a) += ALLOCNO_CALL_FREQ (from_a);
2462   ALLOCNO_CALLS_CROSSED_NUM (a) += ALLOCNO_CALLS_CROSSED_NUM (from_a);
2463   ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a)
2464     += ALLOCNO_CHEAP_CALLS_CROSSED_NUM (from_a);
2465   ALLOCNO_CROSSED_CALLS_ABIS (a) |= ALLOCNO_CROSSED_CALLS_ABIS (from_a);
2466   ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a)
2467     |= ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (from_a);
2468 
2469   ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a)
2470     += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (from_a);
2471   if (! ALLOCNO_BAD_SPILL_P (from_a))
2472     ALLOCNO_BAD_SPILL_P (a) = false;
2473   aclass = ALLOCNO_CLASS (from_a);
2474   ira_assert (aclass == ALLOCNO_CLASS (a));
2475   ira_allocate_and_accumulate_costs (&ALLOCNO_HARD_REG_COSTS (a), aclass,
2476                                              ALLOCNO_HARD_REG_COSTS (from_a));
2477   ira_allocate_and_accumulate_costs (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a),
2478                                              aclass,
2479                                              ALLOCNO_CONFLICT_HARD_REG_COSTS (from_a));
2480   ALLOCNO_CLASS_COST (a) += ALLOCNO_CLASS_COST (from_a);
2481   ALLOCNO_MEMORY_COST (a) += ALLOCNO_MEMORY_COST (from_a);
2482 }
2483 
2484 /* Remove allocnos from loops removed from the allocation
2485    consideration.  */
2486 static void
remove_unnecessary_allocnos(void)2487 remove_unnecessary_allocnos (void)
2488 {
2489   int regno;
2490   bool merged_p, rebuild_p;
2491   ira_allocno_t a, prev_a, next_a, parent_a;
2492   ira_loop_tree_node_t a_node, parent;
2493 
2494   merged_p = false;
2495   regno_allocnos = NULL;
2496   for (regno = max_reg_num () - 1; regno >= FIRST_PSEUDO_REGISTER; regno--)
2497     {
2498       rebuild_p = false;
2499       for (prev_a = NULL, a = ira_regno_allocno_map[regno];
2500              a != NULL;
2501              a = next_a)
2502           {
2503             next_a = ALLOCNO_NEXT_REGNO_ALLOCNO (a);
2504             a_node = ALLOCNO_LOOP_TREE_NODE (a);
2505             if (! a_node->to_remove_p)
2506               prev_a = a;
2507             else
2508               {
2509                 for (parent = a_node->parent;
2510                        (parent_a = parent->regno_allocno_map[regno]) == NULL
2511                          && parent->to_remove_p;
2512                        parent = parent->parent)
2513                     ;
2514                 if (parent_a == NULL)
2515                     {
2516                       /* There are no allocnos with the same regno in
2517                          upper region -- just move the allocno to the
2518                          upper region.  */
2519                       prev_a = a;
2520                       ALLOCNO_LOOP_TREE_NODE (a) = parent;
2521                       parent->regno_allocno_map[regno] = a;
2522                       bitmap_set_bit (parent->all_allocnos, ALLOCNO_NUM (a));
2523                       rebuild_p = true;
2524                     }
2525                 else
2526                     {
2527                       /* Remove the allocno and update info of allocno in
2528                          the upper region.  */
2529                       if (prev_a == NULL)
2530                         ira_regno_allocno_map[regno] = next_a;
2531                       else
2532                         ALLOCNO_NEXT_REGNO_ALLOCNO (prev_a) = next_a;
2533                       move_allocno_live_ranges (a, parent_a);
2534                       merged_p = true;
2535                       propagate_some_info_from_allocno (parent_a, a);
2536                       /* Remove it from the corresponding regno allocno
2537                          map to avoid info propagation of subsequent
2538                          allocno into this already removed allocno.  */
2539                       a_node->regno_allocno_map[regno] = NULL;
2540                       ira_remove_allocno_prefs (a);
2541                       finish_allocno (a);
2542                     }
2543               }
2544           }
2545       if (rebuild_p)
2546           /* We need to restore the order in regno allocno list.  */
2547           {
2548             if (regno_allocnos == NULL)
2549               regno_allocnos
2550                 = (ira_allocno_t *) ira_allocate (sizeof (ira_allocno_t)
2551                                                             * ira_allocnos_num);
2552             ira_rebuild_regno_allocno_list (regno);
2553           }
2554     }
2555   if (merged_p)
2556     ira_rebuild_start_finish_chains ();
2557   if (regno_allocnos != NULL)
2558     ira_free (regno_allocnos);
2559 }
2560 
2561 /* Remove allocnos from all loops but the root.  */
2562 static void
remove_low_level_allocnos(void)2563 remove_low_level_allocnos (void)
2564 {
2565   int regno;
2566   bool merged_p, propagate_p;
2567   ira_allocno_t a, top_a;
2568   ira_loop_tree_node_t a_node, parent;
2569   ira_allocno_iterator ai;
2570 
2571   merged_p = false;
2572   FOR_EACH_ALLOCNO (a, ai)
2573     {
2574       a_node = ALLOCNO_LOOP_TREE_NODE (a);
2575       if (a_node == ira_loop_tree_root || ALLOCNO_CAP_MEMBER (a) != NULL)
2576           continue;
2577       regno = ALLOCNO_REGNO (a);
2578       if ((top_a = ira_loop_tree_root->regno_allocno_map[regno]) == NULL)
2579           {
2580             ALLOCNO_LOOP_TREE_NODE (a) = ira_loop_tree_root;
2581             ira_loop_tree_root->regno_allocno_map[regno] = a;
2582             continue;
2583           }
2584       propagate_p = a_node->parent->regno_allocno_map[regno] == NULL;
2585       /* Remove the allocno and update info of allocno in the upper
2586            region.  */
2587       move_allocno_live_ranges (a, top_a);
2588       merged_p = true;
2589       if (propagate_p)
2590           propagate_some_info_from_allocno (top_a, a);
2591     }
2592   FOR_EACH_ALLOCNO (a, ai)
2593     {
2594       a_node = ALLOCNO_LOOP_TREE_NODE (a);
2595       if (a_node == ira_loop_tree_root)
2596           continue;
2597       parent = a_node->parent;
2598       regno = ALLOCNO_REGNO (a);
2599       if (ALLOCNO_CAP_MEMBER (a) != NULL)
2600           ira_assert (ALLOCNO_CAP (a) != NULL);
2601       else if (ALLOCNO_CAP (a) == NULL)
2602           ira_assert (parent->regno_allocno_map[regno] != NULL);
2603     }
2604   FOR_EACH_ALLOCNO (a, ai)
2605     {
2606       regno = ALLOCNO_REGNO (a);
2607       if (ira_loop_tree_root->regno_allocno_map[regno] == a)
2608           {
2609             ira_object_t obj;
2610             ira_allocno_object_iterator oi;
2611 
2612             ira_regno_allocno_map[regno] = a;
2613             ALLOCNO_NEXT_REGNO_ALLOCNO (a) = NULL;
2614             ALLOCNO_CAP_MEMBER (a) = NULL;
2615             FOR_EACH_ALLOCNO_OBJECT (a, obj, oi)
2616               OBJECT_CONFLICT_HARD_REGS (obj)
2617                 = OBJECT_TOTAL_CONFLICT_HARD_REGS (obj);
2618 #ifdef STACK_REGS
2619             if (ALLOCNO_TOTAL_NO_STACK_REG_P (a))
2620               ALLOCNO_NO_STACK_REG_P (a) = true;
2621 #endif
2622           }
2623       else
2624           {
2625             ira_remove_allocno_prefs (a);
2626             finish_allocno (a);
2627           }
2628     }
2629   if (merged_p)
2630     ira_rebuild_start_finish_chains ();
2631 }
2632 
2633 /* Remove loops from consideration.  We remove all loops except for
2634    root if ALL_P or loops for which a separate allocation will not
2635    improve the result.  We have to do this after allocno creation and
2636    their costs and allocno class evaluation because only after that
2637    the register pressure can be known and is calculated.  */
2638 static void
remove_unnecessary_regions(bool all_p)2639 remove_unnecessary_regions (bool all_p)
2640 {
2641   if (current_loops == NULL)
2642     return;
2643   if (all_p)
2644     mark_all_loops_for_removal ();
2645   else
2646     mark_loops_for_removal ();
2647   children_vec.create (last_basic_block_for_fn (cfun)
2648                            + number_of_loops (cfun));
2649   removed_loop_vec.create (last_basic_block_for_fn (cfun)
2650                                  + number_of_loops (cfun));
2651   remove_uneccesary_loop_nodes_from_loop_tree (ira_loop_tree_root);
2652   children_vec.release ();
2653   if (all_p)
2654     remove_low_level_allocnos ();
2655   else
2656     remove_unnecessary_allocnos ();
2657   while (removed_loop_vec.length () > 0)
2658     finish_loop_tree_node (removed_loop_vec.pop ());
2659   removed_loop_vec.release ();
2660 }
2661 
2662 
2663 
2664 /* At this point true value of allocno attribute bad_spill_p means
2665    that there is an insn where allocno occurs and where the allocno
2666    cannot be used as memory.  The function updates the attribute, now
2667    it can be true only for allocnos which cannot be used as memory in
2668    an insn and in whose live ranges there is other allocno deaths.
2669    Spilling allocnos with true value will not improve the code because
2670    it will not make other allocnos colorable and additional reloads
2671    for the corresponding pseudo will be generated in reload pass for
2672    each insn it occurs.
2673 
2674    This is a trick mentioned in one classic article of Chaitin etc
2675    which is frequently omitted in other implementations of RA based on
2676    graph coloring.  */
2677 static void
update_bad_spill_attribute(void)2678 update_bad_spill_attribute (void)
2679 {
2680   int i;
2681   ira_allocno_t a;
2682   ira_allocno_iterator ai;
2683   ira_allocno_object_iterator aoi;
2684   ira_object_t obj;
2685   live_range_t r;
2686   enum reg_class aclass;
2687   bitmap_head dead_points[N_REG_CLASSES];
2688 
2689   for (i = 0; i < ira_allocno_classes_num; i++)
2690     {
2691       aclass = ira_allocno_classes[i];
2692       bitmap_initialize (&dead_points[aclass], &reg_obstack);
2693     }
2694   FOR_EACH_ALLOCNO (a, ai)
2695     {
2696       aclass = ALLOCNO_CLASS (a);
2697       if (aclass == NO_REGS)
2698           continue;
2699       FOR_EACH_ALLOCNO_OBJECT (a, obj, aoi)
2700           for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next)
2701             bitmap_set_bit (&dead_points[aclass], r->finish);
2702     }
2703   FOR_EACH_ALLOCNO (a, ai)
2704     {
2705       aclass = ALLOCNO_CLASS (a);
2706       if (aclass == NO_REGS)
2707           continue;
2708       if (! ALLOCNO_BAD_SPILL_P (a))
2709           continue;
2710       FOR_EACH_ALLOCNO_OBJECT (a, obj, aoi)
2711           {
2712             for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next)
2713               {
2714                 for (i = r->start + 1; i < r->finish; i++)
2715                     if (bitmap_bit_p (&dead_points[aclass], i))
2716                       break;
2717                 if (i < r->finish)
2718                     break;
2719               }
2720             if (r != NULL)
2721               {
2722                 ALLOCNO_BAD_SPILL_P (a) = false;
2723                 break;
2724               }
2725           }
2726     }
2727   for (i = 0; i < ira_allocno_classes_num; i++)
2728     {
2729       aclass = ira_allocno_classes[i];
2730       bitmap_clear (&dead_points[aclass]);
2731     }
2732 }
2733 
2734 
2735 
2736 /* Set up minimal and maximal live range points for allocnos.  */
2737 static void
setup_min_max_allocno_live_range_point(void)2738 setup_min_max_allocno_live_range_point (void)
2739 {
2740   int i;
2741   ira_allocno_t a, parent_a, cap;
2742   ira_allocno_iterator ai;
2743 #ifdef ENABLE_IRA_CHECKING
2744   ira_object_iterator oi;
2745   ira_object_t obj;
2746 #endif
2747   live_range_t r;
2748   ira_loop_tree_node_t parent;
2749 
2750   FOR_EACH_ALLOCNO (a, ai)
2751     {
2752       int n = ALLOCNO_NUM_OBJECTS (a);
2753 
2754       for (i = 0; i < n; i++)
2755           {
2756             ira_object_t obj = ALLOCNO_OBJECT (a, i);
2757             r = OBJECT_LIVE_RANGES (obj);
2758             if (r == NULL)
2759               continue;
2760             OBJECT_MAX (obj) = r->finish;
2761             for (; r->next != NULL; r = r->next)
2762               ;
2763             OBJECT_MIN (obj) = r->start;
2764           }
2765     }
2766   for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
2767     for (a = ira_regno_allocno_map[i];
2768            a != NULL;
2769            a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
2770       {
2771           int j;
2772           int n = ALLOCNO_NUM_OBJECTS (a);
2773 
2774           for (j = 0; j < n; j++)
2775             {
2776               ira_object_t obj = ALLOCNO_OBJECT (a, j);
2777               ira_object_t parent_obj;
2778 
2779               if (OBJECT_MAX (obj) < 0)
2780                 {
2781                     /* The object is not used and hence does not live.  */
2782                     ira_assert (OBJECT_LIVE_RANGES (obj) == NULL);
2783                     OBJECT_MAX (obj) = 0;
2784                     OBJECT_MIN (obj) = 1;
2785                     continue;
2786                 }
2787               ira_assert (ALLOCNO_CAP_MEMBER (a) == NULL);
2788               /* Accumulation of range info.  */
2789               if (ALLOCNO_CAP (a) != NULL)
2790                 {
2791                     for (cap = ALLOCNO_CAP (a); cap != NULL; cap = ALLOCNO_CAP (cap))
2792                       {
2793                         ira_object_t cap_obj = ALLOCNO_OBJECT (cap, j);
2794                         if (OBJECT_MAX (cap_obj) < OBJECT_MAX (obj))
2795                           OBJECT_MAX (cap_obj) = OBJECT_MAX (obj);
2796                         if (OBJECT_MIN (cap_obj) > OBJECT_MIN (obj))
2797                           OBJECT_MIN (cap_obj) = OBJECT_MIN (obj);
2798                       }
2799                     continue;
2800                 }
2801               if ((parent = ALLOCNO_LOOP_TREE_NODE (a)->parent) == NULL)
2802                 continue;
2803               parent_a = parent->regno_allocno_map[i];
2804               parent_obj = ALLOCNO_OBJECT (parent_a, j);
2805               if (OBJECT_MAX (parent_obj) < OBJECT_MAX (obj))
2806                 OBJECT_MAX (parent_obj) = OBJECT_MAX (obj);
2807               if (OBJECT_MIN (parent_obj) > OBJECT_MIN (obj))
2808                 OBJECT_MIN (parent_obj) = OBJECT_MIN (obj);
2809             }
2810       }
2811 #ifdef ENABLE_IRA_CHECKING
2812   FOR_EACH_OBJECT (obj, oi)
2813     {
2814       if ((OBJECT_MIN (obj) >= 0 && OBJECT_MIN (obj) <= ira_max_point)
2815             && (OBJECT_MAX (obj) >= 0 && OBJECT_MAX (obj) <= ira_max_point))
2816           continue;
2817       gcc_unreachable ();
2818     }
2819 #endif
2820 }
2821 
2822 /* Sort allocnos according to their live ranges.  Allocnos with
2823    smaller allocno class are put first unless we use priority
2824    coloring.  Allocnos with the same class are ordered according
2825    their start (min).  Allocnos with the same start are ordered
2826    according their finish (max).  */
2827 static int
object_range_compare_func(const void * v1p,const void * v2p)2828 object_range_compare_func (const void *v1p, const void *v2p)
2829 {
2830   int diff;
2831   ira_object_t obj1 = *(const ira_object_t *) v1p;
2832   ira_object_t obj2 = *(const ira_object_t *) v2p;
2833   ira_allocno_t a1 = OBJECT_ALLOCNO (obj1);
2834   ira_allocno_t a2 = OBJECT_ALLOCNO (obj2);
2835 
2836   if ((diff = OBJECT_MIN (obj1) - OBJECT_MIN (obj2)) != 0)
2837     return diff;
2838   if ((diff = OBJECT_MAX (obj1) - OBJECT_MAX (obj2)) != 0)
2839      return diff;
2840   return ALLOCNO_NUM (a1) - ALLOCNO_NUM (a2);
2841 }
2842 
2843 /* Sort ira_object_id_map and set up conflict id of allocnos.  */
2844 static void
sort_conflict_id_map(void)2845 sort_conflict_id_map (void)
2846 {
2847   int i, num;
2848   ira_allocno_t a;
2849   ira_allocno_iterator ai;
2850 
2851   num = 0;
2852   FOR_EACH_ALLOCNO (a, ai)
2853     {
2854       ira_allocno_object_iterator oi;
2855       ira_object_t obj;
2856 
2857       FOR_EACH_ALLOCNO_OBJECT (a, obj, oi)
2858           ira_object_id_map[num++] = obj;
2859     }
2860   if (num > 1)
2861     qsort (ira_object_id_map, num, sizeof (ira_object_t),
2862              object_range_compare_func);
2863   for (i = 0; i < num; i++)
2864     {
2865       ira_object_t obj = ira_object_id_map[i];
2866 
2867       gcc_assert (obj != NULL);
2868       OBJECT_CONFLICT_ID (obj) = i;
2869     }
2870   for (i = num; i < ira_objects_num; i++)
2871     ira_object_id_map[i] = NULL;
2872 }
2873 
2874 /* Set up minimal and maximal conflict ids of allocnos with which
2875    given allocno can conflict.  */
2876 static void
setup_min_max_conflict_allocno_ids(void)2877 setup_min_max_conflict_allocno_ids (void)
2878 {
2879   int aclass;
2880   int i, j, min, max, start, finish, first_not_finished, filled_area_start;
2881   int *live_range_min, *last_lived;
2882   int word0_min, word0_max;
2883   ira_allocno_t a;
2884   ira_allocno_iterator ai;
2885 
2886   live_range_min = (int *) ira_allocate (sizeof (int) * ira_objects_num);
2887   aclass = -1;
2888   first_not_finished = -1;
2889   for (i = 0; i < ira_objects_num; i++)
2890     {
2891       ira_object_t obj = ira_object_id_map[i];
2892 
2893       if (obj == NULL)
2894           continue;
2895 
2896       a = OBJECT_ALLOCNO (obj);
2897 
2898       if (aclass < 0)
2899           {
2900             aclass = ALLOCNO_CLASS (a);
2901             min = i;
2902             first_not_finished = i;
2903           }
2904       else
2905           {
2906             start = OBJECT_MIN (obj);
2907             /* If we skip an allocno, the allocno with smaller ids will
2908                be also skipped because of the secondary sorting the
2909                range finishes (see function
2910                object_range_compare_func).  */
2911             while (first_not_finished < i
2912                      && start > OBJECT_MAX (ira_object_id_map
2913                                                   [first_not_finished]))
2914               first_not_finished++;
2915             min = first_not_finished;
2916           }
2917       if (min == i)
2918           /* We could increase min further in this case but it is good
2919              enough.  */
2920           min++;
2921       live_range_min[i] = OBJECT_MIN (obj);
2922       OBJECT_MIN (obj) = min;
2923     }
2924   last_lived = (int *) ira_allocate (sizeof (int) * ira_max_point);
2925   aclass = -1;
2926   filled_area_start = -1;
2927   for (i = ira_objects_num - 1; i >= 0; i--)
2928     {
2929       ira_object_t obj = ira_object_id_map[i];
2930 
2931       if (obj == NULL)
2932           continue;
2933 
2934       a = OBJECT_ALLOCNO (obj);
2935       if (aclass < 0)
2936           {
2937             aclass = ALLOCNO_CLASS (a);
2938             for (j = 0; j < ira_max_point; j++)
2939               last_lived[j] = -1;
2940             filled_area_start = ira_max_point;
2941           }
2942       min = live_range_min[i];
2943       finish = OBJECT_MAX (obj);
2944       max = last_lived[finish];
2945       if (max < 0)
2946           /* We could decrease max further in this case but it is good
2947              enough.  */
2948           max = OBJECT_CONFLICT_ID (obj) - 1;
2949       OBJECT_MAX (obj) = max;
2950       /* In filling, we can go further A range finish to recognize
2951            intersection quickly because if the finish of subsequently
2952            processed allocno (it has smaller conflict id) range is
2953            further A range finish than they are definitely intersected
2954            (the reason for this is the allocnos with bigger conflict id
2955            have their range starts not smaller than allocnos with
2956            smaller ids.  */
2957       for (j = min; j < filled_area_start; j++)
2958           last_lived[j] = i;
2959       filled_area_start = min;
2960     }
2961   ira_free (last_lived);
2962   ira_free (live_range_min);
2963 
2964   /* For allocnos with more than one object, we may later record extra conflicts in
2965      subobject 0 that we cannot really know about here.
2966      For now, simply widen the min/max range of these subobjects.  */
2967 
2968   word0_min = INT_MAX;
2969   word0_max = INT_MIN;
2970 
2971   FOR_EACH_ALLOCNO (a, ai)
2972     {
2973       int n = ALLOCNO_NUM_OBJECTS (a);
2974       ira_object_t obj0;
2975 
2976       if (n < 2)
2977           continue;
2978       obj0 = ALLOCNO_OBJECT (a, 0);
2979       if (OBJECT_CONFLICT_ID (obj0) < word0_min)
2980           word0_min = OBJECT_CONFLICT_ID (obj0);
2981       if (OBJECT_CONFLICT_ID (obj0) > word0_max)
2982           word0_max = OBJECT_CONFLICT_ID (obj0);
2983     }
2984   FOR_EACH_ALLOCNO (a, ai)
2985     {
2986       int n = ALLOCNO_NUM_OBJECTS (a);
2987       ira_object_t obj0;
2988 
2989       if (n < 2)
2990           continue;
2991       obj0 = ALLOCNO_OBJECT (a, 0);
2992       if (OBJECT_MIN (obj0) > word0_min)
2993           OBJECT_MIN (obj0) = word0_min;
2994       if (OBJECT_MAX (obj0) < word0_max)
2995           OBJECT_MAX (obj0) = word0_max;
2996     }
2997 }
2998 
2999 
3000 
3001 static void
create_caps(void)3002 create_caps (void)
3003 {
3004   ira_allocno_t a;
3005   ira_allocno_iterator ai;
3006   ira_loop_tree_node_t loop_tree_node;
3007 
3008   FOR_EACH_ALLOCNO (a, ai)
3009     {
3010       if (ALLOCNO_LOOP_TREE_NODE (a) == ira_loop_tree_root)
3011           continue;
3012       if (ALLOCNO_CAP_MEMBER (a) != NULL)
3013           create_cap_allocno (a);
3014       else if (ALLOCNO_CAP (a) == NULL)
3015           {
3016             loop_tree_node = ALLOCNO_LOOP_TREE_NODE (a);
3017             if (!bitmap_bit_p (loop_tree_node->border_allocnos, ALLOCNO_NUM (a)))
3018               create_cap_allocno (a);
3019           }
3020     }
3021 }
3022 
3023 
3024 
3025 /* The page contains code transforming more one region internal
3026    representation (IR) to one region IR which is necessary for reload.
3027    This transformation is called IR flattening.  We might just rebuild
3028    the IR for one region but we don't do it because it takes a lot of
3029    time.  */
3030 
3031 /* Map: regno -> allocnos which will finally represent the regno for
3032    IR with one region.  */
3033 static ira_allocno_t *regno_top_level_allocno_map;
3034 
3035 /* Find the allocno that corresponds to A at a level one higher up in the
3036    loop tree.  Returns NULL if A is a cap, or if it has no parent.  */
3037 ira_allocno_t
ira_parent_allocno(ira_allocno_t a)3038 ira_parent_allocno (ira_allocno_t a)
3039 {
3040   ira_loop_tree_node_t parent;
3041 
3042   if (ALLOCNO_CAP (a) != NULL)
3043     return NULL;
3044 
3045   parent = ALLOCNO_LOOP_TREE_NODE (a)->parent;
3046   if (parent == NULL)
3047     return NULL;
3048 
3049   return parent->regno_allocno_map[ALLOCNO_REGNO (a)];
3050 }
3051 
3052 /* Find the allocno that corresponds to A at a level one higher up in the
3053    loop tree.  If ALLOCNO_CAP is set for A, return that.  */
3054 ira_allocno_t
ira_parent_or_cap_allocno(ira_allocno_t a)3055 ira_parent_or_cap_allocno (ira_allocno_t a)
3056 {
3057   if (ALLOCNO_CAP (a) != NULL)
3058     return ALLOCNO_CAP (a);
3059 
3060   return ira_parent_allocno (a);
3061 }
3062 
3063 /* Process all allocnos originated from pseudo REGNO and copy live
3064    ranges, hard reg conflicts, and allocno stack reg attributes from
3065    low level allocnos to final allocnos which are destinations of
3066    removed stores at a loop exit.  Return true if we copied live
3067    ranges.  */
3068 static bool
copy_info_to_removed_store_destinations(int regno)3069 copy_info_to_removed_store_destinations (int regno)
3070 {
3071   ira_allocno_t a;
3072   ira_allocno_t parent_a = NULL;
3073   ira_loop_tree_node_t parent;
3074   bool merged_p;
3075 
3076   merged_p = false;
3077   for (a = ira_regno_allocno_map[regno];
3078        a != NULL;
3079        a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
3080     {
3081       if (a != regno_top_level_allocno_map[REGNO (allocno_emit_reg (a))])
3082           /* This allocno will be removed.  */
3083           continue;
3084 
3085       /* Caps will be removed.  */
3086       ira_assert (ALLOCNO_CAP_MEMBER (a) == NULL);
3087       for (parent = ALLOCNO_LOOP_TREE_NODE (a)->parent;
3088              parent != NULL;
3089              parent = parent->parent)
3090           if ((parent_a = parent->regno_allocno_map[regno]) == NULL
3091               || (parent_a
3092                     == regno_top_level_allocno_map[REGNO
3093                                                          (allocno_emit_reg (parent_a))]
3094                     && ALLOCNO_EMIT_DATA (parent_a)->mem_optimized_dest_p))
3095             break;
3096       if (parent == NULL || parent_a == NULL)
3097           continue;
3098 
3099       copy_allocno_live_ranges (a, parent_a);
3100       merge_hard_reg_conflicts (a, parent_a, true);
3101 
3102       ALLOCNO_CALL_FREQ (parent_a) += ALLOCNO_CALL_FREQ (a);
3103       ALLOCNO_CALLS_CROSSED_NUM (parent_a)
3104           += ALLOCNO_CALLS_CROSSED_NUM (a);
3105       ALLOCNO_CHEAP_CALLS_CROSSED_NUM (parent_a)
3106           += ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a);
3107       ALLOCNO_CROSSED_CALLS_ABIS (parent_a)
3108           |= ALLOCNO_CROSSED_CALLS_ABIS (a);
3109       ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (parent_a)
3110           |= ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a);
3111       ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a)
3112           += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a);
3113       merged_p = true;
3114     }
3115   return merged_p;
3116 }
3117 
3118 /* Flatten the IR.  In other words, this function transforms IR as if
3119    it were built with one region (without loops).  We could make it
3120    much simpler by rebuilding IR with one region, but unfortunately it
3121    takes a lot of time.  MAX_REGNO_BEFORE_EMIT and
3122    IRA_MAX_POINT_BEFORE_EMIT are correspondingly MAX_REG_NUM () and
3123    IRA_MAX_POINT before emitting insns on the loop borders.  */
3124 void
ira_flattening(int max_regno_before_emit,int ira_max_point_before_emit)3125 ira_flattening (int max_regno_before_emit, int ira_max_point_before_emit)
3126 {
3127   int i, j;
3128   bool keep_p;
3129   int hard_regs_num;
3130   bool new_pseudos_p, merged_p, mem_dest_p;
3131   unsigned int n;
3132   enum reg_class aclass;
3133   ira_allocno_t a, parent_a, first, second, node_first, node_second;
3134   ira_copy_t cp;
3135   ira_loop_tree_node_t node;
3136   live_range_t r;
3137   ira_allocno_iterator ai;
3138   ira_copy_iterator ci;
3139 
3140   regno_top_level_allocno_map
3141     = (ira_allocno_t *) ira_allocate (max_reg_num ()
3142                                               * sizeof (ira_allocno_t));
3143   memset (regno_top_level_allocno_map, 0,
3144             max_reg_num () * sizeof (ira_allocno_t));
3145   new_pseudos_p = merged_p = false;
3146   FOR_EACH_ALLOCNO (a, ai)
3147     {
3148       ira_allocno_object_iterator oi;
3149       ira_object_t obj;
3150 
3151       if (ALLOCNO_CAP_MEMBER (a) != NULL)
3152           /* Caps are not in the regno allocno maps and they are never
3153              will be transformed into allocnos existing after IR
3154              flattening.  */
3155           continue;
3156       FOR_EACH_ALLOCNO_OBJECT (a, obj, oi)
3157           OBJECT_TOTAL_CONFLICT_HARD_REGS (obj)
3158             = OBJECT_CONFLICT_HARD_REGS (obj);
3159 #ifdef STACK_REGS
3160       ALLOCNO_TOTAL_NO_STACK_REG_P (a) = ALLOCNO_NO_STACK_REG_P (a);
3161 #endif
3162     }
3163   /* Fix final allocno attributes.  */
3164   for (i = max_regno_before_emit - 1; i >= FIRST_PSEUDO_REGISTER; i--)
3165     {
3166       mem_dest_p = false;
3167       for (a = ira_regno_allocno_map[i];
3168              a != NULL;
3169              a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
3170           {
3171             ira_emit_data_t parent_data, data = ALLOCNO_EMIT_DATA (a);
3172 
3173             ira_assert (ALLOCNO_CAP_MEMBER (a) == NULL);
3174             if (data->somewhere_renamed_p)
3175               new_pseudos_p = true;
3176             parent_a = ira_parent_allocno (a);
3177             if (parent_a == NULL)
3178               {
3179                 ALLOCNO_COPIES (a) = NULL;
3180                 regno_top_level_allocno_map[REGNO (data->reg)] = a;
3181                 continue;
3182               }
3183             ira_assert (ALLOCNO_CAP_MEMBER (parent_a) == NULL);
3184 
3185             if (data->mem_optimized_dest != NULL)
3186               mem_dest_p = true;
3187             parent_data = ALLOCNO_EMIT_DATA (parent_a);
3188             if (REGNO (data->reg) == REGNO (parent_data->reg))
3189               {
3190                 merge_hard_reg_conflicts (a, parent_a, true);
3191                 move_allocno_live_ranges (a, parent_a);
3192                 merged_p = true;
3193                 parent_data->mem_optimized_dest_p
3194                     = (parent_data->mem_optimized_dest_p
3195                        || data->mem_optimized_dest_p);
3196                 continue;
3197               }
3198             new_pseudos_p = true;
3199             for (;;)
3200               {
3201                 ALLOCNO_NREFS (parent_a) -= ALLOCNO_NREFS (a);
3202                 ALLOCNO_FREQ (parent_a) -= ALLOCNO_FREQ (a);
3203                 ALLOCNO_CALL_FREQ (parent_a) -= ALLOCNO_CALL_FREQ (a);
3204                 ALLOCNO_CALLS_CROSSED_NUM (parent_a)
3205                     -= ALLOCNO_CALLS_CROSSED_NUM (a);
3206                 ALLOCNO_CHEAP_CALLS_CROSSED_NUM (parent_a)
3207                     -= ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a);
3208                 /* Assume that ALLOCNO_CROSSED_CALLS_ABIS and
3209                      ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS stay the same.
3210                      We'd need to rebuild the IR to do better.  */
3211                 ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a)
3212                     -= ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a);
3213                 ira_assert (ALLOCNO_CALLS_CROSSED_NUM (parent_a) >= 0
3214                                 && ALLOCNO_NREFS (parent_a) >= 0
3215                                 && ALLOCNO_FREQ (parent_a) >= 0);
3216                 aclass = ALLOCNO_CLASS (parent_a);
3217                 hard_regs_num = ira_class_hard_regs_num[aclass];
3218                 if (ALLOCNO_HARD_REG_COSTS (a) != NULL
3219                       && ALLOCNO_HARD_REG_COSTS (parent_a) != NULL)
3220                     for (j = 0; j < hard_regs_num; j++)
3221                       ALLOCNO_HARD_REG_COSTS (parent_a)[j]
3222                         -= ALLOCNO_HARD_REG_COSTS (a)[j];
3223                 if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a) != NULL
3224                       && ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a) != NULL)
3225                     for (j = 0; j < hard_regs_num; j++)
3226                       ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a)[j]
3227                         -= ALLOCNO_CONFLICT_HARD_REG_COSTS (a)[j];
3228                 ALLOCNO_CLASS_COST (parent_a)
3229                     -= ALLOCNO_CLASS_COST (a);
3230                 ALLOCNO_MEMORY_COST (parent_a) -= ALLOCNO_MEMORY_COST (a);
3231                 parent_a = ira_parent_allocno (parent_a);
3232                 if (parent_a == NULL)
3233                     break;
3234               }
3235             ALLOCNO_COPIES (a) = NULL;
3236             regno_top_level_allocno_map[REGNO (data->reg)] = a;
3237           }
3238       if (mem_dest_p && copy_info_to_removed_store_destinations (i))
3239           merged_p = true;
3240     }
3241   ira_assert (new_pseudos_p || ira_max_point_before_emit == ira_max_point);
3242   if (merged_p || ira_max_point_before_emit != ira_max_point)
3243     ira_rebuild_start_finish_chains ();
3244   if (new_pseudos_p)
3245     {
3246       sparseset objects_live;
3247 
3248       /* Rebuild conflicts.  */
3249       FOR_EACH_ALLOCNO (a, ai)
3250           {
3251             ira_allocno_object_iterator oi;
3252             ira_object_t obj;
3253 
3254             if (a != regno_top_level_allocno_map[REGNO (allocno_emit_reg (a))]
3255                 || ALLOCNO_CAP_MEMBER (a) != NULL)
3256               continue;
3257             FOR_EACH_ALLOCNO_OBJECT (a, obj, oi)
3258               {
3259                 for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next)
3260                     ira_assert (r->object == obj);
3261                 clear_conflicts (obj);
3262               }
3263           }
3264       objects_live = sparseset_alloc (ira_objects_num);
3265       for (i = 0; i < ira_max_point; i++)
3266           {
3267             for (r = ira_start_point_ranges[i]; r != NULL; r = r->start_next)
3268               {
3269                 ira_object_t obj = r->object;
3270 
3271                 a = OBJECT_ALLOCNO (obj);
3272                 if (a != regno_top_level_allocno_map[REGNO (allocno_emit_reg (a))]
3273                       || ALLOCNO_CAP_MEMBER (a) != NULL)
3274                     continue;
3275 
3276                 aclass = ALLOCNO_CLASS (a);
3277                 EXECUTE_IF_SET_IN_SPARSESET (objects_live, n)
3278                     {
3279                       ira_object_t live_obj = ira_object_id_map[n];
3280                       ira_allocno_t live_a = OBJECT_ALLOCNO (live_obj);
3281                       enum reg_class live_aclass = ALLOCNO_CLASS (live_a);
3282 
3283                       if (ira_reg_classes_intersect_p[aclass][live_aclass]
3284                           /* Don't set up conflict for the allocno with itself.  */
3285                           && live_a != a)
3286                         ira_add_conflict (obj, live_obj);
3287                     }
3288                 sparseset_set_bit (objects_live, OBJECT_CONFLICT_ID (obj));
3289               }
3290 
3291             for (r = ira_finish_point_ranges[i]; r != NULL; r = r->finish_next)
3292               sparseset_clear_bit (objects_live, OBJECT_CONFLICT_ID (r->object));
3293           }
3294       sparseset_free (objects_live);
3295       compress_conflict_vecs ();
3296     }
3297   /* Mark some copies for removing and change allocnos in the rest
3298      copies.  */
3299   FOR_EACH_COPY (cp, ci)
3300     {
3301       if (ALLOCNO_CAP_MEMBER (cp->first) != NULL
3302             || ALLOCNO_CAP_MEMBER (cp->second) != NULL)
3303           {
3304             if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL)
3305               fprintf
3306                 (ira_dump_file, "      Remove cp%d:%c%dr%d-%c%dr%d\n",
3307                  cp->num, ALLOCNO_CAP_MEMBER (cp->first) != NULL ? 'c' : 'a',
3308                  ALLOCNO_NUM (cp->first),
3309                  REGNO (allocno_emit_reg (cp->first)),
3310                  ALLOCNO_CAP_MEMBER (cp->second) != NULL ? 'c' : 'a',
3311                  ALLOCNO_NUM (cp->second),
3312                  REGNO (allocno_emit_reg (cp->second)));
3313             cp->loop_tree_node = NULL;
3314             continue;
3315           }
3316       first
3317           = regno_top_level_allocno_map[REGNO (allocno_emit_reg (cp->first))];
3318       second
3319           = regno_top_level_allocno_map[REGNO (allocno_emit_reg (cp->second))];
3320       node = cp->loop_tree_node;
3321       if (node == NULL)
3322           keep_p = true; /* It copy generated in ira-emit.cc.  */
3323       else
3324           {
3325             /* Check that the copy was not propagated from level on
3326                which we will have different pseudos.  */
3327             node_first = node->regno_allocno_map[ALLOCNO_REGNO (cp->first)];
3328             node_second = node->regno_allocno_map[ALLOCNO_REGNO (cp->second)];
3329             keep_p = ((REGNO (allocno_emit_reg (first))
3330                          == REGNO (allocno_emit_reg (node_first)))
3331                          && (REGNO (allocno_emit_reg (second))
3332                                == REGNO (allocno_emit_reg (node_second))));
3333           }
3334       if (keep_p)
3335           {
3336             cp->loop_tree_node = ira_loop_tree_root;
3337             cp->first = first;
3338             cp->second = second;
3339           }
3340       else
3341           {
3342             cp->loop_tree_node = NULL;
3343             if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL)
3344               fprintf (ira_dump_file, "      Remove cp%d:a%dr%d-a%dr%d\n",
3345                          cp->num, ALLOCNO_NUM (cp->first),
3346                          REGNO (allocno_emit_reg (cp->first)),
3347                          ALLOCNO_NUM (cp->second),
3348                          REGNO (allocno_emit_reg (cp->second)));
3349           }
3350     }
3351   /* Remove unnecessary allocnos on lower levels of the loop tree.  */
3352   FOR_EACH_ALLOCNO (a, ai)
3353     {
3354       if (a != regno_top_level_allocno_map[REGNO (allocno_emit_reg (a))]
3355             || ALLOCNO_CAP_MEMBER (a) != NULL)
3356           {
3357             if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL)
3358               fprintf (ira_dump_file, "      Remove a%dr%d\n",
3359                          ALLOCNO_NUM (a), REGNO (allocno_emit_reg (a)));
3360             ira_remove_allocno_prefs (a);
3361             finish_allocno (a);
3362             continue;
3363           }
3364       ALLOCNO_LOOP_TREE_NODE (a) = ira_loop_tree_root;
3365       ALLOCNO_REGNO (a) = REGNO (allocno_emit_reg (a));
3366       ALLOCNO_CAP (a) = NULL;
3367       /* Restore updated costs for assignments from reload.  */
3368       ALLOCNO_UPDATED_MEMORY_COST (a) = ALLOCNO_MEMORY_COST (a);
3369       ALLOCNO_UPDATED_CLASS_COST (a) = ALLOCNO_CLASS_COST (a);
3370       if (! ALLOCNO_ASSIGNED_P (a))
3371           ira_free_allocno_updated_costs (a);
3372       ira_assert (ALLOCNO_UPDATED_HARD_REG_COSTS (a) == NULL);
3373       ira_assert (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) == NULL);
3374     }
3375   /* Remove unnecessary copies.  */
3376   FOR_EACH_COPY (cp, ci)
3377     {
3378       if (cp->loop_tree_node == NULL)
3379           {
3380             ira_copies[cp->num] = NULL;
3381             finish_copy (cp);
3382             continue;
3383           }
3384       ira_assert
3385           (ALLOCNO_LOOP_TREE_NODE (cp->first) == ira_loop_tree_root
3386            && ALLOCNO_LOOP_TREE_NODE (cp->second) == ira_loop_tree_root);
3387       add_allocno_copy_to_list (cp);
3388       swap_allocno_copy_ends_if_necessary (cp);
3389     }
3390   rebuild_regno_allocno_maps ();
3391   if (ira_max_point != ira_max_point_before_emit)
3392     ira_compress_allocno_live_ranges ();
3393   ira_free (regno_top_level_allocno_map);
3394 }
3395 
3396 
3397 
3398 #ifdef ENABLE_IRA_CHECKING
3399 /* Check creation of all allocnos.  Allocnos on lower levels should
3400    have allocnos or caps on all upper levels.  */
3401 static void
check_allocno_creation(void)3402 check_allocno_creation (void)
3403 {
3404   ira_allocno_t a;
3405   ira_allocno_iterator ai;
3406   ira_loop_tree_node_t loop_tree_node;
3407 
3408   FOR_EACH_ALLOCNO (a, ai)
3409     {
3410       loop_tree_node = ALLOCNO_LOOP_TREE_NODE (a);
3411       ira_assert (bitmap_bit_p (loop_tree_node->all_allocnos,
3412                                         ALLOCNO_NUM (a)));
3413       if (loop_tree_node == ira_loop_tree_root)
3414           continue;
3415       if (ALLOCNO_CAP_MEMBER (a) != NULL)
3416           ira_assert (ALLOCNO_CAP (a) != NULL);
3417       else if (ALLOCNO_CAP (a) == NULL)
3418           ira_assert (loop_tree_node->parent
3419                         ->regno_allocno_map[ALLOCNO_REGNO (a)] != NULL
3420                         && bitmap_bit_p (loop_tree_node->border_allocnos,
3421                                              ALLOCNO_NUM (a)));
3422     }
3423 }
3424 #endif
3425 
3426 /* Identify allocnos which prefer a register class with a single hard register.
3427    Adjust ALLOCNO_CONFLICT_HARD_REG_COSTS so that conflicting allocnos are
3428    less likely to use the preferred singleton register.  */
3429 static void
update_conflict_hard_reg_costs(void)3430 update_conflict_hard_reg_costs (void)
3431 {
3432   ira_allocno_t a;
3433   ira_allocno_iterator ai;
3434   int i, index, min;
3435 
3436   FOR_EACH_ALLOCNO (a, ai)
3437     {
3438       reg_class_t aclass = ALLOCNO_CLASS (a);
3439       reg_class_t pref = reg_preferred_class (ALLOCNO_REGNO (a));
3440       int singleton = ira_class_singleton[pref][ALLOCNO_MODE (a)];
3441       if (singleton < 0)
3442           continue;
3443       index = ira_class_hard_reg_index[(int) aclass][singleton];
3444       if (index < 0)
3445           continue;
3446       if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a) == NULL
3447             || ALLOCNO_HARD_REG_COSTS (a) == NULL)
3448           continue;
3449       min = INT_MAX;
3450       for (i = ira_class_hard_regs_num[(int) aclass] - 1; i >= 0; i--)
3451           if (ALLOCNO_HARD_REG_COSTS (a)[i] > ALLOCNO_CLASS_COST (a)
3452               && min > ALLOCNO_HARD_REG_COSTS (a)[i])
3453             min = ALLOCNO_HARD_REG_COSTS (a)[i];
3454       if (min == INT_MAX)
3455           continue;
3456       ira_allocate_and_set_costs (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a),
3457                                           aclass, 0);
3458       ALLOCNO_CONFLICT_HARD_REG_COSTS (a)[index]
3459           -= min - ALLOCNO_CLASS_COST (a);
3460     }
3461 }
3462 
3463 /* Create a internal representation (IR) for IRA (allocnos, copies,
3464    loop tree nodes).  The function returns TRUE if we generate loop
3465    structure (besides nodes representing all function and the basic
3466    blocks) for regional allocation.  A true return means that we
3467    really need to flatten IR before the reload.  */
3468 bool
ira_build(void)3469 ira_build (void)
3470 {
3471   bool loops_p;
3472 
3473   df_analyze ();
3474   initiate_cost_vectors ();
3475   initiate_allocnos ();
3476   initiate_prefs ();
3477   initiate_copies ();
3478   create_loop_tree_nodes ();
3479   form_loop_tree ();
3480   create_allocnos ();
3481   ira_costs ();
3482   create_allocno_objects ();
3483   ira_create_allocno_live_ranges ();
3484   remove_unnecessary_regions (false);
3485   ira_compress_allocno_live_ranges ();
3486   update_bad_spill_attribute ();
3487   loops_p = more_one_region_p ();
3488   if (loops_p)
3489     {
3490       propagate_allocno_info ();
3491       create_caps ();
3492     }
3493   ira_tune_allocno_costs ();
3494 #ifdef ENABLE_IRA_CHECKING
3495   check_allocno_creation ();
3496 #endif
3497   setup_min_max_allocno_live_range_point ();
3498   sort_conflict_id_map ();
3499   setup_min_max_conflict_allocno_ids ();
3500   ira_build_conflicts ();
3501   update_conflict_hard_reg_costs ();
3502   if (! ira_conflicts_p)
3503     {
3504       ira_allocno_t a;
3505       ira_allocno_iterator ai;
3506 
3507       /* Remove all regions but root one.  */
3508       if (loops_p)
3509           {
3510             remove_unnecessary_regions (true);
3511             loops_p = false;
3512           }
3513       /* We don't save hard registers around calls for fast allocation
3514            -- add caller clobbered registers as conflicting ones to
3515            allocno crossing calls.  */
3516       FOR_EACH_ALLOCNO (a, ai)
3517           if (ALLOCNO_CALLS_CROSSED_NUM (a) != 0)
3518             ior_hard_reg_conflicts (a, ira_need_caller_save_regs (a));
3519     }
3520   if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
3521     print_copies (ira_dump_file);
3522   if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
3523     print_prefs (ira_dump_file);
3524   if (internal_flag_ira_verbose > 0 && ira_dump_file != NULL)
3525     {
3526       int n, nr, nr_big;
3527       ira_allocno_t a;
3528       live_range_t r;
3529       ira_allocno_iterator ai;
3530 
3531       n = 0;
3532       nr = 0;
3533       nr_big = 0;
3534       FOR_EACH_ALLOCNO (a, ai)
3535           {
3536             int j, nobj = ALLOCNO_NUM_OBJECTS (a);
3537 
3538             if (nobj > 1)
3539               nr_big++;
3540             for (j = 0; j < nobj; j++)
3541               {
3542                 ira_object_t obj = ALLOCNO_OBJECT (a, j);
3543                 n += OBJECT_NUM_CONFLICTS (obj);
3544                 for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next)
3545                     nr++;
3546               }
3547           }
3548       fprintf (ira_dump_file, "  regions=%d, blocks=%d, points=%d\n",
3549                  current_loops == NULL ? 1 : number_of_loops (cfun),
3550                  n_basic_blocks_for_fn (cfun), ira_max_point);
3551       fprintf (ira_dump_file,
3552                  "    allocnos=%d (big %d), copies=%d, conflicts=%d, ranges=%d\n",
3553                  ira_allocnos_num, nr_big, ira_copies_num, n, nr);
3554     }
3555   return loops_p;
3556 }
3557 
3558 /* Release the data created by function ira_build.  */
3559 void
ira_destroy(void)3560 ira_destroy (void)
3561 {
3562   finish_loop_tree_nodes ();
3563   finish_prefs ();
3564   finish_copies ();
3565   finish_allocnos ();
3566   finish_cost_vectors ();
3567   ira_finish_allocno_live_ranges ();
3568 }
3569