OSDN Git Service

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