|
|
1.1 root 1: /* Allocate registers for pseudo-registers that span basic blocks.
2: Copyright (C) 1987, 1988, 1991 Free Software Foundation, Inc.
3:
4: This file is part of GNU CC.
5:
6: GNU CC is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 2, or (at your option)
9: any later version.
10:
11: GNU CC is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with GNU CC; see the file COPYING. If not, write to
18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19:
20:
21: #include <stdio.h>
22: #include "config.h"
23: #include "rtl.h"
24: #include "flags.h"
25: #include "basic-block.h"
26: #include "hard-reg-set.h"
27: #include "regs.h"
28: #include "insn-config.h"
29: #include "output.h"
30:
31: /* This pass of the compiler performs global register allocation.
32: It assigns hard register numbers to all the pseudo registers
33: that were not handled in local_alloc. Assignments are recorded
34: in the vector reg_renumber, not by changing the rtl code.
35: (Such changes are made by final). The entry point is
36: the function global_alloc.
37:
38: After allocation is complete, the reload pass is run as a subroutine
39: of this pass, so that when a pseudo reg loses its hard reg due to
40: spilling it is possible to make a second attempt to find a hard
41: reg for it. The reload pass is independent in other respects
42: and it is run even when stupid register allocation is in use.
43:
44: 1. count the pseudo-registers still needing allocation
45: and assign allocation-numbers (allocnos) to them.
46: Set up tables reg_allocno and allocno_reg to map
47: reg numbers to allocnos and vice versa.
48: max_allocno gets the number of allocnos in use.
49:
50: 2. Allocate a max_allocno by max_allocno conflict bit matrix and clear it.
51: Allocate a max_allocno by FIRST_PSEUDO_REGISTER conflict matrix
52: for conflicts between allocnos and explicit hard register use
53: (which includes use of pseudo-registers allocated by local_alloc).
54:
55: 3. for each basic block
56: walk forward through the block, recording which
57: unallocated registers and which hardware registers are live.
58: Build the conflict matrix between the unallocated registers
59: and another of unallocated registers versus hardware registers.
60: Also record the preferred hardware registers
61: for each unallocated one.
62:
63: 4. Sort a table of the allocnos into order of
64: desirability of the variables.
65:
66: 5. Allocate the variables in that order; each if possible into
67: a preferred register, else into another register. */
68:
69: /* Number of pseudo-registers still requiring allocation
70: (not allocated by local_allocate). */
71:
72: static int max_allocno;
73:
74: /* Indexed by (pseudo) reg number, gives the allocno, or -1
75: for pseudo registers already allocated by local_allocate. */
76:
77: static int *reg_allocno;
78:
79: /* Indexed by allocno, gives the reg number. */
80:
81: static int *allocno_reg;
82:
83: /* A vector of the integers from 0 to max_allocno-1,
84: sorted in the order of first-to-be-allocated first. */
85:
86: static int *allocno_order;
87:
88: /* Indexed by an allocno, gives the number of consecutive
89: hard registers needed by that pseudo reg. */
90:
91: static int *allocno_size;
92:
93: /* Indexed by (pseudo) reg number, gives the number of another
94: lower-numbered pseudo reg which can share a hard reg with this pseudo
95: *even if the two pseudos would otherwise appear to conflict*. */
96:
97: static int *reg_may_share;
98:
99: /* Define the number of bits in each element of `conflicts' and what
100: type that element has. We use the largest integer format on the
101: host machine. */
102:
103: #define INT_BITS HOST_BITS_PER_WIDE_INT
104: #define INT_TYPE HOST_WIDE_INT
105:
106: /* max_allocno by max_allocno array of bits,
107: recording whether two allocno's conflict (can't go in the same
108: hardware register).
109:
110: `conflicts' is not symmetric; a conflict between allocno's i and j
111: is recorded either in element i,j or in element j,i. */
112:
113: static INT_TYPE *conflicts;
114:
115: /* Number of ints require to hold max_allocno bits.
116: This is the length of a row in `conflicts'. */
117:
118: static int allocno_row_words;
119:
120: /* Two macros to test or store 1 in an element of `conflicts'. */
121:
122: #define CONFLICTP(I, J) \
123: (conflicts[(I) * allocno_row_words + (J) / INT_BITS] \
124: & ((INT_TYPE) 1 << ((J) % INT_BITS)))
125:
126: #define SET_CONFLICT(I, J) \
127: (conflicts[(I) * allocno_row_words + (J) / INT_BITS] \
128: |= ((INT_TYPE) 1 << ((J) % INT_BITS)))
129:
130: /* Set of hard regs currently live (during scan of all insns). */
131:
132: static HARD_REG_SET hard_regs_live;
133:
134: /* Indexed by N, set of hard regs conflicting with allocno N. */
135:
136: static HARD_REG_SET *hard_reg_conflicts;
137:
138: /* Indexed by N, set of hard regs preferred by allocno N.
139: This is used to make allocnos go into regs that are copied to or from them,
140: when possible, to reduce register shuffling. */
141:
142: static HARD_REG_SET *hard_reg_preferences;
143:
144: /* Similar, but just counts register preferences made in simple copy
145: operations, rather than arithmetic. These are given priority because
146: we can always eliminate an insn by using these, but using a register
147: in the above list won't always eliminate an insn. */
148:
149: static HARD_REG_SET *hard_reg_copy_preferences;
150:
151: /* Similar to hard_reg_preferences, but includes bits for subsequent
152: registers when an allocno is multi-word. The above variable is used for
153: allocation while this is used to build reg_someone_prefers, below. */
154:
155: static HARD_REG_SET *hard_reg_full_preferences;
156:
157: /* Indexed by N, set of hard registers that some later allocno has a
158: preference for. */
159:
160: static HARD_REG_SET *regs_someone_prefers;
161:
162: /* Set of registers that global-alloc isn't supposed to use. */
163:
164: static HARD_REG_SET no_global_alloc_regs;
165:
166: /* Set of registers used so far. */
167:
168: static HARD_REG_SET regs_used_so_far;
169:
170: /* Number of calls crossed by each allocno. */
171:
172: static int *allocno_calls_crossed;
173:
174: /* Number of refs (weighted) to each allocno. */
175:
176: static int *allocno_n_refs;
177:
178: /* Guess at live length of each allocno.
179: This is actually the max of the live lengths of the regs. */
180:
181: static int *allocno_live_length;
182:
183: /* Number of refs (weighted) to each hard reg, as used by local alloc.
184: It is zero for a reg that contains global pseudos or is explicitly used. */
185:
186: static int local_reg_n_refs[FIRST_PSEUDO_REGISTER];
187:
188: /* Guess at live length of each hard reg, as used by local alloc.
189: This is actually the sum of the live lengths of the specific regs. */
190:
191: static int local_reg_live_length[FIRST_PSEUDO_REGISTER];
192:
193: /* Test a bit in TABLE, a vector of HARD_REG_SETs,
194: for vector element I, and hard register number J. */
195:
196: #define REGBITP(TABLE, I, J) TEST_HARD_REG_BIT (TABLE[I], J)
197:
198: /* Set to 1 a bit in a vector of HARD_REG_SETs. Works like REGBITP. */
199:
200: #define SET_REGBIT(TABLE, I, J) SET_HARD_REG_BIT (TABLE[I], J)
201:
202: /* Bit mask for allocnos live at current point in the scan. */
203:
204: static INT_TYPE *allocnos_live;
205:
206: /* Test, set or clear bit number I in allocnos_live,
207: a bit vector indexed by allocno. */
208:
209: #define ALLOCNO_LIVE_P(I) \
210: (allocnos_live[(I) / INT_BITS] & ((INT_TYPE) 1 << ((I) % INT_BITS)))
211:
212: #define SET_ALLOCNO_LIVE(I) \
213: (allocnos_live[(I) / INT_BITS] |= ((INT_TYPE) 1 << ((I) % INT_BITS)))
214:
215: #define CLEAR_ALLOCNO_LIVE(I) \
216: (allocnos_live[(I) / INT_BITS] &= ~((INT_TYPE) 1 << ((I) % INT_BITS)))
217:
218: /* This is turned off because it doesn't work right for DImode.
219: (And it is only used for DImode, so the other cases are worthless.)
220: The problem is that it isn't true that there is NO possibility of conflict;
221: only that there is no conflict if the two pseudos get the exact same regs.
222: If they were allocated with a partial overlap, there would be a conflict.
223: We can't safely turn off the conflict unless we have another way to
224: prevent the partial overlap.
225:
226: Idea: change hard_reg_conflicts so that instead of recording which
227: hard regs the allocno may not overlap, it records where the allocno
228: may not start. Change both where it is used and where it is updated.
229: Then there is a way to record that (reg:DI 108) may start at 10
230: but not at 9 or 11. There is still the question of how to record
231: this semi-conflict between two pseudos. */
232: #if 0
233: /* Reg pairs for which conflict after the current insn
234: is inhibited by a REG_NO_CONFLICT note.
235: If the table gets full, we ignore any other notes--that is conservative. */
236: #define NUM_NO_CONFLICT_PAIRS 4
237: /* Number of pairs in use in this insn. */
238: int n_no_conflict_pairs;
239: static struct { int allocno1, allocno2;}
240: no_conflict_pairs[NUM_NO_CONFLICT_PAIRS];
241: #endif /* 0 */
242:
243: /* Record all regs that are set in any one insn.
244: Communication from mark_reg_{store,clobber} and global_conflicts. */
245:
246: static rtx *regs_set;
247: static int n_regs_set;
248:
249: /* All register that can be eliminated. */
250:
251: static HARD_REG_SET eliminable_regset;
252:
253: static int allocno_compare ();
254: static void mark_reg_store ();
255: static void mark_reg_clobber ();
256: static void mark_reg_conflicts ();
257: static void mark_reg_live_nc ();
258: static void mark_reg_death ();
259: static void dump_conflicts ();
260: void dump_global_regs ();
261: static void find_reg ();
262: static void global_conflicts ();
263: static void expand_preferences ();
264: static void prune_preferences ();
265: static void record_conflicts ();
266: static void set_preference ();
267:
268: /* Perform allocation of pseudo-registers not allocated by local_alloc.
269: FILE is a file to output debugging information on,
270: or zero if such output is not desired.
271:
272: Return value is nonzero if reload failed
273: and we must not do any more for this function. */
274:
275: int
276: global_alloc (file)
277: FILE *file;
278: {
279: #ifdef ELIMINABLE_REGS
280: static struct {int from, to; } eliminables[] = ELIMINABLE_REGS;
281: #endif
282: register int i;
283: rtx x;
284:
285: max_allocno = 0;
286:
287: /* A machine may have certain hard registers that
288: are safe to use only within a basic block. */
289:
290: CLEAR_HARD_REG_SET (no_global_alloc_regs);
291: #ifdef OVERLAPPING_REGNO_P
292: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
293: if (OVERLAPPING_REGNO_P (i))
294: SET_HARD_REG_BIT (no_global_alloc_regs, i);
295: #endif
296:
297: /* Build the regset of all eliminable registers and show we can't use those
298: that we already know won't be eliminated. */
299: #ifdef ELIMINABLE_REGS
300: for (i = 0; i < sizeof eliminables / sizeof eliminables[0]; i++)
301: {
302: SET_HARD_REG_BIT (eliminable_regset, eliminables[i].from);
303:
304: if (! CAN_ELIMINATE (eliminables[i].from, eliminables[i].to)
305: || (eliminables[i].from == FRAME_POINTER_REGNUM
306: && (! flag_omit_frame_pointer || FRAME_POINTER_REQUIRED)))
307: SET_HARD_REG_BIT (no_global_alloc_regs, eliminables[i].from);
308: }
309: #else
310: SET_HARD_REG_BIT (eliminable_regset, FRAME_POINTER_REGNUM);
311:
312: /* If we know we will definitely not be eliminating the frame pointer,
313: don't allocate it. */
314: if (! flag_omit_frame_pointer || FRAME_POINTER_REQUIRED)
315: SET_HARD_REG_BIT (no_global_alloc_regs, FRAME_POINTER_REGNUM);
316: #endif
317:
318: /* Track which registers have already been used. Start with registers
319: explicitly in the rtl, then registers allocated by local register
320: allocation. */
321:
322: CLEAR_HARD_REG_SET (regs_used_so_far);
323: #ifdef LEAF_REGISTERS
324: /* If we are doing the leaf function optimization, and this is a leaf
325: function, it means that the registers that take work to save are those
326: that need a register window. So prefer the ones that can be used in
327: a leaf function. */
328: {
329: char *cheap_regs;
330: static char leaf_regs[] = LEAF_REGISTERS;
331:
332: if (only_leaf_regs_used () && leaf_function_p ())
333: cheap_regs = leaf_regs;
334: else
335: cheap_regs = call_used_regs;
336: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
337: if (regs_ever_live[i] || cheap_regs[i])
338: SET_HARD_REG_BIT (regs_used_so_far, i);
339: }
340: #else
341: /* We consider registers that do not have to be saved over calls as if
342: they were already used since there is no cost in using them. */
343: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
344: if (regs_ever_live[i] || call_used_regs[i])
345: SET_HARD_REG_BIT (regs_used_so_far, i);
346: #endif
347:
348: for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
349: if (reg_renumber[i] >= 0)
350: SET_HARD_REG_BIT (regs_used_so_far, reg_renumber[i]);
351:
352: /* Establish mappings from register number to allocation number
353: and vice versa. In the process, count the allocnos. */
354:
355: reg_allocno = (int *) alloca (max_regno * sizeof (int));
356:
357: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
358: reg_allocno[i] = -1;
359:
360: /* Initialize the shared-hard-reg mapping
361: from the list of pairs that may share. */
362: reg_may_share = (int *) alloca (max_regno * sizeof (int));
363: bzero (reg_may_share, max_regno * sizeof (int));
364: for (x = regs_may_share; x; x = XEXP (XEXP (x, 1), 1))
365: {
366: int r1 = REGNO (XEXP (x, 0));
367: int r2 = REGNO (XEXP (XEXP (x, 1), 0));
368: if (r1 > r2)
369: reg_may_share[r1] = r2;
370: else
371: reg_may_share[r2] = r1;
372: }
373:
374: for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
375: /* Note that reg_live_length[i] < 0 indicates a "constant" reg
376: that we are supposed to refrain from putting in a hard reg.
377: -2 means do make an allocno but don't allocate it. */
378: if (reg_n_refs[i] != 0 && reg_renumber[i] < 0 && reg_live_length[i] != -1
379: /* Don't allocate pseudos that cross calls,
380: if this function receives a nonlocal goto. */
381: && (! current_function_has_nonlocal_label
382: || reg_n_calls_crossed[i] == 0))
383: {
384: if (reg_may_share[i] && reg_allocno[reg_may_share[i]] >= 0)
385: reg_allocno[i] = reg_allocno[reg_may_share[i]];
386: else
387: reg_allocno[i] = max_allocno++;
388: if (reg_live_length[i] == 0)
389: abort ();
390: }
391: else
392: reg_allocno[i] = -1;
393:
394: allocno_reg = (int *) alloca (max_allocno * sizeof (int));
395: allocno_size = (int *) alloca (max_allocno * sizeof (int));
396: allocno_calls_crossed = (int *) alloca (max_allocno * sizeof (int));
397: allocno_n_refs = (int *) alloca (max_allocno * sizeof (int));
398: allocno_live_length = (int *) alloca (max_allocno * sizeof (int));
399: bzero (allocno_size, max_allocno * sizeof (int));
400: bzero (allocno_calls_crossed, max_allocno * sizeof (int));
401: bzero (allocno_n_refs, max_allocno * sizeof (int));
402: bzero (allocno_live_length, max_allocno * sizeof (int));
403:
404: for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
405: if (reg_allocno[i] >= 0)
406: {
407: int allocno = reg_allocno[i];
408: allocno_reg[allocno] = i;
409: allocno_size[allocno] = PSEUDO_REGNO_SIZE (i);
410: allocno_calls_crossed[allocno] += reg_n_calls_crossed[i];
411: allocno_n_refs[allocno] += reg_n_refs[i];
412: if (allocno_live_length[allocno] < reg_live_length[i])
413: allocno_live_length[allocno] = reg_live_length[i];
414: }
415:
416: /* Calculate amount of usage of each hard reg by pseudos
417: allocated by local-alloc. This is to see if we want to
418: override it. */
419: bzero (local_reg_live_length, sizeof local_reg_live_length);
420: bzero (local_reg_n_refs, sizeof local_reg_n_refs);
421: for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
422: if (reg_allocno[i] < 0 && reg_renumber[i] >= 0)
423: {
424: int regno = reg_renumber[i];
425: int endregno = regno + HARD_REGNO_NREGS (regno, PSEUDO_REGNO_MODE (i));
426: int j;
427:
428: for (j = regno; j < endregno; j++)
429: {
430: local_reg_n_refs[j] += reg_n_refs[i];
431: local_reg_live_length[j] += reg_live_length[i];
432: }
433: }
434:
435: /* We can't override local-alloc for a reg used not just by local-alloc. */
436: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
437: if (regs_ever_live[i])
438: local_reg_n_refs[i] = 0;
439:
440: /* Allocate the space for the conflict and preference tables and
441: initialize them. */
442:
443: hard_reg_conflicts
444: = (HARD_REG_SET *) alloca (max_allocno * sizeof (HARD_REG_SET));
445: bzero (hard_reg_conflicts, max_allocno * sizeof (HARD_REG_SET));
446:
447: hard_reg_preferences
448: = (HARD_REG_SET *) alloca (max_allocno * sizeof (HARD_REG_SET));
449: bzero (hard_reg_preferences, max_allocno * sizeof (HARD_REG_SET));
450:
451: hard_reg_copy_preferences
452: = (HARD_REG_SET *) alloca (max_allocno * sizeof (HARD_REG_SET));
453: bzero (hard_reg_copy_preferences, max_allocno * sizeof (HARD_REG_SET));
454:
455: hard_reg_full_preferences
456: = (HARD_REG_SET *) alloca (max_allocno * sizeof (HARD_REG_SET));
457: bzero (hard_reg_full_preferences, max_allocno * sizeof (HARD_REG_SET));
458:
459: regs_someone_prefers
460: = (HARD_REG_SET *) alloca (max_allocno * sizeof (HARD_REG_SET));
461: bzero (regs_someone_prefers, max_allocno * sizeof (HARD_REG_SET));
462:
463: allocno_row_words = (max_allocno + INT_BITS - 1) / INT_BITS;
464:
465: conflicts = (INT_TYPE *) alloca (max_allocno * allocno_row_words
466: * sizeof (INT_TYPE));
467: bzero (conflicts, max_allocno * allocno_row_words
468: * sizeof (INT_TYPE));
469:
470: allocnos_live = (INT_TYPE *) alloca (allocno_row_words * sizeof (INT_TYPE));
471:
472: /* If there is work to be done (at least one reg to allocate),
473: perform global conflict analysis and allocate the regs. */
474:
475: if (max_allocno > 0)
476: {
477: /* Scan all the insns and compute the conflicts among allocnos
478: and between allocnos and hard regs. */
479:
480: global_conflicts ();
481:
482: /* Eliminate conflicts between pseudos and eliminable registers. If
483: the register is not eliminated, the pseudo won't really be able to
484: live in the eliminable register, so the conflict doesn't matter.
485: If we do eliminate the register, the conflict will no longer exist.
486: So in either case, we can ignore the conflict. Likewise for
487: preferences. */
488:
489: for (i = 0; i < max_allocno; i++)
490: {
491: AND_COMPL_HARD_REG_SET (hard_reg_conflicts[i], eliminable_regset);
492: AND_COMPL_HARD_REG_SET (hard_reg_copy_preferences[i],
493: eliminable_regset);
494: AND_COMPL_HARD_REG_SET (hard_reg_preferences[i], eliminable_regset);
495: }
496:
497: /* Try to expand the preferences by merging them between allocnos. */
498:
499: expand_preferences ();
500:
501: /* Determine the order to allocate the remaining pseudo registers. */
502:
503: allocno_order = (int *) alloca (max_allocno * sizeof (int));
504: for (i = 0; i < max_allocno; i++)
505: allocno_order[i] = i;
506:
507: /* Default the size to 1, since allocno_compare uses it to divide by.
508: Also convert allocno_live_length of zero to -1. A length of zero
509: can occur when all the registers for that allocno have reg_live_length
510: equal to -2. In this case, we want to make an allocno, but not
511: allocate it. So avoid the divide-by-zero and set it to a low
512: priority. */
513:
514: for (i = 0; i < max_allocno; i++)
515: {
516: if (allocno_size[i] == 0)
517: allocno_size[i] = 1;
518: if (allocno_live_length[i] == 0)
519: allocno_live_length[i] = -1;
520: }
521:
522: qsort (allocno_order, max_allocno, sizeof (int), allocno_compare);
523:
524: prune_preferences ();
525:
526: if (file)
527: dump_conflicts (file);
528:
529: /* Try allocating them, one by one, in that order,
530: except for parameters marked with reg_live_length[regno] == -2. */
531:
532: for (i = 0; i < max_allocno; i++)
533: if (reg_live_length[allocno_reg[allocno_order[i]]] >= 0)
534: {
535: /* If we have more than one register class,
536: first try allocating in the class that is cheapest
537: for this pseudo-reg. If that fails, try any reg. */
538: if (N_REG_CLASSES > 1)
539: {
540: find_reg (allocno_order[i], HARD_CONST (0), 0, 0, 0);
541: if (reg_renumber[allocno_reg[allocno_order[i]]] >= 0)
542: continue;
543: }
544: if (reg_alternate_class (allocno_reg[allocno_order[i]]) != NO_REGS)
545: find_reg (allocno_order[i], HARD_CONST (0), 1, 0, 0);
546: }
547: }
548:
549: /* Do the reloads now while the allocno data still exist, so that we can
550: try to assign new hard regs to any pseudo regs that are spilled. */
551:
552: #if 0 /* We need to eliminate regs even if there is no rtl code,
553: for the sake of debugging information. */
554: if (n_basic_blocks > 0)
555: #endif
556: return reload (get_insns (), 1, file);
557: }
558:
559: /* Sort predicate for ordering the allocnos.
560: Returns -1 (1) if *v1 should be allocated before (after) *v2. */
561:
562: static int
563: allocno_compare (v1, v2)
564: int *v1, *v2;
565: {
566: /* Note that the quotient will never be bigger than
567: the value of floor_log2 times the maximum number of
568: times a register can occur in one insn (surely less than 100).
569: Multiplying this by 10000 can't overflow. */
570: register int pri1
571: = (((double) (floor_log2 (allocno_n_refs[*v1]) * allocno_n_refs[*v1])
572: / (allocno_live_length[*v1] * allocno_size[*v1]))
573: * 10000);
574: register int pri2
575: = (((double) (floor_log2 (allocno_n_refs[*v2]) * allocno_n_refs[*v2])
576: / (allocno_live_length[*v2] * allocno_size[*v2]))
577: * 10000);
578: if (pri2 - pri1)
579: return pri2 - pri1;
580:
581: /* If regs are equally good, sort by allocno,
582: so that the results of qsort leave nothing to chance. */
583: return *v1 - *v2;
584: }
585:
586: /* Scan the rtl code and record all conflicts and register preferences in the
587: conflict matrices and preference tables. */
588:
589: static void
590: global_conflicts ()
591: {
592: register int b, i;
593: register rtx insn;
594: short *block_start_allocnos;
595:
596: /* Make a vector that mark_reg_{store,clobber} will store in. */
597: regs_set = (rtx *) alloca (max_parallel * sizeof (rtx) * 2);
598:
599: block_start_allocnos = (short *) alloca (max_allocno * sizeof (short));
600:
601: for (b = 0; b < n_basic_blocks; b++)
602: {
603: bzero (allocnos_live, allocno_row_words * sizeof (INT_TYPE));
604:
605: /* Initialize table of registers currently live
606: to the state at the beginning of this basic block.
607: This also marks the conflicts among them.
608:
609: For pseudo-regs, there is only one bit for each one
610: no matter how many hard regs it occupies.
611: This is ok; we know the size from PSEUDO_REGNO_SIZE.
612: For explicit hard regs, we cannot know the size that way
613: since one hard reg can be used with various sizes.
614: Therefore, we must require that all the hard regs
615: implicitly live as part of a multi-word hard reg
616: are explicitly marked in basic_block_live_at_start. */
617:
618: {
619: register int offset;
620: REGSET_ELT_TYPE bit;
621: register regset old = basic_block_live_at_start[b];
622: int ax = 0;
623:
624: #ifdef HARD_REG_SET
625: hard_regs_live = old[0];
626: #else
627: COPY_HARD_REG_SET (hard_regs_live, old);
628: #endif
629: for (offset = 0, i = 0; offset < regset_size; offset++)
630: if (old[offset] == 0)
631: i += REGSET_ELT_BITS;
632: else
633: for (bit = 1; bit; bit <<= 1, i++)
634: {
635: if (i >= max_regno)
636: break;
637: if (old[offset] & bit)
638: {
639: register int a = reg_allocno[i];
640: if (a >= 0)
641: {
642: SET_ALLOCNO_LIVE (a);
643: block_start_allocnos[ax++] = a;
644: }
645: else if ((a = reg_renumber[i]) >= 0)
646: mark_reg_live_nc (a, PSEUDO_REGNO_MODE (i));
647: }
648: }
649:
650: /* Record that each allocno now live conflicts with each other
651: allocno now live, and with each hard reg now live. */
652:
653: record_conflicts (block_start_allocnos, ax);
654: }
655:
656: insn = basic_block_head[b];
657:
658: /* Scan the code of this basic block, noting which allocnos
659: and hard regs are born or die. When one is born,
660: record a conflict with all others currently live. */
661:
662: while (1)
663: {
664: register RTX_CODE code = GET_CODE (insn);
665: register rtx link;
666:
667: /* Make regs_set an empty set. */
668:
669: n_regs_set = 0;
670:
671: if (code == INSN || code == CALL_INSN || code == JUMP_INSN)
672: {
673: int i = 0;
674:
675: #if 0
676: for (link = REG_NOTES (insn);
677: link && i < NUM_NO_CONFLICT_PAIRS;
678: link = XEXP (link, 1))
679: if (REG_NOTE_KIND (link) == REG_NO_CONFLICT)
680: {
681: no_conflict_pairs[i].allocno1
682: = reg_allocno[REGNO (SET_DEST (PATTERN (insn)))];
683: no_conflict_pairs[i].allocno2
684: = reg_allocno[REGNO (XEXP (link, 0))];
685: i++;
686: }
687: #endif /* 0 */
688:
689: /* Mark any registers clobbered by INSN as live,
690: so they conflict with the inputs. */
691:
692: note_stores (PATTERN (insn), mark_reg_clobber);
693:
694: /* Mark any registers dead after INSN as dead now. */
695:
696: for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
697: if (REG_NOTE_KIND (link) == REG_DEAD)
698: mark_reg_death (XEXP (link, 0));
699:
700: /* Mark any registers set in INSN as live,
701: and mark them as conflicting with all other live regs.
702: Clobbers are processed again, so they conflict with
703: the registers that are set. */
704:
705: note_stores (PATTERN (insn), mark_reg_store);
706:
707: #ifdef AUTO_INC_DEC
708: for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
709: if (REG_NOTE_KIND (link) == REG_INC)
710: mark_reg_store (XEXP (link, 0), NULL_RTX);
711: #endif
712:
713: /* If INSN has multiple outputs, then any reg that dies here
714: and is used inside of an output
715: must conflict with the other outputs. */
716:
717: if (GET_CODE (PATTERN (insn)) == PARALLEL && !single_set (insn))
718: for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
719: if (REG_NOTE_KIND (link) == REG_DEAD)
720: {
721: int used_in_output = 0;
722: int i;
723: rtx reg = XEXP (link, 0);
724:
725: for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
726: {
727: rtx set = XVECEXP (PATTERN (insn), 0, i);
728: if (GET_CODE (set) == SET
729: && GET_CODE (SET_DEST (set)) != REG
730: && !rtx_equal_p (reg, SET_DEST (set))
731: && reg_overlap_mentioned_p (reg, SET_DEST (set)))
732: used_in_output = 1;
733: }
734: if (used_in_output)
735: mark_reg_conflicts (reg);
736: }
737:
738: /* Mark any registers set in INSN and then never used. */
739:
740: while (n_regs_set > 0)
741: if (find_regno_note (insn, REG_UNUSED,
742: REGNO (regs_set[--n_regs_set])))
743: mark_reg_death (regs_set[n_regs_set]);
744: }
745:
746: if (insn == basic_block_end[b])
747: break;
748: insn = NEXT_INSN (insn);
749: }
750: }
751: }
752: /* Expand the preference information by looking for cases where one allocno
753: dies in an insn that sets an allocno. If those two allocnos don't conflict,
754: merge any preferences between those allocnos. */
755:
756: static void
757: expand_preferences ()
758: {
759: rtx insn;
760: rtx link;
761: rtx set;
762:
763: /* We only try to handle the most common cases here. Most of the cases
764: where this wins are reg-reg copies. */
765:
766: for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
767: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
768: && (set = single_set (insn)) != 0
769: && GET_CODE (SET_DEST (set)) == REG
770: && reg_allocno[REGNO (SET_DEST (set))] >= 0)
771: for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
772: if (REG_NOTE_KIND (link) == REG_DEAD
773: && GET_CODE (XEXP (link, 0)) == REG
774: && reg_allocno[REGNO (XEXP (link, 0))] >= 0
775: && ! CONFLICTP (reg_allocno[REGNO (SET_DEST (set))],
776: reg_allocno[REGNO (XEXP (link, 0))])
777: && ! CONFLICTP (reg_allocno[REGNO (XEXP (link, 0))],
778: reg_allocno[REGNO (SET_DEST (set))]))
779: {
780: int a1 = reg_allocno[REGNO (SET_DEST (set))];
781: int a2 = reg_allocno[REGNO (XEXP (link, 0))];
782:
783: if (XEXP (link, 0) == SET_SRC (set))
784: {
785: IOR_HARD_REG_SET (hard_reg_copy_preferences[a1],
786: hard_reg_copy_preferences[a2]);
787: IOR_HARD_REG_SET (hard_reg_copy_preferences[a2],
788: hard_reg_copy_preferences[a1]);
789: }
790:
791: IOR_HARD_REG_SET (hard_reg_preferences[a1],
792: hard_reg_preferences[a2]);
793: IOR_HARD_REG_SET (hard_reg_preferences[a2],
794: hard_reg_preferences[a1]);
795: IOR_HARD_REG_SET (hard_reg_full_preferences[a1],
796: hard_reg_full_preferences[a2]);
797: IOR_HARD_REG_SET (hard_reg_full_preferences[a2],
798: hard_reg_full_preferences[a1]);
799: }
800: }
801:
802: /* Prune the preferences for global registers to exclude registers that cannot
803: be used.
804:
805: Compute `regs_someone_prefers', which is a bitmask of the hard registers
806: that are preferred by conflicting registers of lower priority. If possible,
807: we will avoid using these registers. */
808:
809: static void
810: prune_preferences ()
811: {
812: int i, j;
813: int allocno;
814:
815: /* Scan least most important to most important.
816: For each allocno, remove from preferences registers that cannot be used,
817: either because of conflicts or register type. Then compute all registers
818: preferred by each lower-priority register that conflicts. */
819:
820: for (i = max_allocno - 1; i >= 0; i--)
821: {
822: HARD_REG_SET temp;
823:
824: allocno = allocno_order[i];
825: COPY_HARD_REG_SET (temp, hard_reg_conflicts[allocno]);
826:
827: if (allocno_calls_crossed[allocno] == 0)
828: IOR_HARD_REG_SET (temp, fixed_reg_set);
829: else
830: IOR_HARD_REG_SET (temp, call_used_reg_set);
831:
832: IOR_COMPL_HARD_REG_SET
833: (temp,
834: reg_class_contents[(int) reg_preferred_class (allocno_reg[allocno])]);
835:
836: AND_COMPL_HARD_REG_SET (hard_reg_preferences[allocno], temp);
837: AND_COMPL_HARD_REG_SET (hard_reg_copy_preferences[allocno], temp);
838: AND_COMPL_HARD_REG_SET (hard_reg_full_preferences[allocno], temp);
839:
840: CLEAR_HARD_REG_SET (regs_someone_prefers[allocno]);
841:
842: /* Merge in the preferences of lower-priority registers (they have
843: already been pruned). If we also prefer some of those registers,
844: don't exclude them unless we are of a smaller size (in which case
845: we want to give the lower-priority allocno the first chance for
846: these registers). */
847: for (j = i + 1; j < max_allocno; j++)
848: if (CONFLICTP (allocno, allocno_order[j]))
849: {
850: COPY_HARD_REG_SET (temp,
851: hard_reg_full_preferences[allocno_order[j]]);
852: if (allocno_size[allocno_order[j]] <= allocno_size[allocno])
853: AND_COMPL_HARD_REG_SET (temp,
854: hard_reg_full_preferences[allocno]);
855:
856: IOR_HARD_REG_SET (regs_someone_prefers[allocno], temp);
857: }
858: }
859: }
860:
861: /* Assign a hard register to ALLOCNO; look for one that is the beginning
862: of a long enough stretch of hard regs none of which conflicts with ALLOCNO.
863: The registers marked in PREFREGS are tried first.
864:
865: LOSERS, if non-zero, is a HARD_REG_SET indicating registers that cannot
866: be used for this allocation.
867:
868: If ALT_REGS_P is zero, consider only the preferred class of ALLOCNO's reg.
869: Otherwise ignore that preferred class and use the alternate class.
870:
871: If ACCEPT_CALL_CLOBBERED is nonzero, accept a call-clobbered hard reg that
872: will have to be saved and restored at calls.
873:
874: RETRYING is nonzero if this is called from retry_global_alloc.
875:
876: If we find one, record it in reg_renumber.
877: If not, do nothing. */
878:
879: static void
880: find_reg (allocno, losers, alt_regs_p, accept_call_clobbered, retrying)
881: int allocno;
882: HARD_REG_SET losers;
883: int alt_regs_p;
884: int accept_call_clobbered;
885: int retrying;
886: {
887: register int i, best_reg, pass;
888: #ifdef HARD_REG_SET
889: register /* Declare it register if it's a scalar. */
890: #endif
891: HARD_REG_SET used, used1, used2;
892:
893: enum reg_class class = (alt_regs_p
894: ? reg_alternate_class (allocno_reg[allocno])
895: : reg_preferred_class (allocno_reg[allocno]));
896: enum machine_mode mode = PSEUDO_REGNO_MODE (allocno_reg[allocno]);
897:
898: if (accept_call_clobbered)
899: COPY_HARD_REG_SET (used1, call_fixed_reg_set);
900: else if (allocno_calls_crossed[allocno] == 0)
901: COPY_HARD_REG_SET (used1, fixed_reg_set);
902: else
903: COPY_HARD_REG_SET (used1, call_used_reg_set);
904:
905: /* Some registers should not be allocated in global-alloc. */
906: IOR_HARD_REG_SET (used1, no_global_alloc_regs);
907: if (losers)
908: IOR_HARD_REG_SET (used1, losers);
909:
910: IOR_COMPL_HARD_REG_SET (used1, reg_class_contents[(int) class]);
911: COPY_HARD_REG_SET (used2, used1);
912:
913: IOR_HARD_REG_SET (used1, hard_reg_conflicts[allocno]);
914:
915: /* Try each hard reg to see if it fits. Do this in two passes.
916: In the first pass, skip registers that are preferred by some other pseudo
917: to give it a better chance of getting one of those registers. Only if
918: we can't get a register when excluding those do we take one of them.
919: However, we never allocate a register for the first time in pass 0. */
920:
921: COPY_HARD_REG_SET (used, used1);
922: IOR_COMPL_HARD_REG_SET (used, regs_used_so_far);
923: IOR_HARD_REG_SET (used, regs_someone_prefers[allocno]);
924:
925: best_reg = -1;
926: for (i = FIRST_PSEUDO_REGISTER, pass = 0;
927: pass <= 1 && i >= FIRST_PSEUDO_REGISTER;
928: pass++)
929: {
930: if (pass == 1)
931: COPY_HARD_REG_SET (used, used1);
932: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
933: {
934: #ifdef REG_ALLOC_ORDER
935: int regno = reg_alloc_order[i];
936: #else
937: int regno = i;
938: #endif
939: if (! TEST_HARD_REG_BIT (used, regno)
940: && HARD_REGNO_MODE_OK (regno, mode))
941: {
942: register int j;
943: register int lim = regno + HARD_REGNO_NREGS (regno, mode);
944: for (j = regno + 1;
945: (j < lim
946: && ! TEST_HARD_REG_BIT (used, j));
947: j++);
948: if (j == lim)
949: {
950: best_reg = regno;
951: break;
952: }
953: #ifndef REG_ALLOC_ORDER
954: i = j; /* Skip starting points we know will lose */
955: #endif
956: }
957: }
958: }
959:
960: /* See if there is a preferred register with the same class as the register
961: we allocated above. Making this restriction prevents register
962: preferencing from creating worse register allocation.
963:
964: Remove from the preferred registers and conflicting registers. Note that
965: additional conflicts may have been added after `prune_preferences' was
966: called.
967:
968: First do this for those register with copy preferences, then all
969: preferred registers. */
970:
971: AND_COMPL_HARD_REG_SET (hard_reg_copy_preferences[allocno], used);
972: GO_IF_HARD_REG_SUBSET (hard_reg_copy_preferences[allocno],
973: reg_class_contents[(int) NO_REGS], no_copy_prefs);
974:
975: if (best_reg >= 0)
976: {
977: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
978: if (TEST_HARD_REG_BIT (hard_reg_copy_preferences[allocno], i)
979: && HARD_REGNO_MODE_OK (i, mode)
980: && (REGNO_REG_CLASS (i) == REGNO_REG_CLASS (best_reg)
981: || reg_class_subset_p (REGNO_REG_CLASS (i),
982: REGNO_REG_CLASS (best_reg))
983: || reg_class_subset_p (REGNO_REG_CLASS (best_reg),
984: REGNO_REG_CLASS (i))))
985: {
986: register int j;
987: register int lim = i + HARD_REGNO_NREGS (i, mode);
988: for (j = i + 1;
989: (j < lim
990: && ! TEST_HARD_REG_BIT (used, j)
991: && (REGNO_REG_CLASS (j)
992: == REGNO_REG_CLASS (best_reg + (j - i))
993: || reg_class_subset_p (REGNO_REG_CLASS (j),
994: REGNO_REG_CLASS (best_reg + (j - i)))
995: || reg_class_subset_p (REGNO_REG_CLASS (best_reg + (j - i)),
996: REGNO_REG_CLASS (j))));
997: j++);
998: if (j == lim)
999: {
1000: best_reg = i;
1001: goto no_prefs;
1002: }
1003: }
1004: }
1005: no_copy_prefs:
1006:
1007: AND_COMPL_HARD_REG_SET (hard_reg_preferences[allocno], used);
1008: GO_IF_HARD_REG_SUBSET (hard_reg_preferences[allocno],
1009: reg_class_contents[(int) NO_REGS], no_prefs);
1010:
1011: if (best_reg >= 0)
1012: {
1013: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1014: if (TEST_HARD_REG_BIT (hard_reg_preferences[allocno], i)
1015: && HARD_REGNO_MODE_OK (i, mode)
1016: && (REGNO_REG_CLASS (i) == REGNO_REG_CLASS (best_reg)
1017: || reg_class_subset_p (REGNO_REG_CLASS (i),
1018: REGNO_REG_CLASS (best_reg))
1019: || reg_class_subset_p (REGNO_REG_CLASS (best_reg),
1020: REGNO_REG_CLASS (i))))
1021: {
1022: register int j;
1023: register int lim = i + HARD_REGNO_NREGS (i, mode);
1024: for (j = i + 1;
1025: (j < lim
1026: && ! TEST_HARD_REG_BIT (used, j)
1027: && (REGNO_REG_CLASS (j)
1028: == REGNO_REG_CLASS (best_reg + (j - i))
1029: || reg_class_subset_p (REGNO_REG_CLASS (j),
1030: REGNO_REG_CLASS (best_reg + (j - i)))
1031: || reg_class_subset_p (REGNO_REG_CLASS (best_reg + (j - i)),
1032: REGNO_REG_CLASS (j))));
1033: j++);
1034: if (j == lim)
1035: {
1036: best_reg = i;
1037: break;
1038: }
1039: }
1040: }
1041: no_prefs:
1042:
1043: /* If we haven't succeeded yet, try with caller-saves. */
1044: if (flag_caller_saves && best_reg < 0)
1045: {
1046: /* Did not find a register. If it would be profitable to
1047: allocate a call-clobbered register and save and restore it
1048: around calls, do that. */
1049: if (! accept_call_clobbered
1050: && allocno_calls_crossed[allocno] != 0
1051: && CALLER_SAVE_PROFITABLE (allocno_n_refs[allocno],
1052: allocno_calls_crossed[allocno]))
1053: {
1054: find_reg (allocno, losers, alt_regs_p, 1, retrying);
1055: if (reg_renumber[allocno_reg[allocno]] >= 0)
1056: {
1057: caller_save_needed = 1;
1058: return;
1059: }
1060: }
1061: }
1062:
1063: /* If we haven't succeeded yet,
1064: see if some hard reg that conflicts with us
1065: was utilized poorly by local-alloc.
1066: If so, kick out the regs that were put there by local-alloc
1067: so we can use it instead. */
1068: if (best_reg < 0 && !retrying
1069: /* Let's not bother with multi-reg allocnos. */
1070: && allocno_size[allocno] == 1)
1071: {
1072: /* Count from the end, to find the least-used ones first. */
1073: for (i = FIRST_PSEUDO_REGISTER - 1; i >= 0; i--)
1074: if (local_reg_n_refs[i] != 0
1075: /* Don't use a reg no good for this pseudo. */
1076: && ! TEST_HARD_REG_BIT (used2, i)
1077: && HARD_REGNO_MODE_OK (i, mode)
1078: && ((double) local_reg_n_refs[i] / local_reg_live_length[i]
1079: < ((double) allocno_n_refs[allocno]
1080: / allocno_live_length[allocno])))
1081: {
1082: /* Hard reg I was used less in total by local regs
1083: than it would be used by this one allocno! */
1084: int k;
1085: for (k = 0; k < max_regno; k++)
1086: if (reg_renumber[k] >= 0)
1087: {
1088: int regno = reg_renumber[k];
1089: int endregno
1090: = regno + HARD_REGNO_NREGS (regno, PSEUDO_REGNO_MODE (k));
1091:
1092: if (i >= regno && i < endregno)
1093: reg_renumber[k] = -1;
1094: }
1095:
1096: best_reg = i;
1097: break;
1098: }
1099: }
1100:
1101: /* Did we find a register? */
1102:
1103: if (best_reg >= 0)
1104: {
1105: register int lim, j;
1106: HARD_REG_SET this_reg;
1107:
1108: /* Yes. Record it as the hard register of this pseudo-reg. */
1109: reg_renumber[allocno_reg[allocno]] = best_reg;
1110: /* Also of any pseudo-regs that share with it. */
1111: if (reg_may_share[allocno_reg[allocno]])
1112: for (j = FIRST_PSEUDO_REGISTER; j < max_regno; j++)
1113: if (reg_allocno[j] == allocno)
1114: reg_renumber[j] = best_reg;
1115:
1116: /* Make a set of the hard regs being allocated. */
1117: CLEAR_HARD_REG_SET (this_reg);
1118: lim = best_reg + HARD_REGNO_NREGS (best_reg, mode);
1119: for (j = best_reg; j < lim; j++)
1120: {
1121: SET_HARD_REG_BIT (this_reg, j);
1122: SET_HARD_REG_BIT (regs_used_so_far, j);
1123: /* This is no longer a reg used just by local regs. */
1124: local_reg_n_refs[j] = 0;
1125: }
1126: /* For each other pseudo-reg conflicting with this one,
1127: mark it as conflicting with the hard regs this one occupies. */
1128: lim = allocno;
1129: for (j = 0; j < max_allocno; j++)
1130: if (CONFLICTP (lim, j) || CONFLICTP (j, lim))
1131: {
1132: IOR_HARD_REG_SET (hard_reg_conflicts[j], this_reg);
1133: }
1134: }
1135: }
1136:
1137: /* Called from `reload' to look for a hard reg to put pseudo reg REGNO in.
1138: Perhaps it had previously seemed not worth a hard reg,
1139: or perhaps its old hard reg has been commandeered for reloads.
1140: FORBIDDEN_REGS indicates certain hard regs that may not be used, even if
1141: they do not appear to be allocated.
1142: If FORBIDDEN_REGS is zero, no regs are forbidden. */
1143:
1144: void
1145: retry_global_alloc (regno, forbidden_regs)
1146: int regno;
1147: HARD_REG_SET forbidden_regs;
1148: {
1149: int allocno = reg_allocno[regno];
1150: if (allocno >= 0)
1151: {
1152: /* If we have more than one register class,
1153: first try allocating in the class that is cheapest
1154: for this pseudo-reg. If that fails, try any reg. */
1155: if (N_REG_CLASSES > 1)
1156: find_reg (allocno, forbidden_regs, 0, 0, 1);
1157: if (reg_renumber[regno] < 0
1158: && reg_alternate_class (regno) != NO_REGS)
1159: find_reg (allocno, forbidden_regs, 1, 0, 1);
1160:
1161: /* If we found a register, modify the RTL for the register to
1162: show the hard register, and mark that register live. */
1163: if (reg_renumber[regno] >= 0)
1164: {
1165: REGNO (regno_reg_rtx[regno]) = reg_renumber[regno];
1166: mark_home_live (regno);
1167: }
1168: }
1169: }
1170:
1171: /* Record a conflict between register REGNO
1172: and everything currently live.
1173: REGNO must not be a pseudo reg that was allocated
1174: by local_alloc; such numbers must be translated through
1175: reg_renumber before calling here. */
1176:
1177: static void
1178: record_one_conflict (regno)
1179: int regno;
1180: {
1181: register int j;
1182:
1183: if (regno < FIRST_PSEUDO_REGISTER)
1184: /* When a hard register becomes live,
1185: record conflicts with live pseudo regs. */
1186: for (j = 0; j < max_allocno; j++)
1187: {
1188: if (ALLOCNO_LIVE_P (j))
1189: SET_HARD_REG_BIT (hard_reg_conflicts[j], regno);
1190: }
1191: else
1192: /* When a pseudo-register becomes live,
1193: record conflicts first with hard regs,
1194: then with other pseudo regs. */
1195: {
1196: register int ialloc = reg_allocno[regno];
1197: register int ialloc_prod = ialloc * allocno_row_words;
1198: IOR_HARD_REG_SET (hard_reg_conflicts[ialloc], hard_regs_live);
1199: for (j = allocno_row_words - 1; j >= 0; j--)
1200: {
1201: #if 0
1202: int k;
1203: for (k = 0; k < n_no_conflict_pairs; k++)
1204: if (! ((j == no_conflict_pairs[k].allocno1
1205: && ialloc == no_conflict_pairs[k].allocno2)
1206: ||
1207: (j == no_conflict_pairs[k].allocno2
1208: && ialloc == no_conflict_pairs[k].allocno1)))
1209: #endif /* 0 */
1210: conflicts[ialloc_prod + j] |= allocnos_live[j];
1211: }
1212: }
1213: }
1214:
1215: /* Record all allocnos currently live as conflicting
1216: with each other and with all hard regs currently live.
1217: ALLOCNO_VEC is a vector of LEN allocnos, all allocnos that
1218: are currently live. Their bits are also flagged in allocnos_live. */
1219:
1220: static void
1221: record_conflicts (allocno_vec, len)
1222: register short *allocno_vec;
1223: register int len;
1224: {
1225: register int allocno;
1226: register int j;
1227: register int ialloc_prod;
1228:
1229: while (--len >= 0)
1230: {
1231: allocno = allocno_vec[len];
1232: ialloc_prod = allocno * allocno_row_words;
1233: IOR_HARD_REG_SET (hard_reg_conflicts[allocno], hard_regs_live);
1234: for (j = allocno_row_words - 1; j >= 0; j--)
1235: conflicts[ialloc_prod + j] |= allocnos_live[j];
1236: }
1237: }
1238:
1239: /* Handle the case where REG is set by the insn being scanned,
1240: during the forward scan to accumulate conflicts.
1241: Store a 1 in regs_live or allocnos_live for this register, record how many
1242: consecutive hardware registers it actually needs,
1243: and record a conflict with all other registers already live.
1244:
1245: Note that even if REG does not remain alive after this insn,
1246: we must mark it here as live, to ensure a conflict between
1247: REG and any other regs set in this insn that really do live.
1248: This is because those other regs could be considered after this.
1249:
1250: REG might actually be something other than a register;
1251: if so, we do nothing.
1252:
1253: SETTER is 0 if this register was modified by an auto-increment (i.e.,
1254: a REG_INC note was found for it).
1255:
1256: CLOBBERs are processed here by calling mark_reg_clobber. */
1257:
1258: static void
1259: mark_reg_store (orig_reg, setter)
1260: rtx orig_reg, setter;
1261: {
1262: register int regno;
1263: register rtx reg = orig_reg;
1264:
1265: /* WORD is which word of a multi-register group is being stored.
1266: For the case where the store is actually into a SUBREG of REG.
1267: Except we don't use it; I believe the entire REG needs to be
1268: made live. */
1269: int word = 0;
1270:
1271: if (GET_CODE (reg) == SUBREG)
1272: {
1273: word = SUBREG_WORD (reg);
1274: reg = SUBREG_REG (reg);
1275: }
1276:
1277: if (GET_CODE (reg) != REG)
1278: return;
1279:
1280: if (setter && GET_CODE (setter) == CLOBBER)
1281: {
1282: /* A clobber of a register should be processed here too. */
1283: mark_reg_clobber (orig_reg, setter);
1284: return;
1285: }
1286:
1287: regs_set[n_regs_set++] = reg;
1288:
1289: if (setter)
1290: set_preference (reg, SET_SRC (setter));
1291:
1292: regno = REGNO (reg);
1293:
1294: if (reg_renumber[regno] >= 0)
1295: regno = reg_renumber[regno] /* + word */;
1296:
1297: /* Either this is one of the max_allocno pseudo regs not allocated,
1298: or it is or has a hardware reg. First handle the pseudo-regs. */
1299: if (regno >= FIRST_PSEUDO_REGISTER)
1300: {
1301: if (reg_allocno[regno] >= 0)
1302: {
1303: SET_ALLOCNO_LIVE (reg_allocno[regno]);
1304: record_one_conflict (regno);
1305: }
1306: }
1307: /* Handle hardware regs (and pseudos allocated to hard regs). */
1308: else if (! fixed_regs[regno])
1309: {
1310: register int last = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg));
1311: while (regno < last)
1312: {
1313: record_one_conflict (regno);
1314: SET_HARD_REG_BIT (hard_regs_live, regno);
1315: regno++;
1316: }
1317: }
1318: }
1319:
1320: /* Like mark_reg_set except notice just CLOBBERs; ignore SETs. */
1321:
1322: static void
1323: mark_reg_clobber (reg, setter)
1324: rtx reg, setter;
1325: {
1326: register int regno;
1327:
1328: /* WORD is which word of a multi-register group is being stored.
1329: For the case where the store is actually into a SUBREG of REG.
1330: Except we don't use it; I believe the entire REG needs to be
1331: made live. */
1332: int word = 0;
1333:
1334: if (GET_CODE (setter) != CLOBBER)
1335: return;
1336:
1337: if (GET_CODE (reg) == SUBREG)
1338: {
1339: word = SUBREG_WORD (reg);
1340: reg = SUBREG_REG (reg);
1341: }
1342:
1343: if (GET_CODE (reg) != REG)
1344: return;
1345:
1346: regs_set[n_regs_set++] = reg;
1347:
1348: regno = REGNO (reg);
1349:
1350: if (reg_renumber[regno] >= 0)
1351: regno = reg_renumber[regno] /* + word */;
1352:
1353: /* Either this is one of the max_allocno pseudo regs not allocated,
1354: or it is or has a hardware reg. First handle the pseudo-regs. */
1355: if (regno >= FIRST_PSEUDO_REGISTER)
1356: {
1357: if (reg_allocno[regno] >= 0)
1358: {
1359: SET_ALLOCNO_LIVE (reg_allocno[regno]);
1360: record_one_conflict (regno);
1361: }
1362: }
1363: /* Handle hardware regs (and pseudos allocated to hard regs). */
1364: else if (! fixed_regs[regno])
1365: {
1366: register int last = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg));
1367: while (regno < last)
1368: {
1369: record_one_conflict (regno);
1370: SET_HARD_REG_BIT (hard_regs_live, regno);
1371: regno++;
1372: }
1373: }
1374: }
1375:
1376: /* Record that REG has conflicts with all the regs currently live.
1377: Do not mark REG itself as live. */
1378:
1379: static void
1380: mark_reg_conflicts (reg)
1381: rtx reg;
1382: {
1383: register int regno;
1384:
1385: if (GET_CODE (reg) == SUBREG)
1386: reg = SUBREG_REG (reg);
1387:
1388: if (GET_CODE (reg) != REG)
1389: return;
1390:
1391: regno = REGNO (reg);
1392:
1393: if (reg_renumber[regno] >= 0)
1394: regno = reg_renumber[regno];
1395:
1396: /* Either this is one of the max_allocno pseudo regs not allocated,
1397: or it is or has a hardware reg. First handle the pseudo-regs. */
1398: if (regno >= FIRST_PSEUDO_REGISTER)
1399: {
1400: if (reg_allocno[regno] >= 0)
1401: record_one_conflict (regno);
1402: }
1403: /* Handle hardware regs (and pseudos allocated to hard regs). */
1404: else if (! fixed_regs[regno])
1405: {
1406: register int last = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg));
1407: while (regno < last)
1408: {
1409: record_one_conflict (regno);
1410: regno++;
1411: }
1412: }
1413: }
1414:
1415: /* Mark REG as being dead (following the insn being scanned now).
1416: Store a 0 in regs_live or allocnos_live for this register. */
1417:
1418: static void
1419: mark_reg_death (reg)
1420: rtx reg;
1421: {
1422: register int regno = REGNO (reg);
1423:
1424: /* For pseudo reg, see if it has been assigned a hardware reg. */
1425: if (reg_renumber[regno] >= 0)
1426: regno = reg_renumber[regno];
1427:
1428: /* Either this is one of the max_allocno pseudo regs not allocated,
1429: or it is a hardware reg. First handle the pseudo-regs. */
1430: if (regno >= FIRST_PSEUDO_REGISTER)
1431: {
1432: if (reg_allocno[regno] >= 0)
1433: CLEAR_ALLOCNO_LIVE (reg_allocno[regno]);
1434: }
1435: /* Handle hardware regs (and pseudos allocated to hard regs). */
1436: else if (! fixed_regs[regno])
1437: {
1438: /* Pseudo regs already assigned hardware regs are treated
1439: almost the same as explicit hardware regs. */
1440: register int last = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg));
1441: while (regno < last)
1442: {
1443: CLEAR_HARD_REG_BIT (hard_regs_live, regno);
1444: regno++;
1445: }
1446: }
1447: }
1448:
1449: /* Mark hard reg REGNO as currently live, assuming machine mode MODE
1450: for the value stored in it. MODE determines how many consecutive
1451: registers are actually in use. Do not record conflicts;
1452: it is assumed that the caller will do that. */
1453:
1454: static void
1455: mark_reg_live_nc (regno, mode)
1456: register int regno;
1457: enum machine_mode mode;
1458: {
1459: register int last = regno + HARD_REGNO_NREGS (regno, mode);
1460: while (regno < last)
1461: {
1462: SET_HARD_REG_BIT (hard_regs_live, regno);
1463: regno++;
1464: }
1465: }
1466:
1467: /* Try to set a preference for an allocno to a hard register.
1468: We are passed DEST and SRC which are the operands of a SET. It is known
1469: that SRC is a register. If SRC or the first operand of SRC is a register,
1470: try to set a preference. If one of the two is a hard register and the other
1471: is a pseudo-register, mark the preference.
1472:
1473: Note that we are not as aggressive as local-alloc in trying to tie a
1474: pseudo-register to a hard register. */
1475:
1476: static void
1477: set_preference (dest, src)
1478: rtx dest, src;
1479: {
1480: int src_regno, dest_regno;
1481: /* Amount to add to the hard regno for SRC, or subtract from that for DEST,
1482: to compensate for subregs in SRC or DEST. */
1483: int offset = 0;
1484: int i;
1485: int copy = 1;
1486:
1487: if (GET_RTX_FORMAT (GET_CODE (src))[0] == 'e')
1488: src = XEXP (src, 0), copy = 0;
1489:
1490: /* Get the reg number for both SRC and DEST.
1491: If neither is a reg, give up. */
1492:
1493: if (GET_CODE (src) == REG)
1494: src_regno = REGNO (src);
1495: else if (GET_CODE (src) == SUBREG && GET_CODE (SUBREG_REG (src)) == REG)
1496: {
1497: src_regno = REGNO (SUBREG_REG (src));
1498: offset += SUBREG_WORD (src);
1499: }
1500: else
1501: return;
1502:
1503: if (GET_CODE (dest) == REG)
1504: dest_regno = REGNO (dest);
1505: else if (GET_CODE (dest) == SUBREG && GET_CODE (SUBREG_REG (dest)) == REG)
1506: {
1507: dest_regno = REGNO (SUBREG_REG (dest));
1508: offset -= SUBREG_WORD (dest);
1509: }
1510: else
1511: return;
1512:
1513: /* Convert either or both to hard reg numbers. */
1514:
1515: if (reg_renumber[src_regno] >= 0)
1516: src_regno = reg_renumber[src_regno];
1517:
1518: if (reg_renumber[dest_regno] >= 0)
1519: dest_regno = reg_renumber[dest_regno];
1520:
1521: /* Now if one is a hard reg and the other is a global pseudo
1522: then give the other a preference. */
1523:
1524: if (dest_regno < FIRST_PSEUDO_REGISTER && src_regno >= FIRST_PSEUDO_REGISTER
1525: && reg_allocno[src_regno] >= 0)
1526: {
1527: dest_regno -= offset;
1528: if (dest_regno >= 0 && dest_regno < FIRST_PSEUDO_REGISTER)
1529: {
1530: if (copy)
1531: SET_REGBIT (hard_reg_copy_preferences,
1532: reg_allocno[src_regno], dest_regno);
1533:
1534: SET_REGBIT (hard_reg_preferences,
1535: reg_allocno[src_regno], dest_regno);
1536: for (i = dest_regno;
1537: i < dest_regno + HARD_REGNO_NREGS (dest_regno, GET_MODE (dest));
1538: i++)
1539: SET_REGBIT (hard_reg_full_preferences, reg_allocno[src_regno], i);
1540: }
1541: }
1542:
1543: if (src_regno < FIRST_PSEUDO_REGISTER && dest_regno >= FIRST_PSEUDO_REGISTER
1544: && reg_allocno[dest_regno] >= 0)
1545: {
1546: src_regno += offset;
1547: if (src_regno >= 0 && src_regno < FIRST_PSEUDO_REGISTER)
1548: {
1549: if (copy)
1550: SET_REGBIT (hard_reg_copy_preferences,
1551: reg_allocno[dest_regno], src_regno);
1552:
1553: SET_REGBIT (hard_reg_preferences,
1554: reg_allocno[dest_regno], src_regno);
1555: for (i = src_regno;
1556: i < src_regno + HARD_REGNO_NREGS (src_regno, GET_MODE (src));
1557: i++)
1558: SET_REGBIT (hard_reg_full_preferences, reg_allocno[dest_regno], i);
1559: }
1560: }
1561: }
1562:
1563: /* Indicate that hard register number FROM was eliminated and replaced with
1564: an offset from hard register number TO. The status of hard registers live
1565: at the start of a basic block is updated by replacing a use of FROM with
1566: a use of TO. */
1567:
1568: void
1569: mark_elimination (from, to)
1570: int from, to;
1571: {
1572: int i;
1573:
1574: for (i = 0; i < n_basic_blocks; i++)
1575: if ((basic_block_live_at_start[i][from / REGSET_ELT_BITS]
1576: & ((REGSET_ELT_TYPE) 1 << (from % REGSET_ELT_BITS))) != 0)
1577: {
1578: basic_block_live_at_start[i][from / REGSET_ELT_BITS]
1579: &= ~ ((REGSET_ELT_TYPE) 1 << (from % REGSET_ELT_BITS));
1580: basic_block_live_at_start[i][to / REGSET_ELT_BITS]
1581: |= ((REGSET_ELT_TYPE) 1 << (to % REGSET_ELT_BITS));
1582: }
1583: }
1584:
1585: /* Print debugging trace information if -greg switch is given,
1586: showing the information on which the allocation decisions are based. */
1587:
1588: static void
1589: dump_conflicts (file)
1590: FILE *file;
1591: {
1592: register int i;
1593: register int has_preferences;
1594: fprintf (file, ";; %d regs to allocate:", max_allocno);
1595: for (i = 0; i < max_allocno; i++)
1596: {
1597: int j;
1598: fprintf (file, " %d", allocno_reg[allocno_order[i]]);
1599: for (j = 0; j < max_regno; j++)
1600: if (reg_allocno[j] == allocno_order[i]
1601: && j != allocno_reg[allocno_order[i]])
1602: fprintf (file, "+%d", j);
1603: if (allocno_size[allocno_order[i]] != 1)
1604: fprintf (file, " (%d)", allocno_size[allocno_order[i]]);
1605: }
1606: fprintf (file, "\n");
1607:
1608: for (i = 0; i < max_allocno; i++)
1609: {
1610: register int j;
1611: fprintf (file, ";; %d conflicts:", allocno_reg[i]);
1612: for (j = 0; j < max_allocno; j++)
1613: if (CONFLICTP (i, j) || CONFLICTP (j, i))
1614: fprintf (file, " %d", allocno_reg[j]);
1615: for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
1616: if (TEST_HARD_REG_BIT (hard_reg_conflicts[i], j))
1617: fprintf (file, " %d", j);
1618: fprintf (file, "\n");
1619:
1620: has_preferences = 0;
1621: for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
1622: if (TEST_HARD_REG_BIT (hard_reg_preferences[i], j))
1623: has_preferences = 1;
1624:
1625: if (! has_preferences)
1626: continue;
1627: fprintf (file, ";; %d preferences:", allocno_reg[i]);
1628: for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
1629: if (TEST_HARD_REG_BIT (hard_reg_preferences[i], j))
1630: fprintf (file, " %d", j);
1631: fprintf (file, "\n");
1632: }
1633: fprintf (file, "\n");
1634: }
1635:
1636: void
1637: dump_global_regs (file)
1638: FILE *file;
1639: {
1640: register int i, j;
1641:
1642: fprintf (file, ";; Register dispositions:\n");
1643: for (i = FIRST_PSEUDO_REGISTER, j = 0; i < max_regno; i++)
1644: if (reg_renumber[i] >= 0)
1645: {
1646: fprintf (file, "%d in %d ", i, reg_renumber[i]);
1647: if (++j % 6 == 0)
1648: fprintf (file, "\n");
1649: }
1650:
1651: fprintf (file, "\n\n;; Hard regs used: ");
1652: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1653: if (regs_ever_live[i])
1654: fprintf (file, " %d", i);
1655: fprintf (file, "\n\n");
1656: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.