Annotation of gcc/unroll.c, revision 1.1.1.3

1.1       root        1: /* Try to unroll loops, and split induction variables.
                      2:    Copyright (C) 1992 Free Software Foundation, Inc.
                      3:    Contributed by James E. Wilson, Cygnus Support/UC Berkeley.
                      4: 
                      5: This file is part of GNU CC.
                      6: 
                      7: GNU CC is free software; you can redistribute it and/or modify
                      8: it under the terms of the GNU General Public License as published by
                      9: the Free Software Foundation; either version 2, or (at your option)
                     10: any later version.
                     11: 
                     12: GNU CC is distributed in the hope that it will be useful,
                     13: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15: GNU General Public License for more details.
                     16: 
                     17: You should have received a copy of the GNU General Public License
                     18: along with GNU CC; see the file COPYING.  If not, write to
                     19: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     20: 
                     21: /* Try to unroll a loop, and split induction variables.
                     22: 
                     23:    Loops for which the number of iterations can be calculated exactly are
                     24:    handled specially.  If the number of iterations times the insn_count is
                     25:    less than MAX_UNROLLED_INSNS, then the loop is unrolled completely.
                     26:    Otherwise, we try to unroll the loop a number of times modulo the number
                     27:    of iterations, so that only one exit test will be needed.  It is unrolled
                     28:    a number of times approximately equal to MAX_UNROLLED_INSNS divided by
                     29:    the insn count.
                     30: 
                     31:    Otherwise, if the number of iterations can be calculated exactly at
                     32:    run time, and the loop is always entered at the top, then we try to
                     33:    precondition the loop.  That is, at run time, calculate how many times
                     34:    the loop will execute, and then execute the loop body a few times so
                     35:    that the remaining iterations will be some multiple of 4 (or 2 if the
                     36:    loop is large).  Then fall through to a loop unrolled 4 (or 2) times,
                     37:    with only one exit test needed at the end of the loop.
                     38: 
                     39:    Otherwise, if the number of iterations can not be calculated exactly,
                     40:    not even at run time, then we still unroll the loop a number of times
                     41:    approximately equal to MAX_UNROLLED_INSNS divided by the insn count,
                     42:    but there must be an exit test after each copy of the loop body.
                     43: 
                     44:    For each induction variable, which is dead outside the loop (replaceable)
                     45:    or for which we can easily calculate the final value, if we can easily
                     46:    calculate its value at each place where it is set as a function of the
                     47:    current loop unroll count and the variable's value at loop entry, then
                     48:    the induction variable is split into `N' different variables, one for
                     49:    each copy of the loop body.  One variable is live across the backward
                     50:    branch, and the others are all calculated as a function of this variable.
                     51:    This helps eliminate data dependencies, and leads to further opportunities
                     52:    for cse.  */
                     53: 
                     54: /* Possible improvements follow:  */
                     55: 
                     56: /* ??? Add an extra pass somewhere to determine whether unrolling will
                     57:    give any benefit.  E.g. after generating all unrolled insns, compute the
                     58:    cost of all insns and compare against cost of insns in rolled loop.
                     59: 
                     60:    - On traditional architectures, unrolling a non-constant bound loop
                     61:      is a win if there is a giv whose only use is in memory addresses, the
1.1.1.3 ! root       62:      memory addresses can be split, and hence giv increments can be
1.1       root       63:      eliminated.
                     64:    - It is also a win if the loop is executed many times, and preconditioning
                     65:      can be performed for the loop.
                     66:    Add code to check for these and similar cases.  */
                     67: 
                     68: /* ??? Improve control of which loops get unrolled.  Could use profiling
                     69:    info to only unroll the most commonly executed loops.  Perhaps have
                     70:    a user specifyable option to control the amount of code expansion,
                     71:    or the percent of loops to consider for unrolling.  Etc.  */
                     72: 
                     73: /* ??? Look at the register copies inside the loop to see if they form a
                     74:    simple permutation.  If so, iterate the permutation until it gets back to
                     75:    the start state.  This is how many times we should unroll the loop, for
                     76:    best results, because then all register copies can be eliminated.
                     77:    For example, the lisp nreverse function should be unrolled 3 times
                     78:    while (this)
                     79:      {
                     80:        next = this->cdr;
                     81:        this->cdr = prev;
                     82:        prev = this;
                     83:        this = next;
                     84:      }
                     85: 
                     86:    ??? The number of times to unroll the loop may also be based on data
                     87:    references in the loop.  For example, if we have a loop that references
                     88:    x[i-1], x[i], and x[i+1], we should unroll it a multiple of 3 times.  */
                     89: 
                     90: /* ??? Add some simple linear equation solving capability so that we can
                     91:    determine the number of loop iterations for more complex loops.
                     92:    For example, consider this loop from gdb
                     93:    #define SWAP_TARGET_AND_HOST(buffer,len)
                     94:      {
                     95:        char tmp;
                     96:        char *p = (char *) buffer;
                     97:        char *q = ((char *) buffer) + len - 1;
                     98:        int iterations = (len + 1) >> 1;
                     99:        int i;
                    100:        for (p; p < q; p++, q--;)
                    101:          {
                    102:            tmp = *q;
                    103:            *q = *p;
                    104:            *p = tmp;
                    105:          }
                    106:      }
                    107:    Note that:
                    108:      start value = p = &buffer + current_iteration
                    109:      end value   = q = &buffer + len - 1 - current_iteration
                    110:    Given the loop exit test of "p < q", then there must be "q - p" iterations,
                    111:    set equal to zero and solve for number of iterations:
                    112:      q - p = len - 1 - 2*current_iteration = 0
                    113:      current_iteration = (len - 1) / 2
                    114:    Hence, there are (len - 1) / 2 (rounded up to the nearest integer)
                    115:    iterations of this loop.  */
                    116: 
                    117: /* ??? Currently, no labels are marked as loop invariant when doing loop
                    118:    unrolling.  This is because an insn inside the loop, that loads the address
                    119:    of a label inside the loop into a register, could be moved outside the loop
                    120:    by the invariant code motion pass if labels were invariant.  If the loop
                    121:    is subsequently unrolled, the code will be wrong because each unrolled
                    122:    body of the loop will use the same address, whereas each actually needs a
                    123:    different address.  A case where this happens is when a loop containing
                    124:    a switch statement is unrolled.
                    125: 
                    126:    It would be better to let labels be considered invariant.  When we
                    127:    unroll loops here, check to see if any insns using a label local to the
                    128:    loop were moved before the loop.  If so, then correct the problem, by
                    129:    moving the insn back into the loop, or perhaps replicate the insn before
                    130:    the loop, one copy for each time the loop is unrolled.  */
                    131: 
                    132: /* The prime factors looked for when trying to unroll a loop by some
                    133:    number which is modulo the total number of iterations.  Just checking
                    134:    for these 4 prime factors will find at least one factor for 75% of
                    135:    all numbers theoretically.  Practically speaking, this will succeed
                    136:    almost all of the time since loops are generally a multiple of 2
                    137:    and/or 5.  */
                    138: 
                    139: #define NUM_FACTORS 4
                    140: 
                    141: struct _factor { int factor, count; } factors[NUM_FACTORS]
                    142:   = { {2, 0}, {3, 0}, {5, 0}, {7, 0}};
                    143:       
                    144: /* Describes the different types of loop unrolling performed.  */
                    145: 
                    146: enum unroll_types { UNROLL_COMPLETELY, UNROLL_MODULO, UNROLL_NAIVE };
                    147: 
                    148: #include "config.h"
                    149: #include "rtl.h"
                    150: #include "insn-config.h"
                    151: #include "integrate.h"
                    152: #include "regs.h"
                    153: #include "flags.h"
                    154: #include "expr.h"
                    155: #include <stdio.h>
                    156: #include "loop.h"
                    157: 
                    158: /* This controls which loops are unrolled, and by how much we unroll
                    159:    them.  */
                    160: 
                    161: #ifndef MAX_UNROLLED_INSNS
                    162: #define MAX_UNROLLED_INSNS 100
                    163: #endif
                    164: 
                    165: /* Indexed by register number, if non-zero, then it contains a pointer
                    166:    to a struct induction for a DEST_REG giv which has been combined with
                    167:    one of more address givs.  This is needed because whenever such a DEST_REG
                    168:    giv is modified, we must modify the value of all split address givs
                    169:    that were combined with this DEST_REG giv.  */
                    170: 
                    171: static struct induction **addr_combined_regs;
                    172: 
                    173: /* Indexed by register number, if this is a splittable induction variable,
                    174:    then this will hold the current value of the register, which depends on the
                    175:    iteration number.  */
                    176: 
                    177: static rtx *splittable_regs;
                    178: 
                    179: /* Indexed by register number, if this is a splittable induction variable,
                    180:    then this will hold the number of instructions in the loop that modify
                    181:    the induction variable.  Used to ensure that only the last insn modifying
                    182:    a split iv will update the original iv of the dest.  */
                    183: 
                    184: static int *splittable_regs_updates;
                    185: 
                    186: /* Values describing the current loop's iteration variable.  These are set up
                    187:    by loop_iterations, and used by precondition_loop_p.  */
                    188: 
                    189: static rtx loop_iteration_var;
                    190: static rtx loop_initial_value;
                    191: static rtx loop_increment;
                    192: static rtx loop_final_value;
                    193: 
                    194: /* Forward declarations.  */
                    195: 
                    196: static void init_reg_map ();
                    197: static int precondition_loop_p ();
                    198: static void copy_loop_body ();
                    199: static void iteration_info ();
                    200: static rtx approx_final_value ();
                    201: static int find_splittable_regs ();
                    202: static int find_splittable_givs ();
                    203: static rtx fold_rtx_mult_add ();
                    204: 
                    205: /* Try to unroll one loop and split induction variables in the loop.
                    206: 
                    207:    The loop is described by the arguments LOOP_END, INSN_COUNT, and
1.1.1.3 ! root      208:    LOOP_START.  END_INSERT_BEFORE indicates where insns should be added
1.1       root      209:    which need to be executed when the loop falls through.  STRENGTH_REDUCTION_P
                    210:    indicates whether information generated in the strength reduction pass
                    211:    is available.
                    212: 
                    213:    This function is intended to be called from within `strength_reduce'
                    214:    in loop.c.  */
                    215: 
                    216: void
                    217: unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
                    218:             strength_reduce_p)
                    219:      rtx loop_end;
                    220:      int insn_count;
                    221:      rtx loop_start;
                    222:      rtx end_insert_before;
                    223:      int strength_reduce_p;
                    224: {
                    225:   int i, j, temp;
                    226:   int unroll_number = 1;
                    227:   rtx copy_start, copy_end;
                    228:   rtx insn, copy, sequence, pattern, tem;
                    229:   int max_labelno, max_insnno;
                    230:   rtx insert_before;
                    231:   struct inline_remap *map;
                    232:   char *local_label;
                    233:   int maxregnum;
                    234:   int new_maxregnum;
                    235:   rtx exit_label = 0;
                    236:   rtx start_label;
                    237:   struct iv_class *bl;
                    238:   struct induction *v;
                    239:   int splitting_not_safe = 0;
                    240:   enum unroll_types unroll_type;
                    241:   int loop_preconditioned = 0;
                    242:   rtx safety_label;
                    243:   /* This points to the last real insn in the loop, which should be either
                    244:      a JUMP_INSN (for conditional jumps) or a BARRIER (for unconditional
                    245:      jumps).  */
                    246:   rtx last_loop_insn;
                    247: 
                    248:   /* Don't bother unrolling huge loops.  Since the minimum factor is
                    249:      two, loops greater than one half of MAX_UNROLLED_INSNS will never
                    250:      be unrolled.  */
                    251:   if (insn_count > MAX_UNROLLED_INSNS / 2)
                    252:     {
                    253:       if (loop_dump_stream)
                    254:        fprintf (loop_dump_stream, "Unrolling failure: Loop too big.\n");
                    255:       return;
                    256:     }
                    257: 
                    258:   /* When emitting debugger info, we can't unroll loops with unequal numbers
                    259:      of block_beg and block_end notes, because that would unbalance the block
                    260:      structure of the function.  This can happen as a result of the
                    261:      "if (foo) bar; else break;" optimization in jump.c.  */
                    262: 
                    263:   if (write_symbols != NO_DEBUG)
                    264:     {
                    265:       int block_begins = 0;
                    266:       int block_ends = 0;
                    267: 
                    268:       for (insn = loop_start; insn != loop_end; insn = NEXT_INSN (insn))
                    269:        {
                    270:          if (GET_CODE (insn) == NOTE)
                    271:            {
                    272:              if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG)
                    273:                block_begins++;
                    274:              else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END)
                    275:                block_ends++;
                    276:            }
                    277:        }
                    278: 
                    279:       if (block_begins != block_ends)
                    280:        {
                    281:          if (loop_dump_stream)
                    282:            fprintf (loop_dump_stream,
                    283:                     "Unrolling failure: Unbalanced block notes.\n");
                    284:          return;
                    285:        }
                    286:     }
                    287: 
                    288:   /* Determine type of unroll to perform.  Depends on the number of iterations
                    289:      and the size of the loop.  */
                    290: 
                    291:   /* If there is no strength reduce info, then set loop_n_iterations to zero.
                    292:      This can happen if strength_reduce can't find any bivs in the loop.
                    293:      A value of zero indicates that the number of iterations could not be
                    294:      calculated.  */
                    295: 
                    296:   if (! strength_reduce_p)
                    297:     loop_n_iterations = 0;
                    298: 
                    299:   if (loop_dump_stream && loop_n_iterations > 0)
                    300:     fprintf (loop_dump_stream,
                    301:             "Loop unrolling: %d iterations.\n", loop_n_iterations);
                    302: 
                    303:   /* Find and save a pointer to the last nonnote insn in the loop.  */
                    304: 
                    305:   last_loop_insn = prev_nonnote_insn (loop_end);
                    306: 
                    307:   /* Calculate how many times to unroll the loop.  Indicate whether or
                    308:      not the loop is being completely unrolled.  */
                    309: 
                    310:   if (loop_n_iterations == 1)
                    311:     {
                    312:       /* If number of iterations is exactly 1, then eliminate the compare and
                    313:         branch at the end of the loop since they will never be taken.
                    314:         Then return, since no other action is needed here.  */
                    315: 
                    316:       /* If the last instruction is not a BARRIER or a JUMP_INSN, then
                    317:         don't do anything.  */
                    318: 
                    319:       if (GET_CODE (last_loop_insn) == BARRIER)
                    320:        {
                    321:          /* Delete the jump insn.  This will delete the barrier also.  */
                    322:          delete_insn (PREV_INSN (last_loop_insn));
                    323:        }
                    324:       else if (GET_CODE (last_loop_insn) == JUMP_INSN)
                    325:        {
                    326: #ifdef HAVE_cc0
1.1.1.2   root      327:          /* The immediately preceding insn is a compare which must be
1.1       root      328:             deleted.  */
                    329:          delete_insn (last_loop_insn);
                    330:          delete_insn (PREV_INSN (last_loop_insn));
                    331: #else
1.1.1.2   root      332:          /* The immediately preceding insn may not be the compare, so don't
1.1       root      333:             delete it.  */
                    334:          delete_insn (last_loop_insn);
                    335: #endif
                    336:        }
                    337:       return;
                    338:     }
                    339:   else if (loop_n_iterations > 0
                    340:       && loop_n_iterations * insn_count < MAX_UNROLLED_INSNS)
                    341:     {
                    342:       unroll_number = loop_n_iterations;
                    343:       unroll_type = UNROLL_COMPLETELY;
                    344:     }
                    345:   else if (loop_n_iterations > 0)
                    346:     {
                    347:       /* Try to factor the number of iterations.  Don't bother with the
                    348:         general case, only using 2, 3, 5, and 7 will get 75% of all
                    349:         numbers theoretically, and almost all in practice.  */
                    350: 
                    351:       for (i = 0; i < NUM_FACTORS; i++)
                    352:        factors[i].count = 0;
                    353: 
                    354:       temp = loop_n_iterations;
                    355:       for (i = NUM_FACTORS - 1; i >= 0; i--)
                    356:        while (temp % factors[i].factor == 0)
                    357:          {
                    358:            factors[i].count++;
                    359:            temp = temp / factors[i].factor;
                    360:          }
                    361: 
                    362:       /* Start with the larger factors first so that we generally
                    363:         get lots of unrolling.  */
                    364: 
                    365:       unroll_number = 1;
                    366:       temp = insn_count;
                    367:       for (i = 3; i >= 0; i--)
                    368:        while (factors[i].count--)
                    369:          {
                    370:            if (temp * factors[i].factor < MAX_UNROLLED_INSNS)
                    371:              {
                    372:                unroll_number *= factors[i].factor;
                    373:                temp *= factors[i].factor;
                    374:              }
                    375:            else
                    376:              break;
                    377:          }
                    378: 
                    379:       /* If we couldn't find any factors, then unroll as in the normal
                    380:         case.  */
                    381:       if (unroll_number == 1)
                    382:        {
                    383:          if (loop_dump_stream)
                    384:            fprintf (loop_dump_stream,
                    385:                     "Loop unrolling: No factors found.\n");
                    386:        }
                    387:       else
                    388:        unroll_type = UNROLL_MODULO;
                    389:     }
                    390: 
                    391: 
                    392:   /* Default case, calculate number of times to unroll loop based on its
                    393:      size.  */
                    394:   if (unroll_number == 1)
                    395:     {
                    396:       if (8 * insn_count < MAX_UNROLLED_INSNS)
                    397:        unroll_number = 8;
                    398:       else if (4 * insn_count < MAX_UNROLLED_INSNS)
                    399:        unroll_number = 4;
                    400:       else
                    401:        unroll_number = 2;
                    402: 
                    403:       unroll_type = UNROLL_NAIVE;
                    404:     }
                    405: 
                    406:   /* Now we know how many times to unroll the loop.  */
                    407: 
                    408:   if (loop_dump_stream)
                    409:     fprintf (loop_dump_stream,
                    410:             "Unrolling loop %d times.\n", unroll_number);
                    411: 
                    412: 
                    413:   if (unroll_type == UNROLL_COMPLETELY || unroll_type == UNROLL_MODULO)
                    414:     {
                    415:       /* Loops of these types should never start with a jump down to
                    416:         the exit condition test.  For now, check for this case just to
                    417:         be sure.  UNROLL_NAIVE loops can be of this form, this case is
                    418:         handled below.  */
                    419:       insn = loop_start;
                    420:       while (GET_CODE (insn) != CODE_LABEL && GET_CODE (insn) != JUMP_INSN)
                    421:        insn = NEXT_INSN (insn);
                    422:       if (GET_CODE (insn) == JUMP_INSN)
                    423:        abort ();
                    424:     }
                    425: 
                    426:   if (unroll_type == UNROLL_COMPLETELY)
                    427:     {
                    428:       /* Completely unrolling the loop:  Delete the compare and branch at
                    429:         the end (the last two instructions).   This delete must done at the
                    430:         very end of loop unrolling, to avoid problems with calls to
                    431:         back_branch_in_range_p, which is called by find_splittable_regs.
                    432:         All increments of splittable bivs/givs are changed to load constant
                    433:         instructions.  */
                    434: 
                    435:       copy_start = loop_start;
                    436: 
                    437:       /* Set insert_before to the instruction immediately after the JUMP_INSN
                    438:         (or BARRIER), so that any NOTEs between the JUMP_INSN and the end of
                    439:         the loop will be correctly handled by copy_loop_body.  */
                    440:       insert_before = NEXT_INSN (last_loop_insn);
                    441: 
                    442:       /* Set copy_end to the insn before the jump at the end of the loop.  */
                    443:       if (GET_CODE (last_loop_insn) == BARRIER)
                    444:        copy_end = PREV_INSN (PREV_INSN (last_loop_insn));
                    445:       else if (GET_CODE (last_loop_insn) == JUMP_INSN)
                    446:        {
                    447: #ifdef HAVE_cc0
                    448:          /* The instruction immediately before the JUMP_INSN is a compare
                    449:             instruction which we do not want to copy.  */
                    450:          copy_end = PREV_INSN (PREV_INSN (last_loop_insn));
                    451: #else
                    452:          /* The instruction immediately before the JUMP_INSN may not be the
                    453:             compare, so we must copy it.  */
                    454:          copy_end = PREV_INSN (last_loop_insn);
                    455: #endif
                    456:        }
                    457:       else
                    458:        {
                    459:          /* We currently can't unroll a loop if it doesn't end with a
                    460:             JUMP_INSN.  There would need to be a mechanism that recognizes
                    461:             this case, and then inserts a jump after each loop body, which
                    462:             jumps to after the last loop body.  */
                    463:          if (loop_dump_stream)
                    464:            fprintf (loop_dump_stream,
                    465:                     "Unrolling failure: loop does not end with a JUMP_INSN.\n");
                    466:          return;
                    467:        }
                    468:     }
                    469:   else if (unroll_type == UNROLL_MODULO)
                    470:     {
                    471:       /* Partially unrolling the loop:  The compare and branch at the end
                    472:         (the last two instructions) must remain.  Don't copy the compare
                    473:         and branch instructions at the end of the loop.  Insert the unrolled
                    474:         code immediately before the compare/branch at the end so that the
                    475:         code will fall through to them as before.  */
                    476: 
                    477:       copy_start = loop_start;
                    478: 
                    479:       /* Set insert_before to the jump insn at the end of the loop.
                    480:         Set copy_end to before the jump insn at the end of the loop.  */
                    481:       if (GET_CODE (last_loop_insn) == BARRIER)
                    482:        {
                    483:          insert_before = PREV_INSN (last_loop_insn);
                    484:          copy_end = PREV_INSN (insert_before);
                    485:        }
                    486:       else if (GET_CODE (last_loop_insn) == JUMP_INSN)
                    487:        {
                    488: #ifdef HAVE_cc0
                    489:          /* The instruction immediately before the JUMP_INSN is a compare
                    490:             instruction which we do not want to copy or delete.  */
                    491:          insert_before = PREV_INSN (last_loop_insn);
                    492:          copy_end = PREV_INSN (insert_before);
                    493: #else
                    494:          /* The instruction immediately before the JUMP_INSN may not be the
                    495:             compare, so we must copy it.  */
                    496:          insert_before = last_loop_insn;
                    497:          copy_end = PREV_INSN (last_loop_insn);
                    498: #endif
                    499:        }
                    500:       else
                    501:        {
                    502:          /* We currently can't unroll a loop if it doesn't end with a
                    503:             JUMP_INSN.  There would need to be a mechanism that recognizes
                    504:             this case, and then inserts a jump after each loop body, which
                    505:             jumps to after the last loop body.  */
                    506:          if (loop_dump_stream)
                    507:            fprintf (loop_dump_stream,
                    508:                     "Unrolling failure: loop does not end with a JUMP_INSN.\n");
                    509:          return;
                    510:        }
                    511:     }
                    512:   else
                    513:     {
                    514:       /* Normal case: Must copy the compare and branch instructions at the
                    515:         end of the loop.  */
                    516: 
                    517:       if (GET_CODE (last_loop_insn) == BARRIER)
                    518:        {
                    519:          /* Loop ends with an unconditional jump and a barrier.
                    520:             Handle this like above, don't copy jump and barrier.
                    521:             This is not strictly necessary, but doing so prevents generating
                    522:             unconditional jumps to an immediately following label.
                    523: 
                    524:             This will be corrected below if the target of this jump is
                    525:             not the start_label.  */
                    526: 
                    527:          insert_before = PREV_INSN (last_loop_insn);
                    528:          copy_end = PREV_INSN (insert_before);
                    529:        }
                    530:       else if (GET_CODE (last_loop_insn) == JUMP_INSN)
                    531:        {
                    532:          /* Set insert_before to immediately after the JUMP_INSN, so that
                    533:             NOTEs at the end of the loop will be correctly handled by
                    534:             copy_loop_body.  */
                    535:          insert_before = NEXT_INSN (last_loop_insn);
                    536:          copy_end = last_loop_insn;
                    537:        }
                    538:       else
                    539:        {
                    540:          /* We currently can't unroll a loop if it doesn't end with a
                    541:             JUMP_INSN.  There would need to be a mechanism that recognizes
                    542:             this case, and then inserts a jump after each loop body, which
                    543:             jumps to after the last loop body.  */
                    544:          if (loop_dump_stream)
                    545:            fprintf (loop_dump_stream,
                    546:                     "Unrolling failure: loop does not end with a JUMP_INSN.\n");
                    547:          return;
                    548:        }
                    549: 
                    550:       /* If copying exit test branches because they can not be eliminated,
                    551:         then must convert the fall through case of the branch to a jump past
                    552:         the end of the loop.  Create a label to emit after the loop and save
                    553:         it for later use.  Do not use the label after the loop, if any, since
                    554:         it might be used by insns outside the loop, or there might be insns
                    555:         added before it later by final_[bg]iv_value which must be after
                    556:         the real exit label.  */
                    557:       exit_label = gen_label_rtx ();
                    558: 
                    559:       insn = loop_start;
                    560:       while (GET_CODE (insn) != CODE_LABEL && GET_CODE (insn) != JUMP_INSN)
                    561:        insn = NEXT_INSN (insn);
                    562: 
                    563:       if (GET_CODE (insn) == JUMP_INSN)
                    564:        {
                    565:          /* The loop starts with a jump down to the exit condition test.
                    566:             Start copying the loop after the barrier following this
                    567:             jump insn.  */
                    568:          copy_start = NEXT_INSN (insn);
                    569: 
                    570:          /* Splitting induction variables doesn't work when the loop is
                    571:             entered via a jump to the bottom, because then we end up doing
                    572:             a comparison against a new register for a split variable, but
                    573:             we did not execute the set insn for the new register because
                    574:             it was skipped over.  */
                    575:          splitting_not_safe = 1;
                    576:          if (loop_dump_stream)
                    577:            fprintf (loop_dump_stream,
                    578:                     "Splitting not safe, because loop not entered at top.\n");
                    579:        }
                    580:       else
                    581:        copy_start = loop_start;
                    582:     }
                    583: 
                    584:   /* This should always be the first label in the loop.  */
                    585:   start_label = NEXT_INSN (copy_start);
                    586:   /* There may be a line number note and/or a loop continue note here.  */
                    587:   while (GET_CODE (start_label) == NOTE)
                    588:     start_label = NEXT_INSN (start_label);
                    589:   if (GET_CODE (start_label) != CODE_LABEL)
                    590:     {
                    591:       /* This can happen as a result of jump threading.  If the first insns in
                    592:         the loop test the same condition as the loop's backward jump, or the
                    593:         opposite condition, then the backward jump will be modified to point
                    594:         to elsewhere, and the loop's start label is deleted.
                    595: 
                    596:         This case currently can not be handled by the loop unrolling code.  */
                    597: 
                    598:       if (loop_dump_stream)
                    599:        fprintf (loop_dump_stream,
                    600:                 "Unrolling failure: unknown insns between BEG note and loop label.\n");
                    601:       return;
                    602:     }
                    603: 
                    604:   if (unroll_type == UNROLL_NAIVE
                    605:       && GET_CODE (last_loop_insn) == BARRIER
                    606:       && start_label != JUMP_LABEL (PREV_INSN (last_loop_insn)))
                    607:     {
                    608:       /* In this case, we must copy the jump and barrier, because they will
                    609:         not be converted to jumps to an immediately following label.  */
                    610: 
                    611:       insert_before = NEXT_INSN (last_loop_insn);
                    612:       copy_end = last_loop_insn;
                    613:     }
                    614: 
                    615:   /* Allocate a translation table for the labels and insn numbers.
                    616:      They will be filled in as we copy the insns in the loop.  */
                    617: 
                    618:   max_labelno = max_label_num ();
                    619:   max_insnno = get_max_uid ();
                    620: 
                    621:   map = (struct inline_remap *) alloca (sizeof (struct inline_remap));
                    622: 
                    623:   /* Allocate the label map.  */
                    624: 
                    625:   if (max_labelno > 0)
                    626:     {
                    627:       map->label_map = (rtx *) alloca (max_labelno * sizeof (rtx));
                    628: 
                    629:       local_label = (char *) alloca (max_labelno);
                    630:       bzero (local_label, max_labelno);
                    631:     }
                    632:   else
                    633:     map->label_map = 0;
                    634: 
                    635:   /* Search the loop and mark all local labels, i.e. the ones which have to
                    636:      be distinct labels when copied.  For all labels which might be
                    637:      non-local, set their label_map entries to point to themselves.
                    638:      If they happen to be local their label_map entries will be overwritten
                    639:      before the loop body is copied.  The label_map entries for local labels
                    640:      will be set to a different value each time the loop body is copied.  */
                    641: 
                    642:   for (insn = copy_start; insn != loop_end; insn = NEXT_INSN (insn))
                    643:     {
                    644:       if (GET_CODE (insn) == CODE_LABEL)
                    645:        local_label[CODE_LABEL_NUMBER (insn)] = 1;
                    646:       else if (GET_CODE (insn) == JUMP_INSN)
                    647:        {
                    648:          if (JUMP_LABEL (insn))
                    649:            map->label_map[CODE_LABEL_NUMBER (JUMP_LABEL (insn))]
                    650:              = JUMP_LABEL (insn);
                    651:          else if (GET_CODE (PATTERN (insn)) == ADDR_VEC
                    652:                   || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
                    653:            {
                    654:              rtx pat = PATTERN (insn);
                    655:              int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC;
                    656:              int len = XVECLEN (pat, diff_vec_p);
                    657:              rtx label;
                    658: 
                    659:              for (i = 0; i < len; i++)
                    660:                {
                    661:                  label = XEXP (XVECEXP (pat, diff_vec_p, i), 0);
                    662:                  map->label_map[CODE_LABEL_NUMBER (label)] = label;
                    663:                }
                    664:            }
                    665:        }
                    666:     }
                    667: 
                    668:   /* Allocate space for the insn map.  */
                    669: 
                    670:   map->insn_map = (rtx *) alloca (max_insnno * sizeof (rtx));
                    671: 
                    672:   /* Set this to zero, to indicate that we are doing loop unrolling,
                    673:      not function inlining.  */
                    674:   map->inline_target = 0;
                    675: 
                    676:   /* The register and constant maps depend on the number of registers
                    677:      present, so the final maps can't be created until after
                    678:      find_splittable_regs is called.  However, they are needed for
                    679:      preconditioning, so we create temporary maps when preconditioning
                    680:      is performed.  */
                    681: 
                    682:   /* The preconditioning code may allocate two new pseudo registers.  */
                    683:   maxregnum = max_reg_num ();
                    684: 
                    685:   /* Allocate and zero out the splittable_regs and addr_combined_regs
                    686:      arrays.  These must be zeroed here because they will be used if
                    687:      loop preconditioning is performed, and must be zero for that case.
                    688: 
                    689:      It is safe to do this here, since the extra registers created by the
                    690:      preconditioning code and find_splittable_regs will never be used
1.1.1.3 ! root      691:      to access the splittable_regs[] and addr_combined_regs[] arrays.  */
1.1       root      692: 
                    693:   splittable_regs = (rtx *) alloca (maxregnum * sizeof (rtx));
                    694:   bzero (splittable_regs, maxregnum * sizeof (rtx));
                    695:   splittable_regs_updates = (int *) alloca (maxregnum * sizeof (int));
                    696:   bzero (splittable_regs_updates, maxregnum * sizeof (int));
                    697:   addr_combined_regs
                    698:     = (struct induction **) alloca (maxregnum * sizeof (struct induction *));
                    699:   bzero (addr_combined_regs, maxregnum * sizeof (struct induction *));
                    700: 
                    701:   /* If this loop requires exit tests when unrolled, check to see if we
                    702:      can precondition the loop so as to make the exit tests unnecessary.
                    703:      Just like variable splitting, this is not safe if the loop is entered
                    704:      via a jump to the bottom.  Also, can not do this if no strength
                    705:      reduce info, because precondition_loop_p uses this info.  */
                    706: 
                    707:   /* Must copy the loop body for preconditioning before the following
                    708:      find_splittable_regs call since that will emit insns which need to
                    709:      be after the preconditioned loop copies, but immediately before the
                    710:      unrolled loop copies.  */
                    711: 
                    712:   /* Also, it is not safe to split induction variables for the preconditioned
                    713:      copies of the loop body.  If we split induction variables, then the code
                    714:      assumes that each induction variable can be represented as a function
                    715:      of its initial value and the loop iteration number.  This is not true
                    716:      in this case, because the last preconditioned copy of the loop body
                    717:      could be any iteration from the first up to the `unroll_number-1'th,
                    718:      depending on the initial value of the iteration variable.  Therefore
                    719:      we can not split induction variables here, because we can not calculate
                    720:      their value.  Hence, this code must occur before find_splittable_regs
                    721:      is called.  */
                    722: 
                    723:   if (unroll_type == UNROLL_NAIVE && ! splitting_not_safe && strength_reduce_p)
                    724:     {
                    725:       rtx initial_value, final_value, increment;
                    726: 
                    727:       if (precondition_loop_p (&initial_value, &final_value, &increment,
                    728:                               loop_start, loop_end))
                    729:        {
                    730:          register rtx diff, temp;
                    731:          enum machine_mode mode;
                    732:          rtx *labels;
                    733:          int abs_inc, neg_inc;
                    734: 
                    735:          map->reg_map = (rtx *) alloca (maxregnum * sizeof (rtx));
                    736: 
                    737:          map->const_equiv_map = (rtx *) alloca (maxregnum * sizeof (rtx));
                    738:          map->const_age_map = (unsigned *) alloca (maxregnum
                    739:                                                    * sizeof (unsigned));
                    740:          map->const_equiv_map_size = maxregnum;
                    741:          global_const_equiv_map = map->const_equiv_map;
                    742: 
                    743:          init_reg_map (map, maxregnum);
                    744: 
                    745:          /* Limit loop unrolling to 4, since this will make 7 copies of
                    746:             the loop body.  */
                    747:          if (unroll_number > 4)
                    748:            unroll_number = 4;
                    749: 
                    750:          /* Save the absolute value of the increment, and also whether or
                    751:             not it is negative.  */
                    752:          neg_inc = 0;
                    753:          abs_inc = INTVAL (increment);
                    754:          if (abs_inc < 0)
                    755:            {
                    756:              abs_inc = - abs_inc;
                    757:              neg_inc = 1;
                    758:            }
                    759: 
                    760:          start_sequence ();
                    761: 
                    762:          /* Decide what mode to do these calculations in.  Choose the larger
                    763:             of final_value's mode and initial_value's mode, or a full-word if
                    764:             both are constants.  */
                    765:          mode = GET_MODE (final_value);
                    766:          if (mode == VOIDmode)
                    767:            {
                    768:              mode = GET_MODE (initial_value);
                    769:              if (mode == VOIDmode)
                    770:                mode = word_mode;
                    771:            }
                    772:          else if (mode != GET_MODE (initial_value)
                    773:                   && (GET_MODE_SIZE (mode)
                    774:                       < GET_MODE_SIZE (GET_MODE (initial_value))))
                    775:            mode = GET_MODE (initial_value);
                    776: 
                    777:          /* Calculate the difference between the final and initial values.
                    778:             Final value may be a (plus (reg x) (const_int 1)) rtx.
                    779:             Let the following cse pass simplify this if initial value is
                    780:             a constant. 
                    781: 
                    782:             We must copy the final and initial values here to avoid
                    783:             improperly shared rtl.  */
                    784: 
                    785:          diff = expand_binop (mode, sub_optab, copy_rtx (final_value),
                    786:                               copy_rtx (initial_value), 0, 0,
                    787:                               OPTAB_LIB_WIDEN);
                    788: 
                    789:          /* Now calculate (diff % (unroll * abs (increment))) by using an
                    790:             and instruction.  */
                    791:          diff = expand_binop (GET_MODE (diff), and_optab, diff,
                    792:                               gen_rtx (CONST_INT, VOIDmode,
                    793:                                        unroll_number * abs_inc - 1),
                    794:                               0, 0, OPTAB_LIB_WIDEN);
                    795: 
                    796:          /* Now emit a sequence of branches to jump to the proper precond
                    797:             loop entry point.  */
                    798: 
                    799:          labels = (rtx *) alloca (sizeof (rtx) * unroll_number);
                    800:          for (i = 0; i < unroll_number; i++)
                    801:            labels[i] = gen_label_rtx ();
                    802: 
                    803:          /* Assuming the unroll_number is 4, and the increment is 2, then
                    804:             for a negative increment:  for a positive increment:
                    805:             diff = 0,1   precond 0     diff = 0,7   precond 0
                    806:             diff = 2,3   precond 3     diff = 1,2   precond 1
                    807:             diff = 4,5   precond 2     diff = 3,4   precond 2
                    808:             diff = 6,7   precond 1     diff = 5,6   precond 3  */
                    809: 
                    810:          /* We only need to emit (unroll_number - 1) branches here, the
                    811:             last case just falls through to the following code.  */
                    812: 
                    813:          /* ??? This would give better code if we emitted a tree of branches
                    814:             instead of the current linear list of branches.  */
                    815: 
                    816:          for (i = 0; i < unroll_number - 1; i++)
                    817:            {
                    818:              int cmp_const;
                    819: 
                    820:              /* For negative increments, must invert the constant compared
                    821:                 against, except when comparing against zero.  */
                    822:              if (i == 0)
                    823:                cmp_const = 0;
                    824:              else if (neg_inc)
                    825:                cmp_const = unroll_number - i;
                    826:              else
                    827:                cmp_const = i;
                    828: 
                    829:              emit_cmp_insn (diff, gen_rtx (CONST_INT, VOIDmode,
                    830:                                            abs_inc * cmp_const),
                    831:                             EQ, 0, mode, 0, 0);
                    832: 
                    833:              if (i == 0)
                    834:                emit_jump_insn (gen_beq (labels[i]));
                    835:              else if (neg_inc)
                    836:                emit_jump_insn (gen_bge (labels[i]));
                    837:              else
                    838:                emit_jump_insn (gen_ble (labels[i]));
                    839:              JUMP_LABEL (get_last_insn ()) = labels[i];
                    840:              LABEL_NUSES (labels[i])++;
                    841:            }
                    842: 
                    843:          /* If the increment is greater than one, then we need another branch,
                    844:             to handle other cases equivalent to 0.  */
                    845: 
                    846:          /* ??? This should be merged into the code above somehow to help
                    847:             simplify the code here, and reduce the number of branches emitted.
                    848:             For the negative increment case, the branch here could easily
                    849:             be merged with the `0' case branch above.  For the positive
                    850:             increment case, it is not clear how this can be simplified.  */
                    851:             
                    852:          if (abs_inc != 1)
                    853:            {
                    854:              int cmp_const;
                    855: 
                    856:              if (neg_inc)
                    857:                cmp_const = abs_inc - 1;
                    858:              else
                    859:                cmp_const = abs_inc * (unroll_number - 1) + 1;
                    860: 
                    861:              emit_cmp_insn (diff, gen_rtx (CONST_INT, VOIDmode, cmp_const),
                    862:                             EQ, 0, mode, 0, 0);
                    863: 
                    864:              if (neg_inc)
                    865:                emit_jump_insn (gen_ble (labels[0]));
                    866:              else
                    867:                emit_jump_insn (gen_bge (labels[0]));
                    868:              JUMP_LABEL (get_last_insn ()) = labels[0];
                    869:              LABEL_NUSES (labels[0])++;
                    870:            }
                    871: 
                    872:          sequence = gen_sequence ();
                    873:          end_sequence ();
                    874:          emit_insn_before (sequence, loop_start);
                    875:          
                    876:          /* Only the last copy of the loop body here needs the exit
                    877:             test, so set copy_end to exclude the compare/branch here,
                    878:             and then reset it inside the loop when get to the last
                    879:             copy.  */
                    880: 
                    881:          if (GET_CODE (last_loop_insn) == BARRIER)
                    882:            copy_end = PREV_INSN (PREV_INSN (last_loop_insn));
                    883:          else if (GET_CODE (last_loop_insn) == JUMP_INSN)
                    884:            {
                    885: #ifdef HAVE_cc0
1.1.1.2   root      886:              /* The immediately preceding insn is a compare which we do not
1.1       root      887:                 want to copy.  */
                    888:              copy_end = PREV_INSN (PREV_INSN (last_loop_insn));
                    889: #else
1.1.1.2   root      890:              /* The immediately preceding insn may not be a compare, so we
1.1       root      891:                 must copy it.  */
                    892:              copy_end = PREV_INSN (last_loop_insn);
                    893: #endif
                    894:            }
                    895:          else
                    896:            abort ();
                    897: 
                    898:          for (i = 1; i < unroll_number; i++)
                    899:            {
                    900:              emit_label_after (labels[unroll_number - i],
                    901:                                PREV_INSN (loop_start));
                    902: 
                    903:              bzero (map->insn_map, max_insnno * sizeof (rtx));
                    904:              bzero (map->const_equiv_map, maxregnum * sizeof (rtx));
                    905:              bzero (map->const_age_map, maxregnum * sizeof (unsigned));
                    906:              map->const_age = 0;
                    907: 
                    908:              for (j = 0; j < max_labelno; j++)
                    909:                if (local_label[j])
                    910:                  map->label_map[j] = gen_label_rtx ();
                    911: 
                    912:              /* The last copy needs the compare/branch insns at the end,
                    913:                 so reset copy_end here if the loop ends with a conditional
                    914:                 branch.  */
                    915: 
                    916:              if (i == unroll_number - 1)
                    917:                {
                    918:                  if (GET_CODE (last_loop_insn) == BARRIER)
                    919:                    copy_end = PREV_INSN (PREV_INSN (last_loop_insn));
                    920:                  else
                    921:                    copy_end = last_loop_insn;
                    922:                }
                    923: 
                    924:              /* None of the copies are the `last_iteration', so just
                    925:                 pass zero for that parameter.  */
                    926:              copy_loop_body (copy_start, copy_end, map, exit_label, 0,
                    927:                              unroll_type, start_label, loop_end,
                    928:                              loop_start, copy_end);
                    929:            }
                    930:          emit_label_after (labels[0], PREV_INSN (loop_start));
                    931: 
                    932:          if (GET_CODE (last_loop_insn) == BARRIER)
                    933:            {
                    934:              insert_before = PREV_INSN (last_loop_insn);
                    935:              copy_end = PREV_INSN (insert_before);
                    936:            }
                    937:          else
                    938:            {
                    939: #ifdef HAVE_cc0
1.1.1.2   root      940:              /* The immediately preceding insn is a compare which we do not
1.1       root      941:                 want to copy.  */
                    942:              insert_before = PREV_INSN (last_loop_insn);
                    943:              copy_end = PREV_INSN (insert_before);
                    944: #else
1.1.1.2   root      945:              /* The immediately preceding insn may not be a compare, so we
1.1       root      946:                 must copy it.  */
                    947:              insert_before = last_loop_insn;
                    948:              copy_end = PREV_INSN (last_loop_insn);
                    949: #endif
                    950:            }
                    951: 
                    952:          /* Set unroll type to MODULO now.  */
                    953:          unroll_type = UNROLL_MODULO;
                    954:          loop_preconditioned = 1;
                    955:        }
                    956:     }
                    957: 
                    958:   /* If reach here, and the loop type is UNROLL_NAIVE, then don't unroll
                    959:      the loop unless all loops are being unrolled.  */
                    960:   if (unroll_type == UNROLL_NAIVE && ! flag_unroll_all_loops)
                    961:     {
                    962:       if (loop_dump_stream)
                    963:        fprintf (loop_dump_stream, "Unrolling failure: Naive unrolling not being done.\n");
                    964:       return;
                    965:     }
                    966: 
                    967:   /* At this point, we are guaranteed to unroll the loop.  */
                    968: 
                    969:   /* For each biv and giv, determine whether it can be safely split into
                    970:      a different variable for each unrolled copy of the loop body.
                    971:      We precalculate and save this info here, since computing it is
                    972:      expensive.
                    973: 
                    974:      Do this before deleting any instructions from the loop, so that
                    975:      back_branch_in_range_p will work correctly.  */
                    976: 
                    977:   if (splitting_not_safe)
                    978:     temp = 0;
                    979:   else
                    980:     temp = find_splittable_regs (unroll_type, loop_start, loop_end,
                    981:                                end_insert_before, unroll_number);
                    982: 
                    983:   /* find_splittable_regs may have created some new registers, so must
                    984:      reallocate the reg_map with the new larger size, and must realloc
                    985:      the constant maps also.  */
                    986: 
                    987:   maxregnum = max_reg_num ();
                    988:   map->reg_map = (rtx *) alloca (maxregnum * sizeof (rtx));
                    989: 
                    990:   init_reg_map (map, maxregnum);
                    991: 
                    992:   /* Space is needed in some of the map for new registers, so new_maxregnum
                    993:      is an (over)estimate of how many registers will exist at the end.  */
                    994:   new_maxregnum = maxregnum + (temp * unroll_number * 2);
                    995: 
                    996:   /* Must realloc space for the constant maps, because the number of registers
                    997:      may have changed.  */
                    998: 
                    999:   map->const_equiv_map = (rtx *) alloca (new_maxregnum * sizeof (rtx));
                   1000:   map->const_age_map = (unsigned *) alloca (new_maxregnum * sizeof (unsigned));
                   1001: 
                   1002:   global_const_equiv_map = map->const_equiv_map;
                   1003: 
                   1004:   /* Search the list of bivs and givs to find ones which need to be remapped
                   1005:      when split, and set their reg_map entry appropriately.  */
                   1006: 
                   1007:   for (bl = loop_iv_list; bl; bl = bl->next)
                   1008:     {
                   1009:       if (REGNO (bl->biv->src_reg) != bl->regno)
                   1010:        map->reg_map[bl->regno] = bl->biv->src_reg;
                   1011: #if 0
                   1012:       /* Currently, non-reduced/final-value givs are never split.  */
                   1013:       for (v = bl->giv; v; v = v->next_iv)
                   1014:        if (REGNO (v->src_reg) != bl->regno)
                   1015:          map->reg_map[REGNO (v->dest_reg)] = v->src_reg;
                   1016: #endif
                   1017:     }
                   1018: 
                   1019:   /* If the loop is being partially unrolled, and the iteration variables
                   1020:      are being split, and are being renamed for the split, then must fix up
                   1021:      the compare instruction at the end of the loop to refer to the new
                   1022:      registers.  This compare isn't copied, so the registers used in it
                   1023:      will never be replaced if it isn't done here.  */
                   1024: 
                   1025:   if (unroll_type == UNROLL_MODULO)
                   1026:     {
                   1027:       insn = NEXT_INSN (copy_end);
                   1028:       if (GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SET)
                   1029:        {
                   1030: #if 0
                   1031:          /* If non-reduced/final-value givs were split, then this would also
                   1032:             have to remap those givs.  */
                   1033: #endif
                   1034: 
                   1035:          tem = SET_SRC (PATTERN (insn));
                   1036:          /* The set source is a register.  */
                   1037:          if (GET_CODE (tem) == REG)
                   1038:            {
                   1039:              if (REGNO (tem) < max_reg_before_loop
                   1040:                  && reg_iv_type[REGNO (tem)] == BASIC_INDUCT)
                   1041:                SET_SRC (PATTERN (insn))
                   1042:                  = reg_biv_class[REGNO (tem)]->biv->src_reg;
                   1043:            }
                   1044:          else
                   1045:            {
                   1046:              /* The set source is a compare of some sort.  */
                   1047:              tem = XEXP (SET_SRC (PATTERN (insn)), 0);
                   1048:              if (GET_CODE (tem) == REG
                   1049:                  && REGNO (tem) < max_reg_before_loop
                   1050:                  && reg_iv_type[REGNO (tem)] == BASIC_INDUCT)
                   1051:                XEXP (SET_SRC (PATTERN (insn)), 0)
                   1052:                  = reg_biv_class[REGNO (tem)]->biv->src_reg;
                   1053:              
                   1054:              tem = XEXP (SET_SRC (PATTERN (insn)), 1);
                   1055:              if (GET_CODE (tem) == REG
                   1056:                  && REGNO (tem) < max_reg_before_loop
                   1057:                  && reg_iv_type[REGNO (tem)] == BASIC_INDUCT)
                   1058:                XEXP (SET_SRC (PATTERN (insn)), 1)
                   1059:                  = reg_biv_class[REGNO (tem)]->biv->src_reg;
                   1060:            }
                   1061:        }
                   1062:     }
                   1063: 
                   1064:   /* For unroll_number - 1 times, make a copy of each instruction
                   1065:      between copy_start and copy_end, and insert these new instructions
                   1066:      before the end of the loop.  */
                   1067: 
                   1068:   for (i = 0; i < unroll_number; i++)
                   1069:     {
                   1070:       bzero (map->insn_map, max_insnno * sizeof (rtx));
                   1071:       bzero (map->const_equiv_map, new_maxregnum * sizeof (rtx));
                   1072:       bzero (map->const_age_map, new_maxregnum * sizeof (unsigned));
                   1073:       map->const_age = 0;
                   1074: 
                   1075:       for (j = 0; j < max_labelno; j++)
                   1076:        if (local_label[j])
                   1077:          map->label_map[j] = gen_label_rtx ();
                   1078: 
                   1079:       /* If loop starts with a branch to the test, then fix it so that
                   1080:         it points to the test of the first unrolled copy of the loop.  */
                   1081:       if (i == 0 && loop_start != copy_start)
                   1082:        {
                   1083:          insn = PREV_INSN (copy_start);
                   1084:          pattern = PATTERN (insn);
                   1085:          
                   1086:          tem = map->label_map[CODE_LABEL_NUMBER
                   1087:                               (XEXP (SET_SRC (pattern), 0))];
                   1088:          SET_SRC (pattern) = gen_rtx (LABEL_REF, VOIDmode, tem);
                   1089: 
                   1090:          /* Set the jump label so that it can be used by later loop unrolling
                   1091:             passes.  */
                   1092:          JUMP_LABEL (insn) = tem;
                   1093:          LABEL_NUSES (tem)++;
                   1094:        }
                   1095: 
                   1096:       copy_loop_body (copy_start, copy_end, map, exit_label,
                   1097:                      i == unroll_number - 1, unroll_type, start_label,
                   1098:                      loop_end, insert_before, insert_before);
                   1099:     }
                   1100: 
                   1101:   /* Before deleting any insns, emit a CODE_LABEL immediately after the last
                   1102:      insn to be deleted.  This prevents any runaway delete_insn call from
                   1103:      more insns that it should, as it always stops at a CODE_LABEL.  */
                   1104: 
                   1105:   /* Delete the compare and branch at the end of the loop if completely
                   1106:      unrolling the loop.  Deleting the backward branch at the end also
                   1107:      deletes the code label at the start of the loop.  This is done at
                   1108:      the very end to avoid problems with back_branch_in_range_p.  */
                   1109: 
                   1110:   if (unroll_type == UNROLL_COMPLETELY)
                   1111:     safety_label = emit_label_after (gen_label_rtx (), last_loop_insn);
                   1112:   else
                   1113:     safety_label = emit_label_after (gen_label_rtx (), copy_end);
                   1114: 
                   1115:   /* Delete all of the original loop instructions.  Don't delete the 
                   1116:      LOOP_BEG note, or the first code label in the loop.  */
                   1117: 
                   1118:   insn = NEXT_INSN (copy_start);
                   1119:   while (insn != safety_label)
                   1120:     {
                   1121:       if (insn != start_label)
                   1122:        insn = delete_insn (insn);
                   1123:       else
                   1124:        insn = NEXT_INSN (insn);
                   1125:     }
                   1126: 
                   1127:   /* Can now delete the 'safety' label emitted to protect us from runaway
                   1128:      delete_insn calls.  */
                   1129:   if (INSN_DELETED_P (safety_label))
                   1130:     abort ();
                   1131:   delete_insn (safety_label);
                   1132: 
                   1133:   /* If exit_label exists, emit it after the loop.  Doing the emit here
                   1134:      forces it to have a higher INSN_UID than any insn in the unrolled loop.
                   1135:      This is needed so that mostly_true_jump in reorg.c will treat jumps
                   1136:      to this loop end label correctly, i.e. predict that they are usually
                   1137:      not taken.  */
                   1138:   if (exit_label)
                   1139:     emit_label_after (exit_label, loop_end);
                   1140: 
1.1.1.3 ! root     1141:   /* If debugging, we must replicate the tree nodes corresponding to the blocks
1.1       root     1142:      inside the loop, so that the original one to one mapping will remain.  */
                   1143: 
                   1144:   if (write_symbols != NO_DEBUG)
                   1145:     {
                   1146:       int copies = unroll_number;
                   1147: 
                   1148:       if (loop_preconditioned)
                   1149:        copies += unroll_number - 1;
                   1150: 
                   1151:       unroll_block_trees (uid_loop_num[INSN_UID (loop_start)], copies);
                   1152:     }
                   1153: }
                   1154: 
                   1155: /* Return true if the loop can be safely, and profitably, preconditioned
                   1156:    so that the unrolled copies of the loop body don't need exit tests.
                   1157: 
                   1158:    This only works if final_value, initial_value and increment can be
                   1159:    determined, and if increment is a constant power of 2.
                   1160:    If increment is not a power of 2, then the preconditioning modulo
                   1161:    operation would require a real modulo instead of a boolean AND, and this
                   1162:    is not considered `profitable'.  */
                   1163: 
                   1164: /* ??? If the loop is known to be executed very many times, or the machine
                   1165:    has a very cheap divide instruction, then preconditioning is a win even
                   1166:    when the increment is not a power of 2.  Use RTX_COST to compute
                   1167:    whether divide is cheap.  */
                   1168: 
                   1169: static int
                   1170: precondition_loop_p (initial_value, final_value, increment, loop_start,
                   1171:                     loop_end)
                   1172:      rtx *initial_value, *final_value, *increment;
                   1173:      rtx loop_start, loop_end;
                   1174: {
                   1175:   int unsigned_compare, compare_dir;
                   1176: 
                   1177:   if (loop_n_iterations > 0)
                   1178:     {
                   1179:       *initial_value = const0_rtx;
                   1180:       *increment = const1_rtx;
                   1181:       *final_value = gen_rtx (CONST_INT, VOIDmode, loop_n_iterations);
                   1182: 
                   1183:       if (loop_dump_stream)
                   1184:        fprintf (loop_dump_stream,
                   1185:                 "Preconditioning: Success, number of iterations known, %d.\n",
                   1186:                 loop_n_iterations);
                   1187:       return 1;
                   1188:     }
                   1189: 
                   1190:   if (loop_initial_value == 0)
                   1191:     {
                   1192:       if (loop_dump_stream)
                   1193:        fprintf (loop_dump_stream,
                   1194:                 "Preconditioning: Could not find initial value.\n");
                   1195:       return 0;
                   1196:     }
                   1197:   else if (loop_increment == 0)
                   1198:     {
                   1199:       if (loop_dump_stream)
                   1200:        fprintf (loop_dump_stream,
                   1201:                 "Preconditioning: Could not find increment value.\n");
                   1202:       return 0;
                   1203:     }
                   1204:   else if (GET_CODE (loop_increment) != CONST_INT)
                   1205:     {
                   1206:       if (loop_dump_stream)
                   1207:        fprintf (loop_dump_stream,
                   1208:                 "Preconditioning: Increment not a constant.\n");
                   1209:       return 0;
                   1210:     }
                   1211:   else if ((exact_log2 (INTVAL (loop_increment)) < 0)
                   1212:           && (exact_log2 (- INTVAL (loop_increment)) < 0))
                   1213:     {
                   1214:       if (loop_dump_stream)
                   1215:        fprintf (loop_dump_stream,
                   1216:                 "Preconditioning: Increment not a constant power of 2.\n");
                   1217:       return 0;
                   1218:     }
                   1219: 
                   1220:   /* Unsigned_compare and compare_dir can be ignored here, since they do
                   1221:      not matter for preconditioning.  */
                   1222: 
                   1223:   if (loop_final_value == 0)
                   1224:     {
                   1225:       if (loop_dump_stream)
                   1226:        fprintf (loop_dump_stream,
                   1227:                 "Preconditioning: EQ comparison loop.\n");
                   1228:       return 0;
                   1229:     }
                   1230: 
                   1231:   /* Must ensure that final_value is invariant, so call invariant_p to
                   1232:      check.  Before doing so, must check regno against max_reg_before_loop
1.1.1.3 ! root     1233:      to make sure that the register is in the range covered by invariant_p.
1.1       root     1234:      If it isn't, then it is most likely a biv/giv which by definition are
                   1235:      not invariant.  */
                   1236:   if ((GET_CODE (loop_final_value) == REG
                   1237:        && REGNO (loop_final_value) >= max_reg_before_loop)
                   1238:       || (GET_CODE (loop_final_value) == PLUS
                   1239:          && REGNO (XEXP (loop_final_value, 0)) >= max_reg_before_loop)
                   1240:       || ! invariant_p (loop_final_value))
                   1241:     {
                   1242:       if (loop_dump_stream)
                   1243:        fprintf (loop_dump_stream,
                   1244:                 "Preconditioning: Final value not invariant.\n");
                   1245:       return 0;
                   1246:     }
                   1247: 
                   1248:   /* Fail for floating point values, since the caller of this function
                   1249:      does not have code to deal with them.  */
                   1250:   if (GET_MODE_CLASS (GET_MODE (loop_final_value)) == MODE_FLOAT
1.1.1.2   root     1251:       || GET_MODE_CLASS (GET_MODE (loop_initial_value)) == MODE_FLOAT)
1.1       root     1252:     {
                   1253:       if (loop_dump_stream)
                   1254:        fprintf (loop_dump_stream,
                   1255:                 "Preconditioning: Floating point final or initial value.\n");
                   1256:       return 0;
                   1257:     }
                   1258: 
                   1259:   /* Now set initial_value to be the iteration_var, since that may be a
                   1260:      simpler expression, and is guaranteed to be correct if all of the
                   1261:      above tests succeed.
                   1262: 
                   1263:      We can not use the initial_value as calculated, because it will be
                   1264:      one too small for loops of the form "while (i-- > 0)".  We can not
                   1265:      emit code before the loop_skip_over insns to fix this problem as this
                   1266:      will then give a number one too large for loops of the form
                   1267:      "while (--i > 0)".
                   1268: 
                   1269:      Note that all loops that reach here are entered at the top, because
                   1270:      this function is not called if the loop starts with a jump.  */
                   1271: 
                   1272:   /* Fail if loop_iteration_var is not live before loop_start, since we need
                   1273:      to test its value in the preconditioning code.  */
                   1274: 
                   1275:   if (uid_luid[regno_first_uid[REGNO (loop_iteration_var)]]
                   1276:       > INSN_LUID (loop_start))
                   1277:     {
                   1278:       if (loop_dump_stream)
                   1279:        fprintf (loop_dump_stream,
                   1280:                 "Preconditioning: Iteration var not live before loop start.\n");
                   1281:       return 0;
                   1282:     }
                   1283: 
                   1284:   *initial_value = loop_iteration_var;
                   1285:   *increment = loop_increment;
                   1286:   *final_value = loop_final_value;
                   1287: 
                   1288:   /* Success! */
                   1289:   if (loop_dump_stream)
                   1290:     fprintf (loop_dump_stream, "Preconditioning: Successful.\n");
                   1291:   return 1;
                   1292: }
                   1293: 
                   1294: 
                   1295: /* All pseudo-registers must be mapped to themselves.  Two hard registers
                   1296:    must be mapped, VIRTUAL_STACK_VARS_REGNUM and VIRTUAL_INCOMING_ARGS_
                   1297:    REGNUM, to avoid function-inlining specific conversions of these
                   1298:    registers.  All other hard regs can not be mapped because they may be
                   1299:    used with different
                   1300:    modes.  */
                   1301: 
                   1302: static void
                   1303: init_reg_map (map, maxregnum)
                   1304:      struct inline_remap *map;
                   1305:      int maxregnum;
                   1306: {
                   1307:   int i;
                   1308: 
                   1309:   for (i = maxregnum - 1; i > LAST_VIRTUAL_REGISTER; i--)
                   1310:     map->reg_map[i] = regno_reg_rtx[i];
                   1311:   /* Just clear the rest of the entries.  */
                   1312:   for (i = LAST_VIRTUAL_REGISTER; i >= 0; i--)
                   1313:     map->reg_map[i] = 0;
                   1314: 
                   1315:   map->reg_map[VIRTUAL_STACK_VARS_REGNUM]
                   1316:     = regno_reg_rtx[VIRTUAL_STACK_VARS_REGNUM];
                   1317:   map->reg_map[VIRTUAL_INCOMING_ARGS_REGNUM]
                   1318:     = regno_reg_rtx[VIRTUAL_INCOMING_ARGS_REGNUM];
                   1319: }
                   1320: 
                   1321: /* Strength-reduction will often emit code for optimized biv/givs which
                   1322:    calculates their value in a temporary register, and then copies the result
                   1323:    to the iv.  This procedure reconstructs the pattern computing the iv;
                   1324:    verifying that all operands are of the proper form.
                   1325: 
                   1326:    The return value is the amount that the giv is incremented by.  */
                   1327: 
                   1328: static rtx
                   1329: calculate_giv_inc (pattern, src_insn, regno)
                   1330:      rtx pattern, src_insn;
                   1331:      int regno;
                   1332: {
                   1333:   rtx increment;
                   1334: 
                   1335:   /* Verify that we have an increment insn here.  First check for a plus
                   1336:      as the set source.  */
                   1337:   if (GET_CODE (SET_SRC (pattern)) != PLUS)
                   1338:     {
                   1339:       /* SR sometimes computes the new giv value in a temp, then copies it
                   1340:         to the new_reg.  */
                   1341:       src_insn = PREV_INSN (src_insn);
                   1342:       pattern = PATTERN (src_insn);
                   1343:       if (GET_CODE (SET_SRC (pattern)) != PLUS)
                   1344:        abort ();
                   1345:                  
                   1346:       /* The last insn emitted is not needed, so delete it to avoid confusing
                   1347:         the second cse pass.  This insn sets the giv unnecessarily.  */
                   1348:       delete_insn (get_last_insn ());
                   1349:     }
                   1350: 
                   1351:   /* Verify that we have a constant as the second operand of the plus.  */
                   1352:   increment = XEXP (SET_SRC (pattern), 1);
                   1353:   if (GET_CODE (increment) != CONST_INT)
                   1354:     {
                   1355:       /* SR sometimes puts the constant in a register, especially if it is
                   1356:         too big to be an add immed operand.  */
                   1357:       increment = SET_SRC (PATTERN (PREV_INSN (src_insn)));
                   1358: 
                   1359:       /* SR may have used LO_SUM to compute the constant if it is too large
                   1360:         for a load immed operand.  In this case, the constant is in operand
                   1361:         one of the LO_SUM rtx.  */
                   1362:       if (GET_CODE (increment) == LO_SUM)
                   1363:        increment = XEXP (increment, 1);
                   1364: 
                   1365:       if (GET_CODE (increment) != CONST_INT)
                   1366:        abort ();
                   1367:                  
                   1368:       /* The insn loading the constant into a register is not longer needed,
                   1369:         so delete it.  */
                   1370:       delete_insn (get_last_insn ());
                   1371:     }
                   1372: 
                   1373:   /* Check that the source register is the same as the dest register.  */
                   1374:   if (GET_CODE (XEXP (SET_SRC (pattern), 0)) != REG
                   1375:       || REGNO (XEXP (SET_SRC (pattern), 0)) != regno)
                   1376:     abort ();
                   1377: 
                   1378:   return increment;
                   1379: }
                   1380: 
                   1381: 
                   1382: /* Copy each instruction in the loop, substituting from map as appropriate.
                   1383:    This is very similar to a loop in expand_inline_function.  */
                   1384:   
                   1385: static void
                   1386: copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
                   1387:                unroll_type, start_label, loop_end, insert_before,
                   1388:                copy_notes_from)
                   1389:      rtx copy_start, copy_end;
                   1390:      struct inline_remap *map;
                   1391:      int last_iteration;
                   1392:      enum unroll_types unroll_type;
                   1393:      rtx start_label, loop_end, insert_before, copy_notes_from;
                   1394: {
                   1395:   rtx insn, pattern;
                   1396:   rtx tem, copy;
                   1397:   int dest_reg_was_split, i;
                   1398:   rtx cc0_insn = 0;
                   1399:   rtx final_label = 0;
                   1400:   rtx giv_inc, giv_dest_reg, giv_src_reg;
                   1401: 
                   1402:   /* If this isn't the last iteration, then map any references to the
                   1403:      start_label to final_label.  Final label will then be emitted immediately
                   1404:      after the end of this loop body if it was ever used.
                   1405: 
                   1406:      If this is the last iteration, then map references to the start_label
                   1407:      to itself.  */
                   1408:   if (! last_iteration)
                   1409:     {
                   1410:       final_label = gen_label_rtx ();
                   1411:       map->label_map[CODE_LABEL_NUMBER (start_label)] = final_label;
                   1412:     }
                   1413:   else
                   1414:     map->label_map[CODE_LABEL_NUMBER (start_label)] = start_label;
                   1415: 
                   1416:   start_sequence ();
                   1417:   
                   1418:   insn = copy_start;
                   1419:   do
                   1420:     {
                   1421:       insn = NEXT_INSN (insn);
                   1422:       
                   1423:       map->orig_asm_operands_vector = 0;
                   1424:       
                   1425:       switch (GET_CODE (insn))
                   1426:        {
                   1427:        case INSN:
                   1428:          pattern = PATTERN (insn);
                   1429:          copy = 0;
                   1430:          giv_inc = 0;
                   1431:          
                   1432:          /* Check to see if this is a giv that has been combined with
                   1433:             some split address givs.  (Combined in the sense that 
                   1434:             `combine_givs' in loop.c has put two givs in the same register.)
                   1435:             In this case, we must search all givs based on the same biv to
                   1436:             find the address givs.  Then split the address givs.
                   1437:             Do this before splitting the giv, since that may map the
                   1438:             SET_DEST to a new register.  */
                   1439:          
                   1440:          if (GET_CODE (pattern) == SET
                   1441:              && GET_CODE (SET_DEST (pattern)) == REG
                   1442:              && addr_combined_regs[REGNO (SET_DEST (pattern))])
                   1443:            {
                   1444:              struct iv_class *bl;
                   1445:              struct induction *v, *tv;
                   1446:              int regno = REGNO (SET_DEST (pattern));
                   1447:              
                   1448:              v = addr_combined_regs[REGNO (SET_DEST (pattern))];
                   1449:              bl = reg_biv_class[REGNO (v->src_reg)];
                   1450:              
                   1451:              /* Although the giv_inc amount is not needed here, we must call
                   1452:                 calculate_giv_inc here since it might try to delete the
                   1453:                 last insn emitted.  If we wait until later to call it,
                   1454:                 we might accidentally delete insns generated immediately
                   1455:                 below by emit_unrolled_add.  */
                   1456: 
                   1457:              giv_inc = calculate_giv_inc (pattern, insn, regno);
                   1458: 
                   1459:              /* Now find all address giv's that were combined with this
                   1460:                 giv 'v'.  */
                   1461:              for (tv = bl->giv; tv; tv = tv->next_iv)
                   1462:                if (tv->giv_type == DEST_ADDR && tv->same == v)
                   1463:                  {
1.1.1.3 ! root     1464:                    int this_giv_inc = INTVAL (giv_inc);
        !          1465: 
        !          1466:                    /* Scale this_giv_inc if the multiplicative factors of
        !          1467:                       the two givs are different.  */
        !          1468:                    if (tv->mult_val != v->mult_val)
        !          1469:                      this_giv_inc = (this_giv_inc / INTVAL (v->mult_val)
        !          1470:                                      * INTVAL (tv->mult_val));
        !          1471:                       
        !          1472:                    tv->dest_reg = plus_constant (tv->dest_reg, this_giv_inc);
1.1       root     1473:                    *tv->location = tv->dest_reg;
                   1474:                    
                   1475:                    if (last_iteration && unroll_type != UNROLL_COMPLETELY)
                   1476:                      {
                   1477:                        /* Must emit an insn to increment the split address
                   1478:                           giv.  Add in the const_adjust field in case there
                   1479:                           was a constant eliminated from the address.  */
                   1480:                        rtx value, dest_reg;
                   1481:                        
                   1482:                        /* tv->dest_reg will be either a bare register,
                   1483:                           or else a register plus a constant.  */
                   1484:                        if (GET_CODE (tv->dest_reg) == REG)
                   1485:                          dest_reg = tv->dest_reg;
                   1486:                        else
                   1487:                          dest_reg = XEXP (tv->dest_reg, 0);
                   1488:                        
                   1489:                        /* tv->dest_reg may actually be a (PLUS (REG) (CONST))
                   1490:                           here, so we must call plus_constant to add
                   1491:                           the const_adjust amount before calling
                   1492:                           emit_unrolled_add below.  */
                   1493:                        value = plus_constant (tv->dest_reg, tv->const_adjust);
                   1494: 
                   1495:                        /* The constant could be too large for an add
                   1496:                           immediate, so can't directly emit an insn here.  */
                   1497:                        emit_unrolled_add (dest_reg, XEXP (value, 0),
                   1498:                                           XEXP (value, 1));
                   1499:                        
                   1500:                        /* Reset the giv to be just the register again, in case
1.1.1.2   root     1501:                           it is used after the set we have just emitted.
                   1502:                           We must subtract the const_adjust factor added in
                   1503:                           above.  */
                   1504:                        tv->dest_reg = plus_constant (dest_reg,
                   1505:                                                      - tv->const_adjust);
1.1       root     1506:                        *tv->location = tv->dest_reg;
                   1507:                      }
                   1508:                  }
                   1509:            }
                   1510:          
                   1511:          /* If this is a setting of a splittable variable, then determine
                   1512:             how to split the variable, create a new set based on this split,
                   1513:             and set up the reg_map so that later uses of the variable will
                   1514:             use the new split variable.  */
                   1515:          
                   1516:          dest_reg_was_split = 0;
                   1517:          
                   1518:          if (GET_CODE (pattern) == SET
                   1519:              && GET_CODE (SET_DEST (pattern)) == REG
                   1520:              && splittable_regs[REGNO (SET_DEST (pattern))])
                   1521:            {
                   1522:              int regno = REGNO (SET_DEST (pattern));
                   1523:              
                   1524:              dest_reg_was_split = 1;
                   1525:              
                   1526:              /* Compute the increment value for the giv, if it wasn't
                   1527:                 already computed above.  */
                   1528: 
                   1529:              if (giv_inc == 0)
                   1530:                giv_inc = calculate_giv_inc (pattern, insn, regno);
                   1531:              giv_dest_reg = SET_DEST (pattern);
                   1532:              giv_src_reg = SET_DEST (pattern);
                   1533: 
                   1534:              if (unroll_type == UNROLL_COMPLETELY)
                   1535:                {
                   1536:                  /* Completely unrolling the loop.  Set the induction
                   1537:                     variable to a known constant value.  */
                   1538:                  
                   1539:                  /* The value in splittable_regs may be an invariant
                   1540:                     value, so we must use plus_constant here.  */
                   1541:                  splittable_regs[regno]
                   1542:                    = plus_constant (splittable_regs[regno], INTVAL (giv_inc));
                   1543: 
                   1544:                  if (GET_CODE (splittable_regs[regno]) == PLUS)
                   1545:                    {
                   1546:                      giv_src_reg = XEXP (splittable_regs[regno], 0);
                   1547:                      giv_inc = XEXP (splittable_regs[regno], 1);
                   1548:                    }
                   1549:                  else
                   1550:                    {
                   1551:                      /* The splittable_regs value must be a REG or a
                   1552:                         CONST_INT, so put the entire value in the giv_src_reg
                   1553:                         variable.  */
                   1554:                      giv_src_reg = splittable_regs[regno];
                   1555:                      giv_inc = const0_rtx;
                   1556:                    }
                   1557:                }
                   1558:              else
                   1559:                {
                   1560:                  /* Partially unrolling loop.  Create a new pseudo
                   1561:                     register for the iteration variable, and set it to
                   1562:                     be a constant plus the original register.  Except
                   1563:                     on the last iteration, when the result has to
                   1564:                     go back into the original iteration var register.  */
                   1565:                  
                   1566:                  /* Handle bivs which must be mapped to a new register
                   1567:                     when split.  This happens for bivs which need their
                   1568:                     final value set before loop entry.  The new register
                   1569:                     for the biv was stored in the biv's first struct
                   1570:                     induction entry by find_splittable_regs.  */
                   1571: 
                   1572:                  if (regno < max_reg_before_loop
                   1573:                      && reg_iv_type[regno] == BASIC_INDUCT)
                   1574:                    {
                   1575:                      giv_src_reg = reg_biv_class[regno]->biv->src_reg;
                   1576:                      giv_dest_reg = giv_src_reg;
                   1577:                    }
                   1578:                  
                   1579: #if 0
                   1580:                  /* If non-reduced/final-value givs were split, then
                   1581:                     this would have to remap those givs also.  See
                   1582:                     find_splittable_regs.  */
                   1583: #endif
                   1584:                  
                   1585:                  splittable_regs[regno]
                   1586:                    = gen_rtx (CONST_INT, VOIDmode,
                   1587:                               INTVAL (giv_inc)
                   1588:                               + INTVAL (splittable_regs[regno]));
                   1589:                  giv_inc = splittable_regs[regno];
                   1590:                  
                   1591:                  /* Now split the induction variable by changing the dest
                   1592:                     of this insn to a new register, and setting its
                   1593:                     reg_map entry to point to this new register.
                   1594: 
                   1595:                     If this is the last iteration, and this is the last insn
                   1596:                     that will update the iv, then reuse the original dest,
                   1597:                     to ensure that the iv will have the proper value when
                   1598:                     the loop exits or repeats.
                   1599: 
                   1600:                     Using splittable_regs_updates here like this is safe,
                   1601:                     because it can only be greater than one if all
                   1602:                     instructions modifying the iv are always executed in
                   1603:                     order.  */
                   1604: 
                   1605:                  if (! last_iteration
                   1606:                      || (splittable_regs_updates[regno]-- != 1))
                   1607:                    {
                   1608:                      tem = gen_reg_rtx (GET_MODE (giv_src_reg));
                   1609:                      giv_dest_reg = tem;
                   1610:                      map->reg_map[regno] = tem;
                   1611:                    }
                   1612:                  else
                   1613:                    map->reg_map[regno] = giv_src_reg;
                   1614:                }
                   1615: 
                   1616:              /* The constant being added could be too large for an add
                   1617:                 immediate, so can't directly emit an insn here.  */
                   1618:              emit_unrolled_add (giv_dest_reg, giv_src_reg, giv_inc);
                   1619:              copy = get_last_insn ();
                   1620:              pattern = PATTERN (copy);
                   1621:            }
                   1622:          else
                   1623:            {
                   1624:              pattern = copy_rtx_and_substitute (pattern, map);
                   1625:              copy = emit_insn (pattern);
                   1626:            }
                   1627:          /* REG_NOTES will be copied later.  */
                   1628:          
                   1629: #ifdef HAVE_cc0
                   1630:          /* If this insn is setting CC0, it may need to look at
                   1631:             the insn that uses CC0 to see what type of insn it is.
                   1632:             In that case, the call to recog via validate_change will
                   1633:             fail.  So don't substitute constants here.  Instead,
                   1634:             do it when we emit the following insn.
                   1635: 
                   1636:             For example, see the pyr.md file.  That machine has signed and
                   1637:             unsigned compares.  The compare patterns must check the
                   1638:             following branch insn to see which what kind of compare to
                   1639:             emit.
                   1640: 
                   1641:             If the previous insn set CC0, substitute constants on it as
                   1642:             well.  */
                   1643:          if (sets_cc0_p (copy) != 0)
                   1644:            cc0_insn = copy;
                   1645:          else
                   1646:            {
                   1647:              if (cc0_insn)
                   1648:                try_constants (cc0_insn, map);
                   1649:              cc0_insn = 0;
                   1650:              try_constants (copy, map);
                   1651:            }
                   1652: #else
                   1653:          try_constants (copy, map);
                   1654: #endif
                   1655: 
                   1656:          /* Make split induction variable constants `permanent' since we
                   1657:             know there are no backward branches across iteration variable
                   1658:             settings which would invalidate this.  */
                   1659:          if (dest_reg_was_split)
                   1660:            {
                   1661:              int regno = REGNO (SET_DEST (pattern));
                   1662: 
                   1663:              if (map->const_age_map[regno] == map->const_age)
                   1664:                map->const_age_map[regno] = -1;
                   1665:            }
                   1666:          break;
                   1667:          
                   1668:        case JUMP_INSN:
                   1669:          if (JUMP_LABEL (insn) == start_label && insn == copy_end
                   1670:              && ! last_iteration)
                   1671:            {
                   1672:              /* This is a branch to the beginning of the loop; this is the
                   1673:                 last insn being copied; and this is not the last iteration.
                   1674:                 In this case, we want to change the original fall through
                   1675:                 case to be a branch past the end of the loop, and the
                   1676:                 original jump label case to fall_through.  */
                   1677: 
                   1678:              int fall_through;
                   1679: 
                   1680:              /* Never map the label in this case.  */
                   1681:              pattern = copy_rtx (PATTERN (insn));
                   1682:              
                   1683:              /* Assume a conditional branch, since the code above
                   1684:                 does not let unconditional branches be copied.  */
                   1685:              if (! condjump_p (insn))
                   1686:                abort ();
                   1687:              fall_through
                   1688:                = (XEXP (SET_SRC (PATTERN (insn)), 2) == pc_rtx) + 1;
                   1689: 
                   1690:              /* Set the fall through case to the exit label.  Must
                   1691:                 create a new label_ref since they can't be shared.  */
                   1692:              XEXP (SET_SRC (pattern), fall_through)
                   1693:                = gen_rtx (LABEL_REF, VOIDmode, exit_label);
                   1694:                      
                   1695:              /* Set the original branch case to fall through.  */
                   1696:              XEXP (SET_SRC (pattern), 3 - fall_through)
                   1697:                = pc_rtx;
                   1698:            }
                   1699:          else
                   1700:            pattern = copy_rtx_and_substitute (PATTERN (insn), map);
                   1701:          
                   1702:          copy = emit_jump_insn (pattern);
                   1703:          
                   1704: #ifdef HAVE_cc0
                   1705:          if (cc0_insn)
                   1706:            try_constants (cc0_insn, map);
                   1707:          cc0_insn = 0;
                   1708: #endif
                   1709:          try_constants (copy, map);
                   1710: 
                   1711:          /* Set the jump label of COPY correctly to avoid problems with
                   1712:             later passes of unroll_loop, if INSN had jump label set.  */
                   1713:          if (JUMP_LABEL (insn))
                   1714:            {
                   1715:              /* Can't use the label_map for every insn, since this may be
                   1716:                 the backward branch, and hence the label was not mapped.  */
                   1717:              if (GET_CODE (pattern) == SET)
                   1718:                {
                   1719:                  tem = SET_SRC (pattern);
                   1720:                  if (GET_CODE (tem) == LABEL_REF)
                   1721:                    JUMP_LABEL (copy) = XEXP (tem, 0);
                   1722:                  else if (GET_CODE (tem) == IF_THEN_ELSE)
                   1723:                    {
                   1724:                      if (XEXP (tem, 1) != pc_rtx)
                   1725:                        JUMP_LABEL (copy) = XEXP (XEXP (tem, 1), 0);
                   1726:                      else
                   1727:                        JUMP_LABEL (copy) = XEXP (XEXP (tem, 2), 0);
                   1728:                    }
                   1729:                  else
                   1730:                    abort ();
                   1731:                }
                   1732:              else
                   1733:                {
                   1734:                  /* An unrecognizable jump insn, probably the entry jump
                   1735:                     for a switch statement.  This label must have been mapped,
                   1736:                     so just use the label_map to get the new jump label.  */
                   1737:                  JUMP_LABEL (copy) = map->label_map[CODE_LABEL_NUMBER
                   1738:                                                     (JUMP_LABEL (insn))];
                   1739:                }
                   1740:          
                   1741:              /* If this is a non-local jump, then must increase the label
                   1742:                 use count so that the label will not be deleted when the
                   1743:                 original jump is deleted.  */
                   1744:              LABEL_NUSES (JUMP_LABEL (copy))++;
                   1745:            }
                   1746:          else if (GET_CODE (PATTERN (copy)) == ADDR_VEC
                   1747:                   || GET_CODE (PATTERN (copy)) == ADDR_DIFF_VEC)
                   1748:            {
                   1749:              rtx pat = PATTERN (copy);
                   1750:              int diff_vec_p = GET_CODE (pat) == ADDR_DIFF_VEC;
                   1751:              int len = XVECLEN (pat, diff_vec_p);
                   1752:              int i;
                   1753: 
                   1754:              for (i = 0; i < len; i++)
                   1755:                LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0))++;
                   1756:            }
                   1757: 
                   1758:          /* If this used to be a conditional jump insn but whose branch
                   1759:             direction is now known, we must do something special.  */
                   1760:          if (condjump_p (insn) && !simplejump_p (insn) && map->last_pc_value)
                   1761:            {
                   1762: #ifdef HAVE_cc0
                   1763:              /* The previous insn set cc0 for us.  So delete it.  */
                   1764:              delete_insn (PREV_INSN (copy));
                   1765: #endif
                   1766: 
                   1767:              /* If this is now a no-op, delete it.  */
                   1768:              if (map->last_pc_value == pc_rtx)
                   1769:                {
                   1770:                  delete_insn (copy);
                   1771:                  copy = 0;
                   1772:                }
                   1773:              else
                   1774:                /* Otherwise, this is unconditional jump so we must put a
                   1775:                   BARRIER after it.  We could do some dead code elimination
                   1776:                   here, but jump.c will do it just as well.  */
                   1777:                emit_barrier ();
                   1778:            }
                   1779:          break;
                   1780:          
                   1781:        case CALL_INSN:
                   1782:          pattern = copy_rtx_and_substitute (PATTERN (insn), map);
                   1783:          copy = emit_call_insn (pattern);
                   1784: 
                   1785: #ifdef HAVE_cc0
                   1786:          if (cc0_insn)
                   1787:            try_constants (cc0_insn, map);
                   1788:          cc0_insn = 0;
                   1789: #endif
                   1790:          try_constants (copy, map);
                   1791: 
                   1792:          /* Be lazy and assume CALL_INSNs clobber all hard registers.  */
                   1793:          for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
                   1794:            map->const_equiv_map[i] = 0;
                   1795:          break;
                   1796:          
                   1797:        case CODE_LABEL:
                   1798:          /* If this is the loop start label, then we don't need to emit a
                   1799:             copy of this label since no one will use it.  */
                   1800: 
                   1801:          if (insn != start_label)
                   1802:            {
                   1803:              copy = emit_label (map->label_map[CODE_LABEL_NUMBER (insn)]);
                   1804:              map->const_age++;
                   1805:            }
                   1806:          break;
                   1807:          
                   1808:        case BARRIER:
                   1809:          copy = emit_barrier ();
                   1810:          break;
                   1811:          
                   1812:        case NOTE:
                   1813:          if (NOTE_LINE_NUMBER (insn) != NOTE_INSN_DELETED)
                   1814:            copy = emit_note (NOTE_SOURCE_FILE (insn),
                   1815:                              NOTE_LINE_NUMBER (insn));
                   1816:          else
                   1817:            copy = 0;
                   1818:          break;
                   1819:          
                   1820:        default:
                   1821:          abort ();
                   1822:          break;
                   1823:        }
                   1824:       
                   1825:       map->insn_map[INSN_UID (insn)] = copy;
                   1826:     }
                   1827:   while (insn != copy_end);
                   1828:   
                   1829:   /* Now copy the REG_NOTES.  */
                   1830:   insn = copy_start;
                   1831:   do
                   1832:     {
                   1833:       insn = NEXT_INSN (insn);
                   1834:       if ((GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
                   1835:           || GET_CODE (insn) == CALL_INSN)
                   1836:          && map->insn_map[INSN_UID (insn)])
                   1837:        REG_NOTES (map->insn_map[INSN_UID (insn)])
                   1838:          = copy_rtx_and_substitute (REG_NOTES (insn), map);
                   1839:     }
                   1840:   while (insn != copy_end);
                   1841: 
                   1842:   /* There may be notes between copy_notes_from and loop_end.  Emit a copy of
                   1843:      each of these notes here, since there may be some important ones, such as
                   1844:      NOTE_INSN_BLOCK_END notes, in this group.  We don't do this on the last
                   1845:      iteration, because the original notes won't be deleted.
                   1846: 
                   1847:      We can't use insert_before here, because when from preconditioning,
                   1848:      insert_before points before the loop.  We can't use copy_end, because
                   1849:      there may be insns already inserted after it (which we don't want to
                   1850:      copy) when not from preconditioning code.  */
                   1851: 
                   1852:   if (! last_iteration)
                   1853:     {
                   1854:       for (insn = copy_notes_from; insn != loop_end; insn = NEXT_INSN (insn))
                   1855:        {
                   1856:          if (GET_CODE (insn) == NOTE
                   1857:              && NOTE_LINE_NUMBER (insn) != NOTE_INSN_DELETED)
                   1858:            emit_note (NOTE_SOURCE_FILE (insn), NOTE_LINE_NUMBER (insn));
                   1859:        }
                   1860:     }
                   1861: 
                   1862:   if (final_label && LABEL_NUSES (final_label) > 0)
                   1863:     emit_label (final_label);
                   1864: 
                   1865:   tem = gen_sequence ();
                   1866:   end_sequence ();
                   1867:   emit_insn_before (tem, insert_before);
                   1868: }
                   1869: 
                   1870: /* Emit an insn, using the expand_binop to ensure that a valid insn is
                   1871:    emitted.  This will correctly handle the case where the increment value
                   1872:    won't fit in the immediate field of a PLUS insns.  */
                   1873: 
                   1874: void
                   1875: emit_unrolled_add (dest_reg, src_reg, increment)
                   1876:      rtx dest_reg, src_reg, increment;
                   1877: {
                   1878:   rtx result;
                   1879: 
                   1880:   result = expand_binop (GET_MODE (dest_reg), add_optab, src_reg, increment,
                   1881:                         dest_reg, 0, OPTAB_LIB_WIDEN);
                   1882: 
                   1883:   if (dest_reg != result)
                   1884:     emit_move_insn (dest_reg, result);
                   1885: }
                   1886: 
                   1887: /* Searches the insns between INSN and LOOP_END.  Returns 1 if there
                   1888:    is a backward branch in that range that branches to somewhere between
                   1889:    LOOP_START and INSN.  Returns 0 otherwise.  */
                   1890: 
