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