Annotation of researchv10dc/cmd/gcc/reload1.c, revision 1.1

1.1     ! root        1: /* Reload pseudo regs into hard regs for insns that require hard regs.
        !             2:    Copyright (C) 1987, 1988 Free Software Foundation, Inc.
        !             3: 
        !             4: This file is part of GNU CC.
        !             5: 
        !             6: GNU CC is distributed in the hope that it will be useful,
        !             7: but WITHOUT ANY WARRANTY.  No author or distributor
        !             8: accepts responsibility to anyone for the consequences of using it
        !             9: or for whether it serves any particular purpose or works at all,
        !            10: unless he says so in writing.  Refer to the GNU CC General Public
        !            11: License for full details.
        !            12: 
        !            13: Everyone is granted permission to copy, modify and redistribute
        !            14: GNU CC, but only under the conditions described in the
        !            15: GNU CC General Public License.   A copy of this license is
        !            16: supposed to have been given to you along with GNU CC so you
        !            17: can know your rights and responsibilities.  It should be in a
        !            18: file named COPYING.  Among other things, the copyright notice
        !            19: and this notice must be preserved on all copies.  */
        !            20: 
        !            21: 
        !            22: #include "config.h"
        !            23: #include "rtl.h"
        !            24: #include "flags.h"
        !            25: #include "regs.h"
        !            26: #include "hard-reg-set.h"
        !            27: #include "reload.h"
        !            28: #include "insn-config.h"
        !            29: #include "basic-block.h"
        !            30: #include <stdio.h>
        !            31: 
        !            32: #define min(A,B) ((A) < (B) ? (A) : (B))
        !            33: 
        !            34: /* This file contains the reload pass of the compiler, which is
        !            35:    run after register allocation has been done.  It checks that
        !            36:    each insn is valid (operands required to be in registers really
        !            37:    are in registers of the proper class) and fixes up invalid ones
        !            38:    by copying values temporarily into registers for the insns
        !            39:    that need them.
        !            40: 
        !            41:    The results of register allocation are described by the vector
        !            42:    reg_renumber; the insns still contain pseudo regs, but reg_renumber
        !            43:    can be used to find which hard reg, if any, a pseudo reg is in.
        !            44: 
        !            45:    The technique we always use is to free up a few hard regs that are
        !            46:    called ``reload regs'', and for each place where a pseudo reg
        !            47:    must be in a hard reg, copy it temporarily into one of the reload regs.
        !            48: 
        !            49:    All the pseudos that were formerly allocated to the hard regs that
        !            50:    are now in use as reload regs must be ``spilled''.  This means
        !            51:    that they go to other hard regs, or to stack slots if no other
        !            52:    available hard regs can be found.  Spilling can invalidate more
        !            53:    insns, requiring additional need for reloads, so we must keep checking
        !            54:    until the process stabilizes.
        !            55: 
        !            56:    For machines with different classes of registers, we must keep track
        !            57:    of the register class needed for each reload, and make sure that
        !            58:    we allocate enough reload registers of each class.
        !            59: 
        !            60:    The file reload.c contains the code that checks one insn for
        !            61:    validity and reports the reloads that it needs.  This file
        !            62:    is in charge of scanning the entire rtl code, accumulating the
        !            63:    reload needs, spilling, assigning reload registers to use for
        !            64:    fixing up each insn, and generating the new insns to copy values
        !            65:    into the reload registers.  */
        !            66: 
        !            67: /* During reload_as_needed, element N contains a REG rtx for the hard reg
        !            68:    into which pseudo reg N has been reloaded (perhaps for a previous insn). */
        !            69: static rtx *reg_last_reload_reg;
        !            70: 
        !            71: /* Element N is the constant value to which pseudo reg N is equivalent,
        !            72:    or zero if pseudo reg N is not equivalent to a constant.
        !            73:    find_reloads looks at this in order to replace pseudo reg N
        !            74:    with the constant it stands for.  */
        !            75: rtx *reg_equiv_constant;
        !            76: 
        !            77: /* Element N is the address of stack slot to which pseudo reg N is equivalent.
        !            78:    This is used when the address is not valid as a memory address
        !            79:    (because its displacement is too big for the machine.)  */
        !            80: rtx *reg_equiv_address;
        !            81: 
        !            82: /* Element N is the memory slot to which pseudo reg N is equivalent,
        !            83:    or zero if pseudo reg N is not equivalent to a memory slot.  */
        !            84: static rtx *reg_equiv_mem;
        !            85: 
        !            86: /* Element N is the insn that initialized reg N from its equivalent
        !            87:    constant or memory slot.  */
        !            88: static rtx *reg_equiv_init;
        !            89: 
        !            90: /* During reload_as_needed, element N contains the last pseudo regno
        !            91:    reloaded into the Nth reload register.  This vector is in parallel
        !            92:    with spill_regs.  */
        !            93: static int reg_reloaded_contents[FIRST_PSEUDO_REGISTER];
        !            94: 
        !            95: /* In parallel with spill_regs, contains REG rtx's for those regs.
        !            96:    Holds the last rtx used for any given reg, or 0 if it has never
        !            97:    been used for spilling yet.  This rtx is reused, provided it has
        !            98:    the proper mode.  */
        !            99: static rtx spill_reg_rtx[FIRST_PSEUDO_REGISTER];
        !           100: 
        !           101: /* In parallel with spill_regs, contains nonzero for a spill reg
        !           102:    that was stored after the last time it was used.
        !           103:    The precise value is the insn generated to do the store.  */
        !           104: static rtx spill_reg_store[FIRST_PSEUDO_REGISTER];
        !           105: 
        !           106: /* This table is the inverse mapping of spill_regs:
        !           107:    indexed by hard reg number,
        !           108:    it contains the position of that reg in spill_regs,
        !           109:    or -1 for something that is not in spill_regs.  */
        !           110: static short spill_reg_order[FIRST_PSEUDO_REGISTER];
        !           111: 
        !           112: /* This table contains 1 for a register that may not be used
        !           113:    for retrying global allocation, or -1 for a register that may be used.
        !           114:    The registers that may not be used include all spill registers
        !           115:    and the frame pointer (if we are using one).  */
        !           116: static short forbidden_regs[FIRST_PSEUDO_REGISTER];
        !           117: 
        !           118: /* Describes order of use of registers for reloading
        !           119:    of spilled pseudo-registers.  `spills' is the number of
        !           120:    elements that are actually valid; new ones are added at the end.  */
        !           121: static char spill_regs[FIRST_PSEUDO_REGISTER];
        !           122: 
        !           123: /* Describes order of preference for putting regs into spill_regs.
        !           124:    Contains the numbers of all the hard regs, in order most preferred first.
        !           125:    This order is different for each function.
        !           126:    It is set up by order_regs_for_reload.
        !           127:    Empty elements at the end contain -1.  */
        !           128: static short potential_reload_regs[FIRST_PSEUDO_REGISTER];
        !           129: 
        !           130: /* 1 for a hard register that appears explicitly in the rtl
        !           131:    (for example, function value registers, special registers
        !           132:    used by insns, structure value pointer registers).  */
        !           133: static char regs_explicitly_used[FIRST_PSEUDO_REGISTER];
        !           134: 
        !           135: /* Nonzero if spilling (REG n) does not require reloading it into
        !           136:    a register in order to do (MEM (REG n)).  */
        !           137: 
        !           138: static char spill_indirect_ok;
        !           139: 
        !           140: /* Indexed by basic block number, nonzero if there is any need
        !           141:    for a spill register in that basic block.
        !           142:    The pointer is 0 if we did stupid allocation and don't know
        !           143:    the structure of basic blocks.  */
        !           144: 
        !           145: char *basic_block_needs;
        !           146: 
        !           147: /* First uid used by insns created by reload in this function.
        !           148:    Used in find_equiv_reg.  */
        !           149: int reload_first_uid;
        !           150: 
        !           151: static void reload_as_needed ();
        !           152: static rtx alter_frame_pointer_addresses ();
        !           153: static void alter_reg ();
        !           154: void mark_home_live ();
        !           155: static int spill_hard_reg ();
        !           156: static void choose_reload_targets ();
        !           157: static void forget_old_reloads ();
        !           158: static void order_regs_for_reload ();
        !           159: static void eliminate_frame_pointer ();
        !           160: 
        !           161: extern rtx adj_offsetable_operand ();
        !           162: 
        !           163: /* Main entry point for the reload pass, and only entry point
        !           164:    in this file.
        !           165: 
        !           166:    FIRST is the first insn of the function being compiled.
        !           167: 
        !           168:    GLOBAL nonzero means we were called from global_alloc
        !           169:    and should attempt to reallocate any pseudoregs that we
        !           170:    displace from hard regs we will use for reloads.
        !           171:    If GLOBAL is zero, we do not have enough information to do that,
        !           172:    so any pseudo reg that is spilled must go to the stack.
        !           173: 
        !           174:    DUMPFILE is the global-reg debugging dump file stream, or 0.
        !           175:    If it is nonzero, messages are written to it to describe
        !           176:    which registers are seized as reload regs, which pseudo regs
        !           177:    are spilled from them, and where the pseudo regs are reallocated to.  */
        !           178: 
        !           179: void
        !           180: reload (first, global, dumpfile)
        !           181:      rtx first;
        !           182:      int global;
        !           183:      FILE *dumpfile;
        !           184: {
        !           185:   register int n_spills;
        !           186:   register int class;
        !           187:   register int i;
        !           188:   register rtx insn;
        !           189: 
        !           190:   int something_changed;
        !           191:   int something_needs_reloads;
        !           192:   int new_basic_block_needs;
        !           193: 
        !           194:   /* The basic block number currently being processed for INSN.  */
        !           195:   int this_block;
        !           196: 
        !           197:   /* Enable find_equiv_reg to distinguish insns made by reload.  */
        !           198:   reload_first_uid = get_max_uid ();
        !           199: 
        !           200:   basic_block_needs = 0;
        !           201: 
        !           202:   /* Remember which hard regs appear explicitly
        !           203:      before we merge into `regs_ever_live' the ones in which
        !           204:      pseudo regs have been allocated.  */
        !           205:   bcopy (regs_ever_live, regs_explicitly_used, sizeof regs_ever_live);
        !           206: 
        !           207:   /* Compute which hard registers are now in use
        !           208:      as homes for pseudo registers.
        !           209:      This is done here rather than (eg) in global_alloc
        !           210:      because this point is reached even if not optimizing.  */
        !           211: 
        !           212:   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
        !           213:     mark_home_live (i);
        !           214: 
        !           215:   /* Find all the pseudo registers that didn't get hard regs
        !           216:      but do have known equivalent constants or memory slots.
        !           217:      These include parameters (known equivalent to parameter slots)
        !           218:      and cse'd or loop-moved constant memory addresses.
        !           219: 
        !           220:      Record constant equivalents in reg_equiv_constant
        !           221:      so they will be substituted by find_reloads.
        !           222:      Record memory equivalents in reg_mem_equiv so they can
        !           223:      be substituted eventually by altering the REG-rtx's.  */
        !           224: 
        !           225:   reg_equiv_constant = (rtx *) alloca (max_regno * sizeof (rtx));
        !           226:   bzero (reg_equiv_constant, max_regno * sizeof (rtx));
        !           227:   reg_equiv_mem = (rtx *) alloca (max_regno * sizeof (rtx));
        !           228:   bzero (reg_equiv_mem, max_regno * sizeof (rtx));
        !           229:   reg_equiv_init = (rtx *) alloca (max_regno * sizeof (rtx));
        !           230:   bzero (reg_equiv_init, max_regno * sizeof (rtx));
        !           231:   reg_equiv_address = (rtx *) alloca (max_regno * sizeof (rtx));
        !           232:   bzero (reg_equiv_address, max_regno * sizeof (rtx));
        !           233: 
        !           234:   for (insn = first; insn; insn = NEXT_INSN (insn))
        !           235:     if (GET_CODE (insn) == INSN
        !           236:        && GET_CODE (PATTERN (insn)) == SET
        !           237:        && GET_CODE (SET_DEST (PATTERN (insn))) == REG)
        !           238:       {
        !           239:        rtx note = find_reg_note (insn, REG_EQUIV, 0);
        !           240:        if (note)
        !           241:          {
        !           242:            rtx x = XEXP (note, 0);
        !           243:            i = REGNO (SET_DEST (PATTERN (insn)));
        !           244:            if (GET_CODE (x) == MEM)
        !           245:              reg_equiv_mem[i] = x;
        !           246:            else if (immediate_operand (x))
        !           247:              reg_equiv_constant[i] = x;
        !           248:            else
        !           249:              continue;
        !           250: 
        !           251:            reg_equiv_init[i] = insn;
        !           252:          }
        !           253:       }
        !           254: 
        !           255:   /* Does this function require a frame pointer?  */
        !           256: 
        !           257:   frame_pointer_needed
        !           258:     |= (! global || FRAME_POINTER_REQUIRED);
        !           259: 
        !           260:   if (! frame_pointer_needed)
        !           261:     frame_pointer_needed
        !           262:       = check_frame_pointer_required (reg_equiv_constant, reg_equiv_mem);
        !           263: 
        !           264:   /* Alter each pseudo-reg rtx to contain its hard reg number.
        !           265:      Delete initializations of pseudos that don't have hard regs
        !           266:      and do have equivalents.
        !           267:      Assign stack slots to the pseudos that lack hard regs or equivalents.  */
        !           268: 
        !           269:   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
        !           270:     alter_reg (i);
        !           271: 
        !           272: #ifndef REGISTER_CONSTRAINTS
        !           273:   /* If all the pseudo regs have hard regs,
        !           274:      except for those that are never referenced,
        !           275:      we know that no reloads are needed.  */
        !           276:   /* But that is not true if there are register constraints, since
        !           277:      in that case some pseudos might be in the wrong kind of hard reg.  */
        !           278: 
        !           279:   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
        !           280:     if (reg_renumber[i] == -1 && reg_n_refs[i] != 0)
        !           281:       break;
        !           282: 
        !           283:   if (i == max_regno && frame_pointer_needed)
        !           284:     return;
        !           285: #endif
        !           286: 
        !           287:   /* Compute the order of preference for hard registers to spill.
        !           288:      Store them by decreasing preference in potential_reload_regs.  */
        !           289: 
        !           290:   order_regs_for_reload ();
        !           291: 
        !           292:   /* So far, no hard regs have been spilled.  */
        !           293:   n_spills = 0;
        !           294:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !           295:     {
        !           296:       spill_reg_order[i] = -1;
        !           297:       forbidden_regs[i] = -1;
        !           298:     }
        !           299: 
        !           300:   if (frame_pointer_needed)
        !           301:     {
        !           302:       forbidden_regs[FRAME_POINTER_REGNUM] = 1;
        !           303:       spill_hard_reg (FRAME_POINTER_REGNUM, global, dumpfile);
        !           304:     }
        !           305: 
        !           306:   if (global)
        !           307:     {
        !           308:       basic_block_needs = (char *)alloca (n_basic_blocks);
        !           309:       bzero (basic_block_needs, n_basic_blocks);
        !           310:     }
        !           311: 
        !           312:   /* This loop scans the entire function each go-round
        !           313:      and repeats until one repetition spills no additional hard regs.  */
        !           314: 
        !           315:   /* This flag is set when a psuedo reg is spilled,
        !           316:      to require another pass.  Note that getting an additional reload
        !           317:      reg does not necessarily imply any pseudo reg was spilled;
        !           318:      sometimes we find a reload reg that no pseudo reg was allocated in.  */
        !           319:   something_changed = 1;
        !           320:   /* This flag is set if there are any insns that require reloading.  */
        !           321:   something_needs_reloads = 0;
        !           322:   while (something_changed)
        !           323:     {
        !           324:       /* For each class, number of reload regs needed in that class.
        !           325:         This is the maximum over all insns of the needs in that class
        !           326:         of the individual insn.  */
        !           327:       int max_needs[N_REG_CLASSES];
        !           328:       /* For each class, size of group of consecutive regs
        !           329:         that is needed for the reloads of this class.  */
        !           330:       int group_size[N_REG_CLASSES];
        !           331:       /* For each class, max number of consecutive groups needed.
        !           332:         (Each group contains max_needs_size[CLASS] consecutive registers.)  */
        !           333:       int max_groups[N_REG_CLASSES];
        !           334:       /* For each class, max number needed of regs that don't belong
        !           335:         to any of the groups.  */
        !           336:       int max_nongroups[N_REG_CLASSES];
        !           337:       /* For each class, the machine mode which requires consecutive
        !           338:         groups of regs of that class.
        !           339:         If two different modes ever require groups of one class,
        !           340:         we crash, not having the hair to deal with that case.  */
        !           341:       enum machine_mode group_mode[N_REG_CLASSES];
        !           342:       /* For each register, 1 if it was counted against the need for
        !           343:         groups.  0 means it can count against max_nongroup instead.  */
        !           344:       char counted_for_groups[FIRST_PSEUDO_REGISTER];
        !           345: 
        !           346:       something_changed = 0;
        !           347:       bzero (max_needs, sizeof max_needs);
        !           348:       bzero (max_groups, sizeof max_groups);
        !           349:       bzero (max_nongroups, sizeof max_nongroups);
        !           350:       bzero (group_size, sizeof group_size);
        !           351:       for (i = 0; i < N_REG_CLASSES; i++)
        !           352:        group_mode[i] = VOIDmode;
        !           353: 
        !           354:       /* Keep track of which basic blocks are needing the reloads.  */
        !           355:       this_block = 0;
        !           356: 
        !           357:       /* Remember whether any element of basic_block_needs
        !           358:         changes from 0 to 1 in this pass.  */
        !           359:       new_basic_block_needs = 0;
        !           360: 
        !           361:       /* Compute the most additional registers needed by any instruction.
        !           362:         Collect information separately for each class of regs.  */
        !           363: 
        !           364:       for (insn = first; insn; insn = NEXT_INSN (insn))
        !           365:        {
        !           366:          if (global && insn == basic_block_head[this_block+1])
        !           367:            ++this_block;
        !           368: 
        !           369:          if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
        !           370:              || GET_CODE (insn) == CALL_INSN)
        !           371:            {
        !           372:              int insn_needs[N_REG_CLASSES];
        !           373:              int insn_groups[N_REG_CLASSES];
        !           374:              int insn_total_groups = 0;
        !           375: 
        !           376:              for (i = 0; i < N_REG_CLASSES; i++)
        !           377:                insn_needs[i] = 0, insn_groups[i] = 0;
        !           378: 
        !           379: #if 0
        !           380:              /* Optimization: a bit-field instruction whose field
        !           381:                 happens to be a byte or halfword in memory
        !           382:                 can be changed to a move instruction.  */
        !           383: 
        !           384:              if (GET_CODE (PATTERN (insn)) == SET)
        !           385:                {
        !           386:                  rtx dest = SET_DEST (PATTERN (insn));
        !           387:                  rtx src = SET_SRC (PATTERN (insn));
        !           388: 
        !           389:                  if (GET_CODE (dest) == ZERO_EXTRACT
        !           390:                      || GET_CODE (dest) == SIGN_EXTRACT)
        !           391:                    optimize_bit_field (PATTERN (insn), insn, reg_equiv_mem);
        !           392:                  if (GET_CODE (src) == ZERO_EXTRACT
        !           393:                      || GET_CODE (src) == SIGN_EXTRACT)
        !           394:                    optimize_bit_field (PATTERN (insn), insn, reg_equiv_mem);
        !           395:                }
        !           396: #endif
        !           397: 
        !           398:              /* Analyze the instruction.  */
        !           399: 
        !           400:              find_reloads (insn, 0, spill_indirect_ok, global, spill_reg_order);
        !           401: 
        !           402:              if (n_reloads == 0)
        !           403:                continue;
        !           404: 
        !           405:              something_needs_reloads = 1;
        !           406: 
        !           407:              /* Count each reload once in every class
        !           408:                 containing the reload's own class.  */
        !           409: 
        !           410:              for (i = 0; i < n_reloads; i++)
        !           411:                {
        !           412:                  register enum reg_class *p;
        !           413:                  int size;
        !           414:                  enum machine_mode mode;
        !           415: 
        !           416:                  /* Don't count the dummy reloads, for which one of the
        !           417:                     regs mentioned in the insn can be used for reloading.
        !           418:                     Don't count optional reloads.
        !           419:                     Don't count reloads that got combined with others.  */
        !           420:                  if (reload_reg_rtx[i] != 0
        !           421:                      || reload_optional[i] != 0
        !           422:                      || (reload_out[i] == 0 && reload_in[i] == 0))
        !           423:                    continue;
        !           424: 
        !           425:                  mode = reload_inmode[i];
        !           426:                  if (GET_MODE_SIZE (reload_outmode[i]) > GET_MODE_SIZE (mode))
        !           427:                    mode = reload_outmode[i];
        !           428:                  size = CLASS_MAX_NREGS (reload_reg_class[i], mode);
        !           429:                  if (size > 1)
        !           430:                    {
        !           431:                      /* Count number of groups needed separately from
        !           432:                         number of individual regs needed.  */
        !           433:                      insn_groups[(int) reload_reg_class[i]]++;
        !           434:                      p = reg_class_superclasses[(int) reload_reg_class[i]];
        !           435:                      while (*p != LIM_REG_CLASSES)
        !           436:                        insn_groups[(int) *p++]++;
        !           437:                      insn_total_groups++;
        !           438: 
        !           439:                      /* Record size of a group.  */
        !           440:                      group_size[(int) reload_reg_class[i]] = size;
        !           441:                      /* If a group of consecutive regs are needed,
        !           442:                         record which machine mode needs them.
        !           443:                         Crash if two different machine modes both need
        !           444:                         groups of consecutive regs of the same class.  */
        !           445:                      if ((group_mode[(int) reload_reg_class[i]] != VOIDmode)
        !           446:                          &&
        !           447:                          (group_mode[(int) reload_reg_class[i]] != mode))
        !           448:                        abort ();
        !           449:                      group_mode[(int) reload_reg_class[i]] = mode;
        !           450:                    }
        !           451:                  else if (size == 1)
        !           452:                    {
        !           453:                      insn_needs[(int) reload_reg_class[i]] += 1;
        !           454:                      p = reg_class_superclasses[(int) reload_reg_class[i]];
        !           455:                      while (*p != LIM_REG_CLASSES)
        !           456:                        insn_needs[(int) *p++] += 1;
        !           457:                    }
        !           458:                  else
        !           459:                    abort ();
        !           460: 
        !           461:                  if (global)
        !           462:                    {
        !           463:                      if (! basic_block_needs[this_block])
        !           464:                        new_basic_block_needs = 1;
        !           465:                      basic_block_needs[this_block] = 1;
        !           466:                    }
        !           467:                }
        !           468: 
        !           469:              /* Remember for later shortcuts which insns had any reloads.  */
        !           470: 
        !           471:              PUT_MODE (insn, n_reloads ? QImode : VOIDmode);
        !           472: 
        !           473:              /* For each class, collect maximum need of any insn */
        !           474: 
        !           475:              for (i = 0; i < N_REG_CLASSES; i++)
        !           476:                {
        !           477:                  if (max_needs[i] < insn_needs[i])
        !           478:                    max_needs[i] = insn_needs[i];
        !           479:                  if (max_groups[i] < insn_groups[i])
        !           480:                    max_groups[i] = insn_groups[i];
        !           481:                  if (insn_total_groups > 0)
        !           482:                    if (max_nongroups[i] < insn_needs[i])
        !           483:                      max_nongroups[i] = insn_needs[i];
        !           484:                }
        !           485:            }
        !           486:          /* Note that there is a continue statement above.  */
        !           487:        }
        !           488: 
        !           489:       /* Now deduct from the needs for the registers already
        !           490:         available (already spilled).  */
        !           491: 
        !           492:       bzero (counted_for_groups, sizeof counted_for_groups);
        !           493: 
        !           494:       /* Find all consecutive groups of spilled registers
        !           495:         and mark each group off against the need for such groups.  */
        !           496: 
        !           497:       for (i = 0; i < N_REG_CLASSES; i++)
        !           498:        if (group_size[i] > 1)
        !           499:          {
        !           500:            char regmask[FIRST_PSEUDO_REGISTER];
        !           501:            int j;
        !           502: 
        !           503:            bzero (regmask, sizeof regmask);
        !           504:            /* Make a mask of all the regs that are spill regs in class I.  */
        !           505:            for (j = 0; j < n_spills; j++)
        !           506:              if (TEST_HARD_REG_BIT (reg_class_contents[i], spill_regs[j])
        !           507:                  && !counted_for_groups[spill_regs[i]])
        !           508:                regmask[spill_regs[j]] = 1;
        !           509:            /* Find each consecutive group of them.  */
        !           510:            for (j = 0; j < FIRST_PSEUDO_REGISTER && max_groups[i] > 0; j++)
        !           511:              if (regmask[j] && j + group_size[i] <= FIRST_PSEUDO_REGISTER)
        !           512:                {
        !           513:                  int k;
        !           514:                  for (k = 1; k < group_size[i]; k++)
        !           515:                    if (! regmask[j + k])
        !           516:                      break;
        !           517:                  if (k == group_size[i])
        !           518:                    {
        !           519:                      /* We found a group.  Mark it off against this class's
        !           520:                         need for groups, and against each superclass too.  */
        !           521:                      register enum reg_class *p;
        !           522:                      max_groups[i]--;
        !           523:                      p = reg_class_superclasses[i];
        !           524:                      while (*p != LIM_REG_CLASSES)
        !           525:                        max_groups[(int) *p++]--;
        !           526:                      /* Don't count these registers again.  */ 
        !           527:                      counted_for_groups[j] = 1;
        !           528:                      for (k = 1; k < group_size[i]; k++)
        !           529:                        counted_for_groups[j + k] = 1;
        !           530:                    }
        !           531:                  j += k;
        !           532:                }
        !           533:          }
        !           534: 
        !           535:       /* Now count all remaining spill regs against the individual need.
        !           536:         Those that weren't counted_for_groups in groups can also count against
        !           537:         the not-in-group need.  */
        !           538: 
        !           539:       for (i = 0; i < n_spills; i++)
        !           540:        {
        !           541:          register enum reg_class *p;
        !           542:          class = (int) REGNO_REG_CLASS (spill_regs[i]);
        !           543: 
        !           544:          max_needs[class]--;
        !           545:          p = reg_class_superclasses[class];
        !           546:          while (*p != LIM_REG_CLASSES)
        !           547:            max_needs[(int) *p++]--;
        !           548: 
        !           549:          if (! counted_for_groups[spill_regs[i]])
        !           550:            {
        !           551:              max_nongroups[class]--;
        !           552:              p = reg_class_superclasses[class];
        !           553:              while (*p != LIM_REG_CLASSES)
        !           554:                max_nongroups[(int) *p++]--;
        !           555:            }
        !           556:        }
        !           557: 
        !           558:       /* If all needs are met, we win.  */
        !           559: 
        !           560:       for (i = 0; i < N_REG_CLASSES; i++)
        !           561:        if (max_needs[i] > 0 || max_groups[i] > 0 || max_nongroups[i] > 0)
        !           562:          break;
        !           563:       if (i == N_REG_CLASSES && !new_basic_block_needs)
        !           564:        break;
        !           565: 
        !           566:       /* Not all needs are met; must spill more hard regs.  */
        !           567: 
        !           568:       /* If any element of basic_block_needs changed from 0 to 1,
        !           569:         re-spill all the regs already spilled.  This may spill
        !           570:         additional pseudos that didn't spill before.  */
        !           571: 
        !           572:       if (new_basic_block_needs)
        !           573:        for (i = 0; i < n_spills; i++)
        !           574:          something_changed
        !           575:            |= spill_hard_reg (spill_regs[i], global, dumpfile);
        !           576: 
        !           577:       /* Now find more reload regs to satisfy the remaining need.
        !           578:         Count them in `spills', and add entries to
        !           579:         `spill_regs' and `spill_reg_order'.  */
        !           580: 
        !           581:       for (class = 0; class < N_REG_CLASSES; class++)
        !           582:        while (max_needs[class] > 0 || max_groups[class] > 0
        !           583:               || max_nongroups[class] > 0)
        !           584:          {
        !           585:            register enum reg_class *p;
        !           586:            int in_a_group = 0;
        !           587: 
        !           588:            /* First, if we need more groups of consecutive regs, get them.
        !           589:               Either get a spill register that completes a group
        !           590:               or, if that cannot be done, get one that starts a group.
        !           591:               Here we do not yet handle groups of size > 2.  */
        !           592:            if (max_groups[class] > 0)
        !           593:              {
        !           594:                if (group_size[class] > 2)
        !           595:                  abort ();
        !           596: 
        !           597:                for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !           598:                  {
        !           599:                    int j = potential_reload_regs[i];
        !           600:                    if (j >= 0
        !           601:                        &&
        !           602:                        ((j > 0 && spill_reg_order[j - 1] >= 0
        !           603:                          && TEST_HARD_REG_BIT (reg_class_contents[class], j)
        !           604:                          && TEST_HARD_REG_BIT (reg_class_contents[class], j - 1)
        !           605:                          && HARD_REGNO_MODE_OK (j - 1, group_mode[class]))
        !           606:                         ||
        !           607:                         (j < FIRST_PSEUDO_REGISTER - 1
        !           608:                          && spill_reg_order[j + 1] >= 0
        !           609:                          && TEST_HARD_REG_BIT (reg_class_contents[class], j)
        !           610:                          && TEST_HARD_REG_BIT (reg_class_contents[class], j + 1)
        !           611:                          && HARD_REGNO_MODE_OK (j, group_mode[class]))))
        !           612:                      {
        !           613:                        /* We have found one that will complete a group,
        !           614:                           so count off one group as provided.  */
        !           615:                        max_groups[class]--;
        !           616:                        p = reg_class_superclasses[class];
        !           617:                        while (*p != LIM_REG_CLASSES)
        !           618:                          max_groups[(int) *p++]--;
        !           619:                        in_a_group = 1;
        !           620:                        break;
        !           621:                      }
        !           622:                  }
        !           623:                /* We can't complete any group, so start one.  */
        !           624:                if (i == FIRST_PSEUDO_REGISTER)
        !           625:                  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !           626:                    {
        !           627:                      int j = potential_reload_regs[i];
        !           628:                      if (j >= 0 && j + 1 < FIRST_PSEUDO_REGISTER
        !           629:                          && spill_reg_order[j] < 0 && spill_reg_order[j + 1] < 0
        !           630:                          && TEST_HARD_REG_BIT (reg_class_contents[class], j)
        !           631:                          && TEST_HARD_REG_BIT (reg_class_contents[class], j + 1)
        !           632:                          && HARD_REGNO_MODE_OK (j, group_mode[class]))
        !           633:                        {
        !           634:                          in_a_group = 1;
        !           635:                          break;
        !           636:                        }
        !           637:                    }
        !           638:              }
        !           639:            else
        !           640:              {
        !           641:                /* We want a solitary register.  */
        !           642: 
        !           643:                /* Consider the potential reload regs that aren't
        !           644:                   yet in use as reload regs, in order of preference.
        !           645:                   Find the most preferred one that's in this class.  */
        !           646: 
        !           647:                for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !           648:                  if (potential_reload_regs[i] >= 0
        !           649:                      && TEST_HARD_REG_BIT (reg_class_contents[class],
        !           650:                                            potential_reload_regs[i]))
        !           651:                    break;
        !           652:              }
        !           653: 
        !           654:            /* I should be the index in potential_reload_regs
        !           655:               of the new reload reg we have found.  */
        !           656: 
        !           657:            if (i == FIRST_PSEUDO_REGISTER)
        !           658:              abort (); /* No reload reg possible? */
        !           659: 
        !           660:            /* Make potential_reload_regs[i] an additional reload reg.  */
        !           661: 
        !           662:            spill_regs[n_spills] = potential_reload_regs[i];
        !           663:            spill_reg_order[potential_reload_regs[i]] = n_spills;
        !           664:            forbidden_regs[potential_reload_regs[i]] = 1;
        !           665:            potential_reload_regs[i] = -1;
        !           666:            if (dumpfile)
        !           667:              fprintf (dumpfile, "Spilling reg %d.\n", spill_regs[n_spills]);
        !           668: 
        !           669:            /* Clear off the needs we just satisfied.  */
        !           670: 
        !           671:            max_needs[class]--;
        !           672:            p = reg_class_superclasses[class];
        !           673:            while (*p != LIM_REG_CLASSES)
        !           674:              max_needs[(int) *p++]--;
        !           675: 
        !           676:            if (! in_a_group)
        !           677:              {
        !           678:                max_nongroups[class]--;
        !           679:                p = reg_class_superclasses[class];
        !           680:                while (*p != LIM_REG_CLASSES)
        !           681:                  max_nongroups[(int) *p++]--;
        !           682:              }
        !           683: 
        !           684:            /* Spill every pseudo reg that was allocated to this reg
        !           685:               or to something that overlaps this reg.  */
        !           686: 
        !           687:            something_changed |= spill_hard_reg (spill_regs[n_spills],
        !           688:                                                 global, dumpfile);
        !           689: 
        !           690:            regs_ever_live[spill_regs[n_spills]] = 1;
        !           691:            n_spills++;
        !           692:        }
        !           693:     }
        !           694: 
        !           695:   /* Use the reload registers where necessary
        !           696:      by generating move instructions to move the must-be-register
        !           697:      values into or out of the reload registers.  */
        !           698: 
        !           699:   if (something_needs_reloads)
        !           700:     reload_as_needed (first, n_spills, global);
        !           701: 
        !           702:   /* Now eliminate all pseudo regs by modifying them into
        !           703:      their equivalent memory references.
        !           704:      The REG-rtx's for the pseudos are modified in place,
        !           705:      so all insns that used to refer to them now refer to memory.
        !           706: 
        !           707:      For a reg that has a reg_equiv_address, all those insns
        !           708:      were changed by reloading so that no insns refer to it any longer;
        !           709:      but the DECL_RTL of a variable decl may refer to it,
        !           710:      and if so this causes the debugging info to mention the variable.  */
        !           711: 
        !           712:   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
        !           713:     {
        !           714:       rtx addr = 0;
        !           715:       if (reg_equiv_mem[i])
        !           716:        addr = XEXP (reg_equiv_mem[i], 0);
        !           717:       if (reg_equiv_address[i])
        !           718:        addr = reg_equiv_address[i];
        !           719:       if (addr)
        !           720:        {
        !           721:          if (reg_renumber[i] < 0)
        !           722:            {
        !           723:              rtx reg = regno_reg_rtx[i];
        !           724:              XEXP (reg, 0) = addr;
        !           725:              PUT_CODE (reg, MEM);
        !           726:            }
        !           727:          else if (reg_equiv_mem[i])
        !           728:            {
        !           729:              if (! frame_pointer_needed)
        !           730:                FIX_FRAME_POINTER_ADDRESS (addr, 0);
        !           731:              XEXP (reg_equiv_mem[i], 0) = addr;
        !           732:            }
        !           733:        }
        !           734:     }
        !           735: 
        !           736:   /* Sometimes the sole reference to a parameter has been combined into
        !           737:      another instruction, eliminating the parameter's register.
        !           738:      Find these memory references and fix their addresses.  */
        !           739: 
        !           740:   if (! frame_pointer_needed)
        !           741:     eliminate_frame_pointer (first);
        !           742: }
        !           743: 
        !           744: /* Scan all insns, computing the stack depth, and convert all
        !           745:    frame-pointer-relative references to stack-pointer-relative references.  */
        !           746: 
        !           747: static void
        !           748: eliminate_frame_pointer (first)
        !           749:      rtx first;
        !           750: {
        !           751:   int depth = 0;
        !           752:   int max_uid = get_max_uid ();
        !           753:   int *label_depth = (int *) alloca ((max_uid + 1) * sizeof (int));
        !           754:   int i;
        !           755:   rtx insn;
        !           756: 
        !           757:   for (i = 0; i <= max_uid; i++)
        !           758:     label_depth[i] = -1;
        !           759: 
        !           760:   /* In this loop, for each forward branch we record the stack
        !           761:      depth of the label it jumps to.  We take advantage of the fact
        !           762:      that the stack depth at a label reached by a backward branch
        !           763:      is always, in GCC output, equal to the stack depth of the preceding
        !           764:      unconditional jump, because it was either a loop statement or
        !           765:      statement label.  */
        !           766: 
        !           767:   for (insn = first; insn; insn = NEXT_INSN (insn))
        !           768:     {
        !           769:       rtx pattern = PATTERN (insn);
        !           770:       switch (GET_CODE (insn))
        !           771:        {
        !           772:        case INSN:
        !           773:          alter_frame_pointer_addresses (pattern, depth);
        !           774: #ifdef PUSH_ROUNDING
        !           775:          /* Notice pushes and pops; update DEPTH.  */
        !           776:          if (GET_CODE (pattern) == SET)
        !           777:            {
        !           778:              if (push_operand (SET_DEST (pattern),
        !           779:                                GET_MODE (SET_DEST (pattern))))
        !           780:                depth += PUSH_ROUNDING (GET_MODE_SIZE (GET_MODE (SET_DEST (pattern))));
        !           781:              if (GET_CODE (SET_DEST (pattern)) == REG
        !           782:                  && REGNO (SET_DEST (pattern)) == STACK_POINTER_REGNUM)
        !           783:                {
        !           784:                  int delta;
        !           785:                  if (GET_CODE (SET_SRC (pattern)) == PLUS
        !           786:                      && GET_CODE (XEXP (SET_SRC (pattern), 0)) == REG
        !           787:                      && REGNO (XEXP (SET_SRC (pattern), 0)) == STACK_POINTER_REGNUM)
        !           788:                    delta = INTVAL (XEXP (SET_SRC (pattern), 1));
        !           789:                  else if (GET_CODE (SET_SRC (pattern)) == MINUS
        !           790:                           && GET_CODE (XEXP (SET_SRC (pattern), 0)) == REG
        !           791:                           && REGNO (XEXP (SET_SRC (pattern), 0)) == STACK_POINTER_REGNUM)
        !           792:                    delta = -INTVAL (XEXP (SET_SRC (pattern), 1));
        !           793:                  else abort ();
        !           794: #ifdef STACK_GROWS_DOWNWARD
        !           795:                  depth -= delta;
        !           796: #else
        !           797:                  depth += delta;
        !           798: #endif
        !           799:                }
        !           800:            }
        !           801: #endif
        !           802:          break;
        !           803: 
        !           804:        case JUMP_INSN:
        !           805:          alter_frame_pointer_addresses (pattern, depth);
        !           806:          if (GET_CODE (pattern) == ADDR_VEC)
        !           807:            for (i = 0; i < XVECLEN (pattern, 0); i++)
        !           808:              label_depth[INSN_UID (XEXP (XVECEXP (pattern, 0, i), 0))] = depth;
        !           809:          else if (GET_CODE (pattern) == ADDR_DIFF_VEC)
        !           810:            {
        !           811:              label_depth[INSN_UID (XEXP (XEXP (pattern, 0), 0))] = depth;
        !           812:              for (i = 0; i < XVECLEN (pattern, 1); i++)
        !           813:                label_depth[INSN_UID (XEXP (XVECEXP (pattern, 1, i), 0))] = depth;
        !           814:            }
        !           815:          else if (JUMP_LABEL (insn))
        !           816:            label_depth[INSN_UID (JUMP_LABEL (insn))] = depth;
        !           817:          else
        !           818:          break;
        !           819: 
        !           820:        case CODE_LABEL:
        !           821:          if (label_depth [INSN_UID (insn)] >= 0)
        !           822:            depth = label_depth [INSN_UID (insn)];
        !           823:          break;
        !           824: 
        !           825:        case CALL_INSN:
        !           826:          alter_frame_pointer_addresses (pattern, depth);
        !           827:          break;
        !           828:        }
        !           829:     }
        !           830: }
        !           831: 
        !           832: /* Walk the rtx X, converting all frame-pointer refs to stack-pointer refs
        !           833:    on the assumption that the current temporary stack depth is DEPTH.
        !           834:    (The size of saved registers must be added to DEPTH
        !           835:    to get the actual offset between the logical frame-pointer and the
        !           836:    stack pointer.  FIX_FRAME_POINTER_ADDRESS takes care of that.)  */
        !           837: 
        !           838: static rtx
        !           839: alter_frame_pointer_addresses (x, depth)
        !           840:      register rtx x;
        !           841:      int depth;
        !           842: {
        !           843:   register int i;
        !           844:   register char *fmt;
        !           845:   register enum rtx_code code = GET_CODE (x);
        !           846: 
        !           847:   switch (code)
        !           848:     {
        !           849:     case REG:
        !           850:     case CONST_INT:
        !           851:     case CONST:
        !           852:     case SYMBOL_REF:
        !           853:     case LABEL_REF:
        !           854:     case CONST_DOUBLE:
        !           855:     case CC0:
        !           856:     case PC:
        !           857:       return x;
        !           858: 
        !           859:     case MEM:
        !           860:       {
        !           861:        rtx addr = XEXP (x, 0);
        !           862:        FIX_FRAME_POINTER_ADDRESS (addr, depth);
        !           863:        XEXP (x, 0) = addr;
        !           864:       }
        !           865:       break;
        !           866: 
        !           867:     case PLUS:
        !           868:       /* Handle addresses being loaded or pushed, etc.,
        !           869:         rather than referenced.  */
        !           870:       FIX_FRAME_POINTER_ADDRESS (x, depth);
        !           871:       break;
        !           872:     }
        !           873: 
        !           874:   fmt = GET_RTX_FORMAT (code);
        !           875:   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
        !           876:     {
        !           877:       if (fmt[i] == 'e')
        !           878:        XEXP (x, i) = alter_frame_pointer_addresses (XEXP (x, i), depth);
        !           879:       else if (fmt[i] == 'E')
        !           880:        {
        !           881:          register int j;
        !           882:          for (j = XVECLEN (x, i) - 1; j >=0; j--)
        !           883:            XVECEXP (x, i, j)
        !           884:              = alter_frame_pointer_addresses (XVECEXP (x, i, j), depth);
        !           885:        }
        !           886:     }
        !           887:   return x;
        !           888: }
        !           889: 
        !           890: static void
        !           891: alter_reg (i)
        !           892:      register int i;
        !           893: {
        !           894:   /* If the reg got changed to a MEM at rtl-generation time,
        !           895:      ignore it.  */
        !           896:   if (GET_CODE (regno_reg_rtx[i]) != REG)
        !           897:     return;
        !           898: 
        !           899:   /* Modify the reg-rtx to contain the new hard reg
        !           900:      number or else to contain its pseudo reg number.  */
        !           901:   REGNO (regno_reg_rtx[i])
        !           902:     = reg_renumber[i] >= 0 ? reg_renumber[i] : i;
        !           903: 
        !           904:   if (reg_renumber[i] < 0 && reg_equiv_init[i])
        !           905:     {
        !           906:       /* Delete the insn that loads the pseudo register.  */
        !           907:       PUT_CODE (reg_equiv_init[i], NOTE);
        !           908:       NOTE_LINE_NUMBER (reg_equiv_init[i])
        !           909:        = NOTE_INSN_DELETED;
        !           910:       NOTE_SOURCE_FILE (reg_equiv_init[i]) = 0;
        !           911:     }
        !           912: 
        !           913:   /* If we have a pseudo that is needed but has no hard reg or equivalent,
        !           914:      allocate a stack slot for it.  */
        !           915: 
        !           916:   if (reg_renumber[i] < 0
        !           917:       && reg_n_refs[i] > 0
        !           918:       && reg_equiv_constant[i] == 0
        !           919:       && reg_equiv_mem[i] == 0)
        !           920:     {
        !           921:       register rtx x = assign_stack_local (GET_MODE (regno_reg_rtx[i]),
        !           922:                                           PSEUDO_REGNO_BYTES (i));
        !           923:       register rtx addr = XEXP (x, 0);
        !           924:       /* If the stack slot is directly addressable, substitute
        !           925:         the MEM we just got directly for the old REG.
        !           926:         Otherwise, record the address; we will generate hairy code
        !           927:         to compute the address in a register each time it is needed.  */
        !           928:       if (memory_address_p (GET_MODE (regno_reg_rtx[i]), addr))
        !           929:        reg_equiv_mem[i] = x;
        !           930:       else
        !           931:        reg_equiv_address[i] = XEXP (x, 0);
        !           932:     }
        !           933: }
        !           934: 
        !           935: /* Mark the slots in regs_ever_live for the hard regs
        !           936:    used by pseudo-reg number REGNO.  */
        !           937: 
        !           938: void
        !           939: mark_home_live (regno)
        !           940:      int regno;
        !           941: {
        !           942:   register int i, lim;
        !           943:   i = reg_renumber[regno];
        !           944:   if (i < 0)
        !           945:     return;
        !           946:   lim = i + HARD_REGNO_NREGS (i, PSEUDO_REGNO_MODE (regno));
        !           947:   while (i < lim)
        !           948:     regs_ever_live[i++] = 1;
        !           949: }
        !           950: 
        !           951: /* Kick all pseudos out of hard register REGNO.
        !           952:    If GLOBAL is nonzero, try to find someplace else to put them.
        !           953:    If DUMPFILE is nonzero, log actions taken on that file.
        !           954: 
        !           955:    Return nonzero if any pseudos needed to be kicked out.  */
        !           956: 
        !           957: static int
        !           958: spill_hard_reg (regno, global, dumpfile)
        !           959:      register int regno;
        !           960:      int global;
        !           961:      FILE *dumpfile;
        !           962: {
        !           963:   int something_changed = 0;
        !           964:   register int i;
        !           965: 
        !           966:   /* Spill every pseudo reg that was allocated to this reg
        !           967:      or to something that overlaps this reg.  */
        !           968: 
        !           969:   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
        !           970:     if (reg_renumber[i] >= 0
        !           971:        && reg_renumber[i] <= regno
        !           972:        && (reg_renumber[i] 
        !           973:            + HARD_REGNO_NREGS (reg_renumber[i],
        !           974:                                PSEUDO_REGNO_MODE (i))
        !           975:            > regno))
        !           976:       {
        !           977: #if 1
        !           978:        /* If this register belongs solely to a basic block
        !           979:           which needed no spilling, leave it be.  */
        !           980:        if (basic_block_needs
        !           981:            && reg_basic_block[i] >= 0
        !           982:            && basic_block_needs[reg_basic_block[i]] == 0)
        !           983:          continue;
        !           984: #endif
        !           985: 
        !           986:        /* Mark it as no longer having a hard register home.  */
        !           987:        reg_renumber[i] = -1;
        !           988:        /* We will need to scan everything again.  */
        !           989:        something_changed = 1;
        !           990:        if (global)
        !           991:          {
        !           992:            retry_global_alloc (i, forbidden_regs);
        !           993:            /* Update regs_ever_live for new home (if any).  */
        !           994:            mark_home_live (i);
        !           995:            /* If something gets spilled to the stack,
        !           996:               we must have a frame pointer, so spill the frame pointer.  */
        !           997:            if (reg_renumber[i] == -1 && ! frame_pointer_needed)
        !           998:              {
        !           999:                frame_pointer_needed = 1;
        !          1000:                forbidden_regs[FRAME_POINTER_REGNUM] = 1;
        !          1001:                spill_hard_reg (FRAME_POINTER_REGNUM, global, dumpfile);
        !          1002:              }
        !          1003:          }
        !          1004:        alter_reg (i);
        !          1005:        if (dumpfile)
        !          1006:          {
        !          1007:            if (reg_renumber[i] == -1)
        !          1008:              fprintf (dumpfile, " Register %d now on stack.\n\n", i);
        !          1009:            else
        !          1010:              fprintf (dumpfile, " Register %d now in %d.\n\n",
        !          1011:                       i, reg_renumber[i]);
        !          1012:          }
        !          1013:       }
        !          1014: 
        !          1015:   return something_changed;
        !          1016: }
        !          1017: 
        !          1018: struct hard_reg_n_uses { int regno; int uses; };
        !          1019: 
        !          1020: static int
        !          1021: hard_reg_use_compare (p1, p2)
        !          1022:      struct hard_reg_n_uses *p1, *p2;
        !          1023: {
        !          1024:   return p1->uses - p2->uses;
        !          1025: }
        !          1026: 
        !          1027: /* Choose the order to consider regs for use as reload registers
        !          1028:    based on how much trouble would be caused by spilling one.
        !          1029:    Store them in order of decreasing preference in potential_reload_regs.  */
        !          1030: 
        !          1031: static void
        !          1032: order_regs_for_reload ()
        !          1033: {
        !          1034:   register int i;
        !          1035:   register int o = 0;
        !          1036:   int large = 0;
        !          1037: 
        !          1038:   struct hard_reg_n_uses hard_reg_n_uses[FIRST_PSEUDO_REGISTER];
        !          1039: 
        !          1040:   /* Count number of uses of each hard reg by pseudo regs allocated to it
        !          1041:      and then order them by decreasing use.  */
        !          1042: 
        !          1043:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          1044:     {
        !          1045:       hard_reg_n_uses[i].uses = 0;
        !          1046:       hard_reg_n_uses[i].regno = i;
        !          1047:     }
        !          1048: 
        !          1049:   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
        !          1050:     {
        !          1051:       if (reg_renumber[i] >= 0)
        !          1052:        hard_reg_n_uses[reg_renumber[i]].uses += reg_n_refs[i];
        !          1053:       large += reg_n_refs[i];
        !          1054:     }
        !          1055: 
        !          1056:   /* Now fixed registers (which cannot safely be used for reloading)
        !          1057:      get a very high use count so they will be considered least desirable.
        !          1058:      Likewise registers used explicitly in the rtl code.  */
        !          1059: 
        !          1060:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          1061:     if (fixed_regs[i] || regs_explicitly_used[i])
        !          1062:       hard_reg_n_uses[i].uses = large;
        !          1063:   hard_reg_n_uses[FRAME_POINTER_REGNUM].uses = large;
        !          1064: 
        !          1065:   qsort (hard_reg_n_uses, FIRST_PSEUDO_REGISTER,
        !          1066:         sizeof hard_reg_n_uses[0], hard_reg_use_compare);
        !          1067: 
        !          1068:   /* Prefer registers not so far used, for use in temporary loading.
        !          1069:      Among them, prefer registers not preserved by calls.  */
        !          1070: 
        !          1071:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          1072:     if (regs_ever_live[i] == 0 && call_used_regs[i]
        !          1073:        && ! fixed_regs[i])
        !          1074:       potential_reload_regs[o++] = i;
        !          1075: 
        !          1076:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          1077:     if (regs_ever_live[i] == 0 && ! call_used_regs[i]
        !          1078:        && i != FRAME_POINTER_REGNUM)
        !          1079:       potential_reload_regs[o++] = i;
        !          1080: 
        !          1081:   /* Now add the regs that are already used,
        !          1082:      preferring those used less often.  */
        !          1083: 
        !          1084:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          1085:     if (regs_ever_live[hard_reg_n_uses[i].regno] != 0)
        !          1086:       potential_reload_regs[o++] = hard_reg_n_uses[i].regno;
        !          1087: 
        !          1088: #if 0
        !          1089:   /* For regs that are used, don't prefer those not preserved by calls
        !          1090:      because those are likely to contain high priority things
        !          1091:      that are live for short periods of time.  */
        !          1092: 
        !          1093:   for (i = FIRST_PSEUDO_REGISTER - 1; i >= 0; i--)
        !          1094:     if (regs_ever_live[i] != 0 && ! call_used_regs[i])
        !          1095:       potential_reload_regs[o++] = i;
        !          1096: #endif
        !          1097: }
        !          1098: 
        !          1099: /* Reload pseudo-registers into hard regs around each insn as needed.
        !          1100:    Additional register load insns are output before the insn that needs it
        !          1101:    and perhaps store insns after insns that modify the reloaded pseudo reg.
        !          1102: 
        !          1103:    reg_last_reload_reg and reg_reloaded_contents keep track of
        !          1104:    which pseudo-registers are already available in reload registers.
        !          1105:    We update these for the reloads that we perform,
        !          1106:    as the insns are scanned.  */
        !          1107: 
        !          1108: static void
        !          1109: reload_as_needed (first, n_spills, live_known)
        !          1110:      rtx first;
        !          1111:      int n_spills;
        !          1112:      int live_known;
        !          1113: {
        !          1114:   register rtx insn;
        !          1115:   register int i;
        !          1116: 
        !          1117:   /* Often (MEM (REG n)) is still valid even if (REG n) is put on the stack.
        !          1118:      Set spill_indirect_ok if so.  */
        !          1119:   register rtx tem
        !          1120:     = gen_rtx (MEM, SImode,
        !          1121:               gen_rtx (PLUS, Pmode,
        !          1122:                        gen_rtx (REG, Pmode, FRAME_POINTER_REGNUM),
        !          1123:                        gen_rtx (CONST_INT, VOIDmode, 4)));
        !          1124: 
        !          1125:   spill_indirect_ok = memory_address_p (QImode, tem);
        !          1126: 
        !          1127:   bzero (spill_reg_rtx, sizeof spill_reg_rtx);
        !          1128:   reg_last_reload_reg = (rtx *) alloca (max_regno * sizeof (rtx));
        !          1129:   bzero (reg_last_reload_reg, max_regno * sizeof (rtx));
        !          1130:   for (i = 0; i < n_spills; i++)
        !          1131:     reg_reloaded_contents[i] = -1;
        !          1132: 
        !          1133:   for (insn = first; insn;)
        !          1134:     {
        !          1135:       register rtx next = NEXT_INSN (insn);
        !          1136:       if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
        !          1137:          || GET_CODE (insn) == CALL_INSN)
        !          1138:        {
        !          1139:          if (GET_MODE (insn) == VOIDmode)
        !          1140:            n_reloads = 0;
        !          1141:          /* First find the pseudo regs that must be reloaded for this insn.
        !          1142:             This info is returned in the tables reload_... (see reload.h).
        !          1143:             Also modify the body of INSN by substituting RELOAD
        !          1144:             rtx's for those pseudo regs.  */
        !          1145:          else
        !          1146:            find_reloads (insn, 1, spill_indirect_ok, live_known, spill_reg_order);
        !          1147: 
        !          1148:          if (n_reloads > 0)
        !          1149:            {
        !          1150:              /* Now compute which reload regs to reload them into.  Perhaps
        !          1151:                 reusing reload regs from previous insns, or else output
        !          1152:                 load insns to reload them.  Maybe output store insns too.
        !          1153:                 Record the choices of reload reg in reload_reg_rtx.  */
        !          1154:              choose_reload_targets (insn, n_spills);
        !          1155:              /* Substitute the chosen reload regs from reload_reg_rtx
        !          1156:                 into the insn's body (or perhaps into the bodies of other
        !          1157:                 load and store insn that we just made for reloading
        !          1158:                 and that we moved the structure into).  */
        !          1159:              subst_reloads ();
        !          1160:            }
        !          1161:          /* Any previously reloaded spilled pseudo reg, stored in this insn,
        !          1162:             is no longer validly lying around to save a future reload.
        !          1163:             Note that this does not detect pseudos that were reloaded
        !          1164:             for this insn in order to be stored in
        !          1165:             (obeying register constraints).  That is correct; such reload
        !          1166:             registers ARE still valid.  */
        !          1167:          forget_old_reloads (PATTERN (insn));
        !          1168:        }
        !          1169:       /* A reload reg's contents are unknown after a label.  */
        !          1170:       if (GET_CODE (insn) == CODE_LABEL)
        !          1171:        for (i = 0; i < n_spills; i++)
        !          1172:          reg_reloaded_contents[i] = -1;
        !          1173: 
        !          1174:       /* Don't assume a reload reg is still good after a call insn
        !          1175:         if it is a call-used reg.  */
        !          1176:       if (GET_CODE (insn) == CODE_LABEL || GET_CODE (insn) == CALL_INSN)
        !          1177:        for (i = 0; i < n_spills; i++)
        !          1178:          if (call_used_regs[spill_regs[i]])
        !          1179:            reg_reloaded_contents[i] = -1;
        !          1180: 
        !          1181:       insn = next;
        !          1182:     }
        !          1183: }
        !          1184: 
        !          1185: /* If we see a pseudo-reg being stored into,
        !          1186:    don't try to reuse an old reload reg
        !          1187:    which previously contained a copy of it.  */
        !          1188: 
        !          1189: static void
        !          1190: forget_old_reloads (x)
        !          1191:      rtx x;
        !          1192: {
        !          1193:   if (GET_CODE (x) == SET && GET_CODE (SET_DEST (x)) == REG)
        !          1194:     {
        !          1195:       register int regno = REGNO (SET_DEST (x));
        !          1196:       int nr;
        !          1197: 
        !          1198:       if (regno >= FIRST_PSEUDO_REGISTER)
        !          1199:        nr = 1;
        !          1200:       else
        !          1201:        {
        !          1202:          int i;
        !          1203:          nr = HARD_REGNO_NREGS (regno, GET_MODE (SET_DEST (x)));
        !          1204:          /* Storing into a spilled-reg invalidates its contents.
        !          1205:             This can happen if a block-local pseudo is allocated to that reg
        !          1206:             and it wasn't spilled because this block's total need is 0.
        !          1207:             Then some insn might have an optional reload and use this reg.  */
        !          1208:          for (i = 0; i < nr; i++)
        !          1209:            if (spill_reg_order[regno + i] >= 0)
        !          1210:              reg_reloaded_contents[spill_reg_order[regno + i]] = -1;
        !          1211:        }
        !          1212:       
        !          1213:       while (nr-- > 0) reg_last_reload_reg[regno + nr] = 0;
        !          1214:     }
        !          1215:   else if (GET_CODE (x) == PARALLEL)
        !          1216:     {
        !          1217:       register int i;
        !          1218:       for (i = 0; i < XVECLEN (x, 0); i++)
        !          1219:        {
        !          1220:          register rtx y = XVECEXP (x, 0, i);
        !          1221:          if (GET_CODE (y) == SET && GET_CODE (SET_DEST (y)) == REG)
        !          1222:            forget_old_reloads (y);
        !          1223:        }
        !          1224:     }
        !          1225: }
        !          1226: 
        !          1227: /* Comparison function for qsort to decide which of two reloads
        !          1228:    should be handled first.  *P1 and *P2 are the reload numbers.  */
        !          1229: 
        !          1230: static int
        !          1231: reload_reg_class_lower (p1, p2)
        !          1232:      short *p1, *p2;
        !          1233: {
        !          1234:   register int r1 = *p1, r2 = *p2;
        !          1235:   register int t;
        !          1236:   register enum machine_mode mode1, mode2;
        !          1237:   
        !          1238:   /* Consider required reloads before optional ones.  */
        !          1239:   t = reload_optional[r1] - reload_optional[r2];
        !          1240:   if (t != 0)
        !          1241:     return t;
        !          1242:   /* Consider reloads in order of increasing reg-class number.  */
        !          1243:   t = (int) reload_reg_class[r1] - (int) reload_reg_class[r2];
        !          1244:   if (t != 0)
        !          1245:     return t;
        !          1246:   /* For a given reg-class number, consider multi-reg groups first.  */
        !          1247:   mode1 = (reload_inmode[r1] == VOIDmode ? reload_outmode[r1] : reload_inmode[r1]);
        !          1248:   mode2 = (reload_inmode[r2] == VOIDmode ? reload_outmode[r2] : reload_inmode[r2]);
        !          1249:   t = (CLASS_MAX_NREGS (reload_reg_class[r2], mode2)
        !          1250:        - CLASS_MAX_NREGS (reload_reg_class[r1], mode1));
        !          1251:   return t;
        !          1252: }
        !          1253: 
        !          1254: /* Assign hard reg targets for the pseudo-registers we must reload
        !          1255:    into hard regs for this insn.
        !          1256:    Also output the instructions to copy them in and out of the hard regs.
        !          1257: 
        !          1258:    For machines with register classes, we are responsible for
        !          1259:    finding a reload reg in the proper class.  */
        !          1260: 
        !          1261: static void
        !          1262: choose_reload_targets (insn, n_spills)
        !          1263:      rtx insn;
        !          1264:      int n_spills;
        !          1265: {
        !          1266:   register int j;
        !          1267:   char reload_reg_in_use[FIRST_PSEUDO_REGISTER];
        !          1268:   short reload_order[FIRST_PSEUDO_REGISTER];
        !          1269:   char reload_inherited[FIRST_PSEUDO_REGISTER];
        !          1270:   /* Elt N nonzero if reg_last_reload_reg[N] has been set in this insn
        !          1271:      for an output reload that stores into reg N.  */
        !          1272:   char *reg_has_output_reload;
        !          1273:   int have_groups = 0;
        !          1274: 
        !          1275:   /* For each reload, the index in spill_regs of the spill register used,
        !          1276:      or -1 if we did not need one of the spill registers for this reload.  */
        !          1277:   int reload_spill_index[FIRST_PSEUDO_REGISTER];
        !          1278: 
        !          1279:   bzero (reload_inherited, FIRST_PSEUDO_REGISTER);
        !          1280:   bzero (reload_reg_in_use, FIRST_PSEUDO_REGISTER);
        !          1281: 
        !          1282:   reg_has_output_reload = (char *) alloca (max_regno);
        !          1283:   bzero (reg_has_output_reload, max_regno);
        !          1284: 
        !          1285:   /* In order to be certain of getting the registers we need,
        !          1286:      we must sort the reloads into order of increasing register class.
        !          1287:      Then our grabbing of reload registers will parallel the process
        !          1288:      that provided the reload registers.  */
        !          1289: 
        !          1290:   /* Also note whether any of the reloads wants a consecutive group of regs.
        !          1291:      When that happens, we must when processing the non-group reloads
        !          1292:      avoid (when possible) using a reload reg that would break up a group.  */
        !          1293: 
        !          1294:   /* This used to look for an existing reloaded home for all
        !          1295:      of the reloads, and only then perform any new reloads.
        !          1296:      But that could lose if the reloads were done out of reg-class order
        !          1297:      because a later reload with a looser constraint might have an old
        !          1298:      home in a register needed by an earlier reload with a tighter constraint.
        !          1299:      It would be possible with even hairier code to detect such cases
        !          1300:      and handle them, but it doesn't seem worth while yet.  */
        !          1301: 
        !          1302:   for (j = 0; j < n_reloads; j++)
        !          1303:     {
        !          1304:       enum machine_mode mode;
        !          1305:       reload_order[j] = j;
        !          1306:       reload_spill_index[j] = -1;
        !          1307:       mode = (reload_inmode[j] == VOIDmode ? reload_outmode[j] : reload_inmode[j]);
        !          1308:       if (CLASS_MAX_NREGS (reload_reg_class[j], mode) > 1)
        !          1309:        have_groups = 1;
        !          1310:     }
        !          1311: 
        !          1312:   if (n_reloads > 1)
        !          1313:     qsort (reload_order, n_reloads, sizeof (short), reload_reg_class_lower);
        !          1314: 
        !          1315:   for (j = 0; j < n_reloads; j++)
        !          1316:     {
        !          1317:       register int r = reload_order[j];
        !          1318:       register int i;
        !          1319:       register rtx new;
        !          1320:       enum machine_mode reload_mode = reload_inmode[r];
        !          1321: 
        !          1322:       if (GET_MODE_SIZE (reload_outmode[r]) > GET_MODE_SIZE (reload_mode))
        !          1323:        reload_mode = reload_outmode[r];
        !          1324:       if (reload_strict_low[r])
        !          1325:        reload_mode = GET_MODE (SUBREG_REG (reload_out[r]));
        !          1326: 
        !          1327:       /* Ignore reloads that got marked inoperative.  */
        !          1328:       if (reload_out[r] == 0 && reload_in[r] == 0)
        !          1329:        continue;
        !          1330: 
        !          1331:       /* No need to find a reload-register if find_reloads chose one.  */
        !          1332: 
        !          1333:       if (reload_reg_rtx[r] != 0)
        !          1334:        {
        !          1335: #if 0
        !          1336:          /* But do see if the chosen reload-reg already contains
        !          1337:             a copy of the desired value.  */
        !          1338:          if (reload_in[r] != 0)
        !          1339:            {
        !          1340:              register rtx equiv
        !          1341:                = find_equiv_reg (reload_in[r], insn, 0,
        !          1342:                                  REGNO (reload_reg_rtx[r]), 0, 0);
        !          1343:              if (equiv != 0)
        !          1344:                reload_inherited[r] = 1;
        !          1345:            }
        !          1346: #endif
        !          1347:          continue;
        !          1348:        }
        !          1349: 
        !          1350:       /* First see if this pseudo is already available as reloaded
        !          1351:         for a previous insn.
        !          1352:         This feature is disabled for multi-register groups
        !          1353:         because we haven't yet any way to tell whether the entire
        !          1354:         value is properly preserved.
        !          1355:         It is also disabled when there are other reloads for mult-register
        !          1356:         groups, lest the inherited reload reg break up a needed group.  */
        !          1357: 
        !          1358:       {
        !          1359:        register int regno = -1;
        !          1360: 
        !          1361:        if (reload_in[r] == 0)
        !          1362:          ;
        !          1363:        else if (GET_CODE (reload_in[r]) == REG)
        !          1364:          regno = REGNO (reload_in[r]);
        !          1365: #if 0
        !          1366:        /* This won't work, since REGNO can be a pseudo reg number.
        !          1367:           Also, it takes much more hair to keep track of all the things
        !          1368:           that can invalidate an inherited reload of part of a pseudoreg.  */
        !          1369:        else if (GET_CODE (reload_in[r]) == SUBREG
        !          1370:                 && GET_CODE (SUBREG_REG (reload_in[r])) == REG)
        !          1371:          regno = REGNO (SUBREG_REG (reload_in[r])) + SUBREG_WORD (reload_in[r]);
        !          1372: #endif
        !          1373: 
        !          1374:        if (regno >= 0
        !          1375:            && GET_MODE_SIZE (reload_mode) <= UNITS_PER_WORD
        !          1376:            && reg_last_reload_reg[regno] != 0
        !          1377:            && ! have_groups)
        !          1378:          {
        !          1379:            i = spill_reg_order[REGNO (reg_last_reload_reg[regno])];
        !          1380: 
        !          1381:            if (reg_reloaded_contents[i] == regno
        !          1382:                && TEST_HARD_REG_BIT (reg_class_contents[(int) reload_reg_class[r]],
        !          1383:                                      spill_regs[i])
        !          1384:                && ! reload_reg_in_use[spill_regs[i]])
        !          1385:              {
        !          1386:                /* Mark the reload register as in use for this insn.  */
        !          1387:                reload_reg_rtx[r] = reg_last_reload_reg[regno];
        !          1388:                reload_reg_in_use[spill_regs[i]] = 1;
        !          1389:                reload_inherited[r] = 1;
        !          1390:                reload_spill_index[r] = i;
        !          1391:              }
        !          1392:          }
        !          1393:       }
        !          1394: 
        !          1395:       /* If this is not a pseudo, here's a different way to see
        !          1396:         if it is already lying around.  */
        !          1397:       if (reload_in[r] != 0
        !          1398:          && reload_out[r] == 0
        !          1399:          && (CONSTANT_P (reload_in[r])
        !          1400:              || GET_CODE (reload_in[r]) == PLUS
        !          1401:              || GET_CODE (reload_in[r]) == MEM)
        !          1402:          && ! have_groups)
        !          1403:        {
        !          1404:          register rtx equiv
        !          1405:            = find_equiv_reg (reload_in[r], insn, reload_reg_class[r],
        !          1406:                              -1, (short *)1, 0);
        !          1407:          /* If we found an equivalent reg, say no code need be generated
        !          1408:             to load it, and use it as our reload reg.  */
        !          1409:          if (equiv != 0
        !          1410:              && REGNO (equiv) != FRAME_POINTER_REGNUM)
        !          1411:            {
        !          1412:              reload_reg_rtx[r] = equiv;
        !          1413:              reload_inherited[r] = 1;
        !          1414:              /* If it is a spill reg,
        !          1415:                 mark the spill reg as in use for this insn.  */
        !          1416:              i = spill_reg_order[REGNO (equiv)];
        !          1417:              if (i >= 0)
        !          1418:                {
        !          1419:                  int nr = HARD_REGNO_NREGS (spill_regs[i], reload_mode);
        !          1420:                  while (nr > 0)
        !          1421:                    reload_reg_in_use[REGNO (equiv) + --nr] = 1;
        !          1422:                }
        !          1423:            }
        !          1424:        }
        !          1425: 
        !          1426:       /* If it isn't lying around, and isn't optional,
        !          1427:         find a place to reload it into.  */
        !          1428:       if (reload_reg_rtx[r] != 0 || reload_optional[r] != 0)
        !          1429:        continue;
        !          1430: 
        !          1431:       /* Value not lying around; find a register to reload it into.
        !          1432:         Here I is not a regno, it is an index into spill_regs.  */
        !          1433:       i = n_spills;
        !          1434: 
        !          1435:       /* If we want just one reg, and other reloads want groups,
        !          1436:         first try to find a reg that can't be part of a group.  */
        !          1437:       if (have_groups && HARD_REGNO_NREGS (spill_regs[i], reload_mode) == 1)
        !          1438:        for (i = 0; i < n_spills; i++)
        !          1439:          {
        !          1440:            int regno = spill_regs[i];
        !          1441:            int class = (int) reload_reg_class[r];
        !          1442:            if (reload_reg_in_use[regno] == 0
        !          1443:                && TEST_HARD_REG_BIT (reg_class_contents[class],
        !          1444:                                      regno)
        !          1445:                && !(regno + 1 < FIRST_PSEUDO_REGISTER
        !          1446:                     && spill_reg_order[regno + 1] >= 0
        !          1447:                     && reload_reg_in_use[regno + 1] == 0
        !          1448:                     && TEST_HARD_REG_BIT (reg_class_contents[class],
        !          1449:                                           regno - 1))
        !          1450:                && !(regno > 0
        !          1451:                     && spill_reg_order[regno - 1] >= 0
        !          1452:                     && reload_reg_in_use[regno - 1] == 0
        !          1453:                     && TEST_HARD_REG_BIT (reg_class_contents[class],
        !          1454:                                           regno - 1)))
        !          1455:              break;
        !          1456:          }
        !          1457: 
        !          1458:       /* If that didn't work, try to find a register that has only one
        !          1459:         neighbor that could make a group with it.  That way, if the
        !          1460:         available registers are three consecutive ones, we avoid taking
        !          1461:         the middle one (which would leave us with no possible groups).  */
        !          1462: 
        !          1463:       if (have_groups && HARD_REGNO_NREGS (spill_regs[i], reload_mode) == 1
        !          1464:          && i == n_spills)
        !          1465:        for (i = 0; i < n_spills; i++)
        !          1466:          {
        !          1467:            int regno = spill_regs[i];
        !          1468:            int class = (int) reload_reg_class[r];
        !          1469:            if (reload_reg_in_use[regno] == 0
        !          1470:                && TEST_HARD_REG_BIT (reg_class_contents[class],
        !          1471:                                      regno)
        !          1472:                && (!(regno + 1 < FIRST_PSEUDO_REGISTER
        !          1473:                      && spill_reg_order[regno + 1] >= 0
        !          1474:                      && reload_reg_in_use[regno + 1] == 0
        !          1475:                      && TEST_HARD_REG_BIT (reg_class_contents[class],
        !          1476:                                            regno - 1))
        !          1477:                    || !(regno > 0
        !          1478:                         && spill_reg_order[regno - 1] >= 0
        !          1479:                         && reload_reg_in_use[regno - 1] == 0
        !          1480:                         && TEST_HARD_REG_BIT (reg_class_contents[class],
        !          1481:                                               regno - 1))))
        !          1482:              break;
        !          1483:          }
        !          1484: 
        !          1485:       /* Now, if we want a single register and haven't yet found one,
        !          1486:         take any reg in the right class and not in use.
        !          1487:         If we want a consecutive group, here is where we look for it.  */
        !          1488:       if (i == n_spills)
        !          1489:        for (i = 0; i < n_spills; i++)
        !          1490:          {
        !          1491:            int class = (int) reload_reg_class[r];
        !          1492:            if (reload_reg_in_use[spill_regs[i]] == 0
        !          1493:                && TEST_HARD_REG_BIT (reg_class_contents[class],
        !          1494:                                      spill_regs[i]))
        !          1495:              {
        !          1496:                int nr = HARD_REGNO_NREGS (spill_regs[i], reload_mode);
        !          1497:                /* If we need only one reg, we have already won.  */
        !          1498:                if (nr == 1)
        !          1499:                  break;
        !          1500:                /* Otherwise check that as many consecutive regs as we need
        !          1501:                   are available here.  */
        !          1502:                if (HARD_REGNO_MODE_OK (spill_regs[i], reload_mode))
        !          1503:                  while (nr > 1)
        !          1504:                    {
        !          1505:                      if (!(TEST_HARD_REG_BIT (reg_class_contents[class],
        !          1506:                                               spill_regs[i] + nr - 1)
        !          1507:                            && spill_reg_order[spill_regs[i] + nr - 1] >= 0
        !          1508:                            && reload_reg_in_use[spill_regs[i] + nr - 1] == 0))
        !          1509:                        break;
        !          1510:                      nr--;
        !          1511:                    }
        !          1512:                if (nr == 1)
        !          1513:                  break;
        !          1514:              }
        !          1515:          }
        !          1516: 
        !          1517:       /* We should have found a spill register by now.  */
        !          1518:       if (i == n_spills)
        !          1519:        abort ();
        !          1520: 
        !          1521:       /* Mark as in use for this insn the reload regs we use for this.  */
        !          1522:       {
        !          1523:        int nr = HARD_REGNO_NREGS (spill_regs[i], reload_mode);
        !          1524:        while (nr > 0)
        !          1525:          reload_reg_in_use[spill_regs[i] + --nr] = 1;
        !          1526:       }
        !          1527: 
        !          1528:       new = spill_reg_rtx[i];
        !          1529: 
        !          1530:       if (new == 0 || GET_MODE (new) != reload_mode)
        !          1531:        spill_reg_rtx[i] = new = gen_rtx (REG, reload_mode, spill_regs[i]);
        !          1532: 
        !          1533:       reload_reg_rtx[r] = new;
        !          1534:       reload_spill_index[r] = i;
        !          1535:       reg_reloaded_contents[i] = -1;
        !          1536: 
        !          1537:       /* Detect when the reload reg can't hold the reload mode.  */
        !          1538:       if (! HARD_REGNO_MODE_OK (REGNO (reload_reg_rtx[r]), reload_mode))
        !          1539:        {
        !          1540:          if (! asm_noperands (PATTERN (insn)))
        !          1541:            /* It's the compiler's fault.  */
        !          1542:            abort ();
        !          1543:          /* It's the user's fault; the operand's mode and constraint
        !          1544:             don't match.  Disable this reload so we don't crash in final.
        !          1545:             Maybe we should print an error message too??  */
        !          1546:          reload_in[r] = 0;
        !          1547:          reload_out[r] = 0;
        !          1548:          reload_reg_rtx[r] = 0;
        !          1549:          reload_optional[r] = 1;
        !          1550:        }
        !          1551:     }
        !          1552: 
        !          1553:   /* For all the spill regs newly reloaded in this instruction,
        !          1554:      record what they were reloaded from, so subsequent instructions
        !          1555:      can inherit the reloads.  */
        !          1556: 
        !          1557:   for (j = 0; j < n_reloads; j++)
        !          1558:     {
        !          1559:       register int r = reload_order[j];
        !          1560:       register int i = reload_spill_index[r];
        !          1561: 
        !          1562:       /* I is nonneg if this reload used one of the spill regs.
        !          1563:         If reload_reg_rtx[r] is 0, this is an optional reload
        !          1564:         that we opted to ignore.  */
        !          1565:       if (i >= 0 && reload_reg_rtx[r] != 0)
        !          1566:        {
        !          1567:          /* Maybe the spill reg contains a copy of reload_out.  */
        !          1568:          if (reload_out[r] != 0 && GET_CODE (reload_out[r]) == REG)
        !          1569:            {
        !          1570:              register int nregno = REGNO (reload_out[r]);
        !          1571:              reg_last_reload_reg[nregno] = reload_reg_rtx[r];
        !          1572:              reg_reloaded_contents[i] = nregno;
        !          1573:              reg_has_output_reload[nregno] = 1;
        !          1574:            }
        !          1575:          /* Maybe the spill reg contains a copy of reload_in.  */
        !          1576:          else if (reload_out[r] == 0 && GET_CODE (reload_in[r]) == REG)
        !          1577:            {
        !          1578:              register int nregno = REGNO (reload_in[r]);
        !          1579:              /* If there are two separate reloads (one in and one out)
        !          1580:                 for the same (hard or pseudo) reg, set reg_last_reload_reg
        !          1581:                 based on the output reload.  */
        !          1582:              if (!reg_has_output_reload[nregno])
        !          1583:                {
        !          1584:                  reg_last_reload_reg[nregno] = reload_reg_rtx[r];
        !          1585:                  reg_reloaded_contents[i] = nregno;
        !          1586:                }
        !          1587:            }
        !          1588:          /* Otherwise, the spill reg doesn't contain a copy of any reg.
        !          1589:             Clear out its records, lest it be taken for a copy
        !          1590:             of reload_in when that is no longer true.  */
        !          1591:          else
        !          1592:            reg_reloaded_contents[i] = -1;
        !          1593:        }
        !          1594:     }
        !          1595: 
        !          1596:   /* Now output the instructions to copy the data into and out of the
        !          1597:      reload registers.  Do these in the order that the reloads were reported,
        !          1598:      since reloads of base and index registers precede reloads of operands
        !          1599:      and the operands may need the base and index registers reloaded.  */
        !          1600: 
        !          1601:   for (j = 0; j < n_reloads; j++)
        !          1602:     {
        !          1603:       register rtx old;
        !          1604:       rtx store_insn;
        !          1605: 
        !          1606:       old = reload_in[j];
        !          1607:       if (old != 0 && ! reload_inherited[j]
        !          1608:          && reload_reg_rtx[j] != old
        !          1609:          && reload_reg_rtx[j] != 0)
        !          1610:        {
        !          1611:          register rtx reloadreg = reload_reg_rtx[j];
        !          1612:          rtx oldequiv = 0;
        !          1613:          enum machine_mode mode;
        !          1614: 
        !          1615:          /* Strip off of OLD any size-increasing SUBREGs such as
        !          1616:             (SUBREG:SI foo:QI 0).  */
        !          1617: 
        !          1618:          while (GET_CODE (old) == SUBREG && SUBREG_WORD (old) == 0
        !          1619:                 && (GET_MODE_SIZE (GET_MODE (old))
        !          1620:                     > GET_MODE_SIZE (GET_MODE (SUBREG_REG (old)))))
        !          1621:            old = SUBREG_REG (old);
        !          1622: 
        !          1623:          /* If reloading from memory, see if there is a register
        !          1624:             that already holds the same value.  If so, reload from there.
        !          1625:             We can pass 0 as the reload_reg_p argument because
        !          1626:             any other reload has either already been emitted,
        !          1627:             in which case find_equiv_reg will see the reload-insn,
        !          1628:             or has yet to be emitted, in which case it doesn't matter
        !          1629:             because we will use this equiv reg right away.  */
        !          1630: 
        !          1631:          if (GET_CODE (old) == MEM
        !          1632:              || (GET_CODE (old) == REG
        !          1633:                  && REGNO (old) >= FIRST_PSEUDO_REGISTER
        !          1634:                  && reg_renumber[REGNO (old)] < 0))
        !          1635:            oldequiv = find_equiv_reg (old, insn, GENERAL_REGS, -1, 0, 0);
        !          1636: 
        !          1637:          if (oldequiv == 0)
        !          1638:            oldequiv = old;
        !          1639: 
        !          1640:          /* Determine the mode to reload in.
        !          1641:             This is very tricky because we have three to choose from.
        !          1642:             There is the mode the insn operand wants (reload_inmode[J]).
        !          1643:             There is the mode of the reload register RELOADREG.
        !          1644:             There is the intrinsic mode of the operand, revealed now
        !          1645:             in OLD because we have stripped SUBREGs.
        !          1646:             It turns out that RELOADREG's mode is irrelevant:
        !          1647:             we can change that arbitrarily.
        !          1648: 
        !          1649:             Neither of the other two is always right.  For example, consider
        !          1650:             (SUBREG:SI foo:QI)) appearing as an operand that must be SImode;
        !          1651:             then suppose foo is in memory.  This must be loaded in QImode
        !          1652:             because we cannot fetch a byte as a word.  In this case OLD's
        !          1653:             mode is correct.
        !          1654: 
        !          1655:             Then consider a one-word union which has SImode and one of its
        !          1656:             members is a float, being fetched as (SUBREG:SF union:SI).
        !          1657:             We must fetch that as SFmode because we could be loading into
        !          1658:             a float-only register.  In this case OLD's mode is also correct.
        !          1659: 
        !          1660:             Consider an immediate integer: it has VOIDmode.  Here we need
        !          1661:             to get a mode from something else.
        !          1662: 
        !          1663:             In some cases, there is a fourth mode, the operand's
        !          1664:             containing mode.  If the insn specifies a containing mode for
        !          1665:             this operand, it overrides all others.
        !          1666: 
        !          1667:             I am not sure whether the algorithm here is always right,
        !          1668:             but it does the right things in those cases.  */
        !          1669: 
        !          1670:          mode = GET_MODE (old);
        !          1671:          if (mode == VOIDmode)
        !          1672:            mode = reload_inmode[j];
        !          1673:          if (reload_strict_low[j])
        !          1674:            mode = GET_MODE (SUBREG_REG (reload_in[j]));
        !          1675: 
        !          1676:          /* Encapsulate both RELOADREG and OLDEQUIV into that mode,
        !          1677:             then load RELOADREG from OLDEQUIV.  */
        !          1678: 
        !          1679:          if (GET_MODE (reloadreg) != mode)
        !          1680:            reloadreg = gen_rtx (SUBREG, mode, reloadreg, 0);
        !          1681:          if (GET_MODE (oldequiv) != VOIDmode
        !          1682:              && mode != GET_MODE (oldequiv))
        !          1683:            oldequiv = gen_rtx (SUBREG, mode, oldequiv, 0);
        !          1684: 
        !          1685:          /* If we are reloading a pseudo-register that was set by the previous
        !          1686:             insn, see if we can get rid of that pseudo-register entirely
        !          1687:             by redirecting the previous insn into our reload register.  */
        !          1688: 
        !          1689:          if (optimize && GET_CODE (old) == REG
        !          1690:              && REGNO (old) >= FIRST_PSEUDO_REGISTER
        !          1691:              && PREV_INSN (insn) && GET_CODE (PREV_INSN (insn)) == INSN
        !          1692:              && GET_CODE (PATTERN (PREV_INSN (insn))) == SET
        !          1693:              && SET_DEST (PATTERN (PREV_INSN (insn))) == old
        !          1694:              && dead_or_set_p (insn, old)
        !          1695:              && reg_n_deaths[REGNO (old)] == 1
        !          1696:              && reg_n_sets[REGNO (old)] == 1)
        !          1697:            {
        !          1698:              /* For the debugging info,
        !          1699:                 say the pseudo lives in this reload reg.  */
        !          1700:              reg_renumber[REGNO (old)] = REGNO (reload_reg_rtx[j]);
        !          1701:              alter_reg (REGNO (old));
        !          1702:              /* Store into the reload register instead of the pseudo.  */
        !          1703:              SET_DEST (PATTERN (PREV_INSN (insn))) = reloadreg;
        !          1704:            }
        !          1705:          else
        !          1706:            /* We can't do that, so output an insn to load RELOADREG.  */
        !          1707:            emit_insn_before (gen_move_insn (reloadreg, oldequiv), insn);
        !          1708: 
        !          1709:          /* If this reload wants reload_in[j] incremented by a constant,
        !          1710:             output code to get this done before the insn reloaded for.  */
        !          1711: 
        !          1712:          if (reload_inc[j] != 0)
        !          1713:            {
        !          1714:              /* If reload_in[j] is a register, assume we can
        !          1715:                 output an insn to increment it directly.  */
        !          1716:              if (GET_CODE (old) == REG &&
        !          1717:                  (REGNO (old) < FIRST_PSEUDO_REGISTER
        !          1718:                   || reg_renumber[REGNO (old)] >= 0))
        !          1719:                emit_insn_before (gen_add2_insn (old,
        !          1720:                                                 gen_rtx (CONST_INT, VOIDmode,
        !          1721:                                                          reload_inc[j])),
        !          1722:                                  insn);
        !          1723:              else
        !          1724:                /* Else we must not assume we can increment reload_in[j]
        !          1725:                   (even though on many target machines we can);
        !          1726:                   increment the copy in the reload register,
        !          1727:                   save that back, then decrement the reload register
        !          1728:                   so it has its original contents.  */
        !          1729:                {
        !          1730:                  emit_insn_before (gen_add2_insn (reloadreg,
        !          1731:                                                   gen_rtx (CONST_INT, VOIDmode,
        !          1732:                                                            reload_inc[j])),
        !          1733:                                    insn);
        !          1734:                  emit_insn_before (gen_move_insn (oldequiv, reloadreg), insn);
        !          1735:                  emit_insn_before (gen_sub2_insn (reloadreg,
        !          1736:                                                   gen_rtx (CONST_INT, VOIDmode,
        !          1737:                                                            reload_inc[j])),
        !          1738:                                    insn);
        !          1739:                }
        !          1740:            }
        !          1741:        }
        !          1742: 
        !          1743:       /* If we are reloading a register that was recently stored in with an
        !          1744:         output-reload, see if we can prove there was
        !          1745:         actually no need to store the old value in it.  */
        !          1746: 
        !          1747:       if (optimize && reload_inherited[j] && reload_spill_index[j] >= 0
        !          1748:          && GET_CODE (reload_in[j]) == REG
        !          1749:          && spill_reg_store[reload_spill_index[j]] != 0
        !          1750:          && dead_or_set_p (insn, reload_in[j]))
        !          1751:        {
        !          1752:          register rtx i1;
        !          1753:          /* If the pseudo-reg we are reloading is no longer referenced
        !          1754:             anywhere between the store into it and here,
        !          1755:             and no jumps or labels intervene, then the value can get
        !          1756:             here through the reload reg alone.  */
        !          1757:          for (i1 = NEXT_INSN (spill_reg_store[reload_spill_index[j]]);
        !          1758:               i1 != insn; i1 = NEXT_INSN (i1))
        !          1759:            {
        !          1760:              if (GET_CODE (i1) == CODE_LABEL || GET_CODE (i1) == JUMP_INSN)
        !          1761:                break;
        !          1762:              if ((GET_CODE (i1) == INSN || GET_CODE (i1) == CALL_INSN)
        !          1763:                  && reg_mentioned_p (reload_in[j], PATTERN (i1)))
        !          1764:                break;
        !          1765:            }
        !          1766:          if (i1 == insn)
        !          1767:            {
        !          1768:              /* If this insn will store in the pseudo again,
        !          1769:                 the previous store can be removed.  */
        !          1770:              if (reload_out[j] == reload_in[j])
        !          1771:                delete_insn (spill_reg_store[reload_spill_index[j]]);
        !          1772: 
        !          1773:              /* See if the pseudo reg has been completely replaced
        !          1774:                 with reload regs.  If so, delete the store insn
        !          1775:                 and forget we had a stack slot for the pseudo.  */
        !          1776:              if (reg_n_deaths[REGNO (reload_in[j])] == 1
        !          1777:                  && reg_basic_block[REGNO (reload_in[j])] >= 0)
        !          1778:                {
        !          1779:                  /* We know that it was used only between here
        !          1780:                     and the beginning of the current basic block.
        !          1781:                     Search that range; see if any ref remains.  */
        !          1782:                  for (i1 = PREV_INSN (insn); i1; i1 = PREV_INSN (i1))
        !          1783:                    {
        !          1784:                      if (GET_CODE (i1) == CODE_LABEL
        !          1785:                          || GET_CODE (i1) == JUMP_INSN)
        !          1786:                        break;
        !          1787:                      if ((GET_CODE (i1) == INSN || GET_CODE (i1) == CALL_INSN)
        !          1788:                          && reg_mentioned_p (reload_in[j], PATTERN (i1)))
        !          1789:                        goto still_used;
        !          1790:                    }
        !          1791:                  /* For the debugging info,
        !          1792:                     say the pseudo lives in this reload reg.  */
        !          1793:                  reg_renumber[REGNO (old)] = REGNO (reload_reg_rtx[j]);
        !          1794:                  alter_reg (REGNO (old));
        !          1795:                  delete_insn (spill_reg_store[reload_spill_index[j]]);
        !          1796:                still_used: ;
        !          1797:                }
        !          1798:            }
        !          1799:        }
        !          1800: 
        !          1801:       /* Input-reloading is done.  Now do output-reloading,
        !          1802:         storing the value from the reload-register after the main insn
        !          1803:         if reload_out[j] is nonzero.  */
        !          1804:       old = reload_out[j];
        !          1805:       if (old != 0
        !          1806:          && reload_reg_rtx[j] != old
        !          1807:          && reload_reg_rtx[j] != 0)
        !          1808:        {
        !          1809:          register rtx reloadreg = reload_reg_rtx[j];
        !          1810:          enum machine_mode mode;
        !          1811: 
        !          1812:          /* Strip off of OLD any size-increasing SUBREGs such as
        !          1813:             (SUBREG:SI foo:QI 0).  */
        !          1814: 
        !          1815:          while (GET_CODE (old) == SUBREG && SUBREG_WORD (old) == 0
        !          1816:                 && (GET_MODE_SIZE (GET_MODE (old))
        !          1817:                     > GET_MODE_SIZE (GET_MODE (SUBREG_REG (old)))))
        !          1818:            old = SUBREG_REG (old);
        !          1819: 
        !          1820:          /* Determine the mode to reload in.
        !          1821:             See comments above (for input reloading).  */
        !          1822: 
        !          1823:          mode = GET_MODE (old);
        !          1824:          if (mode == VOIDmode)
        !          1825:            abort ();           /* Should never happen for an output.  */
        !          1826: #if 0
        !          1827:            mode = reload_inmode[j];
        !          1828: #endif
        !          1829:          if (reload_strict_low[j])
        !          1830:            mode = GET_MODE (SUBREG_REG (reload_out[j]));
        !          1831: 
        !          1832:          /* Encapsulate both RELOADREG and OLD into that mode,
        !          1833:             then load RELOADREG from OLD.  */
        !          1834:          if (GET_MODE (reloadreg) != mode)
        !          1835:            reloadreg = gen_rtx (SUBREG, mode, reloadreg, 0);
        !          1836:          if (GET_MODE (old) != VOIDmode
        !          1837:              && mode != GET_MODE (old))
        !          1838:            old = gen_rtx (SUBREG, mode, old, 0);
        !          1839:          store_insn = emit_insn_after (gen_move_insn (old, reloadreg), insn);
        !          1840:        }
        !          1841:       else store_insn = 0;
        !          1842: 
        !          1843:       if (reload_spill_index[j] >= 0)
        !          1844:        spill_reg_store[reload_spill_index[j]] = store_insn;
        !          1845:     }
        !          1846: }

unix.superglobalmegacorp.com

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