Annotation of researchv10dc/cmd/gcc/reload1.c, revision 1.1.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.