OSDN Git Service

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