(store_constructor, ARRAY_TYPE): Use code for non-integer INDEX for
[official-gcc.git] / gcc / global.c
blobff86feca1f1917db6e64687c935ee2f5ab7165ee
1 /* Allocate registers for pseudo-registers that span basic blocks.
2 Copyright (C) 1987, 1988, 1991, 1994 Free Software Foundation, Inc.
4 This file is part of GNU CC.
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.
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.
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. */
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"
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.
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.
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.
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).
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.
63 4. Sort a table of the allocnos into order of
64 desirability of the variables.
66 5. Allocate the variables in that order; each if possible into
67 a preferred register, else into another register. */
69 /* Number of pseudo-registers still requiring allocation
70 (not allocated by local_allocate). */
72 static int max_allocno;
74 /* Indexed by (pseudo) reg number, gives the allocno, or -1
75 for pseudo registers already allocated by local_allocate. */
77 static int *reg_allocno;
79 /* Indexed by allocno, gives the reg number. */
81 static int *allocno_reg;
83 /* A vector of the integers from 0 to max_allocno-1,
84 sorted in the order of first-to-be-allocated first. */
86 static int *allocno_order;
88 /* Indexed by an allocno, gives the number of consecutive
89 hard registers needed by that pseudo reg. */
91 static int *allocno_size;
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*. */
97 static int *reg_may_share;
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. */
103 #define INT_BITS HOST_BITS_PER_WIDE_INT
104 #define INT_TYPE HOST_WIDE_INT
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).
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. */
113 static INT_TYPE *conflicts;
115 /* Number of ints require to hold max_allocno bits.
116 This is the length of a row in `conflicts'. */
118 static int allocno_row_words;
120 /* Two macros to test or store 1 in an element of `conflicts'. */
122 #define CONFLICTP(I, J) \
123 (conflicts[(I) * allocno_row_words + (J) / INT_BITS] \
124 & ((INT_TYPE) 1 << ((J) % INT_BITS)))
126 #define SET_CONFLICT(I, J) \
127 (conflicts[(I) * allocno_row_words + (J) / INT_BITS] \
128 |= ((INT_TYPE) 1 << ((J) % INT_BITS)))
130 /* Set of hard regs currently live (during scan of all insns). */
132 static HARD_REG_SET hard_regs_live;
134 /* Indexed by N, set of hard regs conflicting with allocno N. */
136 static HARD_REG_SET *hard_reg_conflicts;
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. */
142 static HARD_REG_SET *hard_reg_preferences;
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. */
149 static HARD_REG_SET *hard_reg_copy_preferences;
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. */
155 static HARD_REG_SET *hard_reg_full_preferences;
157 /* Indexed by N, set of hard registers that some later allocno has a
158 preference for. */
160 static HARD_REG_SET *regs_someone_prefers;
162 /* Set of registers that global-alloc isn't supposed to use. */
164 static HARD_REG_SET no_global_alloc_regs;
166 /* Set of registers used so far. */
168 static HARD_REG_SET regs_used_so_far;
170 /* Number of calls crossed by each allocno. */
172 static int *allocno_calls_crossed;
174 /* Number of refs (weighted) to each allocno. */
176 static int *allocno_n_refs;
178 /* Guess at live length of each allocno.
179 This is actually the max of the live lengths of the regs. */
181 static int *allocno_live_length;
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. */
186 static int local_reg_n_refs[FIRST_PSEUDO_REGISTER];
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. */
191 static int local_reg_live_length[FIRST_PSEUDO_REGISTER];
193 /* Test a bit in TABLE, a vector of HARD_REG_SETs,
194 for vector element I, and hard register number J. */
196 #define REGBITP(TABLE, I, J) TEST_HARD_REG_BIT (TABLE[I], J)
198 /* Set to 1 a bit in a vector of HARD_REG_SETs. Works like REGBITP. */
200 #define SET_REGBIT(TABLE, I, J) SET_HARD_REG_BIT (TABLE[I], J)
202 /* Bit mask for allocnos live at current point in the scan. */
204 static INT_TYPE *allocnos_live;
206 /* Test, set or clear bit number I in allocnos_live,
207 a bit vector indexed by allocno. */
209 #define ALLOCNO_LIVE_P(I) \
210 (allocnos_live[(I) / INT_BITS] & ((INT_TYPE) 1 << ((I) % INT_BITS)))
212 #define SET_ALLOCNO_LIVE(I) \
213 (allocnos_live[(I) / INT_BITS] |= ((INT_TYPE) 1 << ((I) % INT_BITS)))
215 #define CLEAR_ALLOCNO_LIVE(I) \
216 (allocnos_live[(I) / INT_BITS] &= ~((INT_TYPE) 1 << ((I) % INT_BITS)))
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.
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 */
243 /* Record all regs that are set in any one insn.
244 Communication from mark_reg_{store,clobber} and global_conflicts. */
246 static rtx *regs_set;
247 static int n_regs_set;
249 /* All registers that can be eliminated. */
251 static HARD_REG_SET eliminable_regset;
253 static int allocno_compare PROTO((int *, int *));
254 static void global_conflicts PROTO((void));
255 static void expand_preferences PROTO((void));
256 static void prune_preferences PROTO((void));
257 static void find_reg PROTO((int, HARD_REG_SET, int, int, int));
258 static void record_one_conflict PROTO((int));
259 static void record_conflicts PROTO((short *, int));
260 static void mark_reg_store PROTO((rtx, rtx));
261 static void mark_reg_clobber PROTO((rtx, rtx));
262 static void mark_reg_conflicts PROTO((rtx));
263 static void mark_reg_death PROTO((rtx));
264 static void mark_reg_live_nc PROTO((int, enum machine_mode));
265 static void set_preference PROTO((rtx, rtx));
266 static void dump_conflicts PROTO((FILE *));
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.
272 Return value is nonzero if reload failed
273 and we must not do any more for this function. */
276 global_alloc (file)
277 FILE *file;
279 #ifdef ELIMINABLE_REGS
280 static struct {int from, to; } eliminables[] = ELIMINABLE_REGS;
281 #endif
282 int need_fp
283 = (! flag_omit_frame_pointer
284 #ifdef EXIT_IGNORE_STACK
285 || (current_function_calls_alloca && EXIT_IGNORE_STACK)
286 #endif
287 || FRAME_POINTER_REQUIRED);
289 register int i;
290 rtx x;
292 max_allocno = 0;
294 /* A machine may have certain hard registers that
295 are safe to use only within a basic block. */
297 CLEAR_HARD_REG_SET (no_global_alloc_regs);
298 #ifdef OVERLAPPING_REGNO_P
299 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
300 if (OVERLAPPING_REGNO_P (i))
301 SET_HARD_REG_BIT (no_global_alloc_regs, i);
302 #endif
304 /* Build the regset of all eliminable registers and show we can't use those
305 that we already know won't be eliminated. */
306 #ifdef ELIMINABLE_REGS
307 for (i = 0; i < sizeof eliminables / sizeof eliminables[0]; i++)
309 SET_HARD_REG_BIT (eliminable_regset, eliminables[i].from);
311 if (! CAN_ELIMINATE (eliminables[i].from, eliminables[i].to)
312 || (eliminables[i].to == STACK_POINTER_REGNUM && need_fp))
313 SET_HARD_REG_BIT (no_global_alloc_regs, eliminables[i].from);
315 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
316 SET_HARD_REG_BIT (eliminable_regset, HARD_FRAME_POINTER_REGNUM);
317 if (need_fp)
318 SET_HARD_REG_BIT (no_global_alloc_regs, HARD_FRAME_POINTER_REGNUM);
319 #endif
321 #else
322 SET_HARD_REG_BIT (eliminable_regset, FRAME_POINTER_REGNUM);
323 if (need_fp)
324 SET_HARD_REG_BIT (no_global_alloc_regs, FRAME_POINTER_REGNUM);
325 #endif
327 /* Track which registers have already been used. Start with registers
328 explicitly in the rtl, then registers allocated by local register
329 allocation. */
331 CLEAR_HARD_REG_SET (regs_used_so_far);
332 #ifdef LEAF_REGISTERS
333 /* If we are doing the leaf function optimization, and this is a leaf
334 function, it means that the registers that take work to save are those
335 that need a register window. So prefer the ones that can be used in
336 a leaf function. */
338 char *cheap_regs;
339 static char leaf_regs[] = LEAF_REGISTERS;
341 if (only_leaf_regs_used () && leaf_function_p ())
342 cheap_regs = leaf_regs;
343 else
344 cheap_regs = call_used_regs;
345 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
346 if (regs_ever_live[i] || cheap_regs[i])
347 SET_HARD_REG_BIT (regs_used_so_far, i);
349 #else
350 /* We consider registers that do not have to be saved over calls as if
351 they were already used since there is no cost in using them. */
352 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
353 if (regs_ever_live[i] || call_used_regs[i])
354 SET_HARD_REG_BIT (regs_used_so_far, i);
355 #endif
357 for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
358 if (reg_renumber[i] >= 0)
359 SET_HARD_REG_BIT (regs_used_so_far, reg_renumber[i]);
361 /* Establish mappings from register number to allocation number
362 and vice versa. In the process, count the allocnos. */
364 reg_allocno = (int *) alloca (max_regno * sizeof (int));
366 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
367 reg_allocno[i] = -1;
369 /* Initialize the shared-hard-reg mapping
370 from the list of pairs that may share. */
371 reg_may_share = (int *) alloca (max_regno * sizeof (int));
372 bzero ((char *) reg_may_share, max_regno * sizeof (int));
373 for (x = regs_may_share; x; x = XEXP (XEXP (x, 1), 1))
375 int r1 = REGNO (XEXP (x, 0));
376 int r2 = REGNO (XEXP (XEXP (x, 1), 0));
377 if (r1 > r2)
378 reg_may_share[r1] = r2;
379 else
380 reg_may_share[r2] = r1;
383 for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
384 /* Note that reg_live_length[i] < 0 indicates a "constant" reg
385 that we are supposed to refrain from putting in a hard reg.
386 -2 means do make an allocno but don't allocate it. */
387 if (reg_n_refs[i] != 0 && reg_renumber[i] < 0 && reg_live_length[i] != -1
388 /* Don't allocate pseudos that cross calls,
389 if this function receives a nonlocal goto. */
390 && (! current_function_has_nonlocal_label
391 || reg_n_calls_crossed[i] == 0))
393 if (reg_may_share[i] && reg_allocno[reg_may_share[i]] >= 0)
394 reg_allocno[i] = reg_allocno[reg_may_share[i]];
395 else
396 reg_allocno[i] = max_allocno++;
397 if (reg_live_length[i] == 0)
398 abort ();
400 else
401 reg_allocno[i] = -1;
403 allocno_reg = (int *) alloca (max_allocno * sizeof (int));
404 allocno_size = (int *) alloca (max_allocno * sizeof (int));
405 allocno_calls_crossed = (int *) alloca (max_allocno * sizeof (int));
406 allocno_n_refs = (int *) alloca (max_allocno * sizeof (int));
407 allocno_live_length = (int *) alloca (max_allocno * sizeof (int));
408 bzero ((char *) allocno_size, max_allocno * sizeof (int));
409 bzero ((char *) allocno_calls_crossed, max_allocno * sizeof (int));
410 bzero ((char *) allocno_n_refs, max_allocno * sizeof (int));
411 bzero ((char *) allocno_live_length, max_allocno * sizeof (int));
413 for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
414 if (reg_allocno[i] >= 0)
416 int allocno = reg_allocno[i];
417 allocno_reg[allocno] = i;
418 allocno_size[allocno] = PSEUDO_REGNO_SIZE (i);
419 allocno_calls_crossed[allocno] += reg_n_calls_crossed[i];
420 allocno_n_refs[allocno] += reg_n_refs[i];
421 if (allocno_live_length[allocno] < reg_live_length[i])
422 allocno_live_length[allocno] = reg_live_length[i];
425 /* Calculate amount of usage of each hard reg by pseudos
426 allocated by local-alloc. This is to see if we want to
427 override it. */
428 bzero ((char *) local_reg_live_length, sizeof local_reg_live_length);
429 bzero ((char *) local_reg_n_refs, sizeof local_reg_n_refs);
430 for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
431 if (reg_allocno[i] < 0 && reg_renumber[i] >= 0)
433 int regno = reg_renumber[i];
434 int endregno = regno + HARD_REGNO_NREGS (regno, PSEUDO_REGNO_MODE (i));
435 int j;
437 for (j = regno; j < endregno; j++)
439 local_reg_n_refs[j] += reg_n_refs[i];
440 local_reg_live_length[j] += reg_live_length[i];
444 /* We can't override local-alloc for a reg used not just by local-alloc. */
445 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
446 if (regs_ever_live[i])
447 local_reg_n_refs[i] = 0;
449 /* Likewise for regs used in a SCRATCH. */
450 for (i = 0; i < scratch_list_length; i++)
451 if (scratch_list[i])
453 int regno = REGNO (scratch_list[i]);
454 int lim = regno + HARD_REGNO_NREGS (regno, GET_MODE (scratch_list[i]));
455 int j;
457 for (j = regno; j < lim; j++)
458 local_reg_n_refs[j] = 0;
461 /* Allocate the space for the conflict and preference tables and
462 initialize them. */
464 hard_reg_conflicts
465 = (HARD_REG_SET *) alloca (max_allocno * sizeof (HARD_REG_SET));
466 bzero ((char *) hard_reg_conflicts, max_allocno * sizeof (HARD_REG_SET));
468 hard_reg_preferences
469 = (HARD_REG_SET *) alloca (max_allocno * sizeof (HARD_REG_SET));
470 bzero ((char *) hard_reg_preferences, max_allocno * sizeof (HARD_REG_SET));
472 hard_reg_copy_preferences
473 = (HARD_REG_SET *) alloca (max_allocno * sizeof (HARD_REG_SET));
474 bzero ((char *) hard_reg_copy_preferences,
475 max_allocno * sizeof (HARD_REG_SET));
477 hard_reg_full_preferences
478 = (HARD_REG_SET *) alloca (max_allocno * sizeof (HARD_REG_SET));
479 bzero ((char *) hard_reg_full_preferences,
480 max_allocno * sizeof (HARD_REG_SET));
482 regs_someone_prefers
483 = (HARD_REG_SET *) alloca (max_allocno * sizeof (HARD_REG_SET));
484 bzero ((char *) regs_someone_prefers, max_allocno * sizeof (HARD_REG_SET));
486 allocno_row_words = (max_allocno + INT_BITS - 1) / INT_BITS;
488 conflicts = (INT_TYPE *) alloca (max_allocno * allocno_row_words
489 * sizeof (INT_TYPE));
490 bzero ((char *) conflicts,
491 max_allocno * allocno_row_words * sizeof (INT_TYPE));
493 allocnos_live = (INT_TYPE *) alloca (allocno_row_words * sizeof (INT_TYPE));
495 /* If there is work to be done (at least one reg to allocate),
496 perform global conflict analysis and allocate the regs. */
498 if (max_allocno > 0)
500 /* Scan all the insns and compute the conflicts among allocnos
501 and between allocnos and hard regs. */
503 global_conflicts ();
505 /* Eliminate conflicts between pseudos and eliminable registers. If
506 the register is not eliminated, the pseudo won't really be able to
507 live in the eliminable register, so the conflict doesn't matter.
508 If we do eliminate the register, the conflict will no longer exist.
509 So in either case, we can ignore the conflict. Likewise for
510 preferences. */
512 for (i = 0; i < max_allocno; i++)
514 AND_COMPL_HARD_REG_SET (hard_reg_conflicts[i], eliminable_regset);
515 AND_COMPL_HARD_REG_SET (hard_reg_copy_preferences[i],
516 eliminable_regset);
517 AND_COMPL_HARD_REG_SET (hard_reg_preferences[i], eliminable_regset);
520 /* Try to expand the preferences by merging them between allocnos. */
522 expand_preferences ();
524 /* Determine the order to allocate the remaining pseudo registers. */
526 allocno_order = (int *) alloca (max_allocno * sizeof (int));
527 for (i = 0; i < max_allocno; i++)
528 allocno_order[i] = i;
530 /* Default the size to 1, since allocno_compare uses it to divide by.
531 Also convert allocno_live_length of zero to -1. A length of zero
532 can occur when all the registers for that allocno have reg_live_length
533 equal to -2. In this case, we want to make an allocno, but not
534 allocate it. So avoid the divide-by-zero and set it to a low
535 priority. */
537 for (i = 0; i < max_allocno; i++)
539 if (allocno_size[i] == 0)
540 allocno_size[i] = 1;
541 if (allocno_live_length[i] == 0)
542 allocno_live_length[i] = -1;
545 qsort (allocno_order, max_allocno, sizeof (int), allocno_compare);
547 prune_preferences ();
549 if (file)
550 dump_conflicts (file);
552 /* Try allocating them, one by one, in that order,
553 except for parameters marked with reg_live_length[regno] == -2. */
555 for (i = 0; i < max_allocno; i++)
556 if (reg_live_length[allocno_reg[allocno_order[i]]] >= 0)
558 /* If we have more than one register class,
559 first try allocating in the class that is cheapest
560 for this pseudo-reg. If that fails, try any reg. */
561 if (N_REG_CLASSES > 1)
563 find_reg (allocno_order[i], HARD_CONST (0), 0, 0, 0);
564 if (reg_renumber[allocno_reg[allocno_order[i]]] >= 0)
565 continue;
567 if (reg_alternate_class (allocno_reg[allocno_order[i]]) != NO_REGS)
568 find_reg (allocno_order[i], HARD_CONST (0), 1, 0, 0);
572 /* Do the reloads now while the allocno data still exist, so that we can
573 try to assign new hard regs to any pseudo regs that are spilled. */
575 #if 0 /* We need to eliminate regs even if there is no rtl code,
576 for the sake of debugging information. */
577 if (n_basic_blocks > 0)
578 #endif
579 return reload (get_insns (), 1, file);
582 /* Sort predicate for ordering the allocnos.
583 Returns -1 (1) if *v1 should be allocated before (after) *v2. */
585 static int
586 allocno_compare (v1, v2)
587 int *v1, *v2;
589 /* Note that the quotient will never be bigger than
590 the value of floor_log2 times the maximum number of
591 times a register can occur in one insn (surely less than 100).
592 Multiplying this by 10000 can't overflow. */
593 register int pri1
594 = (((double) (floor_log2 (allocno_n_refs[*v1]) * allocno_n_refs[*v1])
595 / allocno_live_length[*v1])
596 * 10000 * allocno_size[*v1]);
597 register int pri2
598 = (((double) (floor_log2 (allocno_n_refs[*v2]) * allocno_n_refs[*v2])
599 / allocno_live_length[*v2])
600 * 10000 * allocno_size[*v2]);
601 if (pri2 - pri1)
602 return pri2 - pri1;
604 /* If regs are equally good, sort by allocno,
605 so that the results of qsort leave nothing to chance. */
606 return *v1 - *v2;
609 /* Scan the rtl code and record all conflicts and register preferences in the
610 conflict matrices and preference tables. */
612 static void
613 global_conflicts ()
615 register int b, i;
616 register rtx insn;
617 short *block_start_allocnos;
619 /* Make a vector that mark_reg_{store,clobber} will store in. */
620 regs_set = (rtx *) alloca (max_parallel * sizeof (rtx) * 2);
622 block_start_allocnos = (short *) alloca (max_allocno * sizeof (short));
624 for (b = 0; b < n_basic_blocks; b++)
626 bzero ((char *) allocnos_live, allocno_row_words * sizeof (INT_TYPE));
628 /* Initialize table of registers currently live
629 to the state at the beginning of this basic block.
630 This also marks the conflicts among them.
632 For pseudo-regs, there is only one bit for each one
633 no matter how many hard regs it occupies.
634 This is ok; we know the size from PSEUDO_REGNO_SIZE.
635 For explicit hard regs, we cannot know the size that way
636 since one hard reg can be used with various sizes.
637 Therefore, we must require that all the hard regs
638 implicitly live as part of a multi-word hard reg
639 are explicitly marked in basic_block_live_at_start. */
642 register int offset;
643 REGSET_ELT_TYPE bit;
644 register regset old = basic_block_live_at_start[b];
645 int ax = 0;
647 #ifdef HARD_REG_SET
648 hard_regs_live = old[0];
649 #else
650 COPY_HARD_REG_SET (hard_regs_live, old);
651 #endif
652 for (offset = 0, i = 0; offset < regset_size; offset++)
653 if (old[offset] == 0)
654 i += REGSET_ELT_BITS;
655 else
656 for (bit = 1; bit; bit <<= 1, i++)
658 if (i >= max_regno)
659 break;
660 if (old[offset] & bit)
662 register int a = reg_allocno[i];
663 if (a >= 0)
665 SET_ALLOCNO_LIVE (a);
666 block_start_allocnos[ax++] = a;
668 else if ((a = reg_renumber[i]) >= 0)
669 mark_reg_live_nc (a, PSEUDO_REGNO_MODE (i));
673 /* Record that each allocno now live conflicts with each other
674 allocno now live, and with each hard reg now live. */
676 record_conflicts (block_start_allocnos, ax);
679 insn = basic_block_head[b];
681 /* Scan the code of this basic block, noting which allocnos
682 and hard regs are born or die. When one is born,
683 record a conflict with all others currently live. */
685 while (1)
687 register RTX_CODE code = GET_CODE (insn);
688 register rtx link;
690 /* Make regs_set an empty set. */
692 n_regs_set = 0;
694 if (code == INSN || code == CALL_INSN || code == JUMP_INSN)
697 #if 0
698 int i = 0;
699 for (link = REG_NOTES (insn);
700 link && i < NUM_NO_CONFLICT_PAIRS;
701 link = XEXP (link, 1))
702 if (REG_NOTE_KIND (link) == REG_NO_CONFLICT)
704 no_conflict_pairs[i].allocno1
705 = reg_allocno[REGNO (SET_DEST (PATTERN (insn)))];
706 no_conflict_pairs[i].allocno2
707 = reg_allocno[REGNO (XEXP (link, 0))];
708 i++;
710 #endif /* 0 */
712 /* Mark any registers clobbered by INSN as live,
713 so they conflict with the inputs. */
715 note_stores (PATTERN (insn), mark_reg_clobber);
717 /* Mark any registers dead after INSN as dead now. */
719 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
720 if (REG_NOTE_KIND (link) == REG_DEAD)
721 mark_reg_death (XEXP (link, 0));
723 /* Mark any registers set in INSN as live,
724 and mark them as conflicting with all other live regs.
725 Clobbers are processed again, so they conflict with
726 the registers that are set. */
728 note_stores (PATTERN (insn), mark_reg_store);
730 #ifdef AUTO_INC_DEC
731 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
732 if (REG_NOTE_KIND (link) == REG_INC)
733 mark_reg_store (XEXP (link, 0), NULL_RTX);
734 #endif
736 /* If INSN has multiple outputs, then any reg that dies here
737 and is used inside of an output
738 must conflict with the other outputs. */
740 if (GET_CODE (PATTERN (insn)) == PARALLEL && !single_set (insn))
741 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
742 if (REG_NOTE_KIND (link) == REG_DEAD)
744 int used_in_output = 0;
745 int i;
746 rtx reg = XEXP (link, 0);
748 for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
750 rtx set = XVECEXP (PATTERN (insn), 0, i);
751 if (GET_CODE (set) == SET
752 && GET_CODE (SET_DEST (set)) != REG
753 && !rtx_equal_p (reg, SET_DEST (set))
754 && reg_overlap_mentioned_p (reg, SET_DEST (set)))
755 used_in_output = 1;
757 if (used_in_output)
758 mark_reg_conflicts (reg);
761 /* Mark any registers set in INSN and then never used. */
763 while (n_regs_set > 0)
764 if (find_regno_note (insn, REG_UNUSED,
765 REGNO (regs_set[--n_regs_set])))
766 mark_reg_death (regs_set[n_regs_set]);
769 if (insn == basic_block_end[b])
770 break;
771 insn = NEXT_INSN (insn);
775 /* Expand the preference information by looking for cases where one allocno
776 dies in an insn that sets an allocno. If those two allocnos don't conflict,
777 merge any preferences between those allocnos. */
779 static void
780 expand_preferences ()
782 rtx insn;
783 rtx link;
784 rtx set;
786 /* We only try to handle the most common cases here. Most of the cases
787 where this wins are reg-reg copies. */
789 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
790 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
791 && (set = single_set (insn)) != 0
792 && GET_CODE (SET_DEST (set)) == REG
793 && reg_allocno[REGNO (SET_DEST (set))] >= 0)
794 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
795 if (REG_NOTE_KIND (link) == REG_DEAD
796 && GET_CODE (XEXP (link, 0)) == REG
797 && reg_allocno[REGNO (XEXP (link, 0))] >= 0
798 && ! CONFLICTP (reg_allocno[REGNO (SET_DEST (set))],
799 reg_allocno[REGNO (XEXP (link, 0))])
800 && ! CONFLICTP (reg_allocno[REGNO (XEXP (link, 0))],
801 reg_allocno[REGNO (SET_DEST (set))]))
803 int a1 = reg_allocno[REGNO (SET_DEST (set))];
804 int a2 = reg_allocno[REGNO (XEXP (link, 0))];
806 if (XEXP (link, 0) == SET_SRC (set))
808 IOR_HARD_REG_SET (hard_reg_copy_preferences[a1],
809 hard_reg_copy_preferences[a2]);
810 IOR_HARD_REG_SET (hard_reg_copy_preferences[a2],
811 hard_reg_copy_preferences[a1]);
814 IOR_HARD_REG_SET (hard_reg_preferences[a1],
815 hard_reg_preferences[a2]);
816 IOR_HARD_REG_SET (hard_reg_preferences[a2],
817 hard_reg_preferences[a1]);
818 IOR_HARD_REG_SET (hard_reg_full_preferences[a1],
819 hard_reg_full_preferences[a2]);
820 IOR_HARD_REG_SET (hard_reg_full_preferences[a2],
821 hard_reg_full_preferences[a1]);
825 /* Prune the preferences for global registers to exclude registers that cannot
826 be used.
828 Compute `regs_someone_prefers', which is a bitmask of the hard registers
829 that are preferred by conflicting registers of lower priority. If possible,
830 we will avoid using these registers. */
832 static void
833 prune_preferences ()
835 int i, j;
836 int allocno;
838 /* Scan least most important to most important.
839 For each allocno, remove from preferences registers that cannot be used,
840 either because of conflicts or register type. Then compute all registers
841 preferred by each lower-priority register that conflicts. */
843 for (i = max_allocno - 1; i >= 0; i--)
845 HARD_REG_SET temp;
847 allocno = allocno_order[i];
848 COPY_HARD_REG_SET (temp, hard_reg_conflicts[allocno]);
850 if (allocno_calls_crossed[allocno] == 0)
851 IOR_HARD_REG_SET (temp, fixed_reg_set);
852 else
853 IOR_HARD_REG_SET (temp, call_used_reg_set);
855 IOR_COMPL_HARD_REG_SET
856 (temp,
857 reg_class_contents[(int) reg_preferred_class (allocno_reg[allocno])]);
859 AND_COMPL_HARD_REG_SET (hard_reg_preferences[allocno], temp);
860 AND_COMPL_HARD_REG_SET (hard_reg_copy_preferences[allocno], temp);
861 AND_COMPL_HARD_REG_SET (hard_reg_full_preferences[allocno], temp);
863 CLEAR_HARD_REG_SET (regs_someone_prefers[allocno]);
865 /* Merge in the preferences of lower-priority registers (they have
866 already been pruned). If we also prefer some of those registers,
867 don't exclude them unless we are of a smaller size (in which case
868 we want to give the lower-priority allocno the first chance for
869 these registers). */
870 for (j = i + 1; j < max_allocno; j++)
871 if (CONFLICTP (allocno, allocno_order[j]))
873 COPY_HARD_REG_SET (temp,
874 hard_reg_full_preferences[allocno_order[j]]);
875 if (allocno_size[allocno_order[j]] <= allocno_size[allocno])
876 AND_COMPL_HARD_REG_SET (temp,
877 hard_reg_full_preferences[allocno]);
879 IOR_HARD_REG_SET (regs_someone_prefers[allocno], temp);
884 /* Assign a hard register to ALLOCNO; look for one that is the beginning
885 of a long enough stretch of hard regs none of which conflicts with ALLOCNO.
886 The registers marked in PREFREGS are tried first.
888 LOSERS, if non-zero, is a HARD_REG_SET indicating registers that cannot
889 be used for this allocation.
891 If ALT_REGS_P is zero, consider only the preferred class of ALLOCNO's reg.
892 Otherwise ignore that preferred class and use the alternate class.
894 If ACCEPT_CALL_CLOBBERED is nonzero, accept a call-clobbered hard reg that
895 will have to be saved and restored at calls.
897 RETRYING is nonzero if this is called from retry_global_alloc.
899 If we find one, record it in reg_renumber.
900 If not, do nothing. */
902 static void
903 find_reg (allocno, losers, alt_regs_p, accept_call_clobbered, retrying)
904 int allocno;
905 HARD_REG_SET losers;
906 int alt_regs_p;
907 int accept_call_clobbered;
908 int retrying;
910 register int i, best_reg, pass;
911 #ifdef HARD_REG_SET
912 register /* Declare it register if it's a scalar. */
913 #endif
914 HARD_REG_SET used, used1, used2;
916 enum reg_class class = (alt_regs_p
917 ? reg_alternate_class (allocno_reg[allocno])
918 : reg_preferred_class (allocno_reg[allocno]));
919 enum machine_mode mode = PSEUDO_REGNO_MODE (allocno_reg[allocno]);
921 if (accept_call_clobbered)
922 COPY_HARD_REG_SET (used1, call_fixed_reg_set);
923 else if (allocno_calls_crossed[allocno] == 0)
924 COPY_HARD_REG_SET (used1, fixed_reg_set);
925 else
926 COPY_HARD_REG_SET (used1, call_used_reg_set);
928 /* Some registers should not be allocated in global-alloc. */
929 IOR_HARD_REG_SET (used1, no_global_alloc_regs);
930 if (losers)
931 IOR_HARD_REG_SET (used1, losers);
933 IOR_COMPL_HARD_REG_SET (used1, reg_class_contents[(int) class]);
934 COPY_HARD_REG_SET (used2, used1);
936 IOR_HARD_REG_SET (used1, hard_reg_conflicts[allocno]);
938 #ifdef CLASS_CANNOT_CHANGE_SIZE
939 if (reg_changes_size[allocno_reg[allocno]])
940 IOR_HARD_REG_SET (used1,
941 reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE]);
942 #endif
944 /* Try each hard reg to see if it fits. Do this in two passes.
945 In the first pass, skip registers that are preferred by some other pseudo
946 to give it a better chance of getting one of those registers. Only if
947 we can't get a register when excluding those do we take one of them.
948 However, we never allocate a register for the first time in pass 0. */
950 COPY_HARD_REG_SET (used, used1);
951 IOR_COMPL_HARD_REG_SET (used, regs_used_so_far);
952 IOR_HARD_REG_SET (used, regs_someone_prefers[allocno]);
954 best_reg = -1;
955 for (i = FIRST_PSEUDO_REGISTER, pass = 0;
956 pass <= 1 && i >= FIRST_PSEUDO_REGISTER;
957 pass++)
959 if (pass == 1)
960 COPY_HARD_REG_SET (used, used1);
961 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
963 #ifdef REG_ALLOC_ORDER
964 int regno = reg_alloc_order[i];
965 #else
966 int regno = i;
967 #endif
968 if (! TEST_HARD_REG_BIT (used, regno)
969 && HARD_REGNO_MODE_OK (regno, mode))
971 register int j;
972 register int lim = regno + HARD_REGNO_NREGS (regno, mode);
973 for (j = regno + 1;
974 (j < lim
975 && ! TEST_HARD_REG_BIT (used, j));
976 j++);
977 if (j == lim)
979 best_reg = regno;
980 break;
982 #ifndef REG_ALLOC_ORDER
983 i = j; /* Skip starting points we know will lose */
984 #endif
989 /* See if there is a preferred register with the same class as the register
990 we allocated above. Making this restriction prevents register
991 preferencing from creating worse register allocation.
993 Remove from the preferred registers and conflicting registers. Note that
994 additional conflicts may have been added after `prune_preferences' was
995 called.
997 First do this for those register with copy preferences, then all
998 preferred registers. */
1000 AND_COMPL_HARD_REG_SET (hard_reg_copy_preferences[allocno], used);
1001 GO_IF_HARD_REG_SUBSET (hard_reg_copy_preferences[allocno],
1002 reg_class_contents[(int) NO_REGS], no_copy_prefs);
1004 if (best_reg >= 0)
1006 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1007 if (TEST_HARD_REG_BIT (hard_reg_copy_preferences[allocno], i)
1008 && HARD_REGNO_MODE_OK (i, mode)
1009 && (REGNO_REG_CLASS (i) == REGNO_REG_CLASS (best_reg)
1010 || reg_class_subset_p (REGNO_REG_CLASS (i),
1011 REGNO_REG_CLASS (best_reg))
1012 || reg_class_subset_p (REGNO_REG_CLASS (best_reg),
1013 REGNO_REG_CLASS (i))))
1015 register int j;
1016 register int lim = i + HARD_REGNO_NREGS (i, mode);
1017 for (j = i + 1;
1018 (j < lim
1019 && ! TEST_HARD_REG_BIT (used, j)
1020 && (REGNO_REG_CLASS (j)
1021 == REGNO_REG_CLASS (best_reg + (j - i))
1022 || reg_class_subset_p (REGNO_REG_CLASS (j),
1023 REGNO_REG_CLASS (best_reg + (j - i)))
1024 || reg_class_subset_p (REGNO_REG_CLASS (best_reg + (j - i)),
1025 REGNO_REG_CLASS (j))));
1026 j++);
1027 if (j == lim)
1029 best_reg = i;
1030 goto no_prefs;
1034 no_copy_prefs:
1036 AND_COMPL_HARD_REG_SET (hard_reg_preferences[allocno], used);
1037 GO_IF_HARD_REG_SUBSET (hard_reg_preferences[allocno],
1038 reg_class_contents[(int) NO_REGS], no_prefs);
1040 if (best_reg >= 0)
1042 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1043 if (TEST_HARD_REG_BIT (hard_reg_preferences[allocno], i)
1044 && HARD_REGNO_MODE_OK (i, mode)
1045 && (REGNO_REG_CLASS (i) == REGNO_REG_CLASS (best_reg)
1046 || reg_class_subset_p (REGNO_REG_CLASS (i),
1047 REGNO_REG_CLASS (best_reg))
1048 || reg_class_subset_p (REGNO_REG_CLASS (best_reg),
1049 REGNO_REG_CLASS (i))))
1051 register int j;
1052 register int lim = i + HARD_REGNO_NREGS (i, mode);
1053 for (j = i + 1;
1054 (j < lim
1055 && ! TEST_HARD_REG_BIT (used, j)
1056 && (REGNO_REG_CLASS (j)
1057 == REGNO_REG_CLASS (best_reg + (j - i))
1058 || reg_class_subset_p (REGNO_REG_CLASS (j),
1059 REGNO_REG_CLASS (best_reg + (j - i)))
1060 || reg_class_subset_p (REGNO_REG_CLASS (best_reg + (j - i)),
1061 REGNO_REG_CLASS (j))));
1062 j++);
1063 if (j == lim)
1065 best_reg = i;
1066 break;
1070 no_prefs:
1072 /* If we haven't succeeded yet, try with caller-saves.
1073 We need not check to see if the current function has nonlocal
1074 labels because we don't put any pseudos that are live over calls in
1075 registers in that case. */
1077 if (flag_caller_saves && best_reg < 0)
1079 /* Did not find a register. If it would be profitable to
1080 allocate a call-clobbered register and save and restore it
1081 around calls, do that. */
1082 if (! accept_call_clobbered
1083 && allocno_calls_crossed[allocno] != 0
1084 && CALLER_SAVE_PROFITABLE (allocno_n_refs[allocno],
1085 allocno_calls_crossed[allocno]))
1087 find_reg (allocno, losers, alt_regs_p, 1, retrying);
1088 if (reg_renumber[allocno_reg[allocno]] >= 0)
1090 caller_save_needed = 1;
1091 return;
1096 /* If we haven't succeeded yet,
1097 see if some hard reg that conflicts with us
1098 was utilized poorly by local-alloc.
1099 If so, kick out the regs that were put there by local-alloc
1100 so we can use it instead. */
1101 if (best_reg < 0 && !retrying
1102 /* Let's not bother with multi-reg allocnos. */
1103 && allocno_size[allocno] == 1)
1105 /* Count from the end, to find the least-used ones first. */
1106 for (i = FIRST_PSEUDO_REGISTER - 1; i >= 0; i--)
1108 #ifdef REG_ALLOC_ORDER
1109 int regno = reg_alloc_order[i];
1110 #else
1111 int regno = i;
1112 #endif
1114 if (local_reg_n_refs[regno] != 0
1115 /* Don't use a reg no good for this pseudo. */
1116 && ! TEST_HARD_REG_BIT (used2, regno)
1117 && HARD_REGNO_MODE_OK (regno, mode)
1118 #ifdef CLASS_CANNOT_CHANGE_SIZE
1119 && ! (reg_changes_size[allocno_reg[allocno]]
1120 && (TEST_HARD_REG_BIT
1121 (reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE],
1122 regno)))
1123 #endif
1126 /* We explicitly evaluate the divide results into temporary
1127 variables so as to avoid excess precision problems that occur
1128 on a i386-unknown-sysv4.2 (unixware) host. */
1130 double tmp1 = ((double) local_reg_n_refs[regno]
1131 / local_reg_live_length[regno]);
1132 double tmp2 = ((double) allocno_n_refs[allocno]
1133 / allocno_live_length[allocno]);
1135 if (tmp1 < tmp2)
1137 /* Hard reg REGNO was used less in total by local regs
1138 than it would be used by this one allocno! */
1139 int k;
1140 for (k = 0; k < max_regno; k++)
1141 if (reg_renumber[k] >= 0)
1143 int r = reg_renumber[k];
1144 int endregno
1145 = r + HARD_REGNO_NREGS (r, PSEUDO_REGNO_MODE (k));
1147 if (regno >= r && regno < endregno)
1148 reg_renumber[k] = -1;
1151 best_reg = regno;
1152 break;
1158 /* Did we find a register? */
1160 if (best_reg >= 0)
1162 register int lim, j;
1163 HARD_REG_SET this_reg;
1165 /* Yes. Record it as the hard register of this pseudo-reg. */
1166 reg_renumber[allocno_reg[allocno]] = best_reg;
1167 /* Also of any pseudo-regs that share with it. */
1168 if (reg_may_share[allocno_reg[allocno]])
1169 for (j = FIRST_PSEUDO_REGISTER; j < max_regno; j++)
1170 if (reg_allocno[j] == allocno)
1171 reg_renumber[j] = best_reg;
1173 /* Make a set of the hard regs being allocated. */
1174 CLEAR_HARD_REG_SET (this_reg);
1175 lim = best_reg + HARD_REGNO_NREGS (best_reg, mode);
1176 for (j = best_reg; j < lim; j++)
1178 SET_HARD_REG_BIT (this_reg, j);
1179 SET_HARD_REG_BIT (regs_used_so_far, j);
1180 /* This is no longer a reg used just by local regs. */
1181 local_reg_n_refs[j] = 0;
1183 /* For each other pseudo-reg conflicting with this one,
1184 mark it as conflicting with the hard regs this one occupies. */
1185 lim = allocno;
1186 for (j = 0; j < max_allocno; j++)
1187 if (CONFLICTP (lim, j) || CONFLICTP (j, lim))
1189 IOR_HARD_REG_SET (hard_reg_conflicts[j], this_reg);
1194 /* Called from `reload' to look for a hard reg to put pseudo reg REGNO in.
1195 Perhaps it had previously seemed not worth a hard reg,
1196 or perhaps its old hard reg has been commandeered for reloads.
1197 FORBIDDEN_REGS indicates certain hard regs that may not be used, even if
1198 they do not appear to be allocated.
1199 If FORBIDDEN_REGS is zero, no regs are forbidden. */
1201 void
1202 retry_global_alloc (regno, forbidden_regs)
1203 int regno;
1204 HARD_REG_SET forbidden_regs;
1206 int allocno = reg_allocno[regno];
1207 if (allocno >= 0)
1209 /* If we have more than one register class,
1210 first try allocating in the class that is cheapest
1211 for this pseudo-reg. If that fails, try any reg. */
1212 if (N_REG_CLASSES > 1)
1213 find_reg (allocno, forbidden_regs, 0, 0, 1);
1214 if (reg_renumber[regno] < 0
1215 && reg_alternate_class (regno) != NO_REGS)
1216 find_reg (allocno, forbidden_regs, 1, 0, 1);
1218 /* If we found a register, modify the RTL for the register to
1219 show the hard register, and mark that register live. */
1220 if (reg_renumber[regno] >= 0)
1222 REGNO (regno_reg_rtx[regno]) = reg_renumber[regno];
1223 mark_home_live (regno);
1228 /* Record a conflict between register REGNO
1229 and everything currently live.
1230 REGNO must not be a pseudo reg that was allocated
1231 by local_alloc; such numbers must be translated through
1232 reg_renumber before calling here. */
1234 static void
1235 record_one_conflict (regno)
1236 int regno;
1238 register int j;
1240 if (regno < FIRST_PSEUDO_REGISTER)
1241 /* When a hard register becomes live,
1242 record conflicts with live pseudo regs. */
1243 for (j = 0; j < max_allocno; j++)
1245 if (ALLOCNO_LIVE_P (j))
1246 SET_HARD_REG_BIT (hard_reg_conflicts[j], regno);
1248 else
1249 /* When a pseudo-register becomes live,
1250 record conflicts first with hard regs,
1251 then with other pseudo regs. */
1253 register int ialloc = reg_allocno[regno];
1254 register int ialloc_prod = ialloc * allocno_row_words;
1255 IOR_HARD_REG_SET (hard_reg_conflicts[ialloc], hard_regs_live);
1256 for (j = allocno_row_words - 1; j >= 0; j--)
1258 #if 0
1259 int k;
1260 for (k = 0; k < n_no_conflict_pairs; k++)
1261 if (! ((j == no_conflict_pairs[k].allocno1
1262 && ialloc == no_conflict_pairs[k].allocno2)
1264 (j == no_conflict_pairs[k].allocno2
1265 && ialloc == no_conflict_pairs[k].allocno1)))
1266 #endif /* 0 */
1267 conflicts[ialloc_prod + j] |= allocnos_live[j];
1272 /* Record all allocnos currently live as conflicting
1273 with each other and with all hard regs currently live.
1274 ALLOCNO_VEC is a vector of LEN allocnos, all allocnos that
1275 are currently live. Their bits are also flagged in allocnos_live. */
1277 static void
1278 record_conflicts (allocno_vec, len)
1279 register short *allocno_vec;
1280 register int len;
1282 register int allocno;
1283 register int j;
1284 register int ialloc_prod;
1286 while (--len >= 0)
1288 allocno = allocno_vec[len];
1289 ialloc_prod = allocno * allocno_row_words;
1290 IOR_HARD_REG_SET (hard_reg_conflicts[allocno], hard_regs_live);
1291 for (j = allocno_row_words - 1; j >= 0; j--)
1292 conflicts[ialloc_prod + j] |= allocnos_live[j];
1296 /* Handle the case where REG is set by the insn being scanned,
1297 during the forward scan to accumulate conflicts.
1298 Store a 1 in regs_live or allocnos_live for this register, record how many
1299 consecutive hardware registers it actually needs,
1300 and record a conflict with all other registers already live.
1302 Note that even if REG does not remain alive after this insn,
1303 we must mark it here as live, to ensure a conflict between
1304 REG and any other regs set in this insn that really do live.
1305 This is because those other regs could be considered after this.
1307 REG might actually be something other than a register;
1308 if so, we do nothing.
1310 SETTER is 0 if this register was modified by an auto-increment (i.e.,
1311 a REG_INC note was found for it).
1313 CLOBBERs are processed here by calling mark_reg_clobber. */
1315 static void
1316 mark_reg_store (orig_reg, setter)
1317 rtx orig_reg, setter;
1319 register int regno;
1320 register rtx reg = orig_reg;
1322 /* WORD is which word of a multi-register group is being stored.
1323 For the case where the store is actually into a SUBREG of REG.
1324 Except we don't use it; I believe the entire REG needs to be
1325 made live. */
1326 int word = 0;
1328 if (GET_CODE (reg) == SUBREG)
1330 word = SUBREG_WORD (reg);
1331 reg = SUBREG_REG (reg);
1334 if (GET_CODE (reg) != REG)
1335 return;
1337 if (setter && GET_CODE (setter) == CLOBBER)
1339 /* A clobber of a register should be processed here too. */
1340 mark_reg_clobber (orig_reg, setter);
1341 return;
1344 regs_set[n_regs_set++] = reg;
1346 if (setter)
1347 set_preference (reg, SET_SRC (setter));
1349 regno = REGNO (reg);
1351 if (reg_renumber[regno] >= 0)
1352 regno = reg_renumber[regno] /* + word */;
1354 /* Either this is one of the max_allocno pseudo regs not allocated,
1355 or it is or has a hardware reg. First handle the pseudo-regs. */
1356 if (regno >= FIRST_PSEUDO_REGISTER)
1358 if (reg_allocno[regno] >= 0)
1360 SET_ALLOCNO_LIVE (reg_allocno[regno]);
1361 record_one_conflict (regno);
1364 /* Handle hardware regs (and pseudos allocated to hard regs). */
1365 else if (! fixed_regs[regno])
1367 register int last = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg));
1368 while (regno < last)
1370 record_one_conflict (regno);
1371 SET_HARD_REG_BIT (hard_regs_live, regno);
1372 regno++;
1377 /* Like mark_reg_set except notice just CLOBBERs; ignore SETs. */
1379 static void
1380 mark_reg_clobber (reg, setter)
1381 rtx reg, setter;
1383 register int regno;
1385 /* WORD is which word of a multi-register group is being stored.
1386 For the case where the store is actually into a SUBREG of REG.
1387 Except we don't use it; I believe the entire REG needs to be
1388 made live. */
1389 int word = 0;
1391 if (GET_CODE (setter) != CLOBBER)
1392 return;
1394 if (GET_CODE (reg) == SUBREG)
1396 word = SUBREG_WORD (reg);
1397 reg = SUBREG_REG (reg);
1400 if (GET_CODE (reg) != REG)
1401 return;
1403 regs_set[n_regs_set++] = reg;
1405 regno = REGNO (reg);
1407 if (reg_renumber[regno] >= 0)
1408 regno = reg_renumber[regno] /* + word */;
1410 /* Either this is one of the max_allocno pseudo regs not allocated,
1411 or it is or has a hardware reg. First handle the pseudo-regs. */
1412 if (regno >= FIRST_PSEUDO_REGISTER)
1414 if (reg_allocno[regno] >= 0)
1416 SET_ALLOCNO_LIVE (reg_allocno[regno]);
1417 record_one_conflict (regno);
1420 /* Handle hardware regs (and pseudos allocated to hard regs). */
1421 else if (! fixed_regs[regno])
1423 register int last = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg));
1424 while (regno < last)
1426 record_one_conflict (regno);
1427 SET_HARD_REG_BIT (hard_regs_live, regno);
1428 regno++;
1433 /* Record that REG has conflicts with all the regs currently live.
1434 Do not mark REG itself as live. */
1436 static void
1437 mark_reg_conflicts (reg)
1438 rtx reg;
1440 register int regno;
1442 if (GET_CODE (reg) == SUBREG)
1443 reg = SUBREG_REG (reg);
1445 if (GET_CODE (reg) != REG)
1446 return;
1448 regno = REGNO (reg);
1450 if (reg_renumber[regno] >= 0)
1451 regno = reg_renumber[regno];
1453 /* Either this is one of the max_allocno pseudo regs not allocated,
1454 or it is or has a hardware reg. First handle the pseudo-regs. */
1455 if (regno >= FIRST_PSEUDO_REGISTER)
1457 if (reg_allocno[regno] >= 0)
1458 record_one_conflict (regno);
1460 /* Handle hardware regs (and pseudos allocated to hard regs). */
1461 else if (! fixed_regs[regno])
1463 register int last = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg));
1464 while (regno < last)
1466 record_one_conflict (regno);
1467 regno++;
1472 /* Mark REG as being dead (following the insn being scanned now).
1473 Store a 0 in regs_live or allocnos_live for this register. */
1475 static void
1476 mark_reg_death (reg)
1477 rtx reg;
1479 register int regno = REGNO (reg);
1481 /* For pseudo reg, see if it has been assigned a hardware reg. */
1482 if (reg_renumber[regno] >= 0)
1483 regno = reg_renumber[regno];
1485 /* Either this is one of the max_allocno pseudo regs not allocated,
1486 or it is a hardware reg. First handle the pseudo-regs. */
1487 if (regno >= FIRST_PSEUDO_REGISTER)
1489 if (reg_allocno[regno] >= 0)
1490 CLEAR_ALLOCNO_LIVE (reg_allocno[regno]);
1492 /* Handle hardware regs (and pseudos allocated to hard regs). */
1493 else if (! fixed_regs[regno])
1495 /* Pseudo regs already assigned hardware regs are treated
1496 almost the same as explicit hardware regs. */
1497 register int last = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg));
1498 while (regno < last)
1500 CLEAR_HARD_REG_BIT (hard_regs_live, regno);
1501 regno++;
1506 /* Mark hard reg REGNO as currently live, assuming machine mode MODE
1507 for the value stored in it. MODE determines how many consecutive
1508 registers are actually in use. Do not record conflicts;
1509 it is assumed that the caller will do that. */
1511 static void
1512 mark_reg_live_nc (regno, mode)
1513 register int regno;
1514 enum machine_mode mode;
1516 register int last = regno + HARD_REGNO_NREGS (regno, mode);
1517 while (regno < last)
1519 SET_HARD_REG_BIT (hard_regs_live, regno);
1520 regno++;
1524 /* Try to set a preference for an allocno to a hard register.
1525 We are passed DEST and SRC which are the operands of a SET. It is known
1526 that SRC is a register. If SRC or the first operand of SRC is a register,
1527 try to set a preference. If one of the two is a hard register and the other
1528 is a pseudo-register, mark the preference.
1530 Note that we are not as aggressive as local-alloc in trying to tie a
1531 pseudo-register to a hard register. */
1533 static void
1534 set_preference (dest, src)
1535 rtx dest, src;
1537 int src_regno, dest_regno;
1538 /* Amount to add to the hard regno for SRC, or subtract from that for DEST,
1539 to compensate for subregs in SRC or DEST. */
1540 int offset = 0;
1541 int i;
1542 int copy = 1;
1544 if (GET_RTX_FORMAT (GET_CODE (src))[0] == 'e')
1545 src = XEXP (src, 0), copy = 0;
1547 /* Get the reg number for both SRC and DEST.
1548 If neither is a reg, give up. */
1550 if (GET_CODE (src) == REG)
1551 src_regno = REGNO (src);
1552 else if (GET_CODE (src) == SUBREG && GET_CODE (SUBREG_REG (src)) == REG)
1554 src_regno = REGNO (SUBREG_REG (src));
1555 offset += SUBREG_WORD (src);
1557 else
1558 return;
1560 if (GET_CODE (dest) == REG)
1561 dest_regno = REGNO (dest);
1562 else if (GET_CODE (dest) == SUBREG && GET_CODE (SUBREG_REG (dest)) == REG)
1564 dest_regno = REGNO (SUBREG_REG (dest));
1565 offset -= SUBREG_WORD (dest);
1567 else
1568 return;
1570 /* Convert either or both to hard reg numbers. */
1572 if (reg_renumber[src_regno] >= 0)
1573 src_regno = reg_renumber[src_regno];
1575 if (reg_renumber[dest_regno] >= 0)
1576 dest_regno = reg_renumber[dest_regno];
1578 /* Now if one is a hard reg and the other is a global pseudo
1579 then give the other a preference. */
1581 if (dest_regno < FIRST_PSEUDO_REGISTER && src_regno >= FIRST_PSEUDO_REGISTER
1582 && reg_allocno[src_regno] >= 0)
1584 dest_regno -= offset;
1585 if (dest_regno >= 0 && dest_regno < FIRST_PSEUDO_REGISTER)
1587 if (copy)
1588 SET_REGBIT (hard_reg_copy_preferences,
1589 reg_allocno[src_regno], dest_regno);
1591 SET_REGBIT (hard_reg_preferences,
1592 reg_allocno[src_regno], dest_regno);
1593 for (i = dest_regno;
1594 i < dest_regno + HARD_REGNO_NREGS (dest_regno, GET_MODE (dest));
1595 i++)
1596 SET_REGBIT (hard_reg_full_preferences, reg_allocno[src_regno], i);
1600 if (src_regno < FIRST_PSEUDO_REGISTER && dest_regno >= FIRST_PSEUDO_REGISTER
1601 && reg_allocno[dest_regno] >= 0)
1603 src_regno += offset;
1604 if (src_regno >= 0 && src_regno < FIRST_PSEUDO_REGISTER)
1606 if (copy)
1607 SET_REGBIT (hard_reg_copy_preferences,
1608 reg_allocno[dest_regno], src_regno);
1610 SET_REGBIT (hard_reg_preferences,
1611 reg_allocno[dest_regno], src_regno);
1612 for (i = src_regno;
1613 i < src_regno + HARD_REGNO_NREGS (src_regno, GET_MODE (src));
1614 i++)
1615 SET_REGBIT (hard_reg_full_preferences, reg_allocno[dest_regno], i);
1620 /* Indicate that hard register number FROM was eliminated and replaced with
1621 an offset from hard register number TO. The status of hard registers live
1622 at the start of a basic block is updated by replacing a use of FROM with
1623 a use of TO. */
1625 void
1626 mark_elimination (from, to)
1627 int from, to;
1629 int i;
1631 for (i = 0; i < n_basic_blocks; i++)
1632 if ((basic_block_live_at_start[i][from / REGSET_ELT_BITS]
1633 & ((REGSET_ELT_TYPE) 1 << (from % REGSET_ELT_BITS))) != 0)
1635 basic_block_live_at_start[i][from / REGSET_ELT_BITS]
1636 &= ~ ((REGSET_ELT_TYPE) 1 << (from % REGSET_ELT_BITS));
1637 basic_block_live_at_start[i][to / REGSET_ELT_BITS]
1638 |= ((REGSET_ELT_TYPE) 1 << (to % REGSET_ELT_BITS));
1642 /* Print debugging trace information if -greg switch is given,
1643 showing the information on which the allocation decisions are based. */
1645 static void
1646 dump_conflicts (file)
1647 FILE *file;
1649 register int i;
1650 register int has_preferences;
1651 fprintf (file, ";; %d regs to allocate:", max_allocno);
1652 for (i = 0; i < max_allocno; i++)
1654 int j;
1655 fprintf (file, " %d", allocno_reg[allocno_order[i]]);
1656 for (j = 0; j < max_regno; j++)
1657 if (reg_allocno[j] == allocno_order[i]
1658 && j != allocno_reg[allocno_order[i]])
1659 fprintf (file, "+%d", j);
1660 if (allocno_size[allocno_order[i]] != 1)
1661 fprintf (file, " (%d)", allocno_size[allocno_order[i]]);
1663 fprintf (file, "\n");
1665 for (i = 0; i < max_allocno; i++)
1667 register int j;
1668 fprintf (file, ";; %d conflicts:", allocno_reg[i]);
1669 for (j = 0; j < max_allocno; j++)
1670 if (CONFLICTP (i, j) || CONFLICTP (j, i))
1671 fprintf (file, " %d", allocno_reg[j]);
1672 for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
1673 if (TEST_HARD_REG_BIT (hard_reg_conflicts[i], j))
1674 fprintf (file, " %d", j);
1675 fprintf (file, "\n");
1677 has_preferences = 0;
1678 for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
1679 if (TEST_HARD_REG_BIT (hard_reg_preferences[i], j))
1680 has_preferences = 1;
1682 if (! has_preferences)
1683 continue;
1684 fprintf (file, ";; %d preferences:", allocno_reg[i]);
1685 for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
1686 if (TEST_HARD_REG_BIT (hard_reg_preferences[i], j))
1687 fprintf (file, " %d", j);
1688 fprintf (file, "\n");
1690 fprintf (file, "\n");
1693 void
1694 dump_global_regs (file)
1695 FILE *file;
1697 register int i, j;
1699 fprintf (file, ";; Register dispositions:\n");
1700 for (i = FIRST_PSEUDO_REGISTER, j = 0; i < max_regno; i++)
1701 if (reg_renumber[i] >= 0)
1703 fprintf (file, "%d in %d ", i, reg_renumber[i]);
1704 if (++j % 6 == 0)
1705 fprintf (file, "\n");
1708 fprintf (file, "\n\n;; Hard regs used: ");
1709 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1710 if (regs_ever_live[i])
1711 fprintf (file, " %d", i);
1712 fprintf (file, "\n\n");