OSDN Git Service

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