Annotation of gcc/global.c, revision 1.1.1.5

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

unix.superglobalmegacorp.com

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