OSDN Git Service

Remove spurious ChangeLog entry
[pf3gnuchains/gcc-fork.git] / gcc / ira-color.c
1 /* IRA allocation based on graph coloring.
2    Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011
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 "sbitmap.h"
32 #include "bitmap.h"
33 #include "hard-reg-set.h"
34 #include "basic-block.h"
35 #include "expr.h"
36 #include "diagnostic-core.h"
37 #include "reload.h"
38 #include "params.h"
39 #include "df.h"
40 #include "ira-int.h"
41
42 typedef struct object_hard_regs *object_hard_regs_t;
43
44 /* The structure contains information about hard registers can be
45    assigned to objects.  Usually it is allocno profitable hard
46    registers but in some cases this set can be a bit different.  Major
47    reason of the difference is a requirement to use hard register sets
48    that form a tree or a forest (set of trees), i.e. hard register set
49    of a node should contain hard register sets of its subnodes.  */
50 struct object_hard_regs
51 {
52   /* Hard registers can be assigned to an allocno.  */
53   HARD_REG_SET set;
54   /* Overall (spilling) cost of all allocnos with given register
55      set.  */
56   long long int cost;
57 };
58
59 typedef struct object_hard_regs_node *object_hard_regs_node_t;
60
61 /* A node representing object hard registers.  Such nodes form a
62    forest (set of trees).  Each subnode of given node in the forest
63    refers for hard register set (usually object profitable hard
64    register set) which is a subset of one referred from given
65    node.  */
66 struct object_hard_regs_node
67 {
68   /* Set up number of the node in preorder traversing of the forest.  */
69   int preorder_num;
70   /* Used for different calculation like finding conflict size of an
71      allocno.  */
72   int check;
73   /* Used for calculation of conflict size of an allocno.  The
74      conflict size of the allocno is maximal number of given object
75      hard registers needed for allocation of the conflicting allocnos.
76      Given allocno is trivially colored if this number plus the number
77      of hard registers needed for given allocno is not greater than
78      the number of given allocno hard register set.  */
79   int conflict_size;
80   /* The number of hard registers given by member hard_regs.  */
81   int hard_regs_num;
82   /* The following member is used to form the final forest.  */
83   bool used_p;
84   /* Pointer to the corresponding profitable hard registers.  */
85   object_hard_regs_t hard_regs;
86   /* Parent, first subnode, previous and next node with the same
87      parent in the forest.  */
88   object_hard_regs_node_t parent, first, prev, next;
89 };
90
91 /* To decrease footprint of ira_allocno structure we store all data
92    needed only for coloring in the following structure.  */
93 struct allocno_color_data
94 {
95   /* TRUE value means that the allocno was not removed yet from the
96      conflicting graph during colouring.  */
97   unsigned int in_graph_p : 1;
98   /* TRUE if it is put on the stack to make other allocnos
99      colorable.  */
100   unsigned int may_be_spilled_p : 1;
101   /* TRUE if the object is trivially colorable.  */
102   unsigned int colorable_p : 1;
103   /* Number of hard registers of the allocno class really
104      available for the allocno allocation.  It is number of the
105      profitable hard regs.  */
106   int available_regs_num;
107   /* Allocnos in a bucket (used in coloring) chained by the following
108      two members.  */
109   ira_allocno_t next_bucket_allocno;
110   ira_allocno_t prev_bucket_allocno;
111   /* Used for temporary purposes.  */
112   int temp;
113 };
114
115 /* See above.  */
116 typedef struct allocno_color_data *allocno_color_data_t;
117
118 /* Container for storing allocno data concerning coloring.  */
119 static allocno_color_data_t allocno_color_data;
120
121 /* Macro to access the data concerning coloring.  */
122 #define ALLOCNO_COLOR_DATA(a) ((allocno_color_data_t) ALLOCNO_ADD_DATA (a))
123
124 /* To decrease footprint of ira_object structure we store all data
125    needed only for coloring in the following structure.  */
126 struct object_color_data
127 {
128   /* Profitable hard regs available for this pseudo allocation.  It
129      means that the set excludes unavailable hard regs and hard regs
130      conflicting with given pseudo.  They should be of the allocno
131      class.  */
132   HARD_REG_SET profitable_hard_regs;
133   /* The object hard registers node.  */
134   object_hard_regs_node_t hard_regs_node;
135   /* Array of structures object_hard_regs_subnode representing
136      given object hard registers node (the 1st element in the array)
137      and all its subnodes in the tree (forest) of object hard
138      register nodes (see comments above).  */
139   int hard_regs_subnodes_start;
140   /* The length of the previous array. */
141   int hard_regs_subnodes_num;
142 };
143
144 /* See above.  */
145 typedef struct object_color_data *object_color_data_t;
146
147 /* Container for storing object data concerning coloring.  */
148 static object_color_data_t object_color_data;
149
150 /* Macro to access the data concerning coloring.  */
151 #define OBJECT_COLOR_DATA(o) ((object_color_data_t) OBJECT_ADD_DATA (o))
152
153 /* This file contains code for regional graph coloring, spill/restore
154    code placement optimization, and code helping the reload pass to do
155    a better job.  */
156
157 /* Bitmap of allocnos which should be colored.  */
158 static bitmap coloring_allocno_bitmap;
159
160 /* Bitmap of allocnos which should be taken into account during
161    coloring.  In general case it contains allocnos from
162    coloring_allocno_bitmap plus other already colored conflicting
163    allocnos.  */
164 static bitmap consideration_allocno_bitmap;
165
166 /* All allocnos sorted according their priorities.  */
167 static ira_allocno_t *sorted_allocnos;
168
169 /* Vec representing the stack of allocnos used during coloring.  */
170 static VEC(ira_allocno_t,heap) *allocno_stack_vec;
171
172 /* Helper for qsort comparison callbacks - return a positive integer if
173    X > Y, or a negative value otherwise.  Use a conditional expression
174    instead of a difference computation to insulate from possible overflow
175    issues, e.g. X - Y < 0 for some X > 0 and Y < 0.  */
176 #define SORTGT(x,y) (((x) > (y)) ? 1 : -1)
177
178 \f
179
180 /* Definition of vector of object hard registers.  */
181 DEF_VEC_P(object_hard_regs_t);
182 DEF_VEC_ALLOC_P(object_hard_regs_t, heap);
183
184 /* Vector of unique object hard registers.  */
185 static VEC(object_hard_regs_t, heap) *object_hard_regs_vec;
186
187 /* Returns hash value for object hard registers V.  */
188 static hashval_t
189 object_hard_regs_hash (const void *v)
190 {
191   const struct object_hard_regs *hv = (const struct object_hard_regs *) v;
192
193   return iterative_hash (&hv->set, sizeof (HARD_REG_SET), 0);
194 }
195
196 /* Compares object hard registers V1 and V2.  */
197 static int
198 object_hard_regs_eq (const void *v1, const void *v2)
199 {
200   const struct object_hard_regs *hv1 = (const struct object_hard_regs *) v1;
201   const struct object_hard_regs *hv2 = (const struct object_hard_regs *) v2;
202
203   return hard_reg_set_equal_p (hv1->set, hv2->set);
204 }
205
206 /* Hash table of unique object hard registers.  */
207 static htab_t object_hard_regs_htab;
208
209 /* Return object hard registers in the hash table equal to HV.  */
210 static object_hard_regs_t
211 find_hard_regs (object_hard_regs_t hv)
212 {
213   return (object_hard_regs_t) htab_find (object_hard_regs_htab, hv);
214 }
215
216 /* Insert allocno hard registers HV in the hash table (if it is not
217    there yet) and return the value which in the table.  */
218 static object_hard_regs_t
219 insert_hard_regs (object_hard_regs_t hv)
220 {
221   PTR *slot = htab_find_slot (object_hard_regs_htab, hv, INSERT);
222
223   if (*slot == NULL)
224     *slot = hv;
225   return (object_hard_regs_t) *slot;
226 }
227
228 /* Initialize data concerning object hard registers.  */
229 static void
230 init_object_hard_regs (void)
231 {
232   object_hard_regs_vec = VEC_alloc (object_hard_regs_t, heap, 200);
233   object_hard_regs_htab
234     = htab_create (200, object_hard_regs_hash, object_hard_regs_eq, NULL);
235 }
236
237 /* Add (or update info about) object hard registers with SET and
238    COST.  */
239 static object_hard_regs_t
240 add_object_hard_regs (HARD_REG_SET set, long long int cost)
241 {
242   struct object_hard_regs temp;
243   object_hard_regs_t hv;
244
245   gcc_assert (! hard_reg_set_empty_p (set));
246   COPY_HARD_REG_SET (temp.set, set);
247   if ((hv = find_hard_regs (&temp)) != NULL)
248     hv->cost += cost;
249   else
250     {
251       hv = ((struct object_hard_regs *)
252             ira_allocate (sizeof (struct object_hard_regs)));
253       COPY_HARD_REG_SET (hv->set, set);
254       hv->cost = cost;
255       VEC_safe_push (object_hard_regs_t, heap, object_hard_regs_vec, hv);
256       insert_hard_regs (hv);
257     }
258   return hv;
259 }
260
261 /* Finalize data concerning allocno hard registers.  */
262 static void
263 finish_object_hard_regs (void)
264 {
265   int i;
266   object_hard_regs_t hv;
267
268   for (i = 0;
269        VEC_iterate (object_hard_regs_t, object_hard_regs_vec, i, hv);
270        i++)
271     ira_free (hv);
272   htab_delete (object_hard_regs_htab);
273   VEC_free (object_hard_regs_t, heap, object_hard_regs_vec);
274 }
275
276 /* Sort hard regs according to their frequency of usage. */
277 static int
278 object_hard_regs_compare (const void *v1p, const void *v2p)
279 {
280   object_hard_regs_t hv1 = *(const object_hard_regs_t *) v1p;
281   object_hard_regs_t hv2 = *(const object_hard_regs_t *) v2p;
282
283   if (hv2->cost > hv1->cost)
284     return 1;
285   else if (hv2->cost < hv1->cost)
286     return -1;
287   else
288     return 0;
289 }
290
291 \f
292
293 /* Used for finding a common ancestor of two allocno hard registers
294    nodes in the forest.  We use the current value of
295    'node_check_tick' to mark all nodes from one node to the top and
296    then walking up from another node until we find a marked node.
297
298    It is also used to figure out allocno colorability as a mark that
299    we already reset value of member 'conflict_size' for the forest
300    node corresponding to the processed allocno.  */
301 static int node_check_tick;
302
303 /* Roots of the forest containing hard register sets can be assigned
304    to objects.  */
305 static object_hard_regs_node_t hard_regs_roots;
306
307 /* Definition of vector of object hard register nodes.  */
308 DEF_VEC_P(object_hard_regs_node_t);
309 DEF_VEC_ALLOC_P(object_hard_regs_node_t, heap);
310
311 /* Vector used to create the forest.  */
312 static VEC(object_hard_regs_node_t, heap) *hard_regs_node_vec;
313
314 /* Create and return object hard registers node containing object
315    hard registers HV.  */
316 static object_hard_regs_node_t
317 create_new_object_hard_regs_node (object_hard_regs_t hv)
318 {
319   object_hard_regs_node_t new_node;
320
321   new_node = ((struct object_hard_regs_node *)
322               ira_allocate (sizeof (struct object_hard_regs_node)));
323   new_node->check = 0;
324   new_node->hard_regs = hv;
325   new_node->hard_regs_num = hard_reg_set_size (hv->set);
326   new_node->first = NULL;
327   new_node->used_p = false;
328   return new_node;
329 }
330
331 /* Add object hard registers node NEW_NODE to the forest on its level
332    given by ROOTS.  */
333 static void
334 add_new_object_hard_regs_node_to_forest (object_hard_regs_node_t *roots,
335                                           object_hard_regs_node_t new_node)
336 {
337   new_node->next = *roots;
338   if (new_node->next != NULL)
339     new_node->next->prev = new_node;
340   new_node->prev = NULL;
341   *roots = new_node;
342 }
343
344 /* Add object hard registers HV (or its best approximation if it is
345    not possible) to the forest on its level given by ROOTS.  */
346 static void
347 add_object_hard_regs_to_forest (object_hard_regs_node_t *roots,
348                                 object_hard_regs_t hv)
349 {
350   unsigned int i, start;
351   object_hard_regs_node_t node, prev, new_node;
352   HARD_REG_SET temp_set;
353   object_hard_regs_t hv2;
354
355   start = VEC_length (object_hard_regs_node_t, hard_regs_node_vec);
356   for (node = *roots; node != NULL; node = node->next)
357     {
358       if (hard_reg_set_equal_p (hv->set, node->hard_regs->set))
359         return;
360       if (hard_reg_set_subset_p (hv->set, node->hard_regs->set))
361         {
362           add_object_hard_regs_to_forest (&node->first, hv);
363           return;
364         }
365       if (hard_reg_set_subset_p (node->hard_regs->set, hv->set))
366         VEC_safe_push (object_hard_regs_node_t, heap,
367                        hard_regs_node_vec, node);
368       else if (hard_reg_set_intersect_p (hv->set, node->hard_regs->set))
369         {
370           COPY_HARD_REG_SET (temp_set, hv->set);
371           AND_HARD_REG_SET (temp_set, node->hard_regs->set);
372           hv2 = add_object_hard_regs (temp_set, hv->cost);
373           add_object_hard_regs_to_forest (&node->first, hv2);
374         }
375     }
376   if (VEC_length (object_hard_regs_node_t, hard_regs_node_vec)
377       > start + 1)
378     {
379       /* Create a new node which contains nodes in hard_regs_node_vec.  */
380       CLEAR_HARD_REG_SET (temp_set);
381       for (i = start;
382            i < VEC_length (object_hard_regs_node_t, hard_regs_node_vec);
383            i++)
384         {
385           node = VEC_index (object_hard_regs_node_t, hard_regs_node_vec, i);
386           IOR_HARD_REG_SET (temp_set, node->hard_regs->set);
387         }
388       hv = add_object_hard_regs (temp_set, hv->cost);
389       new_node = create_new_object_hard_regs_node (hv);
390       prev = NULL;
391       for (i = start;
392            i < VEC_length (object_hard_regs_node_t, hard_regs_node_vec);
393            i++)
394         {
395           node = VEC_index (object_hard_regs_node_t, hard_regs_node_vec, i);
396           if (node->prev == NULL)
397             *roots = node->next;
398           else
399             node->prev->next = node->next;
400           if (node->next != NULL)
401             node->next->prev = node->prev;
402           if (prev == NULL)
403             new_node->first = node;
404           else
405             prev->next = node;
406           node->prev = prev;
407           node->next = NULL;
408           prev = node;
409         }
410       add_new_object_hard_regs_node_to_forest (roots, new_node);
411     }
412   VEC_truncate (object_hard_regs_node_t, hard_regs_node_vec, start);
413 }
414
415 /* Add object hard registers nodes starting with the forest level
416    given by FIRST which contains biggest set inside SET.  */
417 static void
418 collect_object_hard_regs_cover (object_hard_regs_node_t first,
419                                  HARD_REG_SET set)
420 {
421   object_hard_regs_node_t node;
422
423   ira_assert (first != NULL);
424   for (node = first; node != NULL; node = node->next)
425     if (hard_reg_set_subset_p (node->hard_regs->set, set))
426       VEC_safe_push (object_hard_regs_node_t, heap, hard_regs_node_vec,
427                      node);
428     else if (hard_reg_set_intersect_p (set, node->hard_regs->set))
429       collect_object_hard_regs_cover (node->first, set);
430 }
431
432 /* Set up field parent as PARENT in all object hard registers nodes
433    in forest given by FIRST.  */
434 static void
435 setup_object_hard_regs_nodes_parent (object_hard_regs_node_t first,
436                                      object_hard_regs_node_t parent)
437 {
438   object_hard_regs_node_t node;
439
440   for (node = first; node != NULL; node = node->next)
441     {
442       node->parent = parent;
443       setup_object_hard_regs_nodes_parent (node->first, node);
444     }
445 }
446
447 /* Return object hard registers node which is a first common ancestor
448    node of FIRST and SECOND in the forest.  */
449 static object_hard_regs_node_t
450 first_common_ancestor_node (object_hard_regs_node_t first,
451                             object_hard_regs_node_t second)
452 {
453   object_hard_regs_node_t node;
454
455   node_check_tick++;
456   for (node = first; node != NULL; node = node->parent)
457     node->check = node_check_tick;
458   for (node = second; node != NULL; node = node->parent)
459     if (node->check == node_check_tick)
460       return node;
461   return first_common_ancestor_node (second, first);
462 }
463
464 /* Print hard reg set SET to F.  */
465 static void
466 print_hard_reg_set (FILE *f, HARD_REG_SET set, bool new_line_p)
467 {
468   int i, start;
469
470   for (start = -1, i = 0; i < FIRST_PSEUDO_REGISTER; i++)
471     {
472       if (TEST_HARD_REG_BIT (set, i))
473         {
474           if (i == 0 || ! TEST_HARD_REG_BIT (set, i - 1))
475             start = i;
476         }
477       if (start >= 0
478           && (i == FIRST_PSEUDO_REGISTER - 1 || ! TEST_HARD_REG_BIT (set, i)))
479         {
480           if (start == i - 1)
481             fprintf (f, " %d", start);
482           else if (start == i - 2)
483             fprintf (f, " %d %d", start, start + 1);
484           else
485             fprintf (f, " %d-%d", start, i - 1);
486           start = -1;
487         }
488     }
489   if (new_line_p)
490     fprintf (f, "\n");
491 }
492
493 /* Print object hard register subforest given by ROOTS and its LEVEL
494    to F.  */
495 static void
496 print_hard_regs_subforest (FILE *f, object_hard_regs_node_t roots,
497                            int level)
498 {
499   int i;
500   object_hard_regs_node_t node;
501
502   for (node = roots; node != NULL; node = node->next)
503     {
504       fprintf (f, "    ");
505       for (i = 0; i < level * 2; i++)
506         fprintf (f, " ");
507       fprintf (f, "%d:(", node->preorder_num);
508       print_hard_reg_set (f, node->hard_regs->set, false);
509       fprintf (f, ")@%lld\n", node->hard_regs->cost);
510       print_hard_regs_subforest (f, node->first, level + 1);
511     }
512 }
513
514 /* Print the object hard register forest to F.  */
515 static void
516 print_hard_regs_forest (FILE *f)
517 {
518   fprintf (f, "    Hard reg set forest:\n");
519   print_hard_regs_subforest (f, hard_regs_roots, 1);
520 }
521
522 /* Print the object hard register forest to stderr.  */
523 void
524 ira_debug_hard_regs_forest (void)
525 {
526   print_hard_regs_forest (stderr);
527 }
528
529 /* Remove unused object hard registers nodes from forest given by its
530    *ROOTS.  */
531 static void
532 remove_unused_object_hard_regs_nodes (object_hard_regs_node_t *roots)
533 {
534   object_hard_regs_node_t node, prev, next, last;
535
536   for (prev = NULL, node = *roots; node != NULL; node = next)
537     {
538       next = node->next;
539       if (node->used_p)
540         {
541           remove_unused_object_hard_regs_nodes (&node->first);
542           prev = node;
543         }
544       else
545         {
546           for (last = node->first;
547                last != NULL && last->next != NULL;
548                last = last->next)
549             ;
550           if (last != NULL)
551             {
552               if (prev == NULL)
553                 *roots = node->first;
554               else 
555                 prev->next = node->first;
556               if (next != NULL)
557                 next->prev = last;
558               last->next = next;
559               next = node->first;
560             }
561           else
562             {
563               if (prev == NULL)
564                 *roots = next;
565               else
566                 prev->next = next;
567               if (next != NULL)
568                 next->prev = prev;
569             }
570           ira_free (node);
571         }
572     }
573 }
574
575 /* Set up fields preorder_num starting with START_NUM in all object
576    hard registers nodes in forest given by FIRST.  Return biggest set
577    PREORDER_NUM increased by 1.  */
578 static int
579 enumerate_object_hard_regs_nodes (object_hard_regs_node_t first,
580                                   object_hard_regs_node_t parent,
581                                   int start_num)
582 {
583   object_hard_regs_node_t node;
584
585   for (node = first; node != NULL; node = node->next)
586     {
587       node->preorder_num = start_num++;
588       node->parent = parent;
589       start_num = enumerate_object_hard_regs_nodes (node->first, node,
590                                                     start_num);
591     }
592   return start_num;
593 }
594
595 /* Number of object hard registers nodes in the forest.  */
596 static int object_hard_regs_nodes_num;
597
598 /* Table preorder number of object hard registers node in the forest
599    -> the object hard registers node.  */
600 static object_hard_regs_node_t *object_hard_regs_nodes;
601
602 /* See below.  */
603 typedef struct object_hard_regs_subnode *object_hard_regs_subnode_t;
604
605 /* The structure is used to describes all subnodes (not only immediate
606    ones) in the mentioned above tree for given object hard register
607    node.  The usage of such data accelerates calculation of
608    colorability of given allocno.  */
609 struct object_hard_regs_subnode
610 {
611   /* The conflict size of conflicting allocnos whose hard register
612      sets are equal sets (plus supersets if given node is given
613      object hard registers node) of one in the given node.  */
614   int left_conflict_size;
615   /* The summary conflict size of conflicting allocnos whose hard
616      register sets are strict subsets of one in the given node.
617      Overall conflict size is
618      left_conflict_subnodes_size
619        + MIN (max_node_impact - left_conflict_subnodes_size,
620               left_conflict_size)
621   */
622   short left_conflict_subnodes_size;
623   short max_node_impact;
624 };
625
626 /* Container for hard regs subnodes of all objects.  */
627 static object_hard_regs_subnode_t object_hard_regs_subnodes;
628
629 /* Table (preorder number of object hard registers node in the
630    forest, preorder number of object hard registers subnode) -> index
631    of the subnode relative to the node.  -1 if it is not a
632    subnode.  */
633 static int *object_hard_regs_subnode_index;
634
635 /* Setup arrays OBJECT_HARD_REGS_NODES and
636    OBJECT_HARD_REGS_SUBNODE_INDEX.  */
637 static void
638 setup_object_hard_regs_subnode_index (object_hard_regs_node_t first)
639 {
640   object_hard_regs_node_t node, parent;
641   int index;
642
643   for (node = first; node != NULL; node = node->next)
644     {
645       object_hard_regs_nodes[node->preorder_num] = node;
646       for (parent = node; parent != NULL; parent = parent->parent)
647         {
648           index = parent->preorder_num * object_hard_regs_nodes_num;
649           object_hard_regs_subnode_index[index + node->preorder_num]
650             = node->preorder_num - parent->preorder_num;
651         }
652       setup_object_hard_regs_subnode_index (node->first);
653     }
654 }
655
656 /* Count all object hard registers nodes in tree ROOT.  */
657 static int
658 get_object_hard_regs_subnodes_num (object_hard_regs_node_t root)
659 {
660   int len = 1;
661
662   for (root = root->first; root != NULL; root = root->next)
663     len += get_object_hard_regs_subnodes_num (root);
664   return len;
665 }
666
667 /* Build the forest of object hard registers nodes and assign each
668    allocno a node from the forest.  */
669 static void
670 form_object_hard_regs_nodes_forest (void)
671 {
672   unsigned int i, j, size, len;
673   int start, k;
674   ira_allocno_t a;
675   object_hard_regs_t hv;
676   bitmap_iterator bi;
677   HARD_REG_SET temp;
678   object_hard_regs_node_t node, object_hard_regs_node;
679
680   node_check_tick = 0;
681   init_object_hard_regs ();
682   hard_regs_roots = NULL;
683   hard_regs_node_vec = VEC_alloc (object_hard_regs_node_t, heap, 100);
684   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
685     if (! TEST_HARD_REG_BIT (ira_no_alloc_regs, i))
686       {
687         CLEAR_HARD_REG_SET (temp);
688         SET_HARD_REG_BIT (temp, i);
689         hv = add_object_hard_regs (temp, 0);
690         node = create_new_object_hard_regs_node (hv);
691         add_new_object_hard_regs_node_to_forest (&hard_regs_roots, node);
692       }
693   start = VEC_length (object_hard_regs_t, object_hard_regs_vec);
694   EXECUTE_IF_SET_IN_BITMAP (coloring_allocno_bitmap, 0, i, bi)
695     {
696       a = ira_allocnos[i];
697       for (k = 0; k < ALLOCNO_NUM_OBJECTS (a); k++)
698         {
699           ira_object_t obj = ALLOCNO_OBJECT (a, k);
700           object_color_data_t obj_data = OBJECT_COLOR_DATA (obj);
701
702           if (hard_reg_set_empty_p (obj_data->profitable_hard_regs))
703             continue;
704           hv = (add_object_hard_regs
705                 (obj_data->profitable_hard_regs,
706                  ALLOCNO_MEMORY_COST (a) - ALLOCNO_CLASS_COST (a)));
707         }
708     }
709   SET_HARD_REG_SET (temp);
710   AND_COMPL_HARD_REG_SET (temp, ira_no_alloc_regs);
711   add_object_hard_regs (temp, 0);
712   qsort (VEC_address (object_hard_regs_t, object_hard_regs_vec) + start,
713          VEC_length (object_hard_regs_t, object_hard_regs_vec) - start,
714          sizeof (object_hard_regs_t), object_hard_regs_compare);
715   for (i = start;
716        VEC_iterate (object_hard_regs_t, object_hard_regs_vec, i, hv);
717        i++)
718     {
719       add_object_hard_regs_to_forest (&hard_regs_roots, hv);
720       ira_assert (VEC_length (object_hard_regs_node_t,
721                               hard_regs_node_vec) == 0);
722     }
723   /* We need to set up parent fields for right work of
724      first_common_ancestor_node. */
725   setup_object_hard_regs_nodes_parent (hard_regs_roots, NULL);
726   EXECUTE_IF_SET_IN_BITMAP (coloring_allocno_bitmap, 0, i, bi)
727     {
728       a = ira_allocnos[i];
729       for (k = 0; k < ALLOCNO_NUM_OBJECTS (a); k++)
730         {
731           ira_object_t obj = ALLOCNO_OBJECT (a, k);
732           object_color_data_t obj_data = OBJECT_COLOR_DATA (obj);
733           
734           if (hard_reg_set_empty_p (obj_data->profitable_hard_regs))
735             continue;
736           VEC_truncate (object_hard_regs_node_t, hard_regs_node_vec, 0);
737           collect_object_hard_regs_cover (hard_regs_roots,
738                                           obj_data->profitable_hard_regs);
739           object_hard_regs_node = NULL;
740           for (j = 0;
741                VEC_iterate (object_hard_regs_node_t, hard_regs_node_vec,
742                             j, node);
743                j++)
744             object_hard_regs_node
745               = (j == 0
746                  ? node
747                  : first_common_ancestor_node (node, object_hard_regs_node));
748           /* That is a temporary storage.  */
749           object_hard_regs_node->used_p = true;
750           obj_data->hard_regs_node = object_hard_regs_node;
751         }
752     }
753   ira_assert (hard_regs_roots->next == NULL);
754   hard_regs_roots->used_p = true;
755   remove_unused_object_hard_regs_nodes (&hard_regs_roots);
756   object_hard_regs_nodes_num
757     = enumerate_object_hard_regs_nodes (hard_regs_roots, NULL, 0);
758   object_hard_regs_nodes
759     = ((object_hard_regs_node_t *)
760        ira_allocate (object_hard_regs_nodes_num
761                      * sizeof (object_hard_regs_node_t)));
762   size = object_hard_regs_nodes_num * object_hard_regs_nodes_num;
763   object_hard_regs_subnode_index
764     = (int *) ira_allocate (size * sizeof (int));
765   for (i = 0; i < size; i++)
766     object_hard_regs_subnode_index[i] = -1;
767   setup_object_hard_regs_subnode_index (hard_regs_roots);
768   start = 0;
769   EXECUTE_IF_SET_IN_BITMAP (coloring_allocno_bitmap, 0, i, bi)
770     {
771       a = ira_allocnos[i];
772       for (k = 0; k < ALLOCNO_NUM_OBJECTS (a); k++)
773         {
774           ira_object_t obj = ALLOCNO_OBJECT (a, k);
775           object_color_data_t obj_data = OBJECT_COLOR_DATA (obj);
776           
777           if (hard_reg_set_empty_p (obj_data->profitable_hard_regs))
778             continue;
779           len = get_object_hard_regs_subnodes_num (obj_data->hard_regs_node);
780           obj_data->hard_regs_subnodes_start = start;
781           obj_data->hard_regs_subnodes_num = len;
782           start += len;
783         }
784     }
785   object_hard_regs_subnodes
786     = ((object_hard_regs_subnode_t)
787        ira_allocate (sizeof (struct object_hard_regs_subnode) * start));
788   VEC_free (object_hard_regs_node_t, heap, hard_regs_node_vec);
789 }
790
791 /* Free tree of object hard registers nodes given by its ROOT.  */
792 static void
793 finish_object_hard_regs_nodes_tree (object_hard_regs_node_t root)
794 {
795   object_hard_regs_node_t child, next;
796
797   for (child = root->first; child != NULL; child = next)
798     {
799       next = child->next;
800       finish_object_hard_regs_nodes_tree (child);
801     }
802   ira_free (root);
803 }
804
805 /* Finish work with the forest of object hard registers nodes.  */
806 static void
807 finish_object_hard_regs_nodes_forest (void)
808 {
809   object_hard_regs_node_t node, next;
810   
811   ira_free (object_hard_regs_subnodes);
812   for (node = hard_regs_roots; node != NULL; node = next)
813     {
814       next = node->next;
815       finish_object_hard_regs_nodes_tree (node);
816     }
817   ira_free (object_hard_regs_nodes);
818   ira_free (object_hard_regs_subnode_index);
819   finish_object_hard_regs ();
820 }
821
822 /* Set up left conflict sizes and left conflict subnodes sizes of hard
823    registers subnodes of allocno A.  Return TRUE if allocno A is
824    trivially colorable.  */
825 static bool
826 setup_left_conflict_sizes_p (ira_allocno_t a)
827 {
828   int k, nobj, conflict_size;
829   allocno_color_data_t data;
830
831   nobj = ALLOCNO_NUM_OBJECTS (a);
832   conflict_size = 0;
833   data = ALLOCNO_COLOR_DATA (a);
834   for (k = 0; k < nobj; k++)
835     {
836       int i, node_preorder_num, start, left_conflict_subnodes_size;
837       HARD_REG_SET profitable_hard_regs;
838       object_hard_regs_subnode_t subnodes;
839       object_hard_regs_node_t node;
840       HARD_REG_SET node_set;
841       ira_object_t obj = ALLOCNO_OBJECT (a, k);
842       ira_object_t conflict_obj;
843       ira_object_conflict_iterator oci;
844       object_color_data_t obj_data;
845       
846       node_check_tick++;
847       obj_data = OBJECT_COLOR_DATA (obj);
848       subnodes = object_hard_regs_subnodes + obj_data->hard_regs_subnodes_start;
849       COPY_HARD_REG_SET (profitable_hard_regs, obj_data->profitable_hard_regs);
850       node = obj_data->hard_regs_node;
851       node_preorder_num = node->preorder_num;
852       COPY_HARD_REG_SET (node_set, node->hard_regs->set);
853       FOR_EACH_OBJECT_CONFLICT (obj, conflict_obj, oci)
854         {
855           int size;
856           ira_allocno_t conflict_a = OBJECT_ALLOCNO (conflict_obj);
857           object_hard_regs_node_t conflict_node, temp_node;
858           HARD_REG_SET conflict_node_set;
859           object_color_data_t conflict_obj_data;
860
861           conflict_obj_data = OBJECT_COLOR_DATA (conflict_obj);
862           if (! ALLOCNO_COLOR_DATA (conflict_a)->in_graph_p
863               || ! hard_reg_set_intersect_p (profitable_hard_regs,
864                                              conflict_obj_data
865                                              ->profitable_hard_regs))
866             continue;
867           conflict_node = conflict_obj_data->hard_regs_node;
868           COPY_HARD_REG_SET (conflict_node_set, conflict_node->hard_regs->set);
869           if (hard_reg_set_subset_p (node_set, conflict_node_set))
870             temp_node = node;
871           else
872             {
873               ira_assert (hard_reg_set_subset_p (conflict_node_set, node_set));
874               temp_node = conflict_node;
875             }
876           if (temp_node->check != node_check_tick)
877             {
878               temp_node->check = node_check_tick;
879               temp_node->conflict_size = 0;
880             }
881           size = (ira_reg_class_max_nregs
882                   [ALLOCNO_CLASS (conflict_a)][ALLOCNO_MODE (conflict_a)]);
883           if (ALLOCNO_NUM_OBJECTS (conflict_a) > 1)
884             /* We will deal with the subwords individually.  */
885             size = 1;
886           temp_node->conflict_size += size;
887         }
888       for (i = 0; i < obj_data->hard_regs_subnodes_num; i++)
889         {
890           object_hard_regs_node_t temp_node;
891
892           temp_node = object_hard_regs_nodes[i + node_preorder_num];
893           ira_assert (temp_node->preorder_num == i + node_preorder_num);
894           subnodes[i].left_conflict_size = (temp_node->check != node_check_tick
895                                             ? 0 : temp_node->conflict_size);
896           if (hard_reg_set_subset_p (temp_node->hard_regs->set,
897                                      profitable_hard_regs))
898             subnodes[i].max_node_impact = temp_node->hard_regs_num;
899           else
900             {
901               HARD_REG_SET temp_set;
902               int j, n;
903               enum reg_class aclass;
904               
905               COPY_HARD_REG_SET (temp_set, temp_node->hard_regs->set);
906               AND_HARD_REG_SET (temp_set, profitable_hard_regs);
907               aclass = ALLOCNO_CLASS (a);
908               for (n = 0, j = ira_class_hard_regs_num[aclass] - 1; j >= 0; j--)
909                 if (TEST_HARD_REG_BIT (temp_set, ira_class_hard_regs[aclass][j]))
910                   n++;
911               subnodes[i].max_node_impact = n;
912             }
913           subnodes[i].left_conflict_subnodes_size = 0;
914         }
915       start = node_preorder_num * object_hard_regs_nodes_num;
916       for (i = obj_data->hard_regs_subnodes_num - 1; i >= 0; i--)
917         {
918           int size, parent_i;
919           object_hard_regs_node_t parent;
920
921           size = (subnodes[i].left_conflict_subnodes_size
922                   + MIN (subnodes[i].max_node_impact
923                          - subnodes[i].left_conflict_subnodes_size,
924                          subnodes[i].left_conflict_size));
925           parent = object_hard_regs_nodes[i + node_preorder_num]->parent;
926           if (parent == NULL)
927             continue;
928           parent_i
929             = object_hard_regs_subnode_index[start + parent->preorder_num];
930           if (parent_i < 0)
931             continue;
932           subnodes[parent_i].left_conflict_subnodes_size += size;
933         }
934       left_conflict_subnodes_size = subnodes[0].left_conflict_subnodes_size;
935       conflict_size
936         += (left_conflict_subnodes_size
937             + MIN (subnodes[0].max_node_impact - left_conflict_subnodes_size,
938                    subnodes[0].left_conflict_size));
939     }
940   conflict_size += ira_reg_class_max_nregs[ALLOCNO_CLASS (a)][ALLOCNO_MODE (a)];
941   data->colorable_p = conflict_size <= data->available_regs_num;
942   return data->colorable_p;
943 }
944
945 /* Update left conflict sizes of hard registers subnodes of allocno A
946    after removing allocno containing object REMOVED_OBJ with SIZE from
947    the conflict graph.  Return TRUE if A is trivially colorable.  */
948 static bool
949 update_left_conflict_sizes_p (ira_allocno_t a,
950                               ira_object_t removed_obj, int size)
951 {
952   int i, k, conflict_size, before_conflict_size, diff, start;
953   int node_preorder_num, parent_i;
954   object_hard_regs_node_t node, removed_node, parent;
955   object_hard_regs_subnode_t subnodes;
956   allocno_color_data_t data = ALLOCNO_COLOR_DATA (a);
957   bool colorable_p = true;
958
959   ira_assert (! data->colorable_p);
960   for (k = 0; k < ALLOCNO_NUM_OBJECTS (a); k++)
961     {
962       ira_object_t obj = ALLOCNO_OBJECT (a, k);
963       object_color_data_t obj_data = OBJECT_COLOR_DATA (obj);
964
965       node = obj_data->hard_regs_node;
966       node_preorder_num = node->preorder_num;
967       removed_node = OBJECT_COLOR_DATA (removed_obj)->hard_regs_node;
968       if (! hard_reg_set_subset_p (removed_node->hard_regs->set,
969                                    node->hard_regs->set)
970           && ! hard_reg_set_subset_p (node->hard_regs->set,
971                                       removed_node->hard_regs->set))
972         /* It is a rare case which can happen for conflicting
973            multi-object allocnos where only one pair of objects might
974            conflict.  */
975         continue;
976       start = node_preorder_num * object_hard_regs_nodes_num;
977       i = object_hard_regs_subnode_index[start + removed_node->preorder_num];
978       if (i < 0)
979         i = 0;
980       subnodes = object_hard_regs_subnodes + obj_data->hard_regs_subnodes_start;
981       before_conflict_size
982         = (subnodes[i].left_conflict_subnodes_size
983            + MIN (subnodes[i].max_node_impact
984                   - subnodes[i].left_conflict_subnodes_size,
985                   subnodes[i].left_conflict_size));
986       subnodes[i].left_conflict_size -= size;
987       for (;;)
988         {
989           conflict_size
990             = (subnodes[i].left_conflict_subnodes_size
991                + MIN (subnodes[i].max_node_impact
992                       - subnodes[i].left_conflict_subnodes_size,
993                       subnodes[i].left_conflict_size));
994           if ((diff = before_conflict_size - conflict_size) == 0)
995             break;
996           ira_assert (conflict_size < before_conflict_size);
997           parent = object_hard_regs_nodes[i + node_preorder_num]->parent;
998           if (parent == NULL)
999             break;
1000           parent_i
1001             = object_hard_regs_subnode_index[start + parent->preorder_num];
1002           if (parent_i < 0)
1003             break;
1004           i = parent_i;
1005           before_conflict_size
1006             = (subnodes[i].left_conflict_subnodes_size
1007                + MIN (subnodes[i].max_node_impact
1008                       - subnodes[i].left_conflict_subnodes_size,
1009                       subnodes[i].left_conflict_size));
1010           subnodes[i].left_conflict_subnodes_size -= diff;
1011         }
1012       if (i != 0
1013           || (conflict_size 
1014               + ira_reg_class_max_nregs[ALLOCNO_CLASS (a)][ALLOCNO_MODE (a)]
1015               > data->available_regs_num))
1016         {
1017           colorable_p = false;
1018           break;
1019         }
1020       }
1021   if (colorable_p)
1022     {
1023       data->colorable_p = true;
1024       return true;
1025     }
1026   return false;
1027 }
1028
1029 /* Return true if allocno A has an object with empty profitable hard
1030    regs.  */
1031 static bool
1032 empty_profitable_hard_regs (ira_allocno_t a)
1033 {
1034   int k, nobj;
1035
1036   nobj = ALLOCNO_NUM_OBJECTS (a);
1037   for (k = 0; k < nobj; k++)
1038     {
1039       ira_object_t obj = ALLOCNO_OBJECT (a, k);
1040       object_color_data_t obj_data = OBJECT_COLOR_DATA (obj);
1041
1042       if (hard_reg_set_empty_p (obj_data->profitable_hard_regs))
1043         return true;
1044     }
1045   return false;
1046 }
1047
1048 /* Set up profitable hard registers for each allocno being
1049    colored.  */
1050 static void
1051 setup_profitable_hard_regs (void)
1052 {
1053   unsigned int i;
1054   int j, k, nobj, hard_regno, nregs, class_size;
1055   ira_allocno_t a;
1056   bitmap_iterator bi;
1057   enum reg_class aclass;
1058   enum machine_mode mode;
1059
1060   /* Initial set up from allocno classes and explicitly conflicting
1061      hard regs.  */
1062   EXECUTE_IF_SET_IN_BITMAP (coloring_allocno_bitmap, 0, i, bi)
1063     {
1064       a = ira_allocnos[i];
1065       if ((aclass = ALLOCNO_CLASS (a)) == NO_REGS)
1066         continue;
1067       mode = ALLOCNO_MODE (a);
1068       nobj = ALLOCNO_NUM_OBJECTS (a);
1069       for (k = 0; k < nobj; k++)
1070         {
1071           ira_object_t obj = ALLOCNO_OBJECT (a, k);
1072           object_color_data_t obj_data = OBJECT_COLOR_DATA (obj);
1073
1074           if (ALLOCNO_UPDATED_HARD_REG_COSTS (a) == NULL
1075               && ALLOCNO_CLASS_COST (a) > ALLOCNO_MEMORY_COST (a))
1076             CLEAR_HARD_REG_SET (obj_data->profitable_hard_regs);
1077           else
1078             {
1079               COPY_HARD_REG_SET (obj_data->profitable_hard_regs,
1080                                  reg_class_contents[aclass]);
1081               AND_COMPL_HARD_REG_SET (obj_data->profitable_hard_regs,
1082                                       ira_no_alloc_regs);
1083               AND_COMPL_HARD_REG_SET (obj_data->profitable_hard_regs,
1084                                       OBJECT_TOTAL_CONFLICT_HARD_REGS (obj));
1085             }
1086         }
1087     }
1088   /* Exclude hard regs already assigned for conflicting objects.  */
1089   EXECUTE_IF_SET_IN_BITMAP (consideration_allocno_bitmap, 0, i, bi)
1090     {
1091       a = ira_allocnos[i];
1092       if ((aclass = ALLOCNO_CLASS (a)) == NO_REGS
1093           || ! ALLOCNO_ASSIGNED_P (a)
1094           || (hard_regno = ALLOCNO_HARD_REGNO (a)) < 0)
1095         continue;
1096       mode = ALLOCNO_MODE (a);
1097       nregs = hard_regno_nregs[hard_regno][mode];
1098       nobj = ALLOCNO_NUM_OBJECTS (a);
1099       for (k = 0; k < nobj; k++)
1100         {
1101           ira_object_t obj = ALLOCNO_OBJECT (a, k);
1102           ira_object_t conflict_obj;
1103           ira_object_conflict_iterator oci;
1104
1105           FOR_EACH_OBJECT_CONFLICT (obj, conflict_obj, oci)
1106             {
1107               if (nregs == nobj && nregs > 1)
1108                 {
1109                   int num = OBJECT_SUBWORD (conflict_obj);
1110                   
1111                   if (WORDS_BIG_ENDIAN)
1112                     CLEAR_HARD_REG_BIT
1113                       (OBJECT_COLOR_DATA (conflict_obj)->profitable_hard_regs,
1114                        hard_regno + nobj - num - 1);
1115                   else
1116                     CLEAR_HARD_REG_BIT
1117                       (OBJECT_COLOR_DATA (conflict_obj)->profitable_hard_regs,
1118                        hard_regno + num);
1119                 }
1120               else
1121                 AND_COMPL_HARD_REG_SET
1122                   (OBJECT_COLOR_DATA (conflict_obj)->profitable_hard_regs,
1123                    ira_reg_mode_hard_regset[hard_regno][mode]);
1124             }
1125         }
1126     }
1127   /* Exclude too costly hard regs.  */
1128   EXECUTE_IF_SET_IN_BITMAP (coloring_allocno_bitmap, 0, i, bi)
1129     {
1130       int min_cost = INT_MAX;
1131       int *costs;
1132
1133       a = ira_allocnos[i];
1134       if ((aclass = ALLOCNO_CLASS (a)) == NO_REGS
1135           || empty_profitable_hard_regs (a))
1136         continue;
1137       mode = ALLOCNO_MODE (a);
1138       nobj = ALLOCNO_NUM_OBJECTS (a);
1139       for (k = 0; k < nobj; k++)
1140         {
1141           ira_object_t obj = ALLOCNO_OBJECT (a, k);
1142           object_color_data_t obj_data = OBJECT_COLOR_DATA (obj);
1143
1144           if ((costs = ALLOCNO_UPDATED_HARD_REG_COSTS (a)) != NULL
1145               || (costs = ALLOCNO_HARD_REG_COSTS (a)) != NULL)
1146             {
1147               class_size = ira_class_hard_regs_num[aclass];
1148               for (j = 0; j < class_size; j++)
1149                 {
1150                   hard_regno = ira_class_hard_regs[aclass][j];
1151                   nregs = hard_regno_nregs[hard_regno][mode];
1152                   if (nregs == nobj && nregs > 1)
1153                     {
1154                       int num = OBJECT_SUBWORD (obj);
1155
1156                       if (WORDS_BIG_ENDIAN)
1157                         hard_regno += nobj - num - 1;
1158                       else
1159                         hard_regno += num;
1160                     }
1161                   if (! TEST_HARD_REG_BIT (obj_data->profitable_hard_regs,
1162                                            hard_regno))
1163                     continue;
1164                   if (ALLOCNO_UPDATED_MEMORY_COST (a) < costs[j])
1165                     CLEAR_HARD_REG_BIT (obj_data->profitable_hard_regs,
1166                                         hard_regno);
1167                   else if (min_cost > costs[j])
1168                     min_cost = costs[j];
1169                 }
1170             }
1171           else if (ALLOCNO_UPDATED_MEMORY_COST (a)
1172                    < ALLOCNO_UPDATED_CLASS_COST (a))
1173             CLEAR_HARD_REG_SET (obj_data->profitable_hard_regs);
1174         }
1175       if (ALLOCNO_UPDATED_CLASS_COST (a) > min_cost)
1176         ALLOCNO_UPDATED_CLASS_COST (a) = min_cost;
1177     }
1178 }
1179
1180 \f
1181
1182 /* This page contains functions used to choose hard registers for
1183    allocnos.  */
1184
1185 /* Array whose element value is TRUE if the corresponding hard
1186    register was already allocated for an allocno.  */
1187 static bool allocated_hardreg_p[FIRST_PSEUDO_REGISTER];
1188
1189 /* Describes one element in a queue of allocnos whose costs need to be
1190    updated.  Each allocno in the queue is known to have an allocno
1191    class.  */
1192 struct update_cost_queue_elem
1193 {
1194   /* This element is in the queue iff CHECK == update_cost_check.  */
1195   int check;
1196
1197   /* COST_HOP_DIVISOR**N, where N is the length of the shortest path
1198      connecting this allocno to the one being allocated.  */
1199   int divisor;
1200
1201   /* The next allocno in the queue, or null if this is the last element.  */
1202   ira_allocno_t next;
1203 };
1204
1205 /* The first element in a queue of allocnos whose copy costs need to be
1206    updated.  Null if the queue is empty.  */
1207 static ira_allocno_t update_cost_queue;
1208
1209 /* The last element in the queue described by update_cost_queue.
1210    Not valid if update_cost_queue is null.  */
1211 static struct update_cost_queue_elem *update_cost_queue_tail;
1212
1213 /* A pool of elements in the queue described by update_cost_queue.
1214    Elements are indexed by ALLOCNO_NUM.  */
1215 static struct update_cost_queue_elem *update_cost_queue_elems;
1216
1217 /* The current value of update_copy_cost call count.  */
1218 static int update_cost_check;
1219
1220 /* Allocate and initialize data necessary for function
1221    update_copy_costs.  */
1222 static void
1223 initiate_cost_update (void)
1224 {
1225   size_t size;
1226
1227   size = ira_allocnos_num * sizeof (struct update_cost_queue_elem);
1228   update_cost_queue_elems
1229     = (struct update_cost_queue_elem *) ira_allocate (size);
1230   memset (update_cost_queue_elems, 0, size);
1231   update_cost_check = 0;
1232 }
1233
1234 /* Deallocate data used by function update_copy_costs.  */
1235 static void
1236 finish_cost_update (void)
1237 {
1238   ira_free (update_cost_queue_elems);
1239 }
1240
1241 /* When we traverse allocnos to update hard register costs, the cost
1242    divisor will be multiplied by the following macro value for each
1243    hop from given allocno to directly connected allocnos.  */
1244 #define COST_HOP_DIVISOR 4
1245
1246 /* Start a new cost-updating pass.  */
1247 static void
1248 start_update_cost (void)
1249 {
1250   update_cost_check++;
1251   update_cost_queue = NULL;
1252 }
1253
1254 /* Add (ALLOCNO, DIVISOR) to the end of update_cost_queue, unless
1255    ALLOCNO is already in the queue, or has NO_REGS class.  */
1256 static inline void
1257 queue_update_cost (ira_allocno_t allocno, int divisor)
1258 {
1259   struct update_cost_queue_elem *elem;
1260
1261   elem = &update_cost_queue_elems[ALLOCNO_NUM (allocno)];
1262   if (elem->check != update_cost_check
1263       && ALLOCNO_CLASS (allocno) != NO_REGS)
1264     {
1265       elem->check = update_cost_check;
1266       elem->divisor = divisor;
1267       elem->next = NULL;
1268       if (update_cost_queue == NULL)
1269         update_cost_queue = allocno;
1270       else
1271         update_cost_queue_tail->next = allocno;
1272       update_cost_queue_tail = elem;
1273     }
1274 }
1275
1276 /* Try to remove the first element from update_cost_queue.  Return false
1277    if the queue was empty, otherwise make (*ALLOCNO, *DIVISOR) describe
1278    the removed element.  */
1279 static inline bool
1280 get_next_update_cost (ira_allocno_t *allocno, int *divisor)
1281 {
1282   struct update_cost_queue_elem *elem;
1283
1284   if (update_cost_queue == NULL)
1285     return false;
1286
1287   *allocno = update_cost_queue;
1288   elem = &update_cost_queue_elems[ALLOCNO_NUM (*allocno)];
1289   *divisor = elem->divisor;
1290   update_cost_queue = elem->next;
1291   return true;
1292 }
1293
1294 /* Update the cost of allocnos to increase chances to remove some
1295    copies as the result of subsequent assignment.  */
1296 static void
1297 update_copy_costs (ira_allocno_t allocno, bool decr_p)
1298 {
1299   int i, cost, update_cost, hard_regno, divisor;
1300   enum machine_mode mode;
1301   enum reg_class rclass, aclass;
1302   ira_allocno_t another_allocno;
1303   ira_copy_t cp, next_cp;
1304
1305   hard_regno = ALLOCNO_HARD_REGNO (allocno);
1306   ira_assert (hard_regno >= 0);
1307
1308   aclass = ALLOCNO_CLASS (allocno);
1309   if (aclass == NO_REGS)
1310     return;
1311   i = ira_class_hard_reg_index[aclass][hard_regno];
1312   ira_assert (i >= 0);
1313   rclass = REGNO_REG_CLASS (hard_regno);
1314
1315   start_update_cost ();
1316   divisor = 1;
1317   do
1318     {
1319       mode = ALLOCNO_MODE (allocno);
1320       ira_init_register_move_cost_if_necessary (mode);
1321       for (cp = ALLOCNO_COPIES (allocno); cp != NULL; cp = next_cp)
1322         {
1323           if (cp->first == allocno)
1324             {
1325               next_cp = cp->next_first_allocno_copy;
1326               another_allocno = cp->second;
1327             }
1328           else if (cp->second == allocno)
1329             {
1330               next_cp = cp->next_second_allocno_copy;
1331               another_allocno = cp->first;
1332             }
1333           else
1334             gcc_unreachable ();
1335
1336           aclass = ALLOCNO_CLASS (another_allocno);
1337           if (! TEST_HARD_REG_BIT (reg_class_contents[aclass],
1338                                    hard_regno)
1339               || ALLOCNO_ASSIGNED_P (another_allocno))
1340             continue;
1341
1342           cost = (cp->second == allocno
1343                   ? ira_register_move_cost[mode][rclass][aclass]
1344                   : ira_register_move_cost[mode][aclass][rclass]);
1345           if (decr_p)
1346             cost = -cost;
1347
1348           update_cost = cp->freq * cost / divisor;
1349           if (update_cost == 0)
1350             continue;
1351
1352           ira_allocate_and_set_or_copy_costs
1353             (&ALLOCNO_UPDATED_HARD_REG_COSTS (another_allocno), aclass,
1354              ALLOCNO_UPDATED_CLASS_COST (another_allocno),
1355              ALLOCNO_HARD_REG_COSTS (another_allocno));
1356           ira_allocate_and_set_or_copy_costs
1357             (&ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (another_allocno),
1358              aclass, 0, ALLOCNO_CONFLICT_HARD_REG_COSTS (another_allocno));
1359           i = ira_class_hard_reg_index[aclass][hard_regno];
1360           if (i < 0)
1361             continue;
1362           ALLOCNO_UPDATED_HARD_REG_COSTS (another_allocno)[i] += update_cost;
1363           ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (another_allocno)[i]
1364             += update_cost;
1365
1366           queue_update_cost (another_allocno, divisor * COST_HOP_DIVISOR);
1367         }
1368     }
1369   while (get_next_update_cost (&allocno, &divisor));
1370 }
1371
1372 /* This function updates COSTS (decrease if DECR_P) for hard_registers
1373    of ACLASS by conflict costs of the unassigned allocnos
1374    connected by copies with allocnos in update_cost_queue.  This
1375    update increases chances to remove some copies.  */
1376 static void
1377 update_conflict_hard_regno_costs (int *costs, enum reg_class aclass,
1378                                   bool decr_p)
1379 {
1380   int i, cost, class_size, freq, mult, div, divisor;
1381   int index, hard_regno;
1382   int *conflict_costs;
1383   bool cont_p;
1384   enum reg_class another_aclass;
1385   ira_allocno_t allocno, another_allocno;
1386   ira_copy_t cp, next_cp;
1387
1388   while (get_next_update_cost (&allocno, &divisor))
1389     for (cp = ALLOCNO_COPIES (allocno); cp != NULL; cp = next_cp)
1390       {
1391         if (cp->first == allocno)
1392           {
1393             next_cp = cp->next_first_allocno_copy;
1394             another_allocno = cp->second;
1395           }
1396         else if (cp->second == allocno)
1397           {
1398             next_cp = cp->next_second_allocno_copy;
1399             another_allocno = cp->first;
1400           }
1401         else
1402           gcc_unreachable ();
1403         another_aclass = ALLOCNO_CLASS (another_allocno);
1404         if (! ira_reg_classes_intersect_p[aclass][another_aclass]
1405             || ALLOCNO_ASSIGNED_P (another_allocno)
1406             || ALLOCNO_COLOR_DATA (another_allocno)->may_be_spilled_p)
1407           continue;
1408         class_size = ira_class_hard_regs_num[another_aclass];
1409         ira_allocate_and_copy_costs
1410           (&ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (another_allocno),
1411            another_aclass, ALLOCNO_CONFLICT_HARD_REG_COSTS (another_allocno));
1412         conflict_costs
1413           = ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (another_allocno);
1414         if (conflict_costs == NULL)
1415           cont_p = true;
1416         else
1417           {
1418             mult = cp->freq;
1419             freq = ALLOCNO_FREQ (another_allocno);
1420             if (freq == 0)
1421               freq = 1;
1422             div = freq * divisor;
1423             cont_p = false;
1424             for (i = class_size - 1; i >= 0; i--)
1425               {
1426                 hard_regno = ira_class_hard_regs[another_aclass][i];
1427                 ira_assert (hard_regno >= 0);
1428                 index = ira_class_hard_reg_index[aclass][hard_regno];
1429                 if (index < 0)
1430                   continue;
1431                 cost = conflict_costs [i] * mult / div;
1432                 if (cost == 0)
1433                   continue;
1434                 cont_p = true;
1435                 if (decr_p)
1436                   cost = -cost;
1437                 costs[index] += cost;
1438               }
1439           }
1440         /* Probably 5 hops will be enough.  */
1441         if (cont_p
1442             && divisor <= (COST_HOP_DIVISOR
1443                            * COST_HOP_DIVISOR
1444                            * COST_HOP_DIVISOR
1445                            * COST_HOP_DIVISOR))
1446           queue_update_cost (another_allocno, divisor * COST_HOP_DIVISOR);
1447       }
1448 }
1449
1450 /* Set up conflicting and profitable regs (through CONFLICT_REGS and
1451    PROFITABLE_REGS) for each object of allocno A.  Remember that the
1452    profitable regs exclude hard regs which can not hold value of mode
1453    of allocno A.  */
1454 static inline void
1455 get_conflict_profitable_regs (ira_allocno_t a, bool retry_p,
1456                               HARD_REG_SET *conflict_regs,
1457                               HARD_REG_SET *profitable_regs)
1458 {
1459   int i, nwords;
1460   ira_object_t obj;
1461
1462   nwords = ALLOCNO_NUM_OBJECTS (a);
1463   for (i = 0; i < nwords; i++)
1464     {
1465       obj = ALLOCNO_OBJECT (a, i);
1466       COPY_HARD_REG_SET (conflict_regs[i],
1467                          OBJECT_TOTAL_CONFLICT_HARD_REGS (obj));
1468       if (retry_p)
1469         {
1470           COPY_HARD_REG_SET (profitable_regs[i],
1471                              reg_class_contents[ALLOCNO_CLASS (a)]);
1472           AND_COMPL_HARD_REG_SET (profitable_regs[i],
1473                                   ira_prohibited_class_mode_regs
1474                                   [ALLOCNO_CLASS (a)][ALLOCNO_MODE (a)]);
1475         }
1476       else
1477         COPY_HARD_REG_SET (profitable_regs[i],
1478                            OBJECT_COLOR_DATA (obj)->profitable_hard_regs);
1479     }
1480 }
1481
1482 /* Return true if HARD_REGNO is ok for assigning to allocno A whose
1483    objects have corresponding CONFLICT_REGS and PROFITABLE_REGS.  */
1484 static inline bool
1485 check_hard_reg_p (ira_allocno_t a, int hard_regno,
1486                   HARD_REG_SET *conflict_regs, HARD_REG_SET *profitable_regs)
1487 {
1488   int j, nwords, nregs;
1489   enum reg_class aclass;
1490   enum machine_mode mode;
1491
1492   aclass = ALLOCNO_CLASS (a);
1493   mode = ALLOCNO_MODE (a);
1494   if (TEST_HARD_REG_BIT (ira_prohibited_class_mode_regs[aclass][mode],
1495                          hard_regno))
1496     return false;
1497   nregs = hard_regno_nregs[hard_regno][mode];
1498   nwords = ALLOCNO_NUM_OBJECTS (a);
1499   for (j = 0; j < nregs; j++)
1500     {
1501       int k;
1502       int set_to_test_start = 0, set_to_test_end = nwords;
1503       
1504       if (nregs == nwords)
1505         {
1506           if (WORDS_BIG_ENDIAN)
1507             set_to_test_start = nwords - j - 1;
1508           else
1509             set_to_test_start = j;
1510           set_to_test_end = set_to_test_start + 1;
1511         }
1512       for (k = set_to_test_start; k < set_to_test_end; k++)
1513         /* Checking only profitable hard regs.  */
1514         if (TEST_HARD_REG_BIT (conflict_regs[k], hard_regno + j)
1515             || ! TEST_HARD_REG_BIT (profitable_regs[k], hard_regno + j))
1516           break;
1517       if (k != set_to_test_end)
1518         break;
1519     }
1520   return j == nregs;
1521 }
1522
1523 /* Choose a hard register for allocno A.  If RETRY_P is TRUE, it means
1524    that the function called from function
1525    `ira_reassign_conflict_allocnos' and `allocno_reload_assign'.  In
1526    this case some allocno data are not defined or updated and we
1527    should not touch these data.  The function returns true if we
1528    managed to assign a hard register to the allocno.
1529
1530    To assign a hard register, first of all we calculate all conflict
1531    hard registers which can come from conflicting allocnos with
1532    already assigned hard registers.  After that we find first free
1533    hard register with the minimal cost.  During hard register cost
1534    calculation we take conflict hard register costs into account to
1535    give a chance for conflicting allocnos to get a better hard
1536    register in the future.
1537
1538    If the best hard register cost is bigger than cost of memory usage
1539    for the allocno, we don't assign a hard register to given allocno
1540    at all.
1541
1542    If we assign a hard register to the allocno, we update costs of the
1543    hard register for allocnos connected by copies to improve a chance
1544    to coalesce insns represented by the copies when we assign hard
1545    registers to the allocnos connected by the copies.  */
1546 static bool
1547 assign_hard_reg (ira_allocno_t a, bool retry_p)
1548 {
1549   HARD_REG_SET conflicting_regs[2], profitable_hard_regs[2];
1550   int i, j, hard_regno, best_hard_regno, class_size;
1551   int cost, mem_cost, min_cost, full_cost, min_full_cost, nwords, word;
1552   int *a_costs;
1553   enum reg_class aclass;
1554   enum machine_mode mode;
1555   static int costs[FIRST_PSEUDO_REGISTER], full_costs[FIRST_PSEUDO_REGISTER];
1556 #ifndef HONOR_REG_ALLOC_ORDER
1557   enum reg_class rclass;
1558   int add_cost;
1559 #endif
1560 #ifdef STACK_REGS
1561   bool no_stack_reg_p;
1562 #endif
1563
1564   ira_assert (! ALLOCNO_ASSIGNED_P (a));
1565   get_conflict_profitable_regs (a, retry_p,
1566                                 conflicting_regs, profitable_hard_regs);
1567   aclass = ALLOCNO_CLASS (a);
1568   class_size = ira_class_hard_regs_num[aclass];
1569   best_hard_regno = -1;
1570   memset (full_costs, 0, sizeof (int) * class_size);
1571   mem_cost = 0;
1572   memset (costs, 0, sizeof (int) * class_size);
1573   memset (full_costs, 0, sizeof (int) * class_size);
1574 #ifdef STACK_REGS
1575   no_stack_reg_p = false;
1576 #endif
1577   if (! retry_p)
1578     start_update_cost ();
1579   mem_cost += ALLOCNO_UPDATED_MEMORY_COST (a);
1580   
1581   ira_allocate_and_copy_costs (&ALLOCNO_UPDATED_HARD_REG_COSTS (a),
1582                                aclass, ALLOCNO_HARD_REG_COSTS (a));
1583   a_costs = ALLOCNO_UPDATED_HARD_REG_COSTS (a);
1584 #ifdef STACK_REGS
1585   no_stack_reg_p = no_stack_reg_p || ALLOCNO_TOTAL_NO_STACK_REG_P (a);
1586 #endif
1587   cost = ALLOCNO_UPDATED_CLASS_COST (a);
1588   for (i = 0; i < class_size; i++)
1589     if (a_costs != NULL)
1590       {
1591         costs[i] += a_costs[i];
1592         full_costs[i] += a_costs[i];
1593       }
1594     else
1595       {
1596         costs[i] += cost;
1597         full_costs[i] += cost;
1598       }
1599   nwords = ALLOCNO_NUM_OBJECTS (a);
1600   for (word = 0; word < nwords; word++)
1601     {
1602       ira_object_t conflict_obj;
1603       ira_object_t obj = ALLOCNO_OBJECT (a, word);
1604       ira_object_conflict_iterator oci;
1605       
1606       /* Take preferences of conflicting allocnos into account.  */
1607       FOR_EACH_OBJECT_CONFLICT (obj, conflict_obj, oci)
1608         {
1609           ira_allocno_t conflict_a = OBJECT_ALLOCNO (conflict_obj);
1610           enum reg_class conflict_aclass;
1611
1612           /* Reload can give another class so we need to check all
1613              allocnos.  */
1614           if (!retry_p
1615               && (!bitmap_bit_p (consideration_allocno_bitmap,
1616                                  ALLOCNO_NUM (conflict_a))
1617                   || ((!ALLOCNO_ASSIGNED_P (conflict_a)
1618                        || ALLOCNO_HARD_REGNO (conflict_a) < 0)
1619                       && !(hard_reg_set_intersect_p
1620                            (profitable_hard_regs[word],
1621                             OBJECT_COLOR_DATA
1622                             (conflict_obj)->profitable_hard_regs)))))
1623             continue;
1624           conflict_aclass = ALLOCNO_CLASS (conflict_a);
1625           ira_assert (ira_reg_classes_intersect_p
1626                       [aclass][conflict_aclass]);
1627           if (ALLOCNO_ASSIGNED_P (conflict_a))
1628             {
1629               hard_regno = ALLOCNO_HARD_REGNO (conflict_a);
1630               if (hard_regno >= 0
1631                   && (ira_hard_reg_set_intersection_p
1632                       (hard_regno, ALLOCNO_MODE (conflict_a),
1633                        reg_class_contents[aclass])))
1634                 {
1635                   int n_objects = ALLOCNO_NUM_OBJECTS (conflict_a);
1636                   int conflict_nregs;
1637
1638                   mode = ALLOCNO_MODE (conflict_a);
1639                   conflict_nregs = hard_regno_nregs[hard_regno][mode];
1640                   if (conflict_nregs == n_objects && conflict_nregs > 1)
1641                     {
1642                       int num = OBJECT_SUBWORD (conflict_obj);
1643
1644                       if (WORDS_BIG_ENDIAN)
1645                         SET_HARD_REG_BIT (conflicting_regs[word],
1646                                           hard_regno + n_objects - num - 1);
1647                       else
1648                         SET_HARD_REG_BIT (conflicting_regs[word],
1649                                           hard_regno + num);
1650                     }
1651                   else
1652                     IOR_HARD_REG_SET
1653                       (conflicting_regs[word],
1654                        ira_reg_mode_hard_regset[hard_regno][mode]);
1655                   if (hard_reg_set_subset_p (profitable_hard_regs[word],
1656                                              conflicting_regs[word]))
1657                     goto fail;
1658                 }
1659             }
1660           else if (! retry_p
1661                    && ! ALLOCNO_COLOR_DATA (conflict_a)->may_be_spilled_p)
1662             {
1663               int k, *conflict_costs;
1664               
1665               ira_allocate_and_copy_costs
1666                 (&ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (conflict_a),
1667                  conflict_aclass,
1668                  ALLOCNO_CONFLICT_HARD_REG_COSTS (conflict_a));
1669               conflict_costs
1670                 = ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (conflict_a);
1671               if (conflict_costs != NULL)
1672                 for (j = class_size - 1; j >= 0; j--)
1673                   {
1674                     hard_regno = ira_class_hard_regs[aclass][j];
1675                     ira_assert (hard_regno >= 0);
1676                     k = ira_class_hard_reg_index[conflict_aclass][hard_regno];
1677                     if (k < 0)
1678                       continue;
1679                     full_costs[j] -= conflict_costs[k];
1680                   }
1681               queue_update_cost (conflict_a, COST_HOP_DIVISOR);
1682             }
1683         }
1684     }
1685   if (! retry_p)
1686     /* Take into account preferences of allocnos connected by copies to
1687        the conflict allocnos.  */
1688     update_conflict_hard_regno_costs (full_costs, aclass, true);
1689
1690   /* Take preferences of allocnos connected by copies into
1691      account.  */
1692   if (! retry_p)
1693     {
1694       start_update_cost ();
1695       queue_update_cost (a, COST_HOP_DIVISOR);
1696       update_conflict_hard_regno_costs (full_costs, aclass, false);
1697     }
1698   min_cost = min_full_cost = INT_MAX;
1699
1700   /* We don't care about giving callee saved registers to allocnos no
1701      living through calls because call clobbered registers are
1702      allocated first (it is usual practice to put them first in
1703      REG_ALLOC_ORDER).  */
1704   mode = ALLOCNO_MODE (a);
1705   for (i = 0; i < class_size; i++)
1706     {
1707       hard_regno = ira_class_hard_regs[aclass][i];
1708 #ifdef STACK_REGS
1709       if (no_stack_reg_p
1710           && FIRST_STACK_REG <= hard_regno && hard_regno <= LAST_STACK_REG)
1711         continue;
1712 #endif
1713       if (! check_hard_reg_p (a, hard_regno,
1714                               conflicting_regs, profitable_hard_regs))
1715         continue;
1716       cost = costs[i];
1717       full_cost = full_costs[i];
1718 #ifndef HONOR_REG_ALLOC_ORDER
1719       if (! allocated_hardreg_p[hard_regno]
1720           && ira_hard_reg_not_in_set_p (hard_regno, mode, call_used_reg_set)
1721           && !LOCAL_REGNO (hard_regno))
1722         /* We need to save/restore the hard register in
1723            epilogue/prologue.  Therefore we increase the cost.  */
1724         {
1725           /* ??? If only part is call clobbered.  */
1726           rclass = REGNO_REG_CLASS (hard_regno);
1727           add_cost = (ira_memory_move_cost[mode][rclass][0]
1728                       + ira_memory_move_cost[mode][rclass][1] - 1);
1729           cost += add_cost;
1730           full_cost += add_cost;
1731         }
1732 #endif
1733       if (min_cost > cost)
1734         min_cost = cost;
1735       if (min_full_cost > full_cost)
1736         {
1737           min_full_cost = full_cost;
1738           best_hard_regno = hard_regno;
1739           ira_assert (hard_regno >= 0);
1740         }
1741     }
1742   if (min_full_cost > mem_cost)
1743     {
1744       if (! retry_p && internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
1745         fprintf (ira_dump_file, "(memory is more profitable %d vs %d) ",
1746                  mem_cost, min_full_cost);
1747       best_hard_regno = -1;
1748     }
1749  fail:
1750   if (best_hard_regno >= 0)
1751     allocated_hardreg_p[best_hard_regno] = true;
1752   ALLOCNO_HARD_REGNO (a) = best_hard_regno;
1753   ALLOCNO_ASSIGNED_P (a) = true;
1754   if (best_hard_regno >= 0)
1755     update_copy_costs (a, true);
1756   ira_assert (ALLOCNO_CLASS (a) == aclass);
1757   /* We don't need updated costs anymore: */
1758   ira_free_allocno_updated_costs (a);
1759   return best_hard_regno >= 0;
1760 }
1761
1762 \f
1763
1764 /* This page contains the allocator based on the Chaitin-Briggs algorithm.  */
1765
1766 /* Bucket of allocnos that can colored currently without spilling.  */
1767 static ira_allocno_t colorable_allocno_bucket;
1768
1769 /* Bucket of allocnos that might be not colored currently without
1770    spilling.  */
1771 static ira_allocno_t uncolorable_allocno_bucket;
1772
1773 /* The current number of allocnos in the uncolorable_bucket.  */
1774 static int uncolorable_allocnos_num;
1775
1776 /* Return the current spill priority of allocno A.  The less the
1777    number, the more preferable the allocno for spilling.  */
1778 static inline int
1779 allocno_spill_priority (ira_allocno_t a)
1780 {
1781   allocno_color_data_t data = ALLOCNO_COLOR_DATA (a);
1782
1783   return (data->temp
1784           / (ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a)
1785              * ira_reg_class_max_nregs[ALLOCNO_CLASS (a)][ALLOCNO_MODE (a)]
1786              + 1));
1787 }
1788
1789 /* Add allocno A to bucket *BUCKET_PTR.  A should be not in a bucket
1790    before the call.  */
1791 static void
1792 add_allocno_to_bucket (ira_allocno_t a, ira_allocno_t *bucket_ptr)
1793 {
1794   ira_allocno_t first_a;
1795   allocno_color_data_t data;
1796
1797   if (bucket_ptr == &uncolorable_allocno_bucket
1798       && ALLOCNO_CLASS (a) != NO_REGS)
1799     {
1800       uncolorable_allocnos_num++;
1801       ira_assert (uncolorable_allocnos_num > 0);
1802     }
1803   first_a = *bucket_ptr;
1804   data = ALLOCNO_COLOR_DATA (a);
1805   data->next_bucket_allocno = first_a;
1806   data->prev_bucket_allocno = NULL;
1807   if (first_a != NULL)
1808     ALLOCNO_COLOR_DATA (first_a)->prev_bucket_allocno = a;
1809   *bucket_ptr = a;
1810 }
1811
1812 /* Compare two allocnos to define which allocno should be pushed first
1813    into the coloring stack.  If the return is a negative number, the
1814    allocno given by the first parameter will be pushed first.  In this
1815    case such allocno has less priority than the second one and the
1816    hard register will be assigned to it after assignment to the second
1817    one.  As the result of such assignment order, the second allocno
1818    has a better chance to get the best hard register.  */
1819 static int
1820 bucket_allocno_compare_func (const void *v1p, const void *v2p)
1821 {
1822   ira_allocno_t a1 = *(const ira_allocno_t *) v1p;
1823   ira_allocno_t a2 = *(const ira_allocno_t *) v2p;
1824   int diff, a1_freq, a2_freq, a1_num, a2_num;
1825
1826   if ((diff = (int) ALLOCNO_CLASS (a2) - ALLOCNO_CLASS (a1)) != 0)
1827     return diff;
1828   a1_freq = ALLOCNO_FREQ (a1);
1829   a2_freq = ALLOCNO_FREQ (a2);
1830   if ((diff = a1_freq - a2_freq) != 0)
1831     return diff;
1832   a1_num = ALLOCNO_COLOR_DATA (a1)->available_regs_num;
1833   a2_num = ALLOCNO_COLOR_DATA (a2)->available_regs_num;
1834   if ((diff = a2_num - a1_num) != 0)
1835     return diff;
1836   return ALLOCNO_NUM (a2) - ALLOCNO_NUM (a1);
1837 }
1838
1839 /* Sort bucket *BUCKET_PTR and return the result through
1840    BUCKET_PTR.  */
1841 static void
1842 sort_bucket (ira_allocno_t *bucket_ptr,
1843              int (*compare_func) (const void *, const void *))
1844 {
1845   ira_allocno_t a, head;
1846   int n;
1847
1848   for (n = 0, a = *bucket_ptr;
1849        a != NULL;
1850        a = ALLOCNO_COLOR_DATA (a)->next_bucket_allocno)
1851     sorted_allocnos[n++] = a;
1852   if (n <= 1)
1853     return;
1854   qsort (sorted_allocnos, n, sizeof (ira_allocno_t), compare_func);
1855   head = NULL;
1856   for (n--; n >= 0; n--)
1857     {
1858       a = sorted_allocnos[n];
1859       ALLOCNO_COLOR_DATA (a)->next_bucket_allocno = head;
1860       ALLOCNO_COLOR_DATA (a)->prev_bucket_allocno = NULL;
1861       if (head != NULL)
1862         ALLOCNO_COLOR_DATA (head)->prev_bucket_allocno = a;
1863       head = a;
1864     }
1865   *bucket_ptr = head;
1866 }
1867
1868 /* Add ALLOCNO to bucket *BUCKET_PTR maintaining the order according
1869    their priority.  ALLOCNO should be not in a bucket before the
1870    call.  */
1871 static void
1872 add_allocno_to_ordered_bucket (ira_allocno_t allocno,
1873                                ira_allocno_t *bucket_ptr)
1874 {
1875   ira_allocno_t before, after;
1876
1877   if (bucket_ptr == &uncolorable_allocno_bucket
1878       && ALLOCNO_CLASS (allocno) != NO_REGS)
1879     {
1880       uncolorable_allocnos_num++;
1881       ira_assert (uncolorable_allocnos_num > 0);
1882     }
1883   for (before = *bucket_ptr, after = NULL;
1884        before != NULL;
1885        after = before,
1886          before = ALLOCNO_COLOR_DATA (before)->next_bucket_allocno)
1887     if (bucket_allocno_compare_func (&allocno, &before) < 0)
1888       break;
1889   ALLOCNO_COLOR_DATA (allocno)->next_bucket_allocno = before;
1890   ALLOCNO_COLOR_DATA (allocno)->prev_bucket_allocno = after;
1891   if (after == NULL)
1892     *bucket_ptr = allocno;
1893   else
1894     ALLOCNO_COLOR_DATA (after)->next_bucket_allocno = allocno;
1895   if (before != NULL)
1896     ALLOCNO_COLOR_DATA (before)->prev_bucket_allocno = allocno;
1897 }
1898
1899 /* Delete ALLOCNO from bucket *BUCKET_PTR.  It should be there before
1900    the call.  */
1901 static void
1902 delete_allocno_from_bucket (ira_allocno_t allocno, ira_allocno_t *bucket_ptr)
1903 {
1904   ira_allocno_t prev_allocno, next_allocno;
1905
1906   if (bucket_ptr == &uncolorable_allocno_bucket
1907       && ALLOCNO_CLASS (allocno) != NO_REGS)
1908     {
1909       uncolorable_allocnos_num--;
1910       ira_assert (uncolorable_allocnos_num >= 0);
1911     }
1912   prev_allocno = ALLOCNO_COLOR_DATA (allocno)->prev_bucket_allocno;
1913   next_allocno = ALLOCNO_COLOR_DATA (allocno)->next_bucket_allocno;
1914   if (prev_allocno != NULL)
1915     ALLOCNO_COLOR_DATA (prev_allocno)->next_bucket_allocno = next_allocno;
1916   else
1917     {
1918       ira_assert (*bucket_ptr == allocno);
1919       *bucket_ptr = next_allocno;
1920     }
1921   if (next_allocno != NULL)
1922     ALLOCNO_COLOR_DATA (next_allocno)->prev_bucket_allocno = prev_allocno;
1923 }
1924
1925 /* Put allocno A onto the coloring stack without removing it from its
1926    bucket.  Pushing allocno to the coloring stack can result in moving
1927    conflicting allocnos from the uncolorable bucket to the colorable
1928    one.  */
1929 static void
1930 push_allocno_to_stack (ira_allocno_t a)
1931 {
1932   enum reg_class aclass;
1933   allocno_color_data_t data, conflict_data;
1934   int size, i, n = ALLOCNO_NUM_OBJECTS (a);
1935     
1936   data = ALLOCNO_COLOR_DATA (a);
1937   data->in_graph_p = false;
1938   VEC_safe_push (ira_allocno_t, heap, allocno_stack_vec, a);
1939   aclass = ALLOCNO_CLASS (a);
1940   if (aclass == NO_REGS)
1941     return;
1942   size = ira_reg_class_max_nregs[aclass][ALLOCNO_MODE (a)];
1943   if (n > 1)
1944     {
1945       /* We will deal with the subwords individually.  */
1946       gcc_assert (size == ALLOCNO_NUM_OBJECTS (a));
1947       size = 1;
1948     }
1949   for (i = 0; i < n; i++)
1950     {
1951       ira_object_t obj = ALLOCNO_OBJECT (a, i);
1952       ira_object_t conflict_obj;
1953       ira_object_conflict_iterator oci;
1954       
1955       FOR_EACH_OBJECT_CONFLICT (obj, conflict_obj, oci)
1956         {
1957           ira_allocno_t conflict_a = OBJECT_ALLOCNO (conflict_obj);
1958           
1959           conflict_data = ALLOCNO_COLOR_DATA (conflict_a);
1960           if (conflict_data->colorable_p
1961               || ! conflict_data->in_graph_p
1962               || ALLOCNO_ASSIGNED_P (conflict_a)
1963               || !(hard_reg_set_intersect_p
1964                    (OBJECT_COLOR_DATA (obj)->profitable_hard_regs,
1965                     OBJECT_COLOR_DATA (conflict_obj)->profitable_hard_regs)))
1966             continue;
1967           ira_assert (bitmap_bit_p (coloring_allocno_bitmap,
1968                                     ALLOCNO_NUM (conflict_a)));
1969           if (update_left_conflict_sizes_p (conflict_a, obj, size))
1970             {
1971               delete_allocno_from_bucket
1972                     (conflict_a, &uncolorable_allocno_bucket);
1973               add_allocno_to_ordered_bucket
1974                 (conflict_a, &colorable_allocno_bucket);
1975               if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL)
1976                 {
1977                   fprintf (ira_dump_file, "        Making");
1978                   ira_print_expanded_allocno (conflict_a);
1979                   fprintf (ira_dump_file, " colorable\n");
1980                 }
1981             }
1982           
1983         }
1984     }
1985 }
1986
1987 /* Put ALLOCNO onto the coloring stack and remove it from its bucket.
1988    The allocno is in the colorable bucket if COLORABLE_P is TRUE.  */
1989 static void
1990 remove_allocno_from_bucket_and_push (ira_allocno_t allocno, bool colorable_p)
1991 {
1992   if (colorable_p)
1993     delete_allocno_from_bucket (allocno, &colorable_allocno_bucket);
1994   else
1995     delete_allocno_from_bucket (allocno, &uncolorable_allocno_bucket);
1996   if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
1997     {
1998       fprintf (ira_dump_file, "      Pushing");
1999       ira_print_expanded_allocno (allocno);
2000       if (colorable_p)
2001         fprintf (ira_dump_file, "(cost %d)\n",
2002                  ALLOCNO_COLOR_DATA (allocno)->temp);
2003       else
2004         fprintf (ira_dump_file, "(potential spill: %spri=%d, cost=%d)\n",
2005                  ALLOCNO_BAD_SPILL_P (allocno) ? "bad spill, " : "",
2006                  allocno_spill_priority (allocno),
2007                  ALLOCNO_COLOR_DATA (allocno)->temp);
2008     }
2009   if (! colorable_p)
2010     ALLOCNO_COLOR_DATA (allocno)->may_be_spilled_p = true;
2011   push_allocno_to_stack (allocno);
2012 }
2013
2014 /* Put all allocnos from colorable bucket onto the coloring stack.  */
2015 static void
2016 push_only_colorable (void)
2017 {
2018   sort_bucket (&colorable_allocno_bucket, bucket_allocno_compare_func);
2019   for (;colorable_allocno_bucket != NULL;)
2020     remove_allocno_from_bucket_and_push (colorable_allocno_bucket, true);
2021 }
2022
2023 /* Return the frequency of exit edges (if EXIT_P) or entry from/to the
2024    loop given by its LOOP_NODE.  */
2025 int
2026 ira_loop_edge_freq (ira_loop_tree_node_t loop_node, int regno, bool exit_p)
2027 {
2028   int freq, i;
2029   edge_iterator ei;
2030   edge e;
2031   VEC (edge, heap) *edges;
2032
2033   ira_assert (loop_node->loop != NULL
2034               && (regno < 0 || regno >= FIRST_PSEUDO_REGISTER));
2035   freq = 0;
2036   if (! exit_p)
2037     {
2038       FOR_EACH_EDGE (e, ei, loop_node->loop->header->preds)
2039         if (e->src != loop_node->loop->latch
2040             && (regno < 0
2041                 || (bitmap_bit_p (DF_LR_OUT (e->src), regno)
2042                     && bitmap_bit_p (DF_LR_IN (e->dest), regno))))
2043           freq += EDGE_FREQUENCY (e);
2044     }
2045   else
2046     {
2047       edges = get_loop_exit_edges (loop_node->loop);
2048       FOR_EACH_VEC_ELT (edge, edges, i, e)
2049         if (regno < 0
2050             || (bitmap_bit_p (DF_LR_OUT (e->src), regno)
2051                 && bitmap_bit_p (DF_LR_IN (e->dest), regno)))
2052           freq += EDGE_FREQUENCY (e);
2053       VEC_free (edge, heap, edges);
2054     }
2055
2056   return REG_FREQ_FROM_EDGE_FREQ (freq);
2057 }
2058
2059 /* Calculate and return the cost of putting allocno A into memory.  */
2060 static int
2061 calculate_allocno_spill_cost (ira_allocno_t a)
2062 {
2063   int regno, cost;
2064   enum machine_mode mode;
2065   enum reg_class rclass;
2066   ira_allocno_t parent_allocno;
2067   ira_loop_tree_node_t parent_node, loop_node;
2068
2069   regno = ALLOCNO_REGNO (a);
2070   cost = ALLOCNO_UPDATED_MEMORY_COST (a) - ALLOCNO_UPDATED_CLASS_COST (a);
2071   if (ALLOCNO_CAP (a) != NULL)
2072     return cost;
2073   loop_node = ALLOCNO_LOOP_TREE_NODE (a);
2074   if ((parent_node = loop_node->parent) == NULL)
2075     return cost;
2076   if ((parent_allocno = parent_node->regno_allocno_map[regno]) == NULL)
2077     return cost;
2078   mode = ALLOCNO_MODE (a);
2079   rclass = ALLOCNO_CLASS (a);
2080   if (ALLOCNO_HARD_REGNO (parent_allocno) < 0)
2081     cost -= (ira_memory_move_cost[mode][rclass][0]
2082              * ira_loop_edge_freq (loop_node, regno, true)
2083              + ira_memory_move_cost[mode][rclass][1]
2084              * ira_loop_edge_freq (loop_node, regno, false));
2085   else
2086     {
2087       ira_init_register_move_cost_if_necessary (mode);
2088       cost += ((ira_memory_move_cost[mode][rclass][1]
2089                 * ira_loop_edge_freq (loop_node, regno, true)
2090                 + ira_memory_move_cost[mode][rclass][0]
2091                 * ira_loop_edge_freq (loop_node, regno, false))
2092                - (ira_register_move_cost[mode][rclass][rclass]
2093                   * (ira_loop_edge_freq (loop_node, regno, false)
2094                      + ira_loop_edge_freq (loop_node, regno, true))));
2095     }
2096   return cost;
2097 }
2098
2099 /* Used for sorting allocnos for spilling.  */
2100 static inline int
2101 allocno_spill_priority_compare (ira_allocno_t a1, ira_allocno_t a2)
2102 {
2103   int pri1, pri2, diff;
2104
2105   if (ALLOCNO_BAD_SPILL_P (a1) && ! ALLOCNO_BAD_SPILL_P (a2))
2106     return 1;
2107   if (ALLOCNO_BAD_SPILL_P (a2) && ! ALLOCNO_BAD_SPILL_P (a1))
2108     return -1;
2109   pri1 = allocno_spill_priority (a1);
2110   pri2 = allocno_spill_priority (a2);
2111   if ((diff = pri1 - pri2) != 0)
2112     return diff;
2113   if ((diff
2114        = ALLOCNO_COLOR_DATA (a1)->temp - ALLOCNO_COLOR_DATA (a2)->temp) != 0)
2115     return diff;
2116   return ALLOCNO_NUM (a1) - ALLOCNO_NUM (a2);
2117 }
2118
2119 /* Used for sorting allocnos for spilling.  */
2120 static int
2121 allocno_spill_sort_compare (const void *v1p, const void *v2p)
2122 {
2123   ira_allocno_t p1 = *(const ira_allocno_t *) v1p;
2124   ira_allocno_t p2 = *(const ira_allocno_t *) v2p;
2125
2126   return allocno_spill_priority_compare (p1, p2);
2127 }
2128
2129 /* Push allocnos to the coloring stack.  The order of allocnos in the
2130    stack defines the order for the subsequent coloring.  */
2131 static void
2132 push_allocnos_to_stack (void)
2133 {
2134   ira_allocno_t a;
2135   int cost;
2136
2137   /* Calculate uncolorable allocno spill costs.  */
2138   for (a = uncolorable_allocno_bucket;
2139        a != NULL;
2140        a = ALLOCNO_COLOR_DATA (a)->next_bucket_allocno)
2141     if (ALLOCNO_CLASS (a) != NO_REGS)
2142       {
2143         cost = calculate_allocno_spill_cost (a);
2144         /* ??? Remove cost of copies between the coalesced
2145            allocnos.  */
2146         ALLOCNO_COLOR_DATA (a)->temp = cost;
2147       }
2148   sort_bucket (&uncolorable_allocno_bucket, allocno_spill_sort_compare);
2149   for (;;)
2150     {
2151       push_only_colorable ();
2152       a = uncolorable_allocno_bucket;
2153       if (a == NULL)
2154         break;
2155       remove_allocno_from_bucket_and_push (a, false);
2156     }
2157   ira_assert (colorable_allocno_bucket == NULL
2158               && uncolorable_allocno_bucket == NULL);
2159   ira_assert (uncolorable_allocnos_num == 0);
2160 }
2161
2162 /* Pop the coloring stack and assign hard registers to the popped
2163    allocnos.  */
2164 static void
2165 pop_allocnos_from_stack (void)
2166 {
2167   ira_allocno_t allocno;
2168   enum reg_class aclass;
2169
2170   for (;VEC_length (ira_allocno_t, allocno_stack_vec) != 0;)
2171     {
2172       allocno = VEC_pop (ira_allocno_t, allocno_stack_vec);
2173       aclass = ALLOCNO_CLASS (allocno);
2174       if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2175         {
2176           fprintf (ira_dump_file, "      Popping");
2177           ira_print_expanded_allocno (allocno);
2178           fprintf (ira_dump_file, "  -- ");
2179         }
2180       if (aclass == NO_REGS)
2181         {
2182           ALLOCNO_HARD_REGNO (allocno) = -1;
2183           ALLOCNO_ASSIGNED_P (allocno) = true;
2184           ira_assert (ALLOCNO_UPDATED_HARD_REG_COSTS (allocno) == NULL);
2185           ira_assert
2186             (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (allocno) == NULL);
2187           if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2188             fprintf (ira_dump_file, "assign memory\n");
2189         }
2190       else if (assign_hard_reg (allocno, false))
2191         {
2192           if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2193             fprintf (ira_dump_file, "assign reg %d\n",
2194                      ALLOCNO_HARD_REGNO (allocno));
2195         }
2196       else if (ALLOCNO_ASSIGNED_P (allocno))
2197         {
2198           if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2199             fprintf (ira_dump_file, "spill\n");
2200         }
2201       ALLOCNO_COLOR_DATA (allocno)->in_graph_p = true;
2202     }
2203 }
2204
2205 /* Set up number of available hard registers for allocno A.  */
2206 static void
2207 setup_allocno_available_regs_num (ira_allocno_t a)
2208 {
2209   int i, j, n, hard_regno, hard_regs_num, nwords, nregs;
2210   enum reg_class aclass;
2211   enum machine_mode mode;
2212   allocno_color_data_t data;
2213
2214   aclass = ALLOCNO_CLASS (a);
2215   data = ALLOCNO_COLOR_DATA (a);
2216   data->available_regs_num = 0;
2217   if (aclass == NO_REGS)
2218     return;
2219   hard_regs_num = ira_class_hard_regs_num[aclass];
2220   mode = ALLOCNO_MODE (a);
2221   nwords = ALLOCNO_NUM_OBJECTS (a);
2222   for (n = 0, i = hard_regs_num - 1; i >= 0; i--)
2223     {
2224       hard_regno = ira_class_hard_regs[aclass][i];
2225       nregs = hard_regno_nregs[hard_regno][mode];
2226       for (j = 0; j < nregs; j++)
2227         {
2228           int k;
2229           int set_to_test_start = 0, set_to_test_end = nwords;
2230
2231           if (nregs == nwords)
2232             {
2233               if (WORDS_BIG_ENDIAN)
2234                 set_to_test_start = nwords - j - 1;
2235               else
2236                 set_to_test_start = j;
2237               set_to_test_end = set_to_test_start + 1;
2238             }
2239           for (k = set_to_test_start; k < set_to_test_end; k++)
2240             {
2241               ira_object_t obj = ALLOCNO_OBJECT (a, k);
2242               object_color_data_t obj_data = OBJECT_COLOR_DATA (obj);
2243
2244               /* Checking only profitable hard regs which exclude
2245                  object's conflict hard regs.  */
2246               if (TEST_HARD_REG_BIT (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
2247                                      hard_regno + j)
2248                   || ! TEST_HARD_REG_BIT (obj_data->profitable_hard_regs,
2249                                           hard_regno + j))
2250                 break;
2251             }
2252           if (k != set_to_test_end)
2253             break;
2254         }
2255       if (j == nregs)
2256         n++;
2257     }
2258   data->available_regs_num = n;
2259   if (internal_flag_ira_verbose <= 2 || ira_dump_file == NULL)
2260     return;
2261   fprintf
2262     (ira_dump_file,
2263      "      Allocno a%dr%d of %s(%d) has %d avail. regs",
2264      ALLOCNO_NUM (a), ALLOCNO_REGNO (a),
2265      reg_class_names[aclass], ira_class_hard_regs_num[aclass], n);
2266   for (i = 0; i < nwords; i++)
2267     {
2268       ira_object_t obj = ALLOCNO_OBJECT (a, i);
2269       object_color_data_t obj_data = OBJECT_COLOR_DATA (obj);
2270
2271       if (nwords != 1)
2272         {
2273           if (i != 0)
2274             fprintf (ira_dump_file, ", ");
2275           fprintf (ira_dump_file, " obj %d", i);
2276         }
2277       print_hard_reg_set (ira_dump_file, obj_data->profitable_hard_regs, false);
2278       fprintf (ira_dump_file, " (confl regs = ");
2279       print_hard_reg_set (ira_dump_file, OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
2280                           false);
2281       fprintf (ira_dump_file, " ) %snode: ",
2282                hard_reg_set_equal_p (obj_data->profitable_hard_regs,
2283                                      obj_data->hard_regs_node->hard_regs->set)
2284                ? "" : "^");
2285       print_hard_reg_set (ira_dump_file,
2286                           obj_data->hard_regs_node->hard_regs->set, false);
2287
2288     }
2289   fprintf (ira_dump_file, "\n");
2290 }
2291
2292 /* Put ALLOCNO in a bucket corresponding to its number and size of its
2293    conflicting allocnos and hard registers.  */
2294 static void
2295 put_allocno_into_bucket (ira_allocno_t allocno)
2296 {
2297   ALLOCNO_COLOR_DATA (allocno)->in_graph_p = true;
2298   setup_allocno_available_regs_num (allocno);
2299   if (setup_left_conflict_sizes_p (allocno))
2300     add_allocno_to_bucket (allocno, &colorable_allocno_bucket);
2301   else
2302     add_allocno_to_bucket (allocno, &uncolorable_allocno_bucket);
2303 }
2304
2305 /* Map: allocno number -> allocno priority.  */
2306 static int *allocno_priorities;
2307
2308 /* Set up priorities for N allocnos in array
2309    CONSIDERATION_ALLOCNOS.  */
2310 static void
2311 setup_allocno_priorities (ira_allocno_t *consideration_allocnos, int n)
2312 {
2313   int i, length, nrefs, priority, max_priority, mult;
2314   ira_allocno_t a;
2315
2316   max_priority = 0;
2317   for (i = 0; i < n; i++)
2318     {
2319       a = consideration_allocnos[i];
2320       nrefs = ALLOCNO_NREFS (a);
2321       ira_assert (nrefs >= 0);
2322       mult = floor_log2 (ALLOCNO_NREFS (a)) + 1;
2323       ira_assert (mult >= 0);
2324       allocno_priorities[ALLOCNO_NUM (a)]
2325         = priority
2326         = (mult
2327            * (ALLOCNO_MEMORY_COST (a) - ALLOCNO_CLASS_COST (a))
2328            * ira_reg_class_max_nregs[ALLOCNO_CLASS (a)][ALLOCNO_MODE (a)]);
2329       if (priority < 0)
2330         priority = -priority;
2331       if (max_priority < priority)
2332         max_priority = priority;
2333     }
2334   mult = max_priority == 0 ? 1 : INT_MAX / max_priority;
2335   for (i = 0; i < n; i++)
2336     {
2337       a = consideration_allocnos[i];
2338       length = ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a);
2339       if (ALLOCNO_NUM_OBJECTS (a) > 1)
2340         length /= ALLOCNO_NUM_OBJECTS (a);
2341       if (length <= 0)
2342         length = 1;
2343       allocno_priorities[ALLOCNO_NUM (a)]
2344         = allocno_priorities[ALLOCNO_NUM (a)] * mult / length;
2345     }
2346 }
2347
2348 /* Sort allocnos according to the profit of usage of a hard register
2349    instead of memory for them. */
2350 static int
2351 allocno_cost_compare_func (const void *v1p, const void *v2p)
2352 {
2353   ira_allocno_t p1 = *(const ira_allocno_t *) v1p;
2354   ira_allocno_t p2 = *(const ira_allocno_t *) v2p;
2355   int c1, c2;
2356
2357   c1 = ALLOCNO_UPDATED_MEMORY_COST (p1) - ALLOCNO_UPDATED_CLASS_COST (p1);
2358   c2 = ALLOCNO_UPDATED_MEMORY_COST (p2) - ALLOCNO_UPDATED_CLASS_COST (p2);
2359   if (c1 - c2)
2360     return c1 - c2;
2361
2362   /* If regs are equally good, sort by allocno numbers, so that the
2363      results of qsort leave nothing to chance.  */
2364   return ALLOCNO_NUM (p1) - ALLOCNO_NUM (p2);
2365 }
2366
2367 /* We used Chaitin-Briggs coloring to assign as many pseudos as
2368    possible to hard registers.  Let us try to improve allocation with
2369    cost point of view.  This function improves the allocation by
2370    spilling some allocnos and assigning the freed hard registers to
2371    other allocnos if it decreases the overall allocation cost.  */
2372 static void
2373 improve_allocation (void)
2374 {
2375   unsigned int i;
2376   int j, k, n, hregno, conflict_hregno, base_cost, class_size, word, nwords;
2377   int check, spill_cost, min_cost, nregs, conflict_nregs, r, best;
2378   bool try_p;
2379   enum reg_class aclass;
2380   enum machine_mode mode;
2381   int *allocno_costs;
2382   int costs[FIRST_PSEUDO_REGISTER];
2383   HARD_REG_SET conflicting_regs[2], profitable_hard_regs[2];
2384   ira_allocno_t a;
2385   bitmap_iterator bi;
2386
2387   /* Clear counts used to process conflicting allocnos only once for
2388      each allocno.  */
2389   EXECUTE_IF_SET_IN_BITMAP (coloring_allocno_bitmap, 0, i, bi)
2390     ALLOCNO_COLOR_DATA (ira_allocnos[i])->temp = 0;
2391   check = n = 0;
2392   /* Process each allocno and try to assign a hard register to it by
2393      spilling some its conflicting allocnos.  */
2394   EXECUTE_IF_SET_IN_BITMAP (coloring_allocno_bitmap, 0, i, bi)
2395     {
2396       a = ira_allocnos[i];
2397       ALLOCNO_COLOR_DATA (a)->temp = 0;
2398       if (empty_profitable_hard_regs (a))
2399         continue;
2400       check++;
2401       aclass = ALLOCNO_CLASS (a);
2402       allocno_costs = ALLOCNO_UPDATED_HARD_REG_COSTS (a);
2403       if (allocno_costs == NULL)
2404         allocno_costs = ALLOCNO_HARD_REG_COSTS (a);
2405       if ((hregno = ALLOCNO_HARD_REGNO (a)) < 0)
2406         base_cost = ALLOCNO_UPDATED_MEMORY_COST (a);
2407       else if (allocno_costs == NULL)
2408         /* It means that assigning a hard register is not profitable
2409            (we don't waste memory for hard register costs in this
2410            case).  */
2411         continue;
2412       else
2413         base_cost = allocno_costs[ira_class_hard_reg_index[aclass][hregno]];
2414       try_p = false;
2415       get_conflict_profitable_regs (a, false,
2416                                     conflicting_regs, profitable_hard_regs);
2417       class_size = ira_class_hard_regs_num[aclass];
2418       /* Set up cost improvement for usage of each profitable hard
2419          register for allocno A.  */
2420       for (j = 0; j < class_size; j++)
2421         {
2422           hregno = ira_class_hard_regs[aclass][j];
2423           if (! check_hard_reg_p (a, hregno,
2424                                   conflicting_regs, profitable_hard_regs))
2425             continue;
2426           ira_assert (ira_class_hard_reg_index[aclass][hregno] == j);
2427           k = allocno_costs == NULL ? 0 : j;
2428           costs[hregno] = (allocno_costs == NULL
2429                            ? ALLOCNO_UPDATED_CLASS_COST (a) : allocno_costs[k]);
2430           costs[hregno] -= base_cost;
2431           if (costs[hregno] < 0)
2432             try_p = true;
2433         }
2434       if (! try_p)
2435         /* There is no chance to improve the allocation cost by
2436            assigning hard register to allocno A even without spilling
2437            conflicting allocnos.  */
2438         continue;
2439       mode = ALLOCNO_MODE (a);
2440       nwords = ALLOCNO_NUM_OBJECTS (a);
2441       /* Process each allocno conflicting with A and update the cost
2442          improvement for profitable hard registers of A.  To use a
2443          hard register for A we need to spill some conflicting
2444          allocnos and that creates penalty for the cost
2445          improvement.  */
2446       for (word = 0; word < nwords; word++)
2447         {
2448           ira_object_t conflict_obj;
2449           ira_object_t obj = ALLOCNO_OBJECT (a, word);
2450           ira_object_conflict_iterator oci;
2451       
2452           FOR_EACH_OBJECT_CONFLICT (obj, conflict_obj, oci)
2453             {
2454               ira_allocno_t conflict_a = OBJECT_ALLOCNO (conflict_obj);
2455
2456               if (ALLOCNO_COLOR_DATA (conflict_a)->temp == check)
2457                 /* We already processed this conflicting allocno
2458                    because we processed earlier another object of the
2459                    conflicting allocno.  */
2460                 continue;
2461               ALLOCNO_COLOR_DATA (conflict_a)->temp = check;
2462               if ((conflict_hregno = ALLOCNO_HARD_REGNO (conflict_a)) < 0)
2463                 continue;
2464               spill_cost = ALLOCNO_UPDATED_MEMORY_COST (conflict_a);
2465               k = (ira_class_hard_reg_index
2466                    [ALLOCNO_CLASS (conflict_a)][conflict_hregno]);
2467               ira_assert (k >= 0);
2468               if ((allocno_costs = ALLOCNO_UPDATED_HARD_REG_COSTS (conflict_a))
2469                   != NULL)
2470                 spill_cost -= allocno_costs[k];
2471               else if ((allocno_costs = ALLOCNO_HARD_REG_COSTS (conflict_a))
2472                        != NULL)
2473                 spill_cost -= allocno_costs[k];
2474               else
2475                 spill_cost -= ALLOCNO_UPDATED_CLASS_COST (conflict_a);
2476               conflict_nregs
2477                 = hard_regno_nregs[conflict_hregno][ALLOCNO_MODE (conflict_a)];
2478               for (r = conflict_hregno;
2479                    r >= 0 && r + hard_regno_nregs[r][mode] > conflict_hregno;
2480                    r--)
2481                 if (check_hard_reg_p (a, r,
2482                                       conflicting_regs, profitable_hard_regs))
2483                   costs[r] += spill_cost;
2484               for (r = conflict_hregno + 1;
2485                    r < conflict_hregno + conflict_nregs;
2486                    r++)
2487                 if (check_hard_reg_p (a, r,
2488                                       conflicting_regs, profitable_hard_regs))
2489                   costs[r] += spill_cost;
2490             }
2491         }
2492       min_cost = INT_MAX;
2493       best = -1;
2494       /* Now we choose hard register for A which results in highest
2495          allocation cost improvement.  */
2496       for (j = 0; j < class_size; j++)
2497         {
2498           hregno = ira_class_hard_regs[aclass][j];
2499           if (check_hard_reg_p (a, hregno,
2500                                 conflicting_regs, profitable_hard_regs)
2501               && min_cost > costs[hregno])
2502             {
2503               best = hregno;
2504               min_cost = costs[hregno];
2505             }
2506         }
2507       if (min_cost >= 0)
2508         /* We are in a situation when assigning any hard register to A
2509            by spilling some conflicting allocnos does not improve the
2510            allocation cost.  */
2511         continue;
2512       nregs = hard_regno_nregs[best][mode];
2513       /* Now spill conflicting allocnos which contain a hard register
2514          of A when we assign the best chosen hard register to it.  */
2515       for (word = 0; word < nwords; word++)
2516         {
2517           ira_object_t conflict_obj;
2518           ira_object_t obj = ALLOCNO_OBJECT (a, word);
2519           ira_object_conflict_iterator oci;
2520       
2521           FOR_EACH_OBJECT_CONFLICT (obj, conflict_obj, oci)
2522             {
2523               ira_allocno_t conflict_a = OBJECT_ALLOCNO (conflict_obj);
2524
2525               if ((conflict_hregno = ALLOCNO_HARD_REGNO (conflict_a)) < 0)
2526                 continue;
2527               conflict_nregs
2528                 = hard_regno_nregs[conflict_hregno][ALLOCNO_MODE (conflict_a)];
2529               if (best + nregs <= conflict_hregno
2530                   || conflict_hregno + conflict_nregs <= best)
2531                 /* No intersection.  */
2532                 continue;
2533               ALLOCNO_HARD_REGNO (conflict_a) = -1;
2534               sorted_allocnos[n++] = conflict_a;
2535               if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
2536                 fprintf (ira_dump_file, "Spilling a%dr%d for a%dr%d\n",
2537                          ALLOCNO_NUM (conflict_a), ALLOCNO_REGNO (conflict_a),
2538                          ALLOCNO_NUM (a), ALLOCNO_REGNO (a));
2539             }
2540         }
2541       /* Assign the best chosen hard register to A.  */
2542       ALLOCNO_HARD_REGNO (a) = best;
2543       if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
2544         fprintf (ira_dump_file, "Assigning %d to a%dr%d\n",
2545                  best, ALLOCNO_NUM (a), ALLOCNO_REGNO (a));
2546     }
2547   if (n == 0)
2548     return;
2549   /* We spilled some allocnos to assign their hard registers to other
2550      allocnos.  The spilled allocnos are now in array
2551      'sorted_allocnos'.  There is still a possibility that some of the
2552      spilled allocnos can get hard registers.  So let us try assign
2553      them hard registers again (just a reminder -- function
2554      'assign_hard_reg' assigns hard registers only if it is possible
2555      and profitable).  We process the spilled allocnos with biggest
2556      benefit to get hard register first -- see function
2557      'allocno_cost_compare_func'.  */
2558   qsort (sorted_allocnos, n, sizeof (ira_allocno_t),
2559          allocno_cost_compare_func);
2560   for (j = 0; j < n; j++)
2561     {
2562       a = sorted_allocnos[j];
2563       ALLOCNO_ASSIGNED_P (a) = false;
2564       if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2565         {
2566           fprintf (ira_dump_file, "      ");
2567           ira_print_expanded_allocno (a);
2568           fprintf (ira_dump_file, "  -- ");
2569         }
2570       if (assign_hard_reg (a, false))
2571         {
2572           if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2573             fprintf (ira_dump_file, "assign hard reg %d\n",
2574                      ALLOCNO_HARD_REGNO (a));
2575         }
2576       else
2577         {
2578           if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2579             fprintf (ira_dump_file, "assign memory\n");
2580         }
2581     }
2582 }
2583
2584 /* Sort allocnos according to their priorities which are calculated
2585    analogous to ones in file `global.c'.  */
2586 static int
2587 allocno_priority_compare_func (const void *v1p, const void *v2p)
2588 {
2589   ira_allocno_t a1 = *(const ira_allocno_t *) v1p;
2590   ira_allocno_t a2 = *(const ira_allocno_t *) v2p;
2591   int pri1, pri2;
2592
2593   pri1 = allocno_priorities[ALLOCNO_NUM (a1)];
2594   pri2 = allocno_priorities[ALLOCNO_NUM (a2)];
2595   if (pri2 != pri1)
2596     return SORTGT (pri2, pri1);
2597
2598   /* If regs are equally good, sort by allocnos, so that the results of
2599      qsort leave nothing to chance.  */
2600   return ALLOCNO_NUM (a1) - ALLOCNO_NUM (a2);
2601 }
2602
2603 /* Chaitin-Briggs coloring for allocnos in COLORING_ALLOCNO_BITMAP
2604    taking into account allocnos in CONSIDERATION_ALLOCNO_BITMAP.  */
2605 static void
2606 color_allocnos (void)
2607 {
2608   unsigned int i, n;
2609   bitmap_iterator bi;
2610   ira_allocno_t a;
2611
2612   setup_profitable_hard_regs ();
2613   if (flag_ira_algorithm == IRA_ALGORITHM_PRIORITY)
2614     {
2615       n = 0;
2616       EXECUTE_IF_SET_IN_BITMAP (coloring_allocno_bitmap, 0, i, bi)
2617         {
2618           a = ira_allocnos[i];
2619           if (ALLOCNO_CLASS (a) == NO_REGS)
2620             {
2621               ALLOCNO_HARD_REGNO (a) = -1;
2622               ALLOCNO_ASSIGNED_P (a) = true;
2623               ira_assert (ALLOCNO_UPDATED_HARD_REG_COSTS (a) == NULL);
2624               ira_assert (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) == NULL);
2625               if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2626                 {
2627                   fprintf (ira_dump_file, "      Spill");
2628                   ira_print_expanded_allocno (a);
2629                   fprintf (ira_dump_file, "\n");
2630                 }
2631               continue;
2632             }
2633           sorted_allocnos[n++] = a;
2634         }
2635       if (n != 0)
2636         {
2637           setup_allocno_priorities (sorted_allocnos, n);
2638           qsort (sorted_allocnos, n, sizeof (ira_allocno_t),
2639                  allocno_priority_compare_func);
2640           for (i = 0; i < n; i++)
2641             {
2642               a = sorted_allocnos[i];
2643               if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2644                 {
2645                   fprintf (ira_dump_file, "      ");
2646                   ira_print_expanded_allocno (a);
2647                   fprintf (ira_dump_file, "  -- ");
2648                 }
2649               if (assign_hard_reg (a, false))
2650                 {
2651                   if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2652                     fprintf (ira_dump_file, "assign hard reg %d\n",
2653                              ALLOCNO_HARD_REGNO (a));
2654                 }
2655               else
2656                 {
2657                   if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2658                     fprintf (ira_dump_file, "assign memory\n");
2659                 }
2660             }
2661         }
2662     }
2663   else
2664     {
2665       form_object_hard_regs_nodes_forest ();
2666       if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
2667         print_hard_regs_forest (ira_dump_file);
2668       EXECUTE_IF_SET_IN_BITMAP (coloring_allocno_bitmap, 0, i, bi)
2669         {
2670           a = ira_allocnos[i];
2671           if (ALLOCNO_CLASS (a) != NO_REGS && ! empty_profitable_hard_regs (a))
2672             ALLOCNO_COLOR_DATA (a)->in_graph_p = true;
2673           else
2674             {
2675               ALLOCNO_HARD_REGNO (a) = -1;
2676               ALLOCNO_ASSIGNED_P (a) = true;
2677               /* We don't need updated costs anymore.  */
2678               ira_free_allocno_updated_costs (a);
2679               if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2680                 {
2681                   fprintf (ira_dump_file, "      Spill");
2682                   ira_print_expanded_allocno (a);
2683                   fprintf (ira_dump_file, "\n");
2684                 }
2685             }
2686         }
2687       /* Put the allocnos into the corresponding buckets.  */
2688       colorable_allocno_bucket = NULL;
2689       uncolorable_allocno_bucket = NULL;
2690       EXECUTE_IF_SET_IN_BITMAP (coloring_allocno_bitmap, 0, i, bi)
2691         {
2692           a = ira_allocnos[i];
2693           if (ALLOCNO_COLOR_DATA (a)->in_graph_p)
2694             put_allocno_into_bucket (a);
2695         }
2696       push_allocnos_to_stack ();
2697       pop_allocnos_from_stack ();
2698       finish_object_hard_regs_nodes_forest ();
2699     }
2700   improve_allocation ();
2701 }
2702
2703 \f
2704
2705 /* Output information about the loop given by its LOOP_TREE_NODE. */
2706 static void
2707 print_loop_title (ira_loop_tree_node_t loop_tree_node)
2708 {
2709   unsigned int j;
2710   bitmap_iterator bi;
2711   ira_loop_tree_node_t subloop_node, dest_loop_node;
2712   edge e;
2713   edge_iterator ei;
2714
2715   ira_assert (loop_tree_node->loop != NULL);
2716   fprintf (ira_dump_file,
2717            "\n  Loop %d (parent %d, header bb%d, depth %d)\n    bbs:",
2718            loop_tree_node->loop->num,
2719            (loop_tree_node->parent == NULL
2720             ? -1 : loop_tree_node->parent->loop->num),
2721            loop_tree_node->loop->header->index,
2722            loop_depth (loop_tree_node->loop));
2723   for (subloop_node = loop_tree_node->children;
2724        subloop_node != NULL;
2725        subloop_node = subloop_node->next)
2726     if (subloop_node->bb != NULL)
2727       {
2728         fprintf (ira_dump_file, " %d", subloop_node->bb->index);
2729         FOR_EACH_EDGE (e, ei, subloop_node->bb->succs)
2730           if (e->dest != EXIT_BLOCK_PTR
2731               && ((dest_loop_node = IRA_BB_NODE (e->dest)->parent)
2732                   != loop_tree_node))
2733             fprintf (ira_dump_file, "(->%d:l%d)",
2734                      e->dest->index, dest_loop_node->loop->num);
2735       }
2736   fprintf (ira_dump_file, "\n    all:");
2737   EXECUTE_IF_SET_IN_BITMAP (loop_tree_node->all_allocnos, 0, j, bi)
2738     fprintf (ira_dump_file, " %dr%d", j, ALLOCNO_REGNO (ira_allocnos[j]));
2739   fprintf (ira_dump_file, "\n    modified regnos:");
2740   EXECUTE_IF_SET_IN_BITMAP (loop_tree_node->modified_regnos, 0, j, bi)
2741     fprintf (ira_dump_file, " %d", j);
2742   fprintf (ira_dump_file, "\n    border:");
2743   EXECUTE_IF_SET_IN_BITMAP (loop_tree_node->border_allocnos, 0, j, bi)
2744     fprintf (ira_dump_file, " %dr%d", j, ALLOCNO_REGNO (ira_allocnos[j]));
2745   fprintf (ira_dump_file, "\n    Pressure:");
2746   for (j = 0; (int) j < ira_pressure_classes_num; j++)
2747     {
2748       enum reg_class pclass;
2749
2750       pclass = ira_pressure_classes[j];
2751       if (loop_tree_node->reg_pressure[pclass] == 0)
2752         continue;
2753       fprintf (ira_dump_file, " %s=%d", reg_class_names[pclass],
2754                loop_tree_node->reg_pressure[pclass]);
2755     }
2756   fprintf (ira_dump_file, "\n");
2757 }
2758
2759 /* Color the allocnos inside loop (in the extreme case it can be all
2760    of the function) given the corresponding LOOP_TREE_NODE.  The
2761    function is called for each loop during top-down traverse of the
2762    loop tree.  */
2763 static void
2764 color_pass (ira_loop_tree_node_t loop_tree_node)
2765 {
2766   int i, regno, hard_regno, index = -1, n, nobj;
2767   int cost, exit_freq, enter_freq;
2768   unsigned int j;
2769   bitmap_iterator bi;
2770   enum machine_mode mode;
2771   enum reg_class rclass, aclass, pclass;
2772   ira_allocno_t a, subloop_allocno;
2773   ira_loop_tree_node_t subloop_node;
2774
2775   ira_assert (loop_tree_node->bb == NULL);
2776   if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
2777     print_loop_title (loop_tree_node);
2778
2779   bitmap_copy (coloring_allocno_bitmap, loop_tree_node->all_allocnos);
2780   bitmap_copy (consideration_allocno_bitmap, coloring_allocno_bitmap);
2781   n = nobj = 0;
2782   EXECUTE_IF_SET_IN_BITMAP (consideration_allocno_bitmap, 0, j, bi)
2783     {
2784       a = ira_allocnos[j];
2785       n++;
2786       nobj += ALLOCNO_NUM_OBJECTS (a);
2787       if (! ALLOCNO_ASSIGNED_P (a))
2788         continue;
2789       bitmap_clear_bit (coloring_allocno_bitmap, ALLOCNO_NUM (a));
2790     }
2791   allocno_color_data
2792     = (allocno_color_data_t) ira_allocate (sizeof (struct allocno_color_data)
2793                                            * n);
2794   memset (allocno_color_data, 0, sizeof (struct allocno_color_data) * n);
2795   object_color_data
2796     = (object_color_data_t) ira_allocate (sizeof (struct object_color_data)
2797                                            * nobj);
2798   memset (object_color_data, 0, sizeof (struct object_color_data) * nobj);
2799   n = nobj = 0;
2800   EXECUTE_IF_SET_IN_BITMAP (consideration_allocno_bitmap, 0, j, bi)
2801     {
2802       a = ira_allocnos[j];
2803       ALLOCNO_ADD_DATA (a) = allocno_color_data + n;
2804       n++;
2805       for (i = 0; i < ALLOCNO_NUM_OBJECTS (a); i++)
2806         {
2807           OBJECT_ADD_DATA (ALLOCNO_OBJECT (a, i)) = object_color_data + nobj;
2808           nobj++;
2809         }
2810     }
2811   /* Color all mentioned allocnos including transparent ones.  */
2812   color_allocnos ();
2813   /* Process caps.  They are processed just once.  */
2814   if (flag_ira_region == IRA_REGION_MIXED
2815       || flag_ira_region == IRA_REGION_ALL)
2816     EXECUTE_IF_SET_IN_BITMAP (loop_tree_node->all_allocnos, 0, j, bi)
2817       {
2818         a = ira_allocnos[j];
2819         if (ALLOCNO_CAP_MEMBER (a) == NULL)
2820           continue;
2821         /* Remove from processing in the next loop.  */
2822         bitmap_clear_bit (consideration_allocno_bitmap, j);
2823         rclass = ALLOCNO_CLASS (a);
2824         pclass = ira_pressure_class_translate[rclass];
2825         if (flag_ira_region == IRA_REGION_MIXED
2826             && (loop_tree_node->reg_pressure[pclass]
2827                 <= ira_available_class_regs[pclass]))
2828           {
2829             mode = ALLOCNO_MODE (a);
2830             hard_regno = ALLOCNO_HARD_REGNO (a);
2831             if (hard_regno >= 0)
2832               {
2833                 index = ira_class_hard_reg_index[rclass][hard_regno];
2834                 ira_assert (index >= 0);
2835               }
2836             regno = ALLOCNO_REGNO (a);
2837             subloop_allocno = ALLOCNO_CAP_MEMBER (a);
2838             subloop_node = ALLOCNO_LOOP_TREE_NODE (subloop_allocno);
2839             ira_assert (!ALLOCNO_ASSIGNED_P (subloop_allocno));
2840             ALLOCNO_HARD_REGNO (subloop_allocno) = hard_regno;
2841             ALLOCNO_ASSIGNED_P (subloop_allocno) = true;
2842             if (hard_regno >= 0)
2843               update_copy_costs (subloop_allocno, true);
2844             /* We don't need updated costs anymore: */
2845             ira_free_allocno_updated_costs (subloop_allocno);
2846           }
2847       }
2848   /* Update costs of the corresponding allocnos (not caps) in the
2849      subloops.  */
2850   for (subloop_node = loop_tree_node->subloops;
2851        subloop_node != NULL;
2852        subloop_node = subloop_node->subloop_next)
2853     {
2854       ira_assert (subloop_node->bb == NULL);
2855       EXECUTE_IF_SET_IN_BITMAP (consideration_allocno_bitmap, 0, j, bi)
2856         {
2857           a = ira_allocnos[j];
2858           ira_assert (ALLOCNO_CAP_MEMBER (a) == NULL);
2859           mode = ALLOCNO_MODE (a);
2860           rclass = ALLOCNO_CLASS (a);
2861           pclass = ira_pressure_class_translate[rclass];
2862           hard_regno = ALLOCNO_HARD_REGNO (a);
2863           /* Use hard register class here.  ??? */
2864           if (hard_regno >= 0)
2865             {
2866               index = ira_class_hard_reg_index[rclass][hard_regno];
2867               ira_assert (index >= 0);
2868             }
2869           regno = ALLOCNO_REGNO (a);
2870           /* ??? conflict costs */
2871           subloop_allocno = subloop_node->regno_allocno_map[regno];
2872           if (subloop_allocno == NULL
2873               || ALLOCNO_CAP (subloop_allocno) != NULL)
2874             continue;
2875           ira_assert (ALLOCNO_CLASS (subloop_allocno) == rclass);
2876           ira_assert (bitmap_bit_p (subloop_node->all_allocnos,
2877                                     ALLOCNO_NUM (subloop_allocno)));
2878           if ((flag_ira_region == IRA_REGION_MIXED)
2879               && (loop_tree_node->reg_pressure[pclass]
2880                   <= ira_available_class_regs[pclass]))
2881             {
2882               if (! ALLOCNO_ASSIGNED_P (subloop_allocno))
2883                 {
2884                   ALLOCNO_HARD_REGNO (subloop_allocno) = hard_regno;
2885                   ALLOCNO_ASSIGNED_P (subloop_allocno) = true;
2886                   if (hard_regno >= 0)
2887                     update_copy_costs (subloop_allocno, true);
2888                   /* We don't need updated costs anymore: */
2889                   ira_free_allocno_updated_costs (subloop_allocno);
2890                 }
2891               continue;
2892             }
2893           exit_freq = ira_loop_edge_freq (subloop_node, regno, true);
2894           enter_freq = ira_loop_edge_freq (subloop_node, regno, false);
2895           ira_assert (regno < ira_reg_equiv_len);
2896           if (ira_reg_equiv_invariant_p[regno]
2897               || ira_reg_equiv_const[regno] != NULL_RTX)
2898             {
2899               if (! ALLOCNO_ASSIGNED_P (subloop_allocno))
2900                 {
2901                   ALLOCNO_HARD_REGNO (subloop_allocno) = hard_regno;
2902                   ALLOCNO_ASSIGNED_P (subloop_allocno) = true;
2903                   if (hard_regno >= 0)
2904                     update_copy_costs (subloop_allocno, true);
2905                   /* We don't need updated costs anymore: */
2906                   ira_free_allocno_updated_costs (subloop_allocno);
2907                 }
2908             }
2909           else if (hard_regno < 0)
2910             {
2911               ALLOCNO_UPDATED_MEMORY_COST (subloop_allocno)
2912                 -= ((ira_memory_move_cost[mode][rclass][1] * enter_freq)
2913                     + (ira_memory_move_cost[mode][rclass][0] * exit_freq));
2914             }
2915           else
2916             {
2917               aclass = ALLOCNO_CLASS (subloop_allocno);
2918               ira_init_register_move_cost_if_necessary (mode);
2919               cost = (ira_register_move_cost[mode][rclass][rclass]
2920                       * (exit_freq + enter_freq));
2921               ira_allocate_and_set_or_copy_costs
2922                 (&ALLOCNO_UPDATED_HARD_REG_COSTS (subloop_allocno), aclass,
2923                  ALLOCNO_UPDATED_CLASS_COST (subloop_allocno),
2924                  ALLOCNO_HARD_REG_COSTS (subloop_allocno));
2925               ira_allocate_and_set_or_copy_costs
2926                 (&ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (subloop_allocno),
2927                  aclass, 0, ALLOCNO_CONFLICT_HARD_REG_COSTS (subloop_allocno));
2928               ALLOCNO_UPDATED_HARD_REG_COSTS (subloop_allocno)[index] -= cost;
2929               ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (subloop_allocno)[index]
2930                 -= cost;
2931               if (ALLOCNO_UPDATED_CLASS_COST (subloop_allocno)
2932                   > ALLOCNO_UPDATED_HARD_REG_COSTS (subloop_allocno)[index])
2933                 ALLOCNO_UPDATED_CLASS_COST (subloop_allocno)
2934                   = ALLOCNO_UPDATED_HARD_REG_COSTS (subloop_allocno)[index];
2935               ALLOCNO_UPDATED_MEMORY_COST (subloop_allocno)
2936                 += (ira_memory_move_cost[mode][rclass][0] * enter_freq
2937                     + ira_memory_move_cost[mode][rclass][1] * exit_freq);
2938             }
2939         }
2940     }
2941   ira_free (object_color_data);
2942   ira_free (allocno_color_data);
2943   EXECUTE_IF_SET_IN_BITMAP (coloring_allocno_bitmap, 0, j, bi)
2944     {
2945       a = ira_allocnos[j];
2946       ALLOCNO_ADD_DATA (a) = NULL;
2947       for (i = 0; i < ALLOCNO_NUM_OBJECTS (a); i++)
2948         OBJECT_ADD_DATA (a) = NULL;
2949     }
2950 }
2951
2952 /* Initialize the common data for coloring and calls functions to do
2953    Chaitin-Briggs and regional coloring.  */
2954 static void
2955 do_coloring (void)
2956 {
2957   coloring_allocno_bitmap = ira_allocate_bitmap ();
2958   if (internal_flag_ira_verbose > 0 && ira_dump_file != NULL)
2959     fprintf (ira_dump_file, "\n**** Allocnos coloring:\n\n");
2960
2961   ira_traverse_loop_tree (false, ira_loop_tree_root, color_pass, NULL);
2962
2963   if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
2964     ira_print_disposition (ira_dump_file);
2965
2966   ira_free_bitmap (coloring_allocno_bitmap);
2967 }
2968
2969 \f
2970
2971 /* Move spill/restore code, which are to be generated in ira-emit.c,
2972    to less frequent points (if it is profitable) by reassigning some
2973    allocnos (in loop with subloops containing in another loop) to
2974    memory which results in longer live-range where the corresponding
2975    pseudo-registers will be in memory.  */
2976 static void
2977 move_spill_restore (void)
2978 {
2979   int cost, regno, hard_regno, hard_regno2, index;
2980   bool changed_p;
2981   int enter_freq, exit_freq;
2982   enum machine_mode mode;
2983   enum reg_class rclass;
2984   ira_allocno_t a, parent_allocno, subloop_allocno;
2985   ira_loop_tree_node_t parent, loop_node, subloop_node;
2986   ira_allocno_iterator ai;
2987
2988   for (;;)
2989     {
2990       changed_p = false;
2991       if (internal_flag_ira_verbose > 0 && ira_dump_file != NULL)
2992         fprintf (ira_dump_file, "New iteration of spill/restore move\n");
2993       FOR_EACH_ALLOCNO (a, ai)
2994         {
2995           regno = ALLOCNO_REGNO (a);
2996           loop_node = ALLOCNO_LOOP_TREE_NODE (a);
2997           if (ALLOCNO_CAP_MEMBER (a) != NULL
2998               || ALLOCNO_CAP (a) != NULL
2999               || (hard_regno = ALLOCNO_HARD_REGNO (a)) < 0
3000               || loop_node->children == NULL
3001               /* don't do the optimization because it can create
3002                  copies and the reload pass can spill the allocno set
3003                  by copy although the allocno will not get memory
3004                  slot.  */
3005               || ira_reg_equiv_invariant_p[regno]
3006               || ira_reg_equiv_const[regno] != NULL_RTX
3007               || !bitmap_bit_p (loop_node->border_allocnos, ALLOCNO_NUM (a)))
3008             continue;
3009           mode = ALLOCNO_MODE (a);
3010           rclass = ALLOCNO_CLASS (a);
3011           index = ira_class_hard_reg_index[rclass][hard_regno];
3012           ira_assert (index >= 0);
3013           cost = (ALLOCNO_MEMORY_COST (a)
3014                   - (ALLOCNO_HARD_REG_COSTS (a) == NULL
3015                      ? ALLOCNO_CLASS_COST (a)
3016                      : ALLOCNO_HARD_REG_COSTS (a)[index]));
3017           ira_init_register_move_cost_if_necessary (mode);
3018           for (subloop_node = loop_node->subloops;
3019                subloop_node != NULL;
3020                subloop_node = subloop_node->subloop_next)
3021             {
3022               ira_assert (subloop_node->bb == NULL);
3023               subloop_allocno = subloop_node->regno_allocno_map[regno];
3024               if (subloop_allocno == NULL)
3025                 continue;
3026               ira_assert (rclass == ALLOCNO_CLASS (subloop_allocno));
3027               /* We have accumulated cost.  To get the real cost of
3028                  allocno usage in the loop we should subtract costs of
3029                  the subloop allocnos.  */
3030               cost -= (ALLOCNO_MEMORY_COST (subloop_allocno)
3031                        - (ALLOCNO_HARD_REG_COSTS (subloop_allocno) == NULL
3032                           ? ALLOCNO_CLASS_COST (subloop_allocno)
3033                           : ALLOCNO_HARD_REG_COSTS (subloop_allocno)[index]));
3034               exit_freq = ira_loop_edge_freq (subloop_node, regno, true);
3035               enter_freq = ira_loop_edge_freq (subloop_node, regno, false);
3036               if ((hard_regno2 = ALLOCNO_HARD_REGNO (subloop_allocno)) < 0)
3037                 cost -= (ira_memory_move_cost[mode][rclass][0] * exit_freq
3038                          + ira_memory_move_cost[mode][rclass][1] * enter_freq);
3039               else
3040                 {
3041                   cost
3042                     += (ira_memory_move_cost[mode][rclass][0] * exit_freq
3043                         + ira_memory_move_cost[mode][rclass][1] * enter_freq);
3044                   if (hard_regno2 != hard_regno)
3045                     cost -= (ira_register_move_cost[mode][rclass][rclass]
3046                              * (exit_freq + enter_freq));
3047                 }
3048             }
3049           if ((parent = loop_node->parent) != NULL
3050               && (parent_allocno = parent->regno_allocno_map[regno]) != NULL)
3051             {
3052               ira_assert (rclass == ALLOCNO_CLASS (parent_allocno));
3053               exit_freq = ira_loop_edge_freq (loop_node, regno, true);
3054               enter_freq = ira_loop_edge_freq (loop_node, regno, false);
3055               if ((hard_regno2 = ALLOCNO_HARD_REGNO (parent_allocno)) < 0)
3056                 cost -= (ira_memory_move_cost[mode][rclass][0] * exit_freq
3057                          + ira_memory_move_cost[mode][rclass][1] * enter_freq);
3058               else
3059                 {
3060                   cost
3061                     += (ira_memory_move_cost[mode][rclass][1] * exit_freq
3062                         + ira_memory_move_cost[mode][rclass][0] * enter_freq);
3063                   if (hard_regno2 != hard_regno)
3064                     cost -= (ira_register_move_cost[mode][rclass][rclass]
3065                              * (exit_freq + enter_freq));
3066                 }
3067             }
3068           if (cost < 0)
3069             {
3070               ALLOCNO_HARD_REGNO (a) = -1;
3071               if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
3072                 {
3073                   fprintf
3074                     (ira_dump_file,
3075                      "      Moving spill/restore for a%dr%d up from loop %d",
3076                      ALLOCNO_NUM (a), regno, loop_node->loop->num);
3077                   fprintf (ira_dump_file, " - profit %d\n", -cost);
3078                 }
3079               changed_p = true;
3080             }
3081         }
3082       if (! changed_p)
3083         break;
3084     }
3085 }
3086
3087 \f
3088
3089 /* Update current hard reg costs and current conflict hard reg costs
3090    for allocno A.  It is done by processing its copies containing
3091    other allocnos already assigned.  */
3092 static void
3093 update_curr_costs (ira_allocno_t a)
3094 {
3095   int i, hard_regno, cost;
3096   enum machine_mode mode;
3097   enum reg_class aclass, rclass;
3098   ira_allocno_t another_a;
3099   ira_copy_t cp, next_cp;
3100
3101   ira_free_allocno_updated_costs (a);
3102   ira_assert (! ALLOCNO_ASSIGNED_P (a));
3103   aclass = ALLOCNO_CLASS (a);
3104   if (aclass == NO_REGS)
3105     return;
3106   mode = ALLOCNO_MODE (a);
3107   ira_init_register_move_cost_if_necessary (mode);
3108   for (cp = ALLOCNO_COPIES (a); cp != NULL; cp = next_cp)
3109     {
3110       if (cp->first == a)
3111         {
3112           next_cp = cp->next_first_allocno_copy;
3113           another_a = cp->second;
3114         }
3115       else if (cp->second == a)
3116         {
3117           next_cp = cp->next_second_allocno_copy;
3118           another_a = cp->first;
3119         }
3120       else
3121         gcc_unreachable ();
3122       if (! ira_reg_classes_intersect_p[aclass][ALLOCNO_CLASS (another_a)]
3123           || ! ALLOCNO_ASSIGNED_P (another_a)
3124           || (hard_regno = ALLOCNO_HARD_REGNO (another_a)) < 0)
3125         continue;
3126       rclass = REGNO_REG_CLASS (hard_regno);
3127       i = ira_class_hard_reg_index[aclass][hard_regno];
3128       if (i < 0)
3129         continue;
3130       cost = (cp->first == a
3131               ? ira_register_move_cost[mode][rclass][aclass]
3132               : ira_register_move_cost[mode][aclass][rclass]);
3133       ira_allocate_and_set_or_copy_costs
3134         (&ALLOCNO_UPDATED_HARD_REG_COSTS (a), aclass, ALLOCNO_CLASS_COST (a),
3135          ALLOCNO_HARD_REG_COSTS (a));
3136       ira_allocate_and_set_or_copy_costs
3137         (&ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a),
3138          aclass, 0, ALLOCNO_CONFLICT_HARD_REG_COSTS (a));
3139       ALLOCNO_UPDATED_HARD_REG_COSTS (a)[i] -= cp->freq * cost;
3140       ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a)[i] -= cp->freq * cost;
3141     }
3142 }
3143
3144 /* Try to assign hard registers to the unassigned allocnos and
3145    allocnos conflicting with them or conflicting with allocnos whose
3146    regno >= START_REGNO.  The function is called after ira_flattening,
3147    so more allocnos (including ones created in ira-emit.c) will have a
3148    chance to get a hard register.  We use simple assignment algorithm
3149    based on priorities.  */
3150 void
3151 ira_reassign_conflict_allocnos (int start_regno)
3152 {
3153   int i, allocnos_to_color_num;
3154   ira_allocno_t a;
3155   enum reg_class aclass;
3156   bitmap allocnos_to_color;
3157   ira_allocno_iterator ai;
3158
3159   allocnos_to_color = ira_allocate_bitmap ();
3160   allocnos_to_color_num = 0;
3161   FOR_EACH_ALLOCNO (a, ai)
3162     {
3163       int n = ALLOCNO_NUM_OBJECTS (a);
3164
3165       if (! ALLOCNO_ASSIGNED_P (a)
3166           && ! bitmap_bit_p (allocnos_to_color, ALLOCNO_NUM (a)))
3167         {
3168           if (ALLOCNO_CLASS (a) != NO_REGS)
3169             sorted_allocnos[allocnos_to_color_num++] = a;
3170           else
3171             {
3172               ALLOCNO_ASSIGNED_P (a) = true;
3173               ALLOCNO_HARD_REGNO (a) = -1;
3174               ira_assert (ALLOCNO_UPDATED_HARD_REG_COSTS (a) == NULL);
3175               ira_assert (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) == NULL);
3176             }
3177           bitmap_set_bit (allocnos_to_color, ALLOCNO_NUM (a));
3178         }
3179       if (ALLOCNO_REGNO (a) < start_regno
3180           || (aclass = ALLOCNO_CLASS (a)) == NO_REGS)
3181         continue;
3182       for (i = 0; i < n; i++)
3183         {
3184           ira_object_t obj = ALLOCNO_OBJECT (a, i);
3185           ira_object_t conflict_obj;
3186           ira_object_conflict_iterator oci;
3187
3188           FOR_EACH_OBJECT_CONFLICT (obj, conflict_obj, oci)
3189             {
3190               ira_allocno_t conflict_a = OBJECT_ALLOCNO (conflict_obj);
3191
3192               ira_assert (ira_reg_classes_intersect_p
3193                           [aclass][ALLOCNO_CLASS (conflict_a)]);
3194               if (!bitmap_set_bit (allocnos_to_color, ALLOCNO_NUM (conflict_a)))
3195                 continue;
3196               sorted_allocnos[allocnos_to_color_num++] = conflict_a;
3197             }
3198         }
3199     }
3200   ira_free_bitmap (allocnos_to_color);
3201   if (allocnos_to_color_num > 1)
3202     {
3203       setup_allocno_priorities (sorted_allocnos, allocnos_to_color_num);
3204       qsort (sorted_allocnos, allocnos_to_color_num, sizeof (ira_allocno_t),
3205              allocno_priority_compare_func);
3206     }
3207   for (i = 0; i < allocnos_to_color_num; i++)
3208     {
3209       a = sorted_allocnos[i];
3210       ALLOCNO_ASSIGNED_P (a) = false;
3211       update_curr_costs (a);
3212     }
3213   for (i = 0; i < allocnos_to_color_num; i++)
3214     {
3215       a = sorted_allocnos[i];
3216       if (assign_hard_reg (a, true))
3217         {
3218           if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
3219             fprintf
3220               (ira_dump_file,
3221                "      Secondary allocation: assign hard reg %d to reg %d\n",
3222                ALLOCNO_HARD_REGNO (a), ALLOCNO_REGNO (a));
3223         }
3224     }
3225 }
3226
3227 \f
3228
3229 /* This page contains functions used to find conflicts using allocno
3230    live ranges.  */
3231
3232 /* Return TRUE if live ranges of allocnos A1 and A2 intersect.  It is
3233    used to find a conflict for new allocnos or allocnos with the
3234    different allocno classes.  */
3235 static bool
3236 allocnos_conflict_by_live_ranges_p (ira_allocno_t a1, ira_allocno_t a2)
3237 {
3238   rtx reg1, reg2;
3239   int i, j;
3240   int n1 = ALLOCNO_NUM_OBJECTS (a1);
3241   int n2 = ALLOCNO_NUM_OBJECTS (a2);
3242
3243   if (a1 == a2)
3244     return false;
3245   reg1 = regno_reg_rtx[ALLOCNO_REGNO (a1)];
3246   reg2 = regno_reg_rtx[ALLOCNO_REGNO (a2)];
3247   if (reg1 != NULL && reg2 != NULL
3248       && ORIGINAL_REGNO (reg1) == ORIGINAL_REGNO (reg2))
3249     return false;
3250
3251   for (i = 0; i < n1; i++)
3252     {
3253       ira_object_t c1 = ALLOCNO_OBJECT (a1, i);
3254
3255       for (j = 0; j < n2; j++)
3256         {
3257           ira_object_t c2 = ALLOCNO_OBJECT (a2, j);
3258
3259           if (ira_live_ranges_intersect_p (OBJECT_LIVE_RANGES (c1),
3260                                            OBJECT_LIVE_RANGES (c2)))
3261             return true;
3262         }
3263     }
3264   return false;
3265 }
3266
3267 #ifdef ENABLE_IRA_CHECKING
3268
3269 /* Return TRUE if live ranges of pseudo-registers REGNO1 and REGNO2
3270    intersect.  This should be used when there is only one region.
3271    Currently this is used during reload.  */
3272 static bool
3273 conflict_by_live_ranges_p (int regno1, int regno2)
3274 {
3275   ira_allocno_t a1, a2;
3276
3277   ira_assert (regno1 >= FIRST_PSEUDO_REGISTER
3278               && regno2 >= FIRST_PSEUDO_REGISTER);
3279   /* Reg info caclulated by dataflow infrastructure can be different
3280      from one calculated by regclass.  */
3281   if ((a1 = ira_loop_tree_root->regno_allocno_map[regno1]) == NULL
3282       || (a2 = ira_loop_tree_root->regno_allocno_map[regno2]) == NULL)
3283     return false;
3284   return allocnos_conflict_by_live_ranges_p (a1, a2);
3285 }
3286
3287 #endif
3288
3289 \f
3290
3291 /* This page contains code to coalesce memory stack slots used by
3292    spilled allocnos.  This results in smaller stack frame, better data
3293    locality, and in smaller code for some architectures like
3294    x86/x86_64 where insn size depends on address displacement value.
3295    On the other hand, it can worsen insn scheduling after the RA but
3296    in practice it is less important than smaller stack frames.  */
3297
3298 /* TRUE if we coalesced some allocnos.  In other words, if we got
3299    loops formed by members first_coalesced_allocno and
3300    next_coalesced_allocno containing more one allocno.  */
3301 static bool allocno_coalesced_p;
3302
3303 /* Bitmap used to prevent a repeated allocno processing because of
3304    coalescing.  */
3305 static bitmap processed_coalesced_allocno_bitmap;
3306
3307 /* See below.  */
3308 typedef struct coalesce_data *coalesce_data_t;
3309
3310 /* To decrease footprint of ira_allocno structure we store all data
3311    needed only for coalescing in the following structure.  */
3312 struct coalesce_data
3313 {
3314   /* Coalesced allocnos form a cyclic list.  One allocno given by
3315      FIRST represents all coalesced allocnos.  The
3316      list is chained by NEXT.  */
3317   ira_allocno_t first;
3318   ira_allocno_t next;
3319   int temp;
3320 };
3321
3322 /* Container for storing allocno data concerning coalescing.  */
3323 static coalesce_data_t allocno_coalesce_data;
3324
3325 /* Macro to access the data concerning coalescing.  */
3326 #define ALLOCNO_COALESCE_DATA(a) ((coalesce_data_t) ALLOCNO_ADD_DATA (a))
3327
3328 /* The function is used to sort allocnos according to their execution
3329    frequencies.  */
3330 static int
3331 copy_freq_compare_func (const void *v1p, const void *v2p)
3332 {
3333   ira_copy_t cp1 = *(const ira_copy_t *) v1p, cp2 = *(const ira_copy_t *) v2p;
3334   int pri1, pri2;
3335
3336   pri1 = cp1->freq;
3337   pri2 = cp2->freq;
3338   if (pri2 - pri1)
3339     return pri2 - pri1;
3340
3341   /* If freqencies are equal, sort by copies, so that the results of
3342      qsort leave nothing to chance.  */
3343   return cp1->num - cp2->num;
3344 }
3345
3346 /* Merge two sets of coalesced allocnos given correspondingly by
3347    allocnos A1 and A2 (more accurately merging A2 set into A1
3348    set).  */
3349 static void
3350 merge_allocnos (ira_allocno_t a1, ira_allocno_t a2)
3351 {
3352   ira_allocno_t a, first, last, next;
3353
3354   first = ALLOCNO_COALESCE_DATA (a1)->first;
3355   a = ALLOCNO_COALESCE_DATA (a2)->first;
3356   if (first == a)
3357     return;
3358   for (last = a2, a = ALLOCNO_COALESCE_DATA (a2)->next;;
3359        a = ALLOCNO_COALESCE_DATA (a)->next)
3360     {
3361       ALLOCNO_COALESCE_DATA (a)->first = first;
3362       if (a == a2)
3363         break;
3364       last = a;
3365     }
3366   next = allocno_coalesce_data[ALLOCNO_NUM (first)].next;
3367   allocno_coalesce_data[ALLOCNO_NUM (first)].next = a2;
3368   allocno_coalesce_data[ALLOCNO_NUM (last)].next = next;
3369 }
3370
3371 /* Return TRUE if there are conflicting allocnos from two sets of
3372    coalesced allocnos given correspondingly by allocnos A1 and A2.  We
3373    use live ranges to find conflicts because conflicts are represented
3374    only for allocnos of the same allocno class and during the reload
3375    pass we coalesce allocnos for sharing stack memory slots.  */
3376 static bool
3377 coalesced_allocno_conflict_p (ira_allocno_t a1, ira_allocno_t a2)
3378 {
3379   ira_allocno_t a, conflict_a;
3380
3381   if (allocno_coalesced_p)
3382     {
3383       bitmap_clear (processed_coalesced_allocno_bitmap);
3384       for (a = ALLOCNO_COALESCE_DATA (a1)->next;;
3385            a = ALLOCNO_COALESCE_DATA (a)->next)
3386         {
3387           bitmap_set_bit (processed_coalesced_allocno_bitmap, ALLOCNO_NUM (a));
3388           if (a == a1)
3389             break;
3390         }
3391     }
3392   for (a = ALLOCNO_COALESCE_DATA (a2)->next;;
3393        a = ALLOCNO_COALESCE_DATA (a)->next)
3394     {
3395       for (conflict_a = ALLOCNO_COALESCE_DATA (a1)->next;;
3396            conflict_a = ALLOCNO_COALESCE_DATA (conflict_a)->next)
3397         {
3398           if (allocnos_conflict_by_live_ranges_p (a, conflict_a))
3399             return true;
3400           if (conflict_a == a1)
3401             break;
3402         }
3403       if (a == a2)
3404         break;
3405     }
3406   return false;
3407 }
3408
3409 /* The major function for aggressive allocno coalescing.  We coalesce
3410    only spilled allocnos.  If some allocnos have been coalesced, we
3411    set up flag allocno_coalesced_p.  */
3412 static void
3413 coalesce_allocnos (void)
3414 {
3415   ira_allocno_t a;
3416   ira_copy_t cp, next_cp, *sorted_copies;
3417   unsigned int j;
3418   int i, n, cp_num, regno;
3419   bitmap_iterator bi;
3420
3421   sorted_copies = (ira_copy_t *) ira_allocate (ira_copies_num
3422                                                * sizeof (ira_copy_t));
3423   cp_num = 0;
3424   /* Collect copies.  */
3425   EXECUTE_IF_SET_IN_BITMAP (coloring_allocno_bitmap, 0, j, bi)
3426     {
3427       a = ira_allocnos[j];
3428       regno = ALLOCNO_REGNO (a);
3429       if (! ALLOCNO_ASSIGNED_P (a) || ALLOCNO_HARD_REGNO (a) >= 0
3430           || (regno < ira_reg_equiv_len
3431               && (ira_reg_equiv_const[regno] != NULL_RTX
3432                   || ira_reg_equiv_invariant_p[regno])))
3433         continue;
3434       for (cp = ALLOCNO_COPIES (a); cp != NULL; cp = next_cp)
3435         {
3436           if (cp->first == a)
3437             {
3438               next_cp = cp->next_first_allocno_copy;
3439               regno = ALLOCNO_REGNO (cp->second);
3440               /* For priority coloring we coalesce allocnos only with
3441                  the same allocno class not with intersected allocno
3442                  classes as it were possible.  It is done for
3443                  simplicity.  */
3444               if ((cp->insn != NULL || cp->constraint_p)
3445                   && ALLOCNO_ASSIGNED_P (cp->second)
3446                   && ALLOCNO_HARD_REGNO (cp->second) < 0
3447                   && (regno >= ira_reg_equiv_len
3448                       || (! ira_reg_equiv_invariant_p[regno]
3449                           && ira_reg_equiv_const[regno] == NULL_RTX)))
3450                 sorted_copies[cp_num++] = cp;
3451             }
3452           else if (cp->second == a)
3453             next_cp = cp->next_second_allocno_copy;
3454           else
3455             gcc_unreachable ();
3456         }
3457     }
3458   qsort (sorted_copies, cp_num, sizeof (ira_copy_t), copy_freq_compare_func);
3459   /* Coalesced copies, most frequently executed first.  */
3460   for (; cp_num != 0;)
3461     {
3462       for (i = 0; i < cp_num; i++)
3463         {
3464           cp = sorted_copies[i];
3465           if (! coalesced_allocno_conflict_p (cp->first, cp->second))
3466             {
3467               allocno_coalesced_p = true;
3468               if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
3469                 fprintf
3470                   (ira_dump_file,
3471                    "      Coalescing copy %d:a%dr%d-a%dr%d (freq=%d)\n",
3472                    cp->num, ALLOCNO_NUM (cp->first), ALLOCNO_REGNO (cp->first),
3473                    ALLOCNO_NUM (cp->second), ALLOCNO_REGNO (cp->second),
3474                    cp->freq);
3475               merge_allocnos (cp->first, cp->second);
3476               i++;
3477               break;
3478             }
3479         }
3480       /* Collect the rest of copies.  */
3481       for (n = 0; i < cp_num; i++)
3482         {
3483           cp = sorted_copies[i];
3484           if (allocno_coalesce_data[ALLOCNO_NUM (cp->first)].first
3485               != allocno_coalesce_data[ALLOCNO_NUM (cp->second)].first)
3486             sorted_copies[n++] = cp;
3487         }
3488       cp_num = n;
3489     }
3490   ira_free (sorted_copies);
3491 }
3492
3493 /* Usage cost and order number of coalesced allocno set to which
3494    given pseudo register belongs to.  */
3495 static int *regno_coalesced_allocno_cost;
3496 static int *regno_coalesced_allocno_num;
3497
3498 /* Sort pseudos according frequencies of coalesced allocno sets they
3499    belong to (putting most frequently ones first), and according to
3500    coalesced allocno set order numbers.  */
3501 static int
3502 coalesced_pseudo_reg_freq_compare (const void *v1p, const void *v2p)
3503 {
3504   const int regno1 = *(const int *) v1p;
3505   const int regno2 = *(const int *) v2p;
3506   int diff;
3507
3508   if ((diff = (regno_coalesced_allocno_cost[regno2]
3509                - regno_coalesced_allocno_cost[regno1])) != 0)
3510     return diff;
3511   if ((diff = (regno_coalesced_allocno_num[regno1]
3512                - regno_coalesced_allocno_num[regno2])) != 0)
3513     return diff;
3514   return regno1 - regno2;
3515 }
3516
3517 /* Widest width in which each pseudo reg is referred to (via subreg).
3518    It is used for sorting pseudo registers.  */
3519 static unsigned int *regno_max_ref_width;
3520
3521 /* Redefine STACK_GROWS_DOWNWARD in terms of 0 or 1.  */
3522 #ifdef STACK_GROWS_DOWNWARD
3523 # undef STACK_GROWS_DOWNWARD
3524 # define STACK_GROWS_DOWNWARD 1
3525 #else
3526 # define STACK_GROWS_DOWNWARD 0
3527 #endif
3528
3529 /* Sort pseudos according their slot numbers (putting ones with
3530   smaller numbers first, or last when the frame pointer is not
3531   needed).  */
3532 static int
3533 coalesced_pseudo_reg_slot_compare (const void *v1p, const void *v2p)
3534 {
3535   const int regno1 = *(const int *) v1p;
3536   const int regno2 = *(const int *) v2p;
3537   ira_allocno_t a1 = ira_regno_allocno_map[regno1];
3538   ira_allocno_t a2 = ira_regno_allocno_map[regno2];
3539   int diff, slot_num1, slot_num2;
3540   int total_size1, total_size2;
3541
3542   if (a1 == NULL || ALLOCNO_HARD_REGNO (a1) >= 0)
3543     {
3544       if (a2 == NULL || ALLOCNO_HARD_REGNO (a2) >= 0)
3545         return regno1 - regno2;
3546       return 1;
3547     }
3548   else if (a2 == NULL || ALLOCNO_HARD_REGNO (a2) >= 0)
3549     return -1;
3550   slot_num1 = -ALLOCNO_HARD_REGNO (a1);
3551   slot_num2 = -ALLOCNO_HARD_REGNO (a2);
3552   if ((diff = slot_num1 - slot_num2) != 0)
3553     return (frame_pointer_needed
3554             || !FRAME_GROWS_DOWNWARD == STACK_GROWS_DOWNWARD ? diff : -diff);
3555   total_size1 = MAX (PSEUDO_REGNO_BYTES (regno1),
3556                      regno_max_ref_width[regno1]);
3557   total_size2 = MAX (PSEUDO_REGNO_BYTES (regno2),
3558                      regno_max_ref_width[regno2]);
3559   if ((diff = total_size2 - total_size1) != 0)
3560     return diff;
3561   return regno1 - regno2;
3562 }
3563
3564 /* Setup REGNO_COALESCED_ALLOCNO_COST and REGNO_COALESCED_ALLOCNO_NUM
3565    for coalesced allocno sets containing allocnos with their regnos
3566    given in array PSEUDO_REGNOS of length N.  */
3567 static void
3568 setup_coalesced_allocno_costs_and_nums (int *pseudo_regnos, int n)
3569 {
3570   int i, num, regno, cost;
3571   ira_allocno_t allocno, a;
3572
3573   for (num = i = 0; i < n; i++)
3574     {
3575       regno = pseudo_regnos[i];
3576       allocno = ira_regno_allocno_map[regno];
3577       if (allocno == NULL)
3578         {
3579           regno_coalesced_allocno_cost[regno] = 0;
3580           regno_coalesced_allocno_num[regno] = ++num;
3581           continue;
3582         }
3583       if (ALLOCNO_COALESCE_DATA (allocno)->first != allocno)
3584         continue;
3585       num++;
3586       for (cost = 0, a = ALLOCNO_COALESCE_DATA (allocno)->next;;
3587            a = ALLOCNO_COALESCE_DATA (a)->next)
3588         {
3589           cost += ALLOCNO_FREQ (a);
3590           if (a == allocno)
3591             break;
3592         }
3593       for (a = ALLOCNO_COALESCE_DATA (allocno)->next;;
3594            a = ALLOCNO_COALESCE_DATA (a)->next)
3595         {
3596           regno_coalesced_allocno_num[ALLOCNO_REGNO (a)] = num;
3597           regno_coalesced_allocno_cost[ALLOCNO_REGNO (a)] = cost;
3598           if (a == allocno)
3599             break;
3600         }
3601     }
3602 }
3603
3604 /* Collect spilled allocnos representing coalesced allocno sets (the
3605    first coalesced allocno).  The collected allocnos are returned
3606    through array SPILLED_COALESCED_ALLOCNOS.  The function returns the
3607    number of the collected allocnos.  The allocnos are given by their
3608    regnos in array PSEUDO_REGNOS of length N.  */
3609 static int
3610 collect_spilled_coalesced_allocnos (int *pseudo_regnos, int n,
3611                                     ira_allocno_t *spilled_coalesced_allocnos)
3612 {
3613   int i, num, regno;
3614   ira_allocno_t allocno;
3615
3616   for (num = i = 0; i < n; i++)
3617     {
3618       regno = pseudo_regnos[i];
3619       allocno = ira_regno_allocno_map[regno];
3620       if (allocno == NULL || ALLOCNO_HARD_REGNO (allocno) >= 0
3621           || ALLOCNO_COALESCE_DATA (allocno)->first != allocno)
3622         continue;
3623       spilled_coalesced_allocnos[num++] = allocno;
3624     }
3625   return num;
3626 }
3627
3628 /* Array of live ranges of size IRA_ALLOCNOS_NUM.  Live range for
3629    given slot contains live ranges of coalesced allocnos assigned to
3630    given slot.  */
3631 static live_range_t *slot_coalesced_allocnos_live_ranges;
3632
3633 /* Return TRUE if coalesced allocnos represented by ALLOCNO has live
3634    ranges intersected with live ranges of coalesced allocnos assigned
3635    to slot with number N.  */
3636 static bool
3637 slot_coalesced_allocno_live_ranges_intersect_p (ira_allocno_t allocno, int n)
3638 {
3639   ira_allocno_t a;
3640
3641   for (a = ALLOCNO_COALESCE_DATA (allocno)->next;;
3642        a = ALLOCNO_COALESCE_DATA (a)->next)
3643     {
3644       int i;
3645       int nr = ALLOCNO_NUM_OBJECTS (a);
3646
3647       for (i = 0; i < nr; i++)
3648         {
3649           ira_object_t obj = ALLOCNO_OBJECT (a, i);
3650
3651           if (ira_live_ranges_intersect_p
3652               (slot_coalesced_allocnos_live_ranges[n],
3653                OBJECT_LIVE_RANGES (obj)))
3654             return true;
3655         }
3656       if (a == allocno)
3657         break;
3658     }
3659   return false;
3660 }
3661
3662 /* Update live ranges of slot to which coalesced allocnos represented
3663    by ALLOCNO were assigned.  */
3664 static void
3665 setup_slot_coalesced_allocno_live_ranges (ira_allocno_t allocno)
3666 {
3667   int i, n;
3668   ira_allocno_t a;
3669   live_range_t r;
3670
3671   n = ALLOCNO_COALESCE_DATA (allocno)->temp;
3672   for (a = ALLOCNO_COALESCE_DATA (allocno)->next;;
3673        a = ALLOCNO_COALESCE_DATA (a)->next)
3674     {
3675       int nr = ALLOCNO_NUM_OBJECTS (a);
3676       for (i = 0; i < nr; i++)
3677         {
3678           ira_object_t obj = ALLOCNO_OBJECT (a, i);
3679
3680           r = ira_copy_live_range_list (OBJECT_LIVE_RANGES (obj));
3681           slot_coalesced_allocnos_live_ranges[n]
3682             = ira_merge_live_ranges
3683               (slot_coalesced_allocnos_live_ranges[n], r);
3684         }
3685       if (a == allocno)
3686         break;
3687     }
3688 }
3689
3690 /* We have coalesced allocnos involving in copies.  Coalesce allocnos
3691    further in order to share the same memory stack slot.  Allocnos
3692    representing sets of allocnos coalesced before the call are given
3693    in array SPILLED_COALESCED_ALLOCNOS of length NUM.  Return TRUE if
3694    some allocnos were coalesced in the function.  */
3695 static bool
3696 coalesce_spill_slots (ira_allocno_t *spilled_coalesced_allocnos, int num)
3697 {
3698   int i, j, n, last_coalesced_allocno_num;
3699   ira_allocno_t allocno, a;
3700   bool merged_p = false;
3701   bitmap set_jump_crosses = regstat_get_setjmp_crosses ();
3702
3703   slot_coalesced_allocnos_live_ranges
3704     = (live_range_t *) ira_allocate (sizeof (live_range_t) * ira_allocnos_num);
3705   memset (slot_coalesced_allocnos_live_ranges, 0,
3706           sizeof (live_range_t) * ira_allocnos_num);
3707   last_coalesced_allocno_num = 0;
3708   /* Coalesce non-conflicting spilled allocnos preferring most
3709      frequently used.  */
3710   for (i = 0; i < num; i++)
3711     {
3712       allocno = spilled_coalesced_allocnos[i];
3713       if (ALLOCNO_COALESCE_DATA (allocno)->first != allocno
3714           || bitmap_bit_p (set_jump_crosses, ALLOCNO_REGNO (allocno))
3715           || (ALLOCNO_REGNO (allocno) < ira_reg_equiv_len
3716               && (ira_reg_equiv_const[ALLOCNO_REGNO (allocno)] != NULL_RTX
3717                   || ira_reg_equiv_invariant_p[ALLOCNO_REGNO (allocno)])))
3718         continue;
3719       for (j = 0; j < i; j++)
3720         {
3721           a = spilled_coalesced_allocnos[j];
3722           n = ALLOCNO_COALESCE_DATA (a)->temp;
3723           if (ALLOCNO_COALESCE_DATA (a)->first == a
3724               && ! bitmap_bit_p (set_jump_crosses, ALLOCNO_REGNO (a))
3725               && (ALLOCNO_REGNO (a) >= ira_reg_equiv_len
3726                   || (! ira_reg_equiv_invariant_p[ALLOCNO_REGNO (a)]
3727                       && ira_reg_equiv_const[ALLOCNO_REGNO (a)] == NULL_RTX))
3728               && ! slot_coalesced_allocno_live_ranges_intersect_p (allocno, n))
3729             break;
3730         }
3731       if (j >= i)
3732         {
3733           /* No coalescing: set up number for coalesced allocnos
3734              represented by ALLOCNO.  */
3735           ALLOCNO_COALESCE_DATA (allocno)->temp = last_coalesced_allocno_num++;
3736           setup_slot_coalesced_allocno_live_ranges (allocno);
3737         }
3738       else
3739         {
3740           allocno_coalesced_p = true;
3741           merged_p = true;
3742           if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
3743             fprintf (ira_dump_file,
3744                      "      Coalescing spilled allocnos a%dr%d->a%dr%d\n",
3745                      ALLOCNO_NUM (allocno), ALLOCNO_REGNO (allocno),
3746                      ALLOCNO_NUM (a), ALLOCNO_REGNO (a));
3747           ALLOCNO_COALESCE_DATA (allocno)->temp
3748             = ALLOCNO_COALESCE_DATA (a)->temp;
3749           setup_slot_coalesced_allocno_live_ranges (allocno);
3750           merge_allocnos (a, allocno);
3751           ira_assert (ALLOCNO_COALESCE_DATA (a)->first == a);
3752         }
3753     }
3754   for (i = 0; i < ira_allocnos_num; i++)
3755     ira_finish_live_range_list (slot_coalesced_allocnos_live_ranges[i]);
3756   ira_free (slot_coalesced_allocnos_live_ranges);
3757   return merged_p;
3758 }
3759
3760 /* Sort pseudo-register numbers in array PSEUDO_REGNOS of length N for
3761    subsequent assigning stack slots to them in the reload pass.  To do
3762    this we coalesce spilled allocnos first to decrease the number of
3763    memory-memory move insns.  This function is called by the
3764    reload.  */
3765 void
3766 ira_sort_regnos_for_alter_reg (int *pseudo_regnos, int n,
3767                                unsigned int *reg_max_ref_width)
3768 {
3769   int max_regno = max_reg_num ();
3770   int i, regno, num, slot_num;
3771   ira_allocno_t allocno, a;
3772   ira_allocno_iterator ai;
3773   ira_allocno_t *spilled_coalesced_allocnos;
3774
3775   /* Set up allocnos can be coalesced.  */
3776   coloring_allocno_bitmap = ira_allocate_bitmap ();
3777   for (i = 0; i < n; i++)
3778     {
3779       regno = pseudo_regnos[i];
3780       allocno = ira_regno_allocno_map[regno];
3781       if (allocno != NULL)
3782         bitmap_set_bit (coloring_allocno_bitmap, ALLOCNO_NUM (allocno));
3783     }
3784   allocno_coalesced_p = false;
3785   processed_coalesced_allocno_bitmap = ira_allocate_bitmap ();
3786   allocno_coalesce_data
3787     = (coalesce_data_t) ira_allocate (sizeof (struct coalesce_data)
3788                                       * ira_allocnos_num);
3789   /* Initialize coalesce data for allocnos.  */
3790   FOR_EACH_ALLOCNO (a, ai)
3791     {
3792       ALLOCNO_ADD_DATA (a) = allocno_coalesce_data + ALLOCNO_NUM (a);
3793       ALLOCNO_COALESCE_DATA (a)->first = a;
3794       ALLOCNO_COALESCE_DATA (a)->next = a;
3795     }
3796   coalesce_allocnos ();
3797   ira_free_bitmap (coloring_allocno_bitmap);
3798   regno_coalesced_allocno_cost
3799     = (int *) ira_allocate (max_regno * sizeof (int));
3800   regno_coalesced_allocno_num
3801     = (int *) ira_allocate (max_regno * sizeof (int));
3802   memset (regno_coalesced_allocno_num, 0, max_regno * sizeof (int));
3803   setup_coalesced_allocno_costs_and_nums (pseudo_regnos, n);
3804   /* Sort regnos according frequencies of the corresponding coalesced
3805      allocno sets.  */
3806   qsort (pseudo_regnos, n, sizeof (int), coalesced_pseudo_reg_freq_compare);
3807   spilled_coalesced_allocnos
3808     = (ira_allocno_t *) ira_allocate (ira_allocnos_num
3809                                       * sizeof (ira_allocno_t));
3810   /* Collect allocnos representing the spilled coalesced allocno
3811      sets.  */
3812   num = collect_spilled_coalesced_allocnos (pseudo_regnos, n,
3813                                             spilled_coalesced_allocnos);
3814   if (flag_ira_share_spill_slots
3815       && coalesce_spill_slots (spilled_coalesced_allocnos, num))
3816     {
3817       setup_coalesced_allocno_costs_and_nums (pseudo_regnos, n);
3818       qsort (pseudo_regnos, n, sizeof (int),
3819              coalesced_pseudo_reg_freq_compare);
3820       num = collect_spilled_coalesced_allocnos (pseudo_regnos, n,
3821                                                 spilled_coalesced_allocnos);
3822     }
3823   ira_free_bitmap (processed_coalesced_allocno_bitmap);
3824   allocno_coalesced_p = false;
3825   /* Assign stack slot numbers to spilled allocno sets, use smaller
3826      numbers for most frequently used coalesced allocnos.  -1 is
3827      reserved for dynamic search of stack slots for pseudos spilled by
3828      the reload.  */
3829   slot_num = 1;
3830   for (i = 0; i < num; i++)
3831     {
3832       allocno = spilled_coalesced_allocnos[i];
3833       if (ALLOCNO_COALESCE_DATA (allocno)->first != allocno
3834           || ALLOCNO_HARD_REGNO (allocno) >= 0
3835           || (ALLOCNO_REGNO (allocno) < ira_reg_equiv_len
3836               && (ira_reg_equiv_const[ALLOCNO_REGNO (allocno)] != NULL_RTX
3837                   || ira_reg_equiv_invariant_p[ALLOCNO_REGNO (allocno)])))
3838         continue;
3839       if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
3840         fprintf (ira_dump_file, "      Slot %d (freq,size):", slot_num);
3841       slot_num++;
3842       for (a = ALLOCNO_COALESCE_DATA (allocno)->next;;
3843            a = ALLOCNO_COALESCE_DATA (a)->next)
3844         {
3845           ira_assert (ALLOCNO_HARD_REGNO (a) < 0);
3846           ALLOCNO_HARD_REGNO (a) = -slot_num;
3847           if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
3848             fprintf (ira_dump_file, " a%dr%d(%d,%d)",
3849                      ALLOCNO_NUM (a), ALLOCNO_REGNO (a), ALLOCNO_FREQ (a),
3850                      MAX (PSEUDO_REGNO_BYTES (ALLOCNO_REGNO (a)),
3851                           reg_max_ref_width[ALLOCNO_REGNO (a)]));
3852
3853           if (a == allocno)
3854             break;
3855         }
3856       if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
3857         fprintf (ira_dump_file, "\n");
3858     }
3859   ira_spilled_reg_stack_slots_num = slot_num - 1;
3860   ira_free (spilled_coalesced_allocnos);
3861   /* Sort regnos according the slot numbers.  */
3862   regno_max_ref_width = reg_max_ref_width;
3863   qsort (pseudo_regnos, n, sizeof (int), coalesced_pseudo_reg_slot_compare);
3864   FOR_EACH_ALLOCNO (a, ai)
3865     ALLOCNO_ADD_DATA (a) = NULL;
3866   ira_free (allocno_coalesce_data);
3867   ira_free (regno_coalesced_allocno_num);
3868   ira_free (regno_coalesced_allocno_cost);
3869 }
3870
3871 \f
3872
3873 /* This page contains code used by the reload pass to improve the
3874    final code.  */
3875
3876 /* The function is called from reload to mark changes in the
3877    allocation of REGNO made by the reload.  Remember that reg_renumber
3878    reflects the change result.  */
3879 void
3880 ira_mark_allocation_change (int regno)
3881 {
3882   ira_allocno_t a = ira_regno_allocno_map[regno];
3883   int old_hard_regno, hard_regno, cost;
3884   enum reg_class aclass = ALLOCNO_CLASS (a);
3885
3886   ira_assert (a != NULL);
3887   hard_regno = reg_renumber[regno];
3888   if ((old_hard_regno = ALLOCNO_HARD_REGNO (a)) == hard_regno)
3889     return;
3890   if (old_hard_regno < 0)
3891     cost = -ALLOCNO_MEMORY_COST (a);
3892   else
3893     {
3894       ira_assert (ira_class_hard_reg_index[aclass][old_hard_regno] >= 0);
3895       cost = -(ALLOCNO_HARD_REG_COSTS (a) == NULL
3896                ? ALLOCNO_CLASS_COST (a)
3897                : ALLOCNO_HARD_REG_COSTS (a)
3898                  [ira_class_hard_reg_index[aclass][old_hard_regno]]);
3899       update_copy_costs (a, false);
3900     }
3901   ira_overall_cost -= cost;
3902   ALLOCNO_HARD_REGNO (a) = hard_regno;
3903   if (hard_regno < 0)
3904     {
3905       ALLOCNO_HARD_REGNO (a) = -1;
3906       cost += ALLOCNO_MEMORY_COST (a);
3907     }
3908   else if (ira_class_hard_reg_index[aclass][hard_regno] >= 0)
3909     {
3910       cost += (ALLOCNO_HARD_REG_COSTS (a) == NULL
3911                ? ALLOCNO_CLASS_COST (a)
3912                : ALLOCNO_HARD_REG_COSTS (a)
3913                  [ira_class_hard_reg_index[aclass][hard_regno]]);
3914       update_copy_costs (a, true);
3915     }
3916   else
3917     /* Reload changed class of the allocno.  */
3918     cost = 0;
3919   ira_overall_cost += cost;
3920 }
3921
3922 /* This function is called when reload deletes memory-memory move.  In
3923    this case we marks that the allocation of the corresponding
3924    allocnos should be not changed in future.  Otherwise we risk to get
3925    a wrong code.  */
3926 void
3927 ira_mark_memory_move_deletion (int dst_regno, int src_regno)
3928 {
3929   ira_allocno_t dst = ira_regno_allocno_map[dst_regno];
3930   ira_allocno_t src = ira_regno_allocno_map[src_regno];
3931
3932   ira_assert (dst != NULL && src != NULL
3933               && ALLOCNO_HARD_REGNO (dst) < 0
3934               && ALLOCNO_HARD_REGNO (src) < 0);
3935   ALLOCNO_DONT_REASSIGN_P (dst) = true;
3936   ALLOCNO_DONT_REASSIGN_P (src) = true;
3937 }
3938
3939 /* Try to assign a hard register (except for FORBIDDEN_REGS) to
3940    allocno A and return TRUE in the case of success.  */
3941 static bool
3942 allocno_reload_assign (ira_allocno_t a, HARD_REG_SET forbidden_regs)
3943 {
3944   int hard_regno;
3945   enum reg_class aclass;
3946   int regno = ALLOCNO_REGNO (a);
3947   HARD_REG_SET saved[2];
3948   int i, n;
3949
3950   n = ALLOCNO_NUM_OBJECTS (a);
3951   for (i = 0; i < n; i++)
3952     {
3953       ira_object_t obj = ALLOCNO_OBJECT (a, i);
3954       COPY_HARD_REG_SET (saved[i], OBJECT_TOTAL_CONFLICT_HARD_REGS (obj));
3955       IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj), forbidden_regs);
3956       if (! flag_caller_saves && ALLOCNO_CALLS_CROSSED_NUM (a) != 0)
3957         IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
3958                           call_used_reg_set);
3959     }
3960   ALLOCNO_ASSIGNED_P (a) = false;
3961   aclass = ALLOCNO_CLASS (a);
3962   update_curr_costs (a);
3963   assign_hard_reg (a, true);
3964   hard_regno = ALLOCNO_HARD_REGNO (a);
3965   reg_renumber[regno] = hard_regno;
3966   if (hard_regno < 0)
3967     ALLOCNO_HARD_REGNO (a) = -1;
3968   else
3969     {
3970       ira_assert (ira_class_hard_reg_index[aclass][hard_regno] >= 0);
3971       ira_overall_cost
3972         -= (ALLOCNO_MEMORY_COST (a)
3973             - (ALLOCNO_HARD_REG_COSTS (a) == NULL
3974                ? ALLOCNO_CLASS_COST (a)
3975                : ALLOCNO_HARD_REG_COSTS (a)[ira_class_hard_reg_index
3976                                             [aclass][hard_regno]]));
3977       if (ALLOCNO_CALLS_CROSSED_NUM (a) != 0
3978           && ! ira_hard_reg_not_in_set_p (hard_regno, ALLOCNO_MODE (a),
3979                                           call_used_reg_set))
3980         {
3981           ira_assert (flag_caller_saves);
3982           caller_save_needed = 1;
3983         }
3984     }
3985
3986   /* If we found a hard register, modify the RTL for the pseudo
3987      register to show the hard register, and mark the pseudo register
3988      live.  */
3989   if (reg_renumber[regno] >= 0)
3990     {
3991       if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
3992         fprintf (ira_dump_file, ": reassign to %d\n", reg_renumber[regno]);
3993       SET_REGNO (regno_reg_rtx[regno], reg_renumber[regno]);
3994       mark_home_live (regno);
3995     }
3996   else if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
3997     fprintf (ira_dump_file, "\n");
3998   for (i = 0; i < n; i++)
3999     {
4000       ira_object_t obj = ALLOCNO_OBJECT (a, i);
4001       COPY_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj), saved[i]);
4002     }
4003   return reg_renumber[regno] >= 0;
4004 }
4005
4006 /* Sort pseudos according their usage frequencies (putting most
4007    frequently ones first).  */
4008 static int
4009 pseudo_reg_compare (const void *v1p, const void *v2p)
4010 {
4011   int regno1 = *(const int *) v1p;
4012   int regno2 = *(const int *) v2p;
4013   int diff;
4014
4015   if ((diff = REG_FREQ (regno2) - REG_FREQ (regno1)) != 0)
4016     return diff;
4017   return regno1 - regno2;
4018 }
4019
4020 /* Try to allocate hard registers to SPILLED_PSEUDO_REGS (there are
4021    NUM of them) or spilled pseudos conflicting with pseudos in
4022    SPILLED_PSEUDO_REGS.  Return TRUE and update SPILLED, if the
4023    allocation has been changed.  The function doesn't use
4024    BAD_SPILL_REGS and hard registers in PSEUDO_FORBIDDEN_REGS and
4025    PSEUDO_PREVIOUS_REGS for the corresponding pseudos.  The function
4026    is called by the reload pass at the end of each reload
4027    iteration.  */
4028 bool
4029 ira_reassign_pseudos (int *spilled_pseudo_regs, int num,
4030                       HARD_REG_SET bad_spill_regs,
4031                       HARD_REG_SET *pseudo_forbidden_regs,
4032                       HARD_REG_SET *pseudo_previous_regs,
4033                       bitmap spilled)
4034 {
4035   int i, n, regno;
4036   bool changed_p;
4037   ira_allocno_t a;
4038   HARD_REG_SET forbidden_regs;
4039   bitmap temp = BITMAP_ALLOC (NULL);
4040
4041   /* Add pseudos which conflict with pseudos already in
4042      SPILLED_PSEUDO_REGS to SPILLED_PSEUDO_REGS.  This is preferable
4043      to allocating in two steps as some of the conflicts might have
4044      a higher priority than the pseudos passed in SPILLED_PSEUDO_REGS.  */
4045   for (i = 0; i < num; i++)
4046     bitmap_set_bit (temp, spilled_pseudo_regs[i]);
4047
4048   for (i = 0, n = num; i < n; i++)
4049     {
4050       int nr, j;
4051       int regno = spilled_pseudo_regs[i];
4052       bitmap_set_bit (temp, regno);
4053
4054       a = ira_regno_allocno_map[regno];
4055       nr = ALLOCNO_NUM_OBJECTS (a);
4056       for (j = 0; j < nr; j++)
4057         {
4058           ira_object_t conflict_obj;
4059           ira_object_t obj = ALLOCNO_OBJECT (a, j);
4060           ira_object_conflict_iterator oci;
4061
4062           FOR_EACH_OBJECT_CONFLICT (obj, conflict_obj, oci)
4063             {
4064               ira_allocno_t conflict_a = OBJECT_ALLOCNO (conflict_obj);
4065               if (ALLOCNO_HARD_REGNO (conflict_a) < 0
4066                   && ! ALLOCNO_DONT_REASSIGN_P (conflict_a)
4067                   && bitmap_set_bit (temp, ALLOCNO_REGNO (conflict_a)))
4068                 {
4069                   spilled_pseudo_regs[num++] = ALLOCNO_REGNO (conflict_a);
4070                   /* ?!? This seems wrong.  */
4071                   bitmap_set_bit (consideration_allocno_bitmap,
4072                                   ALLOCNO_NUM (conflict_a));
4073                 }
4074             }
4075         }
4076     }
4077
4078   if (num > 1)
4079     qsort (spilled_pseudo_regs, num, sizeof (int), pseudo_reg_compare);
4080   changed_p = false;
4081   /* Try to assign hard registers to pseudos from
4082      SPILLED_PSEUDO_REGS.  */
4083   for (i = 0; i < num; i++)
4084     {
4085       regno = spilled_pseudo_regs[i];
4086       COPY_HARD_REG_SET (forbidden_regs, bad_spill_regs);
4087       IOR_HARD_REG_SET (forbidden_regs, pseudo_forbidden_regs[regno]);
4088       IOR_HARD_REG_SET (forbidden_regs, pseudo_previous_regs[regno]);
4089       gcc_assert (reg_renumber[regno] < 0);
4090       a = ira_regno_allocno_map[regno];
4091       ira_mark_allocation_change (regno);
4092       ira_assert (reg_renumber[regno] < 0);
4093       if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
4094         fprintf (ira_dump_file,
4095                  "      Try Assign %d(a%d), cost=%d", regno, ALLOCNO_NUM (a),
4096                  ALLOCNO_MEMORY_COST (a)
4097                  - ALLOCNO_CLASS_COST (a));
4098       allocno_reload_assign (a, forbidden_regs);
4099       if (reg_renumber[regno] >= 0)
4100         {
4101           CLEAR_REGNO_REG_SET (spilled, regno);
4102           changed_p = true;
4103         }
4104     }
4105   BITMAP_FREE (temp);
4106   return changed_p;
4107 }
4108
4109 /* The function is called by reload and returns already allocated
4110    stack slot (if any) for REGNO with given INHERENT_SIZE and
4111    TOTAL_SIZE.  In the case of failure to find a slot which can be
4112    used for REGNO, the function returns NULL.  */
4113 rtx
4114 ira_reuse_stack_slot (int regno, unsigned int inherent_size,
4115                       unsigned int total_size)
4116 {
4117   unsigned int i;
4118   int slot_num, best_slot_num;
4119   int cost, best_cost;
4120   ira_copy_t cp, next_cp;
4121   ira_allocno_t another_allocno, allocno = ira_regno_allocno_map[regno];
4122   rtx x;
4123   bitmap_iterator bi;
4124   struct ira_spilled_reg_stack_slot *slot = NULL;
4125
4126   ira_assert (inherent_size == PSEUDO_REGNO_BYTES (regno)
4127               && inherent_size <= total_size
4128               && ALLOCNO_HARD_REGNO (allocno) < 0);
4129   if (! flag_ira_share_spill_slots)
4130     return NULL_RTX;
4131   slot_num = -ALLOCNO_HARD_REGNO (allocno) - 2;
4132   if (slot_num != -1)
4133     {
4134       slot = &ira_spilled_reg_stack_slots[slot_num];
4135       x = slot->mem;
4136     }
4137   else
4138     {
4139       best_cost = best_slot_num = -1;
4140       x = NULL_RTX;
4141       /* It means that the pseudo was spilled in the reload pass, try
4142          to reuse a slot.  */
4143       for (slot_num = 0;
4144            slot_num < ira_spilled_reg_stack_slots_num;
4145            slot_num++)
4146         {
4147           slot = &ira_spilled_reg_stack_slots[slot_num];
4148           if (slot->mem == NULL_RTX)
4149             continue;
4150           if (slot->width < total_size
4151               || GET_MODE_SIZE (GET_MODE (slot->mem)) < inherent_size)
4152             continue;
4153
4154           EXECUTE_IF_SET_IN_BITMAP (&slot->spilled_regs,
4155                                     FIRST_PSEUDO_REGISTER, i, bi)
4156             {
4157               another_allocno = ira_regno_allocno_map[i];
4158               if (allocnos_conflict_by_live_ranges_p (allocno,
4159                                                       another_allocno))
4160                 goto cont;
4161             }
4162           for (cost = 0, cp = ALLOCNO_COPIES (allocno);
4163                cp != NULL;
4164                cp = next_cp)
4165             {
4166               if (cp->first == allocno)
4167                 {
4168                   next_cp = cp->next_first_allocno_copy;
4169                   another_allocno = cp->second;
4170                 }
4171               else if (cp->second == allocno)
4172                 {
4173                   next_cp = cp->next_second_allocno_copy;
4174                   another_allocno = cp->first;
4175                 }
4176               else
4177                 gcc_unreachable ();
4178               if (cp->insn == NULL_RTX)
4179                 continue;
4180               if (bitmap_bit_p (&slot->spilled_regs,
4181                                 ALLOCNO_REGNO (another_allocno)))
4182                 cost += cp->freq;
4183             }
4184           if (cost > best_cost)
4185             {
4186               best_cost = cost;
4187               best_slot_num = slot_num;
4188             }
4189         cont:
4190           ;
4191         }
4192       if (best_cost >= 0)
4193         {
4194           slot_num = best_slot_num;
4195           slot = &ira_spilled_reg_stack_slots[slot_num];
4196           SET_REGNO_REG_SET (&slot->spilled_regs, regno);
4197           x = slot->mem;
4198           ALLOCNO_HARD_REGNO (allocno) = -slot_num - 2;
4199         }
4200     }
4201   if (x != NULL_RTX)
4202     {
4203       ira_assert (slot->width >= total_size);
4204 #ifdef ENABLE_IRA_CHECKING
4205       EXECUTE_IF_SET_IN_BITMAP (&slot->spilled_regs,
4206                                 FIRST_PSEUDO_REGISTER, i, bi)
4207         {
4208           ira_assert (! conflict_by_live_ranges_p (regno, i));
4209         }
4210 #endif
4211       SET_REGNO_REG_SET (&slot->spilled_regs, regno);
4212       if (internal_flag_ira_verbose > 3 && ira_dump_file)
4213         {
4214           fprintf (ira_dump_file, "      Assigning %d(freq=%d) slot %d of",
4215                    regno, REG_FREQ (regno), slot_num);
4216           EXECUTE_IF_SET_IN_BITMAP (&slot->spilled_regs,
4217                                     FIRST_PSEUDO_REGISTER, i, bi)
4218             {
4219               if ((unsigned) regno != i)
4220                 fprintf (ira_dump_file, " %d", i);
4221             }
4222           fprintf (ira_dump_file, "\n");
4223         }
4224     }
4225   return x;
4226 }
4227
4228 /* This is called by reload every time a new stack slot X with
4229    TOTAL_SIZE was allocated for REGNO.  We store this info for
4230    subsequent ira_reuse_stack_slot calls.  */
4231 void
4232 ira_mark_new_stack_slot (rtx x, int regno, unsigned int total_size)
4233 {
4234   struct ira_spilled_reg_stack_slot *slot;
4235   int slot_num;
4236   ira_allocno_t allocno;
4237
4238   ira_assert (PSEUDO_REGNO_BYTES (regno) <= total_size);
4239   allocno = ira_regno_allocno_map[regno];
4240   slot_num = -ALLOCNO_HARD_REGNO (allocno) - 2;
4241   if (slot_num == -1)
4242     {
4243       slot_num = ira_spilled_reg_stack_slots_num++;
4244       ALLOCNO_HARD_REGNO (allocno) = -slot_num - 2;
4245     }
4246   slot = &ira_spilled_reg_stack_slots[slot_num];
4247   INIT_REG_SET (&slot->spilled_regs);
4248   SET_REGNO_REG_SET (&slot->spilled_regs, regno);
4249   slot->mem = x;
4250   slot->width = total_size;
4251   if (internal_flag_ira_verbose > 3 && ira_dump_file)
4252     fprintf (ira_dump_file, "      Assigning %d(freq=%d) a new slot %d\n",
4253              regno, REG_FREQ (regno), slot_num);
4254 }
4255
4256
4257 /* Return spill cost for pseudo-registers whose numbers are in array
4258    REGNOS (with a negative number as an end marker) for reload with
4259    given IN and OUT for INSN.  Return also number points (through
4260    EXCESS_PRESSURE_LIVE_LENGTH) where the pseudo-register lives and
4261    the register pressure is high, number of references of the
4262    pseudo-registers (through NREFS), number of callee-clobbered
4263    hard-registers occupied by the pseudo-registers (through
4264    CALL_USED_COUNT), and the first hard regno occupied by the
4265    pseudo-registers (through FIRST_HARD_REGNO).  */
4266 static int
4267 calculate_spill_cost (int *regnos, rtx in, rtx out, rtx insn,
4268                       int *excess_pressure_live_length,
4269                       int *nrefs, int *call_used_count, int *first_hard_regno)
4270 {
4271   int i, cost, regno, hard_regno, j, count, saved_cost, nregs;
4272   bool in_p, out_p;
4273   int length;
4274   ira_allocno_t a;
4275
4276   *nrefs = 0;
4277   for (length = count = cost = i = 0;; i++)
4278     {
4279       regno = regnos[i];
4280       if (regno < 0)
4281         break;
4282       *nrefs += REG_N_REFS (regno);
4283       hard_regno = reg_renumber[regno];
4284       ira_assert (hard_regno >= 0);
4285       a = ira_regno_allocno_map[regno];
4286       length += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a) / ALLOCNO_NUM_OBJECTS (a);
4287       cost += ALLOCNO_MEMORY_COST (a) - ALLOCNO_CLASS_COST (a);
4288       nregs = hard_regno_nregs[hard_regno][ALLOCNO_MODE (a)];
4289       for (j = 0; j < nregs; j++)
4290         if (! TEST_HARD_REG_BIT (call_used_reg_set, hard_regno + j))
4291           break;
4292       if (j == nregs)
4293         count++;
4294       in_p = in && REG_P (in) && (int) REGNO (in) == hard_regno;
4295       out_p = out && REG_P (out) && (int) REGNO (out) == hard_regno;
4296       if ((in_p || out_p)
4297           && find_regno_note (insn, REG_DEAD, hard_regno) != NULL_RTX)
4298         {
4299           saved_cost = 0;
4300           if (in_p)
4301             saved_cost += ira_memory_move_cost
4302                           [ALLOCNO_MODE (a)][ALLOCNO_CLASS (a)][1];
4303           if (out_p)
4304             saved_cost
4305               += ira_memory_move_cost
4306                  [ALLOCNO_MODE (a)][ALLOCNO_CLASS (a)][0];
4307           cost -= REG_FREQ_FROM_BB (BLOCK_FOR_INSN (insn)) * saved_cost;
4308         }
4309     }
4310   *excess_pressure_live_length = length;
4311   *call_used_count = count;
4312   hard_regno = -1;
4313   if (regnos[0] >= 0)
4314     {
4315       hard_regno = reg_renumber[regnos[0]];
4316     }
4317   *first_hard_regno = hard_regno;
4318   return cost;
4319 }
4320
4321 /* Return TRUE if spilling pseudo-registers whose numbers are in array
4322    REGNOS is better than spilling pseudo-registers with numbers in
4323    OTHER_REGNOS for reload with given IN and OUT for INSN.  The
4324    function used by the reload pass to make better register spilling
4325    decisions.  */
4326 bool
4327 ira_better_spill_reload_regno_p (int *regnos, int *other_regnos,
4328                                  rtx in, rtx out, rtx insn)
4329 {
4330   int cost, other_cost;
4331   int length, other_length;
4332   int nrefs, other_nrefs;
4333   int call_used_count, other_call_used_count;
4334   int hard_regno, other_hard_regno;
4335
4336   cost = calculate_spill_cost (regnos, in, out, insn,
4337                                &length, &nrefs, &call_used_count, &hard_regno);
4338   other_cost = calculate_spill_cost (other_regnos, in, out, insn,
4339                                      &other_length, &other_nrefs,
4340                                      &other_call_used_count,
4341                                      &other_hard_regno);
4342   if (nrefs == 0 && other_nrefs != 0)
4343     return true;
4344   if (nrefs != 0 && other_nrefs == 0)
4345     return false;
4346   if (cost != other_cost)
4347     return cost < other_cost;
4348   if (length != other_length)
4349     return length > other_length;
4350 #ifdef REG_ALLOC_ORDER
4351   if (hard_regno >= 0 && other_hard_regno >= 0)
4352     return (inv_reg_alloc_order[hard_regno]
4353             < inv_reg_alloc_order[other_hard_regno]);
4354 #else
4355   if (call_used_count != other_call_used_count)
4356     return call_used_count > other_call_used_count;
4357 #endif
4358   return false;
4359 }
4360
4361 \f
4362
4363 /* Allocate and initialize data necessary for assign_hard_reg.  */
4364 void
4365 ira_initiate_assign (void)
4366 {
4367   sorted_allocnos
4368     = (ira_allocno_t *) ira_allocate (sizeof (ira_allocno_t)
4369                                       * ira_allocnos_num);
4370   consideration_allocno_bitmap = ira_allocate_bitmap ();
4371   initiate_cost_update ();
4372   allocno_priorities = (int *) ira_allocate (sizeof (int) * ira_allocnos_num);
4373 }
4374
4375 /* Deallocate data used by assign_hard_reg.  */
4376 void
4377 ira_finish_assign (void)
4378 {
4379   ira_free (sorted_allocnos);
4380   ira_free_bitmap (consideration_allocno_bitmap);
4381   finish_cost_update ();
4382   ira_free (allocno_priorities);
4383 }
4384
4385 \f
4386
4387 /* Entry function doing color-based register allocation.  */
4388 static void
4389 color (void)
4390 {
4391   allocno_stack_vec = VEC_alloc (ira_allocno_t, heap, ira_allocnos_num);
4392   memset (allocated_hardreg_p, 0, sizeof (allocated_hardreg_p));
4393   ira_initiate_assign ();
4394   do_coloring ();
4395   ira_finish_assign ();
4396   VEC_free (ira_allocno_t, heap, allocno_stack_vec);
4397   move_spill_restore ();
4398 }
4399
4400 \f
4401
4402 /* This page contains a simple register allocator without usage of
4403    allocno conflicts.  This is used for fast allocation for -O0.  */
4404
4405 /* Do register allocation by not using allocno conflicts.  It uses
4406    only allocno live ranges.  The algorithm is close to Chow's
4407    priority coloring.  */
4408 static void
4409 fast_allocation (void)
4410 {
4411   int i, j, k, num, class_size, hard_regno;
4412 #ifdef STACK_REGS
4413   bool no_stack_reg_p;
4414 #endif
4415   enum reg_class aclass;
4416   enum machine_mode mode;
4417   ira_allocno_t a;
4418   ira_allocno_iterator ai;
4419   live_range_t r;
4420   HARD_REG_SET conflict_hard_regs, *used_hard_regs;
4421
4422   sorted_allocnos = (ira_allocno_t *) ira_allocate (sizeof (ira_allocno_t)
4423                                                     * ira_allocnos_num);
4424   num = 0;
4425   FOR_EACH_ALLOCNO (a, ai)
4426     sorted_allocnos[num++] = a;
4427   allocno_priorities = (int *) ira_allocate (sizeof (int) * ira_allocnos_num);
4428   setup_allocno_priorities (sorted_allocnos, num);
4429   used_hard_regs = (HARD_REG_SET *) ira_allocate (sizeof (HARD_REG_SET)
4430                                                   * ira_max_point);
4431   for (i = 0; i < ira_max_point; i++)
4432     CLEAR_HARD_REG_SET (used_hard_regs[i]);
4433   qsort (sorted_allocnos, num, sizeof (ira_allocno_t),
4434          allocno_priority_compare_func);
4435   for (i = 0; i < num; i++)
4436     {
4437       int nr, l;
4438
4439       a = sorted_allocnos[i];
4440       nr = ALLOCNO_NUM_OBJECTS (a);
4441       CLEAR_HARD_REG_SET (conflict_hard_regs);
4442       for (l = 0; l < nr; l++)
4443         {
4444           ira_object_t obj = ALLOCNO_OBJECT (a, l);
4445           IOR_HARD_REG_SET (conflict_hard_regs,
4446                             OBJECT_CONFLICT_HARD_REGS (obj));
4447           for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next)
4448             for (j = r->start; j <= r->finish; j++)
4449               IOR_HARD_REG_SET (conflict_hard_regs, used_hard_regs[j]);
4450         }
4451       aclass = ALLOCNO_CLASS (a);
4452       ALLOCNO_ASSIGNED_P (a) = true;
4453       ALLOCNO_HARD_REGNO (a) = -1;
4454       if (hard_reg_set_subset_p (reg_class_contents[aclass],
4455                                  conflict_hard_regs))
4456         continue;
4457       mode = ALLOCNO_MODE (a);
4458 #ifdef STACK_REGS
4459       no_stack_reg_p = ALLOCNO_NO_STACK_REG_P (a);
4460 #endif
4461       class_size = ira_class_hard_regs_num[aclass];
4462       for (j = 0; j < class_size; j++)
4463         {
4464           hard_regno = ira_class_hard_regs[aclass][j];
4465 #ifdef STACK_REGS
4466           if (no_stack_reg_p && FIRST_STACK_REG <= hard_regno
4467               && hard_regno <= LAST_STACK_REG)
4468             continue;
4469 #endif
4470           if (!ira_hard_reg_not_in_set_p (hard_regno, mode, conflict_hard_regs)
4471               || (TEST_HARD_REG_BIT
4472                   (ira_prohibited_class_mode_regs[aclass][mode], hard_regno)))
4473             continue;
4474           ALLOCNO_HARD_REGNO (a) = hard_regno;
4475           for (l = 0; l < nr; l++)
4476             {
4477               ira_object_t obj = ALLOCNO_OBJECT (a, l);
4478               for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next)
4479                 for (k = r->start; k <= r->finish; k++)
4480                   IOR_HARD_REG_SET (used_hard_regs[k],
4481                                     ira_reg_mode_hard_regset[hard_regno][mode]);
4482             }
4483           break;
4484         }
4485     }
4486   ira_free (sorted_allocnos);
4487   ira_free (used_hard_regs);
4488   ira_free (allocno_priorities);
4489   if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
4490     ira_print_disposition (ira_dump_file);
4491 }
4492
4493 \f
4494
4495 /* Entry function doing coloring.  */
4496 void
4497 ira_color (void)
4498 {
4499   ira_allocno_t a;
4500   ira_allocno_iterator ai;
4501
4502   /* Setup updated costs.  */
4503   FOR_EACH_ALLOCNO (a, ai)
4504     {
4505       ALLOCNO_UPDATED_MEMORY_COST (a) = ALLOCNO_MEMORY_COST (a);
4506       ALLOCNO_UPDATED_CLASS_COST (a) = ALLOCNO_CLASS_COST (a);
4507     }
4508   if (ira_conflicts_p)
4509     color ();
4510   else
4511     fast_allocation ();
4512 }