Annotation of gcc/global.c, revision 1.1.1.4

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

unix.superglobalmegacorp.com

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