OSDN Git Service

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