2007-03-16 Vladimir Makarov <vmakarov@redhat.com>
[official-gcc.git] / gcc / ira-color.c
blobd18139dfaebb8928955137d097c50337a437e437
1 /* IRA allocation based on graph coloring.
2 Copyright (C) 2006, 2007
3 Free Software Foundation, Inc.
4 Contributed by Vladimir Makarov <vmakarov@redhat.com>.
6 This file is part of GCC.
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 2, or (at your option) any later
11 version.
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.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA. */
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "rtl.h"
28 #include "tm_p.h"
29 #include "target.h"
30 #include "varray.h"
31 #include "regs.h"
32 #include "flags.h"
33 #include "sbitmap.h"
34 #include "bitmap.h"
35 #include "hard-reg-set.h"
36 #include "basic-block.h"
37 #include "expr.h"
38 #include "toplev.h"
39 #include "reload.h"
40 #include "params.h"
41 #include "df.h"
42 #include "ira-int.h"
44 /* We use optimistic colouring with optional biased colouring. */
46 static void update_copy_costs (pseudo_t, int);
47 static int assign_hard_reg (pseudo_t, int);
49 static void add_pseudo_to_bucket (pseudo_t, pseudo_t *);
50 static void add_pseudo_to_ordered_bucket (pseudo_t, pseudo_t *);
51 static void delete_pseudo_from_bucket (pseudo_t, pseudo_t *);
52 static void push_pseudo_to_stack (pseudo_t);
53 static void remove_pseudo_from_bucket_and_push (pseudo_t, int);
54 static void push_only_colorable (void);
55 static void push_pseudo_to_spill (pseudo_t);
56 static int loop_edge_freq (struct ira_loop_tree_node *, int, int);
57 static int calculate_pseudo_spill_cost (pseudo_t);
58 static void push_pseudos_to_stack (void);
59 static void pop_pseudos_from_stack (void);
60 static void put_pseudo_into_bucket (pseudo_t);
61 static void color_pseudos (void);
63 static void print_loop_title (struct ira_loop_tree_node *);
64 static void color_pass (struct ira_loop_tree_node *);
65 static int pseudo_priority_compare_func (const void *, const void *);
66 static void priority_coloring (void);
67 static void do_coloring (void);
69 static void move_spill_restore (void);
71 static void update_pseudo_avaialable_regs (void);
73 /* Bitmap of pseudos which should be colored. */
74 static bitmap coloring_pseudo_bitmap;
76 /* Bitmap of pseudos which should be taken into account during
77 coloring. In general case it contains pseudos from
78 coloring_pseudo_bitmap plus other already colored conflicting
79 pseudos. */
80 static bitmap consideration_pseudo_bitmap;
84 /* This page contains function to choose hard register for pseudos. */
86 /* Array whose element value is TRUE if the corresponding hard
87 register already allocated for a pseudo. */
88 static int allocated_hardreg_p [FIRST_PSEUDO_REGISTER];
90 /* The function updates costs (decrease if DECR_P) of the pseudos
91 connected by copies with PSEUDO. */
92 static void
93 update_copy_costs (pseudo_t pseudo, int decr_p)
95 int i, hard_regno, cost;
96 enum machine_mode mode;
97 enum reg_class class;
98 pseudo_t another_pseudo;
99 struct pseudo_copy *cp, *next_cp;
101 if (PSEUDO_COVER_CLASS (pseudo) == NO_REGS)
102 return;
103 hard_regno = PSEUDO_HARD_REGNO (pseudo);
104 ira_assert (hard_regno >= 0 && PSEUDO_COVER_CLASS (pseudo) != NO_REGS);
105 i = class_hard_reg_index [PSEUDO_COVER_CLASS (pseudo)] [hard_regno];
106 ira_assert (i >= 0);
107 class = REGNO_REG_CLASS (hard_regno);
108 mode = PSEUDO_MODE (pseudo);
109 for (cp = PSEUDO_COPIES (pseudo); cp != NULL; cp = next_cp)
111 if (cp->first == pseudo)
113 next_cp = cp->next_first_pseudo_copy;
114 another_pseudo = cp->second;
116 else if (cp->second == pseudo)
118 next_cp = cp->next_second_pseudo_copy;
119 another_pseudo = cp->first;
121 else
122 gcc_unreachable ();
123 if (PSEUDO_COVER_CLASS (pseudo) != PSEUDO_COVER_CLASS (another_pseudo))
124 continue;
125 cost = (cp->second == pseudo
126 ? register_move_cost [mode] [class]
127 [PSEUDO_COVER_CLASS (another_pseudo)]
128 : register_move_cost [mode] [PSEUDO_COVER_CLASS (another_pseudo)]
129 [class]);
130 if (decr_p)
131 cost = -cost;
132 PSEUDO_CURR_HARD_REG_COSTS (another_pseudo) [i] += cp->freq * cost;
133 PSEUDO_CURR_CONFLICT_HARD_REG_COSTS (another_pseudo) [i]
134 += cp->freq * cost;
138 /* Function choosing a hard register for PSEUDO. If RETRY_P is
139 nonzero, it means that the function called from
140 `retry_ira_color'. */
141 static int
142 assign_hard_reg (pseudo_t pseudo, int retry_p)
144 HARD_REG_SET conflicting_regs, biased_regs;
145 int i, j, hard_regno, best_hard_regno, class_size;
146 int cost, mem_cost, min_cost, full_cost, min_full_cost, add_cost, *costs;
147 int *conflict_costs;
148 enum reg_class cover_class, class;
149 enum machine_mode mode;
150 pseudo_t conflict_pseudo, conflict_pseudo2;
151 pseudo_t *pseudo_vec, *pseudo_vec2;
152 pseudo_t another_pseudo;
153 struct pseudo_copy *cp, *next_cp;
154 static int full_costs [FIRST_PSEUDO_REGISTER];
156 ira_assert (! PSEUDO_ASSIGNED_P (pseudo));
157 cover_class = PSEUDO_COVER_CLASS (pseudo);
158 class_size = class_hard_regs_num [cover_class];
159 CLEAR_HARD_REG_SET (biased_regs);
160 memset (full_costs, 0, sizeof (int) * class_size);
161 mem_cost = PSEUDO_MEMORY_COST (pseudo);
162 mode = PSEUDO_MODE (pseudo);
163 costs = PSEUDO_CURR_HARD_REG_COSTS (pseudo);
164 memcpy (full_costs, costs, sizeof (int) * class_size);
165 COPY_HARD_REG_SET (conflicting_regs, PSEUDO_CONFLICT_HARD_REGS (pseudo));
166 pseudo_vec = PSEUDO_CONFLICT_PSEUDO_VEC (pseudo);
167 best_hard_regno = -1;
168 IOR_HARD_REG_SET (conflicting_regs, no_alloc_regs);
169 IOR_COMPL_HARD_REG_SET (conflicting_regs, reg_class_contents [cover_class]);
170 for (i = 0; (conflict_pseudo = pseudo_vec [i]) != NULL; i++)
171 /* Reload can give another class so we need to check all
172 pseudos. */
173 if (retry_p
174 || (cover_class == PSEUDO_COVER_CLASS (conflict_pseudo)
175 && bitmap_bit_p (consideration_pseudo_bitmap,
176 PSEUDO_NUM (conflict_pseudo))))
178 if (PSEUDO_ASSIGNED_P (conflict_pseudo))
180 if ((hard_regno = PSEUDO_HARD_REGNO (conflict_pseudo)) >= 0)
182 IOR_HARD_REG_SET
183 (conflicting_regs,
184 reg_mode_hard_regset
185 [hard_regno] [PSEUDO_MODE (conflict_pseudo)]);
186 GO_IF_HARD_REG_SUBSET (reg_class_contents [cover_class],
187 conflicting_regs, fail);
189 continue;
191 else if (! PSEUDO_MAY_BE_SPILLED_P (conflict_pseudo))
193 conflict_costs
194 = PSEUDO_CURR_CONFLICT_HARD_REG_COSTS (conflict_pseudo);
195 if (conflict_costs != NULL)
196 for (j = class_size - 1; j >= 0; j--)
197 full_costs [j] -= conflict_costs [j];
199 if (retry_p || ! flag_ira_biased_coloring)
200 continue;
201 pseudo_vec2 = PSEUDO_CONFLICT_PSEUDO_VEC (conflict_pseudo);
202 for (j = 0; (conflict_pseudo2 = pseudo_vec2 [j]) != NULL; j++)
203 if (cover_class == PSEUDO_COVER_CLASS (conflict_pseudo2)
204 && PSEUDO_ASSIGNED_P (conflict_pseudo2)
205 && (hard_regno = PSEUDO_HARD_REGNO (conflict_pseudo2)) >= 0
206 && (retry_p
207 || bitmap_bit_p (consideration_pseudo_bitmap,
208 PSEUDO_NUM (conflict_pseudo2))))
209 IOR_HARD_REG_SET (biased_regs,
210 reg_mode_hard_regset
211 [hard_regno] [PSEUDO_MODE (conflict_pseudo2)]);
213 for (cp = PSEUDO_COPIES (pseudo); cp != NULL; cp = next_cp)
215 if (cp->first == pseudo)
217 next_cp = cp->next_first_pseudo_copy;
218 another_pseudo = cp->second;
220 else if (cp->second == pseudo)
222 next_cp = cp->next_second_pseudo_copy;
223 another_pseudo = cp->first;
225 else
226 gcc_unreachable ();
227 if (cover_class != PSEUDO_COVER_CLASS (another_pseudo)
228 || PSEUDO_ASSIGNED_P (another_pseudo))
229 continue;
230 conflict_costs = PSEUDO_CURR_CONFLICT_HARD_REG_COSTS (another_pseudo);
231 if (conflict_costs != NULL
232 && ! PSEUDO_MAY_BE_SPILLED_P (another_pseudo))
233 for (j = class_size - 1; j >= 0; j--)
234 full_costs [j] += conflict_costs [j];
236 min_cost = min_full_cost = INT_MAX;
237 /* We don't care about giving callee saved registers to pseudos no
238 living through calls because call used register are allocated
239 first (it is usual practice to put them first in
240 REG_ALLOC_ORDER). */
241 for (i = 0; i < class_size; i++)
243 hard_regno = class_hard_regs [cover_class] [i];
244 #ifdef STACK_REGS
245 if (PSEUDO_NO_STACK_REG_P (pseudo)
246 && FIRST_STACK_REG <= hard_regno && hard_regno <= LAST_STACK_REG)
247 continue;
248 #endif
249 if (TEST_HARD_REG_BIT (prohibited_class_mode_regs
250 [cover_class] [mode], hard_regno))
251 continue;
252 if (hard_reg_not_in_set_p (hard_regno, mode, conflicting_regs))
254 cost = costs [i];
255 full_cost = full_costs [i];
256 if (! allocated_hardreg_p [hard_regno]
257 && hard_reg_not_in_set_p (hard_regno, mode, call_used_reg_set))
258 /* We need to save/restore the register in
259 epilogue/prologue. Therefore we increase the cost. */
261 /* ??? If only part is call clobbered. */
262 class = REGNO_REG_CLASS (hard_regno);
263 add_cost = (memory_move_cost [mode] [class] [0]
264 + memory_move_cost [mode] [class] [1] - 1);
265 cost += add_cost;
266 full_cost += add_cost;
268 if (min_cost > cost)
269 min_cost = cost;
270 if (min_full_cost > full_cost)
272 min_full_cost = full_cost;
273 best_hard_regno = hard_regno;
274 ira_assert (hard_regno >= 0);
276 else if (min_full_cost == full_cost && flag_ira_biased_coloring != 0
277 && TEST_HARD_REG_BIT (biased_regs, hard_regno)
278 && ! TEST_HARD_REG_BIT (biased_regs, best_hard_regno))
279 best_hard_regno = hard_regno;
282 if (min_cost > mem_cost)
283 best_hard_regno = -1;
284 fail:
285 PSEUDO_HARD_REGNO (pseudo) = best_hard_regno;
286 PSEUDO_ASSIGNED_P (pseudo) = TRUE;
287 if (best_hard_regno >= 0)
289 allocated_hardreg_p [best_hard_regno] = TRUE;
290 update_copy_costs (pseudo, TRUE);
292 return best_hard_regno >= 0;
297 /* This page contains allocator based on Chaitin algorithm. */
299 /* Bucket of pseudos pseudo be colored currently without spilling. */
300 static pseudo_t colorable_pseudo_bucket;
302 /* Bucket of pseudos pseudo might be not colored currently without
303 spilling. */
304 static pseudo_t uncolorable_pseudo_bucket;
306 /* Add PSEUDO to *BUCKET_PTR bucket. PSEUDO should be not in a bucket
307 before the call. */
308 static void
309 add_pseudo_to_bucket (pseudo_t pseudo, pseudo_t *bucket_ptr)
311 pseudo_t first_pseudo;
313 first_pseudo = *bucket_ptr;
314 PSEUDO_NEXT_BUCKET_PSEUDO (pseudo) = first_pseudo;
315 PSEUDO_PREV_BUCKET_PSEUDO (pseudo) = NULL;
316 if (first_pseudo != NULL)
317 PSEUDO_PREV_BUCKET_PSEUDO (first_pseudo) = pseudo;
318 *bucket_ptr = pseudo;
321 /* Add PSEUDO to *BUCKET_PTR bucket maintaining the order according
322 their frequency. PSEUDO should be not in a bucket before the
323 call. */
324 static void
325 add_pseudo_to_ordered_bucket (pseudo_t pseudo, pseudo_t *bucket_ptr)
327 pseudo_t before, after;
328 enum reg_class cover_class;
329 int freq, nregs;
331 freq = PSEUDO_FREQ (pseudo);
332 cover_class = PSEUDO_COVER_CLASS (pseudo);
333 nregs = reg_class_nregs [cover_class] [PSEUDO_MODE (pseudo)];
334 for (before = *bucket_ptr, after = NULL;
335 before != NULL;
336 after = before, before = PSEUDO_NEXT_BUCKET_PSEUDO (before))
337 if (PSEUDO_FREQ (before) > freq)
338 break;
339 PSEUDO_NEXT_BUCKET_PSEUDO (pseudo) = before;
340 PSEUDO_PREV_BUCKET_PSEUDO (pseudo) = after;
341 if (after == NULL)
342 *bucket_ptr = pseudo;
343 else
344 PSEUDO_NEXT_BUCKET_PSEUDO (after) = pseudo;
345 if (before != NULL)
346 PSEUDO_PREV_BUCKET_PSEUDO (before) = pseudo;
349 /* Delete PSEUDO from *BUCKET_PTR bucket. It should be there before
350 the call. */
351 static void
352 delete_pseudo_from_bucket (pseudo_t pseudo, pseudo_t *bucket_ptr)
354 pseudo_t prev_pseudo, next_pseudo;
356 prev_pseudo = PSEUDO_PREV_BUCKET_PSEUDO (pseudo);
357 next_pseudo = PSEUDO_NEXT_BUCKET_PSEUDO (pseudo);
358 if (prev_pseudo != NULL)
359 PSEUDO_NEXT_BUCKET_PSEUDO (prev_pseudo) = next_pseudo;
360 else
362 ira_assert (*bucket_ptr == pseudo);
363 *bucket_ptr = next_pseudo;
365 if (next_pseudo != NULL)
366 PSEUDO_PREV_BUCKET_PSEUDO (next_pseudo) = prev_pseudo;
369 /* Varray representing the stack of pseudos used during coloring. */
370 static varray_type pseudo_stack_varray;
372 /* The function puts PSEUDO onto the coloring stack without removing
373 it from the bucket. Such action can result in moving conflicting
374 pseudos from the uncolorable bucket to the colorable one. */
375 static void
376 push_pseudo_to_stack (pseudo_t pseudo)
378 int i, conflicts_num, conflict_size, size;
379 pseudo_t conflict_pseudo;
380 pseudo_t *pseudo_vec;
381 enum reg_class cover_class;
383 PSEUDO_IN_GRAPH_P (pseudo) = FALSE;
384 VARRAY_PUSH_GENERIC_PTR (pseudo_stack_varray, pseudo);
385 cover_class = PSEUDO_COVER_CLASS (pseudo);
386 if (cover_class == NO_REGS)
387 return;
388 size = reg_class_nregs [cover_class] [PSEUDO_MODE (pseudo)];
389 pseudo_vec = PSEUDO_CONFLICT_PSEUDO_VEC (pseudo);
390 for (i = 0; (conflict_pseudo = pseudo_vec [i]) != NULL; i++)
391 if (cover_class == PSEUDO_COVER_CLASS (conflict_pseudo)
392 && bitmap_bit_p (coloring_pseudo_bitmap, PSEUDO_NUM (conflict_pseudo)))
394 if (PSEUDO_IN_GRAPH_P (conflict_pseudo)
395 && ! PSEUDO_ASSIGNED_P (conflict_pseudo))
397 conflicts_num = PSEUDO_LEFT_CONFLICTS_NUM (conflict_pseudo);
398 conflict_size
399 = (reg_class_nregs
400 [cover_class] [PSEUDO_MODE (conflict_pseudo)]);
401 ira_assert
402 (PSEUDO_LEFT_CONFLICTS_NUM (conflict_pseudo) >= size);
403 PSEUDO_LEFT_CONFLICTS_NUM (conflict_pseudo) -= size;
404 if (conflicts_num + conflict_size
405 <= PSEUDO_AVAILABLE_REGS_NUM (conflict_pseudo))
406 continue;
407 conflicts_num = PSEUDO_LEFT_CONFLICTS_NUM (conflict_pseudo);
408 if (conflicts_num + conflict_size
409 <= PSEUDO_AVAILABLE_REGS_NUM (conflict_pseudo))
411 delete_pseudo_from_bucket
412 (conflict_pseudo, &uncolorable_pseudo_bucket);
413 add_pseudo_to_ordered_bucket (conflict_pseudo,
414 &colorable_pseudo_bucket);
420 /* The function puts PSEUDO onto the coloring stack and removes it
421 from the bucket. The pseudo is in the colorable bucket if
422 COLORABLE_P is nonzero. */
423 static void
424 remove_pseudo_from_bucket_and_push (pseudo_t pseudo, int colorable_p)
426 enum reg_class cover_class;
427 pseudo_t *bucket_ptr;
429 bucket_ptr = (colorable_p
430 ? &colorable_pseudo_bucket : &uncolorable_pseudo_bucket);
431 delete_pseudo_from_bucket (pseudo, bucket_ptr);
432 if (ira_dump_file != NULL)
434 fprintf (ira_dump_file, " Pushing");
435 print_expanded_pseudo (pseudo);
436 fprintf (ira_dump_file, "%s\n", colorable_p ? "" : "(potential spill)");
438 cover_class = PSEUDO_COVER_CLASS (pseudo);
439 ira_assert ((colorable_p
440 && (PSEUDO_LEFT_CONFLICTS_NUM (pseudo)
441 + reg_class_nregs [cover_class] [PSEUDO_MODE (pseudo)]
442 <= PSEUDO_AVAILABLE_REGS_NUM (pseudo)))
443 || (! colorable_p
444 && (PSEUDO_LEFT_CONFLICTS_NUM (pseudo)
445 + reg_class_nregs [cover_class] [PSEUDO_MODE (pseudo)]
446 > PSEUDO_AVAILABLE_REGS_NUM (pseudo))));
447 if (! colorable_p)
448 PSEUDO_MAY_BE_SPILLED_P (pseudo) = TRUE;
449 push_pseudo_to_stack (pseudo);
452 /* The function puts all pseudos from colorable bucket onto the
453 coloring stack. */
454 static void
455 push_only_colorable (void)
457 for (;colorable_pseudo_bucket != NULL;)
458 remove_pseudo_from_bucket_and_push (colorable_pseudo_bucket, TRUE);
461 /* The function puts PSEUDO chosen for potential spilling onto the
462 coloring stack. */
463 static void
464 push_pseudo_to_spill (pseudo_t pseudo)
466 delete_pseudo_from_bucket (pseudo, &uncolorable_pseudo_bucket);
467 PSEUDO_MAY_BE_SPILLED_P (pseudo) = TRUE;
468 if (ira_dump_file != NULL)
469 fprintf (ira_dump_file, " Pushing p%d(%d) (potential spill)\n",
470 PSEUDO_NUM (pseudo), PSEUDO_REGNO (pseudo));
471 push_pseudo_to_stack (pseudo);
474 /* The function returns frequency of exit edges (if EXIT_P) or enter
475 from/to the loop given by its LOOP_NODE. */
476 static int
477 loop_edge_freq (struct ira_loop_tree_node *loop_node, int regno, int exit_p)
479 int freq, i;
480 edge_iterator ei;
481 edge e;
482 VEC (edge, heap) *edges;
484 ira_assert (loop_node->loop != NULL
485 && (regno < 0 || regno >= FIRST_PSEUDO_REGISTER));
486 freq = 0;
487 if (! exit_p)
489 FOR_EACH_EDGE (e, ei, loop_node->loop->header->preds)
490 if (e->src != loop_node->loop->latch
491 && (regno < 0
492 || (bitmap_bit_p (DF_UPWARD_LIVE_OUT (build_df, e->src), regno)
493 && bitmap_bit_p (DF_UPWARD_LIVE_IN (build_df, e->dest),
494 regno))))
495 freq += EDGE_FREQUENCY (e);
497 else
499 edges = get_loop_exit_edges (loop_node->loop);
500 for (i = 0; VEC_iterate (edge, edges, i, e); i++)
501 if (regno < 0
502 || (bitmap_bit_p (DF_UPWARD_LIVE_OUT (build_df, e->src), regno)
503 && bitmap_bit_p (DF_UPWARD_LIVE_IN (build_df, e->dest),
504 regno)))
505 freq += EDGE_FREQUENCY (e);
506 VEC_free (edge, heap, edges);
509 return REG_FREQ_FROM_EDGE_FREQ (freq);
512 /* The function calculates and returns cost of putting pseudo P into
513 memory. */
514 static int
515 calculate_pseudo_spill_cost (pseudo_t p)
517 int regno, cost;
518 enum machine_mode mode;
519 enum reg_class class;
520 pseudo_t father_pseudo;
521 struct ira_loop_tree_node *father_node, *loop_node;
523 regno = PSEUDO_REGNO (p);
524 cost = PSEUDO_MEMORY_COST (p) - PSEUDO_COVER_CLASS_COST (p);
525 if (PSEUDO_CAP (p) != NULL)
526 return cost;
527 loop_node = PSEUDO_LOOP_TREE_NODE (p);
528 if ((father_node = loop_node->father) == NULL)
529 return cost;
530 if ((father_pseudo = father_node->regno_pseudo_map [regno]) == NULL)
531 return cost;
532 mode = PSEUDO_MODE (p);
533 class = PSEUDO_COVER_CLASS (p);
534 if (PSEUDO_HARD_REGNO (father_pseudo) < 0)
535 cost -= (memory_move_cost [mode] [class] [0]
536 * loop_edge_freq (loop_node, regno, TRUE)
537 + memory_move_cost [mode] [class] [1]
538 * loop_edge_freq (loop_node, regno, FALSE));
539 else
540 cost += ((memory_move_cost [mode] [class] [1]
541 * loop_edge_freq (loop_node, regno, TRUE)
542 + memory_move_cost [mode] [class] [0]
543 * loop_edge_freq (loop_node, regno, FALSE))
544 - (register_move_cost [mode] [class] [class]
545 * (loop_edge_freq (loop_node, regno, FALSE)
546 + loop_edge_freq (loop_node, regno, TRUE))));
547 return cost;
550 /* All pseudos sorted accoring their priorities. */
551 static pseudo_t *sorted_pseudos;
553 /* Push pseudos on the coloring stack. The order of pseudos in the
554 stack defines the order for the subsequent coloring. */
555 static void
556 push_pseudos_to_stack (void)
558 int i, j;
559 double pseudo_pri, i_pseudo_pri;
560 pseudo_t pseudo, i_pseudo;
561 pseudo_t *pseudo_vec;
562 enum reg_class cover_class;
563 int num, cover_class_pseudos_num [N_REG_CLASSES];
564 pseudo_t *cover_class_pseudos [N_REG_CLASSES];
566 /* Initialize. */
567 for (i = 0; i < reg_class_cover_size; i++)
569 cover_class = reg_class_cover [i];
570 cover_class_pseudos_num [cover_class] = 0;
571 cover_class_pseudos [cover_class] = NULL;
573 /* Calculate uncolorable pseudos of each cover class. */
574 for (pseudo = uncolorable_pseudo_bucket;
575 pseudo != NULL;
576 pseudo = PSEUDO_NEXT_BUCKET_PSEUDO (pseudo))
577 if ((cover_class = PSEUDO_COVER_CLASS (pseudo)) != NO_REGS)
579 cover_class_pseudos_num [cover_class]++;
580 PSEUDO_TEMP (pseudo) = INT_MAX;
582 /* Define place where to put uncolorable pseudos of the same cover
583 class. */
584 for (num = i = 0; i < reg_class_cover_size; i++)
586 cover_class = reg_class_cover [i];
587 if (cover_class_pseudos_num [cover_class] != 0)
589 cover_class_pseudos [cover_class] = sorted_pseudos + num;
590 num += cover_class_pseudos_num [cover_class];
591 cover_class_pseudos_num [cover_class] = 0;
594 ira_assert (num <= pseudos_num);
595 /* Put uncolorable pseudos of the same cover class together. */
596 for (pseudo = uncolorable_pseudo_bucket;
597 pseudo != NULL;
598 pseudo = PSEUDO_NEXT_BUCKET_PSEUDO (pseudo))
599 if ((cover_class = PSEUDO_COVER_CLASS (pseudo)) != NO_REGS)
600 cover_class_pseudos
601 [cover_class] [cover_class_pseudos_num [cover_class]++] = pseudo;
602 for (;;)
604 push_only_colorable ();
605 pseudo = uncolorable_pseudo_bucket;
606 if (pseudo == NULL)
607 break;
608 cover_class = PSEUDO_COVER_CLASS (pseudo);
609 if (cover_class == NO_REGS)
611 push_pseudo_to_spill (pseudo);
612 continue;
614 /* Potential spilling. */
615 ira_assert (reg_class_nregs [cover_class] [PSEUDO_MODE (pseudo)] > 0);
616 num = cover_class_pseudos_num [cover_class];
617 ira_assert (num > 0);
618 pseudo_vec = cover_class_pseudos [cover_class];
619 pseudo = NULL;
620 pseudo_pri = 0;
621 /* Sort uncolorable pseudo to find the one with the lowest spill
622 cost. */
623 for (i = 0, j = num - 1; i <= j;)
625 i_pseudo = pseudo_vec [i];
626 if (! PSEUDO_IN_GRAPH_P (i_pseudo)
627 && PSEUDO_IN_GRAPH_P (pseudo_vec [j]))
629 i_pseudo = pseudo_vec [j];
630 pseudo_vec [j] = pseudo_vec [i];
631 pseudo_vec [i] = i_pseudo;
633 if (PSEUDO_IN_GRAPH_P (i_pseudo))
635 i++;
636 if (PSEUDO_TEMP (i_pseudo) == INT_MAX)
637 PSEUDO_TEMP (i_pseudo)
638 = calculate_pseudo_spill_cost (i_pseudo);
639 i_pseudo_pri
640 = ((double) PSEUDO_TEMP (i_pseudo)
641 / (PSEUDO_LEFT_CONFLICTS_NUM (i_pseudo)
642 * reg_class_nregs [PSEUDO_COVER_CLASS (i_pseudo)]
643 [PSEUDO_MODE (i_pseudo)] + 1));
644 if (pseudo == NULL || pseudo_pri > i_pseudo_pri
645 || (pseudo_pri == i_pseudo_pri
646 && (PSEUDO_NUM (pseudo) > PSEUDO_NUM (i_pseudo))))
648 pseudo = i_pseudo;
649 pseudo_pri = i_pseudo_pri;
652 if (! PSEUDO_IN_GRAPH_P (pseudo_vec [j]))
653 j--;
655 ira_assert (pseudo != NULL && j >= 0);
656 cover_class_pseudos_num [cover_class] = j + 1;
657 ira_assert (PSEUDO_IN_GRAPH_P (pseudo)
658 && PSEUDO_COVER_CLASS (pseudo) == cover_class
659 && (PSEUDO_LEFT_CONFLICTS_NUM (pseudo)
660 + reg_class_nregs [cover_class] [PSEUDO_MODE (pseudo)]
661 > PSEUDO_AVAILABLE_REGS_NUM (pseudo)));
662 remove_pseudo_from_bucket_and_push (pseudo, FALSE);
666 /* Assign hard registers to pseudos on the coloring stack. */
667 static void
668 pop_pseudos_from_stack (void)
670 pseudo_t pseudo;
671 enum reg_class cover_class;
673 for (;VARRAY_ACTIVE_SIZE (pseudo_stack_varray) != 0;)
675 pseudo = VARRAY_TOP_GENERIC_PTR (pseudo_stack_varray);
676 VARRAY_POP (pseudo_stack_varray);
677 cover_class = PSEUDO_COVER_CLASS (pseudo);
678 if (ira_dump_file != NULL)
680 fprintf (ira_dump_file, " Popping");
681 print_expanded_pseudo (pseudo);
682 fprintf (ira_dump_file, " -- ");
684 if (cover_class == NO_REGS)
686 PSEUDO_HARD_REGNO (pseudo) = -1;
687 PSEUDO_ASSIGNED_P (pseudo) = TRUE;
688 if (ira_dump_file != NULL)
689 fprintf (ira_dump_file, "assign memory\n");
691 else if (assign_hard_reg (pseudo, FALSE))
693 if (ira_dump_file != NULL)
694 fprintf (ira_dump_file, "assign reg %d\n",
695 PSEUDO_HARD_REGNO (pseudo));
697 else
699 if (ira_dump_file != NULL)
700 fprintf (ira_dump_file, "spill\n");
702 PSEUDO_IN_GRAPH_P (pseudo) = TRUE;
706 /* The function put PSEUDO in a bucket corresponding to its number and
707 size of its conflicting pseudos and hard registers. */
708 static void
709 put_pseudo_into_bucket (pseudo_t pseudo)
711 int i, hard_regno, conflict_pseudos_size, hard_regs_num;
712 pseudo_t conflict_pseudo;
713 pseudo_t *pseudo_vec;
714 enum reg_class cover_class;
715 HARD_REG_SET temp_set;
717 cover_class = PSEUDO_COVER_CLASS (pseudo);
718 hard_regs_num = class_hard_regs_num [cover_class];
719 if (hard_regs_num != 0)
721 memcpy (PSEUDO_CURR_HARD_REG_COSTS (pseudo),
722 PSEUDO_HARD_REG_COSTS (pseudo), sizeof (int) * hard_regs_num);
723 memcpy (PSEUDO_CURR_CONFLICT_HARD_REG_COSTS (pseudo),
724 PSEUDO_CONFLICT_HARD_REG_COSTS (pseudo),
725 sizeof (int) * hard_regs_num);
727 COPY_HARD_REG_SET (temp_set, PSEUDO_CONFLICT_HARD_REGS (pseudo));
728 AND_HARD_REG_SET (temp_set, reg_class_contents [cover_class]);
729 AND_COMPL_HARD_REG_SET (temp_set, no_alloc_regs);
730 conflict_pseudos_size = 0;
731 GO_IF_HARD_REG_EQUAL (temp_set, zero_hard_reg_set, skip);
732 for (i = 0; i < (int) hard_regs_num; i++)
734 hard_regno = class_hard_regs [cover_class] [i];
735 if (TEST_HARD_REG_BIT (temp_set, hard_regno))
737 conflict_pseudos_size++;
738 CLEAR_HARD_REG_BIT (temp_set, hard_regno);
739 GO_IF_HARD_REG_EQUAL (temp_set, zero_hard_reg_set, skip);
742 skip:
743 pseudo_vec = PSEUDO_CONFLICT_PSEUDO_VEC (pseudo);
744 CLEAR_HARD_REG_SET (temp_set);
745 if (cover_class != NO_REGS)
746 for (i = 0; (conflict_pseudo = pseudo_vec [i]) != NULL; i++)
747 if (cover_class == PSEUDO_COVER_CLASS (conflict_pseudo)
748 && bitmap_bit_p (consideration_pseudo_bitmap,
749 PSEUDO_NUM (conflict_pseudo)))
751 if (! PSEUDO_ASSIGNED_P (conflict_pseudo))
752 conflict_pseudos_size
753 += reg_class_nregs [cover_class] [PSEUDO_MODE (conflict_pseudo)];
754 else if ((hard_regno = PSEUDO_HARD_REGNO (conflict_pseudo)) >= 0)
756 int last = (hard_regno
757 + hard_regno_nregs
758 [hard_regno] [PSEUDO_MODE (conflict_pseudo)]);
760 while (hard_regno < last)
762 if (! TEST_HARD_REG_BIT (temp_set, hard_regno))
764 conflict_pseudos_size++;
765 SET_HARD_REG_BIT (temp_set, hard_regno);
767 hard_regno++;
771 PSEUDO_IN_GRAPH_P (pseudo) = TRUE;
772 PSEUDO_LEFT_CONFLICTS_NUM (pseudo) = conflict_pseudos_size;
773 if (conflict_pseudos_size
774 + reg_class_nregs [cover_class] [PSEUDO_MODE (pseudo)]
775 <= PSEUDO_AVAILABLE_REGS_NUM (pseudo))
776 add_pseudo_to_ordered_bucket (pseudo, &colorable_pseudo_bucket);
777 else
778 add_pseudo_to_bucket (pseudo, &uncolorable_pseudo_bucket);
781 /* Function implements Chaitin-Briggs coloring for pseudos in
782 COLORING_PSEUDO_BITMAP taking into account pseudos in
783 CONSIDERATION_PSEUDO_BITMAP. */
784 static void
785 color_pseudos (void)
787 unsigned int i;
788 bitmap_iterator bi;
790 /* Put the pseudos into the corresponding buckets. */
791 colorable_pseudo_bucket = NULL;
792 uncolorable_pseudo_bucket = NULL;
793 EXECUTE_IF_SET_IN_BITMAP (coloring_pseudo_bitmap, 0, i, bi)
794 put_pseudo_into_bucket (pseudos [i]);
795 push_pseudos_to_stack ();
796 pop_pseudos_from_stack ();
801 /* The function outputs information about the loop given by its
802 LOOP_TREE_NODE. */
803 static void
804 print_loop_title (struct ira_loop_tree_node *loop_tree_node)
806 unsigned int j;
807 bitmap_iterator bi;
809 ira_assert (loop_tree_node->loop != NULL);
810 fprintf (ira_dump_file,
811 "\n Loop %d (father %d, header bb%d, depth %d)\n ref:",
812 loop_tree_node->loop->num,
813 (loop_tree_node->father == NULL
814 ? -1 : loop_tree_node->father->loop->num),
815 loop_tree_node->loop->header->index,
816 loop_tree_node->loop->depth);
817 EXECUTE_IF_SET_IN_BITMAP (loop_tree_node->mentioned_pseudos, 0, j, bi)
818 fprintf (ira_dump_file, " %dr%d", j, PSEUDO_REGNO (pseudos [j]));
819 fprintf (ira_dump_file, "\n modified regnos:");
820 EXECUTE_IF_SET_IN_BITMAP (loop_tree_node->modified_regnos, 0, j, bi)
821 fprintf (ira_dump_file, " %d", j);
822 fprintf (ira_dump_file, "\n border:");
823 EXECUTE_IF_SET_IN_BITMAP (loop_tree_node->border_pseudos, 0, j, bi)
824 fprintf (ira_dump_file, " %dr%d", j, PSEUDO_REGNO (pseudos [j]));
825 fprintf (ira_dump_file, "\n Pressure:");
826 for (j = 0; (int) j < reg_class_cover_size; j++)
828 enum reg_class cover_class;
830 cover_class = reg_class_cover [j];
831 if (loop_tree_node->reg_pressure [cover_class] == 0)
832 continue;
833 fprintf (ira_dump_file, " %s=%d", reg_class_names [cover_class],
834 loop_tree_node->reg_pressure [cover_class]);
836 fprintf (ira_dump_file, "\n");
839 /* The function implements Chaitin-Briggs coloring for pseudos inside
840 loop (in extreme case it can be all function) given by the
841 corresponding LOOP_TREE_NODE. */
842 static void
843 color_pass (struct ira_loop_tree_node *loop_tree_node)
845 int regno, hard_regno, index = -1;
846 int cost, exit_freq, enter_freq;
847 unsigned int j;
848 bitmap_iterator bi;
849 enum machine_mode mode;
850 enum reg_class class;
851 pseudo_t p, subloop_pseudo;
852 struct ira_loop_tree_node *subloop_node;
854 if (loop_tree_node->loop == NULL)
855 return;
856 if (ira_dump_file != NULL)
857 print_loop_title (loop_tree_node);
859 bitmap_copy (coloring_pseudo_bitmap, loop_tree_node->mentioned_pseudos);
860 bitmap_ior_into (coloring_pseudo_bitmap, loop_tree_node->border_pseudos);
861 bitmap_copy (consideration_pseudo_bitmap, coloring_pseudo_bitmap);
862 EXECUTE_IF_SET_IN_BITMAP (consideration_pseudo_bitmap, 0, j, bi)
864 p = pseudos [j];
865 if (! PSEUDO_ASSIGNED_P (p))
866 continue;
867 bitmap_clear_bit (coloring_pseudo_bitmap, PSEUDO_NUM (p));
869 /* Color all mentioned including transparent. */
870 color_pseudos ();
871 /* Update costs for subloops. */
872 for (subloop_node = loop_tree_node->inner;
873 subloop_node != NULL;
874 subloop_node = subloop_node->next)
875 if (subloop_node->bb == NULL)
876 EXECUTE_IF_SET_IN_BITMAP (consideration_pseudo_bitmap, 0, j, bi)
878 p = pseudos [j];
879 mode = PSEUDO_MODE (p);
880 class = PSEUDO_COVER_CLASS (p);
881 hard_regno = PSEUDO_HARD_REGNO (p);
882 if (hard_regno >= 0)
884 index = class_hard_reg_index [class] [hard_regno];
885 ira_assert (index >= 0);
887 regno = PSEUDO_REGNO (p);
888 /* ??? conflict costs */
889 if (PSEUDO_CAP_MEMBER (p) == NULL)
891 subloop_pseudo = subloop_node->regno_pseudo_map [regno];
892 if (subloop_pseudo == NULL)
893 continue;
894 if ((flag_ira_algorithm == IRA_ALGORITHM_MIXED
895 && subloop_node->reg_pressure [class]
896 <= available_class_regs [class]))
898 if (! PSEUDO_ASSIGNED_P (subloop_pseudo))
900 PSEUDO_HARD_REGNO (subloop_pseudo) = hard_regno;
901 PSEUDO_ASSIGNED_P (subloop_pseudo) = TRUE;
902 if (hard_regno >= 0)
903 update_copy_costs (subloop_pseudo, TRUE);
905 continue;
907 exit_freq = loop_edge_freq (subloop_node, regno, TRUE);
908 enter_freq = loop_edge_freq (subloop_node, regno, FALSE);
909 if (reg_equiv_invariant_p [regno]
910 || reg_equiv_const [regno] != NULL_RTX)
912 if (! PSEUDO_ASSIGNED_P (subloop_pseudo))
914 PSEUDO_HARD_REGNO (subloop_pseudo) = hard_regno;
915 PSEUDO_ASSIGNED_P (subloop_pseudo) = TRUE;
916 if (hard_regno >= 0)
917 update_copy_costs (subloop_pseudo, TRUE);
920 else if (hard_regno < 0)
922 PSEUDO_MEMORY_COST (subloop_pseudo)
923 -= ((memory_move_cost [mode] [class] [1] * enter_freq)
924 + (memory_move_cost [mode] [class] [0] * exit_freq));
926 else
928 cost = (register_move_cost [mode] [class] [class]
929 * (exit_freq + enter_freq));
930 PSEUDO_HARD_REG_COSTS (subloop_pseudo) [index] -= cost;
931 PSEUDO_CONFLICT_HARD_REG_COSTS (subloop_pseudo) [index]
932 -= cost;
933 PSEUDO_MEMORY_COST (subloop_pseudo)
934 += (memory_move_cost [mode] [class] [0] * enter_freq
935 + memory_move_cost [mode] [class] [1] * exit_freq);
936 if (PSEUDO_COVER_CLASS_COST (subloop_pseudo)
937 > PSEUDO_HARD_REG_COSTS (subloop_pseudo) [index])
938 PSEUDO_COVER_CLASS_COST (subloop_pseudo)
939 = PSEUDO_HARD_REG_COSTS (subloop_pseudo) [index];
942 else
944 if ((flag_ira_algorithm == IRA_ALGORITHM_MIXED
945 && subloop_node->reg_pressure [class]
946 <= available_class_regs [class]))
948 subloop_pseudo = PSEUDO_CAP_MEMBER (p);
949 if (! PSEUDO_ASSIGNED_P (subloop_pseudo))
951 PSEUDO_HARD_REGNO (subloop_pseudo) = hard_regno;
952 PSEUDO_ASSIGNED_P (subloop_pseudo) = TRUE;
953 if (hard_regno >= 0)
954 update_copy_costs (subloop_pseudo, TRUE);
957 else if (flag_ira_propagate_cost && hard_regno >= 0)
959 exit_freq = loop_edge_freq (subloop_node, -1, TRUE);
960 enter_freq = loop_edge_freq (subloop_node, -1, FALSE);
961 cost = (register_move_cost [mode] [class] [class]
962 * (exit_freq + enter_freq));
963 subloop_pseudo = PSEUDO_CAP_MEMBER (p);
964 PSEUDO_HARD_REG_COSTS (subloop_pseudo) [index] -= cost;
965 PSEUDO_CONFLICT_HARD_REG_COSTS (subloop_pseudo) [index]
966 -= cost;
967 PSEUDO_MEMORY_COST (subloop_pseudo)
968 += (memory_move_cost [mode] [class] [0] * enter_freq
969 + memory_move_cost [mode] [class] [1] * exit_freq);
970 if (PSEUDO_COVER_CLASS_COST (subloop_pseudo)
971 > PSEUDO_HARD_REG_COSTS (subloop_pseudo) [index])
972 PSEUDO_COVER_CLASS_COST (subloop_pseudo)
973 = PSEUDO_HARD_REG_COSTS (subloop_pseudo) [index];
979 /* The function is used to sort pseudos according to their priorities
980 which are calculated analogous to ones in file `global.c'. */
981 static int
982 pseudo_priority_compare_func (const void *v1p, const void *v2p)
984 pseudo_t p1 = *(const pseudo_t *) v1p, p2 = *(const pseudo_t *) v2p;
985 int pri1, pri2;
987 pri1 = (((double) (floor_log2 (REG_N_REFS (PSEUDO_REGNO (p1)))
988 * PSEUDO_FREQ (p1))
989 / REG_LIVE_LENGTH (PSEUDO_REGNO (p1)))
990 * (10000 / REG_FREQ_MAX) * PSEUDO_REGNO_SIZE (PSEUDO_REGNO (p1)));
991 pri2 = (((double) (floor_log2 (REG_N_REFS (PSEUDO_REGNO (p2)))
992 * PSEUDO_FREQ (p2))
993 / REG_LIVE_LENGTH (PSEUDO_REGNO (p2)))
994 * (10000 / REG_FREQ_MAX) * PSEUDO_REGNO_SIZE (PSEUDO_REGNO (p2)));
995 if (pri2 - pri1)
996 return pri2 - pri1;
998 /* If regs are equally good, sort by pseudos, so that the results of
999 qsort leave nothing to chance. */
1000 return PSEUDO_NUM (p1) - PSEUDO_NUM (p2);
1003 /* The function implements Chow's prioity-based coloring. */
1004 static void
1005 priority_coloring (void)
1007 int i, hard_regs_num;
1008 pseudo_t p;
1010 memcpy (sorted_pseudos, pseudos, pseudos_num * sizeof (pseudo_t));
1011 for (i = 0; i < pseudos_num; i++)
1013 bitmap_set_bit (coloring_pseudo_bitmap, i);
1014 p = pseudos [i];
1015 hard_regs_num = class_hard_regs_num [PSEUDO_COVER_CLASS (p)];
1016 if (hard_regs_num == 0)
1017 continue;
1018 memcpy (PSEUDO_CURR_HARD_REG_COSTS (p),
1019 PSEUDO_HARD_REG_COSTS (p), sizeof (int) * hard_regs_num);
1020 memcpy (PSEUDO_CURR_CONFLICT_HARD_REG_COSTS (p),
1021 PSEUDO_CONFLICT_HARD_REG_COSTS (p),
1022 sizeof (int) * hard_regs_num);
1024 bitmap_copy (consideration_pseudo_bitmap, coloring_pseudo_bitmap);
1025 qsort (sorted_pseudos, pseudos_num, sizeof (pseudo_t),
1026 pseudo_priority_compare_func);
1027 for (i = 0; i < pseudos_num; i++)
1029 p = sorted_pseudos [i];
1030 if (ira_dump_file != NULL)
1032 fprintf (ira_dump_file, " ");
1033 print_expanded_pseudo (p);
1034 fprintf (ira_dump_file, " -- ");
1036 if (assign_hard_reg (p, FALSE))
1038 if (ira_dump_file != NULL)
1039 fprintf (ira_dump_file, "assign reg %d\n",
1040 PSEUDO_HARD_REGNO (p));
1042 else
1044 if (ira_dump_file != NULL)
1045 fprintf (ira_dump_file, "spill\n");
1047 PSEUDO_IN_GRAPH_P (p) = TRUE;
1051 /* The function initialized common data for cloring and calls
1052 functions to do Chaitin-Briggs, regional, and Chow's priority-based
1053 coloring. */
1054 static void
1055 do_coloring (void)
1057 coloring_pseudo_bitmap = ira_allocate_bitmap ();
1058 consideration_pseudo_bitmap = ira_allocate_bitmap ();
1060 if (flag_ira_algorithm == IRA_ALGORITHM_PRIORITY)
1061 priority_coloring ();
1062 else
1064 if (ira_dump_file != NULL)
1065 fprintf (ira_dump_file, "\n**** Pseudos coloring:\n\n");
1067 traverse_loop_tree (ira_loop_tree_root, color_pass, NULL);
1070 if (ira_dump_file != NULL)
1071 print_disposition (ira_dump_file);
1073 ira_free_bitmap (consideration_pseudo_bitmap);
1074 ira_free_bitmap (coloring_pseudo_bitmap);
1079 /* The functions moves future spill/restore code to less frequent
1080 points (if it is profitable) by reassigning some pseudos to memory
1081 which means make longer live-range where the corresponding
1082 pseudo-registers will be in memory. */
1083 static void
1084 move_spill_restore (void)
1086 int i, cost, changed_p, regno, hard_regno, hard_regno2, index;
1087 int enter_freq, exit_freq;
1088 enum machine_mode mode;
1089 enum reg_class class;
1090 pseudo_t p, father_pseudo, subloop_pseudo;
1091 struct ira_loop_tree_node *father, *loop_node, *subloop_node;
1093 for (;;)
1095 changed_p = FALSE;
1096 if (ira_dump_file != NULL)
1097 fprintf (ira_dump_file, "New iteration of spill/restore move\n");
1098 for (i = 0; i < pseudos_num; i++)
1100 p = pseudos [i];
1101 regno = PSEUDO_REGNO (p);
1102 loop_node = PSEUDO_LOOP_TREE_NODE (p);
1103 if (PSEUDO_CAP_MEMBER (p) != NULL
1104 || (hard_regno = PSEUDO_HARD_REGNO (p)) < 0
1105 || loop_node->inner == NULL)
1106 continue;
1107 mode = PSEUDO_MODE (p);
1108 class = PSEUDO_COVER_CLASS (p);
1109 index = class_hard_reg_index [class] [hard_regno];
1110 ira_assert (index >= 0);
1111 cost = (PSEUDO_ORIGINAL_MEMORY_COST (p)
1112 - PSEUDO_HARD_REG_COSTS (p) [index]);
1113 for (subloop_node = loop_node->inner;
1114 subloop_node != NULL;
1115 subloop_node = subloop_node->next)
1117 if (subloop_node->bb != NULL)
1118 continue;
1119 subloop_pseudo = subloop_node->regno_pseudo_map [regno];
1120 if (subloop_pseudo == NULL)
1121 continue;
1122 cost -= (PSEUDO_ORIGINAL_MEMORY_COST (subloop_pseudo)
1123 - PSEUDO_HARD_REG_COSTS (subloop_pseudo) [index]);
1124 exit_freq = loop_edge_freq (subloop_node, regno, TRUE);
1125 enter_freq = loop_edge_freq (subloop_node, regno, FALSE);
1126 if ((hard_regno2 = PSEUDO_HARD_REGNO (subloop_pseudo)) < 0)
1127 cost -= (memory_move_cost [mode] [class] [0] * exit_freq
1128 + memory_move_cost [mode] [class] [1] * enter_freq);
1129 else
1131 cost += (memory_move_cost [mode] [class] [0] * exit_freq
1132 + memory_move_cost [mode] [class] [1] * enter_freq);
1133 if (hard_regno2 != hard_regno)
1134 cost -= (register_move_cost [mode] [class] [class]
1135 * (exit_freq + enter_freq));
1138 if ((father = loop_node->father) != NULL
1139 && (father_pseudo = father->regno_pseudo_map [regno]) != NULL)
1141 exit_freq = loop_edge_freq (loop_node, regno, TRUE);
1142 enter_freq = loop_edge_freq (loop_node, regno, FALSE);
1143 if ((hard_regno2 = PSEUDO_HARD_REGNO (father_pseudo)) < 0)
1144 cost -= (memory_move_cost [mode] [class] [0] * exit_freq
1145 + memory_move_cost [mode] [class] [1] * enter_freq);
1146 else
1148 cost += (memory_move_cost [mode] [class] [1] * exit_freq
1149 + memory_move_cost [mode] [class] [0] * enter_freq);
1150 if (hard_regno2 != hard_regno)
1151 cost -= (register_move_cost [mode] [class] [class]
1152 * (exit_freq + enter_freq));
1155 if (cost < 0)
1157 PSEUDO_HARD_REGNO (p) = -1;
1158 if (ira_dump_file != NULL)
1159 fprintf (ira_dump_file,
1160 "Moving spill/restore for p%dr%d up from loop %d - profit %d\n",
1161 PSEUDO_NUM (p), regno, loop_node->loop->num, -cost);
1162 changed_p = TRUE;
1165 if (! changed_p)
1166 break;
1172 /* Set up current hard reg costs and current conflict hard reg costs
1173 for pseudo P. */
1174 static void
1175 setup_curr_costs (pseudo_t p)
1177 int i, hard_regno, cost, hard_regs_num;
1178 enum machine_mode mode;
1179 enum reg_class cover_class, class;
1180 pseudo_t another_p;
1181 struct pseudo_copy *cp, *next_cp;
1183 ira_assert (! PSEUDO_ASSIGNED_P (p));
1184 cover_class = PSEUDO_COVER_CLASS (p);
1185 if (cover_class == NO_REGS)
1186 return;
1187 hard_regs_num = class_hard_regs_num [cover_class];
1188 if (hard_regs_num == 0)
1189 return;
1190 mode = PSEUDO_MODE (p);
1191 memcpy (PSEUDO_CURR_HARD_REG_COSTS (p),
1192 PSEUDO_HARD_REG_COSTS (p),
1193 sizeof (int) * hard_regs_num);
1194 memcpy (PSEUDO_CURR_CONFLICT_HARD_REG_COSTS (p),
1195 PSEUDO_CONFLICT_HARD_REG_COSTS (p),
1196 sizeof (int) * hard_regs_num);
1197 for (cp = PSEUDO_COPIES (p); cp != NULL; cp = next_cp)
1199 if (cp->first == p)
1201 next_cp = cp->next_first_pseudo_copy;
1202 another_p = cp->second;
1204 else if (cp->second == p)
1206 next_cp = cp->next_second_pseudo_copy;
1207 another_p = cp->first;
1209 else
1210 gcc_unreachable ();
1211 if (cover_class != PSEUDO_COVER_CLASS (another_p)
1212 || ! PSEUDO_ASSIGNED_P (another_p)
1213 || (hard_regno = PSEUDO_HARD_REGNO (another_p)) < 0)
1214 continue;
1215 class = REGNO_REG_CLASS (hard_regno);
1216 i = class_hard_reg_index [cover_class] [hard_regno];
1217 ira_assert (i >= 0);
1218 cost = (cp->first == p
1219 ? register_move_cost [mode] [class] [cover_class]
1220 : register_move_cost [mode] [cover_class] [class]);
1221 PSEUDO_CURR_HARD_REG_COSTS (p) [i] -= cp->freq * cost;
1222 PSEUDO_CURR_CONFLICT_HARD_REG_COSTS (p) [i] -= cp->freq * cost;
1226 /* Try to assign hard registers to the unassigned pseudos and pseudos
1227 conflicting with them or conflicting with pseudos whose regno >=
1228 START_REGNO. We only try to assign a hard register to pseudos
1229 which do not live across calls if NO_CALL_CROSS_P. */
1230 void
1231 reassign_conflict_pseudos (int start_regno, int no_call_cross_p)
1233 int i, j, pseudos_to_color_num;
1234 pseudo_t p, conflict_p, *pseudo_vec;
1235 enum reg_class cover_class;
1236 bitmap pseudos_to_color;
1238 sorted_pseudos = ira_allocate (sizeof (pseudo_t) * pseudos_num);
1239 pseudos_to_color = ira_allocate_bitmap ();
1240 pseudos_to_color_num = 0;
1241 for (i = 0; i < pseudos_num; i++)
1243 p = pseudos [i];
1244 if (! PSEUDO_ASSIGNED_P (p)
1245 && ! bitmap_bit_p (pseudos_to_color, PSEUDO_NUM (p)))
1247 if (PSEUDO_COVER_CLASS (p) != NO_REGS
1248 && (! no_call_cross_p || PSEUDO_CALLS_CROSSED_NUM (p) == 0))
1249 sorted_pseudos [pseudos_to_color_num++] = p;
1250 else
1252 PSEUDO_ASSIGNED_P (p) = TRUE;
1253 PSEUDO_HARD_REGNO (p) = -1;
1255 bitmap_set_bit (pseudos_to_color, PSEUDO_NUM (p));
1257 if (PSEUDO_REGNO (p) < start_regno)
1258 continue;
1259 pseudo_vec = PSEUDO_CONFLICT_PSEUDO_VEC (p);
1260 for (j = 0; (conflict_p = pseudo_vec [j]) != NULL; j++)
1262 if ((cover_class = PSEUDO_COVER_CLASS (conflict_p)) == NO_REGS
1263 || (no_call_cross_p
1264 && PSEUDO_CALLS_CROSSED_NUM (conflict_p) != 0)
1265 || bitmap_bit_p (pseudos_to_color, PSEUDO_NUM (conflict_p)))
1266 continue;
1267 bitmap_set_bit (pseudos_to_color, PSEUDO_NUM (conflict_p));
1268 sorted_pseudos [pseudos_to_color_num++] = conflict_p;
1271 ira_free_bitmap (pseudos_to_color);
1272 if (pseudos_to_color_num > 1)
1273 qsort (sorted_pseudos, pseudos_to_color_num, sizeof (pseudo_t),
1274 pseudo_priority_compare_func);
1275 for (i = 0; i < pseudos_to_color_num; i++)
1277 p = sorted_pseudos [i];
1278 PSEUDO_ASSIGNED_P (p) = FALSE;
1279 setup_curr_costs (p);
1281 for (i = 0; i < pseudos_to_color_num; i++)
1283 p = sorted_pseudos [i];
1284 if (assign_hard_reg (p, TRUE))
1286 if (ira_dump_file != NULL)
1287 fprintf (ira_dump_file,
1288 "after call opt: assign hard reg %d to reg %d\n",
1289 PSEUDO_HARD_REGNO (p), PSEUDO_REGNO (p));
1292 ira_free (sorted_pseudos);
1297 /* The function called from the reload to mark changes in the
1298 allocation of REGNO made by the reload. */
1299 void
1300 mark_allocation_change (int regno)
1302 pseudo_t p = regno_pseudo_map [regno];
1303 int old_hard_regno, hard_regno, cost;
1304 enum reg_class cover_class = PSEUDO_COVER_CLASS (p);
1306 ira_assert (p != NULL);
1307 hard_regno = reg_renumber [regno];
1308 if ((old_hard_regno = PSEUDO_HARD_REGNO (p)) == hard_regno)
1309 return;
1310 if (old_hard_regno < 0)
1311 cost = -PSEUDO_MEMORY_COST (p);
1312 else
1314 ira_assert (class_hard_reg_index [cover_class] [old_hard_regno] >= 0);
1315 cost = -(PSEUDO_HARD_REG_COSTS (p)
1316 [class_hard_reg_index [cover_class] [old_hard_regno]]);
1317 update_copy_costs (p, FALSE);
1319 overall_cost -= cost;
1320 PSEUDO_HARD_REGNO (p) = hard_regno;
1321 if (hard_regno < 0)
1322 cost += PSEUDO_MEMORY_COST (p);
1323 else if (class_hard_reg_index [cover_class] [hard_regno] >= 0)
1325 cost += (PSEUDO_HARD_REG_COSTS (p)
1326 [class_hard_reg_index [cover_class] [hard_regno]]);
1327 update_copy_costs (p, TRUE);
1329 else
1330 /* Reload chages class of the pseudo. */
1331 cost = 0;
1332 overall_cost += cost;
1335 /* The function is analog of function `retry_global_alloc'. It is
1336 called by reload to try to put spilled pseudo-register REGNO into a
1337 hard register which is not in FORBIDDEN_REGS. */
1338 void
1339 retry_ira_color (int regno, HARD_REG_SET forbidden_regs)
1341 pseudo_t p;
1342 int hard_regno;
1343 enum reg_class cover_class;
1345 p = regno_pseudo_map [regno];
1346 mark_allocation_change (regno);
1347 ira_assert (reg_renumber [regno] < 0);
1348 if (ira_dump_file != NULL)
1349 fprintf (ira_dump_file, "spill %d(p%d), cost=%d", regno, PSEUDO_NUM (p),
1350 PSEUDO_MEMORY_COST (p) - PSEUDO_COVER_CLASS_COST (p));
1351 IOR_HARD_REG_SET (PSEUDO_CONFLICT_HARD_REGS (p), forbidden_regs);
1352 if ((! flag_caller_saves || flag_ira_split_around_calls)
1353 && PSEUDO_CALLS_CROSSED (p) != 0)
1354 IOR_HARD_REG_SET (PSEUDO_CONFLICT_HARD_REGS (p), call_used_reg_set);
1355 PSEUDO_ASSIGNED_P (p) = FALSE;
1356 cover_class = PSEUDO_COVER_CLASS (p);
1357 setup_curr_costs (p);
1358 assign_hard_reg (p, TRUE);
1359 hard_regno = PSEUDO_HARD_REGNO (p);
1360 reg_renumber [regno] = hard_regno;
1361 if (hard_regno >= 0)
1363 ira_assert (class_hard_reg_index [cover_class] [hard_regno] >= 0);
1364 overall_cost -= (PSEUDO_MEMORY_COST (p)
1365 - (PSEUDO_HARD_REG_COSTS (p)
1366 [class_hard_reg_index
1367 [cover_class] [hard_regno]]));
1368 if (PSEUDO_CALLS_CROSSED_NUM (p) != 0
1369 && ! hard_reg_not_in_set_p (hard_regno, PSEUDO_MODE (p),
1370 call_used_reg_set))
1372 ira_assert (flag_caller_saves && ! flag_ira_split_around_calls);
1373 caller_save_needed = 1;
1377 /* If we found a register, modify the RTL for the register to show
1378 the hard register, and mark that register live. */
1379 if (reg_renumber[regno] >= 0)
1381 if (ira_dump_file != NULL)
1382 fprintf (ira_dump_file, ": reassign to %d", reg_renumber[regno]);
1383 REGNO (regno_reg_rtx[regno]) = reg_renumber[regno];
1384 mark_home_live (regno);
1386 else if (ira_dump_file != NULL && original_regno_call_crossed_p [regno]
1387 && ! flag_caller_saves && flag_ira_split_around_calls
1388 && get_around_calls_regno (regno) >= 0)
1389 fprintf (ira_dump_file, "+++spilling %d\n", regno);
1391 if (ira_dump_file != NULL)
1392 fprintf (ira_dump_file, "\n");
1397 /* The function called by the reload returns already allocated stack
1398 slot (if any) for REGNO with given INHERENT_SIZE and
1399 TOTAL_SIZE. */
1401 reuse_stack_slot (int regno, unsigned int inherent_size,
1402 unsigned int total_size)
1404 unsigned int i;
1405 int n;
1406 int freq, best_freq = -1;
1407 struct spilled_reg_stack_slot *best_slot = NULL;
1408 pseudo_t another_pseudo, pseudo = regno_pseudo_map [regno];
1409 struct pseudo_copy *cp, *next_cp;
1410 rtx x;
1411 bitmap_iterator bi;
1412 struct spilled_reg_stack_slot *slot = NULL;
1414 ira_assert (flag_ira && inherent_size == PSEUDO_REGNO_BYTES (regno)
1415 && inherent_size <= total_size);
1416 if (! flag_ira_share_spill_slots)
1417 return NULL_RTX;
1418 x = NULL_RTX;
1419 if (flag_omit_frame_pointer)
1420 n = spilled_reg_stack_slots_num - 1;
1421 else
1422 n = 0;
1423 if (x == NULL_RTX)
1425 for (;;)
1427 if (flag_omit_frame_pointer)
1429 if (n < 0)
1430 break;
1431 slot = &spilled_reg_stack_slots [n--];
1433 else if (n >= spilled_reg_stack_slots_num)
1434 break;
1435 else
1436 slot = &spilled_reg_stack_slots [n++];
1437 if (slot->width < total_size
1438 || GET_MODE_SIZE (GET_MODE (slot->mem)) < inherent_size)
1439 continue;
1441 EXECUTE_IF_SET_IN_BITMAP (&slot->spilled_regs,
1442 FIRST_PSEUDO_REGISTER, i, bi)
1444 if (pseudo_reg_conflict_p (regno, i))
1445 goto cont;
1447 for (freq = 0, cp = PSEUDO_COPIES (pseudo); cp != NULL; cp = next_cp)
1449 if (cp->first == pseudo)
1451 next_cp = cp->next_first_pseudo_copy;
1452 another_pseudo = cp->second;
1454 else if (cp->second == pseudo)
1456 next_cp = cp->next_second_pseudo_copy;
1457 another_pseudo = cp->first;
1459 else
1460 gcc_unreachable ();
1461 if (bitmap_bit_p (&slot->spilled_regs,
1462 PSEUDO_REGNO (another_pseudo)))
1463 freq += cp->freq;
1465 if (freq > best_freq)
1467 best_freq = freq;
1468 best_slot = slot;
1470 cont:
1473 if (best_freq >= 0)
1475 SET_REGNO_REG_SET (&best_slot->spilled_regs, regno);
1476 x = best_slot->mem;
1479 if (x)
1481 if (ira_dump_file)
1483 fprintf (ira_dump_file, " Assigning %d slot of", regno);
1484 EXECUTE_IF_SET_IN_BITMAP (&slot->spilled_regs,
1485 FIRST_PSEUDO_REGISTER, i, bi)
1487 if ((unsigned) regno != i)
1488 fprintf (ira_dump_file, " %d", i);
1490 fprintf (ira_dump_file, "\n");
1493 return x;
1496 /* The function called by the reload when a new stack slot X with
1497 TOTAL_SIZE was allocated for REGNO. */
1498 void
1499 mark_new_stack_slot (rtx x, int regno, unsigned int total_size)
1501 struct spilled_reg_stack_slot *slot;
1503 ira_assert (flag_ira && PSEUDO_REGNO_BYTES (regno) <= total_size);
1504 slot = &spilled_reg_stack_slots [spilled_reg_stack_slots_num++];
1505 INIT_REG_SET (&slot->spilled_regs);
1506 SET_REGNO_REG_SET (&slot->spilled_regs, regno);
1507 slot->mem = x;
1508 slot->width = total_size;
1509 if (ira_dump_file)
1510 fprintf (ira_dump_file, " Assigning %d a new slot\n", regno);
1515 /* The function returns (through CALL_CLOBBERED_REGS) hard registers
1516 changed by all function calls in REGNO live range. */
1517 void
1518 collect_pseudo_call_clobbered_regs (int regno,
1519 HARD_REG_SET (*call_clobbered_regs))
1521 int i;
1522 pseudo_t p;
1523 HARD_REG_SET clobbered_regs;
1524 rtx call, *pseudo_calls;
1526 p = regno_pseudo_map [regno];
1527 CLEAR_HARD_REG_SET (*call_clobbered_regs);
1528 pseudo_calls = PSEUDO_CALLS_CROSSED (p);
1529 for (i = PSEUDO_CALLS_CROSSED_NUM (p) - 1; i >= 0; i--)
1531 call = pseudo_calls [i];
1532 get_call_invalidated_used_regs (call, &clobbered_regs, FALSE);
1533 IOR_HARD_REG_SET (*call_clobbered_regs, clobbered_regs);
1539 /* Update avaliable hard registers for each pseudo. */
1540 static void
1541 update_pseudo_avaialable_regs (void)
1543 int i, j, n, cost;
1544 enum reg_class cover_class;
1545 pseudo_t p;
1547 for (i = 0; i < pseudos_num; i++)
1549 p = pseudos [i];
1550 cover_class = PSEUDO_COVER_CLASS (p);
1551 PSEUDO_AVAILABLE_REGS_NUM (p) = available_class_regs [cover_class];
1552 if (cover_class == NO_REGS)
1553 continue;
1554 cost = PSEUDO_MEMORY_COST (p);
1555 for (n = 0, j = class_hard_regs_num [cover_class] - 1; j >= 0; j--)
1556 if (TEST_HARD_REG_BIT (PSEUDO_CONFLICT_HARD_REGS (p),
1557 class_hard_regs [cover_class] [j]))
1558 n++;
1559 if (n > 0 && ira_dump_file != NULL)
1560 fprintf (ira_dump_file, "reg %d of %s has %d regs less\n",
1561 PSEUDO_REGNO (p), reg_class_names [cover_class], n);
1562 PSEUDO_AVAILABLE_REGS_NUM (p) -= n;
1566 /* Entry function doing color-based register allocation. */
1567 void
1568 ira_color (void)
1570 update_pseudo_avaialable_regs ();
1571 sorted_pseudos = ira_allocate (sizeof (pseudo_t) * pseudos_num);
1572 VARRAY_GENERIC_PTR_NOGC_INIT (pseudo_stack_varray, pseudos_num,
1573 "stack of pseudos");
1574 memset (allocated_hardreg_p, 0, sizeof (allocated_hardreg_p));
1575 do_coloring ();
1576 VARRAY_FREE (pseudo_stack_varray);
1577 ira_free (sorted_pseudos);
1578 move_spill_restore ();