1.1.1.3 ! root     1891: /* ??? This is quadratic algorithm.  Could be rewritten to be linear.
1.1       root     1892:    In practice, this is not a problem, because this function is seldom called,
                   1893:    and uses a negligible amount of CPU time on average.  */
                   1894: 
                   1895: static int
                   1896: back_branch_in_range_p (insn, loop_start, loop_end)
                   1897:      rtx insn;
                   1898:      rtx loop_start, loop_end;
                   1899: {
                   1900:   rtx p, q, target_insn;
                   1901: 
                   1902:   /* Stop before we get to the backward branch at the end of the loop.  */
                   1903:   loop_end = prev_nonnote_insn (loop_end);
                   1904:   if (GET_CODE (loop_end) == BARRIER)
                   1905:     loop_end = PREV_INSN (loop_end);
                   1906: 
                   1907:   /* Check in case insn has been deleted, search forward for first non
                   1908:      deleted insn following it.  */
                   1909:   while (INSN_DELETED_P (insn))
                   1910:     insn = NEXT_INSN (insn);
                   1911: 
                   1912:   /* Check for the case where insn is the last insn in the loop.  */
                   1913:   if (insn == loop_end)
                   1914:     return 0;
                   1915: 
                   1916:   for (p = NEXT_INSN (insn); p != loop_end; p = NEXT_INSN (p))
                   1917:     {
                   1918:       if (GET_CODE (p) == JUMP_INSN)
                   1919:        {
                   1920:          target_insn = JUMP_LABEL (p);
                   1921:          
                   1922:          /* Search from loop_start to insn, to see if one of them is
                   1923:             the target_insn.  We can't use INSN_LUID comparisons here,
                   1924:             since insn may not have an LUID entry.  */
                   1925:          for (q = loop_start; q != insn; q = NEXT_INSN (q))
                   1926:            if (q == target_insn)
                   1927:              return 1;
                   1928:        }
                   1929:     }
                   1930: 
                   1931:   return 0;
                   1932: }
                   1933: 
                   1934: /* Try to generate the simplest rtx for the expression
                   1935:    (PLUS (MULT mult1 mult2) add1).  This is used to calculate the initial
                   1936:    value of giv's.  */
                   1937: 
                   1938: static rtx
                   1939: fold_rtx_mult_add (mult1, mult2, add1, mode)
                   1940:      rtx mult1, mult2, add1;
                   1941:      enum machine_mode mode;
                   1942: {
                   1943:   rtx temp, mult_res;
                   1944:   rtx result;
                   1945: 
                   1946:   /* The modes must all be the same.  This should always be true.  For now,
                   1947:      check to make sure.  */
                   1948:   if ((GET_MODE (mult1) != mode && GET_MODE (mult1) != VOIDmode)
                   1949:       || (GET_MODE (mult2) != mode && GET_MODE (mult2) != VOIDmode)
                   1950:       || (GET_MODE (add1) != mode && GET_MODE (add1) != VOIDmode))
                   1951:     abort ();
                   1952: 
                   1953:   /* Ensure that if at least one of mult1/mult2 are constant, then mult2
                   1954:      will be a constant.  */
                   1955:   if (GET_CODE (mult1) == CONST_INT)
                   1956:     {
                   1957:       temp = mult2;
                   1958:       mult2 = mult1;
                   1959:       mult1 = temp;
                   1960:     }
                   1961: 
                   1962:   mult_res = simplify_binary_operation (MULT, mode, mult1, mult2);
                   1963:   if (! mult_res)
                   1964:     mult_res = gen_rtx (MULT, mode, mult1, mult2);
                   1965: 
                   1966:   /* Again, put the constant second.  */
                   1967:   if (GET_CODE (add1) == CONST_INT)
                   1968:     {
                   1969:       temp = add1;
                   1970:       add1 = mult_res;
                   1971:       mult_res = temp;
                   1972:     }
                   1973: 
                   1974:   result = simplify_binary_operation (PLUS, mode, add1, mult_res);
                   1975:   if (! result)
                   1976:     result = gen_rtx (PLUS, mode, add1, mult_res);
                   1977: 
                   1978:   return result;
                   1979: }
                   1980: 
                   1981: /* Searches the list of induction struct's for the biv BL, to try to calculate
                   1982:    the total increment value for one iteration of the loop as a constant.
                   1983: 
                   1984:    Returns the increment value as an rtx, simplified as much as possible,
                   1985:    if it can be calculated.  Otherwise, returns 0.  */
                   1986: 
                   1987: rtx 
                   1988: biv_total_increment (bl, loop_start, loop_end)
                   1989:      struct iv_class *bl;
                   1990:      rtx loop_start, loop_end;
                   1991: {
                   1992:   struct induction *v;
                   1993:   rtx result;
                   1994: 
                   1995:   /* For increment, must check every instruction that sets it.  Each
                   1996:      instruction must be executed only once each time through the loop.
                   1997:      To verify this, we check that the the insn is always executed, and that
                   1998:      there are no backward branches after the insn that branch to before it.
                   1999:      Also, the insn must have a mult_val of one (to make sure it really is
                   2000:      an increment).  */
                   2001: 
                   2002:   result = const0_rtx;
                   2003:   for (v = bl->biv; v; v = v->next_iv)
                   2004:     {
                   2005:       if (v->always_computable && v->mult_val == const1_rtx
                   2006:          && ! back_branch_in_range_p (v->insn, loop_start, loop_end))
                   2007:        result = fold_rtx_mult_add (result, const1_rtx, v->add_val, v->mode);
                   2008:       else
                   2009:        return 0;
                   2010:     }
                   2011: 
                   2012:   return result;
                   2013: }
                   2014: 
                   2015: /* Determine the initial value of the iteration variable, and the amount
                   2016:    that it is incremented each loop.  Use the tables constructed by
                   2017:    the strength reduction pass to calculate these values.
                   2018: 
                   2019:    Initial_value and/or increment are set to zero if their values could not
                   2020:    be calculated.  */
                   2021: 
                   2022: static void
                   2023: iteration_info (iteration_var, initial_value, increment, loop_start, loop_end)
                   2024:      rtx iteration_var, *initial_value, *increment;
                   2025:      rtx loop_start, loop_end;
                   2026: {
                   2027:   struct iv_class *bl;
                   2028:   struct induction *v, *b;
                   2029: 
                   2030:   /* Clear the result values, in case no answer can be found.  */
                   2031:   *initial_value = 0;
                   2032:   *increment = 0;
                   2033: 
                   2034:   /* The iteration variable can be either a giv or a biv.  Check to see
                   2035:      which it is, and compute the variable's initial value, and increment
                   2036:      value if possible.  */
                   2037: 
                   2038:   /* If this is a new register, can't handle it since we don't have any
                   2039:      reg_iv_type entry for it.  */
                   2040:   if (REGNO (iteration_var) >= max_reg_before_loop)
                   2041:     {
                   2042:       if (loop_dump_stream)
                   2043:        fprintf (loop_dump_stream,
                   2044:                 "Loop unrolling: No reg_iv_type entry for iteration var.\n");
                   2045:       return;
                   2046:     }
                   2047:   /* Reject iteration variables larger than the host long size, since they
                   2048:      could result in a number of iterations greater than the range of our
                   2049:      `unsigned long' variable loop_n_iterations.  */
                   2050:   else if (GET_MODE_BITSIZE (GET_MODE (iteration_var)) > HOST_BITS_PER_LONG)
                   2051:     {
                   2052:       if (loop_dump_stream)
                   2053:        fprintf (loop_dump_stream,
                   2054:                 "Loop unrolling: Iteration var rejected because mode larger than host long.\n");
                   2055:       return;
                   2056:     }
                   2057:   else if (GET_MODE_CLASS (GET_MODE (iteration_var)) != MODE_INT)
                   2058:     {
                   2059:       if (loop_dump_stream)
                   2060:        fprintf (loop_dump_stream,
1.1.1.2   root     2061:                 "Loop unrolling: Iteration var not an integer.\n");
1.1       root     2062:       return;
                   2063:     }
                   2064:   else if (reg_iv_type[REGNO (iteration_var)] == BASIC_INDUCT)
                   2065:     {
                   2066:       /* Grab initial value, only useful if it is a constant.  */
                   2067:       bl = reg_biv_class[REGNO (iteration_var)];
                   2068:       *initial_value = bl->initial_value;
                   2069: 
                   2070:       *increment = biv_total_increment (bl, loop_start, loop_end);
                   2071:     }
                   2072:   else if (reg_iv_type[REGNO (iteration_var)] == GENERAL_INDUCT)
                   2073:     {
                   2074: #if 1
                   2075:       /* ??? The code below does not work because the incorrect number of
                   2076:         iterations is calculated when the biv is incremented after the giv
                   2077:         is set (which is the usual case).  This can probably be accounted
                   2078:         for by biasing the initial_value by subtracting the amount of the
                   2079:         increment that occurs between the giv set and the giv test.  However,
                   2080:         a giv as an iterator is very rare, so it does not seem worthwhile
                   2081:         to handle this.  */
                   2082:       /* ??? An example failure is: i = 6; do {;} while (i++ < 9).  */
                   2083:       if (loop_dump_stream)
                   2084:        fprintf (loop_dump_stream,
                   2085:                 "Loop unrolling: Giv iterators are not handled.\n");
                   2086:       return;
                   2087: #else
                   2088:       /* Initial value is mult_val times the biv's initial value plus
                   2089:         add_val.  Only useful if it is a constant.  */
                   2090:       v = reg_iv_info[REGNO (iteration_var)];
                   2091:       bl = reg_biv_class[REGNO (v->src_reg)];
                   2092:       *initial_value = fold_rtx_mult_add (v->mult_val, bl->initial_value,
                   2093:                                          v->add_val, v->mode);
                   2094:       
                   2095:       /* Increment value is mult_val times the increment value of the biv.  */
                   2096: 
                   2097:       *increment = biv_total_increment (bl, loop_start, loop_end);
                   2098:       if (*increment)
                   2099:        *increment = fold_rtx_mult_add (v->mult_val, *increment, const0_rtx,
                   2100:                                        v->mode);
                   2101: #endif
                   2102:     }
                   2103:   else
                   2104:     {
                   2105:       if (loop_dump_stream)
                   2106:        fprintf (loop_dump_stream,
                   2107:                 "Loop unrolling: Not basic or general induction var.\n");
                   2108:       return;
                   2109:     }
                   2110: }
                   2111: 
                   2112: /* Calculate the approximate final value of the iteration variable
                   2113:    which has an loop exit test with code COMPARISON_CODE and comparison value
                   2114:    of COMPARISON_VALUE.  Also returns an indication of whether the comparison
                   2115:    was signed or unsigned, and the direction of the comparison.  This info is
                   2116:    needed to calculate the number of loop iterations.  */
                   2117: 
                   2118: static rtx
                   2119: approx_final_value (comparison_code, comparison_value, unsigned_p, compare_dir)
                   2120:      enum rtx_code comparison_code;
                   2121:      rtx comparison_value;
                   2122:      int *unsigned_p;
                   2123:      int *compare_dir;
                   2124: {
                   2125:   /* Calculate the final value of the induction variable.
                   2126:      The exact final value depends on the branch operator, and increment sign.
                   2127:      This is only an approximate value.  It will be wrong if the iteration
                   2128:      variable is not incremented by one each time through the loop, and
                   2129:      approx final value - start value % increment != 0.  */
                   2130: 
                   2131:   *unsigned_p = 0;
                   2132:   switch (comparison_code)
                   2133:     {
                   2134:     case LEU:
                   2135:       *unsigned_p = 1;
                   2136:     case LE:
                   2137:       *compare_dir = 1;
                   2138:       return plus_constant (comparison_value, 1);
                   2139:     case GEU:
                   2140:       *unsigned_p = 1;
                   2141:     case GE:
                   2142:       *compare_dir = -1;
                   2143:       return plus_constant (comparison_value, -1);
                   2144:     case EQ:
                   2145:       /* Can not calculate a final value for this case.  */
                   2146:       *compare_dir = 0;
                   2147:       return 0;
                   2148:     case LTU:
                   2149:       *unsigned_p = 1;
                   2150:     case LT:
                   2151:       *compare_dir = 1;
                   2152:       return comparison_value;
                   2153:       break;
                   2154:     case GTU:
                   2155:       *unsigned_p = 1;
                   2156:     case GT:
                   2157:       *compare_dir = -1;
                   2158:       return comparison_value;
                   2159:     case NE:
                   2160:       *compare_dir = 0;
                   2161:       return comparison_value;
                   2162:     default:
                   2163:       abort ();
                   2164:     }
                   2165: }
                   2166: 
                   2167: /* For each biv and giv, determine whether it can be safely split into
                   2168:    a different variable for each unrolled copy of the loop body.  If it
                   2169:    is safe to split, then indicate that by saving some useful info
                   2170:    in the splittable_regs array.
                   2171: 
                   2172:    If the loop is being completely unrolled, then splittable_regs will hold
                   2173:    the current value of the induction variable while the loop is unrolled.
                   2174:    It must be set to the initial value of the induction variable here.
                   2175:    Otherwise, splittable_regs will hold the difference between the current
                   2176:    value of the induction variable and the value the induction variable had
                   2177:    at the top of the loop.  It must be set to the value 0 here.  */
                   2178: 
                   2179: /* ?? If the loop is only unrolled twice, then most of the restrictions to
                   2180:    constant values are unnecessary, since we can easily calculate increment
                   2181:    values in this case even if nothing is constant.  The increment value
                   2182:    should not involve a multiply however.  */
                   2183: 
                   2184: /* ?? Even if the biv/giv increment values aren't constant, it may still
                   2185:    be beneficial to split the variable if the loop is only unrolled a few
                   2186:    times, since multiplies by small integers (1,2,3,4) are very cheap.  */
                   2187: 
                   2188: static int
                   2189: find_splittable_regs (unroll_type, loop_start, loop_end, end_insert_before,
                   2190:                     unroll_number)
                   2191:      enum unroll_types unroll_type;
                   2192:      rtx loop_start, loop_end;
                   2193:      rtx end_insert_before;
                   2194:      int unroll_number;
                   2195: {
                   2196:   struct iv_class *bl;
                   2197:   rtx increment, tem;
                   2198:   rtx biv_final_value;
                   2199:   int biv_splittable;
                   2200:   int result = 0;
                   2201: 
                   2202:   for (bl = loop_iv_list; bl; bl = bl->next)
                   2203:     {
                   2204:       /* Biv_total_increment must return a constant value,
                   2205:         otherwise we can not calculate the split values.  */
                   2206: 
                   2207:       increment = biv_total_increment (bl, loop_start, loop_end);
                   2208:       if (! increment || GET_CODE (increment) != CONST_INT)
                   2209:        continue;
                   2210: 
                   2211:       /* The loop must be unrolled completely, or else have a known number
                   2212:         of iterations and only one exit, or else the biv must be dead
                   2213:         outside the loop, or else the final value must be known.  Otherwise,
                   2214:         it is unsafe to split the biv since it may not have the proper
                   2215:         value on loop exit.  */
                   2216: 
                   2217:       /* loop_number_exit_labels is non-zero if the loop has an exit other than
                   2218:         a fall through at the end.  */
                   2219: 
                   2220:       biv_splittable = 1;
                   2221:       biv_final_value = 0;
                   2222:       if (unroll_type != UNROLL_COMPLETELY
                   2223:          && (loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]]
                   2224:              || unroll_type == UNROLL_NAIVE)
                   2225:          && (uid_luid[regno_last_uid[bl->regno]] >= INSN_LUID (loop_end)
                   2226:              || ! bl->init_insn
                   2227:              || INSN_UID (bl->init_insn) >= max_uid_for_loop
                   2228:              || (uid_luid[regno_first_uid[bl->regno]]
                   2229:                  < INSN_LUID (bl->init_insn))
                   2230:              || reg_mentioned_p (bl->biv->dest_reg, SET_SRC (bl->init_set)))
                   2231:          && ! (biv_final_value = final_biv_value (bl, loop_start, loop_end)))
                   2232:        biv_splittable = 0;
                   2233: 
                   2234:       /* If final value is non-zero, then must emit an instruction which sets
                   2235:         the value of the biv to the proper value.  This is done after
                   2236:         handling all of the givs, since some of them may need to use the
                   2237:         biv's value in their initialization code.  */
                   2238: 
                   2239:       /* This biv is splittable.  If completely unrolling the loop, save
                   2240:         the biv's initial value.  Otherwise, save the constant zero.  */
                   2241: 
                   2242:       if (biv_splittable == 1)
                   2243:        {
                   2244:          if (unroll_type == UNROLL_COMPLETELY)
                   2245:            {
                   2246:              /* If the initial value of the biv is itself (i.e. it is too
                   2247:                 complicated for strength_reduce to compute), or is a hard
1.1.1.2   root     2248:                 register, then we must create a new pseudo reg to hold the
1.1       root     2249:                 initial value of the biv.  */
                   2250: 
                   2251:              if (GET_CODE (bl->initial_value) == REG
                   2252:                  && (REGNO (bl->initial_value) == bl->regno
                   2253:                      || REGNO (bl->initial_value) < FIRST_PSEUDO_REGISTER))
                   2254:                {
                   2255:                  rtx tem = gen_reg_rtx (bl->biv->mode);
                   2256:                  
                   2257:                  emit_insn_before (gen_move_insn (tem, bl->biv->src_reg),
                   2258:                                    loop_start);
                   2259: 
                   2260:                  if (loop_dump_stream)
                   2261:                    fprintf (loop_dump_stream, "Biv %d initial value remapped to %d.\n",
                   2262:                             bl->regno, REGNO (tem));
                   2263: 
                   2264:                  splittable_regs[bl->regno] = tem;
                   2265:                }
                   2266:              else
                   2267:                splittable_regs[bl->regno] = bl->initial_value;
                   2268:            }
                   2269:          else
                   2270:            splittable_regs[bl->regno] = const0_rtx;
                   2271: 
                   2272:          /* Save the number of instructions that modify the biv, so that
                   2273:             we can treat the last one specially.  */
                   2274: 
                   2275:          splittable_regs_updates[bl->regno] = bl->biv_count;
                   2276: 
                   2277:          result++;
                   2278: 
                   2279:          if (loop_dump_stream)
                   2280:            fprintf (loop_dump_stream,
                   2281:                     "Biv %d safe to split.\n", bl->regno);
                   2282:        }
                   2283: 
                   2284:       /* Check every giv that depends on this biv to see whether it is
                   2285:         splittable also.  Even if the biv isn't splittable, givs which
                   2286:         depend on it may be splittable if the biv is live outside the
                   2287:         loop, and the givs aren't.  */
                   2288: 
                   2289:       result = find_splittable_givs (bl, unroll_type, loop_start, loop_end,
                   2290:                                     increment, unroll_number, result);
                   2291: 
                   2292:       /* If final value is non-zero, then must emit an instruction which sets
                   2293:         the value of the biv to the proper value.  This is done after
                   2294:         handling all of the givs, since some of them may need to use the
                   2295:         biv's value in their initialization code.  */
                   2296:       if (biv_final_value)
                   2297:        {
                   2298:          /* If the loop has multiple exits, emit the insns before the
                   2299:             loop to ensure that it will always be executed no matter
                   2300:             how the loop exits.  Otherwise emit the insn after the loop,
                   2301:             since this is slightly more efficient.  */
                   2302:          if (! loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]])
                   2303:            emit_insn_before (gen_move_insn (bl->biv->src_reg,
                   2304:                                             biv_final_value),
                   2305:                              end_insert_before);
                   2306:          else
                   2307:            {
                   2308:              /* Create a new register to hold the value of the biv, and then
                   2309:                 set the biv to its final value before the loop start.  The biv
                   2310:                 is set to its final value before loop start to ensure that
                   2311:                 this insn will always be executed, no matter how the loop
                   2312:                 exits.  */
                   2313:              rtx tem = gen_reg_rtx (bl->biv->mode);
                   2314:              emit_insn_before (gen_move_insn (tem, bl->biv->src_reg),
                   2315:                                loop_start);
                   2316:              emit_insn_before (gen_move_insn (bl->biv->src_reg,
                   2317:                                               biv_final_value),
                   2318:                                loop_start);
                   2319: 
                   2320:              if (loop_dump_stream)
                   2321:                fprintf (loop_dump_stream, "Biv %d mapped to %d for split.\n",
                   2322:                         REGNO (bl->biv->src_reg), REGNO (tem));
                   2323: 
                   2324:              /* Set up the mapping from the original biv register to the new
                   2325:                 register.  */
                   2326:              bl->biv->src_reg = tem;
                   2327:            }
                   2328:        }
                   2329:     }
                   2330:   return result;
                   2331: }
                   2332: 
                   2333: /* For every giv based on the biv BL, check to determine whether it is
                   2334:    splittable.  This is a subroutine to find_splittable_regs ().  */
                   2335: 
                   2336: static int
                   2337: find_splittable_givs (bl, unroll_type, loop_start, loop_end, increment,
                   2338:                      unroll_number, result)
                   2339:      struct iv_class *bl;
                   2340:      enum unroll_types unroll_type;
                   2341:      rtx loop_start, loop_end;
                   2342:      rtx increment;
                   2343:      int unroll_number, result;
                   2344: {
                   2345:   struct induction *v;
                   2346:   rtx final_value;
                   2347:   rtx tem;
                   2348: 
                   2349:   for (v = bl->giv; v; v = v->next_iv)
                   2350:     {
                   2351:       rtx giv_inc, value;
                   2352: 
                   2353:       /* Only split the giv if it has already been reduced, or if the loop is
                   2354:         being completely unrolled.  */
                   2355:       if (unroll_type != UNROLL_COMPLETELY && v->ignore)
                   2356:        continue;
                   2357: 
                   2358:       /* The giv can be split if the insn that sets the giv is executed once
                   2359:         and only once on every iteration of the loop.  */
                   2360:       /* An address giv can always be split.  v->insn is just a use not a set,
                   2361:         and hence it does not matter whether it is always executed.  All that
                   2362:         matters is that all the biv increments are always executed, and we
                   2363:         won't reach here if they aren't.  */
                   2364:       if (v->giv_type != DEST_ADDR
                   2365:          && (! v->always_computable
                   2366:              || back_branch_in_range_p (v->insn, loop_start, loop_end)))
                   2367:        continue;
                   2368:       
                   2369:       /* The giv increment value must be a constant.  */
                   2370:       giv_inc = fold_rtx_mult_add (v->mult_val, increment, const0_rtx,
                   2371:                                   v->mode);
                   2372:       if (! giv_inc || GET_CODE (giv_inc) != CONST_INT)
                   2373:        continue;
                   2374: 
                   2375:       /* The loop must be unrolled completely, or else have a known number of
                   2376:         iterations and only one exit, or else the giv must be dead outside
                   2377:         the loop, or else the final value of the giv must be known.
                   2378:         Otherwise, it is not safe to split the giv since it may not have the
                   2379:         proper value on loop exit.  */
                   2380:          
                   2381:       /* The used outside loop test will fail for DEST_ADDR givs.  They are
                   2382:         never used outside the loop anyways, so it is always safe to split a
                   2383:         DEST_ADDR giv.  */
                   2384: 
                   2385:       final_value = 0;
                   2386:       if (unroll_type != UNROLL_COMPLETELY
                   2387:          && (loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]]
                   2388:              || unroll_type == UNROLL_NAIVE)
                   2389:          && v->giv_type != DEST_ADDR
                   2390:          && ((regno_first_uid[REGNO (v->dest_reg)] != INSN_UID (v->insn)
                   2391:               /* Check for the case where the pseudo is set by a shift/add
                   2392:                  sequence, in which case the first insn setting the pseudo
                   2393:                  is the first insn of the shift/add sequence.  */
                   2394:               && (! (tem = find_reg_note (v->insn, REG_RETVAL, 0))
                   2395:                   || (regno_first_uid[REGNO (v->dest_reg)]
                   2396:                       != INSN_UID (XEXP (tem, 0)))))
                   2397:              /* Line above always fails if INSN was moved by loop opt.  */
                   2398:              || (uid_luid[regno_last_uid[REGNO (v->dest_reg)]]
                   2399:                  >= INSN_LUID (loop_end)))
                   2400:          && ! (final_value = v->final_value))
                   2401:        continue;
                   2402: 
                   2403: #if 0
                   2404:       /* Currently, non-reduced/final-value givs are never split.  */
                   2405:       /* Should emit insns after the loop if possible, as the biv final value
                   2406:         code below does.  */
                   2407: 
                   2408:       /* If the final value is non-zero, and the giv has not been reduced,
                   2409:         then must emit an instruction to set the final value.  */
                   2410:       if (final_value && !v->new_reg)
                   2411:        {
                   2412:          /* Create a new register to hold the value of the giv, and then set
                   2413:             the giv to its final value before the loop start.  The giv is set
                   2414:             to its final value before loop start to ensure that this insn
                   2415:             will always be executed, no matter how we exit.  */
                   2416:          tem = gen_reg_rtx (v->mode);
                   2417:          emit_insn_before (gen_move_insn (tem, v->dest_reg), loop_start);
                   2418:          emit_insn_before (gen_move_insn (v->dest_reg, final_value),
                   2419:                            loop_start);
                   2420:          
                   2421:          if (loop_dump_stream)
                   2422:            fprintf (loop_dump_stream, "Giv %d mapped to %d for split.\n",
                   2423:                     REGNO (v->dest_reg), REGNO (tem));
                   2424:          
                   2425:          v->src_reg = tem;
                   2426:        }
                   2427: #endif
                   2428: 
                   2429:       /* This giv is splittable.  If completely unrolling the loop, save the
                   2430:         giv's initial value.  Otherwise, save the constant zero for it.  */
                   2431: 
                   2432:       if (unroll_type == UNROLL_COMPLETELY)
                   2433:        /* It is not safe to use bl->initial_value here, because it may not
                   2434:           be invariant.  It is safe to use the initial value stored in
                   2435:           the splittable_regs array.  */
                   2436:        value = fold_rtx_mult_add (v->mult_val, splittable_regs[bl->regno],
                   2437:                                   v->add_val, v->mode);
                   2438:       else
                   2439:        value = const0_rtx;
                   2440: 
                   2441:       if (v->new_reg)
                   2442:        {
1.1.1.3 ! root     2443:          /* If a giv was combined with another giv, then we can only split
        !          2444:             this giv if the giv it was combined with was reduced.  This
        !          2445:             is because the value of v->new_reg is meaningless in this
        !          2446:             case.  */
        !          2447:          if (v->same && ! v->same->new_reg)
1.1       root     2448:            {
                   2449:              if (loop_dump_stream)
                   2450:                fprintf (loop_dump_stream,
1.1.1.3 ! root     2451:                         "giv combined with unreduced giv not split.\n");
        !          2452:              continue;
        !          2453:            }
        !          2454:          /* If the giv is an address destination, it could be something other
        !          2455:             than a simple register, these have to be treated differently.  */
        !          2456:          else if (v->giv_type == DEST_REG)
        !          2457:            {
        !          2458:              /* If value is not a constant, register, or register plus
        !          2459:                 constant, then compute its value into a register before
        !          2460:                 loop start.  This prevents illegal rtx sharing, and should
        !          2461:                 generate better code.  We can use bl->initial_value here
        !          2462:                 instead of splittable_regs[bl->regno] because this code
        !          2463:                 is going before the loop start.  */
        !          2464:              if (unroll_type == UNROLL_COMPLETELY
        !          2465:                  && GET_CODE (value) != CONST_INT
        !          2466:                  && GET_CODE (value) != REG
        !          2467:                  && (GET_CODE (value) != PLUS
        !          2468:                      || GET_CODE (XEXP (value, 0)) != REG
        !          2469:                      || GET_CODE (XEXP (value, 1)) != CONST_INT))
        !          2470:                {
        !          2471:                  rtx tem = gen_reg_rtx (v->mode);
        !          2472:                  emit_iv_add_mult (bl->initial_value, v->mult_val,
        !          2473:                                    v->add_val, tem, loop_start);
        !          2474:                  value = tem;
        !          2475:                }
        !          2476:                
        !          2477:              splittable_regs[REGNO (v->new_reg)] = value;
1.1       root     2478:            }
                   2479:          else
                   2480:            {
                   2481:              /* Splitting address givs is useful since it will often allow us
                   2482:                 to eliminate some increment insns for the base giv as
                   2483:                 unnecessary.  */
                   2484: 
                   2485:              /* If the addr giv is combined with a dest_reg giv, then all
                   2486:                 references to that dest reg will be remapped, which is NOT
                   2487:                 what we want for split addr regs. We always create a new
                   2488:                 register for the split addr giv, just to be safe.  */
                   2489: 
                   2490:              /* ??? If there are multiple address givs which have been
                   2491:                 combined with the same dest_reg giv, then we may only need
                   2492:                 one new register for them.  Pulling out constants below will
                   2493:                 catch some of the common cases of this.  Currently, I leave
                   2494:                 the work of simplifying multiple address givs to the
                   2495:                 following cse pass.  */
                   2496:              
                   2497:              v->const_adjust = 0;
                   2498:              if (unroll_type != UNROLL_COMPLETELY)
                   2499:                {
                   2500:                  /* If not completely unrolling the loop, then create a new
                   2501:                     register to hold the split value of the DEST_ADDR giv.
                   2502:                     Emit insn to initialize its value before loop start.  */
                   2503:                  tem = gen_reg_rtx (v->mode);
                   2504: 
                   2505:                  /* If the address giv has a constant in its new_reg value,
                   2506:                     then this constant can be pulled out and put in value,
                   2507:                     instead of being part of the initialization code.  */
                   2508:                  
                   2509:                  if (GET_CODE (v->new_reg) == PLUS
                   2510:                      && GET_CODE (XEXP (v->new_reg, 1)) == CONST_INT)
                   2511:                    {
                   2512:                      v->dest_reg
                   2513:                        = plus_constant (tem, INTVAL (XEXP (v->new_reg,1)));
                   2514:                      
                   2515:                      /* Only succeed if this will give valid addresses.
                   2516:                         Try to validate both the first and the last
                   2517:                         address resulting from loop unrolling, if
                   2518:                         one fails, then can't do const elim here.  */
                   2519:                      if (memory_address_p (v->mode, v->dest_reg)
                   2520:                          && memory_address_p (v->mode,
                   2521:                                       plus_constant (v->dest_reg,
                   2522:                                                      INTVAL (giv_inc)
                   2523:                                                      * (unroll_number - 1))))
                   2524:                        {
                   2525:                          /* Save the negative of the eliminated const, so
                   2526:                             that we can calculate the dest_reg's increment
                   2527:                             value later.  */
                   2528:                          v->const_adjust = - INTVAL (XEXP (v->new_reg, 1));
                   2529: 
                   2530:                          v->new_reg = XEXP (v->new_reg, 0);
                   2531:                          if (loop_dump_stream)
                   2532:                            fprintf (loop_dump_stream,
                   2533:                                     "Eliminating constant from giv %d\n",
                   2534:                                     REGNO (tem));
                   2535:                        }
                   2536:                      else
                   2537:                        v->dest_reg = tem;
                   2538:                    }
                   2539:                  else
                   2540:                    v->dest_reg = tem;
                   2541:                  
                   2542:                  /* If the address hasn't been checked for validity yet, do so
                   2543:                     now, and fail completely if either the first or the last
                   2544:                     unrolled copy of the address is not a valid address.  */
                   2545:                  if (v->dest_reg == tem
                   2546:                      && (! memory_address_p (v->mode, v->dest_reg)
                   2547:                          || ! memory_address_p (v->mode,
                   2548:                                 plus_constant (v->dest_reg,
                   2549:                                                INTVAL (giv_inc)
                   2550:                                                * (unroll_number -1)))))
                   2551:                    {
                   2552:                      if (loop_dump_stream)
                   2553:                        fprintf (loop_dump_stream,
                   2554:                                 "Illegal address for giv at insn %d\n",
                   2555:                                 INSN_UID (v->insn));
                   2556:                      continue;
                   2557:                    }
                   2558:                  
                   2559:                  /* To initialize the new register, just move the value of
                   2560:                     new_reg into it.  This is not guaranteed to give a valid
                   2561:                     instruction on machines with complex addressing modes.
                   2562:                     If we can't recognize it, then delete it and emit insns
                   2563:                     to calculate the value from scratch.  */
                   2564:                  emit_insn_before (gen_rtx (SET, VOIDmode, tem,
                   2565:                                             copy_rtx (v->new_reg)),
                   2566:                                    loop_start);
                   2567:                  if (! recog_memoized (PREV_INSN (loop_start)))
                   2568:                    {
                   2569:                      delete_insn (PREV_INSN (loop_start));
                   2570:                      emit_iv_add_mult (bl->initial_value, v->mult_val,
                   2571:                                        v->add_val, tem, loop_start);
                   2572:                      if (loop_dump_stream)
                   2573:                        fprintf (loop_dump_stream,
                   2574:                                 "Illegal init insn, rewritten.\n");
                   2575:                    }
                   2576:                }
                   2577:              else
                   2578:                {
                   2579:                  v->dest_reg = value;
                   2580:                  
                   2581:                  /* Check the resulting address for validity, and fail
                   2582:                     if the resulting address would be illegal.  */
                   2583:                  if (! memory_address_p (v->mode, v->dest_reg)
                   2584:                      || ! memory_address_p (v->mode,
                   2585:                                     plus_constant (v->dest_reg,
                   2586:                                                    INTVAL (giv_inc) *
                   2587:                                                    (unroll_number -1))))
                   2588:                    {
                   2589:                      if (loop_dump_stream)
                   2590:                        fprintf (loop_dump_stream,
                   2591:                                 "Illegal address for giv at insn %d\n",
                   2592:                                 INSN_UID (v->insn));
                   2593:                      continue;
                   2594:                    }
                   2595:                }
                   2596:              
                   2597:              /* Store the value of dest_reg into the insn.  This sharing
                   2598:                 will not be a problem as this insn will always be copied
                   2599:                 later.  */
                   2600:              
                   2601:              *v->location = v->dest_reg;
                   2602:              
                   2603:              /* If this address giv is combined with a dest reg giv, then
                   2604:                 save the base giv's induction pointer so that we will be
                   2605:                 able to handle this address giv properly.  The base giv
                   2606:                 itself does not have to be splittable.  */
                   2607:              
                   2608:              if (v->same && v->same->giv_type == DEST_REG)
                   2609:                addr_combined_regs[REGNO (v->same->new_reg)] = v->same;
                   2610:              
                   2611:              if (GET_CODE (v->new_reg) == REG)
                   2612:                {
                   2613:                  /* This giv maybe hasn't been combined with any others.
                   2614:                     Make sure that it's giv is marked as splittable here.  */
                   2615:                  
                   2616:                  splittable_regs[REGNO (v->new_reg)] = value;
                   2617:                  
                   2618:                  /* Make it appear to depend upon itself, so that the
                   2619:                     giv will be properly split in the main loop above.  */
                   2620:                  if (! v->same)
                   2621:                    {
                   2622:                      v->same = v;
                   2623:                      addr_combined_regs[REGNO (v->new_reg)] = v;
                   2624:                    }
                   2625:                }
1.1.1.2   root     2626: 
1.1       root     2627:              if (loop_dump_stream)
                   2628:                fprintf (loop_dump_stream, "DEST_ADDR giv being split.\n");
                   2629:            }
                   2630:        }
                   2631:       else
                   2632:        {
                   2633: #if 0
                   2634:          /* Currently, unreduced giv's can't be split.  This is not too much
                   2635:             of a problem since unreduced giv's are not live across loop
                   2636:             iterations anyways.  When unrolling a loop completely though,
                   2637:             it makes sense to reduce&split givs when possible, as this will
                   2638:             result in simpler instructions, and will not require that a reg
                   2639:             be live across loop iterations.  */
                   2640:          
                   2641:          splittable_regs[REGNO (v->dest_reg)] = value;
                   2642:          fprintf (stderr, "Giv %d at insn %d not reduced\n",
                   2643:                   REGNO (v->dest_reg), INSN_UID (v->insn));
                   2644: #else
                   2645:          continue;
                   2646: #endif
                   2647:        }
                   2648:       
                   2649:       /* Givs are only updated once by definition.  Mark it so if this is
                   2650:         a splittable register.  Don't need to do anything for address givs
                   2651:         where this may not be a register.  */
                   2652: 
                   2653:       if (GET_CODE (v->new_reg) == REG)
                   2654:        splittable_regs_updates[REGNO (v->new_reg)] = 1;
                   2655: 
                   2656:       result++;
                   2657:       
                   2658:       if (loop_dump_stream)
                   2659:        {
                   2660:          int regnum;
                   2661:          
                   2662:          if (GET_CODE (v->dest_reg) == CONST_INT)
                   2663:            regnum = -1;
                   2664:          else if (GET_CODE (v->dest_reg) != REG)
                   2665:            regnum = REGNO (XEXP (v->dest_reg, 0));
                   2666:          else
                   2667:            regnum = REGNO (v->dest_reg);
                   2668:          fprintf (loop_dump_stream, "Giv %d at insn %d safe to split.\n",
                   2669:                   regnum, INSN_UID (v->insn));
                   2670:        }
                   2671:     }
                   2672: 
                   2673:   return result;
                   2674: }
                   2675: 
                   2676: /* Try to prove that the register is dead after the loop exits.  Trace every
                   2677:    loop exit looking for an insn that will always be executed, which sets
                   2678:    the register to some value, and appears before the first use of the register
                   2679:    is found.  If successful, then return 1, otherwise return 0.  */
                   2680: 
                   2681: /* ?? Could be made more intelligent in the handling of jumps, so that
                   2682:    it can search past if statements and other similar structures.  */
                   2683: 
                   2684: static int
                   2685: reg_dead_after_loop (reg, loop_start, loop_end)
                   2686:      rtx reg, loop_start, loop_end;
                   2687: {
                   2688:   rtx insn, label;
                   2689:   enum rtx_code code;
1.1.1.2   root     2690:   int jump_count = 0;
1.1       root     2691: 
                   2692:   /* HACK: Must also search the loop fall through exit, create a label_ref
                   2693:      here which points to the loop_end, and append the loop_number_exit_labels
                   2694:      list to it.  */
                   2695:   label = gen_rtx (LABEL_REF, VOIDmode, loop_end);
                   2696:   LABEL_NEXTREF (label)
                   2697:     = loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]];
                   2698: 
                   2699:   for ( ; label; label = LABEL_NEXTREF (label))
                   2700:     {
                   2701:       /* Succeed if find an insn which sets the biv or if reach end of
                   2702:         function.  Fail if find an insn that uses the biv, or if come to
                   2703:         a conditional jump.  */
                   2704: 
                   2705:       insn = NEXT_INSN (XEXP (label, 0));
1.1.1.2   root     2706:       while (insn)
1.1       root     2707:        {
1.1.1.2   root     2708:          code = GET_CODE (insn);
                   2709:          if (GET_RTX_CLASS (code) == 'i')
1.1       root     2710:            {
1.1.1.2   root     2711:              rtx set;
                   2712: 
                   2713:              if (reg_referenced_p (reg, PATTERN (insn)))
1.1       root     2714:                return 0;
1.1.1.2   root     2715: 
                   2716:              set = single_set (insn);
                   2717:              if (set && rtx_equal_p (SET_DEST (set), reg))
                   2718:                break;
1.1       root     2719:            }
1.1.1.2   root     2720: 
1.1       root     2721:          if (code == JUMP_INSN)
                   2722:            {
                   2723:              if (GET_CODE (PATTERN (insn)) == RETURN)
                   2724:                break;
1.1.1.2   root     2725:              else if (! simplejump_p (insn)
                   2726:                       /* Prevent infinite loop following infinite loops. */
                   2727:                       || jump_count++ > 20)
1.1       root     2728:                return 0;
                   2729:              else
1.1.1.2   root     2730:                insn = JUMP_LABEL (insn);
1.1       root     2731:            }
1.1.1.2   root     2732: 
1.1       root     2733:          insn = NEXT_INSN (insn);
                   2734:        }
                   2735:     }
                   2736: 
                   2737:   /* Success, the register is dead on all loop exits.  */
                   2738:   return 1;
                   2739: }
                   2740: 
                   2741: /* Try to calculate the final value of the biv, the value it will have at
                   2742:    the end of the loop.  If we can do it, return that value.  */
                   2743:   
                   2744: rtx
                   2745: final_biv_value (bl, loop_start, loop_end)
                   2746:      struct iv_class *bl;
                   2747:      rtx loop_start, loop_end;
                   2748: {
                   2749:   rtx increment, tem;
                   2750: 
1.1.1.2   root     2751:   /* ??? This only works for MODE_INT biv's.  Reject all others for now.  */
                   2752: 
                   2753:   if (GET_MODE_CLASS (bl->biv->mode) != MODE_INT)
                   2754:     return 0;
                   2755: 
1.1       root     2756:   /* The final value for reversed bivs must be calculated differently than
                   2757:       for ordinary bivs.  In this case, there is already an insn after the
                   2758:      loop which sets this biv's final value (if necessary), and there are
                   2759:      no other loop exits, so we can return any value.  */
                   2760:   if (bl->reversed)
                   2761:     {
                   2762:       if (loop_dump_stream)
                   2763:        fprintf (loop_dump_stream,
                   2764:                 "Final biv value for %d, reversed biv.\n", bl->regno);
                   2765:                 
                   2766:       return const0_rtx;
                   2767:     }
                   2768: 
                   2769:   /* Try to calculate the final value as initial value + (number of iterations
                   2770:      * increment).  For this to work, increment must be invariant, the only
                   2771:      exit from the loop must be the fall through at the bottom (otherwise
                   2772:      it may not have its final value when the loop exits), and the initial
                   2773:      value of the biv must be invariant.  */
                   2774: 
                   2775:   if (loop_n_iterations != 0
                   2776:       && ! loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]]
                   2777:       && invariant_p (bl->initial_value))
                   2778:     {
                   2779:       increment = biv_total_increment (bl, loop_start, loop_end);
                   2780:       
                   2781:       if (increment && invariant_p (increment))
                   2782:        {
                   2783:          /* Can calculate the loop exit value, emit insns after loop
                   2784:             end to calculate this value into a temporary register in
                   2785:             case it is needed later.  */
                   2786: 
                   2787:          tem = gen_reg_rtx (bl->biv->mode);
                   2788:          emit_iv_add_mult (increment,
                   2789:                            gen_rtx (CONST_INT, VOIDmode, loop_n_iterations),
                   2790:                            bl->initial_value, tem, NEXT_INSN (loop_end));
                   2791: 
                   2792:          if (loop_dump_stream)
                   2793:            fprintf (loop_dump_stream,
                   2794:                     "Final biv value for %d, calculated.\n", bl->regno);
                   2795:          
                   2796:          return tem;
                   2797:        }
                   2798:     }
                   2799: 
                   2800:   /* Check to see if the biv is dead at all loop exits.  */
                   2801:   if (reg_dead_after_loop (bl->biv->src_reg, loop_start, loop_end))
                   2802:     {
                   2803:       if (loop_dump_stream)
                   2804:        fprintf (loop_dump_stream,
                   2805:                 "Final biv value for %d, biv dead after loop exit.\n",
                   2806:                 bl->regno);
                   2807: 
                   2808:       return const0_rtx;
                   2809:     }
                   2810: 
                   2811:   return 0;
                   2812: }
                   2813: 
                   2814: /* Try to calculate the final value of the giv, the value it will have at
                   2815:    the end of the loop.  If we can do it, return that value.  */
                   2816: 
                   2817: rtx
                   2818: final_giv_value (v, loop_start, loop_end)
                   2819:      struct induction *v;
                   2820:      rtx loop_start, loop_end;
                   2821: {
                   2822:   struct iv_class *bl;
                   2823:   rtx reg, insn, pattern;
                   2824:   rtx increment, tem;
                   2825:   enum rtx_code code;
1.1.1.3 ! root     2826:   rtx insert_before, seq;
1.1       root     2827: 
                   2828:   bl = reg_biv_class[REGNO (v->src_reg)];
                   2829: 
                   2830:   /* The final value for givs which depend on reversed bivs must be calculated
                   2831:      differently than for ordinary givs.  In this case, there is already an
                   2832:      insn after the loop which sets this giv's final value (if necessary),
                   2833:      and there are no other loop exits, so we can return any value.  */
                   2834:   if (bl->reversed)
                   2835:     {
                   2836:       if (loop_dump_stream)
                   2837:        fprintf (loop_dump_stream,
                   2838:                 "Final giv value for %d, depends on reversed biv\n",
                   2839:                 REGNO (v->dest_reg));
                   2840:       return const0_rtx;
                   2841:     }
                   2842: 
                   2843:   /* Try to calculate the final value as a function of the biv it depends
                   2844:      upon.  The only exit from the loop must be the fall through at the bottom
                   2845:      (otherwise it may not have its final value when the loop exits).  */
                   2846:       
                   2847:   /* ??? Can calculate the final giv value by subtracting off the
                   2848:      extra biv increments times the giv's mult_val.  The loop must have
                   2849:      only one exit for this to work, but the loop iterations does not need
                   2850:      to be known.  */
                   2851: 
                   2852:   if (loop_n_iterations != 0
                   2853:       && ! loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]])
                   2854:     {
                   2855:       /* ?? It is tempting to use the biv's value here since these insns will
                   2856:         be put after the loop, and hence the biv will have its final value
                   2857:         then.  However, this fails if the biv is subsequently eliminated.
                   2858:         Perhaps determine whether biv's are eliminable before trying to
                   2859:         determine whether giv's are replaceable so that we can use the
                   2860:         biv value here if it is not eliminable.  */
                   2861: 
                   2862:       increment = biv_total_increment (bl, loop_start, loop_end);
                   2863: 
                   2864:       if (increment && invariant_p (increment))
                   2865:        {
                   2866:          /* Can calculate the loop exit value of its biv as
                   2867:             (loop_n_iterations * increment) + initial_value */
                   2868:              
                   2869:          /* The loop exit value of the giv is then
                   2870:             (final_biv_value - extra increments) * mult_val + add_val.
                   2871:             The extra increments are any increments to the biv which
                   2872:             occur in the loop after the giv's value is calculated.
                   2873:             We must search from the insn that sets the giv to the end
                   2874:             of the loop to calculate this value.  */
                   2875: 
                   2876:          insert_before = NEXT_INSN (loop_end);
                   2877: 
                   2878:          /* Put the final biv value in tem.  */
                   2879:          tem = gen_reg_rtx (bl->biv->mode);
                   2880:          emit_iv_add_mult (increment,
                   2881:                            gen_rtx (CONST_INT, VOIDmode, loop_n_iterations),
                   2882:                            bl->initial_value, tem, insert_before);
                   2883: 
                   2884:          /* Subtract off extra increments as we find them.  */
                   2885:          for (insn = NEXT_INSN (v->insn); insn != loop_end;
                   2886:               insn = NEXT_INSN (insn))
                   2887:            {
                   2888:              if (GET_CODE (insn) == INSN
                   2889:                  && GET_CODE (PATTERN (insn)) == SET
                   2890:                  && SET_DEST (PATTERN (insn)) == v->src_reg)
                   2891:                {
                   2892:                  pattern = PATTERN (insn);
                   2893:                  if (GET_CODE (SET_SRC (pattern)) != PLUS)
                   2894:                    {
                   2895:                      /* Sometimes a biv is computed in a temp reg,
                   2896:                         and then copied into the biv reg.  */
                   2897:                      pattern = PATTERN (PREV_INSN (insn));
                   2898:                      if (GET_CODE (SET_SRC (pattern)) != PLUS)
                   2899:                        abort ();
                   2900:                    }
                   2901:                  if (GET_CODE (XEXP (SET_SRC (pattern), 0)) != REG
                   2902:                      || REGNO (XEXP (SET_SRC (pattern), 0)) != bl->regno)
                   2903:                    abort ();
                   2904:                  
1.1.1.3 ! root     2905:                  start_sequence ();
1.1       root     2906:                  tem = expand_binop (GET_MODE (tem), sub_optab, tem,
                   2907:                                      XEXP (SET_SRC (pattern), 1), 0, 0,
                   2908:                                      OPTAB_LIB_WIDEN);
1.1.1.3 ! root     2909:                  seq = gen_sequence ();
        !          2910:                  end_sequence ();
        !          2911:                  emit_insn_before (seq, insert_before);
1.1       root     2912:                }
                   2913:            }
                   2914:          
                   2915:          /* Now calculate the giv's final value.  */
                   2916:          emit_iv_add_mult (tem, v->mult_val, v->add_val, tem,
                   2917:                            insert_before);
                   2918:          
                   2919:          if (loop_dump_stream)
                   2920:            fprintf (loop_dump_stream,
                   2921:                     "Final giv value for %d, calc from biv's value.\n",
                   2922:                     REGNO (v->dest_reg));
                   2923: 
                   2924:          return tem;
                   2925:        }
                   2926:     }
                   2927: 
                   2928:   /* Replaceable giv's should never reach here.  */
                   2929:   if (v->replaceable)
                   2930:     abort ();
                   2931: 
                   2932:   /* Check to see if the biv is dead at all loop exits.  */
                   2933:   if (reg_dead_after_loop (v->dest_reg, loop_start, loop_end))
                   2934:     {
                   2935:       if (loop_dump_stream)
                   2936:        fprintf (loop_dump_stream,
                   2937:                 "Final giv value for %d, giv dead after loop exit.\n",
                   2938:                 REGNO (v->dest_reg));
                   2939: 
                   2940:       return const0_rtx;
                   2941:     }
                   2942: 
                   2943:   return 0;
                   2944: }
                   2945: 
                   2946: 
                   2947: /* Calculate the number of loop iterations.  Returns the exact number of loop
1.1.1.3 ! root     2948:    iterations if it can be calculated, otherwise returns zero.  */
1.1       root     2949: 
                   2950: unsigned long
                   2951: loop_iterations (loop_start, loop_end)
                   2952:      rtx loop_start, loop_end;
                   2953: {
                   2954:   rtx comparison, comparison_value;
                   2955:   rtx iteration_var, initial_value, increment, final_value;
                   2956:   enum rtx_code comparison_code;
                   2957:   int i, increment_dir;
                   2958:   int unsigned_compare, compare_dir, final_larger;
                   2959:   unsigned long tempu;
                   2960:   rtx last_loop_insn;
                   2961: 
                   2962:   /* First find the iteration variable.  If the last insn is a conditional
                   2963:      branch, and the insn before tests a register value, make that the
                   2964:      iteration variable.  */
                   2965:   
                   2966:   loop_initial_value = 0;
                   2967:   loop_increment = 0;
                   2968:   loop_final_value = 0;
                   2969:   loop_iteration_var = 0;
                   2970: 
                   2971:   last_loop_insn = prev_nonnote_insn (loop_end);
                   2972: 
                   2973:   comparison = get_condition_for_loop (last_loop_insn);
                   2974:   if (comparison == 0)
                   2975:     {
                   2976:       if (loop_dump_stream)
                   2977:        fprintf (loop_dump_stream,
                   2978:                 "Loop unrolling: No final conditional branch found.\n");
                   2979:       return 0;
                   2980:     }
                   2981: 
                   2982:   /* ??? Get_condition may switch position of induction variable and
                   2983:      invariant register when it canonicalizes the comparison.  */
                   2984: 
                   2985:   comparison_code = GET_CODE (comparison);
                   2986:   iteration_var = XEXP (comparison, 0);
                   2987:   comparison_value = XEXP (comparison, 1);
                   2988: 
                   2989:   if (GET_CODE (iteration_var) != REG)
                   2990:     {
                   2991:       if (loop_dump_stream)
                   2992:        fprintf (loop_dump_stream,
                   2993:                 "Loop unrolling: Comparison not against register.\n");
                   2994:       return 0;
                   2995:     }
                   2996: 
                   2997:   /* Loop iterations is always called before any new registers are created
                   2998:      now, so this should never occur.  */
                   2999: 
                   3000:   if (REGNO (iteration_var) >= max_reg_before_loop)
                   3001:     abort ();
                   3002: 
                   3003:   iteration_info (iteration_var, &initial_value, &increment,
                   3004:                  loop_start, loop_end);
                   3005:   if (initial_value == 0)
                   3006:     /* iteration_info already printed a message.  */
                   3007:     return 0;
                   3008: 
                   3009:   if (increment == 0)
                   3010:     {
                   3011:       if (loop_dump_stream)
                   3012:        fprintf (loop_dump_stream,
                   3013:                 "Loop unrolling: Increment value can't be calculated.\n");
                   3014:       return 0;
                   3015:     }
                   3016:   if (GET_CODE (increment) != CONST_INT)
                   3017:     {
                   3018:       if (loop_dump_stream)
                   3019:        fprintf (loop_dump_stream,
                   3020:                 "Loop unrolling: Increment value not constant.\n");
                   3021:       return 0;
                   3022:     }
                   3023:   if (GET_CODE (initial_value) != CONST_INT)
                   3024:     {
                   3025:       if (loop_dump_stream)
                   3026:        fprintf (loop_dump_stream,
                   3027:                 "Loop unrolling: Initial value not constant.\n");
                   3028:       return 0;
                   3029:     }
                   3030: 
                   3031:   /* If the comparison value is an invariant register, then try to find
                   3032:      its value from the insns before the start of the loop.  */
                   3033: 
                   3034:   if (GET_CODE (comparison_value) == REG && invariant_p (comparison_value))
                   3035:     {
                   3036:       rtx insn, set;
                   3037:     
                   3038:       for (insn = PREV_INSN (loop_start); insn ; insn = PREV_INSN (insn))
                   3039:        {
                   3040:          if (GET_CODE (insn) == CODE_LABEL)
                   3041:            break;
                   3042: 
                   3043:          else if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
                   3044:                   && (set = single_set (insn))
                   3045:                   && (SET_DEST (set) == comparison_value))
                   3046:            {
                   3047:              rtx note = find_reg_note (insn, REG_EQUAL, 0);
                   3048: 
                   3049:              if (note && GET_CODE (XEXP (note, 0)) != EXPR_LIST)
                   3050:                comparison_value = XEXP (note, 0);
                   3051: 
                   3052:              break;
                   3053:            }
                   3054:        }
                   3055:     }
                   3056: 
                   3057:   final_value = approx_final_value (comparison_code, comparison_value,
                   3058:                                    &unsigned_compare, &compare_dir);
                   3059: 
                   3060:   /* Save the calculated values describing this loop's bounds, in case
                   3061:      precondition_loop_p will need them later.  These values can not be
                   3062:      recalculated inside precondition_loop_p because strength reduction
                   3063:      optimizations may obscure the loop's structure.  */
                   3064: 
                   3065:   loop_iteration_var = iteration_var;
                   3066:   loop_initial_value = initial_value;
                   3067:   loop_increment = increment;
                   3068:   loop_final_value = final_value;
                   3069: 
                   3070:   if (final_value == 0)
                   3071:     {
                   3072:       if (loop_dump_stream)
                   3073:        fprintf (loop_dump_stream,
                   3074:                 "Loop unrolling: EQ comparison loop.\n");
                   3075:       return 0;
                   3076:     }
                   3077:   else if (GET_CODE (final_value) != CONST_INT)
                   3078:     {
                   3079:       if (loop_dump_stream)
                   3080:        fprintf (loop_dump_stream,
                   3081:                 "Loop unrolling: Final value not constant.\n");
                   3082:       return 0;
                   3083:     }
                   3084: 
                   3085:   /* ?? Final value and initial value do not have to be constants.
                   3086:      Only their difference has to be constant.  When the iteration variable
                   3087:      is an array address, the final value and initial value might both
                   3088:      be addresses with the same base but different constant offsets.
                   3089:      Final value must be invariant for this to work.
                   3090: 
1.1.1.3 ! root     3091:      To do this, need some way to find the values of registers which are
1.1       root     3092:      invariant.  */
                   3093: 
                   3094:   /* Final_larger is 1 if final larger, 0 if they are equal, otherwise -1.  */
                   3095:   if (unsigned_compare)
                   3096:     final_larger
                   3097:       = ((unsigned) INTVAL (final_value) > (unsigned) INTVAL (initial_value)) -
                   3098:        ((unsigned) INTVAL (final_value) < (unsigned) INTVAL (initial_value));
                   3099:   else
                   3100:     final_larger = (INTVAL (final_value) > INTVAL (initial_value)) -
                   3101:       (INTVAL (final_value) < INTVAL (initial_value));
                   3102: 
                   3103:   if (INTVAL (increment) > 0)
                   3104:     increment_dir = 1;
                   3105:   else if (INTVAL (increment) == 0)
                   3106:     increment_dir = 0;
                   3107:   else
                   3108:     increment_dir = -1;
                   3109: 
                   3110:   /* There are 27 different cases: compare_dir = -1, 0, 1;
                   3111:      final_larger = -1, 0, 1; increment_dir = -1, 0, 1.
                   3112:      There are 4 normal cases, 4 reverse cases (where the iteration variable
                   3113:      will overflow before the loop exits), 4 infinite loop cases, and 15
                   3114:      immediate exit (0 or 1 iteration depending on loop type) cases.
                   3115:      Only try to optimize the normal cases.  */
                   3116:      
                   3117:   /* (compare_dir/final_larger/increment_dir)
                   3118:      Normal cases: (0/-1/-1), (0/1/1), (-1/-1/-1), (1/1/1)
                   3119:      Reverse cases: (0/-1/1), (0/1/-1), (-1/-1/1), (1/1/-1)
                   3120:      Infinite loops: (0/-1/0), (0/1/0), (-1/-1/0), (1/1/0)
                   3121:      Immediate exit: (0/0/X), (-1/0/X), (-1/1/X), (1/0/X), (1/-1/X) */
                   3122: 
                   3123:   /* ?? If the meaning of reverse loops (where the iteration variable
                   3124:      will overflow before the loop exits) is undefined, then could
                   3125:      eliminate all of these special checks, and just always assume
                   3126:      the loops are normal/immediate/infinite.  Note that this means
                   3127:      the sign of increment_dir does not have to be known.  Also,
                   3128:      since it does not really hurt if immediate exit loops or infinite loops
                   3129:      are optimized, then that case could be ignored also, and hence all
                   3130:      loops can be optimized.
                   3131: 
                   3132:      According to ANSI Spec, the reverse loop case result is undefined,
                   3133:      because the action on overflow is undefined.
                   3134: 
                   3135:      See also the special test for NE loops below.  */
                   3136: 
                   3137:   if (final_larger == increment_dir && final_larger != 0
                   3138:       && (final_larger == compare_dir || compare_dir == 0))
                   3139:     /* Normal case.  */
                   3140:     ;
                   3141:   else
                   3142:     {
                   3143:       if (loop_dump_stream)
                   3144:        fprintf (loop_dump_stream,
                   3145:                 "Loop unrolling: Not normal loop.\n");
                   3146:       return 0;
                   3147:     }
                   3148: 
                   3149:   /* Calculate the number of iterations, final_value is only an approximation,
                   3150:      so correct for that.  Note that tempu and loop_n_iterations are
                   3151:      unsigned, because they can be as large as 2^n - 1.  */
                   3152: 
                   3153:   i = INTVAL (increment);
                   3154:   if (i > 0)
                   3155:     tempu = INTVAL (final_value) - INTVAL (initial_value);
                   3156:   else if (i < 0)
                   3157:     {
                   3158:       tempu = INTVAL (initial_value) - INTVAL (final_value);
                   3159:       i = -i;
                   3160:     }
                   3161:   else
                   3162:     abort ();
                   3163: 
                   3164:   /* For NE tests, make sure that the iteration variable won't miss the
                   3165:      final value.  If tempu mod i is not zero, then the iteration variable
                   3166:      will overflow before the loop exits, and we can not calculate the
                   3167:      number of iterations.  */
                   3168:   if (compare_dir == 0 && (tempu % i) != 0)
                   3169:     return 0;
                   3170: 
                   3171:   return tempu / i + ((tempu % i) != 0);
                   3172: }

unix.superglobalmegacorp.com

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