OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / gcc / ra-build.c
1 /* Graph coloring register allocator
2    Copyright (C) 2001, 2002, 2003, 2004 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 "coretypes.h"
24 #include "tm.h"
25 #include "rtl.h"
26 #include "tm_p.h"
27 #include "insn-config.h"
28 #include "recog.h"
29 #include "reload.h"
30 #include "function.h"
31 #include "regs.h"
32 #include "hard-reg-set.h"
33 #include "basic-block.h"
34 #include "df.h"
35 #include "output.h"
36 #include "ggc.h"
37 #include "ra.h"
38
39 /* This file is part of the graph coloring register allocator.
40    It deals with building the interference graph.  When rebuilding
41    the graph for a function after spilling, we rebuild only those
42    parts needed, i.e. it works incrementally.
43
44    The first part (the functions called from build_web_parts_and_conflicts()
45    ) constructs a web_part for each pseudo register reference in the insn
46    stream, then goes backward from each use, until it reaches defs for that
47    pseudo.  While going back it remember seen defs for other registers as
48    conflicts.  By connecting the uses and defs, which reach each other, webs
49    (or live ranges) are built conceptually.
50
51    The second part (make_webs() and children) deals with converting that
52    structure to the nodes and edges, on which our interference graph is
53    built.  For each root web part constructed above, an instance of struct
54    web is created.  For all subregs of pseudos, which matter for allocation,
55    a subweb of the corresponding super web is built.  Finally all the
56    conflicts noted in the first part (as bitmaps) are transformed into real
57    edges.
58
59    As part of that process the webs are also classified (their spill cost
60    is calculated, and if they are spillable at all, and if not, for what
61    reason; or if they are rematerializable), and move insns are collected,
62    which are potentially coalescable.
63
64    The top-level entry of this file (build_i_graph) puts it all together,
65    and leaves us with a complete interference graph, which just has to
66    be colored.  */
67
68
69 struct curr_use;
70
71 static unsigned HOST_WIDE_INT rtx_to_undefined (rtx);
72 static bitmap find_sub_conflicts (struct web_part *, unsigned int);
73 static bitmap get_sub_conflicts (struct web_part *, unsigned int);
74 static unsigned int undef_to_size_word (rtx, unsigned HOST_WIDE_INT *);
75 static bitmap undef_to_bitmap (struct web_part *,
76                                unsigned HOST_WIDE_INT *);
77 static struct web_part * find_web_part_1 (struct web_part *);
78 static struct web_part * union_web_part_roots
79                                 (struct web_part *, struct web_part *);
80 static int defuse_overlap_p_1 (rtx, struct curr_use *);
81 static int live_out_1 (struct df *, struct curr_use *, rtx);
82 static int live_out (struct df *, struct curr_use *, rtx);
83 static rtx live_in_edge ( struct df *, struct curr_use *, edge);
84 static void live_in (struct df *, struct curr_use *, rtx);
85 static int copy_insn_p (rtx, rtx *, rtx *);
86 static void remember_move (rtx);
87 static void handle_asm_insn (struct df *, rtx);
88 static void prune_hardregs_for_mode (HARD_REG_SET *, enum machine_mode);
89 static void init_one_web_common (struct web *, rtx);
90 static void init_one_web (struct web *, rtx);
91 static void reinit_one_web (struct web *, rtx);
92 static struct web * add_subweb (struct web *, rtx);
93 static struct web * add_subweb_2 (struct web *, unsigned int);
94 static void init_web_parts (struct df *);
95 static void copy_conflict_list (struct web *);
96 static void add_conflict_edge (struct web *, struct web *);
97 static void build_inverse_webs (struct web *);
98 static void copy_web (struct web *, struct web_link **);
99 static void compare_and_free_webs (struct web_link **);
100 static void init_webs_defs_uses (void);
101 static unsigned int parts_to_webs_1 (struct df *, struct web_link **,
102                                      struct df_link *);
103 static void parts_to_webs (struct df *);
104 static void reset_conflicts (void);
105 #if 0
106 static void check_conflict_numbers (void)
107 #endif
108 static void conflicts_between_webs (struct df *);
109 static void remember_web_was_spilled (struct web *);
110 static void detect_spill_temps (void);
111 static int contains_pseudo (rtx);
112 static int want_to_remat (rtx x);
113 static void detect_remat_webs (void);
114 static void determine_web_costs (void);
115 static void detect_webs_set_in_cond_jump (void);
116 static void make_webs (struct df *);
117 static void moves_to_webs (struct df *);
118 static void connect_rmw_web_parts (struct df *);
119 static void update_regnos_mentioned (void);
120 static void livethrough_conflicts_bb (basic_block);
121 static void init_bb_info (void);
122 static void free_bb_info (void);
123 static void build_web_parts_and_conflicts (struct df *);
124
125
126 /* A sbitmap of DF_REF_IDs of uses, which are live over an abnormal
127    edge.  */
128 static sbitmap live_over_abnormal;
129
130 /* To cache if we already saw a certain edge while analyzing one
131    use, we use a tick count incremented per use.  */
132 static unsigned int visited_pass;
133
134 /* A sbitmap of UIDs of move insns, which we already analyzed.  */
135 static sbitmap move_handled;
136
137 /* One such structed is allocated per insn, and traces for the currently
138    analyzed use, which web part belongs to it, and how many bytes of
139    it were still undefined when that insn was reached.  */
140 struct visit_trace
141 {
142   struct web_part *wp;
143   unsigned HOST_WIDE_INT undefined;
144 };
145 /* Indexed by UID.  */
146 static struct visit_trace *visit_trace;
147
148 /* Per basic block we have one such structure, used to speed up
149    the backtracing of uses.  */
150 struct ra_bb_info
151 {
152   /* The value of visited_pass, as the first insn of this BB was reached
153      the last time.  If this equals the current visited_pass, then
154      undefined is valid.  Otherwise not.  */
155   unsigned int pass;
156   /* The still undefined bytes at that time.  The use to which this is
157      relative is the current use.  */
158   unsigned HOST_WIDE_INT undefined;
159   /* Bit regno is set, if that regno is mentioned in this BB as a def, or
160      the source of a copy insn.  In these cases we can not skip the whole
161      block if we reach it from the end.  */
162   bitmap regnos_mentioned;
163   /* If a use reaches the end of a BB, and that BB doesn't mention its
164      regno, we skip the block, and remember the ID of that use
165      as living throughout the whole block.  */
166   bitmap live_throughout;
167   /* The content of the aux field before placing a pointer to this
168      structure there.  */
169   void *old_aux;
170 };
171
172 /* We need a fast way to describe a certain part of a register.
173    Therefore we put together the size and offset (in bytes) in one
174    integer.  */
175 #define BL_TO_WORD(b, l) ((((b) & 0xFFFF) << 16) | ((l) & 0xFFFF))
176 #define BYTE_BEGIN(i) (((unsigned int)(i) >> 16) & 0xFFFF)
177 #define BYTE_LENGTH(i) ((unsigned int)(i) & 0xFFFF)
178
179 /* For a REG or SUBREG expression X return the size/offset pair
180    as an integer.  */
181
182 unsigned int
183 rtx_to_bits (rtx x)
184 {
185   unsigned int len, beg;
186   len = GET_MODE_SIZE (GET_MODE (x));
187   beg = (GET_CODE (x) == SUBREG) ? SUBREG_BYTE (x) : 0;
188   return BL_TO_WORD (beg, len);
189 }
190
191 /* X is a REG or SUBREG rtx.  Return the bytes it touches as a bitmask.  */
192
193 static unsigned HOST_WIDE_INT
194 rtx_to_undefined (rtx x)
195 {
196   unsigned int len, beg;
197   unsigned HOST_WIDE_INT ret;
198   len = GET_MODE_SIZE (GET_MODE (x));
199   beg = (GET_CODE (x) == SUBREG) ? SUBREG_BYTE (x) : 0;
200   ret = ~ ((unsigned HOST_WIDE_INT) 0);
201   ret = (~(ret << len)) << beg;
202   return ret;
203 }
204
205 /* We remember if we've analyzed an insn for being a move insn, and if yes
206    between which operands.  */
207 struct copy_p_cache
208 {
209   int seen;
210   rtx source;
211   rtx target;
212 };
213
214 /* On demand cache, for if insns are copy insns, and if yes, what
215    source/target they have.  */
216 static struct copy_p_cache * copy_cache;
217
218 int *number_seen;
219
220 /* For INSN, return nonzero, if it's a move insn, we consider to coalesce
221    later, and place the operands in *SOURCE and *TARGET, if they are
222    not NULL.  */
223
224 static int
225 copy_insn_p (rtx insn, rtx *source, rtx *target)
226 {
227   rtx d, s;
228   unsigned int d_regno, s_regno;
229   int uid = INSN_UID (insn);
230
231   gcc_assert (INSN_P (insn));
232
233   /* First look, if we already saw this insn.  */
234   if (copy_cache[uid].seen)
235     {
236       /* And if we saw it, if it's actually a copy insn.  */
237       if (copy_cache[uid].seen == 1)
238         {
239           if (source)
240             *source = copy_cache[uid].source;
241           if (target)
242             *target = copy_cache[uid].target;
243           return 1;
244         }
245       return 0;
246     }
247
248   /* Mark it as seen, but not being a copy insn.  */
249   copy_cache[uid].seen = 2;
250   insn = single_set (insn);
251   if (!insn)
252     return 0;
253   d = SET_DEST (insn);
254   s = SET_SRC (insn);
255
256   /* We recognize moves between subreg's as copy insns.  This is used to avoid
257      conflicts of those subwebs.  But they are currently _not_ used for
258      coalescing (the check for this is in remember_move() below).  */
259   while (GET_CODE (d) == STRICT_LOW_PART)
260     d = XEXP (d, 0);
261   if (!REG_P (d)
262       && (GET_CODE (d) != SUBREG || !REG_P (SUBREG_REG (d))))
263     return 0;
264   while (GET_CODE (s) == STRICT_LOW_PART)
265     s = XEXP (s, 0);
266   if (!REG_P (s)
267       && (GET_CODE (s) != SUBREG || !REG_P (SUBREG_REG (s))))
268     return 0;
269
270   s_regno = (unsigned) REGNO (GET_CODE (s) == SUBREG ? SUBREG_REG (s) : s);
271   d_regno = (unsigned) REGNO (GET_CODE (d) == SUBREG ? SUBREG_REG (d) : d);
272
273   /* Copies between hardregs are useless for us, as not coalesable anyway.  */
274   if ((s_regno < FIRST_PSEUDO_REGISTER
275        && d_regno < FIRST_PSEUDO_REGISTER)
276       || s_regno >= max_normal_pseudo
277       || d_regno >= max_normal_pseudo)
278     return 0;
279
280   if (source)
281     *source = s;
282   if (target)
283     *target = d;
284
285   /* Still mark it as seen, but as a copy insn this time.  */
286   copy_cache[uid].seen = 1;
287   copy_cache[uid].source = s;
288   copy_cache[uid].target = d;
289   return 1;
290 }
291
292 /* We build webs, as we process the conflicts.  For each use we go upward
293    the insn stream, noting any defs as potentially conflicting with the
294    current use.  We stop at defs of the current regno.  The conflicts are only
295    potentially, because we may never reach a def, so this is an undefined use,
296    which conflicts with nothing.  */
297
298
299 /* Given a web part WP, and the location of a reg part SIZE_WORD
300    return the conflict bitmap for that reg part, or NULL if it doesn't
301    exist yet in WP.  */
302
303 static bitmap
304 find_sub_conflicts (struct web_part *wp, unsigned int size_word)
305 {
306   struct tagged_conflict *cl;
307   cl = wp->sub_conflicts;
308   for (; cl; cl = cl->next)
309     if (cl->size_word == size_word)
310       return cl->conflicts;
311   return NULL;
312 }
313
314 /* Similar to find_sub_conflicts(), but creates that bitmap, if it
315    doesn't exist.  I.e. this never returns NULL.  */
316
317 static bitmap
318 get_sub_conflicts (struct web_part *wp, unsigned int size_word)
319 {
320   bitmap b = find_sub_conflicts (wp, size_word);
321   if (!b)
322     {
323       struct tagged_conflict *cl = ra_alloc (sizeof *cl);
324       cl->conflicts = BITMAP_XMALLOC ();
325       cl->size_word = size_word;
326       cl->next = wp->sub_conflicts;
327       wp->sub_conflicts = cl;
328       b = cl->conflicts;
329     }
330   return b;
331 }
332
333 /* Helper table for undef_to_size_word() below for small values
334    of UNDEFINED.  Offsets and lengths are byte based.  */
335 static struct undef_table_s {
336   unsigned int new_undef;
337   /* size | (byte << 16)  */
338   unsigned int size_word;
339 } const undef_table [] = {
340   { 0, BL_TO_WORD (0, 0)}, /* 0 */
341   { 0, BL_TO_WORD (0, 1)},
342   { 0, BL_TO_WORD (1, 1)},
343   { 0, BL_TO_WORD (0, 2)},
344   { 0, BL_TO_WORD (2, 1)}, /* 4 */
345   { 1, BL_TO_WORD (2, 1)},
346   { 2, BL_TO_WORD (2, 1)},
347   { 3, BL_TO_WORD (2, 1)},
348   { 0, BL_TO_WORD (3, 1)}, /* 8 */
349   { 1, BL_TO_WORD (3, 1)},
350   { 2, BL_TO_WORD (3, 1)},
351   { 3, BL_TO_WORD (3, 1)},
352   { 0, BL_TO_WORD (2, 2)}, /* 12 */
353   { 1, BL_TO_WORD (2, 2)},
354   { 2, BL_TO_WORD (2, 2)},
355   { 0, BL_TO_WORD (0, 4)}};
356
357 /* Interpret *UNDEFINED as bitmask where each bit corresponds to a byte.
358    A set bit means an undefined byte.  Factor all undefined bytes into
359    groups, and return a size/ofs pair of consecutive undefined bytes,
360    but according to certain borders.  Clear out those bits corresponding
361    to bytes overlaid by that size/ofs pair.  REG is only used for
362    the mode, to detect if it's a floating mode or not.
363
364    For example: *UNDEFINED      size+ofs        new *UNDEFINED
365                  1111           4+0               0
366                  1100           2+2               0
367                  1101           2+2               1
368                  0001           1+0               0
369                 10101           1+4             101
370
371    */
372
373 static unsigned int
374 undef_to_size_word (rtx reg, unsigned HOST_WIDE_INT *undefined)
375 {
376   /* When only the lower four bits are possibly set, we use
377      a fast lookup table.  */
378   if (*undefined <= 15)
379     {
380       struct undef_table_s u;
381       u = undef_table[*undefined];
382       *undefined = u.new_undef;
383       return u.size_word;
384     }
385
386   /* Otherwise we handle certain cases directly.  */
387   if (*undefined <= 0xffff)
388     switch ((int) *undefined)
389       {
390       case 0x00f0 : *undefined = 0; return BL_TO_WORD (4, 4);
391       case 0x00ff : *undefined = 0; return BL_TO_WORD (0, 8);
392       case 0x0f00 : *undefined = 0; return BL_TO_WORD (8, 4);
393       case 0x0ff0 : *undefined = 0xf0; return BL_TO_WORD (8, 4);
394       case 0x0fff :
395         if (INTEGRAL_MODE_P (GET_MODE (reg)))
396           { *undefined = 0xff; return BL_TO_WORD (8, 4); }
397         else
398           { *undefined = 0; return BL_TO_WORD (0, 12); /* XFmode */ }
399       case 0xf000 : *undefined = 0; return BL_TO_WORD (12, 4);
400       case 0xff00 : *undefined = 0; return BL_TO_WORD (8, 8);
401       case 0xfff0 : *undefined = 0xf0; return BL_TO_WORD (8, 8);
402       case 0xffff : *undefined = 0; return BL_TO_WORD (0, 16);
403       }
404
405   /* And if nothing matched fall back to the general solution.  For
406      now unknown undefined bytes are converted to sequences of maximal
407      length 4 bytes.  We could make this larger if necessary.  */
408   {
409     unsigned HOST_WIDE_INT u = *undefined;
410     int word;
411     struct undef_table_s tab;
412     for (word = 0; (u & 15) == 0; word += 4)
413       u >>= 4;
414     u = u & 15;
415     tab = undef_table[u];
416     u = tab.new_undef;
417     u = (*undefined & ~((unsigned HOST_WIDE_INT)15 << word)) | (u << word);
418     *undefined = u;
419     /* Size remains the same, only the begin is moved up move bytes.  */
420     return tab.size_word + BL_TO_WORD (word, 0);
421   }
422 }
423
424 /* Put the above three functions together.  For a set of undefined bytes
425    as bitmap *UNDEFINED, look for (create if necessary) and return the
426    corresponding conflict bitmap.  Change *UNDEFINED to remove the bytes
427    covered by the part for that bitmap.  */
428
429 static bitmap
430 undef_to_bitmap (struct web_part *wp, unsigned HOST_WIDE_INT *undefined)
431 {
432   unsigned int size_word = undef_to_size_word (DF_REF_REAL_REG (wp->ref),
433                                                undefined);
434   return get_sub_conflicts (wp, size_word);
435 }
436
437 /* Returns the root of the web part P is a member of.  Additionally
438    it compresses the path.  P may not be NULL.  */
439
440 static struct web_part *
441 find_web_part_1 (struct web_part *p)
442 {
443   struct web_part *r = p;
444   struct web_part *p_next;
445   while (r->uplink)
446     r = r->uplink;
447   for (; p != r; p = p_next)
448     {
449       p_next = p->uplink;
450       p->uplink = r;
451     }
452   return r;
453 }
454
455 /* Fast macro for the common case (WP either being the root itself, or
456    the end of an already compressed path.  */
457
458 #define find_web_part(wp) ((! (wp)->uplink) ? (wp) \
459   : (! (wp)->uplink->uplink) ? (wp)->uplink : find_web_part_1 (wp))
460
461 /* Unions together the parts R1 resp. R2 is a root of.
462    All dynamic information associated with the parts (number of spanned insns
463    and so on) is also merged.
464    The root of the resulting (possibly larger) web part is returned.  */
465
466 static struct web_part *
467 union_web_part_roots (struct web_part *r1, struct web_part *r2)
468 {
469   if (r1 != r2)
470     {
471       /* The new root is the smaller (pointerwise) of both.  This is crucial
472          to make the construction of webs from web parts work (so, when
473          scanning all parts, we see the roots before all its children).
474          Additionally this ensures, that if the web has a def at all, than
475          the root is a def (because all def parts are before use parts in the
476          web_parts[] array), or put another way, as soon, as the root of a
477          web part is not a def, this is an uninitialized web part.  The
478          way we construct the I-graph ensures, that if a web is initialized,
479          then the first part we find (besides trivial 1 item parts) has a
480          def.  */
481       if (r1 > r2)
482         {
483           struct web_part *h = r1;
484           r1 = r2;
485           r2 = h;
486         }
487       r2->uplink = r1;
488       num_webs--;
489
490       /* Now we merge the dynamic information of R1 and R2.  */
491       r1->spanned_deaths += r2->spanned_deaths;
492
493       if (!r1->sub_conflicts)
494         r1->sub_conflicts = r2->sub_conflicts;
495       else if (r2->sub_conflicts)
496         /* We need to merge the conflict bitmaps from R2 into R1.  */
497         {
498           struct tagged_conflict *cl1, *cl2;
499           /* First those from R2, which are also contained in R1.
500              We union the bitmaps, and free those from R2, resetting them
501              to 0.  */
502           for (cl1 = r1->sub_conflicts; cl1; cl1 = cl1->next)
503             for (cl2 = r2->sub_conflicts; cl2; cl2 = cl2->next)
504               if (cl1->size_word == cl2->size_word)
505                 {
506                   bitmap_ior_into (cl1->conflicts, cl2->conflicts);
507                   BITMAP_XFREE (cl2->conflicts);
508                   cl2->conflicts = NULL;
509                 }
510           /* Now the conflict lists from R2 which weren't in R1.
511              We simply copy the entries from R2 into R1' list.  */
512           for (cl2 = r2->sub_conflicts; cl2;)
513             {
514               struct tagged_conflict *cl_next = cl2->next;
515               if (cl2->conflicts)
516                 {
517                   cl2->next = r1->sub_conflicts;
518                   r1->sub_conflicts = cl2;
519                 }
520               cl2 = cl_next;
521             }
522         }
523       r2->sub_conflicts = NULL;
524       r1->crosses_call |= r2->crosses_call;
525     }
526   return r1;
527 }
528
529 /* Convenience macro, that is capable of unioning also non-roots.  */
530 #define union_web_parts(p1, p2) \
531   ((p1 == p2) ? find_web_part (p1) \
532       : union_web_part_roots (find_web_part (p1), find_web_part (p2)))
533
534 /* Remember that we've handled a given move, so we don't reprocess it.  */
535
536 static void
537 remember_move (rtx insn)
538 {
539   if (!TEST_BIT (move_handled, INSN_UID (insn)))
540     {
541       rtx s, d;
542       int ret;
543       struct df_link *slink = DF_INSN_USES (df, insn);
544       struct df_link *link = DF_INSN_DEFS (df, insn);
545       
546       SET_BIT (move_handled, INSN_UID (insn));
547       ret = copy_insn_p (insn, &s, &d);
548       gcc_assert (ret);
549       
550       /* Some sanity test for the copy insn.  */
551       gcc_assert (link && link->ref);
552       gcc_assert (slink && slink->ref);
553       /* The following (link->next != 0) happens when a hardreg
554           is used in wider mode (REG:DI %eax).  Then df.* creates
555           a def/use for each hardreg contained therein.  We only
556           allow hardregs here.  */
557       gcc_assert (!link->next
558                   || DF_REF_REGNO (link->next->ref)
559                       < FIRST_PSEUDO_REGISTER);
560       
561       /* XXX for now we don't remember move insns involving any subregs.
562          Those would be difficult to coalesce (we would need to implement
563          handling of all the subwebs in the allocator, including that such
564          subwebs could be source and target of coalescing).  */
565       if (REG_P (s) && REG_P (d))
566         {
567           struct move *m = ra_calloc (sizeof (struct move));
568           struct move_list *ml;
569           m->insn = insn;
570           ml = ra_alloc (sizeof (struct move_list));
571           ml->move = m;
572           ml->next = wl_moves;
573           wl_moves = ml;
574         }
575     }
576 }
577
578 /* This describes the USE currently looked at in the main-loop in
579    build_web_parts_and_conflicts().  */
580 struct curr_use {
581   struct web_part *wp;
582   /* This has a 1-bit for each byte in the USE, which is still undefined.  */
583   unsigned HOST_WIDE_INT undefined;
584   /* For easy access.  */
585   unsigned int regno;
586   rtx x;
587   /* If some bits of this USE are live over an abnormal edge.  */
588   unsigned int live_over_abnormal;
589 };
590
591 /* Returns nonzero iff rtx DEF and USE have bits in common (but see below).
592    It is only called with DEF and USE being (reg:M a) or (subreg:M1 (reg:M2 a)
593    x) rtx's.  Furthermore if it's a subreg rtx M1 is at least one word wide,
594    and a is a multi-word pseudo.  If DEF or USE are hardregs, they are in
595    word_mode, so we don't need to check for further hardregs which would result
596    from wider references.  We are never called with paradoxical subregs.
597
598    This returns:
599    0 for no common bits,
600    1 if DEF and USE exactly cover the same bytes,
601    2 if the DEF only covers a part of the bits of USE
602    3 if the DEF covers more than the bits of the USE, and
603    4 if both are SUBREG's of different size, but have bytes in common.
604    -1 is a special case, for when DEF and USE refer to the same regno, but
605       have for other reasons no bits in common (can only happen with
606       subregs referring to different words, or to words which already were
607       defined for this USE).
608    Furthermore it modifies use->undefined to clear the bits which get defined
609    by DEF (only for cases with partial overlap).
610    I.e. if bit 1 is set for the result != -1, the USE was completely covered,
611    otherwise a test is needed to track the already defined bytes.  */
612
613 static int
614 defuse_overlap_p_1 (rtx def, struct curr_use *use)
615 {
616   int mode = 0;
617   if (def == use->x)
618     return 1;
619   if (!def)
620     return 0;
621   if (GET_CODE (def) == SUBREG)
622     {
623       if (REGNO (SUBREG_REG (def)) != use->regno)
624         return 0;
625       mode |= 1;
626     }
627   else if (REGNO (def) != use->regno)
628     return 0;
629   if (GET_CODE (use->x) == SUBREG)
630     mode |= 2;
631   switch (mode)
632     {
633       case 0: /* REG, REG */
634         return 1;
635       case 1: /* SUBREG, REG */
636         {
637           unsigned HOST_WIDE_INT old_u = use->undefined;
638           use->undefined &= ~ rtx_to_undefined (def);
639           return (old_u != use->undefined) ? 2 : -1;
640         }
641       case 2: /* REG, SUBREG */
642         return 3;
643       case 3: /* SUBREG, SUBREG */
644         if (GET_MODE_SIZE (GET_MODE (def)) == GET_MODE_SIZE (GET_MODE (use->x)))
645           /* If the size of both things is the same, the subreg's overlap
646              if they refer to the same word.  */
647           if (SUBREG_BYTE (def) == SUBREG_BYTE (use->x))
648             return 1;
649         /* Now the more difficult part: the same regno is referred, but the
650            sizes of the references or the words differ.  E.g.
651            (subreg:SI (reg:CDI a) 0) and (subreg:DI (reg:CDI a) 2) do not
652            overlap, whereas the latter overlaps with (subreg:SI (reg:CDI a) 3).
653            */
654         {
655           unsigned HOST_WIDE_INT old_u;
656           int b1, e1, b2, e2;
657           unsigned int bl1, bl2;
658           bl1 = rtx_to_bits (def);
659           bl2 = rtx_to_bits (use->x);
660           b1 = BYTE_BEGIN (bl1);
661           b2 = BYTE_BEGIN (bl2);
662           e1 = b1 + BYTE_LENGTH (bl1) - 1;
663           e2 = b2 + BYTE_LENGTH (bl2) - 1;
664           if (b1 > e2 || b2 > e1)
665             return -1;
666           old_u = use->undefined;
667           use->undefined &= ~ rtx_to_undefined (def);
668           return (old_u != use->undefined) ? 4 : -1;
669         }
670       default:
671         gcc_unreachable ();
672     }
673 }
674
675 /* Macro for the common case of either def and use having the same rtx,
676    or based on different regnos.  */
677 #define defuse_overlap_p(def, use) \
678   ((def) == (use)->x ? 1 : \
679      (REGNO (GET_CODE (def) == SUBREG \
680              ? SUBREG_REG (def) : def) != use->regno \
681       ? 0 : defuse_overlap_p_1 (def, use)))
682
683
684 /* The use USE flows into INSN (backwards).  Determine INSNs effect on it,
685    and return nonzero, if (parts of) that USE are also live before it.
686    This also notes conflicts between the USE and all DEFS in that insn,
687    and modifies the undefined bits of USE in case parts of it were set in
688    this insn.  */
689
690 static int
691 live_out_1 (struct df *df ATTRIBUTE_UNUSED, struct curr_use *use, rtx insn)
692 {
693   int defined = 0;
694   int uid = INSN_UID (insn);
695   struct web_part *wp = use->wp;
696
697   /* Mark, that this insn needs this webpart live.  */
698   visit_trace[uid].wp = wp;
699   visit_trace[uid].undefined = use->undefined;
700
701   if (INSN_P (insn))
702     {
703       unsigned int source_regno = ~0;
704       unsigned int regno = use->regno;
705       unsigned HOST_WIDE_INT orig_undef = use->undefined;
706       unsigned HOST_WIDE_INT final_undef = use->undefined;
707       rtx s = NULL;
708       unsigned int n, num_defs = insn_df[uid].num_defs;
709       struct ref **defs = insn_df[uid].defs;
710
711       /* We want to access the root webpart.  */
712       wp = find_web_part (wp);
713       if (CALL_P (insn))
714         wp->crosses_call = 1;
715       else if (copy_insn_p (insn, &s, NULL))
716         source_regno = REGNO (GET_CODE (s) == SUBREG ? SUBREG_REG (s) : s);
717
718       /* Look at all DEFS in this insn.  */
719       for (n = 0; n < num_defs; n++)
720         {
721           struct ref *ref = defs[n];
722           int lap;
723
724           /* Reset the undefined bits for each iteration, in case this
725              insn has more than one set, and one of them sets this regno.
726              But still the original undefined part conflicts with the other
727              sets.  */
728           use->undefined = orig_undef;
729           if ((lap = defuse_overlap_p (DF_REF_REG (ref), use)) != 0)
730             {
731               if (lap == -1)
732                   /* Same regnos but non-overlapping or already defined bits,
733                      so ignore this DEF, or better said make the yet undefined
734                      part and this DEF conflicting.  */
735                 {
736                   unsigned HOST_WIDE_INT undef;
737                   undef = use->undefined;
738                   while (undef)
739                     bitmap_set_bit (undef_to_bitmap (wp, &undef),
740                                     DF_REF_ID (ref));
741                   continue;
742                 }
743               if ((lap & 1) != 0)
744                   /* The current DEF completely covers the USE, so we can
745                      stop traversing the code looking for further DEFs.  */
746                 defined = 1;
747               else
748                   /* We have a partial overlap.  */
749                 {
750                   final_undef &= use->undefined;
751                   if (final_undef == 0)
752                     /* Now the USE is completely defined, which means, that
753                        we can stop looking for former DEFs.  */
754                     defined = 1;
755                   /* If this is a partial overlap, which left some bits
756                      in USE undefined, we normally would need to create
757                      conflicts between that undefined part and the part of
758                      this DEF which overlapped with some of the formerly
759                      undefined bits.  We don't need to do this, because both
760                      parts of this DEF (that which overlaps, and that which
761                      doesn't) are written together in this one DEF, and can
762                      not be colored in a way which would conflict with
763                      the USE.  This is only true for partial overlap,
764                      because only then the DEF and USE have bits in common,
765                      which makes the DEF move, if the USE moves, making them
766                      aligned.
767                      If they have no bits in common (lap == -1), they are
768                      really independent.  Therefore we there made a
769                      conflict above.  */
770                 }
771               /* This is at least a partial overlap, so we need to union
772                  the web parts.  */
773               wp = union_web_parts (wp, &web_parts[DF_REF_ID (ref)]);
774             }
775           else
776             {
777               /* The DEF and the USE don't overlap at all, different
778                  regnos.  I.e. make conflicts between the undefined bits,
779                  and that DEF.  */
780               unsigned HOST_WIDE_INT undef = use->undefined;
781
782               if (regno == source_regno)
783                 /* This triggers only, when this was a copy insn and the
784                    source is at least a part of the USE currently looked at.
785                    In this case only the bits of the USE conflict with the
786                    DEF, which are not covered by the source of this copy
787                    insn, and which are still undefined.  I.e. in the best
788                    case (the whole reg being the source), _no_ conflicts
789                    between that USE and this DEF (the target of the move)
790                    are created by this insn (though they might be by
791                    others).  This is a super case of the normal copy insn
792                    only between full regs.  */
793                 {
794                   undef &= ~ rtx_to_undefined (s);
795                 }
796               if (undef)
797                 {
798                   /*struct web_part *cwp;
799                     cwp = find_web_part (&web_parts[DF_REF_ID
800                     (ref)]);*/
801
802                   /* TODO: somehow instead of noting the ID of the LINK
803                      use an ID nearer to the root webpart of that LINK.
804                      We can't use the root itself, because we later use the
805                      ID to look at the form (reg or subreg, and if yes,
806                      which subreg) of this conflict.  This means, that we
807                      need to remember in the root an ID for each form, and
808                      maintaining this, when merging web parts.  This makes
809                      the bitmaps smaller.  */
810                   do
811                     bitmap_set_bit (undef_to_bitmap (wp, &undef),
812                                     DF_REF_ID (ref));
813                   while (undef);
814                 }
815             }
816         }
817       if (defined)
818         use->undefined = 0;
819       else
820         {
821           /* If this insn doesn't completely define the USE, increment also
822              it's spanned deaths count (if this insn contains a death).  */
823           gcc_assert (uid < death_insns_max_uid);
824           if (TEST_BIT (insns_with_deaths, uid))
825             wp->spanned_deaths++;
826           use->undefined = final_undef;
827         }
828     }
829
830   return !defined;
831 }
832
833 /* Same as live_out_1() (actually calls it), but caches some information.
834    E.g. if we reached this INSN with the current regno already, and the
835    current undefined bits are a subset of those as we came here, we
836    simply connect the web parts of the USE, and the one cached for this
837    INSN, and additionally return zero, indicating we don't need to traverse
838    this path any longer (all effect were already seen, as we first reached
839    this insn).  */
840
841 static inline int
842 live_out (struct df *df, struct curr_use *use, rtx insn)
843 {
844   unsigned int uid = INSN_UID (insn);
845   if (visit_trace[uid].wp
846       && DF_REF_REGNO (visit_trace[uid].wp->ref) == use->regno
847       && (use->undefined & ~visit_trace[uid].undefined) == 0)
848     {
849       union_web_parts (visit_trace[uid].wp, use->wp);
850       /* Don't search any further, as we already were here with this regno.  */
851       return 0;
852     }
853   else
854     return live_out_1 (df, use, insn);
855 }
856
857 /* The current USE reached a basic block head.  The edge E is one
858    of the predecessors edges.  This evaluates the effect of the predecessor
859    block onto the USE, and returns the next insn, which should be looked at.
860    This either is the last insn of that pred. block, or the first one.
861    The latter happens, when the pred. block has no possible effect on the
862    USE, except for conflicts.  In that case, it's remembered, that the USE
863    is live over that whole block, and it's skipped.  Otherwise we simply
864    continue with the last insn of the block.
865
866    This also determines the effects of abnormal edges, and remembers
867    which uses are live at the end of that basic block.  */
868
869 static rtx
870 live_in_edge (struct df *df, struct curr_use *use, edge e)
871 {
872   struct ra_bb_info *info_pred;
873   rtx next_insn;
874   /* Call used hard regs die over an exception edge, ergo
875      they don't reach the predecessor block, so ignore such
876      uses.  And also don't set the live_over_abnormal flag
877      for them.  */
878   if ((e->flags & EDGE_EH) && use->regno < FIRST_PSEUDO_REGISTER
879       && call_used_regs[use->regno])
880     return NULL_RTX;
881   if (e->flags & EDGE_ABNORMAL)
882     use->live_over_abnormal = 1;
883   bitmap_set_bit (live_at_end[e->src->index], DF_REF_ID (use->wp->ref));
884   info_pred = (struct ra_bb_info *) e->src->aux;
885   next_insn = BB_END (e->src);
886
887   /* If the last insn of the pred. block doesn't completely define the
888      current use, we need to check the block.  */
889   if (live_out (df, use, next_insn))
890     {
891       /* If the current regno isn't mentioned anywhere in the whole block,
892          and the complete use is still undefined...  */
893       if (!bitmap_bit_p (info_pred->regnos_mentioned, use->regno)
894           && (rtx_to_undefined (use->x) & ~use->undefined) == 0)
895         {
896           /* ...we can hop over the whole block and defer conflict
897              creation to later.  */
898           bitmap_set_bit (info_pred->live_throughout,
899                           DF_REF_ID (use->wp->ref));
900           next_insn = BB_HEAD (e->src);
901         }
902       return next_insn;
903     }
904   else
905     return NULL_RTX;
906 }
907
908 /* USE flows into the end of the insns preceding INSN.  Determine
909    their effects (in live_out()) and possibly loop over the preceding INSN,
910    or call itself recursively on a basic block border.  When a topleve
911    call of this function returns the USE is completely analyzed.  I.e.
912    its def-use chain (at least) is built, possibly connected with other
913    def-use chains, and all defs during that chain are noted.  */
914
915 static void
916 live_in (struct df *df, struct curr_use *use, rtx insn)
917 {
918   unsigned int loc_vpass = visited_pass;
919
920   /* Note, that, even _if_ we are called with use->wp a root-part, this might
921      become non-root in the for() loop below (due to live_out() unioning
922      it).  So beware, not to change use->wp in a way, for which only root-webs
923      are allowed.  */
924   while (1)
925     {
926       unsigned int i;
927       int uid = INSN_UID (insn);
928       basic_block bb = BLOCK_FOR_INSN (insn);
929       number_seen[uid]++;
930
931       /* We want to be as fast as possible, so explicitly write
932          this loop.  */
933       for (insn = PREV_INSN (insn); insn && !INSN_P (insn);
934            insn = PREV_INSN (insn))
935         ;
936       if (!insn)
937         return;
938       if (bb != BLOCK_FOR_INSN (insn))
939         {
940           edge e;
941           unsigned HOST_WIDE_INT undef = use->undefined;
942           struct ra_bb_info *info = (struct ra_bb_info *) bb->aux;
943           if (EDGE_COUNT (bb->preds) == 0)
944             return;
945           /* We now check, if we already traversed the predecessors of this
946              block for the current pass and the current set of undefined
947              bits.  If yes, we don't need to check the predecessors again.
948              So, conceptually this information is tagged to the first
949              insn of a basic block.  */
950           if (info->pass == loc_vpass && (undef & ~info->undefined) == 0)
951             return;
952           info->pass = loc_vpass;
953           info->undefined = undef;
954           /* All but the last predecessor are handled recursively.  */
955           for (e = NULL, i = 0; i < EDGE_COUNT (bb->preds) - 1; i++)
956             {
957               e = EDGE_PRED (bb, i);
958               insn = live_in_edge (df, use, e);
959               if (insn)
960                 live_in (df, use, insn);
961               use->undefined = undef;
962             }
963           insn = live_in_edge (df, use, e);
964           if (!insn)
965             return;
966         }
967       else if (!live_out (df, use, insn))
968         return;
969     }
970 }
971
972 /* Determine all regnos which are mentioned in a basic block, in an
973    interesting way.  Interesting here means either in a def, or as the
974    source of a move insn.  We only look at insns added since the last
975    pass.  */
976
977 static void
978 update_regnos_mentioned (void)
979 {
980   int last_uid = last_max_uid;
981   rtx insn;
982   basic_block bb;
983   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
984     if (INSN_P (insn))
985       {
986         /* Don't look at old insns.  */
987         if (INSN_UID (insn) < last_uid)
988           {
989             /* XXX We should also remember moves over iterations (we already
990                save the cache, but not the movelist).  */
991             if (copy_insn_p (insn, NULL, NULL))
992               remember_move (insn);
993           }
994         else if ((bb = BLOCK_FOR_INSN (insn)) != NULL)
995           {
996             rtx source;
997             struct ra_bb_info *info = (struct ra_bb_info *) bb->aux;
998             bitmap mentioned = info->regnos_mentioned;
999             struct df_link *link;
1000             if (copy_insn_p (insn, &source, NULL))
1001               {
1002                 remember_move (insn);
1003                 bitmap_set_bit (mentioned,
1004                                 REGNO (GET_CODE (source) == SUBREG
1005                                        ? SUBREG_REG (source) : source));
1006               }
1007             for (link = DF_INSN_DEFS (df, insn); link; link = link->next)
1008               if (link->ref)
1009                 bitmap_set_bit (mentioned, DF_REF_REGNO (link->ref));
1010           }
1011       }
1012 }
1013
1014 /* Handle the uses which reach a block end, but were deferred due
1015    to it's regno not being mentioned in that block.  This adds the
1016    remaining conflicts and updates also the crosses_call and
1017    spanned_deaths members.  */
1018
1019 static void
1020 livethrough_conflicts_bb (basic_block bb)
1021 {
1022   struct ra_bb_info *info = (struct ra_bb_info *) bb->aux;
1023   rtx insn;
1024   bitmap all_defs;
1025   unsigned use_id;
1026   unsigned int deaths = 0;
1027   unsigned int contains_call = 0;
1028
1029   /* If there are no deferred uses, just return.  */
1030   if (bitmap_empty_p (info->live_throughout))
1031     return;
1032
1033   /* First collect the IDs of all defs, count the number of death
1034      containing insns, and if there's some call_insn here.  */
1035   all_defs = BITMAP_XMALLOC ();
1036   for (insn = BB_HEAD (bb); insn; insn = NEXT_INSN (insn))
1037     {
1038       if (INSN_P (insn))
1039         {
1040           unsigned int n;
1041           struct ra_insn_info info;
1042
1043           info = insn_df[INSN_UID (insn)];
1044           for (n = 0; n < info.num_defs; n++)
1045             bitmap_set_bit (all_defs, DF_REF_ID (info.defs[n]));
1046           if (TEST_BIT (insns_with_deaths, INSN_UID (insn)))
1047             deaths++;
1048           if (CALL_P (insn))
1049             contains_call = 1;
1050         }
1051       if (insn == BB_END (bb))
1052         break;
1053     }
1054
1055   /* And now, if we have found anything, make all live_through
1056      uses conflict with all defs, and update their other members.  */
1057   if (deaths > 0
1058       || contains_call
1059       || !bitmap_empty_p (all_defs))
1060     {
1061       bitmap_iterator bi;
1062
1063       EXECUTE_IF_SET_IN_BITMAP (info->live_throughout, 0, use_id, bi)
1064         {
1065           struct web_part *wp = &web_parts[df->def_id + use_id];
1066           unsigned int bl = rtx_to_bits (DF_REF_REG (wp->ref));
1067           bitmap conflicts;
1068           wp = find_web_part (wp);
1069           wp->spanned_deaths += deaths;
1070           wp->crosses_call |= contains_call;
1071           conflicts = get_sub_conflicts (wp, bl);
1072           bitmap_ior_into (conflicts, all_defs);
1073         }
1074     }
1075
1076   BITMAP_XFREE (all_defs);
1077 }
1078
1079 /* Allocate the per basic block info for traversing the insn stream for
1080    building live ranges.  */
1081
1082 static void
1083 init_bb_info (void)
1084 {
1085   basic_block bb;
1086   FOR_ALL_BB (bb)
1087     {
1088       struct ra_bb_info *info = xcalloc (1, sizeof *info);
1089       info->regnos_mentioned = BITMAP_XMALLOC ();
1090       info->live_throughout = BITMAP_XMALLOC ();
1091       info->old_aux = bb->aux;
1092       bb->aux = (void *) info;
1093     }
1094 }
1095
1096 /* Free that per basic block info.  */
1097
1098 static void
1099 free_bb_info (void)
1100 {
1101   basic_block bb;
1102   FOR_ALL_BB (bb)
1103     {
1104       struct ra_bb_info *info = (struct ra_bb_info *) bb->aux;
1105       BITMAP_XFREE (info->regnos_mentioned);
1106       BITMAP_XFREE (info->live_throughout);
1107       bb->aux = info->old_aux;
1108       free (info);
1109     }
1110 }
1111
1112 /* Toplevel function for the first part of this file.
1113    Connect web parts, thereby implicitly building webs, and remember
1114    their conflicts.  */
1115
1116 static void
1117 build_web_parts_and_conflicts (struct df *df)
1118 {
1119   struct df_link *link;
1120   struct curr_use use;
1121   basic_block bb;
1122
1123   number_seen = xcalloc (get_max_uid (), sizeof (int));
1124   visit_trace = xcalloc (get_max_uid (), sizeof (visit_trace[0]));
1125   update_regnos_mentioned ();
1126
1127   /* Here's the main loop.
1128      It goes through all insn's, connects web parts along the way, notes
1129      conflicts between webparts, and remembers move instructions.  */
1130   visited_pass = 0;
1131   for (use.regno = 0; use.regno < (unsigned int)max_regno; use.regno++)
1132     if (use.regno >= FIRST_PSEUDO_REGISTER || !fixed_regs[use.regno])
1133       for (link = df->regs[use.regno].uses; link; link = link->next)
1134         if (link->ref)
1135           {
1136             struct ref *ref = link->ref;
1137             rtx insn = DF_REF_INSN (ref);
1138             /* Only recheck marked or new uses, or uses from hardregs.  */
1139             if (use.regno >= FIRST_PSEUDO_REGISTER
1140                 && DF_REF_ID (ref) < last_use_id
1141                 && !TEST_BIT (last_check_uses, DF_REF_ID (ref)))
1142               continue;
1143             use.wp = &web_parts[df->def_id + DF_REF_ID (ref)];
1144             use.x = DF_REF_REG (ref);
1145             use.live_over_abnormal = 0;
1146             use.undefined = rtx_to_undefined (use.x);
1147             visited_pass++;
1148             live_in (df, &use, insn);
1149             if (use.live_over_abnormal)
1150               SET_BIT (live_over_abnormal, DF_REF_ID (ref));
1151           }
1152
1153   dump_number_seen ();
1154   FOR_ALL_BB (bb)
1155     {
1156       struct ra_bb_info *info = (struct ra_bb_info *) bb->aux;
1157       livethrough_conflicts_bb (bb);
1158       bitmap_zero (info->live_throughout);
1159       info->pass = 0;
1160     }
1161   free (visit_trace);
1162   free (number_seen);
1163 }
1164
1165 /* Here we look per insn, for DF references being in uses _and_ defs.
1166    This means, in the RTL a (REG xx) expression was seen as a
1167    read/modify/write, as happens for (set (subreg:SI (reg:DI xx)) (...))
1168    e.g.  Our code has created two webs for this, as it should.  Unfortunately,
1169    as the REG reference is only one time in the RTL we can't color
1170    both webs different (arguably this also would be wrong for a real
1171    read-mod-write instruction), so we must reconnect such webs.  */
1172
1173 static void
1174 connect_rmw_web_parts (struct df *df)
1175 {
1176   unsigned int i;
1177
1178   for (i = 0; i < df->use_id; i++)
1179     {
1180       struct web_part *wp1 = &web_parts[df->def_id + i];
1181       rtx reg;
1182       struct df_link *link;
1183       if (!wp1->ref)
1184         continue;
1185       /* If it's an uninitialized web, we don't want to connect it to others,
1186          as the read cycle in read-mod-write had probably no effect.  */
1187       if (find_web_part (wp1) >= &web_parts[df->def_id])
1188         continue;
1189       reg = DF_REF_REAL_REG (wp1->ref);
1190       link = DF_INSN_DEFS (df, DF_REF_INSN (wp1->ref));
1191       for (; link; link = link->next)
1192         if (reg == DF_REF_REAL_REG (link->ref))
1193           {
1194             struct web_part *wp2 = &web_parts[DF_REF_ID (link->ref)];
1195             union_web_parts (wp1, wp2);
1196           }
1197     }
1198 }
1199
1200 /* Deletes all hardregs from *S which are not allowed for MODE.  */
1201
1202 static void
1203 prune_hardregs_for_mode (HARD_REG_SET *s, enum machine_mode mode)
1204 {
1205   AND_HARD_REG_SET (*s, hardregs_for_mode[(int) mode]);
1206 }
1207
1208 /* Initialize the members of a web, which are deducible from REG.  */
1209
1210 static void
1211 init_one_web_common (struct web *web, rtx reg)
1212 {
1213   gcc_assert (REG_P (reg));
1214   /* web->id isn't initialized here.  */
1215   web->regno = REGNO (reg);
1216   web->orig_x = reg;
1217   if (!web->dlink)
1218     {
1219       web->dlink = ra_calloc (sizeof (struct dlist));
1220       DLIST_WEB (web->dlink) = web;
1221     }
1222   /* XXX
1223      the former (superunion) doesn't constrain the graph enough. E.g.
1224      on x86 QImode _requires_ QI_REGS, but as alternate class usually
1225      GENERAL_REGS is given.  So the graph is not constrained enough,
1226      thinking it has more freedom then it really has, which leads
1227      to repeated spill tryings.  OTOH the latter (only using preferred
1228      class) is too constrained, as normally (e.g. with all SImode
1229      pseudos), they can be allocated also in the alternate class.
1230      What we really want, are the _exact_ hard regs allowed, not
1231      just a class.  Later.  */
1232   /*web->regclass = reg_class_superunion
1233                     [reg_preferred_class (web->regno)]
1234                     [reg_alternate_class (web->regno)];*/
1235   /*web->regclass = reg_preferred_class (web->regno);*/
1236   web->regclass = reg_class_subunion
1237     [reg_preferred_class (web->regno)] [reg_alternate_class (web->regno)];
1238   web->regclass = reg_preferred_class (web->regno);
1239   if (web->regno < FIRST_PSEUDO_REGISTER)
1240     {
1241       web->color = web->regno;
1242       put_web (web, PRECOLORED);
1243       web->num_conflicts = UINT_MAX;
1244       web->add_hardregs = 0;
1245       CLEAR_HARD_REG_SET (web->usable_regs);
1246       SET_HARD_REG_BIT (web->usable_regs, web->regno);
1247       web->num_freedom = 1;
1248     }
1249   else
1250     {
1251       HARD_REG_SET alternate;
1252       web->color = -1;
1253       put_web (web, INITIAL);
1254       /* add_hardregs is wrong in multi-length classes, e.g.
1255          using a DFmode pseudo on x86 can result in class FLOAT_INT_REGS,
1256          where, if it finally is allocated to GENERAL_REGS it needs two,
1257          if allocated to FLOAT_REGS only one hardreg.  XXX */
1258       web->add_hardregs =
1259         CLASS_MAX_NREGS (web->regclass, PSEUDO_REGNO_MODE (web->regno)) - 1;
1260       web->num_conflicts = 0 * web->add_hardregs;
1261       COPY_HARD_REG_SET (web->usable_regs,
1262                         reg_class_contents[reg_preferred_class (web->regno)]);
1263       COPY_HARD_REG_SET (alternate,
1264                         reg_class_contents[reg_alternate_class (web->regno)]);
1265       IOR_HARD_REG_SET (web->usable_regs, alternate);
1266       /*IOR_HARD_REG_SET (web->usable_regs,
1267                         reg_class_contents[reg_alternate_class
1268                         (web->regno)]);*/
1269       AND_COMPL_HARD_REG_SET (web->usable_regs, never_use_colors);
1270       prune_hardregs_for_mode (&web->usable_regs,
1271                                PSEUDO_REGNO_MODE (web->regno));
1272 #ifdef CANNOT_CHANGE_MODE_CLASS
1273       if (web->mode_changed)
1274         AND_COMPL_HARD_REG_SET (web->usable_regs, invalid_mode_change_regs);
1275 #endif
1276       web->num_freedom = hard_regs_count (web->usable_regs);
1277       web->num_freedom -= web->add_hardregs;
1278       gcc_assert (web->num_freedom);
1279     }
1280   COPY_HARD_REG_SET (web->orig_usable_regs, web->usable_regs);
1281 }
1282
1283 /* Initializes WEBs members from REG or zero them.  */
1284
1285 static void
1286 init_one_web (struct web *web, rtx reg)
1287 {
1288   memset (web, 0, sizeof (struct web));
1289   init_one_web_common (web, reg);
1290   web->useless_conflicts = BITMAP_XMALLOC ();
1291 }
1292
1293 /* WEB is an old web, meaning it came from the last pass, and got a
1294    color.  We want to remember some of it's info, so zero only some
1295    members.  */
1296
1297 static void
1298 reinit_one_web (struct web *web, rtx reg)
1299 {
1300   web->old_color = web->color + 1;
1301   init_one_web_common (web, reg);
1302   web->span_deaths = 0;
1303   web->spill_temp = 0;
1304   web->orig_spill_temp = 0;
1305   web->use_my_regs = 0;
1306   web->spill_cost = 0;
1307   web->was_spilled = 0;
1308   web->is_coalesced = 0;
1309   web->artificial = 0;
1310   web->live_over_abnormal = 0;
1311   web->mode_changed = 0;
1312   web->subreg_stripped = 0;
1313   web->move_related = 0;
1314   web->in_load = 0;
1315   web->target_of_spilled_move = 0;
1316   web->num_aliased = 0;
1317   if (web->type == PRECOLORED)
1318     {
1319       web->num_defs = 0;
1320       web->num_uses = 0;
1321       web->orig_spill_cost = 0;
1322     }
1323   CLEAR_HARD_REG_SET (web->bias_colors);
1324   CLEAR_HARD_REG_SET (web->prefer_colors);
1325   web->reg_rtx = NULL;
1326   web->stack_slot = NULL;
1327   web->pattern = NULL;
1328   web->alias = NULL;
1329   gcc_assert (!web->moves);
1330   gcc_assert (web->useless_conflicts);
1331 }
1332
1333 /* Insert and returns a subweb corresponding to REG into WEB (which
1334    becomes its super web).  It must not exist already.  */
1335
1336 static struct web *
1337 add_subweb (struct web *web, rtx reg)
1338 {
1339   struct web *w;
1340   gcc_assert (GET_CODE (reg) == SUBREG);
1341   w = xmalloc (sizeof (struct web));
1342   /* Copy most content from parent-web.  */
1343   *w = *web;
1344   /* And initialize the private stuff.  */
1345   w->orig_x = reg;
1346   w->add_hardregs = CLASS_MAX_NREGS (web->regclass, GET_MODE (reg)) - 1;
1347   w->num_conflicts = 0 * w->add_hardregs;
1348   w->num_defs = 0;
1349   w->num_uses = 0;
1350   w->dlink = NULL;
1351   w->parent_web = web;
1352   w->subreg_next = web->subreg_next;
1353   web->subreg_next = w;
1354   return w;
1355 }
1356
1357 /* Similar to add_subweb(), but instead of relying on a given SUBREG,
1358    we have just a size and an offset of the subpart of the REG rtx.
1359    In difference to add_subweb() this marks the new subweb as artificial.  */
1360
1361 static struct web *
1362 add_subweb_2 (struct web *web, unsigned int  size_word)
1363 {
1364   /* To get a correct mode for the to be produced subreg, we don't want to
1365      simply do a mode_for_size() for the mode_class of the whole web.
1366      Suppose we deal with a CDImode web, but search for a 8 byte part.
1367      Now mode_for_size() would only search in the class MODE_COMPLEX_INT
1368      and would find CSImode which probably is not what we want.  Instead
1369      we want DImode, which is in a completely other class.  For this to work
1370      we instead first search the already existing subwebs, and take
1371      _their_ modeclasses as base for a search for ourself.  */
1372   rtx ref_rtx = (web->subreg_next ? web->subreg_next : web)->orig_x;
1373   unsigned int size = BYTE_LENGTH (size_word) * BITS_PER_UNIT;
1374   enum machine_mode mode;
1375   mode = mode_for_size (size, GET_MODE_CLASS (GET_MODE (ref_rtx)), 0);
1376   if (mode == BLKmode)
1377     mode = mode_for_size (size, MODE_INT, 0);
1378   gcc_assert (mode != BLKmode);
1379   web = add_subweb (web, gen_rtx_SUBREG (mode, web->orig_x,
1380                                          BYTE_BEGIN (size_word)));
1381   web->artificial = 1;
1382   return web;
1383 }
1384
1385 /* Initialize all the web parts we are going to need.  */
1386
1387 static void
1388 init_web_parts (struct df *df)
1389 {
1390   int regno;
1391   unsigned int no;
1392   num_webs = 0;
1393   for (no = 0; no < df->def_id; no++)
1394     {
1395       if (df->defs[no])
1396         {
1397           gcc_assert (no >= last_def_id || web_parts[no].ref == df->defs[no]);
1398           web_parts[no].ref = df->defs[no];
1399           /* Uplink might be set from the last iteration.  */
1400           if (!web_parts[no].uplink)
1401             num_webs++;
1402         }
1403       else
1404         /* The last iteration might have left .ref set, while df_analyze()
1405            removed that ref (due to a removed copy insn) from the df->defs[]
1406            array.  As we don't check for that in realloc_web_parts()
1407            we do that here.  */
1408         web_parts[no].ref = NULL;
1409     }
1410   for (no = 0; no < df->use_id; no++)
1411     {
1412       if (df->uses[no])
1413         {
1414           gcc_assert (no >= last_use_id
1415                       || web_parts[no + df->def_id].ref == df->uses[no]);
1416           web_parts[no + df->def_id].ref = df->uses[no];
1417           if (!web_parts[no + df->def_id].uplink)
1418             num_webs++;
1419         }
1420       else
1421         web_parts[no + df->def_id].ref = NULL;
1422     }
1423
1424   /* We want to have only one web for each precolored register.  */
1425   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1426     {
1427       struct web_part *r1 = NULL;
1428       struct df_link *link;
1429       /* Here once was a test, if there is any DEF at all, and only then to
1430          merge all the parts.  This was incorrect, we really also want to have
1431          only one web-part for hardregs, even if there is no explicit DEF.  */
1432       /* Link together all defs...  */
1433       for (link = df->regs[regno].defs; link; link = link->next)
1434         if (link->ref)
1435           {
1436             struct web_part *r2 = &web_parts[DF_REF_ID (link->ref)];
1437             if (!r1)
1438               r1 = r2;
1439             else
1440               r1 = union_web_parts (r1, r2);
1441           }
1442       /* ... and all uses.  */
1443       for (link = df->regs[regno].uses; link; link = link->next)
1444         if (link->ref)
1445           {
1446             struct web_part *r2 = &web_parts[df->def_id
1447                                              + DF_REF_ID (link->ref)];
1448             if (!r1)
1449               r1 = r2;
1450             else
1451               r1 = union_web_parts (r1, r2);
1452           }
1453     }
1454 }
1455
1456 /* In case we want to remember the conflict list of a WEB, before adding
1457    new conflicts, we copy it here to orig_conflict_list.  */
1458
1459 static void
1460 copy_conflict_list (struct web *web)
1461 {
1462   struct conflict_link *cl;
1463   gcc_assert (!web->orig_conflict_list);
1464   gcc_assert (!web->have_orig_conflicts);
1465   web->have_orig_conflicts = 1;
1466   for (cl = web->conflict_list; cl; cl = cl->next)
1467     {
1468       struct conflict_link *ncl;
1469       ncl = ra_alloc (sizeof *ncl);
1470       ncl->t = cl->t;
1471       ncl->sub = NULL;
1472       ncl->next = web->orig_conflict_list;
1473       web->orig_conflict_list = ncl;
1474       if (cl->sub)
1475         {
1476           struct sub_conflict *sl, *nsl;
1477           for (sl = cl->sub; sl; sl = sl->next)
1478             {
1479               nsl = ra_alloc (sizeof *nsl);
1480               nsl->s = sl->s;
1481               nsl->t = sl->t;
1482               nsl->next = ncl->sub;
1483               ncl->sub = nsl;
1484             }
1485         }
1486     }
1487 }
1488
1489 /* Possibly add an edge from web FROM to TO marking a conflict between
1490    those two.  This is one half of marking a complete conflict, which notes
1491    in FROM, that TO is a conflict.  Adding TO to FROM's conflicts might
1492    make other conflicts superfluous, because the current TO overlaps some web
1493    already being in conflict with FROM.  In this case the smaller webs are
1494    deleted from the conflict list.  Likewise if TO is overlapped by a web
1495    already in the list, it isn't added at all.  Note, that this can only
1496    happen, if SUBREG webs are involved.  */
1497
1498 static void
1499 add_conflict_edge (struct web *from, struct web *to)
1500 {
1501   if (from->type != PRECOLORED)
1502     {
1503       struct web *pfrom = find_web_for_subweb (from);
1504       struct web *pto = find_web_for_subweb (to);
1505       struct sub_conflict *sl;
1506       struct conflict_link *cl = pfrom->conflict_list;
1507       int may_delete = 1;
1508
1509       /* This can happen when subwebs of one web conflict with each
1510          other.  In live_out_1() we created such conflicts between yet
1511          undefined webparts and defs of parts which didn't overlap with the
1512          undefined bits.  Then later they nevertheless could have merged into
1513          one web, and then we land here.  */
1514       if (pfrom == pto)
1515         return;
1516       if (remember_conflicts && !pfrom->have_orig_conflicts)
1517         copy_conflict_list (pfrom);
1518       if (!TEST_BIT (sup_igraph, (pfrom->id * num_webs + pto->id)))
1519         {
1520           cl = ra_alloc (sizeof (*cl));
1521           cl->t = pto;
1522           cl->sub = NULL;
1523           cl->next = pfrom->conflict_list;
1524           pfrom->conflict_list = cl;
1525           if (pto->type != SELECT && pto->type != COALESCED)
1526             pfrom->num_conflicts += 1 + pto->add_hardregs;
1527           SET_BIT (sup_igraph, (pfrom->id * num_webs + pto->id));
1528           may_delete = 0;
1529         }
1530       else
1531         /* We don't need to test for cl==NULL, because at this point
1532            a cl with cl->t==pto is guaranteed to exist.  */
1533         while (cl->t != pto)
1534           cl = cl->next;
1535       if (pfrom != from || pto != to)
1536         {
1537           /* This is a subconflict which should be added.
1538              If we inserted cl in this invocation, we really need to add this
1539              subconflict.  If we did _not_ add it here, we only add the
1540              subconflict, if cl already had subconflicts, because otherwise
1541              this indicated, that the whole webs already conflict, which
1542              means we are not interested in this subconflict.  */
1543           if (!may_delete || cl->sub != NULL)
1544             {
1545               sl = ra_alloc (sizeof (*sl));
1546               sl->s = from;
1547               sl->t = to;
1548               sl->next = cl->sub;
1549               cl->sub = sl;
1550             }
1551         }
1552       else
1553         /* pfrom == from && pto == to means, that we are not interested
1554            anymore in the subconflict list for this pair, because anyway
1555            the whole webs conflict.  */
1556         cl->sub = NULL;
1557     }
1558 }
1559
1560 /* Record a conflict between two webs, if we haven't recorded it
1561    already.  */
1562
1563 void
1564 record_conflict (struct web *web1, struct web *web2)
1565 {
1566   unsigned int id1 = web1->id, id2 = web2->id;
1567   unsigned int index = igraph_index (id1, id2);
1568   /* Trivial non-conflict or already recorded conflict.  */
1569   if (web1 == web2 || TEST_BIT (igraph, index))
1570     return;
1571   gcc_assert (id1 != id2);
1572   /* As fixed_regs are no targets for allocation, conflicts with them
1573      are pointless.  */
1574   if ((web1->regno < FIRST_PSEUDO_REGISTER && fixed_regs[web1->regno])
1575       || (web2->regno < FIRST_PSEUDO_REGISTER && fixed_regs[web2->regno]))
1576     return;
1577   /* Conflicts with hardregs, which are not even a candidate
1578      for this pseudo are also pointless.  */
1579   if ((web1->type == PRECOLORED
1580        && ! TEST_HARD_REG_BIT (web2->usable_regs, web1->regno))
1581       || (web2->type == PRECOLORED
1582           && ! TEST_HARD_REG_BIT (web1->usable_regs, web2->regno)))
1583     return;
1584   /* Similar if the set of possible hardregs don't intersect.  This iteration
1585      those conflicts are useless (and would make num_conflicts wrong, because
1586      num_freedom is calculated from the set of possible hardregs).
1587      But in presence of spilling and incremental building of the graph we
1588      need to note all uses of webs conflicting with the spilled ones.
1589      Because the set of possible hardregs can change in the next round for
1590      spilled webs, we possibly have then conflicts with webs which would
1591      be excluded now (because then hardregs intersect).  But we actually
1592      need to check those uses, and to get hold of them, we need to remember
1593      also webs conflicting with this one, although not conflicting in this
1594      round because of non-intersecting hardregs.  */
1595   if (web1->type != PRECOLORED && web2->type != PRECOLORED
1596       && ! hard_regs_intersect_p (&web1->usable_regs, &web2->usable_regs))
1597     {
1598       struct web *p1 = find_web_for_subweb (web1);
1599       struct web *p2 = find_web_for_subweb (web2);
1600       /* We expect these to be rare enough to justify bitmaps.  And because
1601          we have only a special use for it, we note only the superwebs.  */
1602       bitmap_set_bit (p1->useless_conflicts, p2->id);
1603       bitmap_set_bit (p2->useless_conflicts, p1->id);
1604       return;
1605     }
1606   SET_BIT (igraph, index);
1607   add_conflict_edge (web1, web2);
1608   add_conflict_edge (web2, web1);
1609 }
1610
1611 /* For each web W this produces the missing subwebs Wx, such that it's
1612    possible to exactly specify (W-Wy) for all already existing subwebs Wy.  */
1613
1614 static void
1615 build_inverse_webs (struct web *web)
1616 {
1617   struct web *sweb = web->subreg_next;
1618   unsigned HOST_WIDE_INT undef;
1619
1620   undef = rtx_to_undefined (web->orig_x);
1621   for (; sweb; sweb = sweb->subreg_next)
1622     /* Only create inverses of non-artificial webs.  */
1623     if (!sweb->artificial)
1624       {
1625         unsigned HOST_WIDE_INT bits;
1626         bits = undef & ~ rtx_to_undefined (sweb->orig_x);
1627         while (bits)
1628           {
1629             unsigned int size_word = undef_to_size_word (web->orig_x, &bits);
1630             if (!find_subweb_2 (web, size_word))
1631               add_subweb_2 (web, size_word);
1632           }
1633       }
1634 }
1635
1636 /* Copies the content of WEB to a new one, and link it into WL.
1637    Used for consistency checking.  */
1638
1639 static void
1640 copy_web (struct web *web, struct web_link **wl)
1641 {
1642   struct web *cweb = xmalloc (sizeof *cweb);
1643   struct web_link *link = ra_alloc (sizeof *link);
1644   link->next = *wl;
1645   *wl = link;
1646   link->web = cweb;
1647   *cweb = *web;
1648 }
1649
1650 /* Given a list of webs LINK, compare the content of the webs therein
1651    with the global webs of the same ID.  For consistency checking.  */
1652
1653 static void
1654 compare_and_free_webs (struct web_link **link)
1655 {
1656   struct web_link *wl;
1657   for (wl = *link; wl; wl = wl->next)
1658     {
1659       struct web *web1 = wl->web;
1660       struct web *web2 = ID2WEB (web1->id);
1661       gcc_assert (web1->regno == web2->regno);
1662       gcc_assert (web1->mode_changed == web2->mode_changed);
1663       gcc_assert (rtx_equal_p (web1->orig_x, web2->orig_x));
1664       gcc_assert (web1->type == web2->type);
1665       if (web1->type != PRECOLORED)
1666         {
1667           unsigned int i;
1668
1669           /* Only compare num_defs/num_uses with non-hardreg webs.
1670               E.g. the number of uses of the framepointer changes due to
1671               inserting spill code.  */
1672           gcc_assert (web1->num_uses == web2->num_uses);
1673           gcc_assert (web1->num_defs == web2->num_defs);
1674           /* Similarly, if the framepointer was unreferenced originally
1675               but we added spills, these fields may not match.  */
1676           gcc_assert (web1->crosses_call == web2->crosses_call);
1677           gcc_assert (web1->live_over_abnormal == web2->live_over_abnormal);
1678           for (i = 0; i < web1->num_defs; i++)
1679             gcc_assert (web1->defs[i] == web2->defs[i]);
1680           for (i = 0; i < web1->num_uses; i++)
1681             gcc_assert (web1->uses[i] == web2->uses[i]);
1682         }
1683       if (web1->type == PRECOLORED)
1684         {
1685           if (web1->defs)
1686             free (web1->defs);
1687           if (web1->uses)
1688             free (web1->uses);
1689         }
1690       free (web1);
1691     }
1692   *link = NULL;
1693 }
1694
1695 /* Setup and fill uses[] and defs[] arrays of the webs.  */
1696
1697 static void
1698 init_webs_defs_uses (void)
1699 {
1700   struct dlist *d;
1701   for (d = WEBS(INITIAL); d; d = d->next)
1702     {
1703       struct web *web = DLIST_WEB (d);
1704       unsigned int def_i, use_i;
1705       struct df_link *link;
1706       if (web->old_web)
1707         continue;
1708       if (web->type == PRECOLORED)
1709         {
1710           web->num_defs = web->num_uses = 0;
1711           continue;
1712         }
1713       if (web->num_defs)
1714         web->defs = xmalloc (web->num_defs * sizeof (web->defs[0]));
1715       if (web->num_uses)
1716         web->uses = xmalloc (web->num_uses * sizeof (web->uses[0]));
1717       def_i = use_i = 0;
1718       for (link = web->temp_refs; link; link = link->next)
1719         {
1720           if (DF_REF_REG_DEF_P (link->ref))
1721             web->defs[def_i++] = link->ref;
1722           else
1723             web->uses[use_i++] = link->ref;
1724         }
1725       web->temp_refs = NULL;
1726       gcc_assert (def_i == web->num_defs);
1727       gcc_assert (use_i == web->num_uses);
1728     }
1729 }
1730
1731 /* Called by parts_to_webs().  This creates (or recreates) the webs (and
1732    subwebs) from web parts, gives them IDs (only to super webs), and sets
1733    up use2web and def2web arrays.  */
1734
1735 static unsigned int
1736 parts_to_webs_1 (struct df *df, struct web_link **copy_webs,
1737                  struct df_link *all_refs)
1738 {
1739   unsigned int i;
1740   unsigned int webnum;
1741   unsigned int def_id = df->def_id;
1742   unsigned int use_id = df->use_id;
1743   struct web_part *wp_first_use = &web_parts[def_id];
1744
1745   /* For each root web part: create and initialize a new web,
1746      setup def2web[] and use2web[] for all defs and uses, and
1747      id2web for all new webs.  */
1748
1749   webnum = 0;
1750   for (i = 0; i < def_id + use_id; i++)
1751     {
1752       struct web *subweb, *web = 0; /* Initialize web to silence warnings.  */
1753       struct web_part *wp = &web_parts[i];
1754       struct ref *ref = wp->ref;
1755       unsigned int ref_id;
1756       rtx reg;
1757       if (!ref)
1758         continue;
1759       ref_id = i;
1760       if (i >= def_id)
1761         ref_id -= def_id;
1762       all_refs[i].ref = ref;
1763       reg = DF_REF_REG (ref);
1764       if (! wp->uplink)
1765         {
1766           /* If we have a web part root, create a new web.  */
1767           unsigned int newid = ~(unsigned)0;
1768           unsigned int old_web = 0;
1769
1770           /* In the first pass, there are no old webs, so unconditionally
1771              allocate a new one.  */
1772           if (ra_pass == 1)
1773             {
1774               web = xmalloc (sizeof (struct web));
1775               newid = last_num_webs++;
1776               init_one_web (web, GET_CODE (reg) == SUBREG
1777                                  ? SUBREG_REG (reg) : reg);
1778             }
1779           /* Otherwise, we look for an old web.  */
1780           else
1781             {
1782               /* Remember, that use2web == def2web + def_id.
1783                  Ergo is def2web[i] == use2web[i - def_id] for i >= def_id.
1784                  So we only need to look into def2web[] array.
1785                  Try to look at the web, which formerly belonged to this
1786                  def (or use).  */
1787               web = def2web[i];
1788               /* Or which belonged to this hardreg.  */
1789               if (!web && DF_REF_REGNO (ref) < FIRST_PSEUDO_REGISTER)
1790                 web = hardreg2web[DF_REF_REGNO (ref)];
1791               if (web)
1792                 {
1793                   /* If we found one, reuse it.  */
1794                   web = find_web_for_subweb (web);
1795                   remove_list (web->dlink, &WEBS(INITIAL));
1796                   old_web = 1;
1797                   copy_web (web, copy_webs);
1798                 }
1799               else
1800                 {
1801                   /* Otherwise use a new one.  First from the free list.  */
1802                   if (WEBS(FREE))
1803                     web = DLIST_WEB (pop_list (&WEBS(FREE)));
1804                   else
1805                     {
1806                       /* Else allocate a new one.  */
1807                       web = xmalloc (sizeof (struct web));
1808                       newid = last_num_webs++;
1809                     }
1810                 }
1811               /* The id is zeroed in init_one_web().  */
1812               if (newid == ~(unsigned)0)
1813                 newid = web->id;
1814               if (old_web)
1815                 reinit_one_web (web, GET_CODE (reg) == SUBREG
1816                                      ? SUBREG_REG (reg) : reg);
1817               else
1818                 init_one_web (web, GET_CODE (reg) == SUBREG
1819                                    ? SUBREG_REG (reg) : reg);
1820               web->old_web = (old_web && web->type != PRECOLORED) ? 1 : 0;
1821             }
1822           web->span_deaths = wp->spanned_deaths;
1823           web->crosses_call = wp->crosses_call;
1824           web->id = newid;
1825           web->temp_refs = NULL;
1826           webnum++;
1827           if (web->regno < FIRST_PSEUDO_REGISTER)
1828             {
1829               if (!hardreg2web[web->regno])
1830                 hardreg2web[web->regno] = web;
1831               else
1832                 gcc_assert (hardreg2web[web->regno] == web);
1833             }
1834         }
1835
1836       /* If this reference already had a web assigned, we are done.
1837          This test better is equivalent to the web being an old web.
1838          Otherwise something is screwed.  (This is tested)  */
1839       if (def2web[i] != NULL)
1840         {
1841           web = def2web[i];
1842           web = find_web_for_subweb (web);
1843           /* But if this ref includes a mode change, or was a use live
1844              over an abnormal call, set appropriate flags in the web.  */
1845           if ((DF_REF_FLAGS (ref) & DF_REF_MODE_CHANGE) != 0
1846               && web->regno >= FIRST_PSEUDO_REGISTER)
1847             web->mode_changed = 1;
1848           if ((DF_REF_FLAGS (ref) & DF_REF_STRIPPED) != 0
1849               && web->regno >= FIRST_PSEUDO_REGISTER)
1850             web->subreg_stripped = 1;
1851           if (i >= def_id
1852               && TEST_BIT (live_over_abnormal, ref_id))
1853             web->live_over_abnormal = 1;
1854           /* And check, that it's not a newly allocated web.  This would be
1855              an inconsistency.  */
1856           gcc_assert (web->old_web);
1857           gcc_assert (web->type != PRECOLORED);
1858           continue;
1859         }
1860       /* In case this was no web part root, we need to initialize WEB
1861          from the ref2web array belonging to the root.  */
1862       if (wp->uplink)
1863         {
1864           struct web_part *rwp = find_web_part (wp);
1865           unsigned int j = DF_REF_ID (rwp->ref);
1866           if (rwp < wp_first_use)
1867             web = def2web[j];
1868           else
1869             web = use2web[j];
1870           web = find_web_for_subweb (web);
1871         }
1872
1873       /* Remember all references for a web in a single linked list.  */
1874       all_refs[i].next = web->temp_refs;
1875       web->temp_refs = &all_refs[i];
1876
1877       /* And the test, that if def2web[i] was NULL above, that we are _not_
1878          an old web.  */
1879       gcc_assert (!web->old_web || web->type == PRECOLORED);
1880
1881       /* Possible create a subweb, if this ref was a subreg.  */
1882       if (GET_CODE (reg) == SUBREG)
1883         {
1884           subweb = find_subweb (web, reg);
1885           if (!subweb)
1886             {
1887               subweb = add_subweb (web, reg);
1888               gcc_assert (!web->old_web);
1889             }
1890         }
1891       else
1892         subweb = web;
1893
1894       /* And look, if the ref involves an invalid mode change.  */
1895       if ((DF_REF_FLAGS (ref) & DF_REF_MODE_CHANGE) != 0
1896           && web->regno >= FIRST_PSEUDO_REGISTER)
1897         web->mode_changed = 1;
1898       if ((DF_REF_FLAGS (ref) & DF_REF_STRIPPED) != 0
1899           && web->regno >= FIRST_PSEUDO_REGISTER)
1900         web->subreg_stripped = 1;
1901
1902       /* Setup def2web, or use2web, and increment num_defs or num_uses.  */
1903       if (i < def_id)
1904         {
1905           /* Some sanity checks.  */
1906           if (ra_pass > 1)
1907             {
1908               struct web *compare = def2web[i];
1909               if (i < last_def_id)
1910                 gcc_assert (!web->old_web || compare == subweb);
1911               gcc_assert (web->old_web || !compare);
1912               gcc_assert (!compare || compare == subweb);
1913             }
1914           def2web[i] = subweb;
1915           web->num_defs++;
1916         }
1917       else
1918         {
1919           if (ra_pass > 1)
1920             {
1921               struct web *compare = use2web[ref_id];
1922               
1923               gcc_assert (ref_id >= last_use_id
1924                           || !web->old_web || compare == subweb);
1925               gcc_assert (web->old_web || !compare);
1926               gcc_assert (!compare || compare == subweb);
1927             }
1928           use2web[ref_id] = subweb;
1929           web->num_uses++;
1930           if (TEST_BIT (live_over_abnormal, ref_id))
1931             web->live_over_abnormal = 1;
1932         }
1933     }
1934
1935   /* We better now have exactly as many webs as we had web part roots.  */
1936   gcc_assert (webnum == num_webs);
1937
1938   return webnum;
1939 }
1940
1941 /* This builds full webs out of web parts, without relating them to each
1942    other (i.e. without creating the conflict edges).  */
1943
1944 static void
1945 parts_to_webs (struct df *df)
1946 {
1947   unsigned int i;
1948   unsigned int webnum;
1949   struct web_link *copy_webs = NULL;
1950   struct dlist *d;
1951   struct df_link *all_refs;
1952   num_subwebs = 0;
1953
1954   /* First build webs and ordinary subwebs.  */
1955   all_refs = xcalloc (df->def_id + df->use_id, sizeof (all_refs[0]));
1956   webnum = parts_to_webs_1 (df, &copy_webs, all_refs);
1957
1958   /* Setup the webs for hardregs which are still missing (weren't
1959      mentioned in the code).  */
1960   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1961     if (!hardreg2web[i])
1962       {
1963         struct web *web = xmalloc (sizeof (struct web));
1964         init_one_web (web, gen_rtx_REG (reg_raw_mode[i], i));
1965         web->id = last_num_webs++;
1966         hardreg2web[web->regno] = web;
1967       }
1968   num_webs = last_num_webs;
1969
1970   /* Now create all artificial subwebs, i.e. those, which do
1971      not correspond to a real subreg in the current function's RTL, but
1972      which nevertheless is a target of a conflict.
1973      XXX we need to merge this loop with the one above, which means, we need
1974      a way to later override the artificiality.  Beware: currently
1975      add_subweb_2() relies on the existence of normal subwebs for deducing
1976      a sane mode to use for the artificial subwebs.  */
1977   for (i = 0; i < df->def_id + df->use_id; i++)
1978     {
1979       struct web_part *wp = &web_parts[i];
1980       struct tagged_conflict *cl;
1981       struct web *web;
1982       if (wp->uplink || !wp->ref)
1983         {
1984           gcc_assert (!wp->sub_conflicts);
1985           continue;
1986         }
1987       web = def2web[i];
1988       web = find_web_for_subweb (web);
1989       for (cl = wp->sub_conflicts; cl; cl = cl->next)
1990         if (!find_subweb_2 (web, cl->size_word))
1991           add_subweb_2 (web, cl->size_word);
1992     }
1993
1994   /* And now create artificial subwebs needed for representing the inverse
1995      of some subwebs.  This also gives IDs to all subwebs.  */
1996   webnum = last_num_webs;
1997   for (d = WEBS(INITIAL); d; d = d->next)
1998     {
1999       struct web *web = DLIST_WEB (d);
2000       if (web->subreg_next)
2001         {
2002           struct web *sweb;
2003           build_inverse_webs (web);
2004           for (sweb = web->subreg_next; sweb; sweb = sweb->subreg_next)
2005             sweb->id = webnum++;
2006         }
2007     }
2008
2009   /* Now that everyone has an ID, we can setup the id2web array.  */
2010   id2web = xcalloc (webnum, sizeof (id2web[0]));
2011   for (d = WEBS(INITIAL); d; d = d->next)
2012     {
2013       struct web *web = DLIST_WEB (d);
2014       ID2WEB (web->id) = web;
2015       for (web = web->subreg_next; web; web = web->subreg_next)
2016         ID2WEB (web->id) = web;
2017     }
2018   num_subwebs = webnum - last_num_webs;
2019   num_allwebs = num_webs + num_subwebs;
2020   num_webs += num_subwebs;
2021
2022   /* Allocate and clear the conflict graph bitmaps.  */
2023   igraph = sbitmap_alloc (num_webs * num_webs / 2);
2024   sup_igraph = sbitmap_alloc (num_webs * num_webs);
2025   sbitmap_zero (igraph);
2026   sbitmap_zero (sup_igraph);
2027
2028   /* Distribute the references to their webs.  */
2029   init_webs_defs_uses ();
2030   /* And do some sanity checks if old webs, and those recreated from the
2031      really are the same.  */
2032   compare_and_free_webs (&copy_webs);
2033   free (all_refs);
2034 }
2035
2036 /* This deletes all conflicts to and from webs which need to be renewed
2037    in this pass of the allocator, i.e. those which were spilled in the
2038    last pass.  Furthermore it also rebuilds the bitmaps for the remaining
2039    conflicts.  */
2040
2041 static void
2042 reset_conflicts (void)
2043 {
2044   unsigned int i;
2045   bitmap newwebs = BITMAP_XMALLOC ();
2046   for (i = 0; i < num_webs - num_subwebs; i++)
2047     {
2048       struct web *web = ID2WEB (i);
2049       /* Hardreg webs and non-old webs are new webs (which
2050          need rebuilding).  */
2051       if (web->type == PRECOLORED || !web->old_web)
2052         bitmap_set_bit (newwebs, web->id);
2053     }
2054
2055   for (i = 0; i < num_webs - num_subwebs; i++)
2056     {
2057       struct web *web = ID2WEB (i);
2058       struct conflict_link *cl;
2059       struct conflict_link **pcl;
2060       pcl = &(web->conflict_list);
2061
2062       /* First restore the conflict list to be like it was before
2063          coalescing.  */
2064       if (web->have_orig_conflicts)
2065         {
2066           web->conflict_list = web->orig_conflict_list;
2067           web->orig_conflict_list = NULL;
2068         }
2069       gcc_assert (!web->orig_conflict_list);
2070
2071       /* New non-precolored webs, have no conflict list.  */
2072       if (web->type != PRECOLORED && !web->old_web)
2073         {
2074           *pcl = NULL;
2075           /* Useless conflicts will be rebuilt completely.  But check
2076              for cleanliness, as the web might have come from the
2077              free list.  */
2078           gcc_assert (bitmap_empty_p (web->useless_conflicts));
2079         }
2080       else
2081         {
2082           /* Useless conflicts with new webs will be rebuilt if they
2083              are still there.  */
2084           bitmap_and_compl_into (web->useless_conflicts, newwebs);
2085           /* Go through all conflicts, and retain those to old webs.  */
2086           for (cl = web->conflict_list; cl; cl = cl->next)
2087             {
2088               if (cl->t->old_web || cl->t->type == PRECOLORED)
2089                 {
2090                   *pcl = cl;
2091                   pcl = &(cl->next);
2092
2093                   /* Also restore the entries in the igraph bitmaps.  */
2094                   web->num_conflicts += 1 + cl->t->add_hardregs;
2095                   SET_BIT (sup_igraph, (web->id * num_webs + cl->t->id));
2096                   /* No subconflicts mean full webs conflict.  */
2097                   if (!cl->sub)
2098                     SET_BIT (igraph, igraph_index (web->id, cl->t->id));
2099                   else
2100                     /* Else only the parts in cl->sub must be in the
2101                        bitmap.  */
2102                     {
2103                       struct sub_conflict *sl;
2104                       for (sl = cl->sub; sl; sl = sl->next)
2105                         SET_BIT (igraph, igraph_index (sl->s->id, sl->t->id));
2106                     }
2107                 }
2108             }
2109           *pcl = NULL;
2110         }
2111       web->have_orig_conflicts = 0;
2112     }
2113   BITMAP_XFREE (newwebs);
2114 }
2115
2116 /* For each web check it's num_conflicts member against that
2117    number, as calculated from scratch from all neighbors.  */
2118
2119 #if 0
2120 static void
2121 check_conflict_numbers (void)
2122 {
2123   unsigned int i;
2124   for (i = 0; i < num_webs; i++)
2125     {
2126       struct web *web = ID2WEB (i);
2127       int new_conf = 0 * web->add_hardregs;
2128       struct conflict_link *cl;
2129       for (cl = web->conflict_list; cl; cl = cl->next)
2130         if (cl->t->type != SELECT && cl->t->type != COALESCED)
2131           new_conf += 1 + cl->t->add_hardregs;
2132       gcc_assert (web->type == PRECOLORED || new_conf == web->num_conflicts);
2133     }
2134 }
2135 #endif
2136
2137 /* Convert the conflicts between web parts to conflicts between full webs.
2138
2139    This can't be done in parts_to_webs(), because for recording conflicts
2140    between webs we need to know their final usable_regs set, which is used
2141    to discard non-conflicts (between webs having no hard reg in common).
2142    But this is set for spill temporaries only after the webs itself are
2143    built.  Until then the usable_regs set is based on the pseudo regno used
2144    in this web, which may contain far less registers than later determined.
2145    This would result in us loosing conflicts (due to record_conflict()
2146    thinking that a web can only be allocated to the current usable_regs,
2147    whereas later this is extended) leading to colorings, where some regs which
2148    in reality conflict get the same color.  */
2149
2150 static void
2151 conflicts_between_webs (struct df *df)
2152 {
2153   unsigned int i;
2154   struct dlist *d;
2155   bitmap ignore_defs = BITMAP_XMALLOC ();
2156   unsigned int have_ignored;
2157   unsigned int *pass_cache = xcalloc (num_webs, sizeof (int));
2158   unsigned int pass = 0;
2159
2160   if (ra_pass > 1)
2161     reset_conflicts ();
2162
2163   /* It is possible, that in the conflict bitmaps still some defs I are noted,
2164      which have web_parts[I].ref being NULL.  This can happen, when from the
2165      last iteration the conflict bitmap for this part wasn't deleted, but a
2166      conflicting move insn was removed.  It's DEF is still in the conflict
2167      bitmap, but it doesn't exist anymore in df->defs.  To not have to check
2168      it in the tight loop below, we instead remember the ID's of them in a
2169      bitmap, and loop only over IDs which are not in it.  */
2170   for (i = 0; i < df->def_id; i++)
2171     if (web_parts[i].ref == NULL)
2172       bitmap_set_bit (ignore_defs, i);
2173   have_ignored = !bitmap_empty_p (ignore_defs);
2174
2175   /* Now record all conflicts between webs.  Note that we only check
2176      the conflict bitmaps of all defs.  Conflict bitmaps are only in
2177      webpart roots.  If they are in uses, those uses are roots, which
2178      means, that this is an uninitialized web, whose conflicts
2179      don't matter.  Nevertheless for hardregs we also need to check uses.
2180      E.g. hardregs used for argument passing have no DEF in the RTL,
2181      but if they have uses, they indeed conflict with all DEFs they
2182      overlap.  */
2183   for (i = 0; i < df->def_id + df->use_id; i++)
2184     {
2185       struct tagged_conflict *cl = web_parts[i].sub_conflicts;
2186       struct web *supweb1;
2187       if (!cl
2188           || (i >= df->def_id
2189               && DF_REF_REGNO (web_parts[i].ref) >= FIRST_PSEUDO_REGISTER))
2190         continue;
2191       supweb1 = def2web[i];
2192       supweb1 = find_web_for_subweb (supweb1);
2193       for (; cl; cl = cl->next)
2194         if (cl->conflicts)
2195           {
2196             unsigned j;
2197             struct web *web1 = find_subweb_2 (supweb1, cl->size_word);
2198             bitmap_iterator bi;
2199
2200             if (have_ignored)
2201               bitmap_and_compl_into (cl->conflicts, ignore_defs);
2202             /* We reduce the number of calls to record_conflict() with this
2203                pass thing.  record_conflict() itself also has some early-out
2204                optimizations, but here we can use the special properties of
2205                the loop (constant web1) to reduce that even more.
2206                We once used an sbitmap of already handled web indices,
2207                but sbitmaps are slow to clear and bitmaps are slow to
2208                set/test.  The current approach needs more memory, but
2209                locality is large.  */
2210             pass++;
2211
2212             /* Note, that there are only defs in the conflicts bitset.  */
2213             EXECUTE_IF_SET_IN_BITMAP (cl->conflicts, 0, j, bi)
2214               {
2215                 struct web *web2 = def2web[j];
2216                 unsigned int id2 = web2->id;
2217                 if (pass_cache[id2] != pass)
2218                   {
2219                     pass_cache[id2] = pass;
2220                     record_conflict (web1, web2);
2221                   }
2222               }
2223           }
2224     }
2225
2226   free (pass_cache);
2227   BITMAP_XFREE (ignore_defs);
2228
2229   for (d = WEBS(INITIAL); d; d = d->next)
2230     {
2231       struct web *web = DLIST_WEB (d);
2232       int j;
2233
2234       if (web->crosses_call)
2235         for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
2236           if (TEST_HARD_REG_BIT (regs_invalidated_by_call, j))
2237             record_conflict (web, hardreg2web[j]);
2238
2239 #ifdef STACK_REGS
2240       /* Pseudos can't go in stack regs if they are live at the beginning of
2241          a block that is reached by an abnormal edge.  */
2242       if (web->live_over_abnormal)
2243         for (j = FIRST_STACK_REG; j <= LAST_STACK_REG; j++)
2244           record_conflict (web, hardreg2web[j]);
2245 #endif
2246     }
2247 }
2248
2249 /* Remember that a web was spilled, and change some characteristics
2250    accordingly.  */
2251
2252 static void
2253 remember_web_was_spilled (struct web *web)
2254 {
2255   int i;
2256   unsigned int found_size = 0;
2257   int adjust;
2258   web->spill_temp = 1;
2259
2260   /* From now on don't use reg_pref/alt_class (regno) anymore for
2261      this web, but instead  usable_regs.  We can't use spill_temp for
2262      this, as it might get reset later, when we are coalesced to a
2263      non-spill-temp.  In that case we still want to use usable_regs.  */
2264   web->use_my_regs = 1;
2265
2266   /* We don't constrain spill temporaries in any way for now.
2267      It's wrong sometimes to have the same constraints or
2268      preferences as the original pseudo, esp. if they were very narrow.
2269      (E.g. there once was a reg wanting class AREG (only one register)
2270      without alternative class.  As long, as also the spill-temps for
2271      this pseudo had the same constraints it was spilled over and over.
2272      Ideally we want some constraints also on spill-temps: Because they are
2273      not only loaded/stored, but also worked with, any constraints from insn
2274      alternatives needs applying.  Currently this is dealt with by reload, as
2275      many other things, but at some time we want to integrate that
2276      functionality into the allocator.  */
2277   if (web->regno >= max_normal_pseudo)
2278     {
2279       COPY_HARD_REG_SET (web->usable_regs,
2280                         reg_class_contents[reg_preferred_class (web->regno)]);
2281       IOR_HARD_REG_SET (web->usable_regs,
2282                         reg_class_contents[reg_alternate_class (web->regno)]);
2283     }
2284   else
2285     COPY_HARD_REG_SET (web->usable_regs,
2286                        reg_class_contents[(int) GENERAL_REGS]);
2287   AND_COMPL_HARD_REG_SET (web->usable_regs, never_use_colors);
2288   prune_hardregs_for_mode (&web->usable_regs, PSEUDO_REGNO_MODE (web->regno));
2289 #ifdef CANNOT_CHANGE_MODE_CLASS
2290   if (web->mode_changed)
2291     AND_COMPL_HARD_REG_SET (web->usable_regs, invalid_mode_change_regs);
2292 #endif
2293   web->num_freedom = hard_regs_count (web->usable_regs);
2294   gcc_assert (web->num_freedom);
2295   COPY_HARD_REG_SET (web->orig_usable_regs, web->usable_regs);
2296   /* Now look for a class, which is subset of our constraints, to
2297      setup add_hardregs, and regclass for debug output.  */
2298   web->regclass = NO_REGS;
2299   for (i = (int) ALL_REGS - 1; i > 0; i--)
2300     {
2301       unsigned int size;
2302       HARD_REG_SET test;
2303       COPY_HARD_REG_SET (test, reg_class_contents[i]);
2304       AND_COMPL_HARD_REG_SET (test, never_use_colors);
2305       GO_IF_HARD_REG_SUBSET (test, web->usable_regs, found);
2306       continue;
2307     found:
2308       /* Measure the actual number of bits which really are overlapping
2309          the target regset, not just the reg_class_size.  */
2310       size = hard_regs_count (test);
2311       if (found_size < size)
2312         {
2313           web->regclass = (enum reg_class) i;
2314           found_size = size;
2315         }
2316     }
2317
2318   adjust = 0 * web->add_hardregs;
2319   web->add_hardregs =
2320     CLASS_MAX_NREGS (web->regclass, PSEUDO_REGNO_MODE (web->regno)) - 1;
2321   web->num_freedom -= web->add_hardregs;
2322   gcc_assert (web->num_freedom);
2323   adjust -= 0 * web->add_hardregs;
2324   web->num_conflicts -= adjust;
2325 }
2326
2327 /* Look at each web, if it is used as spill web.  Or better said,
2328    if it will be spillable in this pass.  */
2329
2330 static void
2331 detect_spill_temps (void)
2332 {
2333   struct dlist *d;
2334   bitmap already = BITMAP_XMALLOC ();
2335
2336   /* Detect webs used for spill temporaries.  */
2337   for (d = WEBS(INITIAL); d; d = d->next)
2338     {
2339       struct web *web = DLIST_WEB (d);
2340
2341       /* Below only the detection of spill temporaries.  We never spill
2342          precolored webs, so those can't be spill temporaries.  The code above
2343          (remember_web_was_spilled) can't currently cope with hardregs
2344          anyway.  */
2345       if (web->regno < FIRST_PSEUDO_REGISTER)
2346         continue;
2347       /* Uninitialized webs can't be spill-temporaries.  */
2348       if (web->num_defs == 0)
2349         continue;
2350
2351       /* A web with only defs and no uses can't be spilled.  Nevertheless
2352          it must get a color, as it takes away a register from all webs
2353          live at these defs.  So we make it a short web.  */
2354       if (web->num_uses == 0)
2355         web->spill_temp = 3;
2356       /* A web which was spilled last time, but for which no insns were
2357          emitted (can happen with IR spilling ignoring sometimes
2358          all deaths).  */
2359       else if (web->changed)
2360         web->spill_temp = 1;
2361       /* A spill temporary has one def, one or more uses, all uses
2362          are in one insn, and either the def or use insn was inserted
2363          by the allocator.  */
2364       /* XXX not correct currently.  There might also be spill temps
2365          involving more than one def.  Usually that's an additional
2366          clobber in the using instruction.  We might also constrain
2367          ourself to that, instead of like currently marking all
2368          webs involving any spill insns at all.  */
2369       else
2370         {
2371           unsigned int i;
2372           int spill_involved = 0;
2373           for (i = 0; i < web->num_uses && !spill_involved; i++)
2374             if (DF_REF_INSN_UID (web->uses[i]) >= orig_max_uid)
2375               spill_involved = 1;
2376           for (i = 0; i < web->num_defs && !spill_involved; i++)
2377             if (DF_REF_INSN_UID (web->defs[i]) >= orig_max_uid)
2378               spill_involved = 1;
2379
2380           if (spill_involved/* && ra_pass > 2*/)
2381             {
2382               int num_deaths = web->span_deaths;
2383               /* Mark webs involving at least one spill insn as
2384                  spill temps.  */
2385               remember_web_was_spilled (web);
2386               /* Search for insns which define and use the web in question
2387                  at the same time, i.e. look for rmw insns.  If these insns
2388                  are also deaths of other webs they might have been counted
2389                  as such into web->span_deaths.  But because of the rmw nature
2390                  of this insn it is no point where a load/reload could be
2391                  placed successfully (it would still conflict with the
2392                  dead web), so reduce the number of spanned deaths by those
2393                  insns.  Note that sometimes such deaths are _not_ counted,
2394                  so negative values can result.  */
2395               bitmap_zero (already);
2396               for (i = 0; i < web->num_defs; i++)
2397                 {
2398                   rtx insn = web->defs[i]->insn;
2399                   if (TEST_BIT (insns_with_deaths, INSN_UID (insn))
2400                       && !bitmap_bit_p (already, INSN_UID (insn)))
2401                     {
2402                       unsigned int j;
2403                       bitmap_set_bit (already, INSN_UID (insn));
2404                       /* Only decrement it once for each insn.  */
2405                       for (j = 0; j < web->num_uses; j++)
2406                         if (web->uses[j]->insn == insn)
2407                           {
2408                             num_deaths--;
2409                             break;
2410                           }
2411                     }
2412                 }
2413               /* But mark them specially if they could possibly be spilled,
2414                  either because they cross some deaths (without the above
2415                  mentioned ones) or calls.  */
2416               if (web->crosses_call || num_deaths > 0)
2417                 web->spill_temp = 1 * 2;
2418             }
2419           /* A web spanning no deaths can't be spilled either.  No loads
2420              would be created for it, ergo no defs.  So the insns wouldn't
2421              change making the graph not easier to color.  Make this also
2422              a short web.  Don't do this if it crosses calls, as these are
2423              also points of reloads.  */
2424           else if (web->span_deaths == 0 && !web->crosses_call)
2425             web->spill_temp = 3;
2426         }
2427       web->orig_spill_temp = web->spill_temp;
2428     }
2429   BITMAP_XFREE (already);
2430 }
2431
2432 /* Returns nonzero if the rtx MEM refers somehow to a stack location.  */
2433
2434 int
2435 memref_is_stack_slot (rtx mem)
2436 {
2437   rtx ad = XEXP (mem, 0);
2438   rtx x;
2439   if (GET_CODE (ad) != PLUS || GET_CODE (XEXP (ad, 1)) != CONST_INT)
2440     return 0;
2441   x = XEXP (ad, 0);
2442   if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
2443       || (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM])
2444       || x == stack_pointer_rtx)
2445     return 1;
2446   return 0;
2447 }
2448
2449 /* Returns nonzero, if rtx X somewhere contains any pseudo register.  */
2450
2451 static int
2452 contains_pseudo (rtx x)
2453 {
2454   const char *fmt;
2455   int i;
2456   if (GET_CODE (x) == SUBREG)
2457     x = SUBREG_REG (x);
2458   if (REG_P (x))
2459     {
2460       if (REGNO (x) >= FIRST_PSEUDO_REGISTER)
2461         return 1;
2462       else
2463         return 0;
2464     }
2465
2466   fmt = GET_RTX_FORMAT (GET_CODE (x));
2467   for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
2468     if (fmt[i] == 'e')
2469       {
2470         if (contains_pseudo (XEXP (x, i)))
2471           return 1;
2472       }
2473     else if (fmt[i] == 'E')
2474       {
2475         int j;
2476         for (j = 0; j < XVECLEN (x, i); j++)
2477           if (contains_pseudo (XVECEXP (x, i, j)))
2478             return 1;
2479       }
2480   return 0;
2481 }
2482
2483 /* Returns nonzero, if we are able to rematerialize something with
2484    value X.  If it's not a general operand, we test if we can produce
2485    a valid insn which set a pseudo to that value, and that insn doesn't
2486    clobber anything.  */
2487
2488 static GTY(()) rtx remat_test_insn;
2489 static int
2490 want_to_remat (rtx x)
2491 {
2492   int num_clobbers = 0;
2493   int icode;
2494
2495   /* If this is a valid operand, we are OK.  If it's VOIDmode, we aren't.  */
2496   if (general_operand (x, GET_MODE (x)))
2497     return 1;
2498
2499   /* Otherwise, check if we can make a valid insn from it.  First initialize
2500      our test insn if we haven't already.  */
2501   if (remat_test_insn == 0)
2502     {
2503       remat_test_insn
2504         = make_insn_raw (gen_rtx_SET (VOIDmode,
2505                                       gen_rtx_REG (word_mode,
2506                                                    FIRST_PSEUDO_REGISTER * 2),
2507                                       const0_rtx));
2508       NEXT_INSN (remat_test_insn) = PREV_INSN (remat_test_insn) = 0;
2509     }
2510
2511   /* Now make an insn like the one we would make when rematerializing
2512      the value X and see if valid.  */
2513   PUT_MODE (SET_DEST (PATTERN (remat_test_insn)), GET_MODE (x));
2514   SET_SRC (PATTERN (remat_test_insn)) = x;
2515   /* XXX For now we don't allow any clobbers to be added, not just no
2516      hardreg clobbers.  */
2517   return ((icode = recog (PATTERN (remat_test_insn), remat_test_insn,
2518                           &num_clobbers)) >= 0
2519           && (num_clobbers == 0
2520               /*|| ! added_clobbers_hard_reg_p (icode)*/));
2521 }
2522
2523 /* Look at all webs, if they perhaps are rematerializable.
2524    They are, if all their defs are simple sets to the same value,
2525    and that value is simple enough, and want_to_remat() holds for it.  */
2526
2527 static void
2528 detect_remat_webs (void)
2529 {
2530   struct dlist *d;
2531   for (d = WEBS(INITIAL); d; d = d->next)
2532     {
2533       struct web *web = DLIST_WEB (d);
2534       unsigned int i;
2535       rtx pat = NULL_RTX;
2536       /* Hardregs and useless webs aren't spilled -> no remat necessary.
2537          Defless webs obviously also can't be rematerialized.  */
2538       if (web->regno < FIRST_PSEUDO_REGISTER || !web->num_defs
2539           || !web->num_uses)
2540         continue;
2541       for (i = 0; i < web->num_defs; i++)
2542         {
2543           rtx insn;
2544           rtx set = single_set (insn = DF_REF_INSN (web->defs[i]));
2545           rtx src;
2546           if (!set)
2547             break;
2548           src = SET_SRC (set);
2549           /* When only subregs of the web are set it isn't easily
2550              rematerializable.  */
2551           if (!rtx_equal_p (SET_DEST (set), web->orig_x))
2552             break;
2553           /* If we already have a pattern it must be equal to the current.  */
2554           if (pat && !rtx_equal_p (pat, src))
2555             break;
2556           /* Don't do the expensive checks multiple times.  */
2557           if (pat)
2558             continue;
2559           /* For now we allow only constant sources.  */
2560           if ((CONSTANT_P (src)
2561                /* If the whole thing is stable already, it is a source for
2562                   remat, no matter how complicated (probably all needed
2563                   resources for it are live everywhere, and don't take
2564                   additional register resources).  */
2565                /* XXX Currently we can't use patterns which contain
2566                   pseudos, _even_ if they are stable.  The code simply isn't
2567                   prepared for that.  All those operands can't be spilled (or
2568                   the dependent remat webs are not remat anymore), so they
2569                   would be oldwebs in the next iteration.  But currently
2570                   oldwebs can't have their references changed.  The
2571                   incremental machinery barfs on that.  */
2572                || (!rtx_unstable_p (src) && !contains_pseudo (src))
2573                /* Additionally also memrefs to stack-slots are useful, when
2574                   we created them ourself.  They might not have set their
2575                   unchanging flag set, but nevertheless they are stable across
2576                   the livetime in question.  */
2577                || (MEM_P (src)
2578                    && INSN_UID (insn) >= orig_max_uid
2579                    && memref_is_stack_slot (src)))
2580               /* And we must be able to construct an insn without
2581                  side-effects to actually load that value into a reg.  */
2582               && want_to_remat (src))
2583             pat = src;
2584           else
2585             break;
2586         }
2587       if (pat && i == web->num_defs)
2588         web->pattern = pat;
2589     }
2590 }
2591
2592 /* Determine the spill costs of all webs.  */
2593
2594 static void
2595 determine_web_costs (void)
2596 {
2597   struct dlist *d;
2598   for (d = WEBS(INITIAL); d; d = d->next)
2599     {
2600       unsigned int i, num_loads;
2601       int load_cost, store_cost;
2602       unsigned HOST_WIDE_INT w;
2603       struct web *web = DLIST_WEB (d);
2604       if (web->type == PRECOLORED)
2605         continue;
2606       /* Get costs for one load/store.  Note that we offset them by 1,
2607          because some patterns have a zero rtx_cost(), but we of course
2608          still need the actual load/store insns.  With zero all those
2609          webs would be the same, no matter how often and where
2610          they are used.  */
2611       if (web->pattern)
2612         {
2613           /* This web is rematerializable.  Beware, we set store_cost to
2614              zero optimistically assuming, that we indeed don't emit any
2615              stores in the spill-code addition.  This might be wrong if
2616              at the point of the load not all needed resources are
2617              available, in which case we emit a stack-based load, for
2618              which we in turn need the according stores.  */
2619           load_cost = 1 + rtx_cost (web->pattern, 0);
2620           store_cost = 0;
2621         }
2622       else
2623         {
2624           load_cost = 1 + MEMORY_MOVE_COST (GET_MODE (web->orig_x),
2625                                             web->regclass, 1);
2626           store_cost = 1 + MEMORY_MOVE_COST (GET_MODE (web->orig_x),
2627                                              web->regclass, 0);
2628         }
2629       /* We create only loads at deaths, whose number is in span_deaths.  */
2630       num_loads = MIN (web->span_deaths, web->num_uses);
2631       for (w = 0, i = 0; i < web->num_uses; i++)
2632         w += DF_REF_BB (web->uses[i])->frequency + 1;
2633       if (num_loads < web->num_uses)
2634         w = (w * num_loads + web->num_uses - 1) / web->num_uses;
2635       web->spill_cost = w * load_cost;
2636       if (store_cost)
2637         {
2638           for (w = 0, i = 0; i < web->num_defs; i++)
2639             w += DF_REF_BB (web->defs[i])->frequency + 1;
2640           web->spill_cost += w * store_cost;
2641         }
2642       web->orig_spill_cost = web->spill_cost;
2643     }
2644 }
2645
2646 /* Detect webs which are set in a conditional jump insn (possibly a
2647    decrement-and-branch type of insn), and mark them not to be
2648    spillable.  The stores for them would need to be placed on edges,
2649    which destroys the CFG.  (Somewhen we want to deal with that XXX)  */
2650
2651 static void
2652 detect_webs_set_in_cond_jump (void)
2653 {
2654   basic_block bb;
2655   FOR_EACH_BB (bb)
2656     if (JUMP_P (BB_END (bb)))
2657       {
2658         struct df_link *link;
2659         for (link = DF_INSN_DEFS (df, BB_END (bb)); link; link = link->next)
2660           if (link->ref && DF_REF_REGNO (link->ref) >= FIRST_PSEUDO_REGISTER)
2661             {
2662               struct web *web = def2web[DF_REF_ID (link->ref)];
2663               web->orig_spill_temp = web->spill_temp = 3;
2664             }
2665       }
2666 }
2667
2668 /* Second top-level function of this file.
2669    Converts the connected web parts to full webs.  This means, it allocates
2670    all webs, and initializes all fields, including detecting spill
2671    temporaries.  It does not distribute moves to their corresponding webs,
2672    though.  */
2673
2674 static void
2675 make_webs (struct df *df)
2676 {
2677   /* First build all the webs itself.  They are not related with
2678      others yet.  */
2679   parts_to_webs (df);
2680   /* Now detect spill temporaries to initialize their usable_regs set.  */
2681   detect_spill_temps ();
2682   detect_webs_set_in_cond_jump ();
2683   /* And finally relate them to each other, meaning to record all possible
2684      conflicts between webs (see the comment there).  */
2685   conflicts_between_webs (df);
2686   detect_remat_webs ();
2687   determine_web_costs ();
2688 }
2689
2690 /* Distribute moves to the corresponding webs.  */
2691
2692 static void
2693 moves_to_webs (struct df *df)
2694 {
2695   struct df_link *link;
2696   struct move_list *ml;
2697
2698   /* Distribute all moves to their corresponding webs, making sure,
2699      each move is in a web maximally one time (happens on some strange
2700      insns).  */
2701   for (ml = wl_moves; ml; ml = ml->next)
2702     {
2703       struct move *m = ml->move;
2704       struct web *web;
2705       struct move_list *newml;
2706       if (!m)
2707         continue;
2708       m->type = WORKLIST;
2709       m->dlink = NULL;
2710       /* Multiple defs/uses can happen in moves involving hard-regs in
2711          a wider mode.  For those df.* creates use/def references for each
2712          real hard-reg involved.  For coalescing we are interested in
2713          the smallest numbered hard-reg.  */
2714       for (link = DF_INSN_DEFS (df, m->insn); link; link = link->next)
2715         if (link->ref)
2716           {
2717             web = def2web[DF_REF_ID (link->ref)];
2718             web = find_web_for_subweb (web);
2719             if (!m->target_web || web->regno < m->target_web->regno)
2720               m->target_web = web;
2721           }
2722       for (link = DF_INSN_USES (df, m->insn); link; link = link->next)
2723         if (link->ref)
2724           {
2725             web = use2web[DF_REF_ID (link->ref)];
2726             web = find_web_for_subweb (web);
2727             if (!m->source_web || web->regno < m->source_web->regno)
2728               m->source_web = web;
2729           }
2730       if (m->source_web && m->target_web
2731           /* If the usable_regs don't intersect we can't coalesce the two
2732              webs anyway, as this is no simple copy insn (it might even
2733              need an intermediate stack temp to execute this "copy" insn).  */
2734           && hard_regs_intersect_p (&m->source_web->usable_regs,
2735                                     &m->target_web->usable_regs))
2736         {
2737           if (!flag_ra_optimistic_coalescing)
2738             {
2739               struct move_list *test = m->source_web->moves;
2740               for (; test && test->move != m; test = test->next);
2741               if (! test)
2742                 {
2743                   newml = ra_alloc (sizeof (struct move_list));
2744                   newml->move = m;
2745                   newml->next = m->source_web->moves;
2746                   m->source_web->moves = newml;
2747                 }
2748               test = m->target_web->moves;
2749               for (; test && test->move != m; test = test->next);
2750               if (! test)
2751                 {
2752                   newml = ra_alloc (sizeof (struct move_list));
2753                   newml->move = m;
2754                   newml->next = m->target_web->moves;
2755                   m->target_web->moves = newml;
2756                 }
2757             }
2758         }
2759       else
2760         /* Delete this move.  */
2761         ml->move = NULL;
2762     }
2763 }
2764
2765 /* Handle tricky asm insns.
2766    Supposed to create conflicts to hardregs which aren't allowed in
2767    the constraints.  Doesn't actually do that, as it might confuse
2768    and constrain the allocator too much.  */
2769
2770 static void
2771 handle_asm_insn (struct df *df, rtx insn)
2772 {
2773   const char *constraints[MAX_RECOG_OPERANDS];
2774   enum machine_mode operand_mode[MAX_RECOG_OPERANDS];
2775   int i, noperands, in_output;
2776   HARD_REG_SET clobbered, allowed, conflict;
2777   rtx pat;
2778   if (! INSN_P (insn)
2779       || (noperands = asm_noperands (PATTERN (insn))) < 0)
2780     return;
2781   pat = PATTERN (insn);
2782   CLEAR_HARD_REG_SET (clobbered);
2783
2784   if (GET_CODE (pat) == PARALLEL)
2785     for (i = 0; i < XVECLEN (pat, 0); i++)
2786       {
2787         rtx t = XVECEXP (pat, 0, i);
2788         if (GET_CODE (t) == CLOBBER && REG_P (XEXP (t, 0))
2789             && REGNO (XEXP (t, 0)) < FIRST_PSEUDO_REGISTER)
2790           SET_HARD_REG_BIT (clobbered, REGNO (XEXP (t, 0)));
2791       }
2792
2793   decode_asm_operands (pat, recog_data.operand, recog_data.operand_loc,
2794                        constraints, operand_mode);
2795   in_output = 1;
2796   for (i = 0; i < noperands; i++)
2797     {
2798       const char *p = constraints[i];
2799       int cls = (int) NO_REGS;
2800       struct df_link *link;
2801       rtx reg;
2802       struct web *web;
2803       int nothing_allowed = 1;
2804       reg = recog_data.operand[i];
2805
2806       /* Look, if the constraints apply to a pseudo reg, and not to
2807          e.g. a mem.  */
2808       while (GET_CODE (reg) == SUBREG
2809              || GET_CODE (reg) == ZERO_EXTRACT
2810              || GET_CODE (reg) == SIGN_EXTRACT
2811              || GET_CODE (reg) == STRICT_LOW_PART)
2812         reg = XEXP (reg, 0);
2813       if (!REG_P (reg) || REGNO (reg) < FIRST_PSEUDO_REGISTER)
2814         continue;
2815
2816       /* Search the web corresponding to this operand.  We depend on
2817          that decode_asm_operands() places the output operands
2818          before the input operands.  */
2819       while (1)
2820         {
2821           if (in_output)
2822             link = df->insns[INSN_UID (insn)].defs;
2823           else
2824             link = df->insns[INSN_UID (insn)].uses;
2825           while (link && link->ref && DF_REF_REAL_REG (link->ref) != reg)
2826             link = link->next;
2827           if (!link || !link->ref)
2828             {
2829               gcc_assert (in_output);
2830               in_output = 0;
2831             }
2832           else
2833             break;
2834         }
2835       if (in_output)
2836         web = def2web[DF_REF_ID (link->ref)];
2837       else
2838         web = use2web[DF_REF_ID (link->ref)];
2839       reg = DF_REF_REG (link->ref);
2840
2841       /* Find the constraints, noting the allowed hardregs in allowed.  */
2842       CLEAR_HARD_REG_SET (allowed);
2843       while (1)
2844         {
2845           char c = *p;
2846
2847           if (c == '\0' || c == ',' || c == '#')
2848             {
2849               /* End of one alternative - mark the regs in the current
2850                class, and reset the class.  */
2851               p++;
2852               IOR_HARD_REG_SET (allowed, reg_class_contents[cls]);
2853               if (cls != NO_REGS)
2854                 nothing_allowed = 0;
2855               cls = NO_REGS;
2856               if (c == '#')
2857                 do {
2858                     c = *p++;
2859                 } while (c != '\0' && c != ',');
2860               if (c == '\0')
2861                 break;
2862               continue;
2863             }
2864
2865           switch (c)
2866             {
2867               case '=': case '+': case '*': case '%': case '?': case '!':
2868               case '0': case '1': case '2': case '3': case '4': case 'm':
2869               case '<': case '>': case 'V': case 'o': case '&': case 'E':
2870               case 'F': case 's': case 'i': case 'n': case 'X': case 'I':
2871               case 'J': case 'K': case 'L': case 'M': case 'N': case 'O':
2872               case 'P':
2873                 break;
2874
2875               case 'p':
2876                 cls = (int) reg_class_subunion[cls][(int) BASE_REG_CLASS];
2877                 nothing_allowed = 0;
2878                 break;
2879
2880               case 'g':
2881               case 'r':
2882                 cls = (int) reg_class_subunion[cls][(int) GENERAL_REGS];
2883                 nothing_allowed = 0;
2884                 break;
2885
2886               default:
2887                 cls =
2888                   (int) reg_class_subunion[cls][(int)
2889                                                 REG_CLASS_FROM_CONSTRAINT (c,
2890                                                                            p)];
2891             }
2892           p += CONSTRAINT_LEN (c, p);
2893         }
2894
2895       /* Now make conflicts between this web, and all hardregs, which
2896          are not allowed by the constraints.  */
2897       if (nothing_allowed)
2898         {
2899           /* If we had no real constraints nothing was explicitly
2900              allowed, so we allow the whole class (i.e. we make no
2901              additional conflicts).  */
2902           CLEAR_HARD_REG_SET (conflict);
2903         }
2904       else
2905         {
2906           COPY_HARD_REG_SET (conflict, usable_regs
2907                              [reg_preferred_class (web->regno)]);
2908           IOR_HARD_REG_SET (conflict, usable_regs
2909                             [reg_alternate_class (web->regno)]);
2910           AND_COMPL_HARD_REG_SET (conflict, allowed);
2911           /* We can't yet establish these conflicts.  Reload must go first
2912              (or better said, we must implement some functionality of reload).
2913              E.g. if some operands must match, and they need the same color
2914              we don't see yet, that they do not conflict (because they match).
2915              For us it looks like two normal references with different DEFs,
2916              so they conflict, and as they both need the same color, the
2917              graph becomes uncolorable.  */
2918 #if 0
2919           for (c = 0; c < FIRST_PSEUDO_REGISTER; c++)
2920             if (TEST_HARD_REG_BIT (conflict, c))
2921               record_conflict (web, hardreg2web[c]);
2922 #endif
2923         }
2924       if (dump_file)
2925         {
2926           int c;
2927           ra_debug_msg (DUMP_ASM, " ASM constrain Web %d conflicts with:", web->id);
2928           for (c = 0; c < FIRST_PSEUDO_REGISTER; c++)
2929             if (TEST_HARD_REG_BIT (conflict, c))
2930               ra_debug_msg (DUMP_ASM, " %d", c);
2931           ra_debug_msg (DUMP_ASM, "\n");
2932         }
2933     }
2934 }
2935
2936 /* The real toplevel function in this file.
2937    Build (or rebuilds) the complete interference graph with webs
2938    and conflicts.  */
2939
2940 void
2941 build_i_graph (struct df *df)
2942 {
2943   rtx insn;
2944
2945   init_web_parts (df);
2946
2947   sbitmap_zero (move_handled);
2948   wl_moves = NULL;
2949
2950   build_web_parts_and_conflicts (df);
2951
2952   /* For read-modify-write instructions we may have created two webs.
2953      Reconnect them here.  (s.a.)  */
2954   connect_rmw_web_parts (df);
2955
2956   /* The webs are conceptually complete now, but still scattered around as
2957      connected web parts.  Collect all information and build the webs
2958      including all conflicts between webs (instead web parts).  */
2959   make_webs (df);
2960   moves_to_webs (df);
2961
2962   /* Look for additional constraints given by asms.  */
2963   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
2964     handle_asm_insn (df, insn);
2965 }
2966
2967 /* Allocates or reallocates most memory for the interference graph and
2968    associated structures.  If it reallocates memory (meaning, this is not
2969    the first pass), this also changes some structures to reflect the
2970    additional entries in various array, and the higher number of
2971    defs and uses.  */
2972
2973 void
2974 ra_build_realloc (struct df *df)
2975 {
2976   struct web_part *last_web_parts = web_parts;
2977   struct web **last_def2web = def2web;
2978   struct web **last_use2web = use2web;
2979   sbitmap last_live_over_abnormal = live_over_abnormal;
2980   unsigned int i;
2981   struct dlist *d;
2982   move_handled = sbitmap_alloc (get_max_uid () );
2983   web_parts = xcalloc (df->def_id + df->use_id, sizeof web_parts[0]);
2984   def2web = xcalloc (df->def_id + df->use_id, sizeof def2web[0]);
2985   use2web = &def2web[df->def_id];
2986   live_over_abnormal = sbitmap_alloc (df->use_id);
2987   sbitmap_zero (live_over_abnormal);
2988
2989   /* First go through all old defs and uses.  */
2990   for (i = 0; i < last_def_id + last_use_id; i++)
2991     {
2992       /* And relocate them to the new array.  This is made ugly by the
2993          fact, that defs and uses are placed consecutive into one array.  */
2994       struct web_part *dest = &web_parts[i < last_def_id
2995                                          ? i : (df->def_id + i - last_def_id)];
2996       struct web_part *up;
2997       *dest = last_web_parts[i];
2998       up = dest->uplink;
2999       dest->uplink = NULL;
3000
3001       /* Also relocate the uplink to point into the new array.  */
3002       if (up && up->ref)
3003         {
3004           unsigned int id = DF_REF_ID (up->ref);
3005           if (up < &last_web_parts[last_def_id])
3006             {
3007               if (df->defs[id])
3008                 dest->uplink = &web_parts[DF_REF_ID (up->ref)];
3009             }
3010           else if (df->uses[id])
3011             dest->uplink = &web_parts[df->def_id + DF_REF_ID (up->ref)];
3012         }
3013     }
3014
3015   /* Also set up the def2web and use2web arrays, from the last pass.i
3016      Remember also the state of live_over_abnormal.  */
3017   for (i = 0; i < last_def_id; i++)
3018     {
3019       struct web *web = last_def2web[i];
3020       if (web)
3021         {
3022           web = find_web_for_subweb (web);
3023           if (web->type != FREE && web->type != PRECOLORED)
3024             def2web[i] = last_def2web[i];
3025         }
3026     }
3027   for (i = 0; i < last_use_id; i++)
3028     {
3029       struct web *web = last_use2web[i];
3030       if (web)
3031         {
3032           web = find_web_for_subweb (web);
3033           if (web->type != FREE && web->type != PRECOLORED)
3034             use2web[i] = last_use2web[i];
3035         }
3036       if (TEST_BIT (last_live_over_abnormal, i))
3037         SET_BIT (live_over_abnormal, i);
3038     }
3039
3040   /* We don't have any subwebs for now.  Somewhen we might want to
3041      remember them too, instead of recreating all of them every time.
3042      The problem is, that which subwebs we need, depends also on what
3043      other webs and subwebs exist, and which conflicts are there.
3044      OTOH it should be no problem, if we had some more subwebs than strictly
3045      needed.  Later.  */
3046   for (d = WEBS(FREE); d; d = d->next)
3047     {
3048       struct web *web = DLIST_WEB (d);
3049       struct web *wnext;
3050       for (web = web->subreg_next; web; web = wnext)
3051         {
3052           wnext = web->subreg_next;
3053           free (web);
3054         }
3055       DLIST_WEB (d)->subreg_next = NULL;
3056     }
3057
3058   /* The uses we anyway are going to check, are not yet live over an abnormal
3059      edge.  In fact, they might actually not anymore, due to added
3060      loads.  */
3061   if (last_check_uses)
3062     sbitmap_difference (live_over_abnormal, live_over_abnormal,
3063                         last_check_uses);
3064
3065   if (last_def_id || last_use_id)
3066     {
3067       sbitmap_free (last_live_over_abnormal);
3068       free (last_web_parts);
3069       free (last_def2web);
3070     }
3071   if (!last_max_uid)
3072     {
3073       /* Setup copy cache, for copy_insn_p ().  */
3074       copy_cache = xcalloc (get_max_uid (), sizeof (copy_cache[0]));
3075       init_bb_info ();
3076     }
3077   else
3078     {
3079       copy_cache = xrealloc (copy_cache, get_max_uid () * sizeof (copy_cache[0]));
3080       memset (&copy_cache[last_max_uid], 0,
3081               (get_max_uid () - last_max_uid) * sizeof (copy_cache[0]));
3082     }
3083 }
3084
3085 /* Free up/clear some memory, only needed for one pass.  */
3086
3087 void
3088 ra_build_free (void)
3089 {
3090   struct dlist *d;
3091   unsigned int i;
3092
3093   /* Clear the moves associated with a web (we also need to look into
3094      subwebs here).  */
3095   for (i = 0; i < num_webs; i++)
3096     {
3097       struct web *web = ID2WEB (i);
3098       gcc_assert (web);
3099       gcc_assert (i < num_webs - num_subwebs
3100                   || (!web->conflict_list && !web->orig_conflict_list));
3101       web->moves = NULL;
3102     }
3103   /* All webs in the free list have no defs or uses anymore.  */
3104   for (d = WEBS(FREE); d; d = d->next)
3105     {
3106       struct web *web = DLIST_WEB (d);
3107       if (web->defs)
3108         free (web->defs);
3109       web->defs = NULL;
3110       if (web->uses)
3111         free (web->uses);
3112       web->uses = NULL;
3113       /* We can't free the subwebs here, as they are referenced from
3114          def2web[], and possibly needed in the next ra_build_realloc().
3115          We free them there (or in free_all_mem()).  */
3116     }
3117
3118   /* Free all conflict bitmaps from web parts.  Note that we clear
3119      _all_ these conflicts, and don't rebuild them next time for uses
3120      which aren't rechecked.  This mean, that those conflict bitmaps
3121      only contain the incremental information.  The cumulative one
3122      is still contained in the edges of the I-graph, i.e. in
3123      conflict_list (or orig_conflict_list) of the webs.  */
3124   for (i = 0; i < df->def_id + df->use_id; i++)
3125     {
3126       struct tagged_conflict *cl;
3127       for (cl = web_parts[i].sub_conflicts; cl; cl = cl->next)
3128         BITMAP_XFREE (cl->conflicts);
3129       web_parts[i].sub_conflicts = NULL;
3130     }
3131
3132   wl_moves = NULL;
3133
3134   free (id2web);
3135   free (move_handled);
3136   sbitmap_free (sup_igraph);
3137   sbitmap_free (igraph);
3138 }
3139
3140 /* Free all memory for the interference graph structures.  */
3141
3142 void
3143 ra_build_free_all (struct df *df)
3144 {
3145   unsigned int i;
3146
3147   free_bb_info ();
3148   free (copy_cache);
3149   copy_cache = NULL;
3150   for (i = 0; i < df->def_id + df->use_id; i++)
3151     {
3152       struct tagged_conflict *cl;
3153       for (cl = web_parts[i].sub_conflicts; cl; cl = cl->next)
3154         BITMAP_XFREE (cl->conflicts);
3155       web_parts[i].sub_conflicts = NULL;
3156     }
3157   sbitmap_free (live_over_abnormal);
3158   free (web_parts);
3159   web_parts = NULL;
3160   if (last_check_uses)
3161     sbitmap_free (last_check_uses);
3162   last_check_uses = NULL;
3163   free (def2web);
3164   use2web = NULL;
3165   def2web = NULL;
3166 }
3167
3168 #include "gt-ra-build.h"
3169
3170 /*
3171 vim:cinoptions={.5s,g0,p5,t0,(0,^-0.5s,n-0.5s:tw=78:cindent:sw=4:
3172 */