Annotation of gcc/global-alloc.c, revision 1.1.1.3

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.