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