Annotation of gcc/global.c, revision 1.1.1.2

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

unix.superglobalmegacorp.com

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