OSDN Git Service

fortran/
[pf3gnuchains/gcc-fork.git] / gcc / global.c
1 /* Allocate registers for pseudo-registers that span basic blocks.
2    Copyright (C) 1987, 1988, 1991, 1994, 1996, 1997, 1998,
3    1999, 2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, USA.  */
21
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "machmode.h"
28 #include "hard-reg-set.h"
29 #include "rtl.h"
30 #include "tm_p.h"
31 #include "flags.h"
32 #include "regs.h"
33 #include "function.h"
34 #include "insn-config.h"
35 #include "recog.h"
36 #include "reload.h"
37 #include "output.h"
38 #include "toplev.h"
39 #include "tree-pass.h"
40 #include "timevar.h"
41
42 /* This pass of the compiler performs global register allocation.
43    It assigns hard register numbers to all the pseudo registers
44    that were not handled in local_alloc.  Assignments are recorded
45    in the vector reg_renumber, not by changing the rtl code.
46    (Such changes are made by final).  The entry point is
47    the function global_alloc.
48
49    After allocation is complete, the reload pass is run as a subroutine
50    of this pass, so that when a pseudo reg loses its hard reg due to
51    spilling it is possible to make a second attempt to find a hard
52    reg for it.  The reload pass is independent in other respects
53    and it is run even when stupid register allocation is in use.
54
55    1. Assign allocation-numbers (allocnos) to the pseudo-registers
56    still needing allocations and to the pseudo-registers currently
57    allocated by local-alloc which may be spilled by reload.
58    Set up tables reg_allocno and allocno_reg to map
59    reg numbers to allocnos and vice versa.
60    max_allocno gets the number of allocnos in use.
61
62    2. Allocate a max_allocno by max_allocno conflict bit matrix and clear it.
63    Allocate a max_allocno by FIRST_PSEUDO_REGISTER conflict matrix
64    for conflicts between allocnos and explicit hard register use
65    (which includes use of pseudo-registers allocated by local_alloc).
66
67    3. For each basic block
68     walk forward through the block, recording which
69     pseudo-registers and which hardware registers are live.
70     Build the conflict matrix between the pseudo-registers
71     and another of pseudo-registers versus hardware registers.
72     Also record the preferred hardware registers
73     for each pseudo-register.
74
75    4. Sort a table of the allocnos into order of
76    desirability of the variables.
77
78    5. Allocate the variables in that order; each if possible into
79    a preferred register, else into another register.  */
80 \f
81 /* Number of pseudo-registers which are candidates for allocation.  */
82
83 static int max_allocno;
84
85 /* Indexed by (pseudo) reg number, gives the allocno, or -1
86    for pseudo registers which are not to be allocated.  */
87
88 static int *reg_allocno;
89
90 struct allocno
91 {
92   int reg;
93   /* Gives the number of consecutive hard registers needed by that
94      pseudo reg.  */
95   int size;
96
97   /* Number of calls crossed by each allocno.  */
98   int calls_crossed;
99
100   /* Number of calls that might throw crossed by each allocno.  */
101   int throwing_calls_crossed;
102
103   /* Number of refs to each allocno.  */
104   int n_refs;
105
106   /* Frequency of uses of each allocno.  */
107   int freq;
108
109   /* Guess at live length of each allocno.
110      This is actually the max of the live lengths of the regs.  */
111   int live_length;
112
113   /* Set of hard regs conflicting with allocno N.  */
114
115   HARD_REG_SET hard_reg_conflicts;
116
117   /* Set of hard regs preferred by allocno N.
118      This is used to make allocnos go into regs that are copied to or from them,
119      when possible, to reduce register shuffling.  */
120
121   HARD_REG_SET hard_reg_preferences;
122
123   /* Similar, but just counts register preferences made in simple copy
124      operations, rather than arithmetic.  These are given priority because
125      we can always eliminate an insn by using these, but using a register
126      in the above list won't always eliminate an insn.  */
127
128   HARD_REG_SET hard_reg_copy_preferences;
129
130   /* Similar to hard_reg_preferences, but includes bits for subsequent
131      registers when an allocno is multi-word.  The above variable is used for
132      allocation while this is used to build reg_someone_prefers, below.  */
133
134   HARD_REG_SET hard_reg_full_preferences;
135
136   /* Set of hard registers that some later allocno has a preference for.  */
137
138   HARD_REG_SET regs_someone_prefers;
139
140 #ifdef STACK_REGS
141   /* Set to true if allocno can't be allocated in the stack register.  */
142   bool no_stack_reg;
143 #endif
144 };
145
146 static struct allocno *allocno;
147
148 /* A vector of the integers from 0 to max_allocno-1,
149    sorted in the order of first-to-be-allocated first.  */
150
151 static int *allocno_order;
152
153 /* Indexed by (pseudo) reg number, gives the number of another
154    lower-numbered pseudo reg which can share a hard reg with this pseudo
155    *even if the two pseudos would otherwise appear to conflict*.  */
156
157 static int *reg_may_share;
158
159 /* Define the number of bits in each element of `conflicts' and what
160    type that element has.  We use the largest integer format on the
161    host machine.  */
162
163 #define INT_BITS HOST_BITS_PER_WIDE_INT
164 #define INT_TYPE HOST_WIDE_INT
165
166 /* max_allocno by max_allocno array of bits,
167    recording whether two allocno's conflict (can't go in the same
168    hardware register).
169
170    `conflicts' is symmetric after the call to mirror_conflicts.  */
171
172 static INT_TYPE *conflicts;
173
174 /* Number of ints required to hold max_allocno bits.
175    This is the length of a row in `conflicts'.  */
176
177 static int allocno_row_words;
178
179 /* Two macros to test or store 1 in an element of `conflicts'.  */
180
181 #define CONFLICTP(I, J) \
182  (conflicts[(I) * allocno_row_words + (unsigned) (J) / INT_BITS]        \
183   & ((INT_TYPE) 1 << ((unsigned) (J) % INT_BITS)))
184
185 /* For any allocno set in ALLOCNO_SET, set ALLOCNO to that allocno,
186    and execute CODE.  */
187 #define EXECUTE_IF_SET_IN_ALLOCNO_SET(ALLOCNO_SET, ALLOCNO, CODE)       \
188 do {                                                                    \
189   int i_;                                                               \
190   int allocno_;                                                         \
191   INT_TYPE *p_ = (ALLOCNO_SET);                                         \
192                                                                         \
193   for (i_ = allocno_row_words - 1, allocno_ = 0; i_ >= 0;               \
194        i_--, allocno_ += INT_BITS)                                      \
195     {                                                                   \
196       unsigned INT_TYPE word_ = (unsigned INT_TYPE) *p_++;              \
197                                                                         \
198       for ((ALLOCNO) = allocno_; word_; word_ >>= 1, (ALLOCNO)++)       \
199         {                                                               \
200           if (word_ & 1)                                                \
201             {CODE;}                                                     \
202         }                                                               \
203     }                                                                   \
204 } while (0)
205
206 /* This doesn't work for non-GNU C due to the way CODE is macro expanded.  */
207 #if 0
208 /* For any allocno that conflicts with IN_ALLOCNO, set OUT_ALLOCNO to
209    the conflicting allocno, and execute CODE.  This macro assumes that
210    mirror_conflicts has been run.  */
211 #define EXECUTE_IF_CONFLICT(IN_ALLOCNO, OUT_ALLOCNO, CODE)\
212   EXECUTE_IF_SET_IN_ALLOCNO_SET (conflicts + (IN_ALLOCNO) * allocno_row_words,\
213                                  OUT_ALLOCNO, (CODE))
214 #endif
215
216 /* Set of hard regs currently live (during scan of all insns).  */
217
218 static HARD_REG_SET hard_regs_live;
219
220 /* Set of registers that global-alloc isn't supposed to use.  */
221
222 static HARD_REG_SET no_global_alloc_regs;
223
224 /* Set of registers used so far.  */
225
226 static HARD_REG_SET regs_used_so_far;
227
228 /* Number of refs to each hard reg, as used by local alloc.
229    It is zero for a reg that contains global pseudos or is explicitly used.  */
230
231 static int local_reg_n_refs[FIRST_PSEUDO_REGISTER];
232
233 /* Frequency of uses of given hard reg.  */
234 static int local_reg_freq[FIRST_PSEUDO_REGISTER];
235
236 /* Guess at live length of each hard reg, as used by local alloc.
237    This is actually the sum of the live lengths of the specific regs.  */
238
239 static int local_reg_live_length[FIRST_PSEUDO_REGISTER];
240
241 /* Set to 1 a bit in a vector TABLE of HARD_REG_SETs, for vector
242    element I, and hard register number J.  */
243
244 #define SET_REGBIT(TABLE, I, J)  SET_HARD_REG_BIT (allocno[I].TABLE, J)
245
246 /* Bit mask for allocnos live at current point in the scan.  */
247
248 static INT_TYPE *allocnos_live;
249
250 /* Test, set or clear bit number I in allocnos_live,
251    a bit vector indexed by allocno.  */
252
253 #define SET_ALLOCNO_LIVE(I)                             \
254   (allocnos_live[(unsigned) (I) / INT_BITS]             \
255      |= ((INT_TYPE) 1 << ((unsigned) (I) % INT_BITS)))
256
257 #define CLEAR_ALLOCNO_LIVE(I)                           \
258   (allocnos_live[(unsigned) (I) / INT_BITS]             \
259      &= ~((INT_TYPE) 1 << ((unsigned) (I) % INT_BITS)))
260
261 /* This is turned off because it doesn't work right for DImode.
262    (And it is only used for DImode, so the other cases are worthless.)
263    The problem is that it isn't true that there is NO possibility of conflict;
264    only that there is no conflict if the two pseudos get the exact same regs.
265    If they were allocated with a partial overlap, there would be a conflict.
266    We can't safely turn off the conflict unless we have another way to
267    prevent the partial overlap.
268
269    Idea: change hard_reg_conflicts so that instead of recording which
270    hard regs the allocno may not overlap, it records where the allocno
271    may not start.  Change both where it is used and where it is updated.
272    Then there is a way to record that (reg:DI 108) may start at 10
273    but not at 9 or 11.  There is still the question of how to record
274    this semi-conflict between two pseudos.  */
275 #if 0
276 /* Reg pairs for which conflict after the current insn
277    is inhibited by a REG_NO_CONFLICT note.
278    If the table gets full, we ignore any other notes--that is conservative.  */
279 #define NUM_NO_CONFLICT_PAIRS 4
280 /* Number of pairs in use in this insn.  */
281 int n_no_conflict_pairs;
282 static struct { int allocno1, allocno2;}
283   no_conflict_pairs[NUM_NO_CONFLICT_PAIRS];
284 #endif /* 0 */
285
286 /* Record all regs that are set in any one insn.
287    Communication from mark_reg_{store,clobber} and global_conflicts.  */
288
289 static rtx *regs_set;
290 static int n_regs_set;
291
292 /* All registers that can be eliminated.  */
293
294 static HARD_REG_SET eliminable_regset;
295
296 static int allocno_compare (const void *, const void *);
297 static void global_conflicts (void);
298 static void mirror_conflicts (void);
299 static void expand_preferences (void);
300 static void prune_preferences (void);
301 static void find_reg (int, HARD_REG_SET, int, int, int);
302 static void record_one_conflict (int);
303 static void record_conflicts (int *, int);
304 static void mark_reg_store (rtx, rtx, void *);
305 static void mark_reg_clobber (rtx, rtx, void *);
306 static void mark_reg_conflicts (rtx);
307 static void mark_reg_death (rtx);
308 static void mark_reg_live_nc (int, enum machine_mode);
309 static void set_preference (rtx, rtx);
310 static void dump_conflicts (FILE *);
311 static void reg_becomes_live (rtx, rtx, void *);
312 static void reg_dies (int, enum machine_mode, struct insn_chain *);
313
314 static void allocate_bb_info (void);
315 static void free_bb_info (void);
316 static bool check_earlyclobber (rtx);
317 static void mark_reg_use_for_earlyclobber_1 (rtx *, void *);
318 static int mark_reg_use_for_earlyclobber (rtx *, void *);
319 static void calculate_local_reg_bb_info (void);
320 static void set_up_bb_rts_numbers (void);
321 static int rpost_cmp (const void *, const void *);
322 static void calculate_reg_pav (void);
323 static void modify_reg_pav (void);
324 static void make_accurate_live_analysis (void);
325
326 \f
327
328 /* Perform allocation of pseudo-registers not allocated by local_alloc.
329
330    Return value is nonzero if reload failed
331    and we must not do any more for this function.  */
332
333 static int
334 global_alloc (void)
335 {
336   int retval;
337 #ifdef ELIMINABLE_REGS
338   static const struct {const int from, to; } eliminables[] = ELIMINABLE_REGS;
339 #endif
340   int need_fp
341     = (! flag_omit_frame_pointer
342        || (current_function_calls_alloca && EXIT_IGNORE_STACK)
343        || FRAME_POINTER_REQUIRED);
344
345   size_t i;
346   rtx x;
347
348   make_accurate_live_analysis ();
349
350   max_allocno = 0;
351
352   /* A machine may have certain hard registers that
353      are safe to use only within a basic block.  */
354
355   CLEAR_HARD_REG_SET (no_global_alloc_regs);
356
357   /* Build the regset of all eliminable registers and show we can't use those
358      that we already know won't be eliminated.  */
359 #ifdef ELIMINABLE_REGS
360   for (i = 0; i < ARRAY_SIZE (eliminables); i++)
361     {
362       bool cannot_elim
363         = (! CAN_ELIMINATE (eliminables[i].from, eliminables[i].to)
364            || (eliminables[i].to == STACK_POINTER_REGNUM && need_fp));
365
366       if (!regs_asm_clobbered[eliminables[i].from])
367         {
368           SET_HARD_REG_BIT (eliminable_regset, eliminables[i].from);
369
370           if (cannot_elim)
371             SET_HARD_REG_BIT (no_global_alloc_regs, eliminables[i].from);
372         }
373       else if (cannot_elim)
374         error ("%s cannot be used in asm here",
375                reg_names[eliminables[i].from]);
376       else
377         regs_ever_live[eliminables[i].from] = 1;
378     }
379 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
380   if (!regs_asm_clobbered[HARD_FRAME_POINTER_REGNUM])
381     {
382       SET_HARD_REG_BIT (eliminable_regset, HARD_FRAME_POINTER_REGNUM);
383       if (need_fp)
384         SET_HARD_REG_BIT (no_global_alloc_regs, HARD_FRAME_POINTER_REGNUM);
385     }
386   else if (need_fp)
387     error ("%s cannot be used in asm here",
388            reg_names[HARD_FRAME_POINTER_REGNUM]);
389   else
390     regs_ever_live[HARD_FRAME_POINTER_REGNUM] = 1;
391 #endif
392
393 #else
394   if (!regs_asm_clobbered[FRAME_POINTER_REGNUM])
395     {
396       SET_HARD_REG_BIT (eliminable_regset, FRAME_POINTER_REGNUM);
397       if (need_fp)
398         SET_HARD_REG_BIT (no_global_alloc_regs, FRAME_POINTER_REGNUM);
399     }
400   else if (need_fp)
401     error ("%s cannot be used in asm here", reg_names[FRAME_POINTER_REGNUM]);
402   else
403     regs_ever_live[FRAME_POINTER_REGNUM] = 1;
404 #endif
405
406   /* Track which registers have already been used.  Start with registers
407      explicitly in the rtl, then registers allocated by local register
408      allocation.  */
409
410   CLEAR_HARD_REG_SET (regs_used_so_far);
411 #ifdef LEAF_REGISTERS
412   /* If we are doing the leaf function optimization, and this is a leaf
413      function, it means that the registers that take work to save are those
414      that need a register window.  So prefer the ones that can be used in
415      a leaf function.  */
416   {
417     const char *cheap_regs;
418     const char *const leaf_regs = LEAF_REGISTERS;
419
420     if (only_leaf_regs_used () && leaf_function_p ())
421       cheap_regs = leaf_regs;
422     else
423       cheap_regs = call_used_regs;
424     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
425       if (regs_ever_live[i] || cheap_regs[i])
426         SET_HARD_REG_BIT (regs_used_so_far, i);
427   }
428 #else
429   /* We consider registers that do not have to be saved over calls as if
430      they were already used since there is no cost in using them.  */
431   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
432     if (regs_ever_live[i] || call_used_regs[i])
433       SET_HARD_REG_BIT (regs_used_so_far, i);
434 #endif
435
436   for (i = FIRST_PSEUDO_REGISTER; i < (size_t) max_regno; i++)
437     if (reg_renumber[i] >= 0)
438       SET_HARD_REG_BIT (regs_used_so_far, reg_renumber[i]);
439
440   /* Establish mappings from register number to allocation number
441      and vice versa.  In the process, count the allocnos.  */
442
443   reg_allocno = XNEWVEC (int, max_regno);
444
445   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
446     reg_allocno[i] = -1;
447
448   /* Initialize the shared-hard-reg mapping
449      from the list of pairs that may share.  */
450   reg_may_share = XCNEWVEC (int, max_regno);
451   for (x = regs_may_share; x; x = XEXP (XEXP (x, 1), 1))
452     {
453       int r1 = REGNO (XEXP (x, 0));
454       int r2 = REGNO (XEXP (XEXP (x, 1), 0));
455       if (r1 > r2)
456         reg_may_share[r1] = r2;
457       else
458         reg_may_share[r2] = r1;
459     }
460
461   for (i = FIRST_PSEUDO_REGISTER; i < (size_t) max_regno; i++)
462     /* Note that reg_live_length[i] < 0 indicates a "constant" reg
463        that we are supposed to refrain from putting in a hard reg.
464        -2 means do make an allocno but don't allocate it.  */
465     if (REG_N_REFS (i) != 0 && REG_LIVE_LENGTH (i) != -1
466         /* Don't allocate pseudos that cross calls,
467            if this function receives a nonlocal goto.  */
468         && (! current_function_has_nonlocal_label
469             || REG_N_CALLS_CROSSED (i) == 0))
470       {
471         if (reg_renumber[i] < 0
472             && reg_may_share[i] && reg_allocno[reg_may_share[i]] >= 0)
473           reg_allocno[i] = reg_allocno[reg_may_share[i]];
474         else
475           reg_allocno[i] = max_allocno++;
476         gcc_assert (REG_LIVE_LENGTH (i));
477       }
478     else
479       reg_allocno[i] = -1;
480
481   allocno = XCNEWVEC (struct allocno, max_allocno);
482
483   for (i = FIRST_PSEUDO_REGISTER; i < (size_t) max_regno; i++)
484     if (reg_allocno[i] >= 0)
485       {
486         int num = reg_allocno[i];
487         allocno[num].reg = i;
488         allocno[num].size = PSEUDO_REGNO_SIZE (i);
489         allocno[num].calls_crossed += REG_N_CALLS_CROSSED (i);
490         allocno[num].throwing_calls_crossed
491           += REG_N_THROWING_CALLS_CROSSED (i);
492         allocno[num].n_refs += REG_N_REFS (i);
493         allocno[num].freq += REG_FREQ (i);
494         if (allocno[num].live_length < REG_LIVE_LENGTH (i))
495           allocno[num].live_length = REG_LIVE_LENGTH (i);
496       }
497
498   /* Calculate amount of usage of each hard reg by pseudos
499      allocated by local-alloc.  This is to see if we want to
500      override it.  */
501   memset (local_reg_live_length, 0, sizeof local_reg_live_length);
502   memset (local_reg_n_refs, 0, sizeof local_reg_n_refs);
503   memset (local_reg_freq, 0, sizeof local_reg_freq);
504   for (i = FIRST_PSEUDO_REGISTER; i < (size_t) max_regno; i++)
505     if (reg_renumber[i] >= 0)
506       {
507         int regno = reg_renumber[i];
508         int endregno = regno + hard_regno_nregs[regno][PSEUDO_REGNO_MODE (i)];
509         int j;
510
511         for (j = regno; j < endregno; j++)
512           {
513             local_reg_n_refs[j] += REG_N_REFS (i);
514             local_reg_freq[j] += REG_FREQ (i);
515             local_reg_live_length[j] += REG_LIVE_LENGTH (i);
516           }
517       }
518
519   /* We can't override local-alloc for a reg used not just by local-alloc.  */
520   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
521     if (regs_ever_live[i])
522       local_reg_n_refs[i] = 0, local_reg_freq[i] = 0;
523
524   allocno_row_words = (max_allocno + INT_BITS - 1) / INT_BITS;
525
526   /* We used to use alloca here, but the size of what it would try to
527      allocate would occasionally cause it to exceed the stack limit and
528      cause unpredictable core dumps.  Some examples were > 2Mb in size.  */
529   conflicts = XCNEWVEC (INT_TYPE, max_allocno * allocno_row_words);
530
531   allocnos_live = XNEWVEC (INT_TYPE, allocno_row_words);
532
533   /* If there is work to be done (at least one reg to allocate),
534      perform global conflict analysis and allocate the regs.  */
535
536   if (max_allocno > 0)
537     {
538       /* Scan all the insns and compute the conflicts among allocnos
539          and between allocnos and hard regs.  */
540
541       global_conflicts ();
542
543       mirror_conflicts ();
544
545       /* Eliminate conflicts between pseudos and eliminable registers.  If
546          the register is not eliminated, the pseudo won't really be able to
547          live in the eliminable register, so the conflict doesn't matter.
548          If we do eliminate the register, the conflict will no longer exist.
549          So in either case, we can ignore the conflict.  Likewise for
550          preferences.  */
551
552       for (i = 0; i < (size_t) max_allocno; i++)
553         {
554           AND_COMPL_HARD_REG_SET (allocno[i].hard_reg_conflicts,
555                                   eliminable_regset);
556           AND_COMPL_HARD_REG_SET (allocno[i].hard_reg_copy_preferences,
557                                   eliminable_regset);
558           AND_COMPL_HARD_REG_SET (allocno[i].hard_reg_preferences,
559                                   eliminable_regset);
560         }
561
562       /* Try to expand the preferences by merging them between allocnos.  */
563
564       expand_preferences ();
565
566       /* Determine the order to allocate the remaining pseudo registers.  */
567
568       allocno_order = XNEWVEC (int, max_allocno);
569       for (i = 0; i < (size_t) max_allocno; i++)
570         allocno_order[i] = i;
571
572       /* Default the size to 1, since allocno_compare uses it to divide by.
573          Also convert allocno_live_length of zero to -1.  A length of zero
574          can occur when all the registers for that allocno have reg_live_length
575          equal to -2.  In this case, we want to make an allocno, but not
576          allocate it.  So avoid the divide-by-zero and set it to a low
577          priority.  */
578
579       for (i = 0; i < (size_t) max_allocno; i++)
580         {
581           if (allocno[i].size == 0)
582             allocno[i].size = 1;
583           if (allocno[i].live_length == 0)
584             allocno[i].live_length = -1;
585         }
586
587       qsort (allocno_order, max_allocno, sizeof (int), allocno_compare);
588
589       prune_preferences ();
590
591       if (dump_file)
592         dump_conflicts (dump_file);
593
594       /* Try allocating them, one by one, in that order,
595          except for parameters marked with reg_live_length[regno] == -2.  */
596
597       for (i = 0; i < (size_t) max_allocno; i++)
598         if (reg_renumber[allocno[allocno_order[i]].reg] < 0
599             && REG_LIVE_LENGTH (allocno[allocno_order[i]].reg) >= 0)
600           {
601             /* If we have more than one register class,
602                first try allocating in the class that is cheapest
603                for this pseudo-reg.  If that fails, try any reg.  */
604             if (N_REG_CLASSES > 1)
605               {
606                 find_reg (allocno_order[i], 0, 0, 0, 0);
607                 if (reg_renumber[allocno[allocno_order[i]].reg] >= 0)
608                   continue;
609               }
610             if (reg_alternate_class (allocno[allocno_order[i]].reg) != NO_REGS)
611               find_reg (allocno_order[i], 0, 1, 0, 0);
612           }
613
614       free (allocno_order);
615     }
616
617   /* Do the reloads now while the allocno data still exists, so that we can
618      try to assign new hard regs to any pseudo regs that are spilled.  */
619
620 #if 0 /* We need to eliminate regs even if there is no rtl code,
621          for the sake of debugging information.  */
622   if (n_basic_blocks > NUM_FIXED_BLOCKS)
623 #endif
624     {
625       build_insn_chain (get_insns ());
626       retval = reload (get_insns (), 1);
627     }
628
629   /* Clean up.  */
630   free (reg_allocno);
631   free (reg_may_share);
632   free (allocno);
633   free (conflicts);
634   free (allocnos_live);
635
636   return retval;
637 }
638
639 /* Sort predicate for ordering the allocnos.
640    Returns -1 (1) if *v1 should be allocated before (after) *v2.  */
641
642 static int
643 allocno_compare (const void *v1p, const void *v2p)
644 {
645   int v1 = *(const int *)v1p, v2 = *(const int *)v2p;
646   /* Note that the quotient will never be bigger than
647      the value of floor_log2 times the maximum number of
648      times a register can occur in one insn (surely less than 100)
649      weighted by the frequency (maximally REG_FREQ_MAX).
650      Multiplying this by 10000/REG_FREQ_MAX can't overflow.  */
651   int pri1
652     = (((double) (floor_log2 (allocno[v1].n_refs) * allocno[v1].freq)
653         / allocno[v1].live_length)
654        * (10000 / REG_FREQ_MAX) * allocno[v1].size);
655   int pri2
656     = (((double) (floor_log2 (allocno[v2].n_refs) * allocno[v2].freq)
657         / allocno[v2].live_length)
658        * (10000 / REG_FREQ_MAX) * allocno[v2].size);
659   if (pri2 - pri1)
660     return pri2 - pri1;
661
662   /* If regs are equally good, sort by allocno,
663      so that the results of qsort leave nothing to chance.  */
664   return v1 - v2;
665 }
666 \f
667 /* Scan the rtl code and record all conflicts and register preferences in the
668    conflict matrices and preference tables.  */
669
670 static void
671 global_conflicts (void)
672 {
673   unsigned i;
674   basic_block b;
675   rtx insn;
676   int *block_start_allocnos;
677
678   /* Make a vector that mark_reg_{store,clobber} will store in.  */
679   regs_set = XNEWVEC (rtx, max_parallel * 2);
680
681   block_start_allocnos = XNEWVEC (int, max_allocno);
682
683   FOR_EACH_BB (b)
684     {
685       memset (allocnos_live, 0, allocno_row_words * sizeof (INT_TYPE));
686
687       /* Initialize table of registers currently live
688          to the state at the beginning of this basic block.
689          This also marks the conflicts among hard registers
690          and any allocnos that are live.
691
692          For pseudo-regs, there is only one bit for each one
693          no matter how many hard regs it occupies.
694          This is ok; we know the size from PSEUDO_REGNO_SIZE.
695          For explicit hard regs, we cannot know the size that way
696          since one hard reg can be used with various sizes.
697          Therefore, we must require that all the hard regs
698          implicitly live as part of a multi-word hard reg
699          be explicitly marked in basic_block_live_at_start.  */
700
701       {
702         regset old = b->il.rtl->global_live_at_start;
703         int ax = 0;
704         reg_set_iterator rsi;
705
706         REG_SET_TO_HARD_REG_SET (hard_regs_live, old);
707         EXECUTE_IF_SET_IN_REG_SET (old, FIRST_PSEUDO_REGISTER, i, rsi)
708           {
709             int a = reg_allocno[i];
710             if (a >= 0)
711               {
712                 SET_ALLOCNO_LIVE (a);
713                 block_start_allocnos[ax++] = a;
714               }
715             else if ((a = reg_renumber[i]) >= 0)
716               mark_reg_live_nc (a, PSEUDO_REGNO_MODE (i));
717           }
718
719         /* Record that each allocno now live conflicts with each hard reg
720            now live.
721
722            It is not necessary to mark any conflicts between pseudos at
723            this point, even for pseudos which are live at the start of
724            the basic block.
725
726              Given two pseudos X and Y and any point in the CFG P.
727
728              On any path to point P where X and Y are live one of the
729              following conditions must be true:
730
731                 1. X is live at some instruction on the path that
732                    evaluates Y.
733
734                 2. Y is live at some instruction on the path that
735                    evaluates X.
736
737                 3. Either X or Y is not evaluated on the path to P
738                    (i.e. it is used uninitialized) and thus the
739                    conflict can be ignored.
740
741             In cases #1 and #2 the conflict will be recorded when we
742             scan the instruction that makes either X or Y become live.  */
743         record_conflicts (block_start_allocnos, ax);
744
745         /* Pseudos can't go in stack regs at the start of a basic block that
746            is reached by an abnormal edge. Likewise for call clobbered regs,
747            because caller-save, fixup_abnormal_edges and possibly the table
748            driven EH machinery are not quite ready to handle such regs live
749            across such edges.  */
750         {
751           edge e;
752           edge_iterator ei;
753
754           FOR_EACH_EDGE (e, ei, b->preds)
755             if (e->flags & EDGE_ABNORMAL)
756               break;
757
758           if (e != NULL)
759             {
760 #ifdef STACK_REGS
761               EXECUTE_IF_SET_IN_ALLOCNO_SET (allocnos_live, ax,
762                                              {
763                                                allocno[ax].no_stack_reg = 1;
764                                              });
765               for (ax = FIRST_STACK_REG; ax <= LAST_STACK_REG; ax++)
766                 record_one_conflict (ax);
767 #endif
768
769               /* No need to record conflicts for call clobbered regs if we have
770                  nonlocal labels around, as we don't ever try to allocate such
771                  regs in this case.  */
772               if (! current_function_has_nonlocal_label)
773                 for (ax = 0; ax < FIRST_PSEUDO_REGISTER; ax++)
774                   if (call_used_regs [ax])
775                     record_one_conflict (ax);
776             }
777         }
778       }
779
780       insn = BB_HEAD (b);
781
782       /* Scan the code of this basic block, noting which allocnos
783          and hard regs are born or die.  When one is born,
784          record a conflict with all others currently live.  */
785
786       while (1)
787         {
788           RTX_CODE code = GET_CODE (insn);
789           rtx link;
790
791           /* Make regs_set an empty set.  */
792
793           n_regs_set = 0;
794
795           if (code == INSN || code == CALL_INSN || code == JUMP_INSN)
796             {
797
798 #if 0
799               int i = 0;
800               for (link = REG_NOTES (insn);
801                    link && i < NUM_NO_CONFLICT_PAIRS;
802                    link = XEXP (link, 1))
803                 if (REG_NOTE_KIND (link) == REG_NO_CONFLICT)
804                   {
805                     no_conflict_pairs[i].allocno1
806                       = reg_allocno[REGNO (SET_DEST (PATTERN (insn)))];
807                     no_conflict_pairs[i].allocno2
808                       = reg_allocno[REGNO (XEXP (link, 0))];
809                     i++;
810                   }
811 #endif /* 0 */
812
813               /* Mark any registers clobbered by INSN as live,
814                  so they conflict with the inputs.  */
815
816               note_stores (PATTERN (insn), mark_reg_clobber, NULL);
817
818               /* Mark any registers dead after INSN as dead now.  */
819
820               for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
821                 if (REG_NOTE_KIND (link) == REG_DEAD)
822                   mark_reg_death (XEXP (link, 0));
823
824               /* Mark any registers set in INSN as live,
825                  and mark them as conflicting with all other live regs.
826                  Clobbers are processed again, so they conflict with
827                  the registers that are set.  */
828
829               note_stores (PATTERN (insn), mark_reg_store, NULL);
830
831 #ifdef AUTO_INC_DEC
832               for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
833                 if (REG_NOTE_KIND (link) == REG_INC)
834                   mark_reg_store (XEXP (link, 0), NULL_RTX, NULL);
835 #endif
836
837               /* If INSN has multiple outputs, then any reg that dies here
838                  and is used inside of an output
839                  must conflict with the other outputs.
840
841                  It is unsafe to use !single_set here since it will ignore an
842                  unused output.  Just because an output is unused does not mean
843                  the compiler can assume the side effect will not occur.
844                  Consider if REG appears in the address of an output and we
845                  reload the output.  If we allocate REG to the same hard
846                  register as an unused output we could set the hard register
847                  before the output reload insn.  */
848               if (GET_CODE (PATTERN (insn)) == PARALLEL && multiple_sets (insn))
849                 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
850                   if (REG_NOTE_KIND (link) == REG_DEAD)
851                     {
852                       int used_in_output = 0;
853                       int i;
854                       rtx reg = XEXP (link, 0);
855
856                       for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
857                         {
858                           rtx set = XVECEXP (PATTERN (insn), 0, i);
859                           if (GET_CODE (set) == SET
860                               && !REG_P (SET_DEST (set))
861                               && !rtx_equal_p (reg, SET_DEST (set))
862                               && reg_overlap_mentioned_p (reg, SET_DEST (set)))
863                             used_in_output = 1;
864                         }
865                       if (used_in_output)
866                         mark_reg_conflicts (reg);
867                     }
868
869               /* Mark any registers set in INSN and then never used.  */
870
871               while (n_regs_set-- > 0)
872                 {
873                   rtx note = find_regno_note (insn, REG_UNUSED,
874                                               REGNO (regs_set[n_regs_set]));
875                   if (note)
876                     mark_reg_death (XEXP (note, 0));
877                 }
878             }
879
880           if (insn == BB_END (b))
881             break;
882           insn = NEXT_INSN (insn);
883         }
884     }
885
886   /* Clean up.  */
887   free (block_start_allocnos);
888   free (regs_set);
889 }
890 /* Expand the preference information by looking for cases where one allocno
891    dies in an insn that sets an allocno.  If those two allocnos don't conflict,
892    merge any preferences between those allocnos.  */
893
894 static void
895 expand_preferences (void)
896 {
897   rtx insn;
898   rtx link;
899   rtx set;
900
901   /* We only try to handle the most common cases here.  Most of the cases
902      where this wins are reg-reg copies.  */
903
904   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
905     if (INSN_P (insn)
906         && (set = single_set (insn)) != 0
907         && REG_P (SET_DEST (set))
908         && reg_allocno[REGNO (SET_DEST (set))] >= 0)
909       for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
910         if (REG_NOTE_KIND (link) == REG_DEAD
911             && REG_P (XEXP (link, 0))
912             && reg_allocno[REGNO (XEXP (link, 0))] >= 0
913             && ! CONFLICTP (reg_allocno[REGNO (SET_DEST (set))],
914                             reg_allocno[REGNO (XEXP (link, 0))]))
915           {
916             int a1 = reg_allocno[REGNO (SET_DEST (set))];
917             int a2 = reg_allocno[REGNO (XEXP (link, 0))];
918
919             if (XEXP (link, 0) == SET_SRC (set))
920               {
921                 IOR_HARD_REG_SET (allocno[a1].hard_reg_copy_preferences,
922                                   allocno[a2].hard_reg_copy_preferences);
923                 IOR_HARD_REG_SET (allocno[a2].hard_reg_copy_preferences,
924                                   allocno[a1].hard_reg_copy_preferences);
925               }
926
927             IOR_HARD_REG_SET (allocno[a1].hard_reg_preferences,
928                               allocno[a2].hard_reg_preferences);
929             IOR_HARD_REG_SET (allocno[a2].hard_reg_preferences,
930                               allocno[a1].hard_reg_preferences);
931             IOR_HARD_REG_SET (allocno[a1].hard_reg_full_preferences,
932                               allocno[a2].hard_reg_full_preferences);
933             IOR_HARD_REG_SET (allocno[a2].hard_reg_full_preferences,
934                               allocno[a1].hard_reg_full_preferences);
935           }
936 }
937 \f
938 /* Prune the preferences for global registers to exclude registers that cannot
939    be used.
940
941    Compute `regs_someone_prefers', which is a bitmask of the hard registers
942    that are preferred by conflicting registers of lower priority.  If possible,
943    we will avoid using these registers.  */
944
945 static void
946 prune_preferences (void)
947 {
948   int i;
949   int num;
950   int *allocno_to_order = XNEWVEC (int, max_allocno);
951
952   /* Scan least most important to most important.
953      For each allocno, remove from preferences registers that cannot be used,
954      either because of conflicts or register type.  Then compute all registers
955      preferred by each lower-priority register that conflicts.  */
956
957   for (i = max_allocno - 1; i >= 0; i--)
958     {
959       HARD_REG_SET temp;
960
961       num = allocno_order[i];
962       allocno_to_order[num] = i;
963       COPY_HARD_REG_SET (temp, allocno[num].hard_reg_conflicts);
964
965       if (allocno[num].calls_crossed == 0)
966         IOR_HARD_REG_SET (temp, fixed_reg_set);
967       else
968         IOR_HARD_REG_SET (temp, call_used_reg_set);
969
970       IOR_COMPL_HARD_REG_SET
971         (temp,
972          reg_class_contents[(int) reg_preferred_class (allocno[num].reg)]);
973
974       AND_COMPL_HARD_REG_SET (allocno[num].hard_reg_preferences, temp);
975       AND_COMPL_HARD_REG_SET (allocno[num].hard_reg_copy_preferences, temp);
976       AND_COMPL_HARD_REG_SET (allocno[num].hard_reg_full_preferences, temp);
977     }
978
979   for (i = max_allocno - 1; i >= 0; i--)
980     {
981       /* Merge in the preferences of lower-priority registers (they have
982          already been pruned).  If we also prefer some of those registers,
983          don't exclude them unless we are of a smaller size (in which case
984          we want to give the lower-priority allocno the first chance for
985          these registers).  */
986       HARD_REG_SET temp, temp2;
987       int allocno2;
988
989       num = allocno_order[i];
990
991       CLEAR_HARD_REG_SET (temp);
992       CLEAR_HARD_REG_SET (temp2);
993
994       EXECUTE_IF_SET_IN_ALLOCNO_SET (conflicts + num * allocno_row_words,
995                                      allocno2,
996         {
997           if (allocno_to_order[allocno2] > i)
998             {
999               if (allocno[allocno2].size <= allocno[num].size)
1000                 IOR_HARD_REG_SET (temp,
1001                                   allocno[allocno2].hard_reg_full_preferences);
1002               else
1003                 IOR_HARD_REG_SET (temp2,
1004                                   allocno[allocno2].hard_reg_full_preferences);
1005             }
1006         });
1007
1008       AND_COMPL_HARD_REG_SET (temp, allocno[num].hard_reg_full_preferences);
1009       IOR_HARD_REG_SET (temp, temp2);
1010       COPY_HARD_REG_SET (allocno[num].regs_someone_prefers, temp);
1011     }
1012   free (allocno_to_order);
1013 }
1014 \f
1015 /* Assign a hard register to allocno NUM; look for one that is the beginning
1016    of a long enough stretch of hard regs none of which conflicts with ALLOCNO.
1017    The registers marked in PREFREGS are tried first.
1018
1019    LOSERS, if nonzero, is a HARD_REG_SET indicating registers that cannot
1020    be used for this allocation.
1021
1022    If ALT_REGS_P is zero, consider only the preferred class of ALLOCNO's reg.
1023    Otherwise ignore that preferred class and use the alternate class.
1024
1025    If ACCEPT_CALL_CLOBBERED is nonzero, accept a call-clobbered hard reg that
1026    will have to be saved and restored at calls.
1027
1028    RETRYING is nonzero if this is called from retry_global_alloc.
1029
1030    If we find one, record it in reg_renumber.
1031    If not, do nothing.  */
1032
1033 static void
1034 find_reg (int num, HARD_REG_SET losers, int alt_regs_p, int accept_call_clobbered, int retrying)
1035 {
1036   int i, best_reg, pass;
1037   HARD_REG_SET used, used1, used2;
1038
1039   enum reg_class class = (alt_regs_p
1040                           ? reg_alternate_class (allocno[num].reg)
1041                           : reg_preferred_class (allocno[num].reg));
1042   enum machine_mode mode = PSEUDO_REGNO_MODE (allocno[num].reg);
1043
1044   if (accept_call_clobbered)
1045     COPY_HARD_REG_SET (used1, call_fixed_reg_set);
1046   else if (allocno[num].calls_crossed == 0)
1047     COPY_HARD_REG_SET (used1, fixed_reg_set);
1048   else
1049     COPY_HARD_REG_SET (used1, call_used_reg_set);
1050
1051   /* Some registers should not be allocated in global-alloc.  */
1052   IOR_HARD_REG_SET (used1, no_global_alloc_regs);
1053   if (losers)
1054     IOR_HARD_REG_SET (used1, losers);
1055
1056   IOR_COMPL_HARD_REG_SET (used1, reg_class_contents[(int) class]);
1057   COPY_HARD_REG_SET (used2, used1);
1058
1059   IOR_HARD_REG_SET (used1, allocno[num].hard_reg_conflicts);
1060
1061 #ifdef CANNOT_CHANGE_MODE_CLASS
1062   cannot_change_mode_set_regs (&used1, mode, allocno[num].reg);
1063 #endif
1064
1065   /* Try each hard reg to see if it fits.  Do this in two passes.
1066      In the first pass, skip registers that are preferred by some other pseudo
1067      to give it a better chance of getting one of those registers.  Only if
1068      we can't get a register when excluding those do we take one of them.
1069      However, we never allocate a register for the first time in pass 0.  */
1070
1071   COPY_HARD_REG_SET (used, used1);
1072   IOR_COMPL_HARD_REG_SET (used, regs_used_so_far);
1073   IOR_HARD_REG_SET (used, allocno[num].regs_someone_prefers);
1074
1075   best_reg = -1;
1076   for (i = FIRST_PSEUDO_REGISTER, pass = 0;
1077        pass <= 1 && i >= FIRST_PSEUDO_REGISTER;
1078        pass++)
1079     {
1080       if (pass == 1)
1081         COPY_HARD_REG_SET (used, used1);
1082       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1083         {
1084 #ifdef REG_ALLOC_ORDER
1085           int regno = reg_alloc_order[i];
1086 #else
1087           int regno = i;
1088 #endif
1089           if (! TEST_HARD_REG_BIT (used, regno)
1090               && HARD_REGNO_MODE_OK (regno, mode)
1091               && (allocno[num].calls_crossed == 0
1092                   || accept_call_clobbered
1093                   || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
1094             {
1095               int j;
1096               int lim = regno + hard_regno_nregs[regno][mode];
1097               for (j = regno + 1;
1098                    (j < lim
1099                     && ! TEST_HARD_REG_BIT (used, j));
1100                    j++);
1101               if (j == lim)
1102                 {
1103                   best_reg = regno;
1104                   break;
1105                 }
1106 #ifndef REG_ALLOC_ORDER
1107               i = j;                    /* Skip starting points we know will lose */
1108 #endif
1109             }
1110           }
1111       }
1112
1113   /* See if there is a preferred register with the same class as the register
1114      we allocated above.  Making this restriction prevents register
1115      preferencing from creating worse register allocation.
1116
1117      Remove from the preferred registers and conflicting registers.  Note that
1118      additional conflicts may have been added after `prune_preferences' was
1119      called.
1120
1121      First do this for those register with copy preferences, then all
1122      preferred registers.  */
1123
1124   AND_COMPL_HARD_REG_SET (allocno[num].hard_reg_copy_preferences, used);
1125   GO_IF_HARD_REG_SUBSET (allocno[num].hard_reg_copy_preferences,
1126                          reg_class_contents[(int) NO_REGS], no_copy_prefs);
1127
1128   if (best_reg >= 0)
1129     {
1130       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1131         if (TEST_HARD_REG_BIT (allocno[num].hard_reg_copy_preferences, i)
1132             && HARD_REGNO_MODE_OK (i, mode)
1133             && (allocno[num].calls_crossed == 0
1134                 || accept_call_clobbered
1135                 || ! HARD_REGNO_CALL_PART_CLOBBERED (i, mode))
1136             && (REGNO_REG_CLASS (i) == REGNO_REG_CLASS (best_reg)
1137                 || reg_class_subset_p (REGNO_REG_CLASS (i),
1138                                        REGNO_REG_CLASS (best_reg))
1139                 || reg_class_subset_p (REGNO_REG_CLASS (best_reg),
1140                                        REGNO_REG_CLASS (i))))
1141             {
1142               int j;
1143               int lim = i + hard_regno_nregs[i][mode];
1144               for (j = i + 1;
1145                    (j < lim
1146                     && ! TEST_HARD_REG_BIT (used, j)
1147                     && (REGNO_REG_CLASS (j)
1148                         == REGNO_REG_CLASS (best_reg + (j - i))
1149                         || reg_class_subset_p (REGNO_REG_CLASS (j),
1150                                                REGNO_REG_CLASS (best_reg + (j - i)))
1151                         || reg_class_subset_p (REGNO_REG_CLASS (best_reg + (j - i)),
1152                                                REGNO_REG_CLASS (j))));
1153                    j++);
1154               if (j == lim)
1155                 {
1156                   best_reg = i;
1157                   goto no_prefs;
1158                 }
1159             }
1160     }
1161  no_copy_prefs:
1162
1163   AND_COMPL_HARD_REG_SET (allocno[num].hard_reg_preferences, used);
1164   GO_IF_HARD_REG_SUBSET (allocno[num].hard_reg_preferences,
1165                          reg_class_contents[(int) NO_REGS], no_prefs);
1166
1167   if (best_reg >= 0)
1168     {
1169       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1170         if (TEST_HARD_REG_BIT (allocno[num].hard_reg_preferences, i)
1171             && HARD_REGNO_MODE_OK (i, mode)
1172             && (allocno[num].calls_crossed == 0
1173                 || accept_call_clobbered
1174                 || ! HARD_REGNO_CALL_PART_CLOBBERED (i, mode))
1175             && (REGNO_REG_CLASS (i) == REGNO_REG_CLASS (best_reg)
1176                 || reg_class_subset_p (REGNO_REG_CLASS (i),
1177                                        REGNO_REG_CLASS (best_reg))
1178                 || reg_class_subset_p (REGNO_REG_CLASS (best_reg),
1179                                        REGNO_REG_CLASS (i))))
1180             {
1181               int j;
1182               int lim = i + hard_regno_nregs[i][mode];
1183               for (j = i + 1;
1184                    (j < lim
1185                     && ! TEST_HARD_REG_BIT (used, j)
1186                     && (REGNO_REG_CLASS (j)
1187                         == REGNO_REG_CLASS (best_reg + (j - i))
1188                         || reg_class_subset_p (REGNO_REG_CLASS (j),
1189                                                REGNO_REG_CLASS (best_reg + (j - i)))
1190                         || reg_class_subset_p (REGNO_REG_CLASS (best_reg + (j - i)),
1191                                                REGNO_REG_CLASS (j))));
1192                    j++);
1193               if (j == lim)
1194                 {
1195                   best_reg = i;
1196                   break;
1197                 }
1198             }
1199     }
1200  no_prefs:
1201
1202   /* If we haven't succeeded yet, try with caller-saves.
1203      We need not check to see if the current function has nonlocal
1204      labels because we don't put any pseudos that are live over calls in
1205      registers in that case.  */
1206
1207   if (flag_caller_saves && best_reg < 0)
1208     {
1209       /* Did not find a register.  If it would be profitable to
1210          allocate a call-clobbered register and save and restore it
1211          around calls, do that.  Don't do this if it crosses any calls
1212          that might throw.  */
1213       if (! accept_call_clobbered
1214           && allocno[num].calls_crossed != 0
1215           && allocno[num].throwing_calls_crossed == 0
1216           && CALLER_SAVE_PROFITABLE (allocno[num].n_refs,
1217                                      allocno[num].calls_crossed))
1218         {
1219           HARD_REG_SET new_losers;
1220           if (! losers)
1221             CLEAR_HARD_REG_SET (new_losers);
1222           else
1223             COPY_HARD_REG_SET (new_losers, losers);
1224
1225           IOR_HARD_REG_SET(new_losers, losing_caller_save_reg_set);
1226           find_reg (num, new_losers, alt_regs_p, 1, retrying);
1227           if (reg_renumber[allocno[num].reg] >= 0)
1228             {
1229               caller_save_needed = 1;
1230               return;
1231             }
1232         }
1233     }
1234
1235   /* If we haven't succeeded yet,
1236      see if some hard reg that conflicts with us
1237      was utilized poorly by local-alloc.
1238      If so, kick out the regs that were put there by local-alloc
1239      so we can use it instead.  */
1240   if (best_reg < 0 && !retrying
1241       /* Let's not bother with multi-reg allocnos.  */
1242       && allocno[num].size == 1
1243       && REG_BASIC_BLOCK (allocno[num].reg) == REG_BLOCK_GLOBAL)
1244     {
1245       /* Count from the end, to find the least-used ones first.  */
1246       for (i = FIRST_PSEUDO_REGISTER - 1; i >= 0; i--)
1247         {
1248 #ifdef REG_ALLOC_ORDER
1249           int regno = reg_alloc_order[i];
1250 #else
1251           int regno = i;
1252 #endif
1253
1254           if (local_reg_n_refs[regno] != 0
1255               /* Don't use a reg no good for this pseudo.  */
1256               && ! TEST_HARD_REG_BIT (used2, regno)
1257               && HARD_REGNO_MODE_OK (regno, mode)
1258               /* The code below assumes that we need only a single
1259                  register, but the check of allocno[num].size above
1260                  was not enough.  Sometimes we need more than one
1261                  register for a single-word value.  */
1262               && hard_regno_nregs[regno][mode] == 1
1263               && (allocno[num].calls_crossed == 0
1264                   || accept_call_clobbered
1265                   || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
1266 #ifdef CANNOT_CHANGE_MODE_CLASS
1267               && ! invalid_mode_change_p (regno, REGNO_REG_CLASS (regno),
1268                                           mode)
1269 #endif
1270 #ifdef STACK_REGS
1271              && (!allocno[num].no_stack_reg
1272                  || regno < FIRST_STACK_REG || regno > LAST_STACK_REG)
1273 #endif
1274               )
1275             {
1276               /* We explicitly evaluate the divide results into temporary
1277                  variables so as to avoid excess precision problems that occur
1278                  on an i386-unknown-sysv4.2 (unixware) host.  */
1279
1280               double tmp1 = ((double) local_reg_freq[regno] * local_reg_n_refs[regno]
1281                             / local_reg_live_length[regno]);
1282               double tmp2 = ((double) allocno[num].freq * allocno[num].n_refs
1283                              / allocno[num].live_length);
1284
1285               if (tmp1 < tmp2)
1286                 {
1287                   /* Hard reg REGNO was used less in total by local regs
1288                      than it would be used by this one allocno!  */
1289                   int k;
1290                   if (dump_file)
1291                     {
1292                       fprintf (dump_file, "Regno %d better for global %d, ",
1293                                regno, allocno[num].reg);
1294                       fprintf (dump_file, "fr:%d, ll:%d, nr:%d ",
1295                                allocno[num].freq, allocno[num].live_length,
1296                                allocno[num].n_refs);
1297                       fprintf (dump_file, "(was: fr:%d, ll:%d, nr:%d)\n",
1298                                local_reg_freq[regno],
1299                                local_reg_live_length[regno],
1300                                local_reg_n_refs[regno]);
1301                     }
1302
1303                   for (k = 0; k < max_regno; k++)
1304                     if (reg_renumber[k] >= 0)
1305                       {
1306                         int r = reg_renumber[k];
1307                         int endregno
1308                           = r + hard_regno_nregs[r][PSEUDO_REGNO_MODE (k)];
1309
1310                         if (regno >= r && regno < endregno)
1311                           {
1312                             if (dump_file)
1313                               fprintf (dump_file,
1314                                        "Local Reg %d now on stack\n", k);
1315                             reg_renumber[k] = -1;
1316                           }
1317                       }
1318
1319                   best_reg = regno;
1320                   break;
1321                 }
1322             }
1323         }
1324     }
1325
1326   /* Did we find a register?  */
1327
1328   if (best_reg >= 0)
1329     {
1330       int lim, j;
1331       HARD_REG_SET this_reg;
1332
1333       /* Yes.  Record it as the hard register of this pseudo-reg.  */
1334       reg_renumber[allocno[num].reg] = best_reg;
1335       /* Also of any pseudo-regs that share with it.  */
1336       if (reg_may_share[allocno[num].reg])
1337         for (j = FIRST_PSEUDO_REGISTER; j < max_regno; j++)
1338           if (reg_allocno[j] == num)
1339             reg_renumber[j] = best_reg;
1340
1341       /* Make a set of the hard regs being allocated.  */
1342       CLEAR_HARD_REG_SET (this_reg);
1343       lim = best_reg + hard_regno_nregs[best_reg][mode];
1344       for (j = best_reg; j < lim; j++)
1345         {
1346           SET_HARD_REG_BIT (this_reg, j);
1347           SET_HARD_REG_BIT (regs_used_so_far, j);
1348           /* This is no longer a reg used just by local regs.  */
1349           local_reg_n_refs[j] = 0;
1350           local_reg_freq[j] = 0;
1351         }
1352       /* For each other pseudo-reg conflicting with this one,
1353          mark it as conflicting with the hard regs this one occupies.  */
1354       lim = num;
1355       EXECUTE_IF_SET_IN_ALLOCNO_SET (conflicts + lim * allocno_row_words, j,
1356         {
1357           IOR_HARD_REG_SET (allocno[j].hard_reg_conflicts, this_reg);
1358         });
1359     }
1360 }
1361 \f
1362 /* Called from `reload' to look for a hard reg to put pseudo reg REGNO in.
1363    Perhaps it had previously seemed not worth a hard reg,
1364    or perhaps its old hard reg has been commandeered for reloads.
1365    FORBIDDEN_REGS indicates certain hard regs that may not be used, even if
1366    they do not appear to be allocated.
1367    If FORBIDDEN_REGS is zero, no regs are forbidden.  */
1368
1369 void
1370 retry_global_alloc (int regno, HARD_REG_SET forbidden_regs)
1371 {
1372   int alloc_no = reg_allocno[regno];
1373   if (alloc_no >= 0)
1374     {
1375       /* If we have more than one register class,
1376          first try allocating in the class that is cheapest
1377          for this pseudo-reg.  If that fails, try any reg.  */
1378       if (N_REG_CLASSES > 1)
1379         find_reg (alloc_no, forbidden_regs, 0, 0, 1);
1380       if (reg_renumber[regno] < 0
1381           && reg_alternate_class (regno) != NO_REGS)
1382         find_reg (alloc_no, forbidden_regs, 1, 0, 1);
1383
1384       /* If we found a register, modify the RTL for the register to
1385          show the hard register, and mark that register live.  */
1386       if (reg_renumber[regno] >= 0)
1387         {
1388           REGNO (regno_reg_rtx[regno]) = reg_renumber[regno];
1389           mark_home_live (regno);
1390         }
1391     }
1392 }
1393 \f
1394 /* Record a conflict between register REGNO
1395    and everything currently live.
1396    REGNO must not be a pseudo reg that was allocated
1397    by local_alloc; such numbers must be translated through
1398    reg_renumber before calling here.  */
1399
1400 static void
1401 record_one_conflict (int regno)
1402 {
1403   int j;
1404
1405   if (regno < FIRST_PSEUDO_REGISTER)
1406     /* When a hard register becomes live,
1407        record conflicts with live pseudo regs.  */
1408     EXECUTE_IF_SET_IN_ALLOCNO_SET (allocnos_live, j,
1409       {
1410         SET_HARD_REG_BIT (allocno[j].hard_reg_conflicts, regno);
1411       });
1412   else
1413     /* When a pseudo-register becomes live,
1414        record conflicts first with hard regs,
1415        then with other pseudo regs.  */
1416     {
1417       int ialloc = reg_allocno[regno];
1418       int ialloc_prod = ialloc * allocno_row_words;
1419
1420       IOR_HARD_REG_SET (allocno[ialloc].hard_reg_conflicts, hard_regs_live);
1421       for (j = allocno_row_words - 1; j >= 0; j--)
1422         conflicts[ialloc_prod + j] |= allocnos_live[j];
1423     }
1424 }
1425
1426 /* Record all allocnos currently live as conflicting
1427    with all hard regs currently live.
1428
1429    ALLOCNO_VEC is a vector of LEN allocnos, all allocnos that
1430    are currently live.  Their bits are also flagged in allocnos_live.  */
1431
1432 static void
1433 record_conflicts (int *allocno_vec, int len)
1434 {
1435   while (--len >= 0)
1436     IOR_HARD_REG_SET (allocno[allocno_vec[len]].hard_reg_conflicts,
1437                       hard_regs_live);
1438 }
1439
1440 /* If CONFLICTP (i, j) is true, make sure CONFLICTP (j, i) is also true.  */
1441 static void
1442 mirror_conflicts (void)
1443 {
1444   int i, j;
1445   int rw = allocno_row_words;
1446   int rwb = rw * INT_BITS;
1447   INT_TYPE *p = conflicts;
1448   INT_TYPE *q0 = conflicts, *q1, *q2;
1449   unsigned INT_TYPE mask;
1450
1451   for (i = max_allocno - 1, mask = 1; i >= 0; i--, mask <<= 1)
1452     {
1453       if (! mask)
1454         {
1455           mask = 1;
1456           q0++;
1457         }
1458       for (j = allocno_row_words - 1, q1 = q0; j >= 0; j--, q1 += rwb)
1459         {
1460           unsigned INT_TYPE word;
1461
1462           for (word = (unsigned INT_TYPE) *p++, q2 = q1; word;
1463                word >>= 1, q2 += rw)
1464             {
1465               if (word & 1)
1466                 *q2 |= mask;
1467             }
1468         }
1469     }
1470 }
1471 \f
1472 /* Handle the case where REG is set by the insn being scanned,
1473    during the forward scan to accumulate conflicts.
1474    Store a 1 in regs_live or allocnos_live for this register, record how many
1475    consecutive hardware registers it actually needs,
1476    and record a conflict with all other registers already live.
1477
1478    Note that even if REG does not remain alive after this insn,
1479    we must mark it here as live, to ensure a conflict between
1480    REG and any other regs set in this insn that really do live.
1481    This is because those other regs could be considered after this.
1482
1483    REG might actually be something other than a register;
1484    if so, we do nothing.
1485
1486    SETTER is 0 if this register was modified by an auto-increment (i.e.,
1487    a REG_INC note was found for it).  */
1488
1489 static void
1490 mark_reg_store (rtx reg, rtx setter, void *data ATTRIBUTE_UNUSED)
1491 {
1492   int regno;
1493
1494   if (GET_CODE (reg) == SUBREG)
1495     reg = SUBREG_REG (reg);
1496
1497   if (!REG_P (reg))
1498     return;
1499
1500   regs_set[n_regs_set++] = reg;
1501
1502   if (setter && GET_CODE (setter) != CLOBBER)
1503     set_preference (reg, SET_SRC (setter));
1504
1505   regno = REGNO (reg);
1506
1507   /* Either this is one of the max_allocno pseudo regs not allocated,
1508      or it is or has a hardware reg.  First handle the pseudo-regs.  */
1509   if (regno >= FIRST_PSEUDO_REGISTER)
1510     {
1511       if (reg_allocno[regno] >= 0)
1512         {
1513           SET_ALLOCNO_LIVE (reg_allocno[regno]);
1514           record_one_conflict (regno);
1515         }
1516     }
1517
1518   if (reg_renumber[regno] >= 0)
1519     regno = reg_renumber[regno];
1520
1521   /* Handle hardware regs (and pseudos allocated to hard regs).  */
1522   if (regno < FIRST_PSEUDO_REGISTER && ! fixed_regs[regno])
1523     {
1524       int last = regno + hard_regno_nregs[regno][GET_MODE (reg)];
1525       while (regno < last)
1526         {
1527           record_one_conflict (regno);
1528           SET_HARD_REG_BIT (hard_regs_live, regno);
1529           regno++;
1530         }
1531     }
1532 }
1533 \f
1534 /* Like mark_reg_store except notice just CLOBBERs; ignore SETs.  */
1535
1536 static void
1537 mark_reg_clobber (rtx reg, rtx setter, void *data)
1538 {
1539   if (GET_CODE (setter) == CLOBBER)
1540     mark_reg_store (reg, setter, data);
1541 }
1542
1543 /* Record that REG has conflicts with all the regs currently live.
1544    Do not mark REG itself as live.  */
1545
1546 static void
1547 mark_reg_conflicts (rtx reg)
1548 {
1549   int regno;
1550
1551   if (GET_CODE (reg) == SUBREG)
1552     reg = SUBREG_REG (reg);
1553
1554   if (!REG_P (reg))
1555     return;
1556
1557   regno = REGNO (reg);
1558
1559   /* Either this is one of the max_allocno pseudo regs not allocated,
1560      or it is or has a hardware reg.  First handle the pseudo-regs.  */
1561   if (regno >= FIRST_PSEUDO_REGISTER)
1562     {
1563       if (reg_allocno[regno] >= 0)
1564         record_one_conflict (regno);
1565     }
1566
1567   if (reg_renumber[regno] >= 0)
1568     regno = reg_renumber[regno];
1569
1570   /* Handle hardware regs (and pseudos allocated to hard regs).  */
1571   if (regno < FIRST_PSEUDO_REGISTER && ! fixed_regs[regno])
1572     {
1573       int last = regno + hard_regno_nregs[regno][GET_MODE (reg)];
1574       while (regno < last)
1575         {
1576           record_one_conflict (regno);
1577           regno++;
1578         }
1579     }
1580 }
1581 \f
1582 /* Mark REG as being dead (following the insn being scanned now).
1583    Store a 0 in regs_live or allocnos_live for this register.  */
1584
1585 static void
1586 mark_reg_death (rtx reg)
1587 {
1588   int regno = REGNO (reg);
1589
1590   /* Either this is one of the max_allocno pseudo regs not allocated,
1591      or it is a hardware reg.  First handle the pseudo-regs.  */
1592   if (regno >= FIRST_PSEUDO_REGISTER)
1593     {
1594       if (reg_allocno[regno] >= 0)
1595         CLEAR_ALLOCNO_LIVE (reg_allocno[regno]);
1596     }
1597
1598   /* For pseudo reg, see if it has been assigned a hardware reg.  */
1599   if (reg_renumber[regno] >= 0)
1600     regno = reg_renumber[regno];
1601
1602   /* Handle hardware regs (and pseudos allocated to hard regs).  */
1603   if (regno < FIRST_PSEUDO_REGISTER && ! fixed_regs[regno])
1604     {
1605       /* Pseudo regs already assigned hardware regs are treated
1606          almost the same as explicit hardware regs.  */
1607       int last = regno + hard_regno_nregs[regno][GET_MODE (reg)];
1608       while (regno < last)
1609         {
1610           CLEAR_HARD_REG_BIT (hard_regs_live, regno);
1611           regno++;
1612         }
1613     }
1614 }
1615
1616 /* Mark hard reg REGNO as currently live, assuming machine mode MODE
1617    for the value stored in it.  MODE determines how many consecutive
1618    registers are actually in use.  Do not record conflicts;
1619    it is assumed that the caller will do that.  */
1620
1621 static void
1622 mark_reg_live_nc (int regno, enum machine_mode mode)
1623 {
1624   int last = regno + hard_regno_nregs[regno][mode];
1625   while (regno < last)
1626     {
1627       SET_HARD_REG_BIT (hard_regs_live, regno);
1628       regno++;
1629     }
1630 }
1631 \f
1632 /* Try to set a preference for an allocno to a hard register.
1633    We are passed DEST and SRC which are the operands of a SET.  It is known
1634    that SRC is a register.  If SRC or the first operand of SRC is a register,
1635    try to set a preference.  If one of the two is a hard register and the other
1636    is a pseudo-register, mark the preference.
1637
1638    Note that we are not as aggressive as local-alloc in trying to tie a
1639    pseudo-register to a hard register.  */
1640
1641 static void
1642 set_preference (rtx dest, rtx src)
1643 {
1644   unsigned int src_regno, dest_regno;
1645   /* Amount to add to the hard regno for SRC, or subtract from that for DEST,
1646      to compensate for subregs in SRC or DEST.  */
1647   int offset = 0;
1648   unsigned int i;
1649   int copy = 1;
1650
1651   if (GET_RTX_FORMAT (GET_CODE (src))[0] == 'e')
1652     src = XEXP (src, 0), copy = 0;
1653
1654   /* Get the reg number for both SRC and DEST.
1655      If neither is a reg, give up.  */
1656
1657   if (REG_P (src))
1658     src_regno = REGNO (src);
1659   else if (GET_CODE (src) == SUBREG && REG_P (SUBREG_REG (src)))
1660     {
1661       src_regno = REGNO (SUBREG_REG (src));
1662
1663       if (REGNO (SUBREG_REG (src)) < FIRST_PSEUDO_REGISTER)
1664         offset += subreg_regno_offset (REGNO (SUBREG_REG (src)),
1665                                        GET_MODE (SUBREG_REG (src)),
1666                                        SUBREG_BYTE (src),
1667                                        GET_MODE (src));
1668       else
1669         offset += (SUBREG_BYTE (src)
1670                    / REGMODE_NATURAL_SIZE (GET_MODE (src)));
1671     }
1672   else
1673     return;
1674
1675   if (REG_P (dest))
1676     dest_regno = REGNO (dest);
1677   else if (GET_CODE (dest) == SUBREG && REG_P (SUBREG_REG (dest)))
1678     {
1679       dest_regno = REGNO (SUBREG_REG (dest));
1680
1681       if (REGNO (SUBREG_REG (dest)) < FIRST_PSEUDO_REGISTER)
1682         offset -= subreg_regno_offset (REGNO (SUBREG_REG (dest)),
1683                                        GET_MODE (SUBREG_REG (dest)),
1684                                        SUBREG_BYTE (dest),
1685                                        GET_MODE (dest));
1686       else
1687         offset -= (SUBREG_BYTE (dest)
1688                    / REGMODE_NATURAL_SIZE (GET_MODE (dest)));
1689     }
1690   else
1691     return;
1692
1693   /* Convert either or both to hard reg numbers.  */
1694
1695   if (reg_renumber[src_regno] >= 0)
1696     src_regno = reg_renumber[src_regno];
1697
1698   if (reg_renumber[dest_regno] >= 0)
1699     dest_regno = reg_renumber[dest_regno];
1700
1701   /* Now if one is a hard reg and the other is a global pseudo
1702      then give the other a preference.  */
1703
1704   if (dest_regno < FIRST_PSEUDO_REGISTER && src_regno >= FIRST_PSEUDO_REGISTER
1705       && reg_allocno[src_regno] >= 0)
1706     {
1707       dest_regno -= offset;
1708       if (dest_regno < FIRST_PSEUDO_REGISTER)
1709         {
1710           if (copy)
1711             SET_REGBIT (hard_reg_copy_preferences,
1712                         reg_allocno[src_regno], dest_regno);
1713
1714           SET_REGBIT (hard_reg_preferences,
1715                       reg_allocno[src_regno], dest_regno);
1716           for (i = dest_regno;
1717                i < dest_regno + hard_regno_nregs[dest_regno][GET_MODE (dest)];
1718                i++)
1719             SET_REGBIT (hard_reg_full_preferences, reg_allocno[src_regno], i);
1720         }
1721     }
1722
1723   if (src_regno < FIRST_PSEUDO_REGISTER && dest_regno >= FIRST_PSEUDO_REGISTER
1724       && reg_allocno[dest_regno] >= 0)
1725     {
1726       src_regno += offset;
1727       if (src_regno < FIRST_PSEUDO_REGISTER)
1728         {
1729           if (copy)
1730             SET_REGBIT (hard_reg_copy_preferences,
1731                         reg_allocno[dest_regno], src_regno);
1732
1733           SET_REGBIT (hard_reg_preferences,
1734                       reg_allocno[dest_regno], src_regno);
1735           for (i = src_regno;
1736                i < src_regno + hard_regno_nregs[src_regno][GET_MODE (src)];
1737                i++)
1738             SET_REGBIT (hard_reg_full_preferences, reg_allocno[dest_regno], i);
1739         }
1740     }
1741 }
1742 \f
1743 /* Indicate that hard register number FROM was eliminated and replaced with
1744    an offset from hard register number TO.  The status of hard registers live
1745    at the start of a basic block is updated by replacing a use of FROM with
1746    a use of TO.  */
1747
1748 void
1749 mark_elimination (int from, int to)
1750 {
1751   basic_block bb;
1752
1753   FOR_EACH_BB (bb)
1754     {
1755       regset r = bb->il.rtl->global_live_at_start;
1756       if (REGNO_REG_SET_P (r, from))
1757         {
1758           CLEAR_REGNO_REG_SET (r, from);
1759           SET_REGNO_REG_SET (r, to);
1760         }
1761     }
1762 }
1763 \f
1764 /* Used for communication between the following functions.  Holds the
1765    current life information.  */
1766 static regset live_relevant_regs;
1767
1768 /* Record in live_relevant_regs and REGS_SET that register REG became live.
1769    This is called via note_stores.  */
1770 static void
1771 reg_becomes_live (rtx reg, rtx setter ATTRIBUTE_UNUSED, void *regs_set)
1772 {
1773   int regno;
1774
1775   if (GET_CODE (reg) == SUBREG)
1776     reg = SUBREG_REG (reg);
1777
1778   if (!REG_P (reg))
1779     return;
1780
1781   regno = REGNO (reg);
1782   if (regno < FIRST_PSEUDO_REGISTER)
1783     {
1784       int nregs = hard_regno_nregs[regno][GET_MODE (reg)];
1785       while (nregs-- > 0)
1786         {
1787           SET_REGNO_REG_SET (live_relevant_regs, regno);
1788           if (! fixed_regs[regno])
1789             SET_REGNO_REG_SET ((regset) regs_set, regno);
1790           regno++;
1791         }
1792     }
1793   else if (reg_renumber[regno] >= 0)
1794     {
1795       SET_REGNO_REG_SET (live_relevant_regs, regno);
1796       SET_REGNO_REG_SET ((regset) regs_set, regno);
1797     }
1798 }
1799
1800 /* Record in live_relevant_regs that register REGNO died.  */
1801 static void
1802 reg_dies (int regno, enum machine_mode mode, struct insn_chain *chain)
1803 {
1804   if (regno < FIRST_PSEUDO_REGISTER)
1805     {
1806       int nregs = hard_regno_nregs[regno][mode];
1807       while (nregs-- > 0)
1808         {
1809           CLEAR_REGNO_REG_SET (live_relevant_regs, regno);
1810           if (! fixed_regs[regno])
1811             SET_REGNO_REG_SET (&chain->dead_or_set, regno);
1812           regno++;
1813         }
1814     }
1815   else
1816     {
1817       CLEAR_REGNO_REG_SET (live_relevant_regs, regno);
1818       if (reg_renumber[regno] >= 0)
1819         SET_REGNO_REG_SET (&chain->dead_or_set, regno);
1820     }
1821 }
1822
1823 /* Walk the insns of the current function and build reload_insn_chain,
1824    and record register life information.  */
1825 void
1826 build_insn_chain (rtx first)
1827 {
1828   struct insn_chain **p = &reload_insn_chain;
1829   struct insn_chain *prev = 0;
1830   basic_block b = ENTRY_BLOCK_PTR->next_bb;
1831
1832   live_relevant_regs = ALLOC_REG_SET (&reg_obstack);
1833
1834   for (; first; first = NEXT_INSN (first))
1835     {
1836       struct insn_chain *c;
1837
1838       if (first == BB_HEAD (b))
1839         {
1840           unsigned i;
1841           bitmap_iterator bi;
1842
1843           CLEAR_REG_SET (live_relevant_regs);
1844
1845           EXECUTE_IF_SET_IN_BITMAP (b->il.rtl->global_live_at_start, 0, i, bi)
1846             {
1847               if (i < FIRST_PSEUDO_REGISTER
1848                   ? ! TEST_HARD_REG_BIT (eliminable_regset, i)
1849                   : reg_renumber[i] >= 0)
1850                 SET_REGNO_REG_SET (live_relevant_regs, i);
1851             }
1852         }
1853
1854       if (!NOTE_P (first) && !BARRIER_P (first))
1855         {
1856           c = new_insn_chain ();
1857           c->prev = prev;
1858           prev = c;
1859           *p = c;
1860           p = &c->next;
1861           c->insn = first;
1862           c->block = b->index;
1863
1864           if (INSN_P (first))
1865             {
1866               rtx link;
1867
1868               /* Mark the death of everything that dies in this instruction.  */
1869
1870               for (link = REG_NOTES (first); link; link = XEXP (link, 1))
1871                 if (REG_NOTE_KIND (link) == REG_DEAD
1872                     && REG_P (XEXP (link, 0)))
1873                   reg_dies (REGNO (XEXP (link, 0)), GET_MODE (XEXP (link, 0)),
1874                             c);
1875
1876               COPY_REG_SET (&c->live_throughout, live_relevant_regs);
1877
1878               /* Mark everything born in this instruction as live.  */
1879
1880               note_stores (PATTERN (first), reg_becomes_live,
1881                            &c->dead_or_set);
1882             }
1883           else
1884             COPY_REG_SET (&c->live_throughout, live_relevant_regs);
1885
1886           if (INSN_P (first))
1887             {
1888               rtx link;
1889
1890               /* Mark anything that is set in this insn and then unused as dying.  */
1891
1892               for (link = REG_NOTES (first); link; link = XEXP (link, 1))
1893                 if (REG_NOTE_KIND (link) == REG_UNUSED
1894                     && REG_P (XEXP (link, 0)))
1895                   reg_dies (REGNO (XEXP (link, 0)), GET_MODE (XEXP (link, 0)),
1896                             c);
1897             }
1898         }
1899
1900       if (first == BB_END (b))
1901         b = b->next_bb;
1902
1903       /* Stop after we pass the end of the last basic block.  Verify that
1904          no real insns are after the end of the last basic block.
1905
1906          We may want to reorganize the loop somewhat since this test should
1907          always be the right exit test.  Allow an ADDR_VEC or ADDR_DIF_VEC if
1908          the previous real insn is a JUMP_INSN.  */
1909       if (b == EXIT_BLOCK_PTR)
1910         {
1911 #ifdef ENABLE_CHECKING
1912           for (first = NEXT_INSN (first); first; first = NEXT_INSN (first))
1913             gcc_assert (!INSN_P (first)
1914                         || GET_CODE (PATTERN (first)) == USE
1915                         || ((GET_CODE (PATTERN (first)) == ADDR_VEC
1916                              || GET_CODE (PATTERN (first)) == ADDR_DIFF_VEC)
1917                             && prev_real_insn (first) != 0
1918                             && JUMP_P (prev_real_insn (first))));
1919 #endif
1920           break;
1921         }
1922     }
1923   FREE_REG_SET (live_relevant_regs);
1924   *p = 0;
1925 }
1926 \f
1927 /* Print debugging trace information if -dg switch is given,
1928    showing the information on which the allocation decisions are based.  */
1929
1930 static void
1931 dump_conflicts (FILE *file)
1932 {
1933   int i;
1934   int has_preferences;
1935   int nregs;
1936   nregs = 0;
1937   for (i = 0; i < max_allocno; i++)
1938     {
1939       if (reg_renumber[allocno[allocno_order[i]].reg] >= 0)
1940         continue;
1941       nregs++;
1942     }
1943   fprintf (file, ";; %d regs to allocate:", nregs);
1944   for (i = 0; i < max_allocno; i++)
1945     {
1946       int j;
1947       if (reg_renumber[allocno[allocno_order[i]].reg] >= 0)
1948         continue;
1949       fprintf (file, " %d", allocno[allocno_order[i]].reg);
1950       for (j = 0; j < max_regno; j++)
1951         if (reg_allocno[j] == allocno_order[i]
1952             && j != allocno[allocno_order[i]].reg)
1953           fprintf (file, "+%d", j);
1954       if (allocno[allocno_order[i]].size != 1)
1955         fprintf (file, " (%d)", allocno[allocno_order[i]].size);
1956     }
1957   fprintf (file, "\n");
1958
1959   for (i = 0; i < max_allocno; i++)
1960     {
1961       int j;
1962       fprintf (file, ";; %d conflicts:", allocno[i].reg);
1963       for (j = 0; j < max_allocno; j++)
1964         if (CONFLICTP (j, i))
1965           fprintf (file, " %d", allocno[j].reg);
1966       for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
1967         if (TEST_HARD_REG_BIT (allocno[i].hard_reg_conflicts, j))
1968           fprintf (file, " %d", j);
1969       fprintf (file, "\n");
1970
1971       has_preferences = 0;
1972       for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
1973         if (TEST_HARD_REG_BIT (allocno[i].hard_reg_preferences, j))
1974           has_preferences = 1;
1975
1976       if (! has_preferences)
1977         continue;
1978       fprintf (file, ";; %d preferences:", allocno[i].reg);
1979       for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
1980         if (TEST_HARD_REG_BIT (allocno[i].hard_reg_preferences, j))
1981           fprintf (file, " %d", j);
1982       fprintf (file, "\n");
1983     }
1984   fprintf (file, "\n");
1985 }
1986
1987 void
1988 dump_global_regs (FILE *file)
1989 {
1990   int i, j;
1991
1992   fprintf (file, ";; Register dispositions:\n");
1993   for (i = FIRST_PSEUDO_REGISTER, j = 0; i < max_regno; i++)
1994     if (reg_renumber[i] >= 0)
1995       {
1996         fprintf (file, "%d in %d  ", i, reg_renumber[i]);
1997         if (++j % 6 == 0)
1998           fprintf (file, "\n");
1999       }
2000
2001   fprintf (file, "\n\n;; Hard regs used: ");
2002   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
2003     if (regs_ever_live[i])
2004       fprintf (file, " %d", i);
2005   fprintf (file, "\n\n");
2006 }
2007
2008 \f
2009
2010 /* This page contains code to make live information more accurate.
2011    The accurate register liveness at program point P means:
2012      o there is a path from P to usage of the register and the
2013        register is not redefined or killed on the path.
2014      o register at P is partially available, i.e. there is a path from
2015        a register definition to the point P and the register is not
2016        killed (clobbered) on the path
2017
2018    The standard GCC live information means only the first condition.
2019    Without the partial availability, there will be more register
2020    conflicts and as a consequence worse register allocation.  The
2021    typical example where the information can be different is a
2022    register initialized in the loop at the basic block preceding the
2023    loop in CFG.  */
2024
2025 /* The following structure contains basic block data flow information
2026    used to calculate partial availability of registers.  */
2027
2028 struct bb_info
2029 {
2030   /* The basic block reverse post-order number.  */
2031   int rts_number;
2032   /* Registers used uninitialized in an insn in which there is an
2033      early clobbered register might get the same hard register.  */
2034   bitmap earlyclobber;
2035   /* Registers correspondingly killed (clobbered) and defined but not
2036      killed afterward in the basic block.  */
2037   bitmap killed, avloc;
2038   /* Registers partially available and living (in other words whose
2039      values were calculated and used) correspondingly at the start
2040      and end of the basic block.  */
2041   bitmap live_pavin, live_pavout;
2042 };
2043
2044 /* Macros for accessing data flow information of basic blocks.  */
2045
2046 #define BB_INFO(BB) ((struct bb_info *) (BB)->aux)
2047 #define BB_INFO_BY_INDEX(N) BB_INFO (BASIC_BLOCK(N))
2048
2049 /* The function allocates the info structures of each basic block.  It
2050    also initialized LIVE_PAVIN and LIVE_PAVOUT as if all hard
2051    registers were partially available.  */
2052
2053 static void
2054 allocate_bb_info (void)
2055 {
2056   int i;
2057   basic_block bb;
2058   struct bb_info *bb_info;
2059   bitmap init;
2060
2061   alloc_aux_for_blocks (sizeof (struct bb_info));
2062   init = BITMAP_ALLOC (NULL);
2063   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
2064     bitmap_set_bit (init, i);
2065   FOR_EACH_BB (bb)
2066     {
2067       bb_info = bb->aux;
2068       bb_info->earlyclobber = BITMAP_ALLOC (NULL);
2069       bb_info->avloc = BITMAP_ALLOC (NULL);
2070       bb_info->killed = BITMAP_ALLOC (NULL);
2071       bb_info->live_pavin = BITMAP_ALLOC (NULL);
2072       bb_info->live_pavout = BITMAP_ALLOC (NULL);
2073       bitmap_copy (bb_info->live_pavin, init);
2074       bitmap_copy (bb_info->live_pavout, init);
2075     }
2076   BITMAP_FREE (init);
2077 }
2078
2079 /* The function frees the allocated info of all basic blocks.  */
2080
2081 static void
2082 free_bb_info (void)
2083 {
2084   basic_block bb;
2085   struct bb_info *bb_info;
2086
2087   FOR_EACH_BB (bb)
2088     {
2089       bb_info = BB_INFO (bb);
2090       BITMAP_FREE (bb_info->live_pavout);
2091       BITMAP_FREE (bb_info->live_pavin);
2092       BITMAP_FREE (bb_info->killed);
2093       BITMAP_FREE (bb_info->avloc);
2094       BITMAP_FREE (bb_info->earlyclobber);
2095     }
2096   free_aux_for_blocks ();
2097 }
2098
2099 /* The function modifies local info for register REG being changed in
2100    SETTER.  DATA is used to pass the current basic block info.  */
2101
2102 static void
2103 mark_reg_change (rtx reg, rtx setter, void *data)
2104 {
2105   int regno;
2106   basic_block bb = data;
2107   struct bb_info *bb_info = BB_INFO (bb);
2108
2109   if (GET_CODE (reg) == SUBREG)
2110     reg = SUBREG_REG (reg);
2111
2112   if (!REG_P (reg))
2113     return;
2114
2115   regno = REGNO (reg);
2116   bitmap_set_bit (bb_info->killed, regno);
2117   
2118   if (GET_CODE (setter) != CLOBBER)
2119     bitmap_set_bit (bb_info->avloc, regno);
2120   else
2121     bitmap_clear_bit (bb_info->avloc, regno);
2122 }
2123
2124 /* Classes of registers which could be early clobbered in the current
2125    insn.  */
2126
2127 DEF_VEC_I(int);
2128 DEF_VEC_ALLOC_I(int,heap);
2129
2130 static VEC(int,heap) *earlyclobber_regclass;
2131
2132 /* This function finds and stores register classes that could be early
2133    clobbered in INSN.  If any earlyclobber classes are found, the function
2134    returns TRUE, in all other cases it returns FALSE.  */
2135
2136 static bool
2137 check_earlyclobber (rtx insn)
2138 {
2139   int opno;
2140   bool found = false;
2141
2142   extract_insn (insn);
2143
2144   VEC_truncate (int, earlyclobber_regclass, 0);
2145   for (opno = 0; opno < recog_data.n_operands; opno++)
2146     {
2147       char c;
2148       bool amp_p;
2149       int i;
2150       enum reg_class class;
2151       const char *p = recog_data.constraints[opno];
2152
2153       class = NO_REGS;
2154       amp_p = false;
2155       for (;;)
2156         {
2157           c = *p;
2158           switch (c)
2159             {
2160             case '=':  case '+':  case '?':
2161             case '#':  case '!':
2162             case '*':  case '%':
2163             case 'm':  case '<':  case '>':  case 'V':  case 'o':
2164             case 'E':  case 'F':  case 'G':  case 'H':
2165             case 's':  case 'i':  case 'n':
2166             case 'I':  case 'J':  case 'K':  case 'L':
2167             case 'M':  case 'N':  case 'O':  case 'P':
2168             case 'X':
2169             case '0': case '1':  case '2':  case '3':  case '4':
2170             case '5': case '6':  case '7':  case '8':  case '9':
2171               /* These don't say anything we care about.  */
2172               break;
2173
2174             case '&':
2175               amp_p = true;
2176               break;
2177             case '\0':
2178             case ',':
2179               if (amp_p && class != NO_REGS)
2180                 {
2181                   int rc;
2182
2183                   found = true;
2184                   for (i = 0;
2185                        VEC_iterate (int, earlyclobber_regclass, i, rc);
2186                        i++)
2187                     {
2188                       if (rc == (int) class)
2189                         goto found_rc;
2190                     }
2191
2192                   /* We use VEC_quick_push here because
2193                      earlyclobber_regclass holds no more than
2194                      N_REG_CLASSES elements. */
2195                   VEC_quick_push (int, earlyclobber_regclass, (int) class);
2196                 found_rc:
2197                   ;
2198                 }
2199               
2200               amp_p = false;
2201               class = NO_REGS;
2202               break;
2203
2204             case 'r':
2205               class = GENERAL_REGS;
2206               break;
2207
2208             default:
2209               class = REG_CLASS_FROM_CONSTRAINT (c, p);
2210               break;
2211             }
2212           if (c == '\0')
2213             break;
2214           p += CONSTRAINT_LEN (c, p);
2215         }
2216     }
2217
2218   return found;
2219 }
2220
2221 /* The function checks that pseudo-register *X has a class
2222    intersecting with the class of pseudo-register could be early
2223    clobbered in the same insn.
2224    This function is a no-op if earlyclobber_regclass is empty.  */
2225
2226 static int
2227 mark_reg_use_for_earlyclobber (rtx *x, void *data ATTRIBUTE_UNUSED)
2228 {
2229   enum reg_class pref_class, alt_class;
2230   int i, regno;
2231   basic_block bb = data;
2232   struct bb_info *bb_info = BB_INFO (bb);
2233
2234   if (REG_P (*x) && REGNO (*x) >= FIRST_PSEUDO_REGISTER)
2235     {
2236       int rc;
2237
2238       regno = REGNO (*x);
2239       if (bitmap_bit_p (bb_info->killed, regno)
2240           || bitmap_bit_p (bb_info->avloc, regno))
2241         return 0;
2242       pref_class = reg_preferred_class (regno);
2243       alt_class = reg_alternate_class (regno);
2244       for (i = 0; VEC_iterate (int, earlyclobber_regclass, i, rc); i++)
2245         {
2246           if (reg_classes_intersect_p (rc, pref_class)
2247               || (rc != NO_REGS
2248                   && reg_classes_intersect_p (rc, alt_class)))
2249             {
2250               bitmap_set_bit (bb_info->earlyclobber, regno);
2251               break;
2252             }
2253         }
2254     }
2255   return 0;
2256 }
2257
2258 /* The function processes all pseudo-registers in *X with the aid of
2259    previous function.  */
2260
2261 static void
2262 mark_reg_use_for_earlyclobber_1 (rtx *x, void *data)
2263 {
2264   for_each_rtx (x, mark_reg_use_for_earlyclobber, data);
2265 }
2266
2267 /* The function calculates local info for each basic block.  */
2268
2269 static void
2270 calculate_local_reg_bb_info (void)
2271 {
2272   basic_block bb;
2273   rtx insn, bound;
2274
2275   /* We know that earlyclobber_regclass holds no more than
2276     N_REG_CLASSES elements.  See check_earlyclobber.  */
2277   earlyclobber_regclass = VEC_alloc (int, heap, N_REG_CLASSES);
2278   FOR_EACH_BB (bb)
2279     {
2280       bound = NEXT_INSN (BB_END (bb));
2281       for (insn = BB_HEAD (bb); insn != bound; insn = NEXT_INSN (insn))
2282         if (INSN_P (insn))
2283           {
2284             note_stores (PATTERN (insn), mark_reg_change, bb);
2285             if (check_earlyclobber (insn))
2286               note_uses (&PATTERN (insn), mark_reg_use_for_earlyclobber_1, bb);
2287           }
2288     }
2289   VEC_free (int, heap, earlyclobber_regclass);
2290 }
2291
2292 /* The function sets up reverse post-order number of each basic
2293    block.  */
2294
2295 static void
2296 set_up_bb_rts_numbers (void)
2297 {
2298   int i;
2299   int *rts_order;
2300   
2301   rts_order = XNEWVEC (int, n_basic_blocks - NUM_FIXED_BLOCKS);
2302   post_order_compute (rts_order, false);
2303   for (i = 0; i < n_basic_blocks - NUM_FIXED_BLOCKS; i++)
2304     BB_INFO_BY_INDEX (rts_order [i])->rts_number = i;
2305   free (rts_order);
2306 }
2307
2308 /* Compare function for sorting blocks in reverse postorder.  */
2309
2310 static int
2311 rpost_cmp (const void *bb1, const void *bb2)
2312 {
2313   basic_block b1 = *(basic_block *) bb1, b2 = *(basic_block *) bb2;
2314
2315   return BB_INFO (b2)->rts_number - BB_INFO (b1)->rts_number;
2316 }
2317
2318 /* Temporary bitmap used for live_pavin, live_pavout calculation.  */
2319 static bitmap temp_bitmap;
2320
2321 /* The function calculates partial register availability according to
2322    the following equations:
2323
2324      bb.live_pavin
2325        = empty for entry block
2326          | union (live_pavout of predecessors) & global_live_at_start
2327      bb.live_pavout = union (bb.live_pavin - bb.killed, bb.avloc)
2328                       & global_live_at_end  */
2329
2330 static void
2331 calculate_reg_pav (void)
2332 {
2333   basic_block bb, succ;
2334   edge e;
2335   int i, nel;
2336   VEC(basic_block,heap) *bbs, *new_bbs, *temp;
2337   basic_block *bb_array;
2338   sbitmap wset;
2339
2340   bbs = VEC_alloc (basic_block, heap, n_basic_blocks);
2341   new_bbs = VEC_alloc (basic_block, heap, n_basic_blocks);
2342   temp_bitmap = BITMAP_ALLOC (NULL);
2343   FOR_EACH_BB (bb)
2344     {
2345       VEC_quick_push (basic_block, bbs, bb);
2346     }
2347   wset = sbitmap_alloc (n_basic_blocks + 1);
2348   while (VEC_length (basic_block, bbs))
2349     {
2350       bb_array = VEC_address (basic_block, bbs);
2351       nel = VEC_length (basic_block, bbs);
2352       qsort (bb_array, nel, sizeof (basic_block), rpost_cmp);
2353       sbitmap_zero (wset);
2354       for (i = 0; i < nel; i++)
2355         {
2356           edge_iterator ei;
2357           struct bb_info *bb_info;
2358           bitmap bb_live_pavin, bb_live_pavout;
2359               
2360           bb = bb_array [i];
2361           bb_info = BB_INFO (bb);
2362           bb_live_pavin = bb_info->live_pavin;
2363           bb_live_pavout = bb_info->live_pavout;
2364           FOR_EACH_EDGE (e, ei, bb->preds)
2365             {
2366               basic_block pred = e->src;
2367
2368               if (pred->index != ENTRY_BLOCK)
2369                 bitmap_ior_into (bb_live_pavin, BB_INFO (pred)->live_pavout);
2370             }
2371           bitmap_and_into (bb_live_pavin, bb->il.rtl->global_live_at_start);
2372           bitmap_ior_and_compl (temp_bitmap, bb_info->avloc,
2373                                 bb_live_pavin, bb_info->killed);
2374           bitmap_and_into (temp_bitmap, bb->il.rtl->global_live_at_end);
2375           if (! bitmap_equal_p (temp_bitmap, bb_live_pavout))
2376             {
2377               bitmap_copy (bb_live_pavout, temp_bitmap);
2378               FOR_EACH_EDGE (e, ei, bb->succs)
2379                 {
2380                   succ = e->dest;
2381                   if (succ->index != EXIT_BLOCK
2382                       && !TEST_BIT (wset, succ->index))
2383                     {
2384                       SET_BIT (wset, succ->index);
2385                       VEC_quick_push (basic_block, new_bbs, succ);
2386                     }
2387                 }
2388             }
2389         }
2390       temp = bbs;
2391       bbs = new_bbs;
2392       new_bbs = temp;
2393       VEC_truncate (basic_block, new_bbs, 0);
2394     }
2395   sbitmap_free (wset);
2396   BITMAP_FREE (temp_bitmap);
2397   VEC_free (basic_block, heap, new_bbs);
2398   VEC_free (basic_block, heap, bbs);
2399 }
2400
2401 /* The function modifies partial availability information for two
2402    special cases to prevent incorrect work of the subsequent passes
2403    with the accurate live information based on the partial
2404    availability.  */
2405
2406 static void
2407 modify_reg_pav (void)
2408 {
2409   basic_block bb;
2410   struct bb_info *bb_info;
2411 #ifdef STACK_REGS
2412   int i;
2413   HARD_REG_SET zero, stack_hard_regs, used;
2414   bitmap stack_regs;
2415
2416   CLEAR_HARD_REG_SET (zero);
2417   CLEAR_HARD_REG_SET (stack_hard_regs);
2418   for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
2419     SET_HARD_REG_BIT(stack_hard_regs, i);
2420   stack_regs = BITMAP_ALLOC (NULL);
2421   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
2422     {
2423       COPY_HARD_REG_SET (used, reg_class_contents[reg_preferred_class (i)]);
2424       IOR_HARD_REG_SET (used, reg_class_contents[reg_alternate_class (i)]);
2425       AND_HARD_REG_SET (used, stack_hard_regs);
2426       GO_IF_HARD_REG_EQUAL(used, zero, skip);
2427       bitmap_set_bit (stack_regs, i);
2428     skip:
2429       ;
2430     }
2431 #endif
2432   FOR_EACH_BB (bb)
2433     {
2434       bb_info = BB_INFO (bb);
2435       
2436       /* Reload can assign the same hard register to uninitialized
2437          pseudo-register and early clobbered pseudo-register in an
2438          insn if the pseudo-register is used first time in given BB
2439          and not lived at the BB start.  To prevent this we don't
2440          change life information for such pseudo-registers.  */
2441       bitmap_ior_into (bb_info->live_pavin, bb_info->earlyclobber);
2442 #ifdef STACK_REGS
2443       /* We can not use the same stack register for uninitialized
2444          pseudo-register and another living pseudo-register because if the
2445          uninitialized pseudo-register dies, subsequent pass reg-stack
2446          will be confused (it will believe that the other register
2447          dies).  */
2448       bitmap_ior_into (bb_info->live_pavin, stack_regs);
2449 #endif
2450     }
2451 #ifdef STACK_REGS
2452   BITMAP_FREE (stack_regs);
2453 #endif
2454 }
2455
2456 /* The following function makes live information more accurate by
2457    modifying global_live_at_start and global_live_at_end of basic
2458    blocks.
2459
2460    The standard GCC life analysis permits registers to live
2461    uninitialized, for example:
2462
2463        R is never used
2464        .....
2465        Loop:
2466          R is defined
2467        ...
2468        R is used.
2469
2470    With normal life_analysis, R would be live before "Loop:".
2471    The result is that R causes many interferences that do not
2472    serve any purpose.
2473
2474    After the function call a register lives at a program point
2475    only if it is initialized on a path from CFG entry to the
2476    program point.  */
2477
2478 static void
2479 make_accurate_live_analysis (void)
2480 {
2481   basic_block bb;
2482   struct bb_info *bb_info;
2483
2484   max_regno = max_reg_num ();
2485   compact_blocks ();
2486   allocate_bb_info ();
2487   calculate_local_reg_bb_info ();
2488   set_up_bb_rts_numbers ();
2489   calculate_reg_pav ();
2490   modify_reg_pav ();
2491   FOR_EACH_BB (bb)
2492     {
2493       bb_info = BB_INFO (bb);
2494       
2495       bitmap_and_into (bb->il.rtl->global_live_at_start, bb_info->live_pavin);
2496       bitmap_and_into (bb->il.rtl->global_live_at_end, bb_info->live_pavout);
2497     }
2498   free_bb_info ();
2499 }
2500 /* Run old register allocator.  Return TRUE if we must exit
2501    rest_of_compilation upon return.  */
2502 static void
2503 rest_of_handle_global_alloc (void)
2504 {
2505   bool failure;
2506
2507   /* If optimizing, allocate remaining pseudo-regs.  Do the reload
2508      pass fixing up any insns that are invalid.  */
2509
2510   if (optimize)
2511     failure = global_alloc ();
2512   else
2513     {
2514       build_insn_chain (get_insns ());
2515       failure = reload (get_insns (), 0);
2516     }
2517
2518   if (dump_enabled_p (pass_global_alloc.static_pass_number))
2519     {
2520       timevar_push (TV_DUMP);
2521       dump_global_regs (dump_file);
2522       timevar_pop (TV_DUMP);
2523     }
2524
2525   gcc_assert (reload_completed || failure);
2526   reload_completed = !failure;
2527 }
2528
2529 struct tree_opt_pass pass_global_alloc =
2530 {
2531   "greg",                               /* name */
2532   NULL,                                 /* gate */
2533   rest_of_handle_global_alloc,          /* execute */
2534   NULL,                                 /* sub */
2535   NULL,                                 /* next */
2536   0,                                    /* static_pass_number */
2537   TV_GLOBAL_ALLOC,                      /* tv_id */
2538   0,                                    /* properties_required */
2539   0,                                    /* properties_provided */
2540   0,                                    /* properties_destroyed */
2541   0,                                    /* todo_flags_start */
2542   TODO_dump_func |
2543   TODO_ggc_collect,                     /* todo_flags_finish */
2544   'g'                                   /* letter */
2545 };
2546