OSDN Git Service

2008-11-07 Vladimir Makarov <vmakarov@redhat.com>
[pf3gnuchains/gcc-fork.git] / gcc / ira-color.c
1 /* IRA allocation based on graph coloring.
2    Copyright (C) 2006, 2007, 2008
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 "toplev.h"
37 #include "reload.h"
38 #include "params.h"
39 #include "df.h"
40 #include "splay-tree.h"
41 #include "ira-int.h"
42
43 /* This file contains code for regional graph coloring, spill/restore
44    code placement optimization, and code helping the reload pass to do
45    a better job.  */
46
47 /* Bitmap of allocnos which should be colored.  */
48 static bitmap coloring_allocno_bitmap;
49
50 /* Bitmap of allocnos which should be taken into account during
51    coloring.  In general case it contains allocnos from
52    coloring_allocno_bitmap plus other already colored conflicting
53    allocnos.  */
54 static bitmap consideration_allocno_bitmap;
55
56 /* TRUE if we coalesced some allocnos.  In other words, if we got
57    loops formed by members first_coalesced_allocno and
58    next_coalesced_allocno containing more one allocno.  */
59 static bool allocno_coalesced_p;
60
61 /* Bitmap used to prevent a repeated allocno processing because of
62    coalescing.  */
63 static bitmap processed_coalesced_allocno_bitmap;
64
65 /* All allocnos sorted according their priorities.  */
66 static ira_allocno_t *sorted_allocnos;
67
68 /* Vec representing the stack of allocnos used during coloring.  */
69 static VEC(ira_allocno_t,heap) *allocno_stack_vec;
70
71 /* Array used to choose an allocno for spilling.  */
72 static ira_allocno_t *allocnos_for_spilling;
73
74 /* Pool for splay tree nodes.  */
75 static alloc_pool splay_tree_node_pool;
76
77 /* When an allocno is removed from the splay tree, it is put in the
78    following vector for subsequent inserting it into the splay tree
79    after putting all colorable allocnos onto the stack.  The allocno
80    could be removed from and inserted to the splay tree every time
81    when its spilling priority is changed but such solution would be
82    more costly although simpler.  */
83 static VEC(ira_allocno_t,heap) *removed_splay_allocno_vec;
84
85 \f
86
87 /* This page contains functions used to choose hard registers for
88    allocnos.  */
89
90 /* Array whose element value is TRUE if the corresponding hard
91    register was already allocated for an allocno.  */
92 static bool allocated_hardreg_p[FIRST_PSEUDO_REGISTER];
93
94 /* Describes one element in a queue of allocnos whose costs need to be
95    updated.  Each allocno in the queue is known to have a cover class.  */
96 struct update_cost_queue_elem
97 {
98   /* This element is in the queue iff CHECK == update_cost_check.  */
99   int check;
100
101   /* COST_HOP_DIVISOR**N, where N is the length of the shortest path
102      connecting this allocno to the one being allocated.  */
103   int divisor;
104
105   /* The next allocno in the queue, or null if this is the last element.  */
106   ira_allocno_t next;
107 };
108
109 /* The first element in a queue of allocnos whose copy costs need to be
110    updated.  Null if the queue is empty.  */
111 static ira_allocno_t update_cost_queue;
112
113 /* The last element in the queue described by update_cost_queue.
114    Not valid if update_cost_queue is null.  */
115 static struct update_cost_queue_elem *update_cost_queue_tail;
116
117 /* A pool of elements in the queue described by update_cost_queue.
118    Elements are indexed by ALLOCNO_NUM.  */
119 static struct update_cost_queue_elem *update_cost_queue_elems;
120
121 /* The current value of update_copy_cost call count.  */
122 static int update_cost_check;
123
124 /* Allocate and initialize data necessary for function
125    update_copy_costs.  */
126 static void
127 initiate_cost_update (void)
128 {
129   size_t size;
130
131   size = ira_allocnos_num * sizeof (struct update_cost_queue_elem);
132   update_cost_queue_elems
133     = (struct update_cost_queue_elem *) ira_allocate (size);
134   memset (update_cost_queue_elems, 0, size);
135   update_cost_check = 0;
136 }
137
138 /* Deallocate data used by function update_copy_costs.  */
139 static void
140 finish_cost_update (void)
141 {
142   ira_free (update_cost_queue_elems);
143 }
144
145 /* When we traverse allocnos to update hard register costs, the cost
146    divisor will be multiplied by the following macro value for each
147    hop from given allocno to directly connected allocnos.  */
148 #define COST_HOP_DIVISOR 4
149
150 /* Start a new cost-updating pass.  */
151 static void
152 start_update_cost (void)
153 {
154   update_cost_check++;
155   update_cost_queue = NULL;
156 }
157
158 /* Add (ALLOCNO, DIVISOR) to the end of update_cost_queue,
159    unless ALLOCNO is already in the queue, or has no cover class.  */
160 static inline void
161 queue_update_cost (ira_allocno_t allocno, int divisor)
162 {
163   struct update_cost_queue_elem *elem;
164
165   elem = &update_cost_queue_elems[ALLOCNO_NUM (allocno)];
166   if (elem->check != update_cost_check
167       && ALLOCNO_COVER_CLASS (allocno) != NO_REGS)
168     {
169       elem->check = update_cost_check;
170       elem->divisor = divisor;
171       elem->next = NULL;
172       if (update_cost_queue == NULL)
173         update_cost_queue = allocno;
174       else
175         update_cost_queue_tail->next = allocno;
176       update_cost_queue_tail = elem;
177     }
178 }
179
180 /* Try to remove the first element from update_cost_queue.  Return false
181    if the queue was empty, otherwise make (*ALLOCNO, *DIVISOR) describe
182    the removed element.  */
183 static inline bool
184 get_next_update_cost (ira_allocno_t *allocno, int *divisor)
185 {
186   struct update_cost_queue_elem *elem;
187
188   if (update_cost_queue == NULL)
189     return false;
190
191   *allocno = update_cost_queue;
192   elem = &update_cost_queue_elems[ALLOCNO_NUM (*allocno)];
193   *divisor = elem->divisor;
194   update_cost_queue = elem->next;
195   return true;
196 }
197
198 /* Update the cost of allocnos to increase chances to remove some
199    copies as the result of subsequent assignment.  */
200 static void
201 update_copy_costs (ira_allocno_t allocno, bool decr_p)
202 {
203   int i, cost, update_cost, hard_regno, divisor;
204   enum machine_mode mode;
205   enum reg_class rclass, cover_class;
206   ira_allocno_t another_allocno;
207   ira_copy_t cp, next_cp;
208
209   hard_regno = ALLOCNO_HARD_REGNO (allocno);
210   ira_assert (hard_regno >= 0);
211
212   cover_class = ALLOCNO_COVER_CLASS (allocno);
213   if (cover_class == NO_REGS)
214     return;
215   i = ira_class_hard_reg_index[cover_class][hard_regno];
216   ira_assert (i >= 0);
217   rclass = REGNO_REG_CLASS (hard_regno);
218
219   start_update_cost ();
220   divisor = 1;
221   do
222     {
223       mode = ALLOCNO_MODE (allocno);
224       for (cp = ALLOCNO_COPIES (allocno); cp != NULL; cp = next_cp)
225         {
226           if (cp->first == allocno)
227             {
228               next_cp = cp->next_first_allocno_copy;
229               another_allocno = cp->second;
230             }
231           else if (cp->second == allocno)
232             {
233               next_cp = cp->next_second_allocno_copy;
234               another_allocno = cp->first;
235             }
236           else
237             gcc_unreachable ();
238
239           if (cover_class != ALLOCNO_COVER_CLASS (another_allocno)
240               || ALLOCNO_ASSIGNED_P (another_allocno))
241             continue;
242
243           cost = (cp->second == allocno
244                   ? ira_register_move_cost[mode][rclass][cover_class]
245                   : ira_register_move_cost[mode][cover_class][rclass]);
246           if (decr_p)
247             cost = -cost;
248
249           update_cost = cp->freq * cost / divisor;
250           if (update_cost == 0)
251             continue;
252
253           ira_allocate_and_set_or_copy_costs
254             (&ALLOCNO_UPDATED_HARD_REG_COSTS (another_allocno), cover_class,
255              ALLOCNO_UPDATED_COVER_CLASS_COST (another_allocno),
256              ALLOCNO_HARD_REG_COSTS (another_allocno));
257           ira_allocate_and_set_or_copy_costs
258             (&ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (another_allocno),
259              cover_class, 0,
260              ALLOCNO_CONFLICT_HARD_REG_COSTS (another_allocno));
261           ALLOCNO_UPDATED_HARD_REG_COSTS (another_allocno)[i] += update_cost;
262           ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (another_allocno)[i]
263             += update_cost;
264
265           queue_update_cost (another_allocno, divisor * COST_HOP_DIVISOR);
266         }
267     }
268   while (get_next_update_cost (&allocno, &divisor));
269 }
270
271 /* This function updates COSTS (decrease if DECR_P) by conflict costs
272    of the unassigned allocnos connected by copies with allocnos in
273    update_cost_queue.  This update increases chances to remove some
274    copies.  */
275 static void
276 update_conflict_hard_regno_costs (int *costs, bool decr_p)
277 {
278   int i, cost, class_size, freq, mult, div, divisor;
279   int *conflict_costs;
280   bool cont_p;
281   enum reg_class cover_class;
282   ira_allocno_t allocno, another_allocno;
283   ira_copy_t cp, next_cp;
284
285   while (get_next_update_cost (&allocno, &divisor))
286     for (cp = ALLOCNO_COPIES (allocno); cp != NULL; cp = next_cp)
287       {
288         if (cp->first == allocno)
289           {
290             next_cp = cp->next_first_allocno_copy;
291             another_allocno = cp->second;
292           }
293         else if (cp->second == allocno)
294           {
295             next_cp = cp->next_second_allocno_copy;
296             another_allocno = cp->first;
297           }
298         else
299           gcc_unreachable ();
300         cover_class = ALLOCNO_COVER_CLASS (allocno);
301         if (cover_class != ALLOCNO_COVER_CLASS (another_allocno)
302             || ALLOCNO_ASSIGNED_P (another_allocno)
303             || ALLOCNO_MAY_BE_SPILLED_P (ALLOCNO_FIRST_COALESCED_ALLOCNO
304                                          (another_allocno)))
305           continue;
306         class_size = ira_class_hard_regs_num[cover_class];
307         ira_allocate_and_copy_costs
308           (&ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (another_allocno),
309            cover_class, ALLOCNO_CONFLICT_HARD_REG_COSTS (another_allocno));
310         conflict_costs
311           = ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (another_allocno);
312         if (conflict_costs == NULL)
313           cont_p = true;
314         else
315           {
316             mult = cp->freq;
317             freq = ALLOCNO_FREQ (another_allocno);
318             if (freq == 0)
319               freq = 1;
320             div = freq * divisor;
321             cont_p = false;
322             for (i = class_size - 1; i >= 0; i--)
323               {
324                 cost = conflict_costs [i] * mult / div;
325                 if (cost == 0)
326                   continue;
327                 cont_p = true;
328                 if (decr_p)
329                   cost = -cost;
330                 costs[i] += cost;
331               }
332           }
333         /* Probably 5 hops will be enough.  */
334         if (cont_p
335             && divisor <= (COST_HOP_DIVISOR
336                            * COST_HOP_DIVISOR
337                            * COST_HOP_DIVISOR
338                            * COST_HOP_DIVISOR))
339           queue_update_cost (another_allocno, divisor * COST_HOP_DIVISOR);
340       }
341 }
342
343 /* Sort allocnos according to the profit of usage of a hard register
344    instead of memory for them. */
345 static int
346 allocno_cost_compare_func (const void *v1p, const void *v2p)
347 {
348   ira_allocno_t p1 = *(const ira_allocno_t *) v1p;
349   ira_allocno_t p2 = *(const ira_allocno_t *) v2p;
350   int c1, c2;
351
352   c1 = ALLOCNO_UPDATED_MEMORY_COST (p1) - ALLOCNO_UPDATED_COVER_CLASS_COST (p1);
353   c2 = ALLOCNO_UPDATED_MEMORY_COST (p2) - ALLOCNO_UPDATED_COVER_CLASS_COST (p2);
354   if (c1 - c2)
355     return c1 - c2;
356
357   /* If regs are equally good, sort by allocno numbers, so that the
358      results of qsort leave nothing to chance.  */
359   return ALLOCNO_NUM (p1) - ALLOCNO_NUM (p2);
360 }
361
362 /* Print all allocnos coalesced with ALLOCNO.  */
363 static void
364 print_coalesced_allocno (ira_allocno_t allocno)
365 {
366   ira_allocno_t a;
367
368   for (a = ALLOCNO_NEXT_COALESCED_ALLOCNO (allocno);;
369        a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
370     {
371       ira_print_expanded_allocno (a);
372       if (a == allocno)
373         break;
374       fprintf (ira_dump_file, "+");
375     }
376 }
377
378 /* Choose a hard register for ALLOCNO (or for all coalesced allocnos
379    represented by ALLOCNO).  If RETRY_P is TRUE, it means that the
380    function called from function `ira_reassign_conflict_allocnos' and
381    `allocno_reload_assign'.  This function implements the optimistic
382    coalescing too: if we failed to assign a hard register to set of
383    the coalesced allocnos, we put them onto the coloring stack for
384    subsequent separate assigning.  */
385 static bool
386 assign_hard_reg (ira_allocno_t allocno, bool retry_p)
387 {
388   HARD_REG_SET conflicting_regs;
389   int i, j, hard_regno, best_hard_regno, class_size;
390   int cost, mem_cost, min_cost, full_cost, min_full_cost, add_cost;
391   int *a_costs;
392   int *conflict_costs;
393   enum reg_class cover_class, rclass;
394   enum machine_mode mode;
395   ira_allocno_t a, conflict_allocno;
396   ira_allocno_conflict_iterator aci;
397   static int costs[FIRST_PSEUDO_REGISTER], full_costs[FIRST_PSEUDO_REGISTER];
398 #ifdef STACK_REGS
399   bool no_stack_reg_p;
400 #endif
401
402   ira_assert (! ALLOCNO_ASSIGNED_P (allocno));
403   cover_class = ALLOCNO_COVER_CLASS (allocno);
404   class_size = ira_class_hard_regs_num[cover_class];
405   mode = ALLOCNO_MODE (allocno);
406   CLEAR_HARD_REG_SET (conflicting_regs);
407   best_hard_regno = -1;
408   memset (full_costs, 0, sizeof (int) * class_size);
409   mem_cost = 0;
410   if (allocno_coalesced_p)
411     bitmap_clear (processed_coalesced_allocno_bitmap);
412   memset (costs, 0, sizeof (int) * class_size);
413   memset (full_costs, 0, sizeof (int) * class_size);
414 #ifdef STACK_REGS
415   no_stack_reg_p = false;
416 #endif
417   start_update_cost ();
418   for (a = ALLOCNO_NEXT_COALESCED_ALLOCNO (allocno);;
419        a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
420     {
421       mem_cost += ALLOCNO_UPDATED_MEMORY_COST (a);
422       IOR_HARD_REG_SET (conflicting_regs,
423                         ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a));
424       ira_allocate_and_copy_costs (&ALLOCNO_UPDATED_HARD_REG_COSTS (a),
425                                    cover_class, ALLOCNO_HARD_REG_COSTS (a));
426       a_costs = ALLOCNO_UPDATED_HARD_REG_COSTS (a);
427 #ifdef STACK_REGS
428       no_stack_reg_p = no_stack_reg_p || ALLOCNO_TOTAL_NO_STACK_REG_P (a);
429 #endif
430       for (cost = ALLOCNO_UPDATED_COVER_CLASS_COST (a), i = 0;
431            i < class_size;
432            i++)
433         if (a_costs != NULL)
434           {
435             costs[i] += a_costs[i];
436             full_costs[i] += a_costs[i];
437           }
438         else
439           {
440             costs[i] += cost;
441             full_costs[i] += cost;
442           }
443       /* Take preferences of conflicting allocnos into account.  */
444       FOR_EACH_ALLOCNO_CONFLICT (a, conflict_allocno, aci)
445         /* Reload can give another class so we need to check all
446            allocnos.  */
447         if (retry_p || bitmap_bit_p (consideration_allocno_bitmap,
448                                      ALLOCNO_NUM (conflict_allocno)))
449           {
450             ira_assert (cover_class == ALLOCNO_COVER_CLASS (conflict_allocno));
451             if (allocno_coalesced_p)
452               {
453                 if (bitmap_bit_p (processed_coalesced_allocno_bitmap,
454                                   ALLOCNO_NUM (conflict_allocno)))
455                   continue;
456                 bitmap_set_bit (processed_coalesced_allocno_bitmap,
457                                 ALLOCNO_NUM (conflict_allocno));
458               }
459             if (ALLOCNO_ASSIGNED_P (conflict_allocno))
460               {
461                 if ((hard_regno = ALLOCNO_HARD_REGNO (conflict_allocno)) >= 0)
462                   {
463                     IOR_HARD_REG_SET
464                       (conflicting_regs,
465                        ira_reg_mode_hard_regset
466                        [hard_regno][ALLOCNO_MODE (conflict_allocno)]);
467                     if (hard_reg_set_subset_p (reg_class_contents[cover_class],
468                                                conflicting_regs))
469                       goto fail;
470                   }
471                 continue;
472               }
473             else if (! ALLOCNO_MAY_BE_SPILLED_P (ALLOCNO_FIRST_COALESCED_ALLOCNO
474                                                  (conflict_allocno)))
475               {
476                 ira_allocate_and_copy_costs
477                   (&ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (conflict_allocno),
478                    cover_class,
479                    ALLOCNO_CONFLICT_HARD_REG_COSTS (conflict_allocno));
480                 conflict_costs
481                   = ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (conflict_allocno);
482                 if (conflict_costs != NULL)
483                   for (j = class_size - 1; j >= 0; j--)
484                     full_costs[j] -= conflict_costs[j];
485                 queue_update_cost (conflict_allocno, COST_HOP_DIVISOR);
486               }
487           }
488       if (a == allocno)
489         break;
490     }
491   /* Take into account preferences of allocnos connected by copies to
492      the conflict allocnos.  */
493   update_conflict_hard_regno_costs (full_costs, true);
494
495   /* Take preferences of allocnos connected by copies into
496      account.  */
497   start_update_cost ();
498   for (a = ALLOCNO_NEXT_COALESCED_ALLOCNO (allocno);;
499        a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
500     {
501       queue_update_cost (a, COST_HOP_DIVISOR);
502       if (a == allocno)
503         break;
504     }
505   update_conflict_hard_regno_costs (full_costs, false);
506   min_cost = min_full_cost = INT_MAX;
507   /* We don't care about giving callee saved registers to allocnos no
508      living through calls because call clobbered registers are
509      allocated first (it is usual practice to put them first in
510      REG_ALLOC_ORDER).  */
511   for (i = 0; i < class_size; i++)
512     {
513       hard_regno = ira_class_hard_regs[cover_class][i];
514 #ifdef STACK_REGS
515       if (no_stack_reg_p
516           && FIRST_STACK_REG <= hard_regno && hard_regno <= LAST_STACK_REG)
517         continue;
518 #endif
519       if (! ira_hard_reg_not_in_set_p (hard_regno, mode, conflicting_regs)
520           || TEST_HARD_REG_BIT (prohibited_class_mode_regs[cover_class][mode],
521                                 hard_regno))
522         continue;
523       cost = costs[i];
524       full_cost = full_costs[i];
525       if (! allocated_hardreg_p[hard_regno]
526           && ira_hard_reg_not_in_set_p (hard_regno, mode, call_used_reg_set))
527         /* We need to save/restore the hard register in
528            epilogue/prologue.  Therefore we increase the cost.  */
529         {
530           /* ??? If only part is call clobbered.  */
531           rclass = REGNO_REG_CLASS (hard_regno);
532           add_cost = (ira_memory_move_cost[mode][rclass][0]
533                       + ira_memory_move_cost[mode][rclass][1] - 1);
534           cost += add_cost;
535           full_cost += add_cost;
536         }
537       if (min_cost > cost)
538         min_cost = cost;
539       if (min_full_cost > full_cost)
540         {
541           min_full_cost = full_cost;
542           best_hard_regno = hard_regno;
543           ira_assert (hard_regno >= 0);
544         }
545     }
546   if (min_full_cost > mem_cost)
547     {
548       if (! retry_p && internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
549         fprintf (ira_dump_file, "(memory is more profitable %d vs %d) ",
550                  mem_cost, min_full_cost);
551       best_hard_regno = -1;
552     }
553  fail:
554   if (best_hard_regno < 0
555       && ALLOCNO_NEXT_COALESCED_ALLOCNO (allocno) != allocno)
556     {
557       for (j = 0, a = ALLOCNO_NEXT_COALESCED_ALLOCNO (allocno);;
558            a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
559         {
560           ira_assert (! ALLOCNO_IN_GRAPH_P (a));
561           sorted_allocnos[j++] = a;
562           if (a == allocno)
563             break;
564         }
565       qsort (sorted_allocnos, j, sizeof (ira_allocno_t), 
566              allocno_cost_compare_func);
567       for (i = 0; i < j; i++)
568         {
569           a = sorted_allocnos[i];
570           ALLOCNO_FIRST_COALESCED_ALLOCNO (a) = a;
571           ALLOCNO_NEXT_COALESCED_ALLOCNO (a) = a;
572           VEC_safe_push (ira_allocno_t, heap, allocno_stack_vec, a);
573           if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
574             {
575               fprintf (ira_dump_file, "        Pushing");
576               print_coalesced_allocno (a);
577               fprintf (ira_dump_file, "\n");
578             }
579         }
580       return false;
581     }
582   if (best_hard_regno >= 0)
583     allocated_hardreg_p[best_hard_regno] = true;
584   for (a = ALLOCNO_NEXT_COALESCED_ALLOCNO (allocno);;
585        a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
586     {
587       ALLOCNO_HARD_REGNO (a) = best_hard_regno;
588       ALLOCNO_ASSIGNED_P (a) = true;
589       if (best_hard_regno >= 0)
590         update_copy_costs (a, true);
591       ira_assert (ALLOCNO_COVER_CLASS (a) == cover_class);
592       /* We don't need updated costs anymore: */
593       ira_free_allocno_updated_costs (a);
594       if (a == allocno)
595         break;
596     }
597   return best_hard_regno >= 0;
598 }
599
600 \f
601
602 /* This page contains the allocator based on the Chaitin-Briggs algorithm.  */
603
604 /* Bucket of allocnos that can colored currently without spilling.  */
605 static ira_allocno_t colorable_allocno_bucket;
606
607 /* Bucket of allocnos that might be not colored currently without
608    spilling.  */
609 static ira_allocno_t uncolorable_allocno_bucket;
610
611 /* Each element of the array contains the current number of allocnos
612    of given *cover* class in the uncolorable_bucket.  */
613 static int uncolorable_allocnos_num[N_REG_CLASSES];
614
615 /* Add ALLOCNO to bucket *BUCKET_PTR.  ALLOCNO should be not in a bucket
616    before the call.  */
617 static void
618 add_allocno_to_bucket (ira_allocno_t allocno, ira_allocno_t *bucket_ptr)
619 {
620   ira_allocno_t first_allocno;
621   enum reg_class cover_class;
622
623   if (bucket_ptr == &uncolorable_allocno_bucket
624       && (cover_class = ALLOCNO_COVER_CLASS (allocno)) != NO_REGS)
625     {
626       uncolorable_allocnos_num[cover_class]++;
627       ira_assert (uncolorable_allocnos_num[cover_class] > 0);
628     }
629   first_allocno = *bucket_ptr;
630   ALLOCNO_NEXT_BUCKET_ALLOCNO (allocno) = first_allocno;
631   ALLOCNO_PREV_BUCKET_ALLOCNO (allocno) = NULL;
632   if (first_allocno != NULL)
633     ALLOCNO_PREV_BUCKET_ALLOCNO (first_allocno) = allocno;
634   *bucket_ptr = allocno;
635 }
636
637 /* The function returns frequency and number of available hard
638    registers for allocnos coalesced with ALLOCNO.  */
639 static void
640 get_coalesced_allocnos_attributes (ira_allocno_t allocno, int *freq, int *num)
641 {
642   ira_allocno_t a;
643
644   *freq = 0;
645   *num = 0;
646   for (a = ALLOCNO_NEXT_COALESCED_ALLOCNO (allocno);;
647        a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
648     {
649       *freq += ALLOCNO_FREQ (a);
650       *num += ALLOCNO_AVAILABLE_REGS_NUM (a);
651       if (a == allocno)
652         break;
653     }
654 }
655
656 /* Compare two allocnos to define which allocno should be pushed first
657    into the coloring stack.  If the return is a negative number, the
658    allocno given by the first parameter will be pushed first.  In this
659    case such allocno has less priority than the second one and the
660    hard register will be assigned to it after assignment to the second
661    one.  As the result of such assignment order, the second allocno
662    has a better chance to get the best hard register.  */
663 static int
664 bucket_allocno_compare_func (const void *v1p, const void *v2p)
665 {
666   ira_allocno_t a1 = *(const ira_allocno_t *) v1p;
667   ira_allocno_t a2 = *(const ira_allocno_t *) v2p;
668   int diff, a1_freq, a2_freq, a1_num, a2_num;
669
670   if ((diff = (int) ALLOCNO_COVER_CLASS (a2) - ALLOCNO_COVER_CLASS (a1)) != 0)
671     return diff;
672   get_coalesced_allocnos_attributes (a1, &a1_freq, &a1_num);
673   get_coalesced_allocnos_attributes (a2, &a2_freq, &a2_num);
674   if ((diff = a2_num - a1_num) != 0)
675     return diff;
676   else if ((diff = a1_freq - a2_freq) != 0)
677     return diff;
678   return ALLOCNO_NUM (a2) - ALLOCNO_NUM (a1);
679 }
680
681 /* Sort bucket *BUCKET_PTR and return the result through
682    BUCKET_PTR.  */
683 static void
684 sort_bucket (ira_allocno_t *bucket_ptr)
685 {
686   ira_allocno_t a, head;
687   int n;
688
689   for (n = 0, a = *bucket_ptr; a != NULL; a = ALLOCNO_NEXT_BUCKET_ALLOCNO (a))
690     sorted_allocnos[n++] = a;
691   if (n <= 1)
692     return;
693   qsort (sorted_allocnos, n, sizeof (ira_allocno_t),
694          bucket_allocno_compare_func);
695   head = NULL;
696   for (n--; n >= 0; n--)
697     {
698       a = sorted_allocnos[n];
699       ALLOCNO_NEXT_BUCKET_ALLOCNO (a) = head;
700       ALLOCNO_PREV_BUCKET_ALLOCNO (a) = NULL;
701       if (head != NULL)
702         ALLOCNO_PREV_BUCKET_ALLOCNO (head) = a;
703       head = a;
704     }
705   *bucket_ptr = head;
706 }
707
708 /* Add ALLOCNO to bucket *BUCKET_PTR maintaining the order according
709    their priority.  ALLOCNO should be not in a bucket before the
710    call.  */
711 static void
712 add_allocno_to_ordered_bucket (ira_allocno_t allocno,
713                                ira_allocno_t *bucket_ptr)
714 {
715   ira_allocno_t before, after;
716   enum reg_class cover_class;
717
718   if (bucket_ptr == &uncolorable_allocno_bucket
719       && (cover_class = ALLOCNO_COVER_CLASS (allocno)) != NO_REGS)
720     {
721       uncolorable_allocnos_num[cover_class]++;
722       ira_assert (uncolorable_allocnos_num[cover_class] > 0);
723     }
724   for (before = *bucket_ptr, after = NULL;
725        before != NULL;
726        after = before, before = ALLOCNO_NEXT_BUCKET_ALLOCNO (before))
727     if (bucket_allocno_compare_func (&allocno, &before) < 0)
728       break;
729   ALLOCNO_NEXT_BUCKET_ALLOCNO (allocno) = before;
730   ALLOCNO_PREV_BUCKET_ALLOCNO (allocno) = after;
731   if (after == NULL)
732     *bucket_ptr = allocno;
733   else
734     ALLOCNO_NEXT_BUCKET_ALLOCNO (after) = allocno;
735   if (before != NULL)
736     ALLOCNO_PREV_BUCKET_ALLOCNO (before) = allocno;
737 }
738
739 /* Delete ALLOCNO from bucket *BUCKET_PTR.  It should be there before
740    the call.  */
741 static void
742 delete_allocno_from_bucket (ira_allocno_t allocno, ira_allocno_t *bucket_ptr)
743 {
744   ira_allocno_t prev_allocno, next_allocno;
745   enum reg_class cover_class;
746
747   if (bucket_ptr == &uncolorable_allocno_bucket
748       && (cover_class = ALLOCNO_COVER_CLASS (allocno)) != NO_REGS)
749     {
750       uncolorable_allocnos_num[cover_class]--;
751       ira_assert (uncolorable_allocnos_num[cover_class] >= 0);
752     }
753   prev_allocno = ALLOCNO_PREV_BUCKET_ALLOCNO (allocno);
754   next_allocno = ALLOCNO_NEXT_BUCKET_ALLOCNO (allocno);
755   if (prev_allocno != NULL)
756     ALLOCNO_NEXT_BUCKET_ALLOCNO (prev_allocno) = next_allocno;
757   else
758     {
759       ira_assert (*bucket_ptr == allocno);
760       *bucket_ptr = next_allocno;
761     }
762   if (next_allocno != NULL)
763     ALLOCNO_PREV_BUCKET_ALLOCNO (next_allocno) = prev_allocno;
764 }
765
766 /* Splay tree for each cover class.  The trees are indexed by the
767    corresponding cover classes.  Splay trees contain uncolorable
768    allocnos.  */
769 static splay_tree uncolorable_allocnos_splay_tree[N_REG_CLASSES];
770
771 /* If the following macro is TRUE, splay tree is used to choose an
772    allocno of the corresponding cover class for spilling.  When the
773    number uncolorable allocnos of given cover class decreases to some
774    threshold, linear array search is used to find the best allocno for
775    spilling.  This threshold is actually pretty big because, although
776    splay trees asymptotically is much faster, each splay tree
777    operation is sufficiently costly especially taking cache locality
778    into account.  */
779 #define USE_SPLAY_P(CLASS) (uncolorable_allocnos_num[CLASS] > 4000)
780
781 /* Put ALLOCNO onto the coloring stack without removing it from its
782    bucket.  Pushing allocno to the coloring stack can result in moving
783    conflicting allocnos from the uncolorable bucket to the colorable
784    one.  */
785 static void
786 push_allocno_to_stack (ira_allocno_t allocno)
787 {
788   int conflicts_num, conflict_size, size;
789   ira_allocno_t a, conflict_allocno;
790   enum reg_class cover_class;
791   ira_allocno_conflict_iterator aci;
792   
793   ALLOCNO_IN_GRAPH_P (allocno) = false;
794   VEC_safe_push (ira_allocno_t, heap, allocno_stack_vec, allocno);
795   cover_class = ALLOCNO_COVER_CLASS (allocno);
796   if (cover_class == NO_REGS)
797     return;
798   size = ira_reg_class_nregs[cover_class][ALLOCNO_MODE (allocno)];
799   if (allocno_coalesced_p)
800     bitmap_clear (processed_coalesced_allocno_bitmap);
801   for (a = ALLOCNO_NEXT_COALESCED_ALLOCNO (allocno);;
802        a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
803     {
804       FOR_EACH_ALLOCNO_CONFLICT (a, conflict_allocno, aci)
805         {
806           conflict_allocno = ALLOCNO_FIRST_COALESCED_ALLOCNO (conflict_allocno);
807           if (bitmap_bit_p (coloring_allocno_bitmap,
808                             ALLOCNO_NUM (conflict_allocno)))
809             {
810               ira_assert (cover_class
811                           == ALLOCNO_COVER_CLASS (conflict_allocno));
812               if (allocno_coalesced_p)
813                 {
814                   if (bitmap_bit_p (processed_coalesced_allocno_bitmap,
815                                     ALLOCNO_NUM (conflict_allocno)))
816                     continue;
817                   bitmap_set_bit (processed_coalesced_allocno_bitmap,
818                                   ALLOCNO_NUM (conflict_allocno));
819                 }
820               if (ALLOCNO_IN_GRAPH_P (conflict_allocno)
821                   && ! ALLOCNO_ASSIGNED_P (conflict_allocno))
822                 {
823                   conflicts_num = ALLOCNO_LEFT_CONFLICTS_NUM (conflict_allocno);
824                   conflict_size
825                     = (ira_reg_class_nregs
826                        [cover_class][ALLOCNO_MODE (conflict_allocno)]);
827                   ira_assert
828                     (ALLOCNO_LEFT_CONFLICTS_NUM (conflict_allocno) >= size);
829                   if (conflicts_num + conflict_size
830                       <= ALLOCNO_AVAILABLE_REGS_NUM (conflict_allocno))
831                     {
832                       ALLOCNO_LEFT_CONFLICTS_NUM (conflict_allocno) -= size;
833                       continue;
834                     }
835                   conflicts_num
836                     = ALLOCNO_LEFT_CONFLICTS_NUM (conflict_allocno) - size;
837                   if (uncolorable_allocnos_splay_tree[cover_class] != NULL
838                       && !ALLOCNO_SPLAY_REMOVED_P (conflict_allocno)
839                       && USE_SPLAY_P (cover_class))
840                     {
841                       ira_assert
842                       (splay_tree_lookup
843                        (uncolorable_allocnos_splay_tree[cover_class],
844                         (splay_tree_key) conflict_allocno) != NULL);
845                       splay_tree_remove
846                         (uncolorable_allocnos_splay_tree[cover_class],
847                          (splay_tree_key) conflict_allocno);
848                       ALLOCNO_SPLAY_REMOVED_P (conflict_allocno) = true;
849                       VEC_safe_push (ira_allocno_t, heap,
850                                      removed_splay_allocno_vec,
851                                      conflict_allocno);
852                     }
853                   ALLOCNO_LEFT_CONFLICTS_NUM (conflict_allocno) = conflicts_num;
854                   if (conflicts_num + conflict_size
855                       <= ALLOCNO_AVAILABLE_REGS_NUM (conflict_allocno))
856                     {
857                       delete_allocno_from_bucket
858                         (conflict_allocno, &uncolorable_allocno_bucket);
859                       add_allocno_to_ordered_bucket
860                         (conflict_allocno, &colorable_allocno_bucket);
861                     }
862                 }
863             }
864         }
865       if (a == allocno)
866         break;
867     }
868 }
869
870 /* Put ALLOCNO onto the coloring stack and remove it from its bucket.
871    The allocno is in the colorable bucket if COLORABLE_P is TRUE.  */
872 static void
873 remove_allocno_from_bucket_and_push (ira_allocno_t allocno, bool colorable_p)
874 {
875   enum reg_class cover_class;
876
877   if (colorable_p)
878     delete_allocno_from_bucket (allocno, &colorable_allocno_bucket);
879   else
880     delete_allocno_from_bucket (allocno, &uncolorable_allocno_bucket);
881   if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
882     {
883       fprintf (ira_dump_file, "      Pushing");
884       print_coalesced_allocno (allocno);
885       fprintf (ira_dump_file, "%s\n", colorable_p ? "" : "(potential spill)");
886     }
887   cover_class = ALLOCNO_COVER_CLASS (allocno);
888   ira_assert ((colorable_p
889                && (ALLOCNO_LEFT_CONFLICTS_NUM (allocno)
890                    + ira_reg_class_nregs[cover_class][ALLOCNO_MODE (allocno)]
891                    <= ALLOCNO_AVAILABLE_REGS_NUM (allocno)))
892               || (! colorable_p
893                   && (ALLOCNO_LEFT_CONFLICTS_NUM (allocno)
894                       + ira_reg_class_nregs[cover_class][ALLOCNO_MODE
895                                                          (allocno)]
896                       > ALLOCNO_AVAILABLE_REGS_NUM (allocno))));
897   if (! colorable_p)
898     ALLOCNO_MAY_BE_SPILLED_P (allocno) = true;
899   push_allocno_to_stack (allocno);
900 }
901
902 /* Put all allocnos from colorable bucket onto the coloring stack.  */
903 static void
904 push_only_colorable (void)
905 {
906   sort_bucket (&colorable_allocno_bucket);
907   for (;colorable_allocno_bucket != NULL;)
908     remove_allocno_from_bucket_and_push (colorable_allocno_bucket, true);
909 }
910
911 /* Puts ALLOCNO chosen for potential spilling onto the coloring
912    stack.  */
913 static void
914 push_allocno_to_spill (ira_allocno_t allocno)
915 {
916   delete_allocno_from_bucket (allocno, &uncolorable_allocno_bucket);
917   ALLOCNO_MAY_BE_SPILLED_P (allocno) = true;
918   if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
919     fprintf (ira_dump_file, "      Pushing p%d(%d) (potential spill)\n",
920              ALLOCNO_NUM (allocno), ALLOCNO_REGNO (allocno));
921   push_allocno_to_stack (allocno);
922 }
923
924 /* Return the frequency of exit edges (if EXIT_P) or entry from/to the
925    loop given by its LOOP_NODE.  */ 
926 int
927 ira_loop_edge_freq (ira_loop_tree_node_t loop_node, int regno, bool exit_p)
928 {
929   int freq, i;
930   edge_iterator ei;
931   edge e;
932   VEC (edge, heap) *edges;
933
934   ira_assert (loop_node->loop != NULL
935               && (regno < 0 || regno >= FIRST_PSEUDO_REGISTER));
936   freq = 0;
937   if (! exit_p)
938     {
939       FOR_EACH_EDGE (e, ei, loop_node->loop->header->preds)
940         if (e->src != loop_node->loop->latch
941             && (regno < 0
942                 || (bitmap_bit_p (DF_LR_OUT (e->src), regno)
943                     && bitmap_bit_p (DF_LR_IN (e->dest), regno))))
944           freq += EDGE_FREQUENCY (e);
945     }
946   else
947     {
948       edges = get_loop_exit_edges (loop_node->loop);
949       for (i = 0; VEC_iterate (edge, edges, i, e); i++)
950         if (regno < 0
951             || (bitmap_bit_p (DF_LR_OUT (e->src), regno)
952                 && bitmap_bit_p (DF_LR_IN (e->dest), regno)))
953           freq += EDGE_FREQUENCY (e);
954       VEC_free (edge, heap, edges);
955     }
956
957   return REG_FREQ_FROM_EDGE_FREQ (freq);
958 }
959
960 /* Calculate and return the cost of putting allocno A into memory.  */
961 static int
962 calculate_allocno_spill_cost (ira_allocno_t a)
963 {
964   int regno, cost;
965   enum machine_mode mode;
966   enum reg_class rclass;
967   ira_allocno_t parent_allocno;
968   ira_loop_tree_node_t parent_node, loop_node;
969
970   regno = ALLOCNO_REGNO (a);
971   cost = ALLOCNO_UPDATED_MEMORY_COST (a) - ALLOCNO_UPDATED_COVER_CLASS_COST (a);
972   if (ALLOCNO_CAP (a) != NULL)
973     return cost;
974   loop_node = ALLOCNO_LOOP_TREE_NODE (a);
975   if ((parent_node = loop_node->parent) == NULL)
976     return cost;
977   if ((parent_allocno = parent_node->regno_allocno_map[regno]) == NULL)
978     return cost;
979   mode = ALLOCNO_MODE (a);
980   rclass = ALLOCNO_COVER_CLASS (a);
981   if (ALLOCNO_HARD_REGNO (parent_allocno) < 0)
982     cost -= (ira_memory_move_cost[mode][rclass][0]
983              * ira_loop_edge_freq (loop_node, regno, true)
984              + ira_memory_move_cost[mode][rclass][1]
985              * ira_loop_edge_freq (loop_node, regno, false));
986   else
987     cost += ((ira_memory_move_cost[mode][rclass][1]
988               * ira_loop_edge_freq (loop_node, regno, true)
989               + ira_memory_move_cost[mode][rclass][0]
990               * ira_loop_edge_freq (loop_node, regno, false))
991              - (ira_register_move_cost[mode][rclass][rclass]
992                 * (ira_loop_edge_freq (loop_node, regno, false)
993                    + ira_loop_edge_freq (loop_node, regno, true))));
994   return cost;
995 }
996
997 /* Compare keys in the splay tree used to choose best allocno for
998    spilling.  The best allocno has the minimal key.  */
999 static int
1000 allocno_spill_priority_compare (splay_tree_key k1, splay_tree_key k2)
1001 {
1002   int pri1, pri2, diff;
1003   ira_allocno_t a1 = (ira_allocno_t) k1, a2 = (ira_allocno_t) k2;
1004   
1005   pri1 = (ALLOCNO_TEMP (a1)
1006           / (ALLOCNO_LEFT_CONFLICTS_NUM (a1)
1007              * ira_reg_class_nregs[ALLOCNO_COVER_CLASS (a1)][ALLOCNO_MODE (a1)]
1008              + 1));
1009   pri2 = (ALLOCNO_TEMP (a2)
1010           / (ALLOCNO_LEFT_CONFLICTS_NUM (a2)
1011              * ira_reg_class_nregs[ALLOCNO_COVER_CLASS (a2)][ALLOCNO_MODE (a2)]
1012              + 1));
1013   if ((diff = pri1 - pri2) != 0)
1014     return diff;
1015   if ((diff = ALLOCNO_TEMP (a1) - ALLOCNO_TEMP (a2)) != 0)
1016     return diff;
1017   return ALLOCNO_NUM (a1) - ALLOCNO_NUM (a2);
1018 }
1019
1020 /* Allocate data of SIZE for the splay trees.  We allocate only spay
1021    tree roots or splay tree nodes.  If you change this, please rewrite
1022    the function.  */
1023 static void *
1024 splay_tree_allocate (int size, void *data ATTRIBUTE_UNUSED)
1025 {
1026   if (size != sizeof (struct splay_tree_node_s))
1027     return ira_allocate (size);
1028   return pool_alloc (splay_tree_node_pool);
1029 }
1030
1031 /* Free data NODE for the splay trees.  We allocate and free only spay
1032    tree roots or splay tree nodes.  If you change this, please rewrite
1033    the function.  */
1034 static void
1035 splay_tree_free (void *node, void *data ATTRIBUTE_UNUSED)
1036 {
1037   int i;
1038   enum reg_class cover_class;
1039
1040   for (i = 0; i < ira_reg_class_cover_size; i++)
1041     {
1042       cover_class = ira_reg_class_cover[i];
1043       if (node == uncolorable_allocnos_splay_tree[cover_class])
1044         {
1045           ira_free (node);
1046           return;
1047         }
1048     }
1049   pool_free (splay_tree_node_pool, node);
1050 }
1051
1052 /* Push allocnos to the coloring stack.  The order of allocnos in the
1053    stack defines the order for the subsequent coloring.  */
1054 static void
1055 push_allocnos_to_stack (void)
1056 {
1057   ira_allocno_t allocno, a, i_allocno, *allocno_vec;
1058   enum reg_class cover_class, rclass;
1059   int allocno_pri, i_allocno_pri, allocno_cost, i_allocno_cost;
1060   int i, j, num, cover_class_allocnos_num[N_REG_CLASSES];
1061   ira_allocno_t *cover_class_allocnos[N_REG_CLASSES];
1062   int cost;
1063
1064   /* Initialize.  */
1065   VEC_truncate(ira_allocno_t, removed_splay_allocno_vec, 0);
1066   for (i = 0; i < ira_reg_class_cover_size; i++)
1067     {
1068       cover_class = ira_reg_class_cover[i];
1069       cover_class_allocnos_num[cover_class] = 0;
1070       cover_class_allocnos[cover_class] = NULL;
1071       uncolorable_allocnos_splay_tree[cover_class] = NULL;
1072     }
1073   /* Calculate uncolorable allocno spill costs.  */
1074   for (allocno = uncolorable_allocno_bucket;
1075        allocno != NULL;
1076        allocno = ALLOCNO_NEXT_BUCKET_ALLOCNO (allocno))
1077     if ((cover_class = ALLOCNO_COVER_CLASS (allocno)) != NO_REGS)
1078       {
1079         cover_class_allocnos_num[cover_class]++;
1080         cost = 0;
1081         for (a = ALLOCNO_NEXT_COALESCED_ALLOCNO (allocno);;
1082              a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
1083           {
1084             cost += calculate_allocno_spill_cost (a);
1085             if (a == allocno)
1086               break;
1087           }
1088         /* ??? Remove cost of copies between the coalesced
1089            allocnos.  */
1090         ALLOCNO_TEMP (allocno) = cost;
1091       }
1092   /* Define place where to put uncolorable allocnos of the same cover
1093      class.  */
1094   for (num = i = 0; i < ira_reg_class_cover_size; i++)
1095     {
1096       cover_class = ira_reg_class_cover[i];
1097       ira_assert (cover_class_allocnos_num[cover_class]
1098                   == uncolorable_allocnos_num[cover_class]);
1099       if (cover_class_allocnos_num[cover_class] != 0)
1100         {
1101           cover_class_allocnos[cover_class] = allocnos_for_spilling + num;
1102           num += cover_class_allocnos_num[cover_class];
1103           cover_class_allocnos_num[cover_class] = 0;
1104         }
1105       if (USE_SPLAY_P (cover_class))
1106         uncolorable_allocnos_splay_tree[cover_class]
1107           = splay_tree_new_with_allocator (allocno_spill_priority_compare,
1108                                            NULL, NULL, splay_tree_allocate,
1109                                            splay_tree_free, NULL);
1110     }
1111   ira_assert (num <= ira_allocnos_num);
1112   /* Collect uncolorable allocnos of each cover class.  */
1113   for (allocno = uncolorable_allocno_bucket;
1114        allocno != NULL;
1115        allocno = ALLOCNO_NEXT_BUCKET_ALLOCNO (allocno))
1116     if ((cover_class = ALLOCNO_COVER_CLASS (allocno)) != NO_REGS)
1117       {
1118         cover_class_allocnos
1119           [cover_class][cover_class_allocnos_num[cover_class]++] = allocno;
1120         if (uncolorable_allocnos_splay_tree[cover_class] != NULL)
1121           splay_tree_insert (uncolorable_allocnos_splay_tree[cover_class],
1122                              (splay_tree_key) allocno,
1123                              (splay_tree_value) allocno);
1124       }
1125   for (;;)
1126     {
1127       push_only_colorable ();
1128       allocno = uncolorable_allocno_bucket;
1129       if (allocno == NULL)
1130         break;
1131       cover_class = ALLOCNO_COVER_CLASS (allocno);
1132       if (cover_class == NO_REGS)
1133         {
1134           push_allocno_to_spill (allocno);
1135           continue;
1136         }
1137       /* Potential spilling.  */
1138       ira_assert
1139         (ira_reg_class_nregs[cover_class][ALLOCNO_MODE (allocno)] > 0);
1140       if (USE_SPLAY_P (cover_class))
1141         {
1142           for (;VEC_length (ira_allocno_t, removed_splay_allocno_vec) != 0;)
1143             {
1144               allocno = VEC_pop (ira_allocno_t, removed_splay_allocno_vec);
1145               ALLOCNO_SPLAY_REMOVED_P (allocno) = false;
1146               rclass = ALLOCNO_COVER_CLASS (allocno);
1147               if (ALLOCNO_LEFT_CONFLICTS_NUM (allocno)
1148                   + ira_reg_class_nregs [rclass][ALLOCNO_MODE (allocno)]
1149                   > ALLOCNO_AVAILABLE_REGS_NUM (allocno))
1150                 splay_tree_insert
1151                   (uncolorable_allocnos_splay_tree[rclass],
1152                    (splay_tree_key) allocno, (splay_tree_value) allocno);
1153             }
1154           allocno = ((ira_allocno_t)
1155                      splay_tree_min
1156                      (uncolorable_allocnos_splay_tree[cover_class])->key);
1157           splay_tree_remove (uncolorable_allocnos_splay_tree[cover_class],
1158                              (splay_tree_key) allocno);
1159         }
1160       else
1161         {
1162           num = cover_class_allocnos_num[cover_class];
1163           ira_assert (num > 0);
1164           allocno_vec = cover_class_allocnos[cover_class];
1165           allocno = NULL;
1166           allocno_pri = allocno_cost = 0;
1167           /* Sort uncolorable allocno to find the one with the lowest
1168              spill cost.  */
1169           for (i = 0, j = num - 1; i <= j;)
1170             {
1171               i_allocno = allocno_vec[i];
1172               if (! ALLOCNO_IN_GRAPH_P (i_allocno)
1173                   && ALLOCNO_IN_GRAPH_P (allocno_vec[j]))
1174                 {
1175                   i_allocno = allocno_vec[j];
1176                   allocno_vec[j] = allocno_vec[i];
1177                   allocno_vec[i] = i_allocno;
1178                 }
1179               if (ALLOCNO_IN_GRAPH_P (i_allocno))
1180                 {
1181                   i++;
1182                   ira_assert (ALLOCNO_TEMP (i_allocno) != INT_MAX);
1183                   i_allocno_cost = ALLOCNO_TEMP (i_allocno);
1184                   i_allocno_pri
1185                     = (i_allocno_cost
1186                        / (ALLOCNO_LEFT_CONFLICTS_NUM (i_allocno)
1187                           * ira_reg_class_nregs[ALLOCNO_COVER_CLASS
1188                                                 (i_allocno)]
1189                           [ALLOCNO_MODE (i_allocno)] + 1));
1190                   if (allocno == NULL || allocno_pri > i_allocno_pri
1191                       || (allocno_pri == i_allocno_pri
1192                           && (allocno_cost > i_allocno_cost
1193                               || (allocno_cost == i_allocno_cost 
1194                                   && (ALLOCNO_NUM (allocno)
1195                                       > ALLOCNO_NUM (i_allocno))))))
1196                     {
1197                       allocno = i_allocno;
1198                       allocno_cost = i_allocno_cost;
1199                       allocno_pri = i_allocno_pri;
1200                     }
1201                 }
1202               if (! ALLOCNO_IN_GRAPH_P (allocno_vec[j]))
1203                 j--;
1204             }
1205           ira_assert (allocno != NULL && j >= 0);
1206           cover_class_allocnos_num[cover_class] = j + 1;
1207         }
1208       ira_assert (ALLOCNO_IN_GRAPH_P (allocno)
1209                   && ALLOCNO_COVER_CLASS (allocno) == cover_class
1210                   && (ALLOCNO_LEFT_CONFLICTS_NUM (allocno)
1211                       + ira_reg_class_nregs[cover_class][ALLOCNO_MODE
1212                                                          (allocno)]
1213                       > ALLOCNO_AVAILABLE_REGS_NUM (allocno)));
1214       remove_allocno_from_bucket_and_push (allocno, false);
1215     }
1216   ira_assert (colorable_allocno_bucket == NULL
1217               && uncolorable_allocno_bucket == NULL);
1218   for (i = 0; i < ira_reg_class_cover_size; i++)
1219     {
1220       cover_class = ira_reg_class_cover[i];
1221       ira_assert (uncolorable_allocnos_num[cover_class] == 0);
1222       if (uncolorable_allocnos_splay_tree[cover_class] != NULL)
1223         splay_tree_delete (uncolorable_allocnos_splay_tree[cover_class]);
1224     }
1225 }
1226
1227 /* Pop the coloring stack and assign hard registers to the popped
1228    allocnos.  */
1229 static void
1230 pop_allocnos_from_stack (void)
1231 {
1232   ira_allocno_t allocno;
1233   enum reg_class cover_class;
1234
1235   for (;VEC_length (ira_allocno_t, allocno_stack_vec) != 0;)
1236     {
1237       allocno = VEC_pop (ira_allocno_t, allocno_stack_vec);
1238       cover_class = ALLOCNO_COVER_CLASS (allocno);
1239       if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
1240         {
1241           fprintf (ira_dump_file, "      Popping");
1242           print_coalesced_allocno (allocno);
1243           fprintf (ira_dump_file, "  -- ");
1244         }
1245       if (cover_class == NO_REGS)
1246         {
1247           ALLOCNO_HARD_REGNO (allocno) = -1;
1248           ALLOCNO_ASSIGNED_P (allocno) = true;
1249           ira_assert (ALLOCNO_UPDATED_HARD_REG_COSTS (allocno) == NULL);
1250           ira_assert
1251             (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (allocno) == NULL);
1252           if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
1253             fprintf (ira_dump_file, "assign memory\n");
1254         }
1255       else if (assign_hard_reg (allocno, false))
1256         {
1257           if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
1258             fprintf (ira_dump_file, "assign reg %d\n",
1259                      ALLOCNO_HARD_REGNO (allocno));
1260         }
1261       else if (ALLOCNO_ASSIGNED_P (allocno))
1262         {
1263           if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
1264             fprintf (ira_dump_file, "spill\n");
1265         }
1266       ALLOCNO_IN_GRAPH_P (allocno) = true;
1267     }
1268 }
1269
1270 /* Set up number of available hard registers for ALLOCNO.  */
1271 static void
1272 setup_allocno_available_regs_num (ira_allocno_t allocno)
1273 {
1274   int i, n, hard_regs_num;
1275   enum reg_class cover_class;
1276   ira_allocno_t a;
1277   HARD_REG_SET temp_set;
1278
1279   cover_class = ALLOCNO_COVER_CLASS (allocno);
1280   ALLOCNO_AVAILABLE_REGS_NUM (allocno) = ira_available_class_regs[cover_class];
1281   if (cover_class == NO_REGS)
1282     return;
1283   CLEAR_HARD_REG_SET (temp_set);
1284   ira_assert (ALLOCNO_FIRST_COALESCED_ALLOCNO (allocno) == allocno);
1285   hard_regs_num = ira_class_hard_regs_num[cover_class];
1286   for (a = ALLOCNO_NEXT_COALESCED_ALLOCNO (allocno);;
1287        a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
1288     {
1289       IOR_HARD_REG_SET (temp_set, ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a));
1290       if (a == allocno)
1291         break;
1292     }
1293   for (n = 0, i = hard_regs_num - 1; i >= 0; i--)
1294     if (TEST_HARD_REG_BIT (temp_set, ira_class_hard_regs[cover_class][i]))
1295       n++;
1296   if (internal_flag_ira_verbose > 2 && n > 0 && ira_dump_file != NULL)
1297     fprintf (ira_dump_file, "    Reg %d of %s has %d regs less\n",
1298              ALLOCNO_REGNO (allocno), reg_class_names[cover_class], n);
1299   ALLOCNO_AVAILABLE_REGS_NUM (allocno) -= n;
1300 }
1301
1302 /* Set up ALLOCNO_LEFT_CONFLICTS_NUM for ALLOCNO.  */
1303 static void
1304 setup_allocno_left_conflicts_num (ira_allocno_t allocno)
1305 {
1306   int i, hard_regs_num, hard_regno, conflict_allocnos_size;
1307   ira_allocno_t a, conflict_allocno;
1308   enum reg_class cover_class;
1309   HARD_REG_SET temp_set;
1310   ira_allocno_conflict_iterator aci;
1311
1312   cover_class = ALLOCNO_COVER_CLASS (allocno);
1313   hard_regs_num = ira_class_hard_regs_num[cover_class];
1314   CLEAR_HARD_REG_SET (temp_set);
1315   ira_assert (ALLOCNO_FIRST_COALESCED_ALLOCNO (allocno) == allocno);
1316   for (a = ALLOCNO_NEXT_COALESCED_ALLOCNO (allocno);;
1317        a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
1318     {
1319       IOR_HARD_REG_SET (temp_set, ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a));
1320       if (a == allocno)
1321         break;
1322     }
1323   AND_HARD_REG_SET (temp_set, reg_class_contents[cover_class]);
1324   AND_COMPL_HARD_REG_SET (temp_set, ira_no_alloc_regs);
1325   conflict_allocnos_size = 0;
1326   if (! hard_reg_set_empty_p (temp_set))
1327     for (i = 0; i < (int) hard_regs_num; i++)
1328       {
1329         hard_regno = ira_class_hard_regs[cover_class][i];
1330         if (TEST_HARD_REG_BIT (temp_set, hard_regno))
1331           {
1332             conflict_allocnos_size++;
1333             CLEAR_HARD_REG_BIT (temp_set, hard_regno);
1334             if (hard_reg_set_empty_p (temp_set))
1335               break;
1336           }
1337       }
1338   CLEAR_HARD_REG_SET (temp_set);
1339   if (allocno_coalesced_p)
1340     bitmap_clear (processed_coalesced_allocno_bitmap);
1341   if (cover_class != NO_REGS)
1342     for (a = ALLOCNO_NEXT_COALESCED_ALLOCNO (allocno);;
1343          a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
1344       {
1345         FOR_EACH_ALLOCNO_CONFLICT (a, conflict_allocno, aci)
1346           {
1347             conflict_allocno
1348               = ALLOCNO_FIRST_COALESCED_ALLOCNO (conflict_allocno);
1349             if (bitmap_bit_p (consideration_allocno_bitmap,
1350                               ALLOCNO_NUM (conflict_allocno)))
1351               {
1352                 ira_assert (cover_class
1353                             == ALLOCNO_COVER_CLASS (conflict_allocno));
1354                 if (allocno_coalesced_p)
1355                   {
1356                     if (bitmap_bit_p (processed_coalesced_allocno_bitmap,
1357                                       ALLOCNO_NUM (conflict_allocno)))
1358                       continue;
1359                     bitmap_set_bit (processed_coalesced_allocno_bitmap,
1360                                     ALLOCNO_NUM (conflict_allocno));
1361                   }
1362                 if (! ALLOCNO_ASSIGNED_P (conflict_allocno))
1363                   conflict_allocnos_size
1364                     += (ira_reg_class_nregs
1365                         [cover_class][ALLOCNO_MODE (conflict_allocno)]);
1366                 else if ((hard_regno = ALLOCNO_HARD_REGNO (conflict_allocno))
1367                          >= 0)
1368                   {
1369                     int last = (hard_regno
1370                                 + hard_regno_nregs
1371                                 [hard_regno][ALLOCNO_MODE (conflict_allocno)]);
1372                     
1373                     while (hard_regno < last)
1374                       {
1375                         if (! TEST_HARD_REG_BIT (temp_set, hard_regno))
1376                           {
1377                             conflict_allocnos_size++;
1378                             SET_HARD_REG_BIT (temp_set, hard_regno);
1379                           }
1380                         hard_regno++;
1381                       }
1382                   }
1383               }
1384           }
1385         if (a == allocno)
1386           break;
1387       }
1388   ALLOCNO_LEFT_CONFLICTS_NUM (allocno) = conflict_allocnos_size;
1389 }
1390
1391 /* Put ALLOCNO in a bucket corresponding to its number and size of its
1392    conflicting allocnos and hard registers.  */
1393 static void
1394 put_allocno_into_bucket (ira_allocno_t allocno)
1395 {
1396   int hard_regs_num;
1397   enum reg_class cover_class;
1398
1399   cover_class = ALLOCNO_COVER_CLASS (allocno);
1400   hard_regs_num = ira_class_hard_regs_num[cover_class];
1401   if (ALLOCNO_FIRST_COALESCED_ALLOCNO (allocno) != allocno)
1402     return;
1403   ALLOCNO_IN_GRAPH_P (allocno) = true;
1404   setup_allocno_left_conflicts_num (allocno);
1405   setup_allocno_available_regs_num (allocno);
1406   if (ALLOCNO_LEFT_CONFLICTS_NUM (allocno)
1407       + ira_reg_class_nregs[cover_class][ALLOCNO_MODE (allocno)]
1408       <= ALLOCNO_AVAILABLE_REGS_NUM (allocno))
1409     add_allocno_to_bucket (allocno, &colorable_allocno_bucket);
1410   else
1411     add_allocno_to_bucket (allocno, &uncolorable_allocno_bucket);
1412 }
1413
1414 /* The function is used to sort allocnos according to their execution
1415    frequencies.  */
1416 static int
1417 copy_freq_compare_func (const void *v1p, const void *v2p)
1418 {
1419   ira_copy_t cp1 = *(const ira_copy_t *) v1p, cp2 = *(const ira_copy_t *) v2p;
1420   int pri1, pri2;
1421
1422   pri1 = cp1->freq;
1423   pri2 = cp2->freq;
1424   if (pri2 - pri1)
1425     return pri2 - pri1;
1426
1427   /* If freqencies are equal, sort by copies, so that the results of
1428      qsort leave nothing to chance.  */
1429   return cp1->num - cp2->num;
1430 }
1431
1432 /* Merge two sets of coalesced allocnos given correspondingly by
1433    allocnos A1 and A2 (more accurately merging A2 set into A1
1434    set).  */
1435 static void
1436 merge_allocnos (ira_allocno_t a1, ira_allocno_t a2)
1437 {
1438   ira_allocno_t a, first, last, next;
1439
1440   first = ALLOCNO_FIRST_COALESCED_ALLOCNO (a1);
1441   if (first == ALLOCNO_FIRST_COALESCED_ALLOCNO (a2))
1442     return;
1443   for (last = a2, a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a2);;
1444        a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
1445     {
1446       ALLOCNO_FIRST_COALESCED_ALLOCNO (a) = first;
1447       if (a == a2)
1448         break;
1449       last = a;
1450     }
1451   next = ALLOCNO_NEXT_COALESCED_ALLOCNO (first);
1452   ALLOCNO_NEXT_COALESCED_ALLOCNO (first) = a2;
1453   ALLOCNO_NEXT_COALESCED_ALLOCNO (last) = next;
1454 }
1455
1456 /* Return TRUE if there are conflicting allocnos from two sets of
1457    coalesced allocnos given correspondingly by allocnos A1 and A2.  If
1458    RELOAD_P is TRUE, we use live ranges to find conflicts because
1459    conflicts are represented only for allocnos of the same cover class
1460    and during the reload pass we coalesce allocnos for sharing stack
1461    memory slots.  */
1462 static bool
1463 coalesced_allocno_conflict_p (ira_allocno_t a1, ira_allocno_t a2,
1464                               bool reload_p)
1465 {
1466   ira_allocno_t a, conflict_allocno;
1467   ira_allocno_conflict_iterator aci;
1468
1469   if (allocno_coalesced_p)
1470     {
1471       bitmap_clear (processed_coalesced_allocno_bitmap);
1472       for (a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a1);;
1473            a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
1474         {
1475           bitmap_set_bit (processed_coalesced_allocno_bitmap, ALLOCNO_NUM (a));
1476           if (a == a1)
1477             break;
1478         }
1479     }
1480   for (a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a2);;
1481        a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
1482     {
1483       if (reload_p)
1484         {
1485           for (conflict_allocno = ALLOCNO_NEXT_COALESCED_ALLOCNO (a1);;
1486                conflict_allocno
1487                  = ALLOCNO_NEXT_COALESCED_ALLOCNO (conflict_allocno))
1488             {
1489               if (ira_allocno_live_ranges_intersect_p (a, conflict_allocno))
1490                 return true;
1491               if (conflict_allocno == a1)
1492                 break;
1493             }
1494         }
1495       else
1496         {
1497           FOR_EACH_ALLOCNO_CONFLICT (a, conflict_allocno, aci)
1498             if (conflict_allocno == a1
1499                 || (allocno_coalesced_p
1500                     && bitmap_bit_p (processed_coalesced_allocno_bitmap,
1501                                      ALLOCNO_NUM (conflict_allocno))))
1502               return true;
1503         }
1504       if (a == a2)
1505         break;
1506     }
1507   return false;
1508 }
1509
1510 /* The major function for aggressive allocno coalescing.  For the
1511    reload pass (RELOAD_P) we coalesce only spilled allocnos.  If some
1512    allocnos have been coalesced, we set up flag
1513    allocno_coalesced_p.  */
1514 static void
1515 coalesce_allocnos (bool reload_p)
1516 {
1517   ira_allocno_t a;
1518   ira_copy_t cp, next_cp, *sorted_copies;
1519   enum reg_class cover_class;
1520   enum machine_mode mode;
1521   unsigned int j;
1522   int i, n, cp_num, regno;
1523   bitmap_iterator bi;
1524
1525   sorted_copies = (ira_copy_t *) ira_allocate (ira_copies_num
1526                                                * sizeof (ira_copy_t));
1527   cp_num = 0;
1528   /* Collect copies.  */
1529   EXECUTE_IF_SET_IN_BITMAP (coloring_allocno_bitmap, 0, j, bi)
1530     {
1531       a = ira_allocnos[j];
1532       regno = ALLOCNO_REGNO (a);
1533       if ((! reload_p && ALLOCNO_ASSIGNED_P (a))
1534           || (reload_p
1535               && (! ALLOCNO_ASSIGNED_P (a) || ALLOCNO_HARD_REGNO (a) >= 0
1536                   || (regno < ira_reg_equiv_len
1537                       && (ira_reg_equiv_const[regno] != NULL_RTX
1538                           || ira_reg_equiv_invariant_p[regno])))))
1539         continue;
1540       cover_class = ALLOCNO_COVER_CLASS (a);
1541       mode = ALLOCNO_MODE (a);
1542       for (cp = ALLOCNO_COPIES (a); cp != NULL; cp = next_cp)
1543         {
1544           if (cp->first == a)
1545             {
1546               next_cp = cp->next_first_allocno_copy;
1547               regno = ALLOCNO_REGNO (cp->second);
1548               if ((reload_p
1549                    || (ALLOCNO_COVER_CLASS (cp->second) == cover_class
1550                        && ALLOCNO_MODE (cp->second) == mode))
1551                   && (cp->insn != NULL || cp->constraint_p)
1552                   && ((! reload_p && ! ALLOCNO_ASSIGNED_P (cp->second))
1553                       || (reload_p
1554                           && ALLOCNO_ASSIGNED_P (cp->second)
1555                           && ALLOCNO_HARD_REGNO (cp->second) < 0
1556                           && (regno >= ira_reg_equiv_len
1557                               || (! ira_reg_equiv_invariant_p[regno]
1558                                   && ira_reg_equiv_const[regno] == NULL_RTX)))))
1559                 sorted_copies[cp_num++] = cp;
1560             }
1561           else if (cp->second == a)
1562             next_cp = cp->next_second_allocno_copy;
1563           else
1564             gcc_unreachable ();
1565         }
1566     }
1567   qsort (sorted_copies, cp_num, sizeof (ira_copy_t), copy_freq_compare_func);
1568   /* Coalesced copies, most frequently executed first.  */
1569   for (; cp_num != 0;)
1570     {
1571       for (i = 0; i < cp_num; i++)
1572         {
1573           cp = sorted_copies[i];
1574           if (! coalesced_allocno_conflict_p (cp->first, cp->second, reload_p))
1575             {
1576               allocno_coalesced_p = true;
1577               if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
1578                 fprintf
1579                   (ira_dump_file,
1580                    "      Coalescing copy %d:a%dr%d-a%dr%d (freq=%d)\n",
1581                    cp->num, ALLOCNO_NUM (cp->first), ALLOCNO_REGNO (cp->first),
1582                    ALLOCNO_NUM (cp->second), ALLOCNO_REGNO (cp->second),
1583                    cp->freq);
1584               merge_allocnos (cp->first, cp->second);
1585               i++;
1586               break;
1587             }
1588         }
1589       /* Collect the rest of copies.  */
1590       for (n = 0; i < cp_num; i++)
1591         {
1592           cp = sorted_copies[i];
1593           if (ALLOCNO_FIRST_COALESCED_ALLOCNO (cp->first)
1594               != ALLOCNO_FIRST_COALESCED_ALLOCNO (cp->second))
1595             sorted_copies[n++] = cp;
1596         }
1597       cp_num = n;
1598     }
1599   ira_free (sorted_copies);
1600 }
1601
1602 /* Chaitin-Briggs coloring for allocnos in COLORING_ALLOCNO_BITMAP
1603    taking into account allocnos in CONSIDERATION_ALLOCNO_BITMAP.  */
1604 static void
1605 color_allocnos (void)
1606 {
1607   unsigned int i;
1608   bitmap_iterator bi;
1609   ira_allocno_t a;
1610
1611   allocno_coalesced_p = false;
1612   processed_coalesced_allocno_bitmap = ira_allocate_bitmap ();
1613   if (flag_ira_coalesce)
1614     coalesce_allocnos (false);
1615   /* Put the allocnos into the corresponding buckets.  */
1616   colorable_allocno_bucket = NULL;
1617   uncolorable_allocno_bucket = NULL;
1618   EXECUTE_IF_SET_IN_BITMAP (coloring_allocno_bitmap, 0, i, bi)
1619     {
1620       a = ira_allocnos[i];
1621       if (ALLOCNO_COVER_CLASS (a) == NO_REGS)
1622         {
1623           ALLOCNO_HARD_REGNO (a) = -1;
1624           ALLOCNO_ASSIGNED_P (a) = true;
1625           ira_assert (ALLOCNO_UPDATED_HARD_REG_COSTS (a) == NULL);
1626           ira_assert (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) == NULL);
1627           if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
1628             {
1629               fprintf (ira_dump_file, "      Spill");
1630               print_coalesced_allocno (a);
1631               fprintf (ira_dump_file, "\n");
1632             }
1633           continue;
1634         }
1635       put_allocno_into_bucket (a);
1636     }
1637   push_allocnos_to_stack ();
1638   pop_allocnos_from_stack ();
1639   if (flag_ira_coalesce)
1640     /* We don't need coalesced allocnos for ira_reassign_pseudos.  */
1641     EXECUTE_IF_SET_IN_BITMAP (coloring_allocno_bitmap, 0, i, bi)
1642       {
1643         a = ira_allocnos[i];
1644         ALLOCNO_FIRST_COALESCED_ALLOCNO (a) = a;
1645         ALLOCNO_NEXT_COALESCED_ALLOCNO (a) = a;
1646       }
1647   ira_free_bitmap (processed_coalesced_allocno_bitmap);
1648   allocno_coalesced_p = false;
1649 }
1650
1651 \f
1652
1653 /* Output information about the loop given by its LOOP_TREE_NODE. */
1654 static void
1655 print_loop_title (ira_loop_tree_node_t loop_tree_node)
1656 {
1657   unsigned int j;
1658   bitmap_iterator bi;
1659
1660   ira_assert (loop_tree_node->loop != NULL);
1661   fprintf (ira_dump_file,
1662            "\n  Loop %d (parent %d, header bb%d, depth %d)\n    all:",
1663            loop_tree_node->loop->num,
1664            (loop_tree_node->parent == NULL
1665             ? -1 : loop_tree_node->parent->loop->num),
1666            loop_tree_node->loop->header->index,
1667            loop_depth (loop_tree_node->loop));
1668   EXECUTE_IF_SET_IN_BITMAP (loop_tree_node->all_allocnos, 0, j, bi)
1669     fprintf (ira_dump_file, " %dr%d", j, ALLOCNO_REGNO (ira_allocnos[j]));
1670   fprintf (ira_dump_file, "\n    modified regnos:");
1671   EXECUTE_IF_SET_IN_BITMAP (loop_tree_node->modified_regnos, 0, j, bi)
1672     fprintf (ira_dump_file, " %d", j);
1673   fprintf (ira_dump_file, "\n    border:");
1674   EXECUTE_IF_SET_IN_BITMAP (loop_tree_node->border_allocnos, 0, j, bi)
1675     fprintf (ira_dump_file, " %dr%d", j, ALLOCNO_REGNO (ira_allocnos[j]));
1676   fprintf (ira_dump_file, "\n    Pressure:");
1677   for (j = 0; (int) j < ira_reg_class_cover_size; j++)
1678     {
1679       enum reg_class cover_class;
1680       
1681       cover_class = ira_reg_class_cover[j];
1682       if (loop_tree_node->reg_pressure[cover_class] == 0)
1683         continue;
1684       fprintf (ira_dump_file, " %s=%d", reg_class_names[cover_class],
1685                loop_tree_node->reg_pressure[cover_class]);
1686     }
1687   fprintf (ira_dump_file, "\n");
1688 }
1689
1690 /* Color the allocnos inside loop (in the extreme case it can be all
1691    of the function) given the corresponding LOOP_TREE_NODE.  The
1692    function is called for each loop during top-down traverse of the
1693    loop tree.  */
1694 static void
1695 color_pass (ira_loop_tree_node_t loop_tree_node)
1696 {
1697   int regno, hard_regno, index = -1;
1698   int cost, exit_freq, enter_freq;
1699   unsigned int j;
1700   bitmap_iterator bi;
1701   enum machine_mode mode;
1702   enum reg_class rclass, cover_class;
1703   ira_allocno_t a, subloop_allocno;
1704   ira_loop_tree_node_t subloop_node;
1705
1706   ira_assert (loop_tree_node->bb == NULL);
1707   if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
1708     print_loop_title (loop_tree_node);
1709
1710   bitmap_copy (coloring_allocno_bitmap, loop_tree_node->all_allocnos);
1711   bitmap_copy (consideration_allocno_bitmap, coloring_allocno_bitmap);
1712   EXECUTE_IF_SET_IN_BITMAP (consideration_allocno_bitmap, 0, j, bi)
1713     {
1714       a = ira_allocnos[j];
1715       if (! ALLOCNO_ASSIGNED_P (a))
1716         continue;
1717       bitmap_clear_bit (coloring_allocno_bitmap, ALLOCNO_NUM (a));
1718     }
1719   /* Color all mentioned allocnos including transparent ones.  */
1720   color_allocnos ();
1721   /* Process caps.  They are processed just once.  */
1722   if (flag_ira_algorithm == IRA_ALGORITHM_MIXED
1723       || flag_ira_algorithm == IRA_ALGORITHM_REGIONAL)
1724     EXECUTE_IF_SET_IN_BITMAP (loop_tree_node->all_allocnos, 0, j, bi)
1725       {
1726         a = ira_allocnos[j];
1727         if (ALLOCNO_CAP_MEMBER (a) == NULL)
1728           continue;
1729         /* Remove from processing in the next loop.  */
1730         bitmap_clear_bit (consideration_allocno_bitmap, j);
1731         rclass = ALLOCNO_COVER_CLASS (a);
1732         if ((flag_ira_algorithm == IRA_ALGORITHM_MIXED
1733              && loop_tree_node->reg_pressure[rclass]
1734              <= ira_available_class_regs[rclass]))
1735           {
1736             mode = ALLOCNO_MODE (a);
1737             hard_regno = ALLOCNO_HARD_REGNO (a);
1738             if (hard_regno >= 0)
1739               {
1740                 index = ira_class_hard_reg_index[rclass][hard_regno];
1741                 ira_assert (index >= 0);
1742               }
1743             regno = ALLOCNO_REGNO (a);
1744             subloop_allocno = ALLOCNO_CAP_MEMBER (a);
1745             subloop_node = ALLOCNO_LOOP_TREE_NODE (subloop_allocno);
1746             ira_assert (!ALLOCNO_ASSIGNED_P (subloop_allocno));
1747             ALLOCNO_HARD_REGNO (subloop_allocno) = hard_regno;
1748             ALLOCNO_ASSIGNED_P (subloop_allocno) = true;
1749             if (hard_regno >= 0)
1750               update_copy_costs (subloop_allocno, true);
1751             /* We don't need updated costs anymore: */
1752             ira_free_allocno_updated_costs (subloop_allocno);
1753           }
1754       }
1755   /* Update costs of the corresponding allocnos (not caps) in the
1756      subloops.  */
1757   for (subloop_node = loop_tree_node->subloops;
1758        subloop_node != NULL;
1759        subloop_node = subloop_node->subloop_next)
1760     {
1761       ira_assert (subloop_node->bb == NULL);
1762       EXECUTE_IF_SET_IN_BITMAP (consideration_allocno_bitmap, 0, j, bi)
1763         {
1764           a = ira_allocnos[j];
1765           ira_assert (ALLOCNO_CAP_MEMBER (a) == NULL);
1766           mode = ALLOCNO_MODE (a);
1767           rclass = ALLOCNO_COVER_CLASS (a);
1768           hard_regno = ALLOCNO_HARD_REGNO (a);
1769           if (hard_regno >= 0)
1770             {
1771               index = ira_class_hard_reg_index[rclass][hard_regno];
1772               ira_assert (index >= 0);
1773             }
1774           regno = ALLOCNO_REGNO (a);
1775           /* ??? conflict costs */
1776           subloop_allocno = subloop_node->regno_allocno_map[regno];
1777           if (subloop_allocno == NULL
1778               || ALLOCNO_CAP (subloop_allocno) != NULL)
1779             continue;
1780           ira_assert (bitmap_bit_p (subloop_node->all_allocnos,
1781                                     ALLOCNO_NUM (subloop_allocno)));
1782           if (flag_ira_algorithm == IRA_ALGORITHM_MIXED
1783               && (loop_tree_node->reg_pressure[rclass]
1784                   <= ira_available_class_regs[rclass]))
1785             {
1786               if (! ALLOCNO_ASSIGNED_P (subloop_allocno))
1787                 {
1788                   ALLOCNO_HARD_REGNO (subloop_allocno) = hard_regno;
1789                   ALLOCNO_ASSIGNED_P (subloop_allocno) = true;
1790                   if (hard_regno >= 0)
1791                     update_copy_costs (subloop_allocno, true);
1792                   /* We don't need updated costs anymore: */
1793                   ira_free_allocno_updated_costs (subloop_allocno);
1794                 }
1795               continue;
1796             }
1797           exit_freq = ira_loop_edge_freq (subloop_node, regno, true);
1798           enter_freq = ira_loop_edge_freq (subloop_node, regno, false);
1799           ira_assert (regno < ira_reg_equiv_len);
1800           if (ira_reg_equiv_invariant_p[regno]
1801               || ira_reg_equiv_const[regno] != NULL_RTX)
1802             {
1803               if (! ALLOCNO_ASSIGNED_P (subloop_allocno))
1804                 {
1805                   ALLOCNO_HARD_REGNO (subloop_allocno) = hard_regno;
1806                   ALLOCNO_ASSIGNED_P (subloop_allocno) = true;
1807                   if (hard_regno >= 0)
1808                     update_copy_costs (subloop_allocno, true);
1809                   /* We don't need updated costs anymore: */
1810                   ira_free_allocno_updated_costs (subloop_allocno);
1811                 }
1812             }
1813           else if (hard_regno < 0)
1814             {
1815               ALLOCNO_UPDATED_MEMORY_COST (subloop_allocno)
1816                 -= ((ira_memory_move_cost[mode][rclass][1] * enter_freq)
1817                     + (ira_memory_move_cost[mode][rclass][0] * exit_freq));
1818             }
1819           else
1820             {
1821               cover_class = ALLOCNO_COVER_CLASS (subloop_allocno);
1822               cost = (ira_register_move_cost[mode][rclass][rclass] 
1823                       * (exit_freq + enter_freq));
1824               ira_allocate_and_set_or_copy_costs
1825                 (&ALLOCNO_UPDATED_HARD_REG_COSTS (subloop_allocno), cover_class,
1826                  ALLOCNO_UPDATED_COVER_CLASS_COST (subloop_allocno),
1827                  ALLOCNO_HARD_REG_COSTS (subloop_allocno));
1828               ira_allocate_and_set_or_copy_costs
1829                 (&ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (subloop_allocno),
1830                  cover_class, 0,
1831                  ALLOCNO_CONFLICT_HARD_REG_COSTS (subloop_allocno));
1832               ALLOCNO_UPDATED_HARD_REG_COSTS (subloop_allocno)[index] -= cost;
1833               ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (subloop_allocno)[index]
1834                 -= cost;
1835               if (ALLOCNO_UPDATED_COVER_CLASS_COST (subloop_allocno)
1836                   > ALLOCNO_UPDATED_HARD_REG_COSTS (subloop_allocno)[index])
1837                 ALLOCNO_UPDATED_COVER_CLASS_COST (subloop_allocno)
1838                   = ALLOCNO_UPDATED_HARD_REG_COSTS (subloop_allocno)[index];
1839               ALLOCNO_UPDATED_MEMORY_COST (subloop_allocno)
1840                 += (ira_memory_move_cost[mode][rclass][0] * enter_freq
1841                     + ira_memory_move_cost[mode][rclass][1] * exit_freq);
1842             }
1843         }
1844     }
1845 }
1846
1847 /* Initialize the common data for coloring and calls functions to do
1848    Chaitin-Briggs and regional coloring.  */
1849 static void
1850 do_coloring (void)
1851 {
1852   coloring_allocno_bitmap = ira_allocate_bitmap ();
1853   allocnos_for_spilling
1854     = (ira_allocno_t *) ira_allocate (sizeof (ira_allocno_t)
1855                                       * ira_allocnos_num);
1856   splay_tree_node_pool = create_alloc_pool ("splay tree nodes",
1857                                             sizeof (struct splay_tree_node_s),
1858                                             100);
1859   if (internal_flag_ira_verbose > 0 && ira_dump_file != NULL)
1860     fprintf (ira_dump_file, "\n**** Allocnos coloring:\n\n");
1861   
1862   ira_traverse_loop_tree (false, ira_loop_tree_root, color_pass, NULL);
1863
1864   if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
1865     ira_print_disposition (ira_dump_file);
1866
1867   free_alloc_pool (splay_tree_node_pool);
1868   ira_free_bitmap (coloring_allocno_bitmap);
1869   ira_free (allocnos_for_spilling);
1870 }
1871
1872 \f
1873
1874 /* Move spill/restore code, which are to be generated in ira-emit.c,
1875    to less frequent points (if it is profitable) by reassigning some
1876    allocnos (in loop with subloops containing in another loop) to
1877    memory which results in longer live-range where the corresponding
1878    pseudo-registers will be in memory.  */
1879 static void
1880 move_spill_restore (void)
1881 {
1882   int cost, regno, hard_regno, hard_regno2, index;
1883   bool changed_p;
1884   int enter_freq, exit_freq;
1885   enum machine_mode mode;
1886   enum reg_class rclass;
1887   ira_allocno_t a, parent_allocno, subloop_allocno;
1888   ira_loop_tree_node_t parent, loop_node, subloop_node;
1889   ira_allocno_iterator ai;
1890
1891   for (;;)
1892     {
1893       changed_p = false;
1894       if (internal_flag_ira_verbose > 0 && ira_dump_file != NULL)
1895         fprintf (ira_dump_file, "New iteration of spill/restore move\n");
1896       FOR_EACH_ALLOCNO (a, ai)
1897         {
1898           regno = ALLOCNO_REGNO (a);
1899           loop_node = ALLOCNO_LOOP_TREE_NODE (a);
1900           if (ALLOCNO_CAP_MEMBER (a) != NULL
1901               || ALLOCNO_CAP (a) != NULL
1902               || (hard_regno = ALLOCNO_HARD_REGNO (a)) < 0
1903               || loop_node->children == NULL
1904               /* don't do the optimization because it can create
1905                  copies and the reload pass can spill the allocno set
1906                  by copy although the allocno will not get memory
1907                  slot.  */
1908               || ira_reg_equiv_invariant_p[regno]
1909               || ira_reg_equiv_const[regno] != NULL_RTX
1910               || !bitmap_bit_p (loop_node->border_allocnos, ALLOCNO_NUM (a)))
1911             continue;
1912           mode = ALLOCNO_MODE (a);
1913           rclass = ALLOCNO_COVER_CLASS (a);
1914           index = ira_class_hard_reg_index[rclass][hard_regno];
1915           ira_assert (index >= 0);
1916           cost = (ALLOCNO_MEMORY_COST (a)
1917                   - (ALLOCNO_HARD_REG_COSTS (a) == NULL
1918                      ? ALLOCNO_COVER_CLASS_COST (a)
1919                      : ALLOCNO_HARD_REG_COSTS (a)[index]));
1920           for (subloop_node = loop_node->subloops;
1921                subloop_node != NULL;
1922                subloop_node = subloop_node->subloop_next)
1923             {
1924               ira_assert (subloop_node->bb == NULL);
1925               subloop_allocno = subloop_node->regno_allocno_map[regno];
1926               if (subloop_allocno == NULL)
1927                 continue;
1928               /* We have accumulated cost.  To get the real cost of
1929                  allocno usage in the loop we should subtract costs of
1930                  the subloop allocnos.  */
1931               cost -= (ALLOCNO_MEMORY_COST (subloop_allocno)
1932                        - (ALLOCNO_HARD_REG_COSTS (subloop_allocno) == NULL
1933                           ? ALLOCNO_COVER_CLASS_COST (subloop_allocno)
1934                           : ALLOCNO_HARD_REG_COSTS (subloop_allocno)[index]));
1935               exit_freq = ira_loop_edge_freq (subloop_node, regno, true);
1936               enter_freq = ira_loop_edge_freq (subloop_node, regno, false);
1937               if ((hard_regno2 = ALLOCNO_HARD_REGNO (subloop_allocno)) < 0)
1938                 cost -= (ira_memory_move_cost[mode][rclass][0] * exit_freq
1939                          + ira_memory_move_cost[mode][rclass][1] * enter_freq);
1940               else
1941                 {
1942                   cost
1943                     += (ira_memory_move_cost[mode][rclass][0] * exit_freq
1944                         + ira_memory_move_cost[mode][rclass][1] * enter_freq);
1945                   if (hard_regno2 != hard_regno)
1946                     cost -= (ira_register_move_cost[mode][rclass][rclass]
1947                              * (exit_freq + enter_freq));
1948                 }
1949             }
1950           if ((parent = loop_node->parent) != NULL
1951               && (parent_allocno = parent->regno_allocno_map[regno]) != NULL)
1952             {
1953               exit_freq = ira_loop_edge_freq (loop_node, regno, true);
1954               enter_freq = ira_loop_edge_freq (loop_node, regno, false);
1955               if ((hard_regno2 = ALLOCNO_HARD_REGNO (parent_allocno)) < 0)
1956                 cost -= (ira_memory_move_cost[mode][rclass][0] * exit_freq
1957                          + ira_memory_move_cost[mode][rclass][1] * enter_freq);
1958               else
1959                 {
1960                   cost
1961                     += (ira_memory_move_cost[mode][rclass][1] * exit_freq
1962                         + ira_memory_move_cost[mode][rclass][0] * enter_freq);
1963                   if (hard_regno2 != hard_regno)
1964                     cost -= (ira_register_move_cost[mode][rclass][rclass]
1965                              * (exit_freq + enter_freq));
1966                 }
1967             }
1968           if (cost < 0)
1969             {
1970               ALLOCNO_HARD_REGNO (a) = -1;
1971               if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
1972                 {
1973                   fprintf
1974                     (ira_dump_file,
1975                      "      Moving spill/restore for a%dr%d up from loop %d",
1976                      ALLOCNO_NUM (a), regno, loop_node->loop->num);
1977                   fprintf (ira_dump_file, " - profit %d\n", -cost);
1978                 }
1979               changed_p = true;
1980             }
1981         }
1982       if (! changed_p)
1983         break;
1984     }
1985 }
1986
1987 \f
1988
1989 /* Update current hard reg costs and current conflict hard reg costs
1990    for allocno A.  It is done by processing its copies containing
1991    other allocnos already assigned.  */
1992 static void
1993 update_curr_costs (ira_allocno_t a)
1994 {
1995   int i, hard_regno, cost;
1996   enum machine_mode mode;
1997   enum reg_class cover_class, rclass;
1998   ira_allocno_t another_a;
1999   ira_copy_t cp, next_cp;
2000
2001   ira_assert (! ALLOCNO_ASSIGNED_P (a));
2002   cover_class = ALLOCNO_COVER_CLASS (a);
2003   if (cover_class == NO_REGS)
2004     return;
2005   mode = ALLOCNO_MODE (a);
2006   for (cp = ALLOCNO_COPIES (a); cp != NULL; cp = next_cp)
2007     {
2008       if (cp->first == a)
2009         {
2010           next_cp = cp->next_first_allocno_copy;
2011           another_a = cp->second;
2012         }
2013       else if (cp->second == a)
2014         {
2015           next_cp = cp->next_second_allocno_copy;
2016           another_a = cp->first;
2017         }
2018       else
2019         gcc_unreachable ();
2020       if (cover_class != ALLOCNO_COVER_CLASS (another_a)
2021           || ! ALLOCNO_ASSIGNED_P (another_a)
2022           || (hard_regno = ALLOCNO_HARD_REGNO (another_a)) < 0)
2023         continue;
2024       rclass = REGNO_REG_CLASS (hard_regno);
2025       i = ira_class_hard_reg_index[cover_class][hard_regno];
2026       ira_assert (i >= 0);
2027       cost = (cp->first == a
2028               ? ira_register_move_cost[mode][rclass][cover_class]
2029               : ira_register_move_cost[mode][cover_class][rclass]);
2030       ira_allocate_and_set_or_copy_costs
2031         (&ALLOCNO_UPDATED_HARD_REG_COSTS (a),
2032          cover_class, ALLOCNO_COVER_CLASS_COST (a),
2033          ALLOCNO_HARD_REG_COSTS (a));
2034       ira_allocate_and_set_or_copy_costs
2035         (&ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a),
2036          cover_class, 0, ALLOCNO_CONFLICT_HARD_REG_COSTS (a));
2037       ALLOCNO_UPDATED_HARD_REG_COSTS (a)[i] -= cp->freq * cost;
2038       ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a)[i] -= cp->freq * cost;
2039     }
2040 }
2041
2042 /* Map: allocno number -> allocno priority.  */
2043 static int *allocno_priorities;
2044
2045 /* Set up priorities for N allocnos in array
2046    CONSIDERATION_ALLOCNOS.  */
2047 static void
2048 setup_allocno_priorities (ira_allocno_t *consideration_allocnos, int n)
2049 {
2050   int i, length, nrefs, priority, max_priority, mult;
2051   ira_allocno_t a;
2052
2053   max_priority = 0;
2054   for (i = 0; i < n; i++)
2055     {
2056       a = consideration_allocnos[i];
2057       nrefs = ALLOCNO_NREFS (a);
2058       ira_assert (nrefs >= 0);
2059       mult = floor_log2 (ALLOCNO_NREFS (a)) + 1;
2060       ira_assert (mult >= 0);
2061       allocno_priorities[ALLOCNO_NUM (a)]
2062         = priority
2063         = (mult
2064            * (ALLOCNO_MEMORY_COST (a) - ALLOCNO_COVER_CLASS_COST (a))
2065            * ira_reg_class_nregs[ALLOCNO_COVER_CLASS (a)][ALLOCNO_MODE (a)]);
2066       if (priority < 0)
2067         priority = -priority;
2068       if (max_priority < priority)
2069         max_priority = priority;
2070     }
2071   mult = max_priority == 0 ? 1 : INT_MAX / max_priority;
2072   for (i = 0; i < n; i++)
2073     {
2074       a = consideration_allocnos[i];
2075       length = ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a);
2076       if (length <= 0)
2077         length = 1;
2078       allocno_priorities[ALLOCNO_NUM (a)]
2079         = allocno_priorities[ALLOCNO_NUM (a)] * mult / length;
2080     }
2081 }
2082
2083 /* Sort allocnos according to their priorities which are calculated
2084    analogous to ones in file `global.c'.  */
2085 static int
2086 allocno_priority_compare_func (const void *v1p, const void *v2p)
2087 {
2088   ira_allocno_t a1 = *(const ira_allocno_t *) v1p;
2089   ira_allocno_t a2 = *(const ira_allocno_t *) v2p;
2090   int pri1, pri2;
2091
2092   pri1 = allocno_priorities[ALLOCNO_NUM (a1)];
2093   pri2 = allocno_priorities[ALLOCNO_NUM (a2)];
2094   if (pri2 - pri1)
2095     return pri2 - pri1;
2096
2097   /* If regs are equally good, sort by allocnos, so that the results of
2098      qsort leave nothing to chance.  */
2099   return ALLOCNO_NUM (a1) - ALLOCNO_NUM (a2);
2100 }
2101
2102 /* Try to assign hard registers to the unassigned allocnos and
2103    allocnos conflicting with them or conflicting with allocnos whose
2104    regno >= START_REGNO.  The function is called after ira_flattening,
2105    so more allocnos (including ones created in ira-emit.c) will have a
2106    chance to get a hard register.  We use simple assignment algorithm
2107    based on priorities.  */
2108 void
2109 ira_reassign_conflict_allocnos (int start_regno)
2110 {
2111   int i, allocnos_to_color_num;
2112   ira_allocno_t a, conflict_a;
2113   ira_allocno_conflict_iterator aci;
2114   enum reg_class cover_class;
2115   bitmap allocnos_to_color;
2116   ira_allocno_iterator ai;
2117
2118   allocnos_to_color = ira_allocate_bitmap ();
2119   allocnos_to_color_num = 0;
2120   FOR_EACH_ALLOCNO (a, ai)
2121     {
2122       if (! ALLOCNO_ASSIGNED_P (a)
2123           && ! bitmap_bit_p (allocnos_to_color, ALLOCNO_NUM (a)))
2124         {
2125           if (ALLOCNO_COVER_CLASS (a) != NO_REGS)
2126             sorted_allocnos[allocnos_to_color_num++] = a;
2127           else
2128             {
2129               ALLOCNO_ASSIGNED_P (a) = true;
2130               ALLOCNO_HARD_REGNO (a) = -1;
2131               ira_assert (ALLOCNO_UPDATED_HARD_REG_COSTS (a) == NULL);
2132               ira_assert (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) == NULL);
2133             }
2134           bitmap_set_bit (allocnos_to_color, ALLOCNO_NUM (a));
2135         }
2136       if (ALLOCNO_REGNO (a) < start_regno
2137           || (cover_class = ALLOCNO_COVER_CLASS (a)) == NO_REGS)
2138         continue;
2139       FOR_EACH_ALLOCNO_CONFLICT (a, conflict_a, aci)
2140         {
2141           ira_assert (cover_class == ALLOCNO_COVER_CLASS (conflict_a));
2142           if (bitmap_bit_p (allocnos_to_color, ALLOCNO_NUM (conflict_a)))
2143             continue;
2144           bitmap_set_bit (allocnos_to_color, ALLOCNO_NUM (conflict_a));
2145           sorted_allocnos[allocnos_to_color_num++] = conflict_a;
2146         }
2147     }
2148   ira_free_bitmap (allocnos_to_color);
2149   if (allocnos_to_color_num > 1)
2150     {
2151       setup_allocno_priorities (sorted_allocnos, allocnos_to_color_num);
2152       qsort (sorted_allocnos, allocnos_to_color_num, sizeof (ira_allocno_t),
2153              allocno_priority_compare_func);
2154     }
2155   for (i = 0; i < allocnos_to_color_num; i++)
2156     {
2157       a = sorted_allocnos[i];
2158       ALLOCNO_ASSIGNED_P (a) = false;
2159       ira_assert (ALLOCNO_UPDATED_HARD_REG_COSTS (a) == NULL);
2160       ira_assert (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) == NULL);
2161       update_curr_costs (a);
2162     }
2163   for (i = 0; i < allocnos_to_color_num; i++)
2164     {
2165       a = sorted_allocnos[i];
2166       if (assign_hard_reg (a, true))
2167         {
2168           if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2169             fprintf
2170               (ira_dump_file,
2171                "      Secondary allocation: assign hard reg %d to reg %d\n",
2172                ALLOCNO_HARD_REGNO (a), ALLOCNO_REGNO (a));
2173         }
2174     }
2175 }
2176
2177 \f
2178
2179 /* This page contains code to coalesce memory stack slots used by
2180    spilled allocnos.  This results in smaller stack frame, better data
2181    locality, and in smaller code for some architectures like
2182    x86/x86_64 where insn size depends on address displacement value.
2183    On the other hand, it can worsen insn scheduling after the RA but
2184    in practice it is less important than smaller stack frames.  */
2185
2186 /* Usage cost and order number of coalesced allocno set to which
2187    given pseudo register belongs to.  */
2188 static int *regno_coalesced_allocno_cost;
2189 static int *regno_coalesced_allocno_num;
2190
2191 /* Sort pseudos according frequencies of coalesced allocno sets they
2192    belong to (putting most frequently ones first), and according to
2193    coalesced allocno set order numbers.  */
2194 static int
2195 coalesced_pseudo_reg_freq_compare (const void *v1p, const void *v2p)
2196 {
2197   const int regno1 = *(const int *) v1p;
2198   const int regno2 = *(const int *) v2p;
2199   int diff;
2200
2201   if ((diff = (regno_coalesced_allocno_cost[regno2]
2202                - regno_coalesced_allocno_cost[regno1])) != 0)
2203     return diff;
2204   if ((diff = (regno_coalesced_allocno_num[regno1]
2205                - regno_coalesced_allocno_num[regno2])) != 0)
2206     return diff;
2207   return regno1 - regno2;
2208 }
2209
2210 /* Widest width in which each pseudo reg is referred to (via subreg).
2211    It is used for sorting pseudo registers.  */
2212 static unsigned int *regno_max_ref_width;
2213
2214 /* Redefine STACK_GROWS_DOWNWARD in terms of 0 or 1.  */
2215 #ifdef STACK_GROWS_DOWNWARD
2216 # undef STACK_GROWS_DOWNWARD
2217 # define STACK_GROWS_DOWNWARD 1
2218 #else
2219 # define STACK_GROWS_DOWNWARD 0
2220 #endif
2221
2222 /* Sort pseudos according their slot numbers (putting ones with
2223   smaller numbers first, or last when the frame pointer is not
2224   needed).  */
2225 static int
2226 coalesced_pseudo_reg_slot_compare (const void *v1p, const void *v2p)
2227 {
2228   const int regno1 = *(const int *) v1p;
2229   const int regno2 = *(const int *) v2p;
2230   ira_allocno_t a1 = ira_regno_allocno_map[regno1];
2231   ira_allocno_t a2 = ira_regno_allocno_map[regno2];
2232   int diff, slot_num1, slot_num2;
2233   int total_size1, total_size2;
2234
2235   if (a1 == NULL || ALLOCNO_HARD_REGNO (a1) >= 0)
2236     {
2237       if (a2 == NULL || ALLOCNO_HARD_REGNO (a2) >= 0)
2238         return regno1 - regno2;
2239       return 1;
2240     }
2241   else if (a2 == NULL || ALLOCNO_HARD_REGNO (a2) >= 0)
2242     return -1;
2243   slot_num1 = -ALLOCNO_HARD_REGNO (a1);
2244   slot_num2 = -ALLOCNO_HARD_REGNO (a2);
2245   if ((diff = slot_num1 - slot_num2) != 0)
2246     return (frame_pointer_needed
2247             || !FRAME_GROWS_DOWNWARD == STACK_GROWS_DOWNWARD ? diff : -diff);
2248   total_size1 = MAX (PSEUDO_REGNO_BYTES (regno1), regno_max_ref_width[regno1]);
2249   total_size2 = MAX (PSEUDO_REGNO_BYTES (regno2), regno_max_ref_width[regno2]);
2250   if ((diff = total_size2 - total_size1) != 0)
2251     return diff;
2252   return regno1 - regno2;
2253 }
2254
2255 /* Setup REGNO_COALESCED_ALLOCNO_COST and REGNO_COALESCED_ALLOCNO_NUM
2256    for coalesced allocno sets containing allocnos with their regnos
2257    given in array PSEUDO_REGNOS of length N.  */
2258 static void
2259 setup_coalesced_allocno_costs_and_nums (int *pseudo_regnos, int n)
2260 {
2261   int i, num, regno, cost;
2262   ira_allocno_t allocno, a;
2263
2264   for (num = i = 0; i < n; i++)
2265     {
2266       regno = pseudo_regnos[i];
2267       allocno = ira_regno_allocno_map[regno];
2268       if (allocno == NULL)
2269         {
2270           regno_coalesced_allocno_cost[regno] = 0;
2271           regno_coalesced_allocno_num[regno] = ++num;
2272           continue;
2273         }
2274       if (ALLOCNO_FIRST_COALESCED_ALLOCNO (allocno) != allocno)
2275         continue;
2276       num++;
2277       for (cost = 0, a = ALLOCNO_NEXT_COALESCED_ALLOCNO (allocno);;
2278            a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
2279         {
2280           cost += ALLOCNO_FREQ (a);
2281           if (a == allocno)
2282             break;
2283         }
2284       for (a = ALLOCNO_NEXT_COALESCED_ALLOCNO (allocno);;
2285            a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
2286         {
2287           regno_coalesced_allocno_num[ALLOCNO_REGNO (a)] = num;
2288           regno_coalesced_allocno_cost[ALLOCNO_REGNO (a)] = cost;
2289           if (a == allocno)
2290             break;
2291         }
2292     }
2293 }
2294
2295 /* Collect spilled allocnos representing coalesced allocno sets (the
2296    first coalesced allocno).  The collected allocnos are returned
2297    through array SPILLED_COALESCED_ALLOCNOS.  The function returns the
2298    number of the collected allocnos.  The allocnos are given by their
2299    regnos in array PSEUDO_REGNOS of length N.  */
2300 static int
2301 collect_spilled_coalesced_allocnos (int *pseudo_regnos, int n,
2302                                     ira_allocno_t *spilled_coalesced_allocnos)
2303 {
2304   int i, num, regno;
2305   ira_allocno_t allocno;
2306
2307   for (num = i = 0; i < n; i++)
2308     {
2309       regno = pseudo_regnos[i];
2310       allocno = ira_regno_allocno_map[regno];
2311       if (allocno == NULL || ALLOCNO_HARD_REGNO (allocno) >= 0
2312           || ALLOCNO_FIRST_COALESCED_ALLOCNO (allocno) != allocno)
2313         continue;
2314       spilled_coalesced_allocnos[num++] = allocno;
2315     }
2316   return num;
2317 }
2318
2319 /* Array of bitmaps of size IRA_MAX_POINT.  Bitmap for given point
2320    contains numbers of coalesced allocnos living at this point.  */
2321 static regset_head *coalesced_allocnos_living_at_program_points;
2322
2323 /* Return TRUE if coalesced allocnos represented by ALLOCNO live at
2324    program points of coalesced allocnos with number N.  */
2325 static bool
2326 coalesced_allocnos_live_at_points_p (ira_allocno_t allocno, int n)
2327 {
2328   int i;
2329   ira_allocno_t a;
2330   allocno_live_range_t r;
2331
2332   for (a = ALLOCNO_NEXT_COALESCED_ALLOCNO (allocno);;
2333        a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
2334     {
2335       for (r = ALLOCNO_LIVE_RANGES (a); r != NULL; r = r->next)
2336         for (i = r->start; i <= r->finish; i++)
2337           if (bitmap_bit_p (&coalesced_allocnos_living_at_program_points[i], n))
2338               return true;
2339       if (a == allocno)
2340         break;
2341     }
2342   return false;
2343 }
2344
2345 /* Mark program points where coalesced allocnos represented by ALLOCNO
2346    live.  */
2347 static void
2348 set_coalesced_allocnos_live_points (ira_allocno_t allocno)
2349 {
2350   int i, n;
2351   ira_allocno_t a;
2352   allocno_live_range_t r;
2353
2354   n = ALLOCNO_TEMP (allocno);
2355   for (a = ALLOCNO_NEXT_COALESCED_ALLOCNO (allocno);;
2356        a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
2357     {
2358       for (r = ALLOCNO_LIVE_RANGES (a); r != NULL; r = r->next)
2359         for (i = r->start; i <= r->finish; i++)
2360           bitmap_set_bit (&coalesced_allocnos_living_at_program_points[i], n);
2361       if (a == allocno)
2362         break;
2363     }
2364 }
2365
2366 /* We have coalesced allocnos involving in copies.  Coalesce allocnos
2367    further in order to share the same memory stack slot.  Allocnos
2368    representing sets of allocnos coalesced before the call are given
2369    in array SPILLED_COALESCED_ALLOCNOS of length NUM.  Return TRUE if
2370    some allocnos were coalesced in the function.  */
2371 static bool
2372 coalesce_spill_slots (ira_allocno_t *spilled_coalesced_allocnos, int num)
2373 {
2374   int i, j, last_coalesced_allocno_num;
2375   ira_allocno_t allocno, a;
2376   bool merged_p = false;
2377
2378   coalesced_allocnos_living_at_program_points
2379     = (regset_head *) ira_allocate (sizeof (regset_head) * ira_max_point);
2380   for (i = 0; i < ira_max_point; i++)
2381     INIT_REG_SET (&coalesced_allocnos_living_at_program_points[i]);
2382   last_coalesced_allocno_num = 0;
2383   /* Coalesce non-conflicting spilled allocnos preferring most
2384      frequently used.  */
2385   for (i = 0; i < num; i++)
2386     {
2387       allocno = spilled_coalesced_allocnos[i];
2388       if (ALLOCNO_FIRST_COALESCED_ALLOCNO (allocno) != allocno
2389           || (ALLOCNO_REGNO (allocno) < ira_reg_equiv_len
2390               && (ira_reg_equiv_invariant_p[ALLOCNO_REGNO (allocno)]
2391                   || ira_reg_equiv_const[ALLOCNO_REGNO (allocno)] != NULL_RTX)))
2392         continue;
2393       for (j = 0; j < i; j++)
2394         {
2395           a = spilled_coalesced_allocnos[j];
2396           if (ALLOCNO_FIRST_COALESCED_ALLOCNO (a) == a
2397               && (ALLOCNO_REGNO (a) >= ira_reg_equiv_len
2398                   || (! ira_reg_equiv_invariant_p[ALLOCNO_REGNO (a)]
2399                       && ira_reg_equiv_const[ALLOCNO_REGNO (a)] == NULL_RTX))
2400               && ! coalesced_allocnos_live_at_points_p (allocno,
2401                                                         ALLOCNO_TEMP (a)))
2402             break;
2403         }
2404       if (j >= i)
2405         {
2406           /* No coalescing: set up number for coalesced allocnos
2407              represented by ALLOCNO.  */
2408           ALLOCNO_TEMP (allocno) = last_coalesced_allocno_num++;
2409           set_coalesced_allocnos_live_points (allocno);
2410         }
2411       else
2412         {
2413           allocno_coalesced_p = true;
2414           merged_p = true;
2415           if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2416             fprintf (ira_dump_file,
2417                      "      Coalescing spilled allocnos a%dr%d->a%dr%d\n",
2418                      ALLOCNO_NUM (allocno), ALLOCNO_REGNO (allocno),
2419                      ALLOCNO_NUM (a), ALLOCNO_REGNO (a));
2420           ALLOCNO_TEMP (allocno) = ALLOCNO_TEMP (a);
2421           set_coalesced_allocnos_live_points (allocno);
2422           merge_allocnos (a, allocno);
2423           ira_assert (ALLOCNO_FIRST_COALESCED_ALLOCNO (a) == a);
2424         }
2425     }
2426   for (i = 0; i < ira_max_point; i++)
2427     CLEAR_REG_SET (&coalesced_allocnos_living_at_program_points[i]);
2428   ira_free (coalesced_allocnos_living_at_program_points);
2429   return merged_p;
2430 }
2431
2432 /* Sort pseudo-register numbers in array PSEUDO_REGNOS of length N for
2433    subsequent assigning stack slots to them in the reload pass.  To do
2434    this we coalesce spilled allocnos first to decrease the number of
2435    memory-memory move insns.  This function is called by the
2436    reload.  */
2437 void
2438 ira_sort_regnos_for_alter_reg (int *pseudo_regnos, int n,
2439                                unsigned int *reg_max_ref_width)
2440 {
2441   int max_regno = max_reg_num ();
2442   int i, regno, num, slot_num;
2443   ira_allocno_t allocno, a;
2444   ira_allocno_iterator ai;
2445   ira_allocno_t *spilled_coalesced_allocnos;
2446
2447   processed_coalesced_allocno_bitmap = ira_allocate_bitmap ();
2448   /* Set up allocnos can be coalesced.  */
2449   coloring_allocno_bitmap = ira_allocate_bitmap ();
2450   for (i = 0; i < n; i++)
2451     {
2452       regno = pseudo_regnos[i];
2453       allocno = ira_regno_allocno_map[regno];
2454       if (allocno != NULL)
2455         bitmap_set_bit (coloring_allocno_bitmap,
2456                         ALLOCNO_NUM (allocno));
2457     }
2458   allocno_coalesced_p = false;
2459   coalesce_allocnos (true);
2460   ira_free_bitmap (coloring_allocno_bitmap);
2461   regno_coalesced_allocno_cost
2462     = (int *) ira_allocate (max_regno * sizeof (int));
2463   regno_coalesced_allocno_num
2464     = (int *) ira_allocate (max_regno * sizeof (int));
2465   memset (regno_coalesced_allocno_num, 0, max_regno * sizeof (int));
2466   setup_coalesced_allocno_costs_and_nums (pseudo_regnos, n);
2467   /* Sort regnos according frequencies of the corresponding coalesced
2468      allocno sets.  */
2469   qsort (pseudo_regnos, n, sizeof (int), coalesced_pseudo_reg_freq_compare);
2470   spilled_coalesced_allocnos
2471     = (ira_allocno_t *) ira_allocate (ira_allocnos_num
2472                                       * sizeof (ira_allocno_t));
2473   /* Collect allocnos representing the spilled coalesced allocno
2474      sets.  */
2475   num = collect_spilled_coalesced_allocnos (pseudo_regnos, n,
2476                                             spilled_coalesced_allocnos);
2477   if (flag_ira_share_spill_slots
2478       && coalesce_spill_slots (spilled_coalesced_allocnos, num))
2479     {
2480       setup_coalesced_allocno_costs_and_nums (pseudo_regnos, n);
2481       qsort (pseudo_regnos, n, sizeof (int),
2482              coalesced_pseudo_reg_freq_compare);
2483       num = collect_spilled_coalesced_allocnos (pseudo_regnos, n,
2484                                                 spilled_coalesced_allocnos);
2485     }
2486   ira_free_bitmap (processed_coalesced_allocno_bitmap);
2487   allocno_coalesced_p = false;
2488   /* Assign stack slot numbers to spilled allocno sets, use smaller
2489      numbers for most frequently used coalesced allocnos.  -1 is
2490      reserved for dynamic search of stack slots for pseudos spilled by
2491      the reload.  */
2492   slot_num = 1;
2493   for (i = 0; i < num; i++)
2494     {
2495       allocno = spilled_coalesced_allocnos[i];
2496       if (ALLOCNO_FIRST_COALESCED_ALLOCNO (allocno) != allocno
2497           || ALLOCNO_HARD_REGNO (allocno) >= 0
2498           || (ALLOCNO_REGNO (allocno) < ira_reg_equiv_len
2499               && (ira_reg_equiv_invariant_p[ALLOCNO_REGNO (allocno)]
2500                   || ira_reg_equiv_const[ALLOCNO_REGNO (allocno)] != NULL_RTX)))
2501         continue;
2502       if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2503         fprintf (ira_dump_file, "      Slot %d (freq,size):", slot_num);
2504       slot_num++;
2505       for (a = ALLOCNO_NEXT_COALESCED_ALLOCNO (allocno);;
2506            a = ALLOCNO_NEXT_COALESCED_ALLOCNO (a))
2507         {
2508           ira_assert (ALLOCNO_HARD_REGNO (a) < 0);
2509           ALLOCNO_HARD_REGNO (a) = -slot_num;
2510           if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2511             fprintf (ira_dump_file, " a%dr%d(%d,%d)",
2512                      ALLOCNO_NUM (a), ALLOCNO_REGNO (a), ALLOCNO_FREQ (a),
2513                      MAX (PSEUDO_REGNO_BYTES (ALLOCNO_REGNO (a)),
2514                           reg_max_ref_width[ALLOCNO_REGNO (a)]));
2515               
2516           if (a == allocno)
2517             break;
2518         }
2519       if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2520         fprintf (ira_dump_file, "\n");
2521     }
2522   ira_spilled_reg_stack_slots_num = slot_num - 1;
2523   ira_free (spilled_coalesced_allocnos);
2524   /* Sort regnos according the slot numbers.  */
2525   regno_max_ref_width = reg_max_ref_width;
2526   qsort (pseudo_regnos, n, sizeof (int), coalesced_pseudo_reg_slot_compare);
2527   /* Uncoalesce allocnos which is necessary for (re)assigning during
2528      the reload pass.  */
2529   FOR_EACH_ALLOCNO (a, ai)
2530     {
2531       ALLOCNO_FIRST_COALESCED_ALLOCNO (a) = a;
2532       ALLOCNO_NEXT_COALESCED_ALLOCNO (a) = a;
2533     }
2534   ira_free (regno_coalesced_allocno_num);
2535   ira_free (regno_coalesced_allocno_cost);
2536 }
2537
2538 \f
2539
2540 /* This page contains code used by the reload pass to improve the
2541    final code.  */
2542
2543 /* The function is called from reload to mark changes in the
2544    allocation of REGNO made by the reload.  Remember that reg_renumber
2545    reflects the change result.  */
2546 void
2547 ira_mark_allocation_change (int regno)
2548 {
2549   ira_allocno_t a = ira_regno_allocno_map[regno];
2550   int old_hard_regno, hard_regno, cost;
2551   enum reg_class cover_class = ALLOCNO_COVER_CLASS (a);
2552
2553   ira_assert (a != NULL);
2554   hard_regno = reg_renumber[regno];
2555   if ((old_hard_regno = ALLOCNO_HARD_REGNO (a)) == hard_regno)
2556     return;
2557   if (old_hard_regno < 0)
2558     cost = -ALLOCNO_MEMORY_COST (a);
2559   else
2560     {
2561       ira_assert (ira_class_hard_reg_index[cover_class][old_hard_regno] >= 0);
2562       cost = -(ALLOCNO_HARD_REG_COSTS (a) == NULL
2563                ? ALLOCNO_COVER_CLASS_COST (a)
2564                : ALLOCNO_HARD_REG_COSTS (a)
2565                  [ira_class_hard_reg_index[cover_class][old_hard_regno]]);
2566       update_copy_costs (a, false);
2567     }
2568   ira_overall_cost -= cost;
2569   ALLOCNO_HARD_REGNO (a) = hard_regno;
2570   if (hard_regno < 0)
2571     {
2572       ALLOCNO_HARD_REGNO (a) = -1;
2573       cost += ALLOCNO_MEMORY_COST (a);
2574     }
2575   else if (ira_class_hard_reg_index[cover_class][hard_regno] >= 0)
2576     {
2577       cost += (ALLOCNO_HARD_REG_COSTS (a) == NULL
2578                ? ALLOCNO_COVER_CLASS_COST (a)
2579                : ALLOCNO_HARD_REG_COSTS (a)
2580                  [ira_class_hard_reg_index[cover_class][hard_regno]]);
2581       update_copy_costs (a, true);
2582     }
2583   else
2584     /* Reload changed class of the allocno.  */
2585     cost = 0;
2586   ira_overall_cost += cost;
2587 }
2588
2589 /* This function is called when reload deletes memory-memory move.  In
2590    this case we marks that the allocation of the corresponding
2591    allocnos should be not changed in future.  Otherwise we risk to get
2592    a wrong code.  */
2593 void
2594 ira_mark_memory_move_deletion (int dst_regno, int src_regno)
2595 {
2596   ira_allocno_t dst = ira_regno_allocno_map[dst_regno];
2597   ira_allocno_t src = ira_regno_allocno_map[src_regno];
2598
2599   ira_assert (dst != NULL && src != NULL
2600               && ALLOCNO_HARD_REGNO (dst) < 0
2601               && ALLOCNO_HARD_REGNO (src) < 0);
2602   ALLOCNO_DONT_REASSIGN_P (dst) = true;
2603   ALLOCNO_DONT_REASSIGN_P (src) = true;
2604 }
2605
2606 /* Try to assign a hard register (except for FORBIDDEN_REGS) to
2607    allocno A and return TRUE in the case of success.  That is an
2608    analog of retry_global_alloc for IRA.  */
2609 static bool
2610 allocno_reload_assign (ira_allocno_t a, HARD_REG_SET forbidden_regs)
2611 {
2612   int hard_regno;
2613   enum reg_class cover_class;
2614   int regno = ALLOCNO_REGNO (a);
2615
2616   IOR_HARD_REG_SET (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a), forbidden_regs);
2617   if (! flag_caller_saves && ALLOCNO_CALLS_CROSSED_NUM (a) != 0)
2618     IOR_HARD_REG_SET (ALLOCNO_TOTAL_CONFLICT_HARD_REGS (a), call_used_reg_set);
2619   ALLOCNO_ASSIGNED_P (a) = false;
2620   ira_assert (ALLOCNO_UPDATED_HARD_REG_COSTS (a) == NULL);
2621   ira_assert (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) == NULL);
2622   cover_class = ALLOCNO_COVER_CLASS (a);
2623   update_curr_costs (a);
2624   assign_hard_reg (a, true);
2625   hard_regno = ALLOCNO_HARD_REGNO (a);
2626   reg_renumber[regno] = hard_regno;
2627   if (hard_regno < 0)
2628     ALLOCNO_HARD_REGNO (a) = -1;
2629   else
2630     {
2631       ira_assert (ira_class_hard_reg_index[cover_class][hard_regno] >= 0);
2632       ira_overall_cost -= (ALLOCNO_MEMORY_COST (a)
2633                            - (ALLOCNO_HARD_REG_COSTS (a) == NULL
2634                               ? ALLOCNO_COVER_CLASS_COST (a)
2635                               : ALLOCNO_HARD_REG_COSTS (a)
2636                                 [ira_class_hard_reg_index
2637                                  [cover_class][hard_regno]]));
2638       if (ALLOCNO_CALLS_CROSSED_NUM (a) != 0
2639           && ! ira_hard_reg_not_in_set_p (hard_regno, ALLOCNO_MODE (a),
2640                                           call_used_reg_set))
2641         {
2642           ira_assert (flag_caller_saves);
2643           caller_save_needed = 1;
2644         }
2645     }
2646
2647   /* If we found a hard register, modify the RTL for the pseudo
2648      register to show the hard register, and mark the pseudo register
2649      live.  */
2650   if (reg_renumber[regno] >= 0)
2651     {
2652       if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2653         fprintf (ira_dump_file, ": reassign to %d\n", reg_renumber[regno]);
2654       SET_REGNO (regno_reg_rtx[regno], reg_renumber[regno]);
2655       mark_home_live (regno);
2656     }
2657   else if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2658     fprintf (ira_dump_file, "\n");
2659
2660   return reg_renumber[regno] >= 0;
2661 }
2662
2663 /* Sort pseudos according their usage frequencies (putting most
2664    frequently ones first).  */
2665 static int
2666 pseudo_reg_compare (const void *v1p, const void *v2p)
2667 {
2668   int regno1 = *(const int *) v1p;
2669   int regno2 = *(const int *) v2p;
2670   int diff;
2671
2672   if ((diff = REG_FREQ (regno2) - REG_FREQ (regno1)) != 0)
2673     return diff;
2674   return regno1 - regno2;
2675 }
2676
2677 /* Try to allocate hard registers to SPILLED_PSEUDO_REGS (there are
2678    NUM of them) or spilled pseudos conflicting with pseudos in
2679    SPILLED_PSEUDO_REGS.  Return TRUE and update SPILLED, if the
2680    allocation has been changed.  The function doesn't use
2681    BAD_SPILL_REGS and hard registers in PSEUDO_FORBIDDEN_REGS and
2682    PSEUDO_PREVIOUS_REGS for the corresponding pseudos.  The function
2683    is called by the reload pass at the end of each reload
2684    iteration.  */
2685 bool
2686 ira_reassign_pseudos (int *spilled_pseudo_regs, int num,
2687                       HARD_REG_SET bad_spill_regs,
2688                       HARD_REG_SET *pseudo_forbidden_regs,
2689                       HARD_REG_SET *pseudo_previous_regs,  bitmap spilled)
2690 {
2691   int i, m, n, regno;
2692   bool changed_p;
2693   ira_allocno_t a, conflict_a;
2694   HARD_REG_SET forbidden_regs;
2695   ira_allocno_conflict_iterator aci;
2696
2697   if (num > 1)
2698     qsort (spilled_pseudo_regs, num, sizeof (int), pseudo_reg_compare);
2699   changed_p = false;
2700   /* Try to assign hard registers to pseudos from
2701      SPILLED_PSEUDO_REGS.  */
2702   for (m = i = 0; i < num; i++)
2703     {
2704       regno = spilled_pseudo_regs[i];
2705       COPY_HARD_REG_SET (forbidden_regs, bad_spill_regs);
2706       IOR_HARD_REG_SET (forbidden_regs, pseudo_forbidden_regs[regno]);
2707       IOR_HARD_REG_SET (forbidden_regs, pseudo_previous_regs[regno]);
2708       gcc_assert (reg_renumber[regno] < 0);
2709       a = ira_regno_allocno_map[regno];
2710       ira_mark_allocation_change (regno);
2711       ira_assert (reg_renumber[regno] < 0);
2712       if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2713         fprintf (ira_dump_file,
2714                  "      Spill %d(a%d), cost=%d", regno, ALLOCNO_NUM (a),
2715                  ALLOCNO_MEMORY_COST (a)
2716                  - ALLOCNO_COVER_CLASS_COST (a));
2717       allocno_reload_assign (a, forbidden_regs);
2718       if (reg_renumber[regno] >= 0)
2719         {
2720           CLEAR_REGNO_REG_SET (spilled, regno);
2721           changed_p = true;
2722         }
2723       else
2724         spilled_pseudo_regs[m++] = regno;
2725     }
2726   if (m == 0)
2727     return changed_p;
2728   if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2729     {
2730       fprintf (ira_dump_file, "      Spilled regs");
2731       for (i = 0; i < m; i++)
2732         fprintf (ira_dump_file, " %d", spilled_pseudo_regs[i]);
2733       fprintf (ira_dump_file, "\n");
2734     }
2735   /* Try to assign hard registers to pseudos conflicting with ones
2736      from SPILLED_PSEUDO_REGS.  */
2737   for (i = n = 0; i < m; i++)
2738     {
2739       regno = spilled_pseudo_regs[i];
2740       a = ira_regno_allocno_map[regno];
2741       FOR_EACH_ALLOCNO_CONFLICT (a, conflict_a, aci)
2742         if (ALLOCNO_HARD_REGNO (conflict_a) < 0
2743             && ! ALLOCNO_DONT_REASSIGN_P (conflict_a)
2744             && ! bitmap_bit_p (consideration_allocno_bitmap,
2745                                ALLOCNO_NUM (conflict_a)))
2746           {
2747             sorted_allocnos[n++] = conflict_a;
2748             bitmap_set_bit (consideration_allocno_bitmap,
2749                             ALLOCNO_NUM (conflict_a));
2750           }
2751     }
2752   if (n != 0)
2753     {
2754       setup_allocno_priorities (sorted_allocnos, n);
2755       qsort (sorted_allocnos, n, sizeof (ira_allocno_t),
2756              allocno_priority_compare_func);
2757       for (i = 0; i < n; i++)
2758         {
2759           a = sorted_allocnos[i];
2760           regno = ALLOCNO_REGNO (a);
2761           COPY_HARD_REG_SET (forbidden_regs, bad_spill_regs);
2762           IOR_HARD_REG_SET (forbidden_regs, pseudo_forbidden_regs[regno]);
2763           IOR_HARD_REG_SET (forbidden_regs, pseudo_previous_regs[regno]);
2764           if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
2765             fprintf (ira_dump_file,
2766                      "        Try assign %d(a%d), cost=%d",
2767                      regno, ALLOCNO_NUM (a),
2768                      ALLOCNO_MEMORY_COST (a)
2769                      - ALLOCNO_COVER_CLASS_COST (a));
2770           if (allocno_reload_assign (a, forbidden_regs))
2771             {
2772               changed_p = true;
2773               bitmap_clear_bit (spilled, regno);
2774             }
2775         }
2776     }
2777   return changed_p;
2778 }
2779
2780 /* The function is called by reload and returns already allocated
2781    stack slot (if any) for REGNO with given INHERENT_SIZE and
2782    TOTAL_SIZE.  In the case of failure to find a slot which can be
2783    used for REGNO, the function returns NULL.  */
2784 rtx
2785 ira_reuse_stack_slot (int regno, unsigned int inherent_size,
2786                       unsigned int total_size)
2787 {
2788   unsigned int i;
2789   int slot_num, best_slot_num;
2790   int cost, best_cost;
2791   ira_copy_t cp, next_cp;
2792   ira_allocno_t another_allocno, allocno = ira_regno_allocno_map[regno];
2793   rtx x;
2794   bitmap_iterator bi;
2795   struct ira_spilled_reg_stack_slot *slot = NULL;
2796
2797   ira_assert (flag_ira && inherent_size == PSEUDO_REGNO_BYTES (regno)
2798               && inherent_size <= total_size
2799               && ALLOCNO_HARD_REGNO (allocno) < 0);
2800   if (! flag_ira_share_spill_slots)
2801     return NULL_RTX;
2802   slot_num = -ALLOCNO_HARD_REGNO (allocno) - 2;
2803   if (slot_num != -1)
2804     {
2805       slot = &ira_spilled_reg_stack_slots[slot_num];
2806       x = slot->mem;
2807     }
2808   else
2809     {
2810       best_cost = best_slot_num = -1;
2811       x = NULL_RTX;
2812       /* It means that the pseudo was spilled in the reload pass, try
2813          to reuse a slot.  */
2814       for (slot_num = 0;
2815            slot_num < ira_spilled_reg_stack_slots_num;
2816            slot_num++)
2817         {
2818           slot = &ira_spilled_reg_stack_slots[slot_num];
2819           if (slot->mem == NULL_RTX)
2820             continue;
2821           if (slot->width < total_size
2822               || GET_MODE_SIZE (GET_MODE (slot->mem)) < inherent_size)
2823             continue;
2824           
2825           EXECUTE_IF_SET_IN_BITMAP (&slot->spilled_regs,
2826                                     FIRST_PSEUDO_REGISTER, i, bi)
2827             {
2828               another_allocno = ira_regno_allocno_map[i];
2829               if (ira_allocno_live_ranges_intersect_p (allocno,
2830                                                        another_allocno))
2831                 goto cont;
2832             }
2833           for (cost = 0, cp = ALLOCNO_COPIES (allocno);
2834                cp != NULL;
2835                cp = next_cp)
2836             {
2837               if (cp->first == allocno)
2838                 {
2839                   next_cp = cp->next_first_allocno_copy;
2840                   another_allocno = cp->second;
2841                 }
2842               else if (cp->second == allocno)
2843                 {
2844                   next_cp = cp->next_second_allocno_copy;
2845                   another_allocno = cp->first;
2846                 }
2847               else
2848                 gcc_unreachable ();
2849               if (cp->insn == NULL_RTX)
2850                 continue;
2851               if (bitmap_bit_p (&slot->spilled_regs,
2852                                 ALLOCNO_REGNO (another_allocno)))
2853                 cost += cp->freq;
2854             }
2855           if (cost > best_cost)
2856             {
2857               best_cost = cost;
2858               best_slot_num = slot_num;
2859             }
2860         cont:
2861           ;
2862         }
2863       if (best_cost >= 0)
2864         {
2865           slot_num = best_slot_num;
2866           slot = &ira_spilled_reg_stack_slots[slot_num];
2867           SET_REGNO_REG_SET (&slot->spilled_regs, regno);
2868           x = slot->mem;
2869           ALLOCNO_HARD_REGNO (allocno) = -slot_num - 2;
2870         }
2871     }
2872   if (x != NULL_RTX)
2873     {
2874       ira_assert (slot->width >= total_size);
2875       EXECUTE_IF_SET_IN_BITMAP (&slot->spilled_regs,
2876                                 FIRST_PSEUDO_REGISTER, i, bi)
2877         {
2878           ira_assert (! ira_pseudo_live_ranges_intersect_p (regno, i));
2879         }
2880       SET_REGNO_REG_SET (&slot->spilled_regs, regno);
2881       if (internal_flag_ira_verbose > 3 && ira_dump_file)
2882         {
2883           fprintf (ira_dump_file, "      Assigning %d(freq=%d) slot %d of",
2884                    regno, REG_FREQ (regno), slot_num);
2885           EXECUTE_IF_SET_IN_BITMAP (&slot->spilled_regs,
2886                                     FIRST_PSEUDO_REGISTER, i, bi)
2887             {
2888               if ((unsigned) regno != i)
2889                 fprintf (ira_dump_file, " %d", i);
2890             }
2891           fprintf (ira_dump_file, "\n");
2892         }
2893     }
2894   return x;
2895 }
2896
2897 /* This is called by reload every time a new stack slot X with
2898    TOTAL_SIZE was allocated for REGNO.  We store this info for
2899    subsequent ira_reuse_stack_slot calls.  */
2900 void
2901 ira_mark_new_stack_slot (rtx x, int regno, unsigned int total_size)
2902 {
2903   struct ira_spilled_reg_stack_slot *slot;
2904   int slot_num;
2905   ira_allocno_t allocno;
2906
2907   ira_assert (flag_ira && PSEUDO_REGNO_BYTES (regno) <= total_size);
2908   allocno = ira_regno_allocno_map[regno];
2909   slot_num = -ALLOCNO_HARD_REGNO (allocno) - 2;
2910   if (slot_num == -1)
2911     {
2912       slot_num = ira_spilled_reg_stack_slots_num++;
2913       ALLOCNO_HARD_REGNO (allocno) = -slot_num - 2;
2914     }
2915   slot = &ira_spilled_reg_stack_slots[slot_num];
2916   INIT_REG_SET (&slot->spilled_regs);
2917   SET_REGNO_REG_SET (&slot->spilled_regs, regno);
2918   slot->mem = x;
2919   slot->width = total_size;
2920   if (internal_flag_ira_verbose > 3 && ira_dump_file)
2921     fprintf (ira_dump_file, "      Assigning %d(freq=%d) a new slot %d\n",
2922              regno, REG_FREQ (regno), slot_num);
2923 }
2924
2925
2926 /* Return spill cost for pseudo-registers whose numbers are in array
2927    REGNOS (with a negative number as an end marker) for reload with
2928    given IN and OUT for INSN.  Return also number points (through
2929    EXCESS_PRESSURE_LIVE_LENGTH) where the pseudo-register lives and
2930    the register pressure is high, number of references of the
2931    pseudo-registers (through NREFS), number of callee-clobbered
2932    hard-registers occupied by the pseudo-registers (through
2933    CALL_USED_COUNT), and the first hard regno occupied by the
2934    pseudo-registers (through FIRST_HARD_REGNO).  */
2935 static int
2936 calculate_spill_cost (int *regnos, rtx in, rtx out, rtx insn,
2937                       int *excess_pressure_live_length,
2938                       int *nrefs, int *call_used_count, int *first_hard_regno)
2939 {
2940   int i, cost, regno, hard_regno, j, count, saved_cost, nregs;
2941   bool in_p, out_p;
2942   int length;
2943   ira_allocno_t a;
2944
2945   *nrefs = 0;
2946   for (length = count = cost = i = 0;; i++)
2947     {
2948       regno = regnos[i];
2949       if (regno < 0)
2950         break;
2951       *nrefs += REG_N_REFS (regno);
2952       hard_regno = reg_renumber[regno];
2953       ira_assert (hard_regno >= 0);
2954       a = ira_regno_allocno_map[regno];
2955       length += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a);
2956       cost += ALLOCNO_MEMORY_COST (a) - ALLOCNO_COVER_CLASS_COST (a);
2957       nregs = hard_regno_nregs[hard_regno][ALLOCNO_MODE (a)];
2958       for (j = 0; j < nregs; j++)
2959         if (! TEST_HARD_REG_BIT (call_used_reg_set, hard_regno + j))
2960           break;
2961       if (j == nregs)
2962         count++;
2963       in_p = in && REG_P (in) && (int) REGNO (in) == hard_regno;
2964       out_p = out && REG_P (out) && (int) REGNO (out) == hard_regno;
2965       if ((in_p || out_p)
2966           && find_regno_note (insn, REG_DEAD, hard_regno) != NULL_RTX)
2967         {
2968           saved_cost = 0;
2969           if (in_p)
2970             saved_cost += ira_memory_move_cost
2971                           [ALLOCNO_MODE (a)][ALLOCNO_COVER_CLASS (a)][1];
2972           if (out_p)
2973             saved_cost
2974               += ira_memory_move_cost
2975                  [ALLOCNO_MODE (a)][ALLOCNO_COVER_CLASS (a)][0];
2976           cost -= REG_FREQ_FROM_BB (BLOCK_FOR_INSN (insn)) * saved_cost;
2977         }
2978     }
2979   *excess_pressure_live_length = length;
2980   *call_used_count = count;
2981   hard_regno = -1;
2982   if (regnos[0] >= 0)
2983     {
2984       hard_regno = reg_renumber[regnos[0]];
2985     }
2986   *first_hard_regno = hard_regno;
2987   return cost;
2988 }
2989
2990 /* Return TRUE if spilling pseudo-registers whose numbers are in array
2991    REGNOS is better than spilling pseudo-registers with numbers in
2992    OTHER_REGNOS for reload with given IN and OUT for INSN.  The
2993    function used by the reload pass to make better register spilling
2994    decisions.  */
2995 bool
2996 ira_better_spill_reload_regno_p (int *regnos, int *other_regnos,
2997                                  rtx in, rtx out, rtx insn)
2998 {
2999   int cost, other_cost;
3000   int length, other_length;
3001   int nrefs, other_nrefs;
3002   int call_used_count, other_call_used_count;
3003   int hard_regno, other_hard_regno;
3004
3005   cost = calculate_spill_cost (regnos, in, out, insn, 
3006                                &length, &nrefs, &call_used_count, &hard_regno);
3007   other_cost = calculate_spill_cost (other_regnos, in, out, insn,
3008                                      &other_length, &other_nrefs,
3009                                      &other_call_used_count,
3010                                      &other_hard_regno);
3011   if (nrefs == 0 && other_nrefs != 0)
3012     return true;
3013   if (nrefs != 0 && other_nrefs == 0)
3014     return false;
3015   if (cost != other_cost)
3016     return cost < other_cost;
3017   if (length != other_length)
3018     return length > other_length;
3019 #ifdef REG_ALLOC_ORDER
3020   if (hard_regno >= 0 && other_hard_regno >= 0)
3021     return (inv_reg_alloc_order[hard_regno]
3022             < inv_reg_alloc_order[other_hard_regno]);
3023 #else
3024   if (call_used_count != other_call_used_count)
3025     return call_used_count > other_call_used_count;
3026 #endif
3027   return false;
3028 }
3029
3030 \f
3031
3032 /* Allocate and initialize data necessary for assign_hard_reg.  */
3033 void
3034 ira_initiate_assign (void)
3035 {
3036   sorted_allocnos
3037     = (ira_allocno_t *) ira_allocate (sizeof (ira_allocno_t)
3038                                       * ira_allocnos_num);
3039   consideration_allocno_bitmap = ira_allocate_bitmap ();
3040   initiate_cost_update ();
3041   allocno_priorities = (int *) ira_allocate (sizeof (int) * ira_allocnos_num);
3042 }
3043
3044 /* Deallocate data used by assign_hard_reg.  */
3045 void
3046 ira_finish_assign (void)
3047 {
3048   ira_free (sorted_allocnos);
3049   ira_free_bitmap (consideration_allocno_bitmap);
3050   finish_cost_update ();
3051   ira_free (allocno_priorities);
3052 }
3053
3054 \f
3055
3056 /* Entry function doing color-based register allocation.  */
3057 static void
3058 color (void)
3059 {
3060   allocno_stack_vec = VEC_alloc (ira_allocno_t, heap, ira_allocnos_num);
3061   removed_splay_allocno_vec
3062     = VEC_alloc (ira_allocno_t, heap, ira_allocnos_num);
3063   memset (allocated_hardreg_p, 0, sizeof (allocated_hardreg_p));
3064   ira_initiate_assign ();
3065   do_coloring ();
3066   ira_finish_assign ();
3067   VEC_free (ira_allocno_t, heap, removed_splay_allocno_vec);
3068   VEC_free (ira_allocno_t, heap, allocno_stack_vec);
3069   move_spill_restore ();
3070 }
3071
3072 \f
3073
3074 /* This page contains a simple register allocator without usage of
3075    allocno conflicts.  This is used for fast allocation for -O0.  */
3076
3077 /* Do register allocation by not using allocno conflicts.  It uses
3078    only allocno live ranges.  The algorithm is close to Chow's
3079    priority coloring.  */
3080 static void
3081 fast_allocation (void)
3082 {
3083   int i, j, k, num, class_size, hard_regno;
3084 #ifdef STACK_REGS
3085   bool no_stack_reg_p;
3086 #endif
3087   enum reg_class cover_class;
3088   enum machine_mode mode;
3089   ira_allocno_t a;
3090   ira_allocno_iterator ai;
3091   allocno_live_range_t r;
3092   HARD_REG_SET conflict_hard_regs, *used_hard_regs;
3093
3094   sorted_allocnos = (ira_allocno_t *) ira_allocate (sizeof (ira_allocno_t)
3095                                                     * ira_allocnos_num);
3096   num = 0;
3097   FOR_EACH_ALLOCNO (a, ai)
3098     sorted_allocnos[num++] = a;
3099   allocno_priorities = (int *) ira_allocate (sizeof (int) * ira_allocnos_num);
3100   setup_allocno_priorities (sorted_allocnos, num);
3101   used_hard_regs = (HARD_REG_SET *) ira_allocate (sizeof (HARD_REG_SET)
3102                                                   * ira_max_point);
3103   for (i = 0; i < ira_max_point; i++)
3104     CLEAR_HARD_REG_SET (used_hard_regs[i]);
3105   qsort (sorted_allocnos, ira_allocnos_num, sizeof (ira_allocno_t), 
3106          allocno_priority_compare_func);
3107   for (i = 0; i < num; i++)
3108     {
3109       a = sorted_allocnos[i];
3110       COPY_HARD_REG_SET (conflict_hard_regs, ALLOCNO_CONFLICT_HARD_REGS (a));
3111       for (r = ALLOCNO_LIVE_RANGES (a); r != NULL; r = r->next)
3112         for (j =  r->start; j <= r->finish; j++)
3113           IOR_HARD_REG_SET (conflict_hard_regs, used_hard_regs[j]);
3114       cover_class = ALLOCNO_COVER_CLASS (a);
3115       ALLOCNO_ASSIGNED_P (a) = true;
3116       ALLOCNO_HARD_REGNO (a) = -1;
3117       if (hard_reg_set_subset_p (reg_class_contents[cover_class],
3118                                  conflict_hard_regs))
3119         continue;
3120       mode = ALLOCNO_MODE (a);
3121 #ifdef STACK_REGS
3122       no_stack_reg_p = ALLOCNO_NO_STACK_REG_P (a);
3123 #endif
3124       class_size = ira_class_hard_regs_num[cover_class];
3125       for (j = 0; j < class_size; j++)
3126         {
3127           hard_regno = ira_class_hard_regs[cover_class][j];
3128 #ifdef STACK_REGS
3129           if (no_stack_reg_p && FIRST_STACK_REG <= hard_regno
3130               && hard_regno <= LAST_STACK_REG)
3131             continue;
3132 #endif
3133           if (!ira_hard_reg_not_in_set_p (hard_regno, mode, conflict_hard_regs)
3134               || (TEST_HARD_REG_BIT
3135                   (prohibited_class_mode_regs[cover_class][mode], hard_regno)))
3136             continue;
3137           ALLOCNO_HARD_REGNO (a) = hard_regno;
3138           for (r = ALLOCNO_LIVE_RANGES (a); r != NULL; r = r->next)
3139             for (k = r->start; k <= r->finish; k++)
3140               IOR_HARD_REG_SET (used_hard_regs[k],
3141                                 ira_reg_mode_hard_regset[hard_regno][mode]);
3142           break;
3143         }
3144     }
3145   ira_free (sorted_allocnos);
3146   ira_free (used_hard_regs);
3147   ira_free (allocno_priorities);
3148   if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
3149     ira_print_disposition (ira_dump_file);
3150 }
3151
3152 \f
3153
3154 /* Entry function doing coloring.  */
3155 void
3156 ira_color (void)
3157 {
3158   ira_allocno_t a;
3159   ira_allocno_iterator ai;
3160
3161   /* Setup updated costs.  */
3162   FOR_EACH_ALLOCNO (a, ai)
3163     {
3164       ALLOCNO_UPDATED_MEMORY_COST (a) = ALLOCNO_MEMORY_COST (a);
3165       ALLOCNO_UPDATED_COVER_CLASS_COST (a) = ALLOCNO_COVER_CLASS_COST (a);
3166     }
3167   if (optimize)
3168     color ();
3169   else
3170     fast_allocation ();
3171 }