gcse.c (do_local_cprop): Do not extend lifetimes of registers set by do_local_cprop.
[official-gcc.git] / gcc / ra-rewrite.c
blob2dfe12b321cb3b25141b73f6e3ecdf9535cd2f9e
1 /* Graph coloring register allocator
2 Copyright (C) 2001, 2002 Free Software Foundation, Inc.
3 Contributed by Michael Matz <matz@suse.de>
4 and Daniel Berlin <dan@cgsoftware.com>.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under the
9 terms of the GNU General Public License as published by the Free Software
10 Foundation; either version 2, or (at your option) any later version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
15 details.
17 You should have received a copy of the GNU General Public License along
18 with GCC; see the file COPYING. If not, write to the Free Software
19 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21 #include "config.h"
22 #include "system.h"
23 #include "rtl.h"
24 #include "tm_p.h"
25 #include "function.h"
26 #include "regs.h"
27 #include "hard-reg-set.h"
28 #include "basic-block.h"
29 #include "df.h"
30 #include "expr.h"
31 #include "output.h"
32 #include "except.h"
33 #include "ra.h"
34 #include "insn-config.h"
35 #include "reload.h"
37 /* This file is part of the graph coloring register allocator, and
38 contains the functions to change the insn stream. I.e. it adds
39 spill code, rewrites insns to use the new registers after
40 coloring and deletes coalesced moves. */
42 struct rewrite_info;
43 struct rtx_list;
45 static void spill_coalescing PARAMS ((sbitmap, sbitmap));
46 static unsigned HOST_WIDE_INT spill_prop_savings PARAMS ((struct web *,
47 sbitmap));
48 static void spill_prop_insert PARAMS ((struct web *, sbitmap, sbitmap));
49 static int spill_propagation PARAMS ((sbitmap, sbitmap, sbitmap));
50 static void spill_coalprop PARAMS ((void));
51 static void allocate_spill_web PARAMS ((struct web *));
52 static void choose_spill_colors PARAMS ((void));
53 static void rewrite_program PARAMS ((bitmap));
54 static void remember_slot PARAMS ((struct rtx_list **, rtx));
55 static int slots_overlap_p PARAMS ((rtx, rtx));
56 static void delete_overlapping_slots PARAMS ((struct rtx_list **, rtx));
57 static int slot_member_p PARAMS ((struct rtx_list *, rtx));
58 static void insert_stores PARAMS ((bitmap));
59 static int spill_same_color_p PARAMS ((struct web *, struct web *));
60 static int is_partly_live_1 PARAMS ((sbitmap, struct web *));
61 static void update_spill_colors PARAMS ((HARD_REG_SET *, struct web *, int));
62 static int spill_is_free PARAMS ((HARD_REG_SET *, struct web *));
63 static void emit_loads PARAMS ((struct rewrite_info *, int, rtx));
64 static void reloads_to_loads PARAMS ((struct rewrite_info *, struct ref **,
65 unsigned int, struct web **));
66 static void rewrite_program2 PARAMS ((bitmap));
67 static void mark_refs_for_checking PARAMS ((struct web *, bitmap));
68 static void detect_web_parts_to_rebuild PARAMS ((void));
69 static void delete_useless_defs PARAMS ((void));
70 static void detect_non_changed_webs PARAMS ((void));
71 static void reset_changed_flag PARAMS ((void));
73 /* For tracking some statistics, we count the number (and cost)
74 of deleted move insns. */
75 static unsigned int deleted_move_insns;
76 static unsigned HOST_WIDE_INT deleted_move_cost;
78 /* This is the spill coalescing phase. In SPILLED the IDs of all
79 already spilled webs are noted. In COALESCED the IDs of webs still
80 to check for coalescing. This tries to coalesce two webs, which were
81 spilled, are connected by a move, and don't conflict. Greatly
82 reduces memory shuffling. */
84 static void
85 spill_coalescing (coalesce, spilled)
86 sbitmap coalesce, spilled;
88 struct move_list *ml;
89 struct move *m;
90 for (ml = wl_moves; ml; ml = ml->next)
91 if ((m = ml->move) != NULL)
93 struct web *s = alias (m->source_web);
94 struct web *t = alias (m->target_web);
95 if ((TEST_BIT (spilled, s->id) && TEST_BIT (coalesce, t->id))
96 || (TEST_BIT (spilled, t->id) && TEST_BIT (coalesce, s->id)))
98 struct conflict_link *wl;
99 if (TEST_BIT (sup_igraph, s->id * num_webs + t->id)
100 || TEST_BIT (sup_igraph, t->id * num_webs + s->id)
101 || s->pattern || t->pattern)
102 continue;
104 deleted_move_insns++;
105 deleted_move_cost += BLOCK_FOR_INSN (m->insn)->frequency + 1;
106 PUT_CODE (m->insn, NOTE);
107 NOTE_LINE_NUMBER (m->insn) = NOTE_INSN_DELETED;
108 df_insn_modify (df, BLOCK_FOR_INSN (m->insn), m->insn);
110 m->target_web->target_of_spilled_move = 1;
111 if (s == t)
112 /* May be, already coalesced due to a former move. */
113 continue;
114 /* Merge the nodes S and T in the I-graph. Beware: the merging
115 of conflicts relies on the fact, that in the conflict list
116 of T all of it's conflicts are noted. This is currently not
117 the case if T would be the target of a coalesced web, because
118 then (in combine () above) only those conflicts were noted in
119 T from the web which was coalesced into T, which at the time
120 of combine() were not already on the SELECT stack or were
121 itself coalesced to something other. */
122 if (t->type != SPILLED || s->type != SPILLED)
123 abort ();
124 remove_list (t->dlink, &WEBS(SPILLED));
125 put_web (t, COALESCED);
126 t->alias = s;
127 s->is_coalesced = 1;
128 t->is_coalesced = 1;
129 merge_moves (s, t);
130 for (wl = t->conflict_list; wl; wl = wl->next)
132 struct web *pweb = wl->t;
133 if (wl->sub == NULL)
134 record_conflict (s, pweb);
135 else
137 struct sub_conflict *sl;
138 for (sl = wl->sub; sl; sl = sl->next)
140 struct web *sweb = NULL;
141 if (SUBWEB_P (sl->s))
142 sweb = find_subweb (s, sl->s->orig_x);
143 if (!sweb)
144 sweb = s;
145 record_conflict (sweb, sl->t);
148 /* No decrement_degree here, because we already have colored
149 the graph, and don't want to insert pweb into any other
150 list. */
151 pweb->num_conflicts -= 1 + t->add_hardregs;
157 /* Returns the probable saving of coalescing WEB with webs from
158 SPILLED, in terms of removed move insn cost. */
160 static unsigned HOST_WIDE_INT
161 spill_prop_savings (web, spilled)
162 struct web *web;
163 sbitmap spilled;
165 unsigned HOST_WIDE_INT savings = 0;
166 struct move_list *ml;
167 struct move *m;
168 unsigned int cost;
169 if (web->pattern)
170 return 0;
171 cost = 1 + MEMORY_MOVE_COST (GET_MODE (web->orig_x), web->regclass, 1);
172 cost += 1 + MEMORY_MOVE_COST (GET_MODE (web->orig_x), web->regclass, 0);
173 for (ml = wl_moves; ml; ml = ml->next)
174 if ((m = ml->move) != NULL)
176 struct web *s = alias (m->source_web);
177 struct web *t = alias (m->target_web);
178 if (s != web)
180 struct web *h = s;
181 s = t;
182 t = h;
184 if (s != web || !TEST_BIT (spilled, t->id) || t->pattern
185 || TEST_BIT (sup_igraph, s->id * num_webs + t->id)
186 || TEST_BIT (sup_igraph, t->id * num_webs + s->id))
187 continue;
188 savings += BLOCK_FOR_INSN (m->insn)->frequency * cost;
190 return savings;
193 /* This add all IDs of colored webs, which are connected to WEB by a move
194 to LIST and PROCESSED. */
196 static void
197 spill_prop_insert (web, list, processed)
198 struct web *web;
199 sbitmap list, processed;
201 struct move_list *ml;
202 struct move *m;
203 for (ml = wl_moves; ml; ml = ml->next)
204 if ((m = ml->move) != NULL)
206 struct web *s = alias (m->source_web);
207 struct web *t = alias (m->target_web);
208 if (s != web)
210 struct web *h = s;
211 s = t;
212 t = h;
214 if (s != web || t->type != COLORED || TEST_BIT (processed, t->id))
215 continue;
216 SET_BIT (list, t->id);
217 SET_BIT (processed, t->id);
221 /* The spill propagation pass. If we have to spilled webs, the first
222 connected through a move to a colored one, and the second also connected
223 to that colored one, and this colored web is only used to connect both
224 spilled webs, it might be worthwhile to spill that colored one.
225 This is the case, if the cost of the removed copy insns (all three webs
226 could be placed into the same stack slot) is higher than the spill cost
227 of the web.
228 TO_PROP are the webs we try to propagate from (i.e. spilled ones),
229 SPILLED the set of all spilled webs so far and PROCESSED the set
230 of all webs processed so far, so we don't do work twice. */
232 static int
233 spill_propagation (to_prop, spilled, processed)
234 sbitmap to_prop, spilled, processed;
236 int id;
237 int again = 0;
238 sbitmap list = sbitmap_alloc (num_webs);
239 sbitmap_zero (list);
241 /* First insert colored move neighbors into the candidate list. */
242 EXECUTE_IF_SET_IN_SBITMAP (to_prop, 0, id,
244 spill_prop_insert (ID2WEB (id), list, processed);
246 sbitmap_zero (to_prop);
248 /* For all candidates, see, if the savings are higher than it's
249 spill cost. */
250 while ((id = sbitmap_first_set_bit (list)) >= 0)
252 struct web *web = ID2WEB (id);
253 RESET_BIT (list, id);
254 if (spill_prop_savings (web, spilled) >= web->spill_cost)
256 /* If so, we found a new spilled web. Insert it's colored
257 move neighbors again, and mark, that we need to repeat the
258 whole mainloop of spillprog/coalescing again. */
259 remove_web_from_list (web);
260 web->color = -1;
261 put_web (web, SPILLED);
262 SET_BIT (spilled, id);
263 SET_BIT (to_prop, id);
264 spill_prop_insert (web, list, processed);
265 again = 1;
268 sbitmap_free (list);
269 return again;
272 /* The main phase to improve spill costs. This repeatedly runs
273 spill coalescing and spill propagation, until nothing changes. */
275 static void
276 spill_coalprop ()
278 sbitmap spilled, processed, to_prop;
279 struct dlist *d;
280 int again;
281 spilled = sbitmap_alloc (num_webs);
282 processed = sbitmap_alloc (num_webs);
283 to_prop = sbitmap_alloc (num_webs);
284 sbitmap_zero (spilled);
285 for (d = WEBS(SPILLED); d; d = d->next)
286 SET_BIT (spilled, DLIST_WEB (d)->id);
287 sbitmap_copy (to_prop, spilled);
288 sbitmap_zero (processed);
291 spill_coalescing (to_prop, spilled);
292 /* XXX Currently (with optimistic coalescing) spill_propagation()
293 doesn't give better code, sometimes it gives worse (but not by much)
294 code. I believe this is because of slightly wrong cost
295 measurements. Anyway right now it isn't worth the time it takes,
296 so deactivate it for now. */
297 again = 0 && spill_propagation (to_prop, spilled, processed);
299 while (again);
300 sbitmap_free (to_prop);
301 sbitmap_free (processed);
302 sbitmap_free (spilled);
305 /* Allocate a spill slot for a WEB. Currently we spill to pseudo
306 registers, to be able to track also webs for "stack slots", and also
307 to possibly colorize them. These pseudos are sometimes handled
308 in a special way, where we know, that they also can represent
309 MEM references. */
311 static void
312 allocate_spill_web (web)
313 struct web *web;
315 int regno = web->regno;
316 rtx slot;
317 if (web->stack_slot)
318 return;
319 slot = gen_reg_rtx (PSEUDO_REGNO_MODE (regno));
320 web->stack_slot = slot;
323 /* This chooses a color for all SPILLED webs for interference region
324 spilling. The heuristic isn't good in any way. */
326 static void
327 choose_spill_colors ()
329 struct dlist *d;
330 unsigned HOST_WIDE_INT *costs = (unsigned HOST_WIDE_INT *)
331 xmalloc (FIRST_PSEUDO_REGISTER * sizeof (costs[0]));
332 for (d = WEBS(SPILLED); d; d = d->next)
334 struct web *web = DLIST_WEB (d);
335 struct conflict_link *wl;
336 int bestc, c;
337 HARD_REG_SET avail;
338 memset (costs, 0, FIRST_PSEUDO_REGISTER * sizeof (costs[0]));
339 for (wl = web->conflict_list; wl; wl = wl->next)
341 struct web *pweb = wl->t;
342 if (pweb->type == COLORED || pweb->type == PRECOLORED)
343 costs[pweb->color] += pweb->spill_cost;
346 COPY_HARD_REG_SET (avail, web->usable_regs);
347 if (web->crosses_call)
349 /* Add an arbitrary constant cost to colors not usable by
350 call-crossing webs without saves/loads. */
351 for (c = 0; c < FIRST_PSEUDO_REGISTER; c++)
352 if (TEST_HARD_REG_BIT (call_used_reg_set, c))
353 costs[c] += 1000;
355 bestc = -1;
356 for (c = 0; c < FIRST_PSEUDO_REGISTER; c++)
357 if ((bestc < 0 || costs[bestc] > costs[c])
358 && TEST_HARD_REG_BIT (avail, c)
359 && HARD_REGNO_MODE_OK (c, PSEUDO_REGNO_MODE (web->regno)))
361 int i, size;
362 size = HARD_REGNO_NREGS (c, PSEUDO_REGNO_MODE (web->regno));
363 for (i = 1; i < size
364 && TEST_HARD_REG_BIT (avail, c + i); i++);
365 if (i == size)
366 bestc = c;
368 web->color = bestc;
369 ra_debug_msg (DUMP_PROCESS, "choosing color %d for spilled web %d\n",
370 bestc, web->id);
373 free (costs);
376 /* For statistics sake we count the number and cost of all new loads,
377 stores and emitted rematerializations. */
378 static unsigned int emitted_spill_loads;
379 static unsigned int emitted_spill_stores;
380 static unsigned int emitted_remat;
381 static unsigned HOST_WIDE_INT spill_load_cost;
382 static unsigned HOST_WIDE_INT spill_store_cost;
383 static unsigned HOST_WIDE_INT spill_remat_cost;
385 /* In rewrite_program2() we detect if some def us useless, in the sense,
386 that the pseudo set is not live anymore at that point. The REF_IDs
387 of such defs are noted here. */
388 static bitmap useless_defs;
390 /* This is the simple and fast version of rewriting the program to
391 include spill code. It spills at every insn containing spilled
392 defs or uses. Loads are added only if flag_ra_spill_every_use is
393 nonzero, otherwise only stores will be added. This doesn't
394 support rematerialization.
395 NEW_DEATHS is filled with uids for insns, which probably contain
396 deaths. */
398 static void
399 rewrite_program (new_deaths)
400 bitmap new_deaths;
402 unsigned int i;
403 struct dlist *d;
404 bitmap b = BITMAP_XMALLOC ();
406 /* We walk over all webs, over all uses/defs. For all webs, we need
407 to look at spilled webs, and webs coalesced to spilled ones, in case
408 their alias isn't broken up, or they got spill coalesced. */
409 for (i = 0; i < 2; i++)
410 for (d = (i == 0) ? WEBS(SPILLED) : WEBS(COALESCED); d; d = d->next)
412 struct web *web = DLIST_WEB (d);
413 struct web *aweb = alias (web);
414 unsigned int j;
415 rtx slot;
417 /* Is trivially true for spilled webs, but not for coalesced ones. */
418 if (aweb->type != SPILLED)
419 continue;
421 /* First add loads before every use, if we have to. */
422 if (flag_ra_spill_every_use)
424 bitmap_clear (b);
425 allocate_spill_web (aweb);
426 slot = aweb->stack_slot;
427 for (j = 0; j < web->num_uses; j++)
429 rtx insns, target, source;
430 rtx insn = DF_REF_INSN (web->uses[j]);
431 rtx prev = PREV_INSN (insn);
432 basic_block bb = BLOCK_FOR_INSN (insn);
433 /* Happens when spill_coalescing() deletes move insns. */
434 if (!INSN_P (insn))
435 continue;
437 /* Check that we didn't already added a load for this web
438 and insn. Happens, when the an insn uses the same web
439 multiple times. */
440 if (bitmap_bit_p (b, INSN_UID (insn)))
441 continue;
442 bitmap_set_bit (b, INSN_UID (insn));
443 target = DF_REF_REG (web->uses[j]);
444 source = slot;
445 start_sequence ();
446 if (GET_CODE (target) == SUBREG)
447 source = simplify_gen_subreg (GET_MODE (target), source,
448 GET_MODE (source),
449 SUBREG_BYTE (target));
450 ra_emit_move_insn (target, source);
451 insns = get_insns ();
452 end_sequence ();
453 emit_insn_before (insns, insn);
455 if (bb->head == insn)
456 bb->head = NEXT_INSN (prev);
457 for (insn = PREV_INSN (insn); insn != prev;
458 insn = PREV_INSN (insn))
460 set_block_for_insn (insn, bb);
461 df_insn_modify (df, bb, insn);
464 emitted_spill_loads++;
465 spill_load_cost += bb->frequency + 1;
469 /* Now emit the stores after each def.
470 If any uses were loaded from stackslots (compared to
471 rematerialized or not reloaded due to IR spilling),
472 aweb->stack_slot will be set. If not, we don't need to emit
473 any stack stores. */
474 slot = aweb->stack_slot;
475 bitmap_clear (b);
476 if (slot)
477 for (j = 0; j < web->num_defs; j++)
479 rtx insns, source, dest;
480 rtx insn = DF_REF_INSN (web->defs[j]);
481 rtx following = NEXT_INSN (insn);
482 basic_block bb = BLOCK_FOR_INSN (insn);
483 /* Happens when spill_coalescing() deletes move insns. */
484 if (!INSN_P (insn))
485 continue;
486 if (bitmap_bit_p (b, INSN_UID (insn)))
487 continue;
488 bitmap_set_bit (b, INSN_UID (insn));
489 start_sequence ();
490 source = DF_REF_REG (web->defs[j]);
491 dest = slot;
492 if (GET_CODE (source) == SUBREG)
493 dest = simplify_gen_subreg (GET_MODE (source), dest,
494 GET_MODE (dest),
495 SUBREG_BYTE (source));
496 ra_emit_move_insn (dest, source);
498 insns = get_insns ();
499 end_sequence ();
500 if (insns)
502 emit_insn_after (insns, insn);
503 if (bb->end == insn)
504 bb->end = PREV_INSN (following);
505 for (insn = insns; insn != following; insn = NEXT_INSN (insn))
507 set_block_for_insn (insn, bb);
508 df_insn_modify (df, bb, insn);
511 else
512 df_insn_modify (df, bb, insn);
513 emitted_spill_stores++;
514 spill_store_cost += bb->frequency + 1;
515 /* XXX we should set new_deaths for all inserted stores
516 whose pseudo dies here.
517 Note, that this isn't the case for _all_ stores. */
518 /* I.e. the next is wrong, and might cause some spilltemps
519 to be categorized as spilltemp2's (i.e. live over a death),
520 although they aren't. This might make them spill again,
521 which causes endlessness in the case, this insn is in fact
522 _no_ death. */
523 bitmap_set_bit (new_deaths, INSN_UID (PREV_INSN (following)));
527 BITMAP_XFREE (b);
530 /* A simple list of rtx's. */
531 struct rtx_list
533 struct rtx_list *next;
534 rtx x;
537 /* Adds X to *LIST. */
539 static void
540 remember_slot (list, x)
541 struct rtx_list **list;
542 rtx x;
544 struct rtx_list *l;
545 /* PRE: X is not already in LIST. */
546 l = (struct rtx_list *) ra_alloc (sizeof (*l));
547 l->next = *list;
548 l->x = x;
549 *list = l;
552 /* Given two rtx' S1 and S2, either being REGs or MEMs (or SUBREGs
553 thereof), return non-zero, if they overlap. REGs and MEMs don't
554 overlap, and if they are MEMs they must have an easy address
555 (plus (basereg) (const_inst x)), otherwise they overlap. */
557 static int
558 slots_overlap_p (s1, s2)
559 rtx s1, s2;
561 rtx base1, base2;
562 HOST_WIDE_INT ofs1 = 0, ofs2 = 0;
563 int size1 = GET_MODE_SIZE (GET_MODE (s1));
564 int size2 = GET_MODE_SIZE (GET_MODE (s2));
565 if (GET_CODE (s1) == SUBREG)
566 ofs1 = SUBREG_BYTE (s1), s1 = SUBREG_REG (s1);
567 if (GET_CODE (s2) == SUBREG)
568 ofs2 = SUBREG_BYTE (s2), s2 = SUBREG_REG (s2);
570 if (s1 == s2)
571 return 1;
573 if (GET_CODE (s1) != GET_CODE (s2))
574 return 0;
576 if (GET_CODE (s1) == REG && GET_CODE (s2) == REG)
578 if (REGNO (s1) != REGNO (s2))
579 return 0;
580 if (ofs1 >= ofs2 + size2 || ofs2 >= ofs1 + size1)
581 return 0;
582 return 1;
584 if (GET_CODE (s1) != MEM || GET_CODE (s2) != MEM)
585 abort ();
586 s1 = XEXP (s1, 0);
587 s2 = XEXP (s2, 0);
588 if (GET_CODE (s1) != PLUS || GET_CODE (XEXP (s1, 0)) != REG
589 || GET_CODE (XEXP (s1, 1)) != CONST_INT)
590 return 1;
591 if (GET_CODE (s2) != PLUS || GET_CODE (XEXP (s2, 0)) != REG
592 || GET_CODE (XEXP (s2, 1)) != CONST_INT)
593 return 1;
594 base1 = XEXP (s1, 0);
595 base2 = XEXP (s2, 0);
596 if (!rtx_equal_p (base1, base2))
597 return 1;
598 ofs1 += INTVAL (XEXP (s1, 1));
599 ofs2 += INTVAL (XEXP (s2, 1));
600 if (ofs1 >= ofs2 + size2 || ofs2 >= ofs1 + size1)
601 return 0;
602 return 1;
605 /* This deletes from *LIST all rtx's which overlap with X in the sense
606 of slots_overlap_p(). */
608 static void
609 delete_overlapping_slots (list, x)
610 struct rtx_list **list;
611 rtx x;
613 while (*list)
615 if (slots_overlap_p ((*list)->x, x))
616 *list = (*list)->next;
617 else
618 list = &((*list)->next);
622 /* Returns nonzero, of X is member of LIST. */
624 static int
625 slot_member_p (list, x)
626 struct rtx_list *list;
627 rtx x;
629 for (;list; list = list->next)
630 if (rtx_equal_p (list->x, x))
631 return 1;
632 return 0;
635 /* A more sophisticated (and slower) method of adding the stores, than
636 rewrite_program(). This goes backward the insn stream, adding
637 stores as it goes, but only if it hasn't just added a store to the
638 same location. NEW_DEATHS is a bitmap filled with uids of insns
639 containing deaths. */
641 static void
642 insert_stores (new_deaths)
643 bitmap new_deaths;
645 rtx insn;
646 rtx last_slot = NULL_RTX;
647 struct rtx_list *slots = NULL;
649 /* We go simply backwards over basic block borders. */
650 for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
652 int uid = INSN_UID (insn);
654 /* If we reach a basic block border, which has more than one
655 outgoing edge, we simply forget all already emitted stores. */
656 if (GET_CODE (insn) == BARRIER
657 || JUMP_P (insn) || can_throw_internal (insn))
659 last_slot = NULL_RTX;
660 slots = NULL;
662 if (!INSN_P (insn))
663 continue;
665 /* If this insn was not just added in this pass. */
666 if (uid < insn_df_max_uid)
668 unsigned int n;
669 struct ra_insn_info info = insn_df[uid];
670 rtx following = NEXT_INSN (insn);
671 basic_block bb = BLOCK_FOR_INSN (insn);
672 for (n = 0; n < info.num_defs; n++)
674 struct web *web = def2web[DF_REF_ID (info.defs[n])];
675 struct web *aweb = alias (find_web_for_subweb (web));
676 rtx slot, source;
677 if (aweb->type != SPILLED || !aweb->stack_slot)
678 continue;
679 slot = aweb->stack_slot;
680 source = DF_REF_REG (info.defs[n]);
681 /* adjust_address() might generate code. */
682 start_sequence ();
683 if (GET_CODE (source) == SUBREG)
684 slot = simplify_gen_subreg (GET_MODE (source), slot,
685 GET_MODE (slot),
686 SUBREG_BYTE (source));
687 /* If we have no info about emitted stores, or it didn't
688 contain the location we intend to use soon, then
689 add the store. */
690 if ((!last_slot || !rtx_equal_p (slot, last_slot))
691 && ! slot_member_p (slots, slot))
693 rtx insns, ni;
694 last_slot = slot;
695 remember_slot (&slots, slot);
696 ra_emit_move_insn (slot, source);
697 insns = get_insns ();
698 end_sequence ();
699 if (insns)
701 emit_insn_after (insns, insn);
702 if (bb->end == insn)
703 bb->end = PREV_INSN (following);
704 for (ni = insns; ni != following; ni = NEXT_INSN (ni))
706 set_block_for_insn (ni, bb);
707 df_insn_modify (df, bb, ni);
710 else
711 df_insn_modify (df, bb, insn);
712 emitted_spill_stores++;
713 spill_store_cost += bb->frequency + 1;
714 bitmap_set_bit (new_deaths, INSN_UID (PREV_INSN (following)));
716 else
718 /* Otherwise ignore insns from adjust_address() above. */
719 end_sequence ();
723 /* If we look at a load generated by the allocator, forget
724 the last emitted slot, and additionally clear all slots
725 overlapping it's source (after all, we need it again). */
726 /* XXX If we emit the stack-ref directly into the using insn the
727 following needs a change, because that is no new insn. Preferably
728 we would add some notes to the insn, what stackslots are needed
729 for it. */
730 if (uid >= last_max_uid)
732 rtx set = single_set (insn);
733 last_slot = NULL_RTX;
734 /* If this was no simple set, give up, and forget everything. */
735 if (!set)
736 slots = NULL;
737 else
739 if (1 || GET_CODE (SET_SRC (set)) == MEM)
740 delete_overlapping_slots (&slots, SET_SRC (set));
746 /* Returns 1 if both colored webs have some hardregs in common, even if
747 they are not the same width. */
749 static int
750 spill_same_color_p (web1, web2)
751 struct web *web1, *web2;
753 int c1, size1, c2, size2;
754 if ((c1 = alias (web1)->color) < 0 || c1 == an_unusable_color)
755 return 0;
756 if ((c2 = alias (web2)->color) < 0 || c2 == an_unusable_color)
757 return 0;
759 size1 = web1->type == PRECOLORED
760 ? 1 : HARD_REGNO_NREGS (c1, PSEUDO_REGNO_MODE (web1->regno));
761 size2 = web2->type == PRECOLORED
762 ? 1 : HARD_REGNO_NREGS (c2, PSEUDO_REGNO_MODE (web2->regno));
763 if (c1 >= c2 + size2 || c2 >= c1 + size1)
764 return 0;
765 return 1;
768 /* Given the set of live web IDs LIVE, returns nonzero, if any of WEBs
769 subwebs (or WEB itself) is live. */
771 static int
772 is_partly_live_1 (live, web)
773 sbitmap live;
774 struct web *web;
777 if (TEST_BIT (live, web->id))
778 return 1;
779 while ((web = web->subreg_next));
780 return 0;
783 /* Fast version in case WEB has no subwebs. */
784 #define is_partly_live(live, web) ((!web->subreg_next) \
785 ? TEST_BIT (live, web->id) \
786 : is_partly_live_1 (live, web))
788 /* Change the set of currently IN_USE colors according to
789 WEB's color. Either add those colors to the hardreg set (if ADD
790 is nonzero), or remove them. */
792 static void
793 update_spill_colors (in_use, web, add)
794 HARD_REG_SET *in_use;
795 struct web *web;
796 int add;
798 int c, size;
799 if ((c = alias (find_web_for_subweb (web))->color) < 0
800 || c == an_unusable_color)
801 return;
802 size = HARD_REGNO_NREGS (c, GET_MODE (web->orig_x));
803 if (SUBWEB_P (web))
805 c += subreg_regno_offset (c, GET_MODE (SUBREG_REG (web->orig_x)),
806 SUBREG_BYTE (web->orig_x),
807 GET_MODE (web->orig_x));
809 else if (web->type == PRECOLORED)
810 size = 1;
811 if (add)
812 for (; size--;)
813 SET_HARD_REG_BIT (*in_use, c + size);
814 else
815 for (; size--;)
816 CLEAR_HARD_REG_BIT (*in_use, c + size);
819 /* Given a set of hardregs currently IN_USE and the color C of WEB,
820 return -1 if WEB has no color, 1 of it has the unusable color,
821 0 if one of it's used hardregs are in use, and 1 otherwise.
822 Generally, if WEB can't be left colorized return 1. */
824 static int
825 spill_is_free (in_use, web)
826 HARD_REG_SET *in_use;
827 struct web *web;
829 int c, size;
830 if ((c = alias (web)->color) < 0)
831 return -1;
832 if (c == an_unusable_color)
833 return 1;
834 size = web->type == PRECOLORED
835 ? 1 : HARD_REGNO_NREGS (c, PSEUDO_REGNO_MODE (web->regno));
836 for (; size--;)
837 if (TEST_HARD_REG_BIT (*in_use, c + size))
838 return 0;
839 return 1;
843 /* Structure for passing between rewrite_program2() and emit_loads(). */
844 struct rewrite_info
846 /* The web IDs which currently would need a reload. These are
847 currently live spilled webs, whose color was still free. */
848 bitmap need_reload;
849 /* We need a scratch bitmap, but don't want to allocate one a zillion
850 times. */
851 bitmap scratch;
852 /* Web IDs of currently live webs. This are the precise IDs,
853 not just those of the superwebs. If only on part is live, only
854 that ID is placed here. */
855 sbitmap live;
856 /* An array of webs, which currently need a load added.
857 They will be emitted when seeing the first death. */
858 struct web **needed_loads;
859 /* The current number of entries in needed_loads. */
860 int nl_size;
861 /* The number of bits set in need_reload. */
862 int num_reloads;
863 /* The current set of hardregs not available. */
864 HARD_REG_SET colors_in_use;
865 /* Nonzero, if we just added some spill temps to need_reload or
866 needed_loads. In this case we don't wait for the next death
867 to emit their loads. */
868 int any_spilltemps_spilled;
869 /* Nonzero, if we currently need to emit the loads. E.g. when we
870 saw an insn containing deaths. */
871 int need_load;
874 /* The needed_loads list of RI contains some webs for which
875 we add the actual load insns here. They are added just before
876 their use last seen. NL_FIRST_RELOAD is the index of the first
877 load which is a converted reload, all other entries are normal
878 loads. LAST_BLOCK_INSN is the last insn of the current basic block. */
880 static void
881 emit_loads (ri, nl_first_reload, last_block_insn)
882 struct rewrite_info *ri;
883 int nl_first_reload;
884 rtx last_block_insn;
886 int j;
887 for (j = ri->nl_size; j;)
889 struct web *web = ri->needed_loads[--j];
890 struct web *supweb;
891 struct web *aweb;
892 rtx ni, slot, reg;
893 rtx before = NULL_RTX, after = NULL_RTX;
894 basic_block bb;
895 /* When spilltemps were spilled for the last insns, their
896 loads already are emitted, which is noted by setting
897 needed_loads[] for it to 0. */
898 if (!web)
899 continue;
900 supweb = find_web_for_subweb (web);
901 if (supweb->regno >= max_normal_pseudo)
902 abort ();
903 /* Check for web being a spilltemp, if we only want to
904 load spilltemps. Also remember, that we emitted that
905 load, which we don't need to do when we have a death,
906 because then all of needed_loads[] is emptied. */
907 if (!ri->need_load)
909 if (!supweb->spill_temp)
910 continue;
911 else
912 ri->needed_loads[j] = 0;
914 web->in_load = 0;
915 /* The adding of reloads doesn't depend on liveness. */
916 if (j < nl_first_reload && !TEST_BIT (ri->live, web->id))
917 continue;
918 aweb = alias (supweb);
919 aweb->changed = 1;
920 start_sequence ();
921 if (supweb->pattern)
923 /* XXX If we later allow non-constant sources for rematerialization
924 we must also disallow coalescing _to_ rematerialized webs
925 (at least then disallow spilling them, which we already ensure
926 when flag_ra_break_aliases), or not take the pattern but a
927 stackslot. */
928 if (aweb != supweb)
929 abort ();
930 slot = copy_rtx (supweb->pattern);
931 reg = copy_rtx (supweb->orig_x);
932 /* Sanity check. orig_x should be a REG rtx, which should be
933 shared over all RTL, so copy_rtx should have no effect. */
934 if (reg != supweb->orig_x)
935 abort ();
937 else
939 allocate_spill_web (aweb);
940 slot = aweb->stack_slot;
942 /* If we don't copy the RTL there might be some SUBREG
943 rtx shared in the next iteration although being in
944 different webs, which leads to wrong code. */
945 reg = copy_rtx (web->orig_x);
946 if (GET_CODE (reg) == SUBREG)
947 /*slot = adjust_address (slot, GET_MODE (reg), SUBREG_BYTE
948 (reg));*/
949 slot = simplify_gen_subreg (GET_MODE (reg), slot, GET_MODE (slot),
950 SUBREG_BYTE (reg));
952 ra_emit_move_insn (reg, slot);
953 ni = get_insns ();
954 end_sequence ();
955 before = web->last_use_insn;
956 web->last_use_insn = NULL_RTX;
957 if (!before)
959 if (JUMP_P (last_block_insn))
960 before = last_block_insn;
961 else
962 after = last_block_insn;
964 if (after)
966 rtx foll = NEXT_INSN (after);
967 bb = BLOCK_FOR_INSN (after);
968 emit_insn_after (ni, after);
969 if (bb->end == after)
970 bb->end = PREV_INSN (foll);
971 for (ni = NEXT_INSN (after); ni != foll; ni = NEXT_INSN (ni))
973 set_block_for_insn (ni, bb);
974 df_insn_modify (df, bb, ni);
977 else
979 rtx prev = PREV_INSN (before);
980 bb = BLOCK_FOR_INSN (before);
981 emit_insn_before (ni, before);
982 if (bb->head == before)
983 bb->head = NEXT_INSN (prev);
984 for (; ni != before; ni = NEXT_INSN (ni))
986 set_block_for_insn (ni, bb);
987 df_insn_modify (df, bb, ni);
990 if (supweb->pattern)
992 emitted_remat++;
993 spill_remat_cost += bb->frequency + 1;
995 else
997 emitted_spill_loads++;
998 spill_load_cost += bb->frequency + 1;
1000 RESET_BIT (ri->live, web->id);
1001 /* In the special case documented above only emit the reloads and
1002 one load. */
1003 if (ri->need_load == 2 && j < nl_first_reload)
1004 break;
1006 if (ri->need_load)
1007 ri->nl_size = j;
1010 /* Given a set of reloads in RI, an array of NUM_REFS references (either
1011 uses or defs) in REFS, and REF2WEB to translate ref IDs to webs
1012 (either use2web or def2web) convert some reloads to loads.
1013 This looks at the webs referenced, and how they change the set of
1014 available colors. Now put all still live webs, which needed reloads,
1015 and whose colors isn't free anymore, on the needed_loads list. */
1017 static void
1018 reloads_to_loads (ri, refs, num_refs, ref2web)
1019 struct rewrite_info *ri;
1020 struct ref **refs;
1021 unsigned int num_refs;
1022 struct web **ref2web;
1024 unsigned int n;
1025 int num_reloads = ri->num_reloads;
1026 for (n = 0; n < num_refs && num_reloads; n++)
1028 struct web *web = ref2web[DF_REF_ID (refs[n])];
1029 struct web *supweb = find_web_for_subweb (web);
1030 int is_death;
1031 int j;
1032 /* Only emit reloads when entering their interference
1033 region. A use of a spilled web never opens an
1034 interference region, independent of it's color. */
1035 if (alias (supweb)->type == SPILLED)
1036 continue;
1037 if (supweb->type == PRECOLORED
1038 && TEST_HARD_REG_BIT (never_use_colors, supweb->color))
1039 continue;
1040 /* Note, that if web (and supweb) are DEFs, we already cleared
1041 the corresponding bits in live. I.e. is_death becomes true, which
1042 is what we want. */
1043 is_death = !TEST_BIT (ri->live, supweb->id);
1044 is_death &= !TEST_BIT (ri->live, web->id);
1045 if (is_death)
1047 int old_num_r = num_reloads;
1048 bitmap_clear (ri->scratch);
1049 EXECUTE_IF_SET_IN_BITMAP (ri->need_reload, 0, j,
1051 struct web *web2 = ID2WEB (j);
1052 struct web *aweb2 = alias (find_web_for_subweb (web2));
1053 if (spill_is_free (&(ri->colors_in_use), aweb2) == 0)
1054 abort ();
1055 if (spill_same_color_p (supweb, aweb2)
1056 /* && interfere (web, web2) */)
1058 if (!web2->in_load)
1060 ri->needed_loads[ri->nl_size++] = web2;
1061 web2->in_load = 1;
1063 bitmap_set_bit (ri->scratch, j);
1064 num_reloads--;
1067 if (num_reloads != old_num_r)
1068 bitmap_operation (ri->need_reload, ri->need_reload, ri->scratch,
1069 BITMAP_AND_COMPL);
1072 ri->num_reloads = num_reloads;
1075 /* This adds loads for spilled webs to the program. It uses a kind of
1076 interference region spilling. If flag_ra_ir_spilling is zero it
1077 only uses improved chaitin spilling (adding loads only at insns
1078 containing deaths). */
1080 static void
1081 rewrite_program2 (new_deaths)
1082 bitmap new_deaths;
1084 basic_block bb;
1085 int nl_first_reload;
1086 struct rewrite_info ri;
1087 rtx insn;
1088 ri.needed_loads = (struct web **) xmalloc (num_webs * sizeof (struct web *));
1089 ri.need_reload = BITMAP_XMALLOC ();
1090 ri.scratch = BITMAP_XMALLOC ();
1091 ri.live = sbitmap_alloc (num_webs);
1092 ri.nl_size = 0;
1093 ri.num_reloads = 0;
1094 for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
1096 basic_block last_bb = NULL;
1097 rtx last_block_insn;
1098 int i, j;
1099 if (!INSN_P (insn))
1100 insn = prev_real_insn (insn);
1101 while (insn && !(bb = BLOCK_FOR_INSN (insn)))
1102 insn = prev_real_insn (insn);
1103 if (!insn)
1104 break;
1105 i = bb->index + 2;
1106 last_block_insn = insn;
1108 sbitmap_zero (ri.live);
1109 CLEAR_HARD_REG_SET (ri.colors_in_use);
1110 EXECUTE_IF_SET_IN_BITMAP (live_at_end[i - 2], 0, j,
1112 struct web *web = use2web[j];
1113 struct web *aweb = alias (find_web_for_subweb (web));
1114 /* A web is only live at end, if it isn't spilled. If we wouldn't
1115 check this, the last uses of spilled web per basic block
1116 wouldn't be detected as deaths, although they are in the final
1117 code. This would lead to cumulating many loads without need,
1118 only increasing register pressure. */
1119 /* XXX do add also spilled webs which got a color for IR spilling.
1120 Remember to not add to colors_in_use in that case. */
1121 if (aweb->type != SPILLED /*|| aweb->color >= 0*/)
1123 SET_BIT (ri.live, web->id);
1124 if (aweb->type != SPILLED)
1125 update_spill_colors (&(ri.colors_in_use), web, 1);
1129 bitmap_clear (ri.need_reload);
1130 ri.num_reloads = 0;
1131 ri.any_spilltemps_spilled = 0;
1132 if (flag_ra_ir_spilling)
1134 struct dlist *d;
1135 int pass;
1136 /* XXX If we don't add spilled nodes into live above, the following
1137 becomes an empty loop. */
1138 for (pass = 0; pass < 2; pass++)
1139 for (d = (pass) ? WEBS(SPILLED) : WEBS(COALESCED); d; d = d->next)
1141 struct web *web = DLIST_WEB (d);
1142 struct web *aweb = alias (web);
1143 if (aweb->type != SPILLED)
1144 continue;
1145 if (is_partly_live (ri.live, web)
1146 && spill_is_free (&(ri.colors_in_use), web) > 0)
1148 ri.num_reloads++;
1149 bitmap_set_bit (ri.need_reload, web->id);
1150 /* Last using insn is somewhere in another block. */
1151 web->last_use_insn = NULL_RTX;
1156 last_bb = bb;
1157 for (; insn; insn = PREV_INSN (insn))
1159 struct ra_insn_info info;
1160 unsigned int n;
1162 if (INSN_P (insn) && BLOCK_FOR_INSN (insn) != last_bb)
1164 int index = BLOCK_FOR_INSN (insn)->index + 2;
1165 EXECUTE_IF_SET_IN_BITMAP (live_at_end[index - 2], 0, j,
1167 struct web *web = use2web[j];
1168 struct web *aweb = alias (find_web_for_subweb (web));
1169 if (aweb->type != SPILLED)
1171 SET_BIT (ri.live, web->id);
1172 update_spill_colors (&(ri.colors_in_use), web, 1);
1175 bitmap_clear (ri.scratch);
1176 EXECUTE_IF_SET_IN_BITMAP (ri.need_reload, 0, j,
1178 struct web *web2 = ID2WEB (j);
1179 struct web *supweb2 = find_web_for_subweb (web2);
1180 struct web *aweb2 = alias (supweb2);
1181 if (spill_is_free (&(ri.colors_in_use), aweb2) <= 0)
1183 if (!web2->in_load)
1185 ri.needed_loads[ri.nl_size++] = web2;
1186 web2->in_load = 1;
1188 bitmap_set_bit (ri.scratch, j);
1189 ri.num_reloads--;
1192 bitmap_operation (ri.need_reload, ri.need_reload, ri.scratch,
1193 BITMAP_AND_COMPL);
1194 last_bb = BLOCK_FOR_INSN (insn);
1195 last_block_insn = insn;
1196 if (!INSN_P (last_block_insn))
1197 last_block_insn = prev_real_insn (last_block_insn);
1200 ri.need_load = 0;
1201 if (INSN_P (insn))
1202 info = insn_df[INSN_UID (insn)];
1204 if (INSN_P (insn))
1205 for (n = 0; n < info.num_defs; n++)
1207 struct ref *ref = info.defs[n];
1208 struct web *web = def2web[DF_REF_ID (ref)];
1209 struct web *supweb = find_web_for_subweb (web);
1210 int is_non_def = 0;
1211 unsigned int n2;
1213 supweb = find_web_for_subweb (web);
1214 /* Webs which are defined here, but also used in the same insn
1215 are rmw webs, or this use isn't a death because of looping
1216 constructs. In neither case makes this def available it's
1217 resources. Reloads for it are still needed, it's still
1218 live and it's colors don't become free. */
1219 for (n2 = 0; n2 < info.num_uses; n2++)
1221 struct web *web2 = use2web[DF_REF_ID (info.uses[n2])];
1222 if (supweb == find_web_for_subweb (web2))
1224 is_non_def = 1;
1225 break;
1228 if (is_non_def)
1229 continue;
1231 if (!is_partly_live (ri.live, supweb))
1232 bitmap_set_bit (useless_defs, DF_REF_ID (ref));
1234 RESET_BIT (ri.live, web->id);
1235 if (bitmap_bit_p (ri.need_reload, web->id))
1237 ri.num_reloads--;
1238 bitmap_clear_bit (ri.need_reload, web->id);
1240 if (web != supweb)
1242 /* XXX subwebs aren't precisely tracked here. We have
1243 everything we need (inverse webs), but the code isn't
1244 yet written. We need to make all completely
1245 overlapping web parts non-live here. */
1246 /* If by luck now the whole web isn't live anymore, no
1247 reloads for it are needed. */
1248 if (!is_partly_live (ri.live, supweb)
1249 && bitmap_bit_p (ri.need_reload, supweb->id))
1251 ri.num_reloads--;
1252 bitmap_clear_bit (ri.need_reload, supweb->id);
1255 else
1257 struct web *sweb;
1258 /* If the whole web is defined here, no parts of it are
1259 live anymore and no reloads are needed for them. */
1260 for (sweb = supweb->subreg_next; sweb;
1261 sweb = sweb->subreg_next)
1263 RESET_BIT (ri.live, sweb->id);
1264 if (bitmap_bit_p (ri.need_reload, sweb->id))
1266 ri.num_reloads--;
1267 bitmap_clear_bit (ri.need_reload, sweb->id);
1271 if (alias (supweb)->type != SPILLED)
1272 update_spill_colors (&(ri.colors_in_use), web, 0);
1275 nl_first_reload = ri.nl_size;
1277 /* CALL_INSNs are not really deaths, but still more registers
1278 are free after a call, than before.
1279 XXX Note, that sometimes reload barfs when we emit insns between
1280 a call and the insn which copies the return register into a
1281 pseudo. */
1282 if (GET_CODE (insn) == CALL_INSN)
1283 ri.need_load = 1;
1284 else if (INSN_P (insn))
1285 for (n = 0; n < info.num_uses; n++)
1287 struct web *web = use2web[DF_REF_ID (info.uses[n])];
1288 struct web *supweb = find_web_for_subweb (web);
1289 int is_death;
1290 if (supweb->type == PRECOLORED
1291 && TEST_HARD_REG_BIT (never_use_colors, supweb->color))
1292 continue;
1293 is_death = !TEST_BIT (ri.live, supweb->id);
1294 is_death &= !TEST_BIT (ri.live, web->id);
1295 if (is_death)
1297 ri.need_load = 1;
1298 bitmap_set_bit (new_deaths, INSN_UID (insn));
1299 break;
1303 if (INSN_P (insn) && ri.num_reloads)
1305 int old_num_reloads = ri.num_reloads;
1306 reloads_to_loads (&ri, info.uses, info.num_uses, use2web);
1308 /* If this insn sets a pseudo, which isn't used later
1309 (i.e. wasn't live before) it is a dead store. We need
1310 to emit all reloads which have the same color as this def.
1311 We don't need to check for non-liveness here to detect
1312 the deadness (it anyway is too late, as we already cleared
1313 the liveness in the first loop over the defs), because if it
1314 _would_ be live here, no reload could have that color, as
1315 they would already have been converted to a load. */
1316 if (ri.num_reloads)
1317 reloads_to_loads (&ri, info.defs, info.num_defs, def2web);
1318 if (ri.num_reloads != old_num_reloads && !ri.need_load)
1319 ri.need_load = 1;
1322 if (ri.nl_size && (ri.need_load || ri.any_spilltemps_spilled))
1323 emit_loads (&ri, nl_first_reload, last_block_insn);
1325 if (INSN_P (insn) && flag_ra_ir_spilling)
1326 for (n = 0; n < info.num_uses; n++)
1328 struct web *web = use2web[DF_REF_ID (info.uses[n])];
1329 struct web *aweb = alias (find_web_for_subweb (web));
1330 if (aweb->type != SPILLED)
1331 update_spill_colors (&(ri.colors_in_use), web, 1);
1334 ri.any_spilltemps_spilled = 0;
1335 if (INSN_P (insn))
1336 for (n = 0; n < info.num_uses; n++)
1338 struct web *web = use2web[DF_REF_ID (info.uses[n])];
1339 struct web *supweb = find_web_for_subweb (web);
1340 struct web *aweb = alias (supweb);
1341 SET_BIT (ri.live, web->id);
1342 if (aweb->type != SPILLED)
1343 continue;
1344 if (supweb->spill_temp)
1345 ri.any_spilltemps_spilled = 1;
1346 web->last_use_insn = insn;
1347 if (!web->in_load)
1349 if (spill_is_free (&(ri.colors_in_use), aweb) <= 0
1350 || !flag_ra_ir_spilling)
1352 ri.needed_loads[ri.nl_size++] = web;
1353 web->in_load = 1;
1354 web->one_load = 1;
1356 else if (!bitmap_bit_p (ri.need_reload, web->id))
1358 bitmap_set_bit (ri.need_reload, web->id);
1359 ri.num_reloads++;
1360 web->one_load = 1;
1362 else
1363 web->one_load = 0;
1365 else
1366 web->one_load = 0;
1369 if (GET_CODE (insn) == CODE_LABEL)
1370 break;
1373 nl_first_reload = ri.nl_size;
1374 if (ri.num_reloads)
1376 int in_ir = 0;
1377 edge e;
1378 int num = 0;
1379 HARD_REG_SET cum_colors, colors;
1380 CLEAR_HARD_REG_SET (cum_colors);
1381 for (e = bb->pred; e && num < 5; e = e->pred_next, num++)
1383 int j;
1384 CLEAR_HARD_REG_SET (colors);
1385 EXECUTE_IF_SET_IN_BITMAP (live_at_end[e->src->index], 0, j,
1387 struct web *web = use2web[j];
1388 struct web *aweb = alias (find_web_for_subweb (web));
1389 if (aweb->type != SPILLED)
1390 update_spill_colors (&colors, web, 1);
1392 IOR_HARD_REG_SET (cum_colors, colors);
1394 if (num == 5)
1395 in_ir = 1;
1397 bitmap_clear (ri.scratch);
1398 EXECUTE_IF_SET_IN_BITMAP (ri.need_reload, 0, j,
1400 struct web *web2 = ID2WEB (j);
1401 struct web *supweb2 = find_web_for_subweb (web2);
1402 struct web *aweb2 = alias (supweb2);
1403 /* block entry is IR boundary for aweb2?
1404 Currently more some tries for good conditions. */
1405 if (((ra_pass > 0 || supweb2->target_of_spilled_move)
1406 && (1 || in_ir || spill_is_free (&cum_colors, aweb2) <= 0))
1407 || (ra_pass == 1
1408 && (in_ir
1409 || spill_is_free (&cum_colors, aweb2) <= 0)))
1411 if (!web2->in_load)
1413 ri.needed_loads[ri.nl_size++] = web2;
1414 web2->in_load = 1;
1416 bitmap_set_bit (ri.scratch, j);
1417 ri.num_reloads--;
1420 bitmap_operation (ri.need_reload, ri.need_reload, ri.scratch,
1421 BITMAP_AND_COMPL);
1424 ri.need_load = 1;
1425 emit_loads (&ri, nl_first_reload, last_block_insn);
1426 if (ri.nl_size != 0 /*|| ri.num_reloads != 0*/)
1427 abort ();
1428 if (!insn)
1429 break;
1431 free (ri.needed_loads);
1432 sbitmap_free (ri.live);
1433 BITMAP_XFREE (ri.scratch);
1434 BITMAP_XFREE (ri.need_reload);
1437 /* WEBS is a web conflicting with a spilled one. Prepare it
1438 to be able to rescan it in the next pass. Mark all it's uses
1439 for checking, and clear the some members of their web parts
1440 (of defs and uses). Notably don't clear the uplink. We don't
1441 change the layout of this web, just it's conflicts.
1442 Also remember all IDs of its uses in USES_AS_BITMAP. */
1444 static void
1445 mark_refs_for_checking (web, uses_as_bitmap)
1446 struct web *web;
1447 bitmap uses_as_bitmap;
1449 unsigned int i;
1450 for (i = 0; i < web->num_uses; i++)
1452 unsigned int id = DF_REF_ID (web->uses[i]);
1453 SET_BIT (last_check_uses, id);
1454 bitmap_set_bit (uses_as_bitmap, id);
1455 web_parts[df->def_id + id].spanned_deaths = 0;
1456 web_parts[df->def_id + id].crosses_call = 0;
1458 for (i = 0; i < web->num_defs; i++)
1460 unsigned int id = DF_REF_ID (web->defs[i]);
1461 web_parts[id].spanned_deaths = 0;
1462 web_parts[id].crosses_call = 0;
1466 /* The last step of the spill phase is to set up the structures for
1467 incrementally rebuilding the interference graph. We break up
1468 the web part structure of all spilled webs, mark their uses for
1469 rechecking, look at their neighbors, and clean up some global
1470 information, we will rebuild. */
1472 static void
1473 detect_web_parts_to_rebuild ()
1475 bitmap uses_as_bitmap;
1476 unsigned int i, pass;
1477 struct dlist *d;
1478 sbitmap already_webs = sbitmap_alloc (num_webs);
1480 uses_as_bitmap = BITMAP_XMALLOC ();
1481 if (last_check_uses)
1482 sbitmap_free (last_check_uses);
1483 last_check_uses = sbitmap_alloc (df->use_id);
1484 sbitmap_zero (last_check_uses);
1485 sbitmap_zero (already_webs);
1486 /* We need to recheck all uses of all webs involved in spilling (and the
1487 uses added by spill insns, but those are not analyzed yet).
1488 Those are the spilled webs themself, webs coalesced to spilled ones,
1489 and webs conflicting with any of them. */
1490 for (pass = 0; pass < 2; pass++)
1491 for (d = (pass == 0) ? WEBS(SPILLED) : WEBS(COALESCED); d; d = d->next)
1493 struct web *web = DLIST_WEB (d);
1494 struct conflict_link *wl;
1495 unsigned int j;
1496 /* This check is only needed for coalesced nodes, but hey. */
1497 if (alias (web)->type != SPILLED)
1498 continue;
1500 /* For the spilled web itself we also need to clear it's
1501 uplink, to be able to rebuild smaller webs. After all
1502 spilling has split the web. */
1503 for (i = 0; i < web->num_uses; i++)
1505 unsigned int id = DF_REF_ID (web->uses[i]);
1506 SET_BIT (last_check_uses, id);
1507 bitmap_set_bit (uses_as_bitmap, id);
1508 web_parts[df->def_id + id].uplink = NULL;
1509 web_parts[df->def_id + id].spanned_deaths = 0;
1510 web_parts[df->def_id + id].crosses_call = 0;
1512 for (i = 0; i < web->num_defs; i++)
1514 unsigned int id = DF_REF_ID (web->defs[i]);
1515 web_parts[id].uplink = NULL;
1516 web_parts[id].spanned_deaths = 0;
1517 web_parts[id].crosses_call = 0;
1520 /* Now look at all neighbors of this spilled web. */
1521 if (web->have_orig_conflicts)
1522 wl = web->orig_conflict_list;
1523 else
1524 wl = web->conflict_list;
1525 for (; wl; wl = wl->next)
1527 if (TEST_BIT (already_webs, wl->t->id))
1528 continue;
1529 SET_BIT (already_webs, wl->t->id);
1530 mark_refs_for_checking (wl->t, uses_as_bitmap);
1532 EXECUTE_IF_SET_IN_BITMAP (web->useless_conflicts, 0, j,
1534 struct web *web2 = ID2WEB (j);
1535 if (TEST_BIT (already_webs, web2->id))
1536 continue;
1537 SET_BIT (already_webs, web2->id);
1538 mark_refs_for_checking (web2, uses_as_bitmap);
1542 /* We also recheck unconditionally all uses of any hardregs. This means
1543 we _can_ delete all these uses from the live_at_end[] bitmaps.
1544 And because we sometimes delete insn refering to hardregs (when
1545 they became useless because they setup a rematerializable pseudo, which
1546 then was rematerialized), some of those uses will go away with the next
1547 df_analyse(). This means we even _must_ delete those uses from
1548 the live_at_end[] bitmaps. For simplicity we simply delete
1549 all of them. */
1550 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1551 if (!fixed_regs[i])
1553 struct df_link *link;
1554 for (link = df->regs[i].uses; link; link = link->next)
1555 if (link->ref)
1556 bitmap_set_bit (uses_as_bitmap, DF_REF_ID (link->ref));
1559 /* The information in live_at_end[] will be rebuild for all uses
1560 we recheck, so clear it here (the uses of spilled webs, might
1561 indeed not become member of it again). */
1562 live_at_end -= 2;
1563 for (i = 0; i < (unsigned int) last_basic_block + 2; i++)
1564 bitmap_operation (live_at_end[i], live_at_end[i], uses_as_bitmap,
1565 BITMAP_AND_COMPL);
1566 live_at_end += 2;
1568 if (rtl_dump_file && (debug_new_regalloc & DUMP_REBUILD) != 0)
1570 ra_debug_msg (DUMP_REBUILD, "need to check these uses:\n");
1571 dump_sbitmap_file (rtl_dump_file, last_check_uses);
1573 sbitmap_free (already_webs);
1574 BITMAP_XFREE (uses_as_bitmap);
1577 /* Statistics about deleted insns, which are useless now. */
1578 static unsigned int deleted_def_insns;
1579 static unsigned HOST_WIDE_INT deleted_def_cost;
1581 /* In rewrite_program2() we noticed, when a certain insn set a pseudo
1582 which wasn't live. Try to delete all those insns. */
1584 static void
1585 delete_useless_defs ()
1587 unsigned int i;
1588 /* If the insn only sets the def without any sideeffect (besides
1589 clobbers or uses), we can delete it. single_set() also tests
1590 for INSN_P(insn). */
1591 EXECUTE_IF_SET_IN_BITMAP (useless_defs, 0, i,
1593 rtx insn = DF_REF_INSN (df->defs[i]);
1594 rtx set = single_set (insn);
1595 struct web *web = find_web_for_subweb (def2web[i]);
1596 if (set && web->type == SPILLED && web->stack_slot == NULL)
1598 deleted_def_insns++;
1599 deleted_def_cost += BLOCK_FOR_INSN (insn)->frequency + 1;
1600 PUT_CODE (insn, NOTE);
1601 NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
1602 df_insn_modify (df, BLOCK_FOR_INSN (insn), insn);
1607 /* Look for spilled webs, on whose behalf no insns were emitted.
1608 We inversify (sp?) the changed flag of the webs, so after this function
1609 a nonzero changed flag means, that this web was not spillable (at least
1610 in this pass). */
1612 static void
1613 detect_non_changed_webs ()
1615 struct dlist *d, *d_next;
1616 for (d = WEBS(SPILLED); d; d = d_next)
1618 struct web *web = DLIST_WEB (d);
1619 d_next = d->next;
1620 if (!web->changed)
1622 ra_debug_msg (DUMP_PROCESS, "no insns emitted for spilled web %d\n",
1623 web->id);
1624 remove_web_from_list (web);
1625 put_web (web, COLORED);
1626 web->changed = 1;
1628 else
1629 web->changed = 0;
1630 /* From now on web->changed is used as the opposite flag.
1631 I.e. colored webs, which have changed set were formerly
1632 spilled webs for which no insns were emitted. */
1636 /* Before spilling we clear the changed flags for all spilled webs. */
1638 static void
1639 reset_changed_flag ()
1641 struct dlist *d;
1642 for (d = WEBS(SPILLED); d; d = d->next)
1643 DLIST_WEB(d)->changed = 0;
1646 /* The toplevel function for this file. Given a colorized graph,
1647 and lists of spilled, coalesced and colored webs, we add some
1648 spill code. This also sets up the structures for incrementally
1649 building the interference graph in the next pass. */
1651 void
1652 actual_spill ()
1654 int i;
1655 bitmap new_deaths = BITMAP_XMALLOC ();
1656 reset_changed_flag ();
1657 spill_coalprop ();
1658 choose_spill_colors ();
1659 useless_defs = BITMAP_XMALLOC ();
1660 if (flag_ra_improved_spilling)
1661 rewrite_program2 (new_deaths);
1662 else
1663 rewrite_program (new_deaths);
1664 insert_stores (new_deaths);
1665 delete_useless_defs ();
1666 BITMAP_XFREE (useless_defs);
1667 sbitmap_free (insns_with_deaths);
1668 insns_with_deaths = sbitmap_alloc (get_max_uid ());
1669 death_insns_max_uid = get_max_uid ();
1670 sbitmap_zero (insns_with_deaths);
1671 EXECUTE_IF_SET_IN_BITMAP (new_deaths, 0, i,
1672 { SET_BIT (insns_with_deaths, i);});
1673 detect_non_changed_webs ();
1674 detect_web_parts_to_rebuild ();
1675 BITMAP_XFREE (new_deaths);
1678 /* A bitmap of pseudo reg numbers which are coalesced directly
1679 to a hardreg. Set in emit_colors(), used and freed in
1680 remove_suspicious_death_notes(). */
1681 static bitmap regnos_coalesced_to_hardregs;
1683 /* Create new pseudos for each web we colored, change insns to
1684 use those pseudos and set up ra_reg_renumber. */
1686 void
1687 emit_colors (df)
1688 struct df *df;
1690 unsigned int i;
1691 int si;
1692 struct web *web;
1693 int old_max_regno = max_reg_num ();
1694 regset old_regs;
1695 basic_block bb;
1697 /* This bitmap is freed in remove_suspicious_death_notes(),
1698 which is also the user of it. */
1699 regnos_coalesced_to_hardregs = BITMAP_XMALLOC ();
1700 /* First create the (REG xx) rtx's for all webs, as we need to know
1701 the number, to make sure, flow has enough memory for them in the
1702 various tables. */
1703 for (i = 0; i < num_webs - num_subwebs; i++)
1705 web = ID2WEB (i);
1706 if (web->type != COLORED && web->type != COALESCED)
1707 continue;
1708 if (web->type == COALESCED && alias (web)->type == COLORED)
1709 continue;
1710 if (web->reg_rtx || web->regno < FIRST_PSEUDO_REGISTER)
1711 abort ();
1713 if (web->regno >= max_normal_pseudo)
1715 rtx place;
1716 if (web->color == an_unusable_color)
1718 unsigned int inherent_size = PSEUDO_REGNO_BYTES (web->regno);
1719 unsigned int total_size = MAX (inherent_size, 0);
1720 place = assign_stack_local (PSEUDO_REGNO_MODE (web->regno),
1721 total_size,
1722 inherent_size == total_size ? 0 : -1);
1723 RTX_UNCHANGING_P (place) =
1724 RTX_UNCHANGING_P (regno_reg_rtx[web->regno]);
1725 set_mem_alias_set (place, new_alias_set ());
1727 else
1729 place = gen_reg_rtx (PSEUDO_REGNO_MODE (web->regno));
1731 web->reg_rtx = place;
1733 else
1735 /* Special case for i386 'fix_truncdi_nomemory' insn.
1736 We must choose mode from insns not from PSEUDO_REGNO_MODE.
1737 Actual only for clobbered register. */
1738 if (web->num_uses == 0 && web->num_defs == 1)
1739 web->reg_rtx = gen_reg_rtx (GET_MODE (DF_REF_REAL_REG (web->defs[0])));
1740 else
1741 web->reg_rtx = gen_reg_rtx (PSEUDO_REGNO_MODE (web->regno));
1742 /* Remember the different parts directly coalesced to a hardreg. */
1743 if (web->type == COALESCED)
1744 bitmap_set_bit (regnos_coalesced_to_hardregs, REGNO (web->reg_rtx));
1747 ra_max_regno = max_regno = max_reg_num ();
1748 allocate_reg_info (max_regno, FALSE, FALSE);
1749 ra_reg_renumber = (short *) xmalloc (max_regno * sizeof (short));
1750 for (si = 0; si < max_regno; si++)
1751 ra_reg_renumber[si] = -1;
1753 /* Then go through all references, and replace them by a new
1754 pseudoreg for each web. All uses. */
1755 /* XXX
1756 Beware: The order of replacements (first uses, then defs) matters only
1757 for read-mod-write insns, where the RTL expression for the REG is
1758 shared between def and use. For normal rmw insns we connected all such
1759 webs, i.e. both the use and the def (which are the same memory)
1760 there get the same new pseudo-reg, so order would not matter.
1761 _However_ we did not connect webs, were the read cycle was an
1762 uninitialized read. If we now would first replace the def reference
1763 and then the use ref, we would initialize it with a REG rtx, which
1764 gets never initialized, and yet more wrong, which would overwrite
1765 the definition of the other REG rtx. So we must replace the defs last.
1767 for (i = 0; i < df->use_id; i++)
1768 if (df->uses[i])
1770 regset rs = DF_REF_BB (df->uses[i])->global_live_at_start;
1771 rtx regrtx;
1772 web = use2web[i];
1773 web = find_web_for_subweb (web);
1774 if (web->type != COLORED && web->type != COALESCED)
1775 continue;
1776 regrtx = alias (web)->reg_rtx;
1777 if (!regrtx)
1778 regrtx = web->reg_rtx;
1779 *DF_REF_REAL_LOC (df->uses[i]) = regrtx;
1780 if (REGNO_REG_SET_P (rs, web->regno) && REG_P (regrtx))
1782 /*CLEAR_REGNO_REG_SET (rs, web->regno);*/
1783 SET_REGNO_REG_SET (rs, REGNO (regrtx));
1787 /* And all defs. */
1788 for (i = 0; i < df->def_id; i++)
1790 regset rs;
1791 rtx regrtx;
1792 if (!df->defs[i])
1793 continue;
1794 rs = DF_REF_BB (df->defs[i])->global_live_at_start;
1795 web = def2web[i];
1796 web = find_web_for_subweb (web);
1797 if (web->type != COLORED && web->type != COALESCED)
1798 continue;
1799 regrtx = alias (web)->reg_rtx;
1800 if (!regrtx)
1801 regrtx = web->reg_rtx;
1802 *DF_REF_REAL_LOC (df->defs[i]) = regrtx;
1803 if (REGNO_REG_SET_P (rs, web->regno) && REG_P (regrtx))
1805 /* Don't simply clear the current regno, as it might be
1806 replaced by two webs. */
1807 /*CLEAR_REGNO_REG_SET (rs, web->regno);*/
1808 SET_REGNO_REG_SET (rs, REGNO (regrtx));
1812 /* And now set up the ra_reg_renumber array for reload with all the new
1813 pseudo-regs. */
1814 for (i = 0; i < num_webs - num_subwebs; i++)
1816 web = ID2WEB (i);
1817 if (web->reg_rtx && REG_P (web->reg_rtx))
1819 int r = REGNO (web->reg_rtx);
1820 ra_reg_renumber[r] = web->color;
1821 ra_debug_msg (DUMP_COLORIZE, "Renumber pseudo %d (== web %d) to %d\n",
1822 r, web->id, ra_reg_renumber[r]);
1826 old_regs = BITMAP_XMALLOC ();
1827 for (si = FIRST_PSEUDO_REGISTER; si < old_max_regno; si++)
1828 SET_REGNO_REG_SET (old_regs, si);
1829 FOR_EACH_BB (bb)
1831 AND_COMPL_REG_SET (bb->global_live_at_start, old_regs);
1832 AND_COMPL_REG_SET (bb->global_live_at_end, old_regs);
1834 BITMAP_XFREE (old_regs);
1837 /* Delete some coalesced moves from the insn stream. */
1839 void
1840 delete_moves ()
1842 struct move_list *ml;
1843 struct web *s, *t;
1844 /* XXX Beware: We normally would test here each copy insn, if
1845 source and target got the same color (either by coalescing or by pure
1846 luck), and then delete it.
1847 This will currently not work. One problem is, that we don't color
1848 the regs ourself, but instead defer to reload. So the colorization
1849 is only a kind of suggestion, which reload doesn't have to follow.
1850 For webs which are coalesced to a normal colored web, we only have one
1851 new pseudo, so in this case we indeed can delete copy insns involving
1852 those (because even if reload colors them different from our suggestion,
1853 it still has to color them the same, as only one pseudo exists). But for
1854 webs coalesced to precolored ones, we have not a single pseudo, but
1855 instead one for each coalesced web. This means, that we can't delete
1856 copy insns, where source and target are webs coalesced to precolored
1857 ones, because then the connection between both webs is destroyed. Note
1858 that this not only means copy insns, where one side is the precolored one
1859 itself, but also those between webs which are coalesced to one color.
1860 Also because reload we can't delete copy insns which involve any
1861 precolored web at all. These often have also special meaning (e.g.
1862 copying a return value of a call to a pseudo, or copying pseudo to the
1863 return register), and the deletion would confuse reload in thinking the
1864 pseudo isn't needed. One of those days reload will get away and we can
1865 do everything we want.
1866 In effect because of the later reload, we can't base our deletion on the
1867 colors itself, but instead need to base them on the newly created
1868 pseudos. */
1869 for (ml = wl_moves; ml; ml = ml->next)
1870 /* The real condition we would ideally use is: s->color == t->color.
1871 Additionally: s->type != PRECOLORED && t->type != PRECOLORED, in case
1872 we want to prevent deletion of "special" copies. */
1873 if (ml->move
1874 && (s = alias (ml->move->source_web))->reg_rtx
1875 == (t = alias (ml->move->target_web))->reg_rtx
1876 && s->type != PRECOLORED && t->type != PRECOLORED)
1878 basic_block bb = BLOCK_FOR_INSN (ml->move->insn);
1879 df_insn_delete (df, bb, ml->move->insn);
1880 deleted_move_insns++;
1881 deleted_move_cost += bb->frequency + 1;
1885 /* Due to resons documented elsewhere we create different pseudos
1886 for all webs coalesced to hardregs. For these parts life_analysis()
1887 might have added REG_DEAD notes without considering, that only this part
1888 but not the whole coalesced web dies. The RTL is correct, there is no
1889 coalescing yet. But if later reload's alter_reg() substitutes the
1890 hardreg into the REG rtx it looks like that particular hardreg dies here,
1891 although (due to coalescing) it still is live. This might make different
1892 places of reload think, it can use that hardreg for reload regs,
1893 accidentally overwriting it. So we need to remove those REG_DEAD notes.
1894 (Or better teach life_analysis() and reload about our coalescing, but
1895 that comes later) Bah. */
1897 void
1898 remove_suspicious_death_notes ()
1900 rtx insn;
1901 for (insn = get_insns(); insn; insn = NEXT_INSN (insn))
1902 if (INSN_P (insn))
1904 rtx *pnote = &REG_NOTES (insn);
1905 while (*pnote)
1907 rtx note = *pnote;
1908 if ((REG_NOTE_KIND (note) == REG_DEAD
1909 || REG_NOTE_KIND (note) == REG_UNUSED)
1910 && (GET_CODE (XEXP (note, 0)) == REG
1911 && bitmap_bit_p (regnos_coalesced_to_hardregs,
1912 REGNO (XEXP (note, 0)))))
1913 *pnote = XEXP (note, 1);
1914 else
1915 pnote = &XEXP (*pnote, 1);
1918 BITMAP_XFREE (regnos_coalesced_to_hardregs);
1919 regnos_coalesced_to_hardregs = NULL;
1922 /* Allocate space for max_reg_num() pseudo registers, and
1923 fill reg_renumber[] from ra_reg_renumber[]. If FREE_IT
1924 is nonzero, also free ra_reg_renumber and reset ra_max_regno. */
1926 void
1927 setup_renumber (free_it)
1928 int free_it;
1930 int i;
1931 max_regno = max_reg_num ();
1932 allocate_reg_info (max_regno, FALSE, TRUE);
1933 for (i = 0; i < max_regno; i++)
1935 reg_renumber[i] = (i < ra_max_regno) ? ra_reg_renumber[i] : -1;
1937 if (free_it)
1939 free (ra_reg_renumber);
1940 ra_reg_renumber = NULL;
1941 ra_max_regno = 0;
1945 /* Dump the costs and savings due to spilling, i.e. of added spill insns
1946 and removed moves or useless defs. */
1948 void
1949 dump_cost (level)
1950 unsigned int level;
1952 #define LU HOST_WIDE_INT_PRINT_UNSIGNED
1953 ra_debug_msg (level, "Instructions for spilling\n added:\n");
1954 ra_debug_msg (level, " loads =%d cost=" LU "\n", emitted_spill_loads,
1955 spill_load_cost);
1956 ra_debug_msg (level, " stores=%d cost=" LU "\n", emitted_spill_stores,
1957 spill_store_cost);
1958 ra_debug_msg (level, " remat =%d cost=" LU "\n", emitted_remat,
1959 spill_remat_cost);
1960 ra_debug_msg (level, " removed:\n");
1961 ra_debug_msg (level, " moves =%d cost=" LU "\n", deleted_move_insns,
1962 deleted_move_cost);
1963 ra_debug_msg (level, " others=%d cost=" LU "\n", deleted_def_insns,
1964 deleted_def_cost);
1965 #undef LU
1968 /* Initialization of the rewrite phase. */
1970 void
1971 ra_rewrite_init ()
1973 emitted_spill_loads = 0;
1974 emitted_spill_stores = 0;
1975 emitted_remat = 0;
1976 spill_load_cost = 0;
1977 spill_store_cost = 0;
1978 spill_remat_cost = 0;
1979 deleted_move_insns = 0;
1980 deleted_move_cost = 0;
1981 deleted_def_insns = 0;
1982 deleted_def_cost = 0;
1986 vim:cinoptions={.5s,g0,p5,t0,(0,^-0.5s,n-0.5s:tw=78:cindent:sw=4: