* config/arm/bpabi.h (SUBTARGET_EXTRA_ASM_SPEC): Change meabi=3 to
[official-gcc.git] / gcc / ra-build.c
blobb66e0972c7d7ea9cc800664141d1afe59711e0f4
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>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under the
9 terms of the GNU General Public License as published by the Free Software
10 Foundation; either version 2, or (at your option) any later version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
15 details.
17 You should have received a copy of the GNU General Public License along
18 with GCC; see the file COPYING. If not, write to the Free Software
19 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21 #include "config.h"
22 #include "system.h"
23 #include "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"
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.
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.
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.
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.
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. */
69 struct curr_use;
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 *);
126 /* A sbitmap of DF_REF_IDs of uses, which are live over an abnormal
127 edge. */
128 static sbitmap live_over_abnormal;
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;
134 /* A sbitmap of UIDs of move insns, which we already analyzed. */
135 static sbitmap move_handled;
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
142 struct web_part *wp;
143 unsigned HOST_WIDE_INT undefined;
145 /* Indexed by UID. */
146 static struct visit_trace *visit_trace;
148 /* Per basic block we have one such structure, used to speed up
149 the backtracing of uses. */
150 struct ra_bb_info
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;
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)
179 /* For a REG or SUBREG expression X return the size/offset pair
180 as an integer. */
182 unsigned int
183 rtx_to_bits (rtx x)
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);
191 /* X is a REG or SUBREG rtx. Return the bytes it touches as a bitmask. */
193 static unsigned HOST_WIDE_INT
194 rtx_to_undefined (rtx x)
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;
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
209 int seen;
210 rtx source;
211 rtx target;
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;
218 int *number_seen;
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. */
224 static int
225 copy_insn_p (rtx insn, rtx *source, rtx *target)
227 rtx d, s;
228 unsigned int d_regno, s_regno;
229 int uid = INSN_UID (insn);
231 gcc_assert (INSN_P (insn));
233 /* First look, if we already saw this insn. */
234 if (copy_cache[uid].seen)
236 /* And if we saw it, if it's actually a copy insn. */
237 if (copy_cache[uid].seen == 1)
239 if (source)
240 *source = copy_cache[uid].source;
241 if (target)
242 *target = copy_cache[uid].target;
243 return 1;
245 return 0;
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);
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;
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);
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;
280 if (source)
281 *source = s;
282 if (target)
283 *target = d;
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;
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. */
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. */
303 static bitmap
304 find_sub_conflicts (struct web_part *wp, unsigned int size_word)
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;
314 /* Similar to find_sub_conflicts(), but creates that bitmap, if it
315 doesn't exist. I.e. this never returns NULL. */
317 static bitmap
318 get_sub_conflicts (struct web_part *wp, unsigned int size_word)
320 bitmap b = find_sub_conflicts (wp, size_word);
321 if (!b)
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;
330 return b;
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)}};
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.
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
373 static unsigned int
374 undef_to_size_word (rtx reg, unsigned HOST_WIDE_INT *undefined)
376 /* When only the lower four bits are possibly set, we use
377 a fast lookup table. */
378 if (*undefined <= 15)
380 struct undef_table_s u;
381 u = undef_table[*undefined];
382 *undefined = u.new_undef;
383 return u.size_word;
386 /* Otherwise we handle certain cases directly. */
387 if (*undefined <= 0xffff)
388 switch ((int) *undefined)
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);
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. */
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);
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. */
429 static bitmap
430 undef_to_bitmap (struct web_part *wp, unsigned HOST_WIDE_INT *undefined)
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);
437 /* Returns the root of the web part P is a member of. Additionally
438 it compresses the path. P may not be NULL. */
440 static struct web_part *
441 find_web_part_1 (struct web_part *p)
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)
449 p_next = p->uplink;
450 p->uplink = r;
452 return r;
455 /* Fast macro for the common case (WP either being the root itself, or
456 the end of an already compressed path. */
458 #define find_web_part(wp) ((! (wp)->uplink) ? (wp) \
459 : (! (wp)->uplink->uplink) ? (wp)->uplink : find_web_part_1 (wp))
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. */
466 static struct web_part *
467 union_web_part_roots (struct web_part *r1, struct web_part *r2)
469 if (r1 != r2)
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)
483 struct web_part *h = r1;
484 r1 = r2;
485 r2 = h;
487 r2->uplink = r1;
488 num_webs--;
490 /* Now we merge the dynamic information of R1 and R2. */
491 r1->spanned_deaths += r2->spanned_deaths;
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. */
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)
506 bitmap_operation (cl1->conflicts, cl1->conflicts,
507 cl2->conflicts, BITMAP_IOR);
508 BITMAP_XFREE (cl2->conflicts);
509 cl2->conflicts = NULL;
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;)
515 struct tagged_conflict *cl_next = cl2->next;
516 if (cl2->conflicts)
518 cl2->next = r1->sub_conflicts;
519 r1->sub_conflicts = cl2;
521 cl2 = cl_next;
524 r2->sub_conflicts = NULL;
525 r1->crosses_call |= r2->crosses_call;
527 return r1;
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)))
535 /* Remember that we've handled a given move, so we don't reprocess it. */
537 static void
538 remember_move (rtx insn)
540 if (!TEST_BIT (move_handled, INSN_UID (insn)))
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);
547 SET_BIT (move_handled, INSN_UID (insn));
548 ret = copy_insn_p (insn, &s, &d);
549 gcc_assert (ret);
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);
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))
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;
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;
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.
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. */
614 static int
615 defuse_overlap_p_1 (rtx def, struct curr_use *use)
617 int mode = 0;
618 if (def == use->x)
619 return 1;
620 if (!def)
621 return 0;
622 if (GET_CODE (def) == SUBREG)
624 if (REGNO (SUBREG_REG (def)) != use->regno)
625 return 0;
626 mode |= 1;
628 else if (REGNO (def) != use->regno)
629 return 0;
630 if (GET_CODE (use->x) == SUBREG)
631 mode |= 2;
632 switch (mode)
634 case 0: /* REG, REG */
635 return 1;
636 case 1: /* SUBREG, REG */
638 unsigned HOST_WIDE_INT old_u = use->undefined;
639 use->undefined &= ~ rtx_to_undefined (def);
640 return (old_u != use->undefined) ? 2 : -1;
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).
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;
671 default:
672 gcc_unreachable ();
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)))
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. */
691 static int
692 live_out_1 (struct df *df ATTRIBUTE_UNUSED, struct curr_use *use, rtx insn)
694 int defined = 0;
695 int uid = INSN_UID (insn);
696 struct web_part *wp = use->wp;
698 /* Mark, that this insn needs this webpart live. */
699 visit_trace[uid].wp = wp;
700 visit_trace[uid].undefined = use->undefined;
702 if (INSN_P (insn))
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;
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);
719 /* Look at all DEFS in this insn. */
720 for (n = 0; n < num_defs; n++)
722 struct ref *ref = defs[n];
723 int lap;
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)
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. */
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;
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. */
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. */
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)]);
776 else
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;
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. */
795 undef &= ~ rtx_to_undefined (s);
797 if (undef)
799 /*struct web_part *cwp;
800 cwp = find_web_part (&web_parts[DF_REF_ID
801 (ref)]);*/
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. */
812 bitmap_set_bit (undef_to_bitmap (wp, &undef),
813 DF_REF_ID (ref));
814 while (undef);
818 if (defined)
819 use->undefined = 0;
820 else
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;
831 return !defined;
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). */
842 static inline int
843 live_out (struct df *df, struct curr_use *use, rtx insn)
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)
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;
854 else
855 return live_out_1 (df, use, insn);
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.
867 This also determines the effects of abnormal edges, and remembers
868 which uses are live at the end of that basic block. */
870 static rtx
871 live_in_edge (struct df *df, struct curr_use *use, edge e)
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);
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))
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)
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);
903 return next_insn;
905 else
906 return NULL_RTX;
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. */
916 static void
917 live_in (struct df *df, struct curr_use *use, rtx insn)
919 unsigned int loc_vpass = visited_pass;
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)
927 unsigned int i;
928 int uid = INSN_UID (insn);
929 basic_block bb = BLOCK_FOR_INSN (insn);
930 number_seen[uid]++;
932 /* We want to be as fast as possible, so explicitly write
933 this loop. */
934 for (insn = PREV_INSN (insn); insn && !INSN_P (insn);
935 insn = PREV_INSN (insn))
937 if (!insn)
938 return;
939 if (bb != BLOCK_FOR_INSN (insn))
941 edge e;
942 unsigned HOST_WIDE_INT undef = use->undefined;
943 struct ra_bb_info *info = (struct ra_bb_info *) bb->aux;
944 if (EDGE_COUNT (bb->preds) == 0)
945 return;
946 /* We now check, if we already traversed the predecessors of this
947 block for the current pass and the current set of undefined
948 bits. If yes, we don't need to check the predecessors again.
949 So, conceptually this information is tagged to the first
950 insn of a basic block. */
951 if (info->pass == loc_vpass && (undef & ~info->undefined) == 0)
952 return;
953 info->pass = loc_vpass;
954 info->undefined = undef;
955 /* All but the last predecessor are handled recursively. */
956 for (e = NULL, i = 0; i < EDGE_COUNT (bb->preds) - 1; i++)
958 e = EDGE_PRED (bb, i);
959 insn = live_in_edge (df, use, e);
960 if (insn)
961 live_in (df, use, insn);
962 use->undefined = undef;
964 insn = live_in_edge (df, use, e);
965 if (!insn)
966 return;
968 else if (!live_out (df, use, insn))
969 return;
973 /* Determine all regnos which are mentioned in a basic block, in an
974 interesting way. Interesting here means either in a def, or as the
975 source of a move insn. We only look at insns added since the last
976 pass. */
978 static void
979 update_regnos_mentioned (void)
981 int last_uid = last_max_uid;
982 rtx insn;
983 basic_block bb;
984 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
985 if (INSN_P (insn))
987 /* Don't look at old insns. */
988 if (INSN_UID (insn) < last_uid)
990 /* XXX We should also remember moves over iterations (we already
991 save the cache, but not the movelist). */
992 if (copy_insn_p (insn, NULL, NULL))
993 remember_move (insn);
995 else if ((bb = BLOCK_FOR_INSN (insn)) != NULL)
997 rtx source;
998 struct ra_bb_info *info = (struct ra_bb_info *) bb->aux;
999 bitmap mentioned = info->regnos_mentioned;
1000 struct df_link *link;
1001 if (copy_insn_p (insn, &source, NULL))
1003 remember_move (insn);
1004 bitmap_set_bit (mentioned,
1005 REGNO (GET_CODE (source) == SUBREG
1006 ? SUBREG_REG (source) : source));
1008 for (link = DF_INSN_DEFS (df, insn); link; link = link->next)
1009 if (link->ref)
1010 bitmap_set_bit (mentioned, DF_REF_REGNO (link->ref));
1015 /* Handle the uses which reach a block end, but were deferred due
1016 to it's regno not being mentioned in that block. This adds the
1017 remaining conflicts and updates also the crosses_call and
1018 spanned_deaths members. */
1020 static void
1021 livethrough_conflicts_bb (basic_block bb)
1023 struct ra_bb_info *info = (struct ra_bb_info *) bb->aux;
1024 rtx insn;
1025 bitmap all_defs;
1026 int first, use_id;
1027 unsigned int deaths = 0;
1028 unsigned int contains_call = 0;
1030 /* If there are no deferred uses, just return. */
1031 if ((first = bitmap_first_set_bit (info->live_throughout)) < 0)
1032 return;
1034 /* First collect the IDs of all defs, count the number of death
1035 containing insns, and if there's some call_insn here. */
1036 all_defs = BITMAP_XMALLOC ();
1037 for (insn = BB_HEAD (bb); insn; insn = NEXT_INSN (insn))
1039 if (INSN_P (insn))
1041 unsigned int n;
1042 struct ra_insn_info info;
1044 info = insn_df[INSN_UID (insn)];
1045 for (n = 0; n < info.num_defs; n++)
1046 bitmap_set_bit (all_defs, DF_REF_ID (info.defs[n]));
1047 if (TEST_BIT (insns_with_deaths, INSN_UID (insn)))
1048 deaths++;
1049 if (CALL_P (insn))
1050 contains_call = 1;
1052 if (insn == BB_END (bb))
1053 break;
1056 /* And now, if we have found anything, make all live_through
1057 uses conflict with all defs, and update their other members. */
1058 if (deaths > 0
1059 || contains_call
1060 || bitmap_first_set_bit (all_defs) >= 0)
1062 bitmap_iterator bi;
1064 EXECUTE_IF_SET_IN_BITMAP (info->live_throughout, first, use_id, bi)
1066 struct web_part *wp = &web_parts[df->def_id + use_id];
1067 unsigned int bl = rtx_to_bits (DF_REF_REG (wp->ref));
1068 bitmap conflicts;
1069 wp = find_web_part (wp);
1070 wp->spanned_deaths += deaths;
1071 wp->crosses_call |= contains_call;
1072 conflicts = get_sub_conflicts (wp, bl);
1073 bitmap_operation (conflicts, conflicts, all_defs, BITMAP_IOR);
1077 BITMAP_XFREE (all_defs);
1080 /* Allocate the per basic block info for traversing the insn stream for
1081 building live ranges. */
1083 static void
1084 init_bb_info (void)
1086 basic_block bb;
1087 FOR_ALL_BB (bb)
1089 struct ra_bb_info *info = xcalloc (1, sizeof *info);
1090 info->regnos_mentioned = BITMAP_XMALLOC ();
1091 info->live_throughout = BITMAP_XMALLOC ();
1092 info->old_aux = bb->aux;
1093 bb->aux = (void *) info;
1097 /* Free that per basic block info. */
1099 static void
1100 free_bb_info (void)
1102 basic_block bb;
1103 FOR_ALL_BB (bb)
1105 struct ra_bb_info *info = (struct ra_bb_info *) bb->aux;
1106 BITMAP_XFREE (info->regnos_mentioned);
1107 BITMAP_XFREE (info->live_throughout);
1108 bb->aux = info->old_aux;
1109 free (info);
1113 /* Toplevel function for the first part of this file.
1114 Connect web parts, thereby implicitly building webs, and remember
1115 their conflicts. */
1117 static void
1118 build_web_parts_and_conflicts (struct df *df)
1120 struct df_link *link;
1121 struct curr_use use;
1122 basic_block bb;
1124 number_seen = xcalloc (get_max_uid (), sizeof (int));
1125 visit_trace = xcalloc (get_max_uid (), sizeof (visit_trace[0]));
1126 update_regnos_mentioned ();
1128 /* Here's the main loop.
1129 It goes through all insn's, connects web parts along the way, notes
1130 conflicts between webparts, and remembers move instructions. */
1131 visited_pass = 0;
1132 for (use.regno = 0; use.regno < (unsigned int)max_regno; use.regno++)
1133 if (use.regno >= FIRST_PSEUDO_REGISTER || !fixed_regs[use.regno])
1134 for (link = df->regs[use.regno].uses; link; link = link->next)
1135 if (link->ref)
1137 struct ref *ref = link->ref;
1138 rtx insn = DF_REF_INSN (ref);
1139 /* Only recheck marked or new uses, or uses from hardregs. */
1140 if (use.regno >= FIRST_PSEUDO_REGISTER
1141 && DF_REF_ID (ref) < last_use_id
1142 && !TEST_BIT (last_check_uses, DF_REF_ID (ref)))
1143 continue;
1144 use.wp = &web_parts[df->def_id + DF_REF_ID (ref)];
1145 use.x = DF_REF_REG (ref);
1146 use.live_over_abnormal = 0;
1147 use.undefined = rtx_to_undefined (use.x);
1148 visited_pass++;
1149 live_in (df, &use, insn);
1150 if (use.live_over_abnormal)
1151 SET_BIT (live_over_abnormal, DF_REF_ID (ref));
1154 dump_number_seen ();
1155 FOR_ALL_BB (bb)
1157 struct ra_bb_info *info = (struct ra_bb_info *) bb->aux;
1158 livethrough_conflicts_bb (bb);
1159 bitmap_zero (info->live_throughout);
1160 info->pass = 0;
1162 free (visit_trace);
1163 free (number_seen);
1166 /* Here we look per insn, for DF references being in uses _and_ defs.
1167 This means, in the RTL a (REG xx) expression was seen as a
1168 read/modify/write, as happens for (set (subreg:SI (reg:DI xx)) (...))
1169 e.g. Our code has created two webs for this, as it should. Unfortunately,
1170 as the REG reference is only one time in the RTL we can't color
1171 both webs different (arguably this also would be wrong for a real
1172 read-mod-write instruction), so we must reconnect such webs. */
1174 static void
1175 connect_rmw_web_parts (struct df *df)
1177 unsigned int i;
1179 for (i = 0; i < df->use_id; i++)
1181 struct web_part *wp1 = &web_parts[df->def_id + i];
1182 rtx reg;
1183 struct df_link *link;
1184 if (!wp1->ref)
1185 continue;
1186 /* If it's an uninitialized web, we don't want to connect it to others,
1187 as the read cycle in read-mod-write had probably no effect. */
1188 if (find_web_part (wp1) >= &web_parts[df->def_id])
1189 continue;
1190 reg = DF_REF_REAL_REG (wp1->ref);
1191 link = DF_INSN_DEFS (df, DF_REF_INSN (wp1->ref));
1192 for (; link; link = link->next)
1193 if (reg == DF_REF_REAL_REG (link->ref))
1195 struct web_part *wp2 = &web_parts[DF_REF_ID (link->ref)];
1196 union_web_parts (wp1, wp2);
1201 /* Deletes all hardregs from *S which are not allowed for MODE. */
1203 static void
1204 prune_hardregs_for_mode (HARD_REG_SET *s, enum machine_mode mode)
1206 AND_HARD_REG_SET (*s, hardregs_for_mode[(int) mode]);
1209 /* Initialize the members of a web, which are deducible from REG. */
1211 static void
1212 init_one_web_common (struct web *web, rtx reg)
1214 gcc_assert (REG_P (reg));
1215 /* web->id isn't initialized here. */
1216 web->regno = REGNO (reg);
1217 web->orig_x = reg;
1218 if (!web->dlink)
1220 web->dlink = ra_calloc (sizeof (struct dlist));
1221 DLIST_WEB (web->dlink) = web;
1223 /* XXX
1224 the former (superunion) doesn't constrain the graph enough. E.g.
1225 on x86 QImode _requires_ QI_REGS, but as alternate class usually
1226 GENERAL_REGS is given. So the graph is not constrained enough,
1227 thinking it has more freedom then it really has, which leads
1228 to repeated spill tryings. OTOH the latter (only using preferred
1229 class) is too constrained, as normally (e.g. with all SImode
1230 pseudos), they can be allocated also in the alternate class.
1231 What we really want, are the _exact_ hard regs allowed, not
1232 just a class. Later. */
1233 /*web->regclass = reg_class_superunion
1234 [reg_preferred_class (web->regno)]
1235 [reg_alternate_class (web->regno)];*/
1236 /*web->regclass = reg_preferred_class (web->regno);*/
1237 web->regclass = reg_class_subunion
1238 [reg_preferred_class (web->regno)] [reg_alternate_class (web->regno)];
1239 web->regclass = reg_preferred_class (web->regno);
1240 if (web->regno < FIRST_PSEUDO_REGISTER)
1242 web->color = web->regno;
1243 put_web (web, PRECOLORED);
1244 web->num_conflicts = UINT_MAX;
1245 web->add_hardregs = 0;
1246 CLEAR_HARD_REG_SET (web->usable_regs);
1247 SET_HARD_REG_BIT (web->usable_regs, web->regno);
1248 web->num_freedom = 1;
1250 else
1252 HARD_REG_SET alternate;
1253 web->color = -1;
1254 put_web (web, INITIAL);
1255 /* add_hardregs is wrong in multi-length classes, e.g.
1256 using a DFmode pseudo on x86 can result in class FLOAT_INT_REGS,
1257 where, if it finally is allocated to GENERAL_REGS it needs two,
1258 if allocated to FLOAT_REGS only one hardreg. XXX */
1259 web->add_hardregs =
1260 CLASS_MAX_NREGS (web->regclass, PSEUDO_REGNO_MODE (web->regno)) - 1;
1261 web->num_conflicts = 0 * web->add_hardregs;
1262 COPY_HARD_REG_SET (web->usable_regs,
1263 reg_class_contents[reg_preferred_class (web->regno)]);
1264 COPY_HARD_REG_SET (alternate,
1265 reg_class_contents[reg_alternate_class (web->regno)]);
1266 IOR_HARD_REG_SET (web->usable_regs, alternate);
1267 /*IOR_HARD_REG_SET (web->usable_regs,
1268 reg_class_contents[reg_alternate_class
1269 (web->regno)]);*/
1270 AND_COMPL_HARD_REG_SET (web->usable_regs, never_use_colors);
1271 prune_hardregs_for_mode (&web->usable_regs,
1272 PSEUDO_REGNO_MODE (web->regno));
1273 #ifdef CANNOT_CHANGE_MODE_CLASS
1274 if (web->mode_changed)
1275 AND_COMPL_HARD_REG_SET (web->usable_regs, invalid_mode_change_regs);
1276 #endif
1277 web->num_freedom = hard_regs_count (web->usable_regs);
1278 web->num_freedom -= web->add_hardregs;
1279 gcc_assert (web->num_freedom);
1281 COPY_HARD_REG_SET (web->orig_usable_regs, web->usable_regs);
1284 /* Initializes WEBs members from REG or zero them. */
1286 static void
1287 init_one_web (struct web *web, rtx reg)
1289 memset (web, 0, sizeof (struct web));
1290 init_one_web_common (web, reg);
1291 web->useless_conflicts = BITMAP_XMALLOC ();
1294 /* WEB is an old web, meaning it came from the last pass, and got a
1295 color. We want to remember some of it's info, so zero only some
1296 members. */
1298 static void
1299 reinit_one_web (struct web *web, rtx reg)
1301 web->old_color = web->color + 1;
1302 init_one_web_common (web, reg);
1303 web->span_deaths = 0;
1304 web->spill_temp = 0;
1305 web->orig_spill_temp = 0;
1306 web->use_my_regs = 0;
1307 web->spill_cost = 0;
1308 web->was_spilled = 0;
1309 web->is_coalesced = 0;
1310 web->artificial = 0;
1311 web->live_over_abnormal = 0;
1312 web->mode_changed = 0;
1313 web->subreg_stripped = 0;
1314 web->move_related = 0;
1315 web->in_load = 0;
1316 web->target_of_spilled_move = 0;
1317 web->num_aliased = 0;
1318 if (web->type == PRECOLORED)
1320 web->num_defs = 0;
1321 web->num_uses = 0;
1322 web->orig_spill_cost = 0;
1324 CLEAR_HARD_REG_SET (web->bias_colors);
1325 CLEAR_HARD_REG_SET (web->prefer_colors);
1326 web->reg_rtx = NULL;
1327 web->stack_slot = NULL;
1328 web->pattern = NULL;
1329 web->alias = NULL;
1330 gcc_assert (!web->moves);
1331 gcc_assert (web->useless_conflicts);
1334 /* Insert and returns a subweb corresponding to REG into WEB (which
1335 becomes its super web). It must not exist already. */
1337 static struct web *
1338 add_subweb (struct web *web, rtx reg)
1340 struct web *w;
1341 gcc_assert (GET_CODE (reg) == SUBREG);
1342 w = xmalloc (sizeof (struct web));
1343 /* Copy most content from parent-web. */
1344 *w = *web;
1345 /* And initialize the private stuff. */
1346 w->orig_x = reg;
1347 w->add_hardregs = CLASS_MAX_NREGS (web->regclass, GET_MODE (reg)) - 1;
1348 w->num_conflicts = 0 * w->add_hardregs;
1349 w->num_defs = 0;
1350 w->num_uses = 0;
1351 w->dlink = NULL;
1352 w->parent_web = web;
1353 w->subreg_next = web->subreg_next;
1354 web->subreg_next = w;
1355 return w;
1358 /* Similar to add_subweb(), but instead of relying on a given SUBREG,
1359 we have just a size and an offset of the subpart of the REG rtx.
1360 In difference to add_subweb() this marks the new subweb as artificial. */
1362 static struct web *
1363 add_subweb_2 (struct web *web, unsigned int size_word)
1365 /* To get a correct mode for the to be produced subreg, we don't want to
1366 simply do a mode_for_size() for the mode_class of the whole web.
1367 Suppose we deal with a CDImode web, but search for a 8 byte part.
1368 Now mode_for_size() would only search in the class MODE_COMPLEX_INT
1369 and would find CSImode which probably is not what we want. Instead
1370 we want DImode, which is in a completely other class. For this to work
1371 we instead first search the already existing subwebs, and take
1372 _their_ modeclasses as base for a search for ourself. */
1373 rtx ref_rtx = (web->subreg_next ? web->subreg_next : web)->orig_x;
1374 unsigned int size = BYTE_LENGTH (size_word) * BITS_PER_UNIT;
1375 enum machine_mode mode;
1376 mode = mode_for_size (size, GET_MODE_CLASS (GET_MODE (ref_rtx)), 0);
1377 if (mode == BLKmode)
1378 mode = mode_for_size (size, MODE_INT, 0);
1379 gcc_assert (mode != BLKmode);
1380 web = add_subweb (web, gen_rtx_SUBREG (mode, web->orig_x,
1381 BYTE_BEGIN (size_word)));
1382 web->artificial = 1;
1383 return web;
1386 /* Initialize all the web parts we are going to need. */
1388 static void
1389 init_web_parts (struct df *df)
1391 int regno;
1392 unsigned int no;
1393 num_webs = 0;
1394 for (no = 0; no < df->def_id; no++)
1396 if (df->defs[no])
1398 gcc_assert (no >= last_def_id || web_parts[no].ref == df->defs[no]);
1399 web_parts[no].ref = df->defs[no];
1400 /* Uplink might be set from the last iteration. */
1401 if (!web_parts[no].uplink)
1402 num_webs++;
1404 else
1405 /* The last iteration might have left .ref set, while df_analyze()
1406 removed that ref (due to a removed copy insn) from the df->defs[]
1407 array. As we don't check for that in realloc_web_parts()
1408 we do that here. */
1409 web_parts[no].ref = NULL;
1411 for (no = 0; no < df->use_id; no++)
1413 if (df->uses[no])
1415 gcc_assert (no >= last_use_id
1416 || web_parts[no + df->def_id].ref == df->uses[no]);
1417 web_parts[no + df->def_id].ref = df->uses[no];
1418 if (!web_parts[no + df->def_id].uplink)
1419 num_webs++;
1421 else
1422 web_parts[no + df->def_id].ref = NULL;
1425 /* We want to have only one web for each precolored register. */
1426 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1428 struct web_part *r1 = NULL;
1429 struct df_link *link;
1430 /* Here once was a test, if there is any DEF at all, and only then to
1431 merge all the parts. This was incorrect, we really also want to have
1432 only one web-part for hardregs, even if there is no explicit DEF. */
1433 /* Link together all defs... */
1434 for (link = df->regs[regno].defs; link; link = link->next)
1435 if (link->ref)
1437 struct web_part *r2 = &web_parts[DF_REF_ID (link->ref)];
1438 if (!r1)
1439 r1 = r2;
1440 else
1441 r1 = union_web_parts (r1, r2);
1443 /* ... and all uses. */
1444 for (link = df->regs[regno].uses; link; link = link->next)
1445 if (link->ref)
1447 struct web_part *r2 = &web_parts[df->def_id
1448 + DF_REF_ID (link->ref)];
1449 if (!r1)
1450 r1 = r2;
1451 else
1452 r1 = union_web_parts (r1, r2);
1457 /* In case we want to remember the conflict list of a WEB, before adding
1458 new conflicts, we copy it here to orig_conflict_list. */
1460 static void
1461 copy_conflict_list (struct web *web)
1463 struct conflict_link *cl;
1464 gcc_assert (!web->orig_conflict_list);
1465 gcc_assert (!web->have_orig_conflicts);
1466 web->have_orig_conflicts = 1;
1467 for (cl = web->conflict_list; cl; cl = cl->next)
1469 struct conflict_link *ncl;
1470 ncl = ra_alloc (sizeof *ncl);
1471 ncl->t = cl->t;
1472 ncl->sub = NULL;
1473 ncl->next = web->orig_conflict_list;
1474 web->orig_conflict_list = ncl;
1475 if (cl->sub)
1477 struct sub_conflict *sl, *nsl;
1478 for (sl = cl->sub; sl; sl = sl->next)
1480 nsl = ra_alloc (sizeof *nsl);
1481 nsl->s = sl->s;
1482 nsl->t = sl->t;
1483 nsl->next = ncl->sub;
1484 ncl->sub = nsl;
1490 /* Possibly add an edge from web FROM to TO marking a conflict between
1491 those two. This is one half of marking a complete conflict, which notes
1492 in FROM, that TO is a conflict. Adding TO to FROM's conflicts might
1493 make other conflicts superfluous, because the current TO overlaps some web
1494 already being in conflict with FROM. In this case the smaller webs are
1495 deleted from the conflict list. Likewise if TO is overlapped by a web
1496 already in the list, it isn't added at all. Note, that this can only
1497 happen, if SUBREG webs are involved. */
1499 static void
1500 add_conflict_edge (struct web *from, struct web *to)
1502 if (from->type != PRECOLORED)
1504 struct web *pfrom = find_web_for_subweb (from);
1505 struct web *pto = find_web_for_subweb (to);
1506 struct sub_conflict *sl;
1507 struct conflict_link *cl = pfrom->conflict_list;
1508 int may_delete = 1;
1510 /* This can happen when subwebs of one web conflict with each
1511 other. In live_out_1() we created such conflicts between yet
1512 undefined webparts and defs of parts which didn't overlap with the
1513 undefined bits. Then later they nevertheless could have merged into
1514 one web, and then we land here. */
1515 if (pfrom == pto)
1516 return;
1517 if (remember_conflicts && !pfrom->have_orig_conflicts)
1518 copy_conflict_list (pfrom);
1519 if (!TEST_BIT (sup_igraph, (pfrom->id * num_webs + pto->id)))
1521 cl = ra_alloc (sizeof (*cl));
1522 cl->t = pto;
1523 cl->sub = NULL;
1524 cl->next = pfrom->conflict_list;
1525 pfrom->conflict_list = cl;
1526 if (pto->type != SELECT && pto->type != COALESCED)
1527 pfrom->num_conflicts += 1 + pto->add_hardregs;
1528 SET_BIT (sup_igraph, (pfrom->id * num_webs + pto->id));
1529 may_delete = 0;
1531 else
1532 /* We don't need to test for cl==NULL, because at this point
1533 a cl with cl->t==pto is guaranteed to exist. */
1534 while (cl->t != pto)
1535 cl = cl->next;
1536 if (pfrom != from || pto != to)
1538 /* This is a subconflict which should be added.
1539 If we inserted cl in this invocation, we really need to add this
1540 subconflict. If we did _not_ add it here, we only add the
1541 subconflict, if cl already had subconflicts, because otherwise
1542 this indicated, that the whole webs already conflict, which
1543 means we are not interested in this subconflict. */
1544 if (!may_delete || cl->sub != NULL)
1546 sl = ra_alloc (sizeof (*sl));
1547 sl->s = from;
1548 sl->t = to;
1549 sl->next = cl->sub;
1550 cl->sub = sl;
1553 else
1554 /* pfrom == from && pto == to means, that we are not interested
1555 anymore in the subconflict list for this pair, because anyway
1556 the whole webs conflict. */
1557 cl->sub = NULL;
1561 /* Record a conflict between two webs, if we haven't recorded it
1562 already. */
1564 void
1565 record_conflict (struct web *web1, struct web *web2)
1567 unsigned int id1 = web1->id, id2 = web2->id;
1568 unsigned int index = igraph_index (id1, id2);
1569 /* Trivial non-conflict or already recorded conflict. */
1570 if (web1 == web2 || TEST_BIT (igraph, index))
1571 return;
1572 gcc_assert (id1 != id2);
1573 /* As fixed_regs are no targets for allocation, conflicts with them
1574 are pointless. */
1575 if ((web1->regno < FIRST_PSEUDO_REGISTER && fixed_regs[web1->regno])
1576 || (web2->regno < FIRST_PSEUDO_REGISTER && fixed_regs[web2->regno]))
1577 return;
1578 /* Conflicts with hardregs, which are not even a candidate
1579 for this pseudo are also pointless. */
1580 if ((web1->type == PRECOLORED
1581 && ! TEST_HARD_REG_BIT (web2->usable_regs, web1->regno))
1582 || (web2->type == PRECOLORED
1583 && ! TEST_HARD_REG_BIT (web1->usable_regs, web2->regno)))
1584 return;
1585 /* Similar if the set of possible hardregs don't intersect. This iteration
1586 those conflicts are useless (and would make num_conflicts wrong, because
1587 num_freedom is calculated from the set of possible hardregs).
1588 But in presence of spilling and incremental building of the graph we
1589 need to note all uses of webs conflicting with the spilled ones.
1590 Because the set of possible hardregs can change in the next round for
1591 spilled webs, we possibly have then conflicts with webs which would
1592 be excluded now (because then hardregs intersect). But we actually
1593 need to check those uses, and to get hold of them, we need to remember
1594 also webs conflicting with this one, although not conflicting in this
1595 round because of non-intersecting hardregs. */
1596 if (web1->type != PRECOLORED && web2->type != PRECOLORED
1597 && ! hard_regs_intersect_p (&web1->usable_regs, &web2->usable_regs))
1599 struct web *p1 = find_web_for_subweb (web1);
1600 struct web *p2 = find_web_for_subweb (web2);
1601 /* We expect these to be rare enough to justify bitmaps. And because
1602 we have only a special use for it, we note only the superwebs. */
1603 bitmap_set_bit (p1->useless_conflicts, p2->id);
1604 bitmap_set_bit (p2->useless_conflicts, p1->id);
1605 return;
1607 SET_BIT (igraph, index);
1608 add_conflict_edge (web1, web2);
1609 add_conflict_edge (web2, web1);
1612 /* For each web W this produces the missing subwebs Wx, such that it's
1613 possible to exactly specify (W-Wy) for all already existing subwebs Wy. */
1615 static void
1616 build_inverse_webs (struct web *web)
1618 struct web *sweb = web->subreg_next;
1619 unsigned HOST_WIDE_INT undef;
1621 undef = rtx_to_undefined (web->orig_x);
1622 for (; sweb; sweb = sweb->subreg_next)
1623 /* Only create inverses of non-artificial webs. */
1624 if (!sweb->artificial)
1626 unsigned HOST_WIDE_INT bits;
1627 bits = undef & ~ rtx_to_undefined (sweb->orig_x);
1628 while (bits)
1630 unsigned int size_word = undef_to_size_word (web->orig_x, &bits);
1631 if (!find_subweb_2 (web, size_word))
1632 add_subweb_2 (web, size_word);
1637 /* Copies the content of WEB to a new one, and link it into WL.
1638 Used for consistency checking. */
1640 static void
1641 copy_web (struct web *web, struct web_link **wl)
1643 struct web *cweb = xmalloc (sizeof *cweb);
1644 struct web_link *link = ra_alloc (sizeof *link);
1645 link->next = *wl;
1646 *wl = link;
1647 link->web = cweb;
1648 *cweb = *web;
1651 /* Given a list of webs LINK, compare the content of the webs therein
1652 with the global webs of the same ID. For consistency checking. */
1654 static void
1655 compare_and_free_webs (struct web_link **link)
1657 struct web_link *wl;
1658 for (wl = *link; wl; wl = wl->next)
1660 struct web *web1 = wl->web;
1661 struct web *web2 = ID2WEB (web1->id);
1662 gcc_assert (web1->regno == web2->regno);
1663 gcc_assert (web1->mode_changed == web2->mode_changed);
1664 gcc_assert (rtx_equal_p (web1->orig_x, web2->orig_x));
1665 gcc_assert (web1->type == web2->type);
1666 if (web1->type != PRECOLORED)
1668 unsigned int i;
1670 /* Only compare num_defs/num_uses with non-hardreg webs.
1671 E.g. the number of uses of the framepointer changes due to
1672 inserting spill code. */
1673 gcc_assert (web1->num_uses == web2->num_uses);
1674 gcc_assert (web1->num_defs == web2->num_defs);
1675 /* Similarly, if the framepointer was unreferenced originally
1676 but we added spills, these fields may not match. */
1677 gcc_assert (web1->crosses_call == web2->crosses_call);
1678 gcc_assert (web1->live_over_abnormal == web2->live_over_abnormal);
1679 for (i = 0; i < web1->num_defs; i++)
1680 gcc_assert (web1->defs[i] == web2->defs[i]);
1681 for (i = 0; i < web1->num_uses; i++)
1682 gcc_assert (web1->uses[i] == web2->uses[i]);
1684 if (web1->type == PRECOLORED)
1686 if (web1->defs)
1687 free (web1->defs);
1688 if (web1->uses)
1689 free (web1->uses);
1691 free (web1);
1693 *link = NULL;
1696 /* Setup and fill uses[] and defs[] arrays of the webs. */
1698 static void
1699 init_webs_defs_uses (void)
1701 struct dlist *d;
1702 for (d = WEBS(INITIAL); d; d = d->next)
1704 struct web *web = DLIST_WEB (d);
1705 unsigned int def_i, use_i;
1706 struct df_link *link;
1707 if (web->old_web)
1708 continue;
1709 if (web->type == PRECOLORED)
1711 web->num_defs = web->num_uses = 0;
1712 continue;
1714 if (web->num_defs)
1715 web->defs = xmalloc (web->num_defs * sizeof (web->defs[0]));
1716 if (web->num_uses)
1717 web->uses = xmalloc (web->num_uses * sizeof (web->uses[0]));
1718 def_i = use_i = 0;
1719 for (link = web->temp_refs; link; link = link->next)
1721 if (DF_REF_REG_DEF_P (link->ref))
1722 web->defs[def_i++] = link->ref;
1723 else
1724 web->uses[use_i++] = link->ref;
1726 web->temp_refs = NULL;
1727 gcc_assert (def_i == web->num_defs);
1728 gcc_assert (use_i == web->num_uses);
1732 /* Called by parts_to_webs(). This creates (or recreates) the webs (and
1733 subwebs) from web parts, gives them IDs (only to super webs), and sets
1734 up use2web and def2web arrays. */
1736 static unsigned int
1737 parts_to_webs_1 (struct df *df, struct web_link **copy_webs,
1738 struct df_link *all_refs)
1740 unsigned int i;
1741 unsigned int webnum;
1742 unsigned int def_id = df->def_id;
1743 unsigned int use_id = df->use_id;
1744 struct web_part *wp_first_use = &web_parts[def_id];
1746 /* For each root web part: create and initialize a new web,
1747 setup def2web[] and use2web[] for all defs and uses, and
1748 id2web for all new webs. */
1750 webnum = 0;
1751 for (i = 0; i < def_id + use_id; i++)
1753 struct web *subweb, *web = 0; /* Initialize web to silence warnings. */
1754 struct web_part *wp = &web_parts[i];
1755 struct ref *ref = wp->ref;
1756 unsigned int ref_id;
1757 rtx reg;
1758 if (!ref)
1759 continue;
1760 ref_id = i;
1761 if (i >= def_id)
1762 ref_id -= def_id;
1763 all_refs[i].ref = ref;
1764 reg = DF_REF_REG (ref);
1765 if (! wp->uplink)
1767 /* If we have a web part root, create a new web. */
1768 unsigned int newid = ~(unsigned)0;
1769 unsigned int old_web = 0;
1771 /* In the first pass, there are no old webs, so unconditionally
1772 allocate a new one. */
1773 if (ra_pass == 1)
1775 web = xmalloc (sizeof (struct web));
1776 newid = last_num_webs++;
1777 init_one_web (web, GET_CODE (reg) == SUBREG
1778 ? SUBREG_REG (reg) : reg);
1780 /* Otherwise, we look for an old web. */
1781 else
1783 /* Remember, that use2web == def2web + def_id.
1784 Ergo is def2web[i] == use2web[i - def_id] for i >= def_id.
1785 So we only need to look into def2web[] array.
1786 Try to look at the web, which formerly belonged to this
1787 def (or use). */
1788 web = def2web[i];
1789 /* Or which belonged to this hardreg. */
1790 if (!web && DF_REF_REGNO (ref) < FIRST_PSEUDO_REGISTER)
1791 web = hardreg2web[DF_REF_REGNO (ref)];
1792 if (web)
1794 /* If we found one, reuse it. */
1795 web = find_web_for_subweb (web);
1796 remove_list (web->dlink, &WEBS(INITIAL));
1797 old_web = 1;
1798 copy_web (web, copy_webs);
1800 else
1802 /* Otherwise use a new one. First from the free list. */
1803 if (WEBS(FREE))
1804 web = DLIST_WEB (pop_list (&WEBS(FREE)));
1805 else
1807 /* Else allocate a new one. */
1808 web = xmalloc (sizeof (struct web));
1809 newid = last_num_webs++;
1812 /* The id is zeroed in init_one_web(). */
1813 if (newid == ~(unsigned)0)
1814 newid = web->id;
1815 if (old_web)
1816 reinit_one_web (web, GET_CODE (reg) == SUBREG
1817 ? SUBREG_REG (reg) : reg);
1818 else
1819 init_one_web (web, GET_CODE (reg) == SUBREG
1820 ? SUBREG_REG (reg) : reg);
1821 web->old_web = (old_web && web->type != PRECOLORED) ? 1 : 0;
1823 web->span_deaths = wp->spanned_deaths;
1824 web->crosses_call = wp->crosses_call;
1825 web->id = newid;
1826 web->temp_refs = NULL;
1827 webnum++;
1828 if (web->regno < FIRST_PSEUDO_REGISTER)
1830 if (!hardreg2web[web->regno])
1831 hardreg2web[web->regno] = web;
1832 else
1833 gcc_assert (hardreg2web[web->regno] == web);
1837 /* If this reference already had a web assigned, we are done.
1838 This test better is equivalent to the web being an old web.
1839 Otherwise something is screwed. (This is tested) */
1840 if (def2web[i] != NULL)
1842 web = def2web[i];
1843 web = find_web_for_subweb (web);
1844 /* But if this ref includes a mode change, or was a use live
1845 over an abnormal call, set appropriate flags in the web. */
1846 if ((DF_REF_FLAGS (ref) & DF_REF_MODE_CHANGE) != 0
1847 && web->regno >= FIRST_PSEUDO_REGISTER)
1848 web->mode_changed = 1;
1849 if ((DF_REF_FLAGS (ref) & DF_REF_STRIPPED) != 0
1850 && web->regno >= FIRST_PSEUDO_REGISTER)
1851 web->subreg_stripped = 1;
1852 if (i >= def_id
1853 && TEST_BIT (live_over_abnormal, ref_id))
1854 web->live_over_abnormal = 1;
1855 /* And check, that it's not a newly allocated web. This would be
1856 an inconsistency. */
1857 gcc_assert (web->old_web);
1858 gcc_assert (web->type != PRECOLORED);
1859 continue;
1861 /* In case this was no web part root, we need to initialize WEB
1862 from the ref2web array belonging to the root. */
1863 if (wp->uplink)
1865 struct web_part *rwp = find_web_part (wp);
1866 unsigned int j = DF_REF_ID (rwp->ref);
1867 if (rwp < wp_first_use)
1868 web = def2web[j];
1869 else
1870 web = use2web[j];
1871 web = find_web_for_subweb (web);
1874 /* Remember all references for a web in a single linked list. */
1875 all_refs[i].next = web->temp_refs;
1876 web->temp_refs = &all_refs[i];
1878 /* And the test, that if def2web[i] was NULL above, that we are _not_
1879 an old web. */
1880 gcc_assert (!web->old_web || web->type == PRECOLORED);
1882 /* Possible create a subweb, if this ref was a subreg. */
1883 if (GET_CODE (reg) == SUBREG)
1885 subweb = find_subweb (web, reg);
1886 if (!subweb)
1888 subweb = add_subweb (web, reg);
1889 gcc_assert (!web->old_web);
1892 else
1893 subweb = web;
1895 /* And look, if the ref involves an invalid mode change. */
1896 if ((DF_REF_FLAGS (ref) & DF_REF_MODE_CHANGE) != 0
1897 && web->regno >= FIRST_PSEUDO_REGISTER)
1898 web->mode_changed = 1;
1899 if ((DF_REF_FLAGS (ref) & DF_REF_STRIPPED) != 0
1900 && web->regno >= FIRST_PSEUDO_REGISTER)
1901 web->subreg_stripped = 1;
1903 /* Setup def2web, or use2web, and increment num_defs or num_uses. */
1904 if (i < def_id)
1906 /* Some sanity checks. */
1907 if (ra_pass > 1)
1909 struct web *compare = def2web[i];
1910 if (i < last_def_id)
1911 gcc_assert (!web->old_web || compare == subweb);
1912 gcc_assert (web->old_web || !compare);
1913 gcc_assert (!compare || compare == subweb);
1915 def2web[i] = subweb;
1916 web->num_defs++;
1918 else
1920 if (ra_pass > 1)
1922 struct web *compare = use2web[ref_id];
1924 gcc_assert (ref_id >= last_use_id
1925 || !web->old_web || compare == subweb);
1926 gcc_assert (web->old_web || !compare);
1927 gcc_assert (!compare || compare == subweb);
1929 use2web[ref_id] = subweb;
1930 web->num_uses++;
1931 if (TEST_BIT (live_over_abnormal, ref_id))
1932 web->live_over_abnormal = 1;
1936 /* We better now have exactly as many webs as we had web part roots. */
1937 gcc_assert (webnum == num_webs);
1939 return webnum;
1942 /* This builds full webs out of web parts, without relating them to each
1943 other (i.e. without creating the conflict edges). */
1945 static void
1946 parts_to_webs (struct df *df)
1948 unsigned int i;
1949 unsigned int webnum;
1950 struct web_link *copy_webs = NULL;
1951 struct dlist *d;
1952 struct df_link *all_refs;
1953 num_subwebs = 0;
1955 /* First build webs and ordinary subwebs. */
1956 all_refs = xcalloc (df->def_id + df->use_id, sizeof (all_refs[0]));
1957 webnum = parts_to_webs_1 (df, &copy_webs, all_refs);
1959 /* Setup the webs for hardregs which are still missing (weren't
1960 mentioned in the code). */
1961 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1962 if (!hardreg2web[i])
1964 struct web *web = xmalloc (sizeof (struct web));
1965 init_one_web (web, gen_rtx_REG (reg_raw_mode[i], i));
1966 web->id = last_num_webs++;
1967 hardreg2web[web->regno] = web;
1969 num_webs = last_num_webs;
1971 /* Now create all artificial subwebs, i.e. those, which do
1972 not correspond to a real subreg in the current function's RTL, but
1973 which nevertheless is a target of a conflict.
1974 XXX we need to merge this loop with the one above, which means, we need
1975 a way to later override the artificiality. Beware: currently
1976 add_subweb_2() relies on the existence of normal subwebs for deducing
1977 a sane mode to use for the artificial subwebs. */
1978 for (i = 0; i < df->def_id + df->use_id; i++)
1980 struct web_part *wp = &web_parts[i];
1981 struct tagged_conflict *cl;
1982 struct web *web;
1983 if (wp->uplink || !wp->ref)
1985 gcc_assert (!wp->sub_conflicts);
1986 continue;
1988 web = def2web[i];
1989 web = find_web_for_subweb (web);
1990 for (cl = wp->sub_conflicts; cl; cl = cl->next)
1991 if (!find_subweb_2 (web, cl->size_word))
1992 add_subweb_2 (web, cl->size_word);
1995 /* And now create artificial subwebs needed for representing the inverse
1996 of some subwebs. This also gives IDs to all subwebs. */
1997 webnum = last_num_webs;
1998 for (d = WEBS(INITIAL); d; d = d->next)
2000 struct web *web = DLIST_WEB (d);
2001 if (web->subreg_next)
2003 struct web *sweb;
2004 build_inverse_webs (web);
2005 for (sweb = web->subreg_next; sweb; sweb = sweb->subreg_next)
2006 sweb->id = webnum++;
2010 /* Now that everyone has an ID, we can setup the id2web array. */
2011 id2web = xcalloc (webnum, sizeof (id2web[0]));
2012 for (d = WEBS(INITIAL); d; d = d->next)
2014 struct web *web = DLIST_WEB (d);
2015 ID2WEB (web->id) = web;
2016 for (web = web->subreg_next; web; web = web->subreg_next)
2017 ID2WEB (web->id) = web;
2019 num_subwebs = webnum - last_num_webs;
2020 num_allwebs = num_webs + num_subwebs;
2021 num_webs += num_subwebs;
2023 /* Allocate and clear the conflict graph bitmaps. */
2024 igraph = sbitmap_alloc (num_webs * num_webs / 2);
2025 sup_igraph = sbitmap_alloc (num_webs * num_webs);
2026 sbitmap_zero (igraph);
2027 sbitmap_zero (sup_igraph);
2029 /* Distribute the references to their webs. */
2030 init_webs_defs_uses ();
2031 /* And do some sanity checks if old webs, and those recreated from the
2032 really are the same. */
2033 compare_and_free_webs (&copy_webs);
2034 free (all_refs);
2037 /* This deletes all conflicts to and from webs which need to be renewed
2038 in this pass of the allocator, i.e. those which were spilled in the
2039 last pass. Furthermore it also rebuilds the bitmaps for the remaining
2040 conflicts. */
2042 static void
2043 reset_conflicts (void)
2045 unsigned int i;
2046 bitmap newwebs = BITMAP_XMALLOC ();
2047 for (i = 0; i < num_webs - num_subwebs; i++)
2049 struct web *web = ID2WEB (i);
2050 /* Hardreg webs and non-old webs are new webs (which
2051 need rebuilding). */
2052 if (web->type == PRECOLORED || !web->old_web)
2053 bitmap_set_bit (newwebs, web->id);
2056 for (i = 0; i < num_webs - num_subwebs; i++)
2058 struct web *web = ID2WEB (i);
2059 struct conflict_link *cl;
2060 struct conflict_link **pcl;
2061 pcl = &(web->conflict_list);
2063 /* First restore the conflict list to be like it was before
2064 coalescing. */
2065 if (web->have_orig_conflicts)
2067 web->conflict_list = web->orig_conflict_list;
2068 web->orig_conflict_list = NULL;
2070 gcc_assert (!web->orig_conflict_list);
2072 /* New non-precolored webs, have no conflict list. */
2073 if (web->type != PRECOLORED && !web->old_web)
2075 *pcl = NULL;
2076 /* Useless conflicts will be rebuilt completely. But check
2077 for cleanliness, as the web might have come from the
2078 free list. */
2079 gcc_assert (bitmap_first_set_bit (web->useless_conflicts) < 0);
2081 else
2083 /* Useless conflicts with new webs will be rebuilt if they
2084 are still there. */
2085 bitmap_operation (web->useless_conflicts, web->useless_conflicts,
2086 newwebs, BITMAP_AND_COMPL);
2087 /* Go through all conflicts, and retain those to old webs. */
2088 for (cl = web->conflict_list; cl; cl = cl->next)
2090 if (cl->t->old_web || cl->t->type == PRECOLORED)
2092 *pcl = cl;
2093 pcl = &(cl->next);
2095 /* Also restore the entries in the igraph bitmaps. */
2096 web->num_conflicts += 1 + cl->t->add_hardregs;
2097 SET_BIT (sup_igraph, (web->id * num_webs + cl->t->id));
2098 /* No subconflicts mean full webs conflict. */
2099 if (!cl->sub)
2100 SET_BIT (igraph, igraph_index (web->id, cl->t->id));
2101 else
2102 /* Else only the parts in cl->sub must be in the
2103 bitmap. */
2105 struct sub_conflict *sl;
2106 for (sl = cl->sub; sl; sl = sl->next)
2107 SET_BIT (igraph, igraph_index (sl->s->id, sl->t->id));
2111 *pcl = NULL;
2113 web->have_orig_conflicts = 0;
2115 BITMAP_XFREE (newwebs);
2118 /* For each web check it's num_conflicts member against that
2119 number, as calculated from scratch from all neighbors. */
2121 #if 0
2122 static void
2123 check_conflict_numbers (void)
2125 unsigned int i;
2126 for (i = 0; i < num_webs; i++)
2128 struct web *web = ID2WEB (i);
2129 int new_conf = 0 * web->add_hardregs;
2130 struct conflict_link *cl;
2131 for (cl = web->conflict_list; cl; cl = cl->next)
2132 if (cl->t->type != SELECT && cl->t->type != COALESCED)
2133 new_conf += 1 + cl->t->add_hardregs;
2134 gcc_assert (web->type == PRECOLORED || new_conf == web->num_conflicts);
2137 #endif
2139 /* Convert the conflicts between web parts to conflicts between full webs.
2141 This can't be done in parts_to_webs(), because for recording conflicts
2142 between webs we need to know their final usable_regs set, which is used
2143 to discard non-conflicts (between webs having no hard reg in common).
2144 But this is set for spill temporaries only after the webs itself are
2145 built. Until then the usable_regs set is based on the pseudo regno used
2146 in this web, which may contain far less registers than later determined.
2147 This would result in us loosing conflicts (due to record_conflict()
2148 thinking that a web can only be allocated to the current usable_regs,
2149 whereas later this is extended) leading to colorings, where some regs which
2150 in reality conflict get the same color. */
2152 static void
2153 conflicts_between_webs (struct df *df)
2155 unsigned int i;
2156 struct dlist *d;
2157 bitmap ignore_defs = BITMAP_XMALLOC ();
2158 unsigned int have_ignored;
2159 unsigned int *pass_cache = xcalloc (num_webs, sizeof (int));
2160 unsigned int pass = 0;
2162 if (ra_pass > 1)
2163 reset_conflicts ();
2165 /* It is possible, that in the conflict bitmaps still some defs I are noted,
2166 which have web_parts[I].ref being NULL. This can happen, when from the
2167 last iteration the conflict bitmap for this part wasn't deleted, but a
2168 conflicting move insn was removed. It's DEF is still in the conflict
2169 bitmap, but it doesn't exist anymore in df->defs. To not have to check
2170 it in the tight loop below, we instead remember the ID's of them in a
2171 bitmap, and loop only over IDs which are not in it. */
2172 for (i = 0; i < df->def_id; i++)
2173 if (web_parts[i].ref == NULL)
2174 bitmap_set_bit (ignore_defs, i);
2175 have_ignored = (bitmap_first_set_bit (ignore_defs) >= 0);
2177 /* Now record all conflicts between webs. Note that we only check
2178 the conflict bitmaps of all defs. Conflict bitmaps are only in
2179 webpart roots. If they are in uses, those uses are roots, which
2180 means, that this is an uninitialized web, whose conflicts
2181 don't matter. Nevertheless for hardregs we also need to check uses.
2182 E.g. hardregs used for argument passing have no DEF in the RTL,
2183 but if they have uses, they indeed conflict with all DEFs they
2184 overlap. */
2185 for (i = 0; i < df->def_id + df->use_id; i++)
2187 struct tagged_conflict *cl = web_parts[i].sub_conflicts;
2188 struct web *supweb1;
2189 if (!cl
2190 || (i >= df->def_id
2191 && DF_REF_REGNO (web_parts[i].ref) >= FIRST_PSEUDO_REGISTER))
2192 continue;
2193 supweb1 = def2web[i];
2194 supweb1 = find_web_for_subweb (supweb1);
2195 for (; cl; cl = cl->next)
2196 if (cl->conflicts)
2198 int j;
2199 struct web *web1 = find_subweb_2 (supweb1, cl->size_word);
2200 bitmap_iterator bi;
2202 if (have_ignored)
2203 bitmap_operation (cl->conflicts, cl->conflicts, ignore_defs,
2204 BITMAP_AND_COMPL);
2205 /* We reduce the number of calls to record_conflict() with this
2206 pass thing. record_conflict() itself also has some early-out
2207 optimizations, but here we can use the special properties of
2208 the loop (constant web1) to reduce that even more.
2209 We once used an sbitmap of already handled web indices,
2210 but sbitmaps are slow to clear and bitmaps are slow to
2211 set/test. The current approach needs more memory, but
2212 locality is large. */
2213 pass++;
2215 /* Note, that there are only defs in the conflicts bitset. */
2216 EXECUTE_IF_SET_IN_BITMAP (cl->conflicts, 0, j, bi)
2218 struct web *web2 = def2web[j];
2219 unsigned int id2 = web2->id;
2220 if (pass_cache[id2] != pass)
2222 pass_cache[id2] = pass;
2223 record_conflict (web1, web2);
2229 free (pass_cache);
2230 BITMAP_XFREE (ignore_defs);
2232 for (d = WEBS(INITIAL); d; d = d->next)
2234 struct web *web = DLIST_WEB (d);
2235 int j;
2237 if (web->crosses_call)
2238 for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
2239 if (TEST_HARD_REG_BIT (regs_invalidated_by_call, j))
2240 record_conflict (web, hardreg2web[j]);
2242 #ifdef STACK_REGS
2243 /* Pseudos can't go in stack regs if they are live at the beginning of
2244 a block that is reached by an abnormal edge. */
2245 if (web->live_over_abnormal)
2246 for (j = FIRST_STACK_REG; j <= LAST_STACK_REG; j++)
2247 record_conflict (web, hardreg2web[j]);
2248 #endif
2252 /* Remember that a web was spilled, and change some characteristics
2253 accordingly. */
2255 static void
2256 remember_web_was_spilled (struct web *web)
2258 int i;
2259 unsigned int found_size = 0;
2260 int adjust;
2261 web->spill_temp = 1;
2263 /* From now on don't use reg_pref/alt_class (regno) anymore for
2264 this web, but instead usable_regs. We can't use spill_temp for
2265 this, as it might get reset later, when we are coalesced to a
2266 non-spill-temp. In that case we still want to use usable_regs. */
2267 web->use_my_regs = 1;
2269 /* We don't constrain spill temporaries in any way for now.
2270 It's wrong sometimes to have the same constraints or
2271 preferences as the original pseudo, esp. if they were very narrow.
2272 (E.g. there once was a reg wanting class AREG (only one register)
2273 without alternative class. As long, as also the spill-temps for
2274 this pseudo had the same constraints it was spilled over and over.
2275 Ideally we want some constraints also on spill-temps: Because they are
2276 not only loaded/stored, but also worked with, any constraints from insn
2277 alternatives needs applying. Currently this is dealt with by reload, as
2278 many other things, but at some time we want to integrate that
2279 functionality into the allocator. */
2280 if (web->regno >= max_normal_pseudo)
2282 COPY_HARD_REG_SET (web->usable_regs,
2283 reg_class_contents[reg_preferred_class (web->regno)]);
2284 IOR_HARD_REG_SET (web->usable_regs,
2285 reg_class_contents[reg_alternate_class (web->regno)]);
2287 else
2288 COPY_HARD_REG_SET (web->usable_regs,
2289 reg_class_contents[(int) GENERAL_REGS]);
2290 AND_COMPL_HARD_REG_SET (web->usable_regs, never_use_colors);
2291 prune_hardregs_for_mode (&web->usable_regs, PSEUDO_REGNO_MODE (web->regno));
2292 #ifdef CANNOT_CHANGE_MODE_CLASS
2293 if (web->mode_changed)
2294 AND_COMPL_HARD_REG_SET (web->usable_regs, invalid_mode_change_regs);
2295 #endif
2296 web->num_freedom = hard_regs_count (web->usable_regs);
2297 gcc_assert (web->num_freedom);
2298 COPY_HARD_REG_SET (web->orig_usable_regs, web->usable_regs);
2299 /* Now look for a class, which is subset of our constraints, to
2300 setup add_hardregs, and regclass for debug output. */
2301 web->regclass = NO_REGS;
2302 for (i = (int) ALL_REGS - 1; i > 0; i--)
2304 unsigned int size;
2305 HARD_REG_SET test;
2306 COPY_HARD_REG_SET (test, reg_class_contents[i]);
2307 AND_COMPL_HARD_REG_SET (test, never_use_colors);
2308 GO_IF_HARD_REG_SUBSET (test, web->usable_regs, found);
2309 continue;
2310 found:
2311 /* Measure the actual number of bits which really are overlapping
2312 the target regset, not just the reg_class_size. */
2313 size = hard_regs_count (test);
2314 if (found_size < size)
2316 web->regclass = (enum reg_class) i;
2317 found_size = size;
2321 adjust = 0 * web->add_hardregs;
2322 web->add_hardregs =
2323 CLASS_MAX_NREGS (web->regclass, PSEUDO_REGNO_MODE (web->regno)) - 1;
2324 web->num_freedom -= web->add_hardregs;
2325 gcc_assert (web->num_freedom);
2326 adjust -= 0 * web->add_hardregs;
2327 web->num_conflicts -= adjust;
2330 /* Look at each web, if it is used as spill web. Or better said,
2331 if it will be spillable in this pass. */
2333 static void
2334 detect_spill_temps (void)
2336 struct dlist *d;
2337 bitmap already = BITMAP_XMALLOC ();
2339 /* Detect webs used for spill temporaries. */
2340 for (d = WEBS(INITIAL); d; d = d->next)
2342 struct web *web = DLIST_WEB (d);
2344 /* Below only the detection of spill temporaries. We never spill
2345 precolored webs, so those can't be spill temporaries. The code above
2346 (remember_web_was_spilled) can't currently cope with hardregs
2347 anyway. */
2348 if (web->regno < FIRST_PSEUDO_REGISTER)
2349 continue;
2350 /* Uninitialized webs can't be spill-temporaries. */
2351 if (web->num_defs == 0)
2352 continue;
2354 /* A web with only defs and no uses can't be spilled. Nevertheless
2355 it must get a color, as it takes away a register from all webs
2356 live at these defs. So we make it a short web. */
2357 if (web->num_uses == 0)
2358 web->spill_temp = 3;
2359 /* A web which was spilled last time, but for which no insns were
2360 emitted (can happen with IR spilling ignoring sometimes
2361 all deaths). */
2362 else if (web->changed)
2363 web->spill_temp = 1;
2364 /* A spill temporary has one def, one or more uses, all uses
2365 are in one insn, and either the def or use insn was inserted
2366 by the allocator. */
2367 /* XXX not correct currently. There might also be spill temps
2368 involving more than one def. Usually that's an additional
2369 clobber in the using instruction. We might also constrain
2370 ourself to that, instead of like currently marking all
2371 webs involving any spill insns at all. */
2372 else
2374 unsigned int i;
2375 int spill_involved = 0;
2376 for (i = 0; i < web->num_uses && !spill_involved; i++)
2377 if (DF_REF_INSN_UID (web->uses[i]) >= orig_max_uid)
2378 spill_involved = 1;
2379 for (i = 0; i < web->num_defs && !spill_involved; i++)
2380 if (DF_REF_INSN_UID (web->defs[i]) >= orig_max_uid)
2381 spill_involved = 1;
2383 if (spill_involved/* && ra_pass > 2*/)
2385 int num_deaths = web->span_deaths;
2386 /* Mark webs involving at least one spill insn as
2387 spill temps. */
2388 remember_web_was_spilled (web);
2389 /* Search for insns which define and use the web in question
2390 at the same time, i.e. look for rmw insns. If these insns
2391 are also deaths of other webs they might have been counted
2392 as such into web->span_deaths. But because of the rmw nature
2393 of this insn it is no point where a load/reload could be
2394 placed successfully (it would still conflict with the
2395 dead web), so reduce the number of spanned deaths by those
2396 insns. Note that sometimes such deaths are _not_ counted,
2397 so negative values can result. */
2398 bitmap_zero (already);
2399 for (i = 0; i < web->num_defs; i++)
2401 rtx insn = web->defs[i]->insn;
2402 if (TEST_BIT (insns_with_deaths, INSN_UID (insn))
2403 && !bitmap_bit_p (already, INSN_UID (insn)))
2405 unsigned int j;
2406 bitmap_set_bit (already, INSN_UID (insn));
2407 /* Only decrement it once for each insn. */
2408 for (j = 0; j < web->num_uses; j++)
2409 if (web->uses[j]->insn == insn)
2411 num_deaths--;
2412 break;
2416 /* But mark them specially if they could possibly be spilled,
2417 either because they cross some deaths (without the above
2418 mentioned ones) or calls. */
2419 if (web->crosses_call || num_deaths > 0)
2420 web->spill_temp = 1 * 2;
2422 /* A web spanning no deaths can't be spilled either. No loads
2423 would be created for it, ergo no defs. So the insns wouldn't
2424 change making the graph not easier to color. Make this also
2425 a short web. Don't do this if it crosses calls, as these are
2426 also points of reloads. */
2427 else if (web->span_deaths == 0 && !web->crosses_call)
2428 web->spill_temp = 3;
2430 web->orig_spill_temp = web->spill_temp;
2432 BITMAP_XFREE (already);
2435 /* Returns nonzero if the rtx MEM refers somehow to a stack location. */
2438 memref_is_stack_slot (rtx mem)
2440 rtx ad = XEXP (mem, 0);
2441 rtx x;
2442 if (GET_CODE (ad) != PLUS || GET_CODE (XEXP (ad, 1)) != CONST_INT)
2443 return 0;
2444 x = XEXP (ad, 0);
2445 if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
2446 || (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM])
2447 || x == stack_pointer_rtx)
2448 return 1;
2449 return 0;
2452 /* Returns nonzero, if rtx X somewhere contains any pseudo register. */
2454 static int
2455 contains_pseudo (rtx x)
2457 const char *fmt;
2458 int i;
2459 if (GET_CODE (x) == SUBREG)
2460 x = SUBREG_REG (x);
2461 if (REG_P (x))
2463 if (REGNO (x) >= FIRST_PSEUDO_REGISTER)
2464 return 1;
2465 else
2466 return 0;
2469 fmt = GET_RTX_FORMAT (GET_CODE (x));
2470 for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
2471 if (fmt[i] == 'e')
2473 if (contains_pseudo (XEXP (x, i)))
2474 return 1;
2476 else if (fmt[i] == 'E')
2478 int j;
2479 for (j = 0; j < XVECLEN (x, i); j++)
2480 if (contains_pseudo (XVECEXP (x, i, j)))
2481 return 1;
2483 return 0;
2486 /* Returns nonzero, if we are able to rematerialize something with
2487 value X. If it's not a general operand, we test if we can produce
2488 a valid insn which set a pseudo to that value, and that insn doesn't
2489 clobber anything. */
2491 static GTY(()) rtx remat_test_insn;
2492 static int
2493 want_to_remat (rtx x)
2495 int num_clobbers = 0;
2496 int icode;
2498 /* If this is a valid operand, we are OK. If it's VOIDmode, we aren't. */
2499 if (general_operand (x, GET_MODE (x)))
2500 return 1;
2502 /* Otherwise, check if we can make a valid insn from it. First initialize
2503 our test insn if we haven't already. */
2504 if (remat_test_insn == 0)
2506 remat_test_insn
2507 = make_insn_raw (gen_rtx_SET (VOIDmode,
2508 gen_rtx_REG (word_mode,
2509 FIRST_PSEUDO_REGISTER * 2),
2510 const0_rtx));
2511 NEXT_INSN (remat_test_insn) = PREV_INSN (remat_test_insn) = 0;
2514 /* Now make an insn like the one we would make when rematerializing
2515 the value X and see if valid. */
2516 PUT_MODE (SET_DEST (PATTERN (remat_test_insn)), GET_MODE (x));
2517 SET_SRC (PATTERN (remat_test_insn)) = x;
2518 /* XXX For now we don't allow any clobbers to be added, not just no
2519 hardreg clobbers. */
2520 return ((icode = recog (PATTERN (remat_test_insn), remat_test_insn,
2521 &num_clobbers)) >= 0
2522 && (num_clobbers == 0
2523 /*|| ! added_clobbers_hard_reg_p (icode)*/));
2526 /* Look at all webs, if they perhaps are rematerializable.
2527 They are, if all their defs are simple sets to the same value,
2528 and that value is simple enough, and want_to_remat() holds for it. */
2530 static void
2531 detect_remat_webs (void)
2533 struct dlist *d;
2534 for (d = WEBS(INITIAL); d; d = d->next)
2536 struct web *web = DLIST_WEB (d);
2537 unsigned int i;
2538 rtx pat = NULL_RTX;
2539 /* Hardregs and useless webs aren't spilled -> no remat necessary.
2540 Defless webs obviously also can't be rematerialized. */
2541 if (web->regno < FIRST_PSEUDO_REGISTER || !web->num_defs
2542 || !web->num_uses)
2543 continue;
2544 for (i = 0; i < web->num_defs; i++)
2546 rtx insn;
2547 rtx set = single_set (insn = DF_REF_INSN (web->defs[i]));
2548 rtx src;
2549 if (!set)
2550 break;
2551 src = SET_SRC (set);
2552 /* When only subregs of the web are set it isn't easily
2553 rematerializable. */
2554 if (!rtx_equal_p (SET_DEST (set), web->orig_x))
2555 break;
2556 /* If we already have a pattern it must be equal to the current. */
2557 if (pat && !rtx_equal_p (pat, src))
2558 break;
2559 /* Don't do the expensive checks multiple times. */
2560 if (pat)
2561 continue;
2562 /* For now we allow only constant sources. */
2563 if ((CONSTANT_P (src)
2564 /* If the whole thing is stable already, it is a source for
2565 remat, no matter how complicated (probably all needed
2566 resources for it are live everywhere, and don't take
2567 additional register resources). */
2568 /* XXX Currently we can't use patterns which contain
2569 pseudos, _even_ if they are stable. The code simply isn't
2570 prepared for that. All those operands can't be spilled (or
2571 the dependent remat webs are not remat anymore), so they
2572 would be oldwebs in the next iteration. But currently
2573 oldwebs can't have their references changed. The
2574 incremental machinery barfs on that. */
2575 || (!rtx_unstable_p (src) && !contains_pseudo (src))
2576 /* Additionally also memrefs to stack-slots are useful, when
2577 we created them ourself. They might not have set their
2578 unchanging flag set, but nevertheless they are stable across
2579 the livetime in question. */
2580 || (MEM_P (src)
2581 && INSN_UID (insn) >= orig_max_uid
2582 && memref_is_stack_slot (src)))
2583 /* And we must be able to construct an insn without
2584 side-effects to actually load that value into a reg. */
2585 && want_to_remat (src))
2586 pat = src;
2587 else
2588 break;
2590 if (pat && i == web->num_defs)
2591 web->pattern = pat;
2595 /* Determine the spill costs of all webs. */
2597 static void
2598 determine_web_costs (void)
2600 struct dlist *d;
2601 for (d = WEBS(INITIAL); d; d = d->next)
2603 unsigned int i, num_loads;
2604 int load_cost, store_cost;
2605 unsigned HOST_WIDE_INT w;
2606 struct web *web = DLIST_WEB (d);
2607 if (web->type == PRECOLORED)
2608 continue;
2609 /* Get costs for one load/store. Note that we offset them by 1,
2610 because some patterns have a zero rtx_cost(), but we of course
2611 still need the actual load/store insns. With zero all those
2612 webs would be the same, no matter how often and where
2613 they are used. */
2614 if (web->pattern)
2616 /* This web is rematerializable. Beware, we set store_cost to
2617 zero optimistically assuming, that we indeed don't emit any
2618 stores in the spill-code addition. This might be wrong if
2619 at the point of the load not all needed resources are
2620 available, in which case we emit a stack-based load, for
2621 which we in turn need the according stores. */
2622 load_cost = 1 + rtx_cost (web->pattern, 0);
2623 store_cost = 0;
2625 else
2627 load_cost = 1 + MEMORY_MOVE_COST (GET_MODE (web->orig_x),
2628 web->regclass, 1);
2629 store_cost = 1 + MEMORY_MOVE_COST (GET_MODE (web->orig_x),
2630 web->regclass, 0);
2632 /* We create only loads at deaths, whose number is in span_deaths. */
2633 num_loads = MIN (web->span_deaths, web->num_uses);
2634 for (w = 0, i = 0; i < web->num_uses; i++)
2635 w += DF_REF_BB (web->uses[i])->frequency + 1;
2636 if (num_loads < web->num_uses)
2637 w = (w * num_loads + web->num_uses - 1) / web->num_uses;
2638 web->spill_cost = w * load_cost;
2639 if (store_cost)
2641 for (w = 0, i = 0; i < web->num_defs; i++)
2642 w += DF_REF_BB (web->defs[i])->frequency + 1;
2643 web->spill_cost += w * store_cost;
2645 web->orig_spill_cost = web->spill_cost;
2649 /* Detect webs which are set in a conditional jump insn (possibly a
2650 decrement-and-branch type of insn), and mark them not to be
2651 spillable. The stores for them would need to be placed on edges,
2652 which destroys the CFG. (Somewhen we want to deal with that XXX) */
2654 static void
2655 detect_webs_set_in_cond_jump (void)
2657 basic_block bb;
2658 FOR_EACH_BB (bb)
2659 if (JUMP_P (BB_END (bb)))
2661 struct df_link *link;
2662 for (link = DF_INSN_DEFS (df, BB_END (bb)); link; link = link->next)
2663 if (link->ref && DF_REF_REGNO (link->ref) >= FIRST_PSEUDO_REGISTER)
2665 struct web *web = def2web[DF_REF_ID (link->ref)];
2666 web->orig_spill_temp = web->spill_temp = 3;
2671 /* Second top-level function of this file.
2672 Converts the connected web parts to full webs. This means, it allocates
2673 all webs, and initializes all fields, including detecting spill
2674 temporaries. It does not distribute moves to their corresponding webs,
2675 though. */
2677 static void
2678 make_webs (struct df *df)
2680 /* First build all the webs itself. They are not related with
2681 others yet. */
2682 parts_to_webs (df);
2683 /* Now detect spill temporaries to initialize their usable_regs set. */
2684 detect_spill_temps ();
2685 detect_webs_set_in_cond_jump ();
2686 /* And finally relate them to each other, meaning to record all possible
2687 conflicts between webs (see the comment there). */
2688 conflicts_between_webs (df);
2689 detect_remat_webs ();
2690 determine_web_costs ();
2693 /* Distribute moves to the corresponding webs. */
2695 static void
2696 moves_to_webs (struct df *df)
2698 struct df_link *link;
2699 struct move_list *ml;
2701 /* Distribute all moves to their corresponding webs, making sure,
2702 each move is in a web maximally one time (happens on some strange
2703 insns). */
2704 for (ml = wl_moves; ml; ml = ml->next)
2706 struct move *m = ml->move;
2707 struct web *web;
2708 struct move_list *newml;
2709 if (!m)
2710 continue;
2711 m->type = WORKLIST;
2712 m->dlink = NULL;
2713 /* Multiple defs/uses can happen in moves involving hard-regs in
2714 a wider mode. For those df.* creates use/def references for each
2715 real hard-reg involved. For coalescing we are interested in
2716 the smallest numbered hard-reg. */
2717 for (link = DF_INSN_DEFS (df, m->insn); link; link = link->next)
2718 if (link->ref)
2720 web = def2web[DF_REF_ID (link->ref)];
2721 web = find_web_for_subweb (web);
2722 if (!m->target_web || web->regno < m->target_web->regno)
2723 m->target_web = web;
2725 for (link = DF_INSN_USES (df, m->insn); link; link = link->next)
2726 if (link->ref)
2728 web = use2web[DF_REF_ID (link->ref)];
2729 web = find_web_for_subweb (web);
2730 if (!m->source_web || web->regno < m->source_web->regno)
2731 m->source_web = web;
2733 if (m->source_web && m->target_web
2734 /* If the usable_regs don't intersect we can't coalesce the two
2735 webs anyway, as this is no simple copy insn (it might even
2736 need an intermediate stack temp to execute this "copy" insn). */
2737 && hard_regs_intersect_p (&m->source_web->usable_regs,
2738 &m->target_web->usable_regs))
2740 if (!flag_ra_optimistic_coalescing)
2742 struct move_list *test = m->source_web->moves;
2743 for (; test && test->move != m; test = test->next);
2744 if (! test)
2746 newml = ra_alloc (sizeof (struct move_list));
2747 newml->move = m;
2748 newml->next = m->source_web->moves;
2749 m->source_web->moves = newml;
2751 test = m->target_web->moves;
2752 for (; test && test->move != m; test = test->next);
2753 if (! test)
2755 newml = ra_alloc (sizeof (struct move_list));
2756 newml->move = m;
2757 newml->next = m->target_web->moves;
2758 m->target_web->moves = newml;
2762 else
2763 /* Delete this move. */
2764 ml->move = NULL;
2768 /* Handle tricky asm insns.
2769 Supposed to create conflicts to hardregs which aren't allowed in
2770 the constraints. Doesn't actually do that, as it might confuse
2771 and constrain the allocator too much. */
2773 static void
2774 handle_asm_insn (struct df *df, rtx insn)
2776 const char *constraints[MAX_RECOG_OPERANDS];
2777 enum machine_mode operand_mode[MAX_RECOG_OPERANDS];
2778 int i, noperands, in_output;
2779 HARD_REG_SET clobbered, allowed, conflict;
2780 rtx pat;
2781 if (! INSN_P (insn)
2782 || (noperands = asm_noperands (PATTERN (insn))) < 0)
2783 return;
2784 pat = PATTERN (insn);
2785 CLEAR_HARD_REG_SET (clobbered);
2787 if (GET_CODE (pat) == PARALLEL)
2788 for (i = 0; i < XVECLEN (pat, 0); i++)
2790 rtx t = XVECEXP (pat, 0, i);
2791 if (GET_CODE (t) == CLOBBER && REG_P (XEXP (t, 0))
2792 && REGNO (XEXP (t, 0)) < FIRST_PSEUDO_REGISTER)
2793 SET_HARD_REG_BIT (clobbered, REGNO (XEXP (t, 0)));
2796 decode_asm_operands (pat, recog_data.operand, recog_data.operand_loc,
2797 constraints, operand_mode);
2798 in_output = 1;
2799 for (i = 0; i < noperands; i++)
2801 const char *p = constraints[i];
2802 int cls = (int) NO_REGS;
2803 struct df_link *link;
2804 rtx reg;
2805 struct web *web;
2806 int nothing_allowed = 1;
2807 reg = recog_data.operand[i];
2809 /* Look, if the constraints apply to a pseudo reg, and not to
2810 e.g. a mem. */
2811 while (GET_CODE (reg) == SUBREG
2812 || GET_CODE (reg) == ZERO_EXTRACT
2813 || GET_CODE (reg) == SIGN_EXTRACT
2814 || GET_CODE (reg) == STRICT_LOW_PART)
2815 reg = XEXP (reg, 0);
2816 if (!REG_P (reg) || REGNO (reg) < FIRST_PSEUDO_REGISTER)
2817 continue;
2819 /* Search the web corresponding to this operand. We depend on
2820 that decode_asm_operands() places the output operands
2821 before the input operands. */
2822 while (1)
2824 if (in_output)
2825 link = df->insns[INSN_UID (insn)].defs;
2826 else
2827 link = df->insns[INSN_UID (insn)].uses;
2828 while (link && link->ref && DF_REF_REAL_REG (link->ref) != reg)
2829 link = link->next;
2830 if (!link || !link->ref)
2832 gcc_assert (in_output);
2833 in_output = 0;
2835 else
2836 break;
2838 if (in_output)
2839 web = def2web[DF_REF_ID (link->ref)];
2840 else
2841 web = use2web[DF_REF_ID (link->ref)];
2842 reg = DF_REF_REG (link->ref);
2844 /* Find the constraints, noting the allowed hardregs in allowed. */
2845 CLEAR_HARD_REG_SET (allowed);
2846 while (1)
2848 char c = *p;
2850 if (c == '\0' || c == ',' || c == '#')
2852 /* End of one alternative - mark the regs in the current
2853 class, and reset the class. */
2854 p++;
2855 IOR_HARD_REG_SET (allowed, reg_class_contents[cls]);
2856 if (cls != NO_REGS)
2857 nothing_allowed = 0;
2858 cls = NO_REGS;
2859 if (c == '#')
2860 do {
2861 c = *p++;
2862 } while (c != '\0' && c != ',');
2863 if (c == '\0')
2864 break;
2865 continue;
2868 switch (c)
2870 case '=': case '+': case '*': case '%': case '?': case '!':
2871 case '0': case '1': case '2': case '3': case '4': case 'm':
2872 case '<': case '>': case 'V': case 'o': case '&': case 'E':
2873 case 'F': case 's': case 'i': case 'n': case 'X': case 'I':
2874 case 'J': case 'K': case 'L': case 'M': case 'N': case 'O':
2875 case 'P':
2876 break;
2878 case 'p':
2879 cls = (int) reg_class_subunion[cls][(int) BASE_REG_CLASS];
2880 nothing_allowed = 0;
2881 break;
2883 case 'g':
2884 case 'r':
2885 cls = (int) reg_class_subunion[cls][(int) GENERAL_REGS];
2886 nothing_allowed = 0;
2887 break;
2889 default:
2890 cls =
2891 (int) reg_class_subunion[cls][(int)
2892 REG_CLASS_FROM_CONSTRAINT (c,
2893 p)];
2895 p += CONSTRAINT_LEN (c, p);
2898 /* Now make conflicts between this web, and all hardregs, which
2899 are not allowed by the constraints. */
2900 if (nothing_allowed)
2902 /* If we had no real constraints nothing was explicitly
2903 allowed, so we allow the whole class (i.e. we make no
2904 additional conflicts). */
2905 CLEAR_HARD_REG_SET (conflict);
2907 else
2909 COPY_HARD_REG_SET (conflict, usable_regs
2910 [reg_preferred_class (web->regno)]);
2911 IOR_HARD_REG_SET (conflict, usable_regs
2912 [reg_alternate_class (web->regno)]);
2913 AND_COMPL_HARD_REG_SET (conflict, allowed);
2914 /* We can't yet establish these conflicts. Reload must go first
2915 (or better said, we must implement some functionality of reload).
2916 E.g. if some operands must match, and they need the same color
2917 we don't see yet, that they do not conflict (because they match).
2918 For us it looks like two normal references with different DEFs,
2919 so they conflict, and as they both need the same color, the
2920 graph becomes uncolorable. */
2921 #if 0
2922 for (c = 0; c < FIRST_PSEUDO_REGISTER; c++)
2923 if (TEST_HARD_REG_BIT (conflict, c))
2924 record_conflict (web, hardreg2web[c]);
2925 #endif
2927 if (dump_file)
2929 int c;
2930 ra_debug_msg (DUMP_ASM, " ASM constrain Web %d conflicts with:", web->id);
2931 for (c = 0; c < FIRST_PSEUDO_REGISTER; c++)
2932 if (TEST_HARD_REG_BIT (conflict, c))
2933 ra_debug_msg (DUMP_ASM, " %d", c);
2934 ra_debug_msg (DUMP_ASM, "\n");
2939 /* The real toplevel function in this file.
2940 Build (or rebuilds) the complete interference graph with webs
2941 and conflicts. */
2943 void
2944 build_i_graph (struct df *df)
2946 rtx insn;
2948 init_web_parts (df);
2950 sbitmap_zero (move_handled);
2951 wl_moves = NULL;
2953 build_web_parts_and_conflicts (df);
2955 /* For read-modify-write instructions we may have created two webs.
2956 Reconnect them here. (s.a.) */
2957 connect_rmw_web_parts (df);
2959 /* The webs are conceptually complete now, but still scattered around as
2960 connected web parts. Collect all information and build the webs
2961 including all conflicts between webs (instead web parts). */
2962 make_webs (df);
2963 moves_to_webs (df);
2965 /* Look for additional constraints given by asms. */
2966 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
2967 handle_asm_insn (df, insn);
2970 /* Allocates or reallocates most memory for the interference graph and
2971 associated structures. If it reallocates memory (meaning, this is not
2972 the first pass), this also changes some structures to reflect the
2973 additional entries in various array, and the higher number of
2974 defs and uses. */
2976 void
2977 ra_build_realloc (struct df *df)
2979 struct web_part *last_web_parts = web_parts;
2980 struct web **last_def2web = def2web;
2981 struct web **last_use2web = use2web;
2982 sbitmap last_live_over_abnormal = live_over_abnormal;
2983 unsigned int i;
2984 struct dlist *d;
2985 move_handled = sbitmap_alloc (get_max_uid () );
2986 web_parts = xcalloc (df->def_id + df->use_id, sizeof web_parts[0]);
2987 def2web = xcalloc (df->def_id + df->use_id, sizeof def2web[0]);
2988 use2web = &def2web[df->def_id];
2989 live_over_abnormal = sbitmap_alloc (df->use_id);
2990 sbitmap_zero (live_over_abnormal);
2992 /* First go through all old defs and uses. */
2993 for (i = 0; i < last_def_id + last_use_id; i++)
2995 /* And relocate them to the new array. This is made ugly by the
2996 fact, that defs and uses are placed consecutive into one array. */
2997 struct web_part *dest = &web_parts[i < last_def_id
2998 ? i : (df->def_id + i - last_def_id)];
2999 struct web_part *up;
3000 *dest = last_web_parts[i];
3001 up = dest->uplink;
3002 dest->uplink = NULL;
3004 /* Also relocate the uplink to point into the new array. */
3005 if (up && up->ref)
3007 unsigned int id = DF_REF_ID (up->ref);
3008 if (up < &last_web_parts[last_def_id])
3010 if (df->defs[id])
3011 dest->uplink = &web_parts[DF_REF_ID (up->ref)];
3013 else if (df->uses[id])
3014 dest->uplink = &web_parts[df->def_id + DF_REF_ID (up->ref)];
3018 /* Also set up the def2web and use2web arrays, from the last pass.i
3019 Remember also the state of live_over_abnormal. */
3020 for (i = 0; i < last_def_id; i++)
3022 struct web *web = last_def2web[i];
3023 if (web)
3025 web = find_web_for_subweb (web);
3026 if (web->type != FREE && web->type != PRECOLORED)
3027 def2web[i] = last_def2web[i];
3030 for (i = 0; i < last_use_id; i++)
3032 struct web *web = last_use2web[i];
3033 if (web)
3035 web = find_web_for_subweb (web);
3036 if (web->type != FREE && web->type != PRECOLORED)
3037 use2web[i] = last_use2web[i];
3039 if (TEST_BIT (last_live_over_abnormal, i))
3040 SET_BIT (live_over_abnormal, i);
3043 /* We don't have any subwebs for now. Somewhen we might want to
3044 remember them too, instead of recreating all of them every time.
3045 The problem is, that which subwebs we need, depends also on what
3046 other webs and subwebs exist, and which conflicts are there.
3047 OTOH it should be no problem, if we had some more subwebs than strictly
3048 needed. Later. */
3049 for (d = WEBS(FREE); d; d = d->next)
3051 struct web *web = DLIST_WEB (d);
3052 struct web *wnext;
3053 for (web = web->subreg_next; web; web = wnext)
3055 wnext = web->subreg_next;
3056 free (web);
3058 DLIST_WEB (d)->subreg_next = NULL;
3061 /* The uses we anyway are going to check, are not yet live over an abnormal
3062 edge. In fact, they might actually not anymore, due to added
3063 loads. */
3064 if (last_check_uses)
3065 sbitmap_difference (live_over_abnormal, live_over_abnormal,
3066 last_check_uses);
3068 if (last_def_id || last_use_id)
3070 sbitmap_free (last_live_over_abnormal);
3071 free (last_web_parts);
3072 free (last_def2web);
3074 if (!last_max_uid)
3076 /* Setup copy cache, for copy_insn_p (). */
3077 copy_cache = xcalloc (get_max_uid (), sizeof (copy_cache[0]));
3078 init_bb_info ();
3080 else
3082 copy_cache = xrealloc (copy_cache, get_max_uid () * sizeof (copy_cache[0]));
3083 memset (&copy_cache[last_max_uid], 0,
3084 (get_max_uid () - last_max_uid) * sizeof (copy_cache[0]));
3088 /* Free up/clear some memory, only needed for one pass. */
3090 void
3091 ra_build_free (void)
3093 struct dlist *d;
3094 unsigned int i;
3096 /* Clear the moves associated with a web (we also need to look into
3097 subwebs here). */
3098 for (i = 0; i < num_webs; i++)
3100 struct web *web = ID2WEB (i);
3101 gcc_assert (web);
3102 gcc_assert (i < num_webs - num_subwebs
3103 || (!web->conflict_list && !web->orig_conflict_list));
3104 web->moves = NULL;
3106 /* All webs in the free list have no defs or uses anymore. */
3107 for (d = WEBS(FREE); d; d = d->next)
3109 struct web *web = DLIST_WEB (d);
3110 if (web->defs)
3111 free (web->defs);
3112 web->defs = NULL;
3113 if (web->uses)
3114 free (web->uses);
3115 web->uses = NULL;
3116 /* We can't free the subwebs here, as they are referenced from
3117 def2web[], and possibly needed in the next ra_build_realloc().
3118 We free them there (or in free_all_mem()). */
3121 /* Free all conflict bitmaps from web parts. Note that we clear
3122 _all_ these conflicts, and don't rebuild them next time for uses
3123 which aren't rechecked. This mean, that those conflict bitmaps
3124 only contain the incremental information. The cumulative one
3125 is still contained in the edges of the I-graph, i.e. in
3126 conflict_list (or orig_conflict_list) of the webs. */
3127 for (i = 0; i < df->def_id + df->use_id; i++)
3129 struct tagged_conflict *cl;
3130 for (cl = web_parts[i].sub_conflicts; cl; cl = cl->next)
3132 if (cl->conflicts)
3133 BITMAP_XFREE (cl->conflicts);
3135 web_parts[i].sub_conflicts = NULL;
3138 wl_moves = NULL;
3140 free (id2web);
3141 free (move_handled);
3142 sbitmap_free (sup_igraph);
3143 sbitmap_free (igraph);
3146 /* Free all memory for the interference graph structures. */
3148 void
3149 ra_build_free_all (struct df *df)
3151 unsigned int i;
3153 free_bb_info ();
3154 free (copy_cache);
3155 copy_cache = NULL;
3156 for (i = 0; i < df->def_id + df->use_id; i++)
3158 struct tagged_conflict *cl;
3159 for (cl = web_parts[i].sub_conflicts; cl; cl = cl->next)
3161 if (cl->conflicts)
3162 BITMAP_XFREE (cl->conflicts);
3164 web_parts[i].sub_conflicts = NULL;
3166 sbitmap_free (live_over_abnormal);
3167 free (web_parts);
3168 web_parts = NULL;
3169 if (last_check_uses)
3170 sbitmap_free (last_check_uses);
3171 last_check_uses = NULL;
3172 free (def2web);
3173 use2web = NULL;
3174 def2web = NULL;
3177 #include "gt-ra-build.h"
3180 vim:cinoptions={.5s,g0,p5,t0,(0,^-0.5s,n-0.5s:tw=78:cindent:sw=4: