Annotation of GNUtools/cc/global.c, revision 1.1

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

unix.superglobalmegacorp.com

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