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