OSDN Git Service

2002-11-15 Eric Botcazou <ebotcazou@libertysurf.fr>
[pf3gnuchains/gcc-fork.git] / gcc / ra-rewrite.c
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>.
5
6    This file is part of GCC.
7
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.
11
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.
16
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.  */
20
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"
36
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.  */
41
42 struct rewrite_info;
43 struct rtx_list;
44
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 bool 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));
72
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;
77
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.  */
83
84 static void
85 spill_coalescing (coalesce, spilled)
86      sbitmap coalesce, spilled;
87 {
88   struct move_list *ml;
89   struct move *m;
90   for (ml = wl_moves; ml; ml = ml->next)
91     if ((m = ml->move) != NULL)
92       {
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)))
97           {
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;
103
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);
109
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)
131               {
132                 struct web *pweb = wl->t;
133                 if (wl->sub == NULL)
134                   record_conflict (s, pweb);
135                 else
136                   {
137                     struct sub_conflict *sl;
138                     for (sl = wl->sub; sl; sl = sl->next)
139                       {
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);
146                       }
147                   }
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;
152               }
153           }
154       }
155 }
156
157 /* Returns the probable saving of coalescing WEB with webs from
158    SPILLED, in terms of removed move insn cost.  */
159
160 static unsigned HOST_WIDE_INT
161 spill_prop_savings (web, spilled)
162      struct web *web;
163      sbitmap spilled;
164 {
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)
175       {
176         struct web *s = alias (m->source_web);
177         struct web *t = alias (m->target_web);
178         if (s != web)
179           {
180             struct web *h = s;
181             s = t;
182             t = h;
183           }
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;
189       }
190   return savings;
191 }
192
193 /* This add all IDs of colored webs, which are connected to WEB by a move
194    to LIST and PROCESSED.  */
195
196 static void
197 spill_prop_insert (web, list, processed)
198      struct web *web;
199      sbitmap list, processed;
200 {
201   struct move_list *ml;
202   struct move *m;
203   for (ml = wl_moves; ml; ml = ml->next)
204     if ((m = ml->move) != NULL)
205       {
206         struct web *s = alias (m->source_web);
207         struct web *t = alias (m->target_web);
208         if (s != web)
209           {
210             struct web *h = s;
211             s = t;
212             t = h;
213           }
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);
218       }
219 }
220
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.  */
231
232 static int
233 spill_propagation (to_prop, spilled, processed)
234      sbitmap to_prop, spilled, processed;
235 {
236   int id;
237   int again = 0;
238   sbitmap list = sbitmap_alloc (num_webs);
239   sbitmap_zero (list);
240
241   /* First insert colored move neighbors into the candidate list.  */
242   EXECUTE_IF_SET_IN_SBITMAP (to_prop, 0, id,
243     {
244       spill_prop_insert (ID2WEB (id), list, processed);
245     });
246   sbitmap_zero (to_prop);
247
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)
251     {
252       struct web *web = ID2WEB (id);
253       RESET_BIT (list, id);
254       if (spill_prop_savings (web, spilled) >= web->spill_cost)
255         {
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;
266         }
267     }
268   sbitmap_free (list);
269   return again;
270 }
271
272 /* The main phase to improve spill costs.  This repeatedly runs
273    spill coalescing and spill propagation, until nothing changes.  */
274
275 static void
276 spill_coalprop ()
277 {
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);
289   do
290     {
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);
298     }
299   while (again);
300   sbitmap_free (to_prop);
301   sbitmap_free (processed);
302   sbitmap_free (spilled);
303 }
304
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.  */
310
311 static void
312 allocate_spill_web (web)
313      struct web *web;
314 {
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;
321 }
322
323 /* This chooses a color for all SPILLED webs for interference region
324    spilling.  The heuristic isn't good in any way.  */
325
326 static void
327 choose_spill_colors ()
328 {
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)
333     {
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)
340         {
341           struct web *pweb = wl->t;
342           if (pweb->type == COLORED || pweb->type == PRECOLORED)
343             costs[pweb->color] += pweb->spill_cost;
344         }
345
346       COPY_HARD_REG_SET (avail, web->usable_regs);
347       if (web->crosses_call)
348         {
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;
354         }
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)))
360           {
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;
367           }
368       web->color = bestc;
369       ra_debug_msg (DUMP_PROCESS, "choosing color %d for spilled web %d\n",
370                  bestc, web->id);
371     }
372
373   free (costs);
374 }
375
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;
384
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;
389
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.  */
397
398 static void
399 rewrite_program (new_deaths)
400      bitmap new_deaths;
401 {
402   unsigned int i;
403   struct dlist *d;
404   bitmap b = BITMAP_XMALLOC ();
405
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)
411       {
412         struct web *web = DLIST_WEB (d);
413         struct web *aweb = alias (web);
414         unsigned int j;
415         rtx slot;
416
417         /* Is trivially true for spilled webs, but not for coalesced ones.  */
418         if (aweb->type != SPILLED)
419           continue;
420
421         /* First add loads before every use, if we have to.  */
422         if (flag_ra_spill_every_use)
423           {
424             bitmap_clear (b);
425             allocate_spill_web (aweb);
426             slot = aweb->stack_slot;
427             for (j = 0; j < web->num_uses; j++)
428               {
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;
436
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);
454
455                 if (bb->head == insn)
456                   bb->head = NEXT_INSN (prev);
457                 for (insn = PREV_INSN (insn); insn != prev;
458                      insn = PREV_INSN (insn))
459                   {
460                     set_block_for_insn (insn, bb);
461                     df_insn_modify (df, bb, insn);
462                   }
463
464                 emitted_spill_loads++;
465                 spill_load_cost += bb->frequency + 1;
466               }
467           }
468
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++)
478             {
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);
497
498               insns = get_insns ();
499               end_sequence ();
500               if (insns)
501                 {
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))
506                     {
507                       set_block_for_insn (insn, bb);
508                       df_insn_modify (df, bb, insn);
509                     }
510                 }
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)));
524             }
525       }
526
527   BITMAP_XFREE (b);
528 }
529
530 /* A simple list of rtx's.  */
531 struct rtx_list
532 {
533   struct rtx_list *next;
534   rtx x;
535 };
536
537 /* Adds X to *LIST.  */
538
539 static void
540 remember_slot (list, x)
541      struct rtx_list **list;
542      rtx x;
543 {
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;
550 }
551
552 /* Given two rtx' S1 and S2, either being REGs or MEMs (or SUBREGs
553    thereof), return nonzero, 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.  */
556
557 static int
558 slots_overlap_p (s1, s2)
559      rtx s1, s2;
560 {
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);
569
570   if (s1 == s2)
571     return 1;
572
573   if (GET_CODE (s1) != GET_CODE (s2))
574     return 0;
575
576   if (GET_CODE (s1) == REG && GET_CODE (s2) == REG)
577     {
578       if (REGNO (s1) != REGNO (s2))
579         return 0;
580       if (ofs1 >= ofs2 + size2 || ofs2 >= ofs1 + size1)
581         return 0;
582       return 1;
583     }
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;
603 }
604
605 /* This deletes from *LIST all rtx's which overlap with X in the sense
606    of slots_overlap_p().  */
607
608 static void
609 delete_overlapping_slots (list, x)
610      struct rtx_list **list;
611      rtx x;
612 {
613   while (*list)
614     {
615       if (slots_overlap_p ((*list)->x, x))
616         *list = (*list)->next;
617       else
618         list = &((*list)->next);
619     }
620 }
621
622 /* Returns nonzero, of X is member of LIST.  */
623
624 static int
625 slot_member_p (list, x)
626      struct rtx_list *list;
627      rtx x;
628 {
629   for (;list; list = list->next)
630     if (rtx_equal_p (list->x, x))
631       return 1;
632   return 0;
633 }
634
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.  */
640
641 static void
642 insert_stores (new_deaths)
643      bitmap new_deaths;
644 {
645   rtx insn;
646   rtx last_slot = NULL_RTX;
647   struct rtx_list *slots = NULL;
648
649   /* We go simply backwards over basic block borders.  */
650   for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
651     {
652       int uid = INSN_UID (insn);
653
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))
658         {
659           last_slot = NULL_RTX;
660           slots = NULL;
661         }
662       if (!INSN_P (insn))
663         continue;
664
665       /* If this insn was not just added in this pass.  */
666       if (uid < insn_df_max_uid)
667         {
668           unsigned int n;
669           rtx following = NEXT_INSN (insn);
670           basic_block bb = BLOCK_FOR_INSN (insn);
671           struct ra_insn_info info;
672
673           info = insn_df[uid];
674           for (n = 0; n < info.num_defs; n++)
675             {
676               struct web *web = def2web[DF_REF_ID (info.defs[n])];
677               struct web *aweb = alias (find_web_for_subweb (web));
678               rtx slot, source;
679               if (aweb->type != SPILLED || !aweb->stack_slot)
680                 continue;
681               slot = aweb->stack_slot;
682               source = DF_REF_REG (info.defs[n]);
683               /* adjust_address() might generate code.  */
684               start_sequence ();
685               if (GET_CODE (source) == SUBREG)
686                 slot = simplify_gen_subreg (GET_MODE (source), slot,
687                                             GET_MODE (slot),
688                                             SUBREG_BYTE (source));
689               /* If we have no info about emitted stores, or it didn't
690                  contain the location we intend to use soon, then
691                  add the store.  */
692               if ((!last_slot || !rtx_equal_p (slot, last_slot))
693                   && ! slot_member_p (slots, slot))
694                 {
695                   rtx insns, ni;
696                   last_slot = slot;
697                   remember_slot (&slots, slot);
698                   ra_emit_move_insn (slot, source);
699                   insns = get_insns ();
700                   end_sequence ();
701                   if (insns)
702                     {
703                       emit_insn_after (insns, insn);
704                       if (bb->end == insn)
705                         bb->end = PREV_INSN (following);
706                       for (ni = insns; ni != following; ni = NEXT_INSN (ni))
707                         {
708                           set_block_for_insn (ni, bb);
709                           df_insn_modify (df, bb, ni);
710                         }
711                     }
712                   else
713                     df_insn_modify (df, bb, insn);
714                   emitted_spill_stores++;
715                   spill_store_cost += bb->frequency + 1;
716                   bitmap_set_bit (new_deaths, INSN_UID (PREV_INSN (following)));
717                 }
718               else
719                 {
720                   /* Otherwise ignore insns from adjust_address() above.  */
721                   end_sequence ();
722                 }
723             }
724         }
725       /* If we look at a load generated by the allocator, forget
726          the last emitted slot, and additionally clear all slots
727          overlapping it's source (after all, we need it again).  */
728       /* XXX If we emit the stack-ref directly into the using insn the
729          following needs a change, because that is no new insn.  Preferably
730          we would add some notes to the insn, what stackslots are needed
731          for it.  */
732       if (uid >= last_max_uid)
733         {
734           rtx set = single_set (insn);
735           last_slot = NULL_RTX;
736           /* If this was no simple set, give up, and forget everything.  */
737           if (!set)
738             slots = NULL;
739           else
740             {
741               if (1 || GET_CODE (SET_SRC (set)) == MEM)
742                 delete_overlapping_slots (&slots, SET_SRC (set));
743             }
744         }
745     }
746 }
747
748 /* Returns 1 if both colored webs have some hardregs in common, even if
749    they are not the same width.  */
750
751 static int
752 spill_same_color_p (web1, web2)
753      struct web *web1, *web2;
754 {
755   int c1, size1, c2, size2;
756   if ((c1 = alias (web1)->color) < 0 || c1 == an_unusable_color)
757     return 0;
758   if ((c2 = alias (web2)->color) < 0 || c2 == an_unusable_color)
759     return 0;
760
761   size1 = web1->type == PRECOLORED
762           ? 1 : HARD_REGNO_NREGS (c1, PSEUDO_REGNO_MODE (web1->regno));
763   size2 = web2->type == PRECOLORED
764           ? 1 : HARD_REGNO_NREGS (c2, PSEUDO_REGNO_MODE (web2->regno));
765   if (c1 >= c2 + size2 || c2 >= c1 + size1)
766     return 0;
767   return 1;
768 }
769
770 /* Given the set of live web IDs LIVE, returns nonzero, if any of WEBs
771    subwebs (or WEB itself) is live.  */
772
773 static bool
774 is_partly_live_1 (live, web)
775      sbitmap live;
776      struct web *web;
777 {
778   do
779     if (TEST_BIT (live, web->id))
780       return 1;
781   while ((web = web->subreg_next));
782   return 0;
783 }
784
785 /* Fast version in case WEB has no subwebs.  */
786 #define is_partly_live(live, web) ((!web->subreg_next)  \
787                                    ? TEST_BIT (live, web->id)   \
788                                    : is_partly_live_1 (live, web))
789
790 /* Change the set of currently IN_USE colors according to
791    WEB's color.  Either add those colors to the hardreg set (if ADD
792    is nonzero), or remove them.  */
793
794 static void
795 update_spill_colors (in_use, web, add)
796      HARD_REG_SET *in_use;
797      struct web *web;
798      int add;
799 {
800   int c, size;
801   if ((c = alias (find_web_for_subweb (web))->color) < 0
802       || c == an_unusable_color)
803     return;
804   size = HARD_REGNO_NREGS (c, GET_MODE (web->orig_x));
805   if (SUBWEB_P (web))
806     {
807       c += subreg_regno_offset (c, GET_MODE (SUBREG_REG (web->orig_x)),
808                                 SUBREG_BYTE (web->orig_x),
809                                 GET_MODE (web->orig_x));
810     }
811   else if (web->type == PRECOLORED)
812     size = 1;
813   if (add)
814     for (; size--;)
815       SET_HARD_REG_BIT (*in_use, c + size);
816   else
817     for (; size--;)
818       CLEAR_HARD_REG_BIT (*in_use, c + size);
819 }
820
821 /* Given a set of hardregs currently IN_USE and the color C of WEB,
822    return -1 if WEB has no color, 1 of it has the unusable color,
823    0 if one of it's used hardregs are in use, and 1 otherwise.
824    Generally, if WEB can't be left colorized return 1.  */
825
826 static int
827 spill_is_free (in_use, web)
828      HARD_REG_SET *in_use;
829      struct web *web;
830 {
831   int c, size;
832   if ((c = alias (web)->color) < 0)
833     return -1;
834   if (c == an_unusable_color)
835     return 1;
836   size = web->type == PRECOLORED
837          ? 1 : HARD_REGNO_NREGS (c, PSEUDO_REGNO_MODE (web->regno));
838   for (; size--;)
839     if (TEST_HARD_REG_BIT (*in_use, c + size))
840       return 0;
841   return 1;
842 }
843
844
845 /* Structure for passing between rewrite_program2() and emit_loads().  */
846 struct rewrite_info
847 {
848   /* The web IDs which currently would need a reload.  These are
849      currently live spilled webs, whose color was still free.  */
850   bitmap need_reload;
851   /* We need a scratch bitmap, but don't want to allocate one a zillion
852      times.  */
853   bitmap scratch;
854   /* Web IDs of currently live webs.  This are the precise IDs,
855      not just those of the superwebs.  If only on part is live, only
856      that ID is placed here.  */
857   sbitmap live;
858   /* An array of webs, which currently need a load added.
859      They will be emitted when seeing the first death.  */ 
860   struct web **needed_loads;
861   /* The current number of entries in needed_loads.  */
862   int nl_size;
863   /* The number of bits set in need_reload.  */
864   int num_reloads;
865   /* The current set of hardregs not available.  */
866   HARD_REG_SET colors_in_use;
867   /* Nonzero, if we just added some spill temps to need_reload or
868      needed_loads.  In this case we don't wait for the next death
869      to emit their loads.  */
870   int any_spilltemps_spilled;
871   /* Nonzero, if we currently need to emit the loads.  E.g. when we
872      saw an insn containing deaths.  */
873   int need_load;
874 };
875
876 /* The needed_loads list of RI contains some webs for which
877    we add the actual load insns here.  They are added just before
878    their use last seen.  NL_FIRST_RELOAD is the index of the first
879    load which is a converted reload, all other entries are normal
880    loads.  LAST_BLOCK_INSN is the last insn of the current basic block.  */
881
882 static void
883 emit_loads (ri, nl_first_reload, last_block_insn)
884      struct rewrite_info *ri;
885      int nl_first_reload;
886      rtx last_block_insn;
887 {
888   int j;
889   for (j = ri->nl_size; j;)
890     {
891       struct web *web = ri->needed_loads[--j];
892       struct web *supweb;
893       struct web *aweb;
894       rtx ni, slot, reg;
895       rtx before = NULL_RTX, after = NULL_RTX;
896       basic_block bb;
897       /* When spilltemps were spilled for the last insns, their
898          loads already are emitted, which is noted by setting
899          needed_loads[] for it to 0.  */
900       if (!web)
901         continue;
902       supweb = find_web_for_subweb (web);
903       if (supweb->regno >= max_normal_pseudo)
904         abort ();
905       /* Check for web being a spilltemp, if we only want to
906          load spilltemps.  Also remember, that we emitted that
907          load, which we don't need to do when we have a death,
908          because then all of needed_loads[] is emptied.  */
909       if (!ri->need_load)
910         {
911           if (!supweb->spill_temp)
912             continue;
913           else
914             ri->needed_loads[j] = 0;
915         }
916       web->in_load = 0;
917       /* The adding of reloads doesn't depend on liveness.  */
918       if (j < nl_first_reload && !TEST_BIT (ri->live, web->id))
919         continue;
920       aweb = alias (supweb);
921       aweb->changed = 1;
922       start_sequence ();
923       if (supweb->pattern)
924         {
925           /* XXX If we later allow non-constant sources for rematerialization
926              we must also disallow coalescing _to_ rematerialized webs
927              (at least then disallow spilling them, which we already ensure
928              when flag_ra_break_aliases), or not take the pattern but a
929              stackslot.  */
930           if (aweb != supweb)
931             abort ();
932           slot = copy_rtx (supweb->pattern);
933           reg = copy_rtx (supweb->orig_x);
934           /* Sanity check.  orig_x should be a REG rtx, which should be
935              shared over all RTL, so copy_rtx should have no effect.  */
936           if (reg != supweb->orig_x)
937             abort ();
938         }
939       else
940         {
941           allocate_spill_web (aweb);
942           slot = aweb->stack_slot;
943
944           /* If we don't copy the RTL there might be some SUBREG
945              rtx shared in the next iteration although being in
946              different webs, which leads to wrong code.  */
947           reg = copy_rtx (web->orig_x);
948           if (GET_CODE (reg) == SUBREG)
949             /*slot = adjust_address (slot, GET_MODE (reg), SUBREG_BYTE
950                (reg));*/
951             slot = simplify_gen_subreg (GET_MODE (reg), slot, GET_MODE (slot),
952                                         SUBREG_BYTE (reg));
953         }
954       ra_emit_move_insn (reg, slot);
955       ni = get_insns ();
956       end_sequence ();
957       before = web->last_use_insn;
958       web->last_use_insn = NULL_RTX;
959       if (!before)
960         {
961           if (JUMP_P (last_block_insn))
962             before = last_block_insn;
963           else
964             after = last_block_insn;
965         }
966       if (after)
967         {
968           rtx foll = NEXT_INSN (after);
969           bb = BLOCK_FOR_INSN (after);
970           emit_insn_after (ni, after);
971           if (bb->end == after)
972             bb->end = PREV_INSN (foll);
973           for (ni = NEXT_INSN (after); ni != foll; ni = NEXT_INSN (ni))
974             {
975               set_block_for_insn (ni, bb);
976               df_insn_modify (df, bb, ni);
977             }
978         }
979       else
980         {
981           rtx prev = PREV_INSN (before);
982           bb = BLOCK_FOR_INSN (before);
983           emit_insn_before (ni, before);
984           if (bb->head == before)
985             bb->head = NEXT_INSN (prev);
986           for (; ni != before; ni = NEXT_INSN (ni))
987             {
988               set_block_for_insn (ni, bb);
989               df_insn_modify (df, bb, ni);
990             }
991         }
992       if (supweb->pattern)
993         {
994           emitted_remat++;
995           spill_remat_cost += bb->frequency + 1;
996         }
997       else
998         {
999           emitted_spill_loads++;
1000           spill_load_cost += bb->frequency + 1;
1001         }
1002       RESET_BIT (ri->live, web->id);
1003       /* In the special case documented above only emit the reloads and
1004          one load.  */
1005       if (ri->need_load == 2 && j < nl_first_reload)
1006         break;
1007     }
1008   if (ri->need_load)
1009     ri->nl_size = j;
1010 }
1011
1012 /* Given a set of reloads in RI, an array of NUM_REFS references (either
1013    uses or defs) in REFS, and REF2WEB to translate ref IDs to webs
1014    (either use2web or def2web) convert some reloads to loads.
1015    This looks at the webs referenced, and how they change the set of
1016    available colors.  Now put all still live webs, which needed reloads,
1017    and whose colors isn't free anymore, on the needed_loads list.  */
1018
1019 static void
1020 reloads_to_loads (ri, refs, num_refs, ref2web)
1021      struct rewrite_info *ri;
1022      struct ref **refs;
1023      unsigned int num_refs;
1024      struct web **ref2web;
1025 {
1026   unsigned int n;
1027   int num_reloads = ri->num_reloads;
1028   for (n = 0; n < num_refs && num_reloads; n++)
1029     {
1030       struct web *web = ref2web[DF_REF_ID (refs[n])];
1031       struct web *supweb = find_web_for_subweb (web);
1032       int is_death;
1033       int j;
1034       /* Only emit reloads when entering their interference
1035          region.  A use of a spilled web never opens an
1036          interference region, independent of it's color.  */
1037       if (alias (supweb)->type == SPILLED)
1038         continue;
1039       if (supweb->type == PRECOLORED
1040           && TEST_HARD_REG_BIT (never_use_colors, supweb->color))
1041         continue;
1042       /* Note, that if web (and supweb) are DEFs, we already cleared
1043          the corresponding bits in live.  I.e. is_death becomes true, which
1044          is what we want.  */
1045       is_death = !TEST_BIT (ri->live, supweb->id);
1046       is_death &= !TEST_BIT (ri->live, web->id);
1047       if (is_death)
1048         {
1049           int old_num_r = num_reloads;
1050           bitmap_clear (ri->scratch);
1051           EXECUTE_IF_SET_IN_BITMAP (ri->need_reload, 0, j,
1052             {
1053               struct web *web2 = ID2WEB (j);
1054               struct web *aweb2 = alias (find_web_for_subweb (web2));
1055               if (spill_is_free (&(ri->colors_in_use), aweb2) == 0)
1056                 abort ();
1057               if (spill_same_color_p (supweb, aweb2)
1058                   /* && interfere (web, web2) */)
1059                 {
1060                   if (!web2->in_load)
1061                     {
1062                       ri->needed_loads[ri->nl_size++] = web2;
1063                       web2->in_load = 1;
1064                     }
1065                   bitmap_set_bit (ri->scratch, j);
1066                   num_reloads--;
1067                 }
1068             });
1069           if (num_reloads != old_num_r)
1070             bitmap_operation (ri->need_reload, ri->need_reload, ri->scratch,
1071                               BITMAP_AND_COMPL);
1072         }
1073     }
1074   ri->num_reloads = num_reloads;
1075 }
1076
1077 /* This adds loads for spilled webs to the program.  It uses a kind of
1078    interference region spilling.  If flag_ra_ir_spilling is zero it
1079    only uses improved chaitin spilling (adding loads only at insns
1080    containing deaths).  */
1081
1082 static void
1083 rewrite_program2 (new_deaths)
1084      bitmap new_deaths;
1085 {
1086   basic_block bb;
1087   int nl_first_reload;
1088   struct rewrite_info ri;
1089   rtx insn;
1090   ri.needed_loads = (struct web **) xmalloc (num_webs * sizeof (struct web *));
1091   ri.need_reload = BITMAP_XMALLOC ();
1092   ri.scratch = BITMAP_XMALLOC ();
1093   ri.live = sbitmap_alloc (num_webs);
1094   ri.nl_size = 0;
1095   ri.num_reloads = 0;
1096   for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
1097     {
1098       basic_block last_bb = NULL;
1099       rtx last_block_insn;
1100       int i, j;
1101       if (!INSN_P (insn))
1102         insn = prev_real_insn (insn);
1103       while (insn && !(bb = BLOCK_FOR_INSN (insn)))
1104         insn = prev_real_insn (insn);
1105       if (!insn)
1106         break;
1107       i = bb->index + 2;
1108       last_block_insn = insn;
1109
1110       sbitmap_zero (ri.live);
1111       CLEAR_HARD_REG_SET (ri.colors_in_use);
1112       EXECUTE_IF_SET_IN_BITMAP (live_at_end[i - 2], 0, j,
1113         {
1114           struct web *web = use2web[j];
1115           struct web *aweb = alias (find_web_for_subweb (web));
1116           /* A web is only live at end, if it isn't spilled.  If we wouldn't
1117              check this, the last uses of spilled web per basic block
1118              wouldn't be detected as deaths, although they are in the final
1119              code.  This would lead to cumulating many loads without need,
1120              only increasing register pressure.  */
1121           /* XXX do add also spilled webs which got a color for IR spilling.
1122              Remember to not add to colors_in_use in that case.  */
1123           if (aweb->type != SPILLED /*|| aweb->color >= 0*/)
1124             {
1125               SET_BIT (ri.live, web->id);
1126               if (aweb->type != SPILLED)
1127                 update_spill_colors (&(ri.colors_in_use), web, 1);
1128             }
1129         });
1130
1131       bitmap_clear (ri.need_reload);
1132       ri.num_reloads = 0;
1133       ri.any_spilltemps_spilled = 0;
1134       if (flag_ra_ir_spilling)
1135         {
1136           struct dlist *d;
1137           int pass;
1138           /* XXX If we don't add spilled nodes into live above, the following
1139              becomes an empty loop.  */
1140           for (pass = 0; pass < 2; pass++)
1141             for (d = (pass) ? WEBS(SPILLED) : WEBS(COALESCED); d; d = d->next)
1142               {
1143                 struct web *web = DLIST_WEB (d);
1144                 struct web *aweb = alias (web);
1145                 if (aweb->type != SPILLED)
1146                   continue;
1147                 if (is_partly_live (ri.live, web)
1148                     && spill_is_free (&(ri.colors_in_use), web) > 0)
1149                   {
1150                     ri.num_reloads++;
1151                     bitmap_set_bit (ri.need_reload, web->id);
1152                     /* Last using insn is somewhere in another block.  */
1153                     web->last_use_insn = NULL_RTX;
1154                   }
1155               }
1156         }
1157
1158       last_bb = bb;
1159       for (; insn; insn = PREV_INSN (insn))
1160         {
1161           struct ra_insn_info info;
1162           unsigned int n;
1163
1164           if (INSN_P (insn) && BLOCK_FOR_INSN (insn) != last_bb)
1165             {
1166               int index = BLOCK_FOR_INSN (insn)->index + 2;
1167               EXECUTE_IF_SET_IN_BITMAP (live_at_end[index - 2], 0, j,
1168                 {
1169                   struct web *web = use2web[j];
1170                   struct web *aweb = alias (find_web_for_subweb (web));
1171                   if (aweb->type != SPILLED)
1172                     {
1173                       SET_BIT (ri.live, web->id);
1174                       update_spill_colors (&(ri.colors_in_use), web, 1);
1175                     }
1176                 });
1177               bitmap_clear (ri.scratch);
1178               EXECUTE_IF_SET_IN_BITMAP (ri.need_reload, 0, j,
1179                 {
1180                   struct web *web2 = ID2WEB (j);
1181                   struct web *supweb2 = find_web_for_subweb (web2);
1182                   struct web *aweb2 = alias (supweb2);
1183                   if (spill_is_free (&(ri.colors_in_use), aweb2) <= 0)
1184                     {
1185                       if (!web2->in_load)
1186                         {
1187                           ri.needed_loads[ri.nl_size++] = web2;
1188                           web2->in_load = 1;
1189                         }
1190                       bitmap_set_bit (ri.scratch, j);
1191                       ri.num_reloads--;
1192                     }
1193                 });
1194               bitmap_operation (ri.need_reload, ri.need_reload, ri.scratch,
1195                                 BITMAP_AND_COMPL);
1196               last_bb = BLOCK_FOR_INSN (insn);
1197               last_block_insn = insn;
1198               if (!INSN_P (last_block_insn))
1199                 last_block_insn = prev_real_insn (last_block_insn);
1200             }
1201
1202           ri.need_load = 0;
1203           if (INSN_P (insn))
1204             info = insn_df[INSN_UID (insn)];
1205
1206           if (INSN_P (insn))
1207             for (n = 0; n < info.num_defs; n++)
1208               {
1209                 struct ref *ref = info.defs[n];
1210                 struct web *web = def2web[DF_REF_ID (ref)];
1211                 struct web *supweb = find_web_for_subweb (web);
1212                 int is_non_def = 0;
1213                 unsigned int n2;
1214
1215                 supweb = find_web_for_subweb (web);
1216                 /* Webs which are defined here, but also used in the same insn
1217                    are rmw webs, or this use isn't a death because of looping
1218                    constructs.  In neither case makes this def available it's
1219                    resources.  Reloads for it are still needed, it's still
1220                    live and it's colors don't become free.  */
1221                 for (n2 = 0; n2 < info.num_uses; n2++)
1222                   {
1223                     struct web *web2 = use2web[DF_REF_ID (info.uses[n2])];
1224                     if (supweb == find_web_for_subweb (web2))
1225                       {
1226                         is_non_def = 1;
1227                         break;
1228                       }
1229                   }
1230                 if (is_non_def)
1231                   continue;
1232
1233                 if (!is_partly_live (ri.live, supweb))
1234                   bitmap_set_bit (useless_defs, DF_REF_ID (ref));
1235
1236                 RESET_BIT (ri.live, web->id);
1237                 if (bitmap_bit_p (ri.need_reload, web->id))
1238                   {
1239                     ri.num_reloads--;
1240                     bitmap_clear_bit (ri.need_reload, web->id);
1241                   }
1242                 if (web != supweb)
1243                   {
1244                     /* XXX subwebs aren't precisely tracked here.  We have
1245                        everything we need (inverse webs), but the code isn't
1246                        yet written.  We need to make all completely
1247                        overlapping web parts non-live here.  */
1248                     /* If by luck now the whole web isn't live anymore, no
1249                        reloads for it are needed.  */
1250                     if (!is_partly_live (ri.live, supweb)
1251                         && bitmap_bit_p (ri.need_reload, supweb->id))
1252                       {
1253                         ri.num_reloads--;
1254                         bitmap_clear_bit (ri.need_reload, supweb->id);
1255                       }
1256                   }
1257                 else
1258                   {
1259                     struct web *sweb;
1260                     /* If the whole web is defined here, no parts of it are
1261                        live anymore and no reloads are needed for them.  */
1262                     for (sweb = supweb->subreg_next; sweb;
1263                          sweb = sweb->subreg_next)
1264                       {
1265                         RESET_BIT (ri.live, sweb->id);
1266                         if (bitmap_bit_p (ri.need_reload, sweb->id))
1267                           {
1268                             ri.num_reloads--;
1269                             bitmap_clear_bit (ri.need_reload, sweb->id);
1270                           }
1271                       }
1272                   }
1273                 if (alias (supweb)->type != SPILLED)
1274                   update_spill_colors (&(ri.colors_in_use), web, 0);
1275               }
1276
1277           nl_first_reload = ri.nl_size;
1278
1279           /* CALL_INSNs are not really deaths, but still more registers
1280              are free after a call, than before.
1281              XXX Note, that sometimes reload barfs when we emit insns between
1282              a call and the insn which copies the return register into a
1283              pseudo.  */
1284           if (GET_CODE (insn) == CALL_INSN)
1285             ri.need_load = 1;
1286           else if (INSN_P (insn))
1287             for (n = 0; n < info.num_uses; n++)
1288               {
1289                 struct web *web = use2web[DF_REF_ID (info.uses[n])];
1290                 struct web *supweb = find_web_for_subweb (web);
1291                 int is_death;
1292                 if (supweb->type == PRECOLORED
1293                     && TEST_HARD_REG_BIT (never_use_colors, supweb->color))
1294                   continue;
1295                 is_death = !TEST_BIT (ri.live, supweb->id);
1296                 is_death &= !TEST_BIT (ri.live, web->id);
1297                 if (is_death)
1298                   {
1299                     ri.need_load = 1;
1300                     bitmap_set_bit (new_deaths, INSN_UID (insn));
1301                     break;
1302                   }
1303               }
1304
1305           if (INSN_P (insn) && ri.num_reloads)
1306             {
1307               int old_num_reloads = ri.num_reloads;
1308               reloads_to_loads (&ri, info.uses, info.num_uses, use2web);
1309
1310               /* If this insn sets a pseudo, which isn't used later
1311                  (i.e. wasn't live before) it is a dead store.  We need
1312                  to emit all reloads which have the same color as this def.
1313                  We don't need to check for non-liveness here to detect
1314                  the deadness (it anyway is too late, as we already cleared
1315                  the liveness in the first loop over the defs), because if it
1316                  _would_ be live here, no reload could have that color, as
1317                  they would already have been converted to a load.  */
1318               if (ri.num_reloads)
1319                 reloads_to_loads (&ri, info.defs, info.num_defs, def2web);
1320               if (ri.num_reloads != old_num_reloads && !ri.need_load)
1321                 ri.need_load = 1;
1322             }
1323
1324           if (ri.nl_size && (ri.need_load || ri.any_spilltemps_spilled))
1325             emit_loads (&ri, nl_first_reload, last_block_insn);
1326
1327           if (INSN_P (insn) && flag_ra_ir_spilling)
1328             for (n = 0; n < info.num_uses; n++)
1329               {
1330                 struct web *web = use2web[DF_REF_ID (info.uses[n])];
1331                 struct web *aweb = alias (find_web_for_subweb (web));
1332                 if (aweb->type != SPILLED)
1333                   update_spill_colors (&(ri.colors_in_use), web, 1);
1334               }
1335
1336           ri.any_spilltemps_spilled = 0;
1337           if (INSN_P (insn))
1338             for (n = 0; n < info.num_uses; n++)
1339               {
1340                 struct web *web = use2web[DF_REF_ID (info.uses[n])];
1341                 struct web *supweb = find_web_for_subweb (web);
1342                 struct web *aweb = alias (supweb);
1343                 SET_BIT (ri.live, web->id);
1344                 if (aweb->type != SPILLED)
1345                   continue;
1346                 if (supweb->spill_temp)
1347                   ri.any_spilltemps_spilled = 1;
1348                 web->last_use_insn = insn;
1349                 if (!web->in_load)
1350                   {
1351                     if (spill_is_free (&(ri.colors_in_use), aweb) <= 0
1352                         || !flag_ra_ir_spilling)
1353                       {
1354                         ri.needed_loads[ri.nl_size++] = web;
1355                         web->in_load = 1;
1356                         web->one_load = 1;
1357                       }
1358                     else if (!bitmap_bit_p (ri.need_reload, web->id))
1359                       {
1360                         bitmap_set_bit (ri.need_reload, web->id);
1361                         ri.num_reloads++;
1362                         web->one_load = 1;
1363                       }
1364                     else
1365                       web->one_load = 0;
1366                   }
1367                 else
1368                   web->one_load = 0;
1369               }
1370
1371           if (GET_CODE (insn) == CODE_LABEL)
1372             break;
1373         }
1374
1375       nl_first_reload = ri.nl_size;
1376       if (ri.num_reloads)
1377         {
1378           int in_ir = 0;
1379           edge e;
1380           int num = 0;
1381           HARD_REG_SET cum_colors, colors;
1382           CLEAR_HARD_REG_SET (cum_colors);
1383           for (e = bb->pred; e && num < 5; e = e->pred_next, num++)
1384             {
1385               int j;
1386               CLEAR_HARD_REG_SET (colors);
1387               EXECUTE_IF_SET_IN_BITMAP (live_at_end[e->src->index], 0, j,
1388                 {
1389                   struct web *web = use2web[j];
1390                   struct web *aweb = alias (find_web_for_subweb (web));
1391                   if (aweb->type != SPILLED)
1392                     update_spill_colors (&colors, web, 1);
1393                 });
1394               IOR_HARD_REG_SET (cum_colors, colors);
1395             }
1396           if (num == 5)
1397             in_ir = 1;
1398
1399           bitmap_clear (ri.scratch);
1400           EXECUTE_IF_SET_IN_BITMAP (ri.need_reload, 0, j,
1401             {
1402               struct web *web2 = ID2WEB (j);
1403               struct web *supweb2 = find_web_for_subweb (web2);
1404               struct web *aweb2 = alias (supweb2);
1405               /* block entry is IR boundary for aweb2?
1406                  Currently more some tries for good conditions.  */
1407               if (((ra_pass > 0 || supweb2->target_of_spilled_move)
1408                   && (1 || in_ir || spill_is_free (&cum_colors, aweb2) <= 0))
1409                   || (ra_pass == 1
1410                       && (in_ir
1411                           || spill_is_free (&cum_colors, aweb2) <= 0)))
1412                 {
1413                   if (!web2->in_load)
1414                     {
1415                       ri.needed_loads[ri.nl_size++] = web2;
1416                       web2->in_load = 1;
1417                     }
1418                   bitmap_set_bit (ri.scratch, j);
1419                   ri.num_reloads--;
1420                 }
1421             });
1422           bitmap_operation (ri.need_reload, ri.need_reload, ri.scratch,
1423                             BITMAP_AND_COMPL);
1424         }
1425
1426       ri.need_load = 1;
1427       emit_loads (&ri, nl_first_reload, last_block_insn);
1428       if (ri.nl_size != 0 /*|| ri.num_reloads != 0*/)
1429         abort ();
1430       if (!insn)
1431         break;
1432     }
1433   free (ri.needed_loads);
1434   sbitmap_free (ri.live);
1435   BITMAP_XFREE (ri.scratch);
1436   BITMAP_XFREE (ri.need_reload);
1437 }
1438
1439 /* WEBS is a web conflicting with a spilled one.  Prepare it
1440    to be able to rescan it in the next pass.  Mark all it's uses
1441    for checking, and clear the some members of their web parts
1442    (of defs and uses).  Notably don't clear the uplink.  We don't
1443    change the layout of this web, just it's conflicts.
1444    Also remember all IDs of its uses in USES_AS_BITMAP.  */
1445
1446 static void
1447 mark_refs_for_checking (web, uses_as_bitmap)
1448      struct web *web;
1449      bitmap uses_as_bitmap;
1450 {
1451   unsigned int i;
1452   for (i = 0; i < web->num_uses; i++)
1453     {
1454       unsigned int id = DF_REF_ID (web->uses[i]);
1455       SET_BIT (last_check_uses, id);
1456       bitmap_set_bit (uses_as_bitmap, id);
1457       web_parts[df->def_id + id].spanned_deaths = 0;
1458       web_parts[df->def_id + id].crosses_call = 0;
1459     }
1460   for (i = 0; i < web->num_defs; i++)
1461     {
1462       unsigned int id = DF_REF_ID (web->defs[i]);
1463       web_parts[id].spanned_deaths = 0;
1464       web_parts[id].crosses_call = 0;
1465     }
1466 }
1467
1468 /* The last step of the spill phase is to set up the structures for
1469    incrementally rebuilding the interference graph.  We break up
1470    the web part structure of all spilled webs, mark their uses for
1471    rechecking, look at their neighbors, and clean up some global
1472    information, we will rebuild.  */
1473
1474 static void
1475 detect_web_parts_to_rebuild ()
1476 {
1477   bitmap uses_as_bitmap;
1478   unsigned int i, pass;
1479   struct dlist *d;
1480   sbitmap already_webs = sbitmap_alloc (num_webs);
1481
1482   uses_as_bitmap = BITMAP_XMALLOC ();
1483   if (last_check_uses)
1484     sbitmap_free (last_check_uses);
1485   last_check_uses = sbitmap_alloc (df->use_id);
1486   sbitmap_zero (last_check_uses);
1487   sbitmap_zero (already_webs);
1488   /* We need to recheck all uses of all webs involved in spilling (and the
1489      uses added by spill insns, but those are not analyzed yet).
1490      Those are the spilled webs themself, webs coalesced to spilled ones,
1491      and webs conflicting with any of them.  */
1492   for (pass = 0; pass < 2; pass++)
1493     for (d = (pass == 0) ? WEBS(SPILLED) : WEBS(COALESCED); d; d = d->next)
1494       {
1495         struct web *web = DLIST_WEB (d);
1496         struct conflict_link *wl;
1497         unsigned int j;
1498         /* This check is only needed for coalesced nodes, but hey.  */
1499         if (alias (web)->type != SPILLED)
1500           continue;
1501
1502         /* For the spilled web itself we also need to clear it's
1503            uplink, to be able to rebuild smaller webs.  After all
1504            spilling has split the web.  */
1505         for (i = 0; i < web->num_uses; i++)
1506           {
1507             unsigned int id = DF_REF_ID (web->uses[i]);
1508             SET_BIT (last_check_uses, id);
1509             bitmap_set_bit (uses_as_bitmap, id);
1510             web_parts[df->def_id + id].uplink = NULL;
1511             web_parts[df->def_id + id].spanned_deaths = 0;
1512             web_parts[df->def_id + id].crosses_call = 0;
1513           }
1514         for (i = 0; i < web->num_defs; i++)
1515           {
1516             unsigned int id = DF_REF_ID (web->defs[i]);
1517             web_parts[id].uplink = NULL;
1518             web_parts[id].spanned_deaths = 0;
1519             web_parts[id].crosses_call = 0;
1520           }
1521
1522         /* Now look at all neighbors of this spilled web.  */
1523         if (web->have_orig_conflicts)
1524           wl = web->orig_conflict_list;
1525         else
1526           wl = web->conflict_list;
1527         for (; wl; wl = wl->next)
1528           {
1529             if (TEST_BIT (already_webs, wl->t->id))
1530               continue;
1531             SET_BIT (already_webs, wl->t->id);
1532             mark_refs_for_checking (wl->t, uses_as_bitmap);
1533           }
1534         EXECUTE_IF_SET_IN_BITMAP (web->useless_conflicts, 0, j,
1535           {
1536             struct web *web2 = ID2WEB (j);
1537             if (TEST_BIT (already_webs, web2->id))
1538               continue;
1539             SET_BIT (already_webs, web2->id);
1540             mark_refs_for_checking (web2, uses_as_bitmap);
1541           });
1542       }
1543
1544   /* We also recheck unconditionally all uses of any hardregs.  This means
1545      we _can_ delete all these uses from the live_at_end[] bitmaps.
1546      And because we sometimes delete insn refering to hardregs (when
1547      they became useless because they setup a rematerializable pseudo, which
1548      then was rematerialized), some of those uses will go away with the next
1549      df_analyse().  This means we even _must_ delete those uses from
1550      the live_at_end[] bitmaps.  For simplicity we simply delete
1551      all of them.  */
1552   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1553     if (!fixed_regs[i])
1554       {
1555         struct df_link *link;
1556         for (link = df->regs[i].uses; link; link = link->next)
1557           if (link->ref)
1558             bitmap_set_bit (uses_as_bitmap, DF_REF_ID (link->ref));
1559       }
1560
1561   /* The information in live_at_end[] will be rebuild for all uses
1562      we recheck, so clear it here (the uses of spilled webs, might
1563      indeed not become member of it again).  */
1564   live_at_end -= 2;
1565   for (i = 0; i < (unsigned int) last_basic_block + 2; i++)
1566     bitmap_operation (live_at_end[i], live_at_end[i], uses_as_bitmap,
1567                       BITMAP_AND_COMPL);
1568   live_at_end += 2;
1569
1570   if (rtl_dump_file && (debug_new_regalloc & DUMP_REBUILD) != 0)
1571     {
1572       ra_debug_msg (DUMP_REBUILD, "need to check these uses:\n");
1573       dump_sbitmap_file (rtl_dump_file, last_check_uses);
1574     }
1575   sbitmap_free (already_webs);
1576   BITMAP_XFREE (uses_as_bitmap);
1577 }
1578
1579 /* Statistics about deleted insns, which are useless now.  */
1580 static unsigned int deleted_def_insns;
1581 static unsigned HOST_WIDE_INT deleted_def_cost;
1582
1583 /* In rewrite_program2() we noticed, when a certain insn set a pseudo
1584    which wasn't live.  Try to delete all those insns.  */
1585
1586 static void
1587 delete_useless_defs ()
1588 {
1589   unsigned int i;
1590   /* If the insn only sets the def without any sideeffect (besides
1591      clobbers or uses), we can delete it.  single_set() also tests
1592      for INSN_P(insn).  */
1593   EXECUTE_IF_SET_IN_BITMAP (useless_defs, 0, i,
1594     {
1595       rtx insn = DF_REF_INSN (df->defs[i]);
1596       rtx set = single_set (insn);
1597       struct web *web = find_web_for_subweb (def2web[i]);
1598       if (set && web->type == SPILLED && web->stack_slot == NULL)
1599         {
1600           deleted_def_insns++;
1601           deleted_def_cost += BLOCK_FOR_INSN (insn)->frequency + 1;
1602           PUT_CODE (insn, NOTE);
1603           NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
1604           df_insn_modify (df, BLOCK_FOR_INSN (insn), insn);
1605         }
1606     });
1607 }
1608
1609 /* Look for spilled webs, on whose behalf no insns were emitted.
1610    We inversify (sp?) the changed flag of the webs, so after this function
1611    a nonzero changed flag means, that this web was not spillable (at least
1612    in this pass).  */
1613
1614 static void
1615 detect_non_changed_webs ()
1616 {
1617   struct dlist *d, *d_next;
1618   for (d = WEBS(SPILLED); d; d = d_next)
1619     {
1620       struct web *web = DLIST_WEB (d);
1621       d_next = d->next;
1622       if (!web->changed)
1623         {
1624           ra_debug_msg (DUMP_PROCESS, "no insns emitted for spilled web %d\n",
1625                      web->id);
1626           remove_web_from_list (web);
1627           put_web (web, COLORED);
1628           web->changed = 1;
1629         }
1630       else
1631         web->changed = 0;
1632       /* From now on web->changed is used as the opposite flag.
1633          I.e. colored webs, which have changed set were formerly
1634          spilled webs for which no insns were emitted.  */
1635     }
1636 }
1637
1638 /* Before spilling we clear the changed flags for all spilled webs.  */
1639
1640 static void
1641 reset_changed_flag ()
1642 {
1643   struct dlist *d;
1644   for (d = WEBS(SPILLED); d; d = d->next)
1645     DLIST_WEB(d)->changed = 0;
1646 }
1647
1648 /* The toplevel function for this file.  Given a colorized graph,
1649    and lists of spilled, coalesced and colored webs, we add some
1650    spill code.  This also sets up the structures for incrementally
1651    building the interference graph in the next pass.  */
1652
1653 void
1654 actual_spill ()
1655 {
1656   int i;
1657   bitmap new_deaths = BITMAP_XMALLOC ();
1658   reset_changed_flag ();
1659   spill_coalprop ();
1660   choose_spill_colors ();
1661   useless_defs = BITMAP_XMALLOC ();
1662   if (flag_ra_improved_spilling)
1663     rewrite_program2 (new_deaths);
1664   else
1665     rewrite_program (new_deaths);
1666   insert_stores (new_deaths);
1667   delete_useless_defs ();
1668   BITMAP_XFREE (useless_defs);
1669   sbitmap_free (insns_with_deaths);
1670   insns_with_deaths = sbitmap_alloc (get_max_uid ());
1671   death_insns_max_uid = get_max_uid ();
1672   sbitmap_zero (insns_with_deaths);
1673   EXECUTE_IF_SET_IN_BITMAP (new_deaths, 0, i,
1674     { SET_BIT (insns_with_deaths, i);});
1675   detect_non_changed_webs ();
1676   detect_web_parts_to_rebuild ();
1677   BITMAP_XFREE (new_deaths);
1678 }
1679
1680 /* A bitmap of pseudo reg numbers which are coalesced directly
1681    to a hardreg.  Set in emit_colors(), used and freed in
1682    remove_suspicious_death_notes().  */
1683 static bitmap regnos_coalesced_to_hardregs;
1684
1685 /* Create new pseudos for each web we colored, change insns to
1686    use those pseudos and set up ra_reg_renumber.  */
1687
1688 void
1689 emit_colors (df)
1690      struct df *df;
1691 {
1692   unsigned int i;
1693   int si;
1694   struct web *web;
1695   int old_max_regno = max_reg_num ();
1696   regset old_regs;
1697   basic_block bb;
1698
1699   /* This bitmap is freed in remove_suspicious_death_notes(),
1700      which is also the user of it.  */
1701   regnos_coalesced_to_hardregs = BITMAP_XMALLOC ();
1702   /* First create the (REG xx) rtx's for all webs, as we need to know
1703      the number, to make sure, flow has enough memory for them in the
1704      various tables.  */
1705   for (i = 0; i < num_webs - num_subwebs; i++)
1706     {
1707       web = ID2WEB (i);
1708       if (web->type != COLORED && web->type != COALESCED)
1709         continue;
1710       if (web->type == COALESCED && alias (web)->type == COLORED)
1711         continue;
1712       if (web->reg_rtx || web->regno < FIRST_PSEUDO_REGISTER)
1713         abort ();
1714
1715       if (web->regno >= max_normal_pseudo)
1716         {
1717           rtx place;
1718           if (web->color == an_unusable_color)
1719             {
1720               unsigned int inherent_size = PSEUDO_REGNO_BYTES (web->regno);
1721               unsigned int total_size = MAX (inherent_size, 0);
1722               place = assign_stack_local (PSEUDO_REGNO_MODE (web->regno),
1723                                           total_size,
1724                                           inherent_size == total_size ? 0 : -1);
1725               RTX_UNCHANGING_P (place) =
1726                   RTX_UNCHANGING_P (regno_reg_rtx[web->regno]);
1727               set_mem_alias_set (place, new_alias_set ());
1728             }
1729           else
1730             {
1731               place = gen_reg_rtx (PSEUDO_REGNO_MODE (web->regno));
1732             }
1733           web->reg_rtx = place;
1734         }
1735       else
1736         {
1737           /* Special case for i386 'fix_truncdi_nomemory' insn.
1738              We must choose mode from insns not from PSEUDO_REGNO_MODE.
1739              Actual only for clobbered register.  */
1740           if (web->num_uses == 0 && web->num_defs == 1)
1741             web->reg_rtx = gen_reg_rtx (GET_MODE (DF_REF_REAL_REG (web->defs[0])));
1742           else
1743             web->reg_rtx = gen_reg_rtx (PSEUDO_REGNO_MODE (web->regno));
1744           /* Remember the different parts directly coalesced to a hardreg.  */
1745           if (web->type == COALESCED)
1746             bitmap_set_bit (regnos_coalesced_to_hardregs, REGNO (web->reg_rtx));
1747         }
1748     }
1749   ra_max_regno = max_regno = max_reg_num ();
1750   allocate_reg_info (max_regno, FALSE, FALSE);
1751   ra_reg_renumber = (short *) xmalloc (max_regno * sizeof (short));
1752   for (si = 0; si < max_regno; si++)
1753     ra_reg_renumber[si] = -1;
1754
1755   /* Then go through all references, and replace them by a new
1756      pseudoreg for each web.  All uses.  */
1757   /* XXX
1758      Beware: The order of replacements (first uses, then defs) matters only
1759      for read-mod-write insns, where the RTL expression for the REG is
1760      shared between def and use.  For normal rmw insns we connected all such
1761      webs, i.e. both the use and the def (which are the same memory)
1762      there get the same new pseudo-reg, so order would not matter.
1763      _However_ we did not connect webs, were the read cycle was an
1764      uninitialized read.  If we now would first replace the def reference
1765      and then the use ref, we would initialize it with a REG rtx, which
1766      gets never initialized, and yet more wrong, which would overwrite
1767      the definition of the other REG rtx.  So we must replace the defs last.
1768    */
1769   for (i = 0; i < df->use_id; i++)
1770     if (df->uses[i])
1771       {
1772         regset rs = DF_REF_BB (df->uses[i])->global_live_at_start;
1773         rtx regrtx;
1774         web = use2web[i];
1775         web = find_web_for_subweb (web);
1776         if (web->type != COLORED && web->type != COALESCED)
1777           continue;
1778         regrtx = alias (web)->reg_rtx;
1779         if (!regrtx)
1780           regrtx = web->reg_rtx;
1781         *DF_REF_REAL_LOC (df->uses[i]) = regrtx;
1782         if (REGNO_REG_SET_P (rs, web->regno) && REG_P (regrtx))
1783           {
1784             /*CLEAR_REGNO_REG_SET (rs, web->regno);*/
1785             SET_REGNO_REG_SET (rs, REGNO (regrtx));
1786           }
1787       }
1788
1789   /* And all defs.  */
1790   for (i = 0; i < df->def_id; i++)
1791     {
1792       regset rs;
1793       rtx regrtx;
1794       if (!df->defs[i])
1795         continue;
1796       rs = DF_REF_BB (df->defs[i])->global_live_at_start;
1797       web = def2web[i];
1798       web = find_web_for_subweb (web);
1799       if (web->type != COLORED && web->type != COALESCED)
1800         continue;
1801       regrtx = alias (web)->reg_rtx;
1802       if (!regrtx)
1803         regrtx = web->reg_rtx;
1804       *DF_REF_REAL_LOC (df->defs[i]) = regrtx;
1805       if (REGNO_REG_SET_P (rs, web->regno) && REG_P (regrtx))
1806         {
1807           /* Don't simply clear the current regno, as it might be
1808              replaced by two webs.  */
1809           /*CLEAR_REGNO_REG_SET (rs, web->regno);*/
1810           SET_REGNO_REG_SET (rs, REGNO (regrtx));
1811         }
1812     }
1813
1814   /* And now set up the ra_reg_renumber array for reload with all the new
1815      pseudo-regs.  */
1816   for (i = 0; i < num_webs - num_subwebs; i++)
1817     {
1818       web = ID2WEB (i);
1819       if (web->reg_rtx && REG_P (web->reg_rtx))
1820         {
1821           int r = REGNO (web->reg_rtx);
1822           ra_reg_renumber[r] = web->color;
1823           ra_debug_msg (DUMP_COLORIZE, "Renumber pseudo %d (== web %d) to %d\n",
1824                      r, web->id, ra_reg_renumber[r]);
1825         }
1826     }
1827
1828   old_regs = BITMAP_XMALLOC ();
1829   for (si = FIRST_PSEUDO_REGISTER; si < old_max_regno; si++)
1830     SET_REGNO_REG_SET (old_regs, si);
1831   FOR_EACH_BB (bb)
1832     {
1833       AND_COMPL_REG_SET (bb->global_live_at_start, old_regs);
1834       AND_COMPL_REG_SET (bb->global_live_at_end, old_regs);
1835     }
1836   BITMAP_XFREE (old_regs);
1837 }
1838
1839 /* Delete some coalesced moves from the insn stream.  */
1840
1841 void
1842 delete_moves ()
1843 {
1844   struct move_list *ml;
1845   struct web *s, *t;
1846   /* XXX Beware: We normally would test here each copy insn, if
1847      source and target got the same color (either by coalescing or by pure
1848      luck), and then delete it.
1849      This will currently not work.  One problem is, that we don't color
1850      the regs ourself, but instead defer to reload.  So the colorization
1851      is only a kind of suggestion, which reload doesn't have to follow.
1852      For webs which are coalesced to a normal colored web, we only have one
1853      new pseudo, so in this case we indeed can delete copy insns involving
1854      those (because even if reload colors them different from our suggestion,
1855      it still has to color them the same, as only one pseudo exists).  But for
1856      webs coalesced to precolored ones, we have not a single pseudo, but
1857      instead one for each coalesced web.  This means, that we can't delete
1858      copy insns, where source and target are webs coalesced to precolored
1859      ones, because then the connection between both webs is destroyed.  Note
1860      that this not only means copy insns, where one side is the precolored one
1861      itself, but also those between webs which are coalesced to one color.
1862      Also because reload we can't delete copy insns which involve any
1863      precolored web at all.  These often have also special meaning (e.g.
1864      copying a return value of a call to a pseudo, or copying pseudo to the
1865      return register), and the deletion would confuse reload in thinking the
1866      pseudo isn't needed.  One of those days reload will get away and we can
1867      do everything we want.
1868      In effect because of the later reload, we can't base our deletion on the
1869      colors itself, but instead need to base them on the newly created
1870      pseudos.  */
1871   for (ml = wl_moves; ml; ml = ml->next)
1872     /* The real condition we would ideally use is: s->color == t->color.
1873        Additionally: s->type != PRECOLORED && t->type != PRECOLORED, in case
1874        we want to prevent deletion of "special" copies.  */
1875     if (ml->move
1876         && (s = alias (ml->move->source_web))->reg_rtx
1877             == (t = alias (ml->move->target_web))->reg_rtx
1878         && s->type != PRECOLORED && t->type != PRECOLORED)
1879       {
1880         basic_block bb = BLOCK_FOR_INSN (ml->move->insn);
1881         df_insn_delete (df, bb, ml->move->insn);
1882         deleted_move_insns++;
1883         deleted_move_cost += bb->frequency + 1;
1884       }
1885 }
1886
1887 /* Due to resons documented elsewhere we create different pseudos
1888    for all webs coalesced to hardregs.  For these parts life_analysis()
1889    might have added REG_DEAD notes without considering, that only this part
1890    but not the whole coalesced web dies.  The RTL is correct, there is no
1891    coalescing yet.  But if later reload's alter_reg() substitutes the
1892    hardreg into the REG rtx it looks like that particular hardreg dies here,
1893    although (due to coalescing) it still is live.  This might make different
1894    places of reload think, it can use that hardreg for reload regs,
1895    accidentally overwriting it.  So we need to remove those REG_DEAD notes.
1896    (Or better teach life_analysis() and reload about our coalescing, but
1897    that comes later) Bah.  */
1898
1899 void
1900 remove_suspicious_death_notes ()
1901 {
1902   rtx insn;
1903   for (insn = get_insns(); insn; insn = NEXT_INSN (insn))
1904     if (INSN_P (insn))
1905       {
1906         rtx *pnote = &REG_NOTES (insn);
1907         while (*pnote)
1908           {
1909             rtx note = *pnote;
1910             if ((REG_NOTE_KIND (note) == REG_DEAD
1911                  || REG_NOTE_KIND (note) == REG_UNUSED)
1912                 && (GET_CODE (XEXP (note, 0)) == REG
1913                     && bitmap_bit_p (regnos_coalesced_to_hardregs,
1914                                      REGNO (XEXP (note, 0)))))
1915               *pnote = XEXP (note, 1);
1916             else
1917               pnote = &XEXP (*pnote, 1);
1918           }
1919       }
1920   BITMAP_XFREE (regnos_coalesced_to_hardregs);
1921   regnos_coalesced_to_hardregs = NULL;
1922 }
1923
1924 /* Allocate space for max_reg_num() pseudo registers, and
1925    fill reg_renumber[] from ra_reg_renumber[].  If FREE_IT
1926    is nonzero, also free ra_reg_renumber and reset ra_max_regno.  */
1927
1928 void
1929 setup_renumber (free_it)
1930      int free_it;
1931 {
1932   int i;
1933   max_regno = max_reg_num ();
1934   allocate_reg_info (max_regno, FALSE, TRUE);
1935   for (i = 0; i < max_regno; i++)
1936     {
1937       reg_renumber[i] = (i < ra_max_regno) ? ra_reg_renumber[i] : -1;
1938     }
1939   if (free_it)
1940     {
1941       free (ra_reg_renumber);
1942       ra_reg_renumber = NULL;
1943       ra_max_regno = 0;
1944     }
1945 }
1946
1947 /* Dump the costs and savings due to spilling, i.e. of added spill insns
1948    and removed moves or useless defs.  */
1949
1950 void
1951 dump_cost (level)
1952      unsigned int level;
1953 {
1954   ra_debug_msg (level, "Instructions for spilling\n added:\n");
1955   ra_debug_msg (level, "  loads =%d cost=", emitted_spill_loads);
1956   ra_debug_msg (level, HOST_WIDE_INT_PRINT_UNSIGNED, spill_load_cost);
1957   ra_debug_msg (level, "\n  stores=%d cost=", emitted_spill_stores);
1958   ra_debug_msg (level, HOST_WIDE_INT_PRINT_UNSIGNED, spill_store_cost);
1959   ra_debug_msg (level, "\n  remat =%d cost=", emitted_remat);
1960   ra_debug_msg (level, HOST_WIDE_INT_PRINT_UNSIGNED, spill_remat_cost);
1961   ra_debug_msg (level, "\n removed:\n  moves =%d cost=", deleted_move_insns);
1962   ra_debug_msg (level, HOST_WIDE_INT_PRINT_UNSIGNED, deleted_move_cost);
1963   ra_debug_msg (level, "\n  others=%d cost=", deleted_def_insns);
1964   ra_debug_msg (level, HOST_WIDE_INT_PRINT_UNSIGNED, deleted_def_cost);
1965   ra_debug_msg (level, "\n");
1966 }
1967
1968 /* Initialization of the rewrite phase.  */
1969
1970 void
1971 ra_rewrite_init ()
1972 {
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;
1983 }
1984
1985 /*
1986 vim:cinoptions={.5s,g0,p5,t0,(0,^-0.5s,n-0.5s:tw=78:cindent:sw=4:
1987 */