OSDN Git Service

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