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

1.1     ! root        1: /* Try to unroll loops, and split induction variables.
        !             2:    Copyright (C) 1992, 1993 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
        !            62:      memory addresses can be split, and hence giv increments can be
        !            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
        !           208:    LOOP_START.  END_INSERT_BEFORE indicates where insns should be added
        !           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
        !           327:          /* The immediately preceding insn is a compare which must be
        !           328:             deleted.  */
        !           329:          delete_insn (last_loop_insn);
        !           330:          delete_insn (PREV_INSN (last_loop_insn));
        !           331: #else
        !           332:          /* The immediately preceding insn may not be the compare, so don't
        !           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:   if (LABEL_NAME (start_label))
        !           604:     {
        !           605:       /* The jump optimization pass must have combined the original start label
        !           606:         with a named label for a goto.  We can't unroll this case because
        !           607:         jumps which go to the named label must be handled differently than
        !           608:         jumps to the loop start, and it is impossible to differentiate them
        !           609:         in this case.  */
        !           610:       if (loop_dump_stream)
        !           611:        fprintf (loop_dump_stream,
        !           612:                 "Unrolling failure: loop start label is gone\n");
        !           613:       return;
        !           614:     }
        !           615: 
        !           616:   if (unroll_type == UNROLL_NAIVE
        !           617:       && GET_CODE (last_loop_insn) == BARRIER
        !           618:       && start_label != JUMP_LABEL (PREV_INSN (last_loop_insn)))
        !           619:     {
        !           620:       /* In this case, we must copy the jump and barrier, because they will
        !           621:         not be converted to jumps to an immediately following label.  */
        !           622: 
        !           623:       insert_before = NEXT_INSN (last_loop_insn);
        !           624:       copy_end = last_loop_insn;
        !           625:     }
        !           626: 
        !           627:   /* Allocate a translation table for the labels and insn numbers.
        !           628:      They will be filled in as we copy the insns in the loop.  */
        !           629: 
        !           630:   max_labelno = max_label_num ();
        !           631:   max_insnno = get_max_uid ();
        !           632: 
        !           633:   map = (struct inline_remap *) alloca (sizeof (struct inline_remap));
        !           634: 
        !           635:   map->integrating = 0;
        !           636: 
        !           637:   /* Allocate the label map.  */
        !           638: 
        !           639:   if (max_labelno > 0)
        !           640:     {
        !           641:       map->label_map = (rtx *) alloca (max_labelno * sizeof (rtx));
        !           642: 
        !           643:       local_label = (char *) alloca (max_labelno);
        !           644:       bzero (local_label, max_labelno);
        !           645:     }
        !           646:   else
        !           647:     map->label_map = 0;
        !           648: 
        !           649:   /* Search the loop and mark all local labels, i.e. the ones which have to
        !           650:      be distinct labels when copied.  For all labels which might be
        !           651:      non-local, set their label_map entries to point to themselves.
        !           652:      If they happen to be local their label_map entries will be overwritten
        !           653:      before the loop body is copied.  The label_map entries for local labels
        !           654:      will be set to a different value each time the loop body is copied.  */
        !           655: 
        !           656:   for (insn = copy_start; insn != loop_end; insn = NEXT_INSN (insn))
        !           657:     {
        !           658:       if (GET_CODE (insn) == CODE_LABEL)
        !           659:        local_label[CODE_LABEL_NUMBER (insn)] = 1;
        !           660:       else if (GET_CODE (insn) == JUMP_INSN)
        !           661:        {
        !           662:          if (JUMP_LABEL (insn))
        !           663:            map->label_map[CODE_LABEL_NUMBER (JUMP_LABEL (insn))]
        !           664:              = JUMP_LABEL (insn);
        !           665:          else if (GET_CODE (PATTERN (insn)) == ADDR_VEC
        !           666:                   || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
        !           667:            {
        !           668:              rtx pat = PATTERN (insn);
        !           669:              int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC;
        !           670:              int len = XVECLEN (pat, diff_vec_p);
        !           671:              rtx label;
        !           672: 
        !           673:              for (i = 0; i < len; i++)
        !           674:                {
        !           675:                  label = XEXP (XVECEXP (pat, diff_vec_p, i), 0);
        !           676:                  map->label_map[CODE_LABEL_NUMBER (label)] = label;
        !           677:                }
        !           678:            }
        !           679:        }
        !           680:     }
        !           681: 
        !           682:   /* Allocate space for the insn map.  */
        !           683: 
        !           684:   map->insn_map = (rtx *) alloca (max_insnno * sizeof (rtx));
        !           685: 
        !           686:   /* Set this to zero, to indicate that we are doing loop unrolling,
        !           687:      not function inlining.  */
        !           688:   map->inline_target = 0;
        !           689: 
        !           690:   /* The register and constant maps depend on the number of registers
        !           691:      present, so the final maps can't be created until after
        !           692:      find_splittable_regs is called.  However, they are needed for
        !           693:      preconditioning, so we create temporary maps when preconditioning
        !           694:      is performed.  */
        !           695: 
        !           696:   /* The preconditioning code may allocate two new pseudo registers.  */
        !           697:   maxregnum = max_reg_num ();
        !           698: 
        !           699:   /* Allocate and zero out the splittable_regs and addr_combined_regs
        !           700:      arrays.  These must be zeroed here because they will be used if
        !           701:      loop preconditioning is performed, and must be zero for that case.
        !           702: 
        !           703:      It is safe to do this here, since the extra registers created by the
        !           704:      preconditioning code and find_splittable_regs will never be used
        !           705:      to access the splittable_regs[] and addr_combined_regs[] arrays.  */
        !           706: 
        !           707:   splittable_regs = (rtx *) alloca (maxregnum * sizeof (rtx));
        !           708:   bzero (splittable_regs, maxregnum * sizeof (rtx));
        !           709:   splittable_regs_updates = (int *) alloca (maxregnum * sizeof (int));
        !           710:   bzero (splittable_regs_updates, maxregnum * sizeof (int));
        !           711:   addr_combined_regs
        !           712:     = (struct induction **) alloca (maxregnum * sizeof (struct induction *));
        !           713:   bzero (addr_combined_regs, maxregnum * sizeof (struct induction *));
        !           714: 
        !           715:   /* If this loop requires exit tests when unrolled, check to see if we
        !           716:      can precondition the loop so as to make the exit tests unnecessary.
        !           717:      Just like variable splitting, this is not safe if the loop is entered
        !           718:      via a jump to the bottom.  Also, can not do this if no strength
        !           719:      reduce info, because precondition_loop_p uses this info.  */
        !           720: 
        !           721:   /* Must copy the loop body for preconditioning before the following
        !           722:      find_splittable_regs call since that will emit insns which need to
        !           723:      be after the preconditioned loop copies, but immediately before the
        !           724:      unrolled loop copies.  */
        !           725: 
        !           726:   /* Also, it is not safe to split induction variables for the preconditioned
        !           727:      copies of the loop body.  If we split induction variables, then the code
        !           728:      assumes that each induction variable can be represented as a function
        !           729:      of its initial value and the loop iteration number.  This is not true
        !           730:      in this case, because the last preconditioned copy of the loop body
        !           731:      could be any iteration from the first up to the `unroll_number-1'th,
        !           732:      depending on the initial value of the iteration variable.  Therefore
        !           733:      we can not split induction variables here, because we can not calculate
        !           734:      their value.  Hence, this code must occur before find_splittable_regs
        !           735:      is called.  */
        !           736: 
        !           737:   if (unroll_type == UNROLL_NAIVE && ! splitting_not_safe && strength_reduce_p)
        !           738:     {
        !           739:       rtx initial_value, final_value, increment;
        !           740: 
        !           741:       if (precondition_loop_p (&initial_value, &final_value, &increment,
        !           742:                               loop_start, loop_end))
        !           743:        {
        !           744:          register rtx diff, temp;
        !           745:          enum machine_mode mode;
        !           746:          rtx *labels;
        !           747:          int abs_inc, neg_inc;
        !           748: 
        !           749:          map->reg_map = (rtx *) alloca (maxregnum * sizeof (rtx));
        !           750: 
        !           751:          map->const_equiv_map = (rtx *) alloca (maxregnum * sizeof (rtx));
        !           752:          map->const_age_map = (unsigned *) alloca (maxregnum
        !           753:                                                    * sizeof (unsigned));
        !           754:          map->const_equiv_map_size = maxregnum;
        !           755:          global_const_equiv_map = map->const_equiv_map;
        !           756:          global_const_equiv_map_size = maxregnum;
        !           757: 
        !           758:          init_reg_map (map, maxregnum);
        !           759: 
        !           760:          /* Limit loop unrolling to 4, since this will make 7 copies of
        !           761:             the loop body.  */
        !           762:          if (unroll_number > 4)
        !           763:            unroll_number = 4;
        !           764: 
        !           765:          /* Save the absolute value of the increment, and also whether or
        !           766:             not it is negative.  */
        !           767:          neg_inc = 0;
        !           768:          abs_inc = INTVAL (increment);
        !           769:          if (abs_inc < 0)
        !           770:            {
        !           771:              abs_inc = - abs_inc;
        !           772:              neg_inc = 1;
        !           773:            }
        !           774: 
        !           775:          start_sequence ();
        !           776: 
        !           777:          /* Decide what mode to do these calculations in.  Choose the larger
        !           778:             of final_value's mode and initial_value's mode, or a full-word if
        !           779:             both are constants.  */
        !           780:          mode = GET_MODE (final_value);
        !           781:          if (mode == VOIDmode)
        !           782:            {
        !           783:              mode = GET_MODE (initial_value);
        !           784:              if (mode == VOIDmode)
        !           785:                mode = word_mode;
        !           786:            }
        !           787:          else if (mode != GET_MODE (initial_value)
        !           788:                   && (GET_MODE_SIZE (mode)
        !           789:                       < GET_MODE_SIZE (GET_MODE (initial_value))))
        !           790:            mode = GET_MODE (initial_value);
        !           791: 
        !           792:          /* Calculate the difference between the final and initial values.
        !           793:             Final value may be a (plus (reg x) (const_int 1)) rtx.
        !           794:             Let the following cse pass simplify this if initial value is
        !           795:             a constant. 
        !           796: 
        !           797:             We must copy the final and initial values here to avoid
        !           798:             improperly shared rtl.  */
        !           799: 
        !           800:          diff = expand_binop (mode, sub_optab, copy_rtx (final_value),
        !           801:                               copy_rtx (initial_value), NULL_RTX, 0,
        !           802:                               OPTAB_LIB_WIDEN);
        !           803: 
        !           804:          /* Now calculate (diff % (unroll * abs (increment))) by using an
        !           805:             and instruction.  */
        !           806:          diff = expand_binop (GET_MODE (diff), and_optab, diff,
        !           807:                               GEN_INT (unroll_number * abs_inc - 1),
        !           808:                               NULL_RTX, 0, OPTAB_LIB_WIDEN);
        !           809: 
        !           810:          /* Now emit a sequence of branches to jump to the proper precond
        !           811:             loop entry point.  */
        !           812: 
        !           813:          labels = (rtx *) alloca (sizeof (rtx) * unroll_number);
        !           814:          for (i = 0; i < unroll_number; i++)
        !           815:            labels[i] = gen_label_rtx ();
        !           816: 
        !           817:          /* Assuming the unroll_number is 4, and the increment is 2, then
        !           818:             for a negative increment:  for a positive increment:
        !           819:             diff = 0,1   precond 0     diff = 0,7   precond 0
        !           820:             diff = 2,3   precond 3     diff = 1,2   precond 1
        !           821:             diff = 4,5   precond 2     diff = 3,4   precond 2
        !           822:             diff = 6,7   precond 1     diff = 5,6   precond 3  */
        !           823: 
        !           824:          /* We only need to emit (unroll_number - 1) branches here, the
        !           825:             last case just falls through to the following code.  */
        !           826: 
        !           827:          /* ??? This would give better code if we emitted a tree of branches
        !           828:             instead of the current linear list of branches.  */
        !           829: 
        !           830:          for (i = 0; i < unroll_number - 1; i++)
        !           831:            {
        !           832:              int cmp_const;
        !           833: 
        !           834:              /* For negative increments, must invert the constant compared
        !           835:                 against, except when comparing against zero.  */
        !           836:              if (i == 0)
        !           837:                cmp_const = 0;
        !           838:              else if (neg_inc)
        !           839:                cmp_const = unroll_number - i;
        !           840:              else
        !           841:                cmp_const = i;
        !           842: 
        !           843:              emit_cmp_insn (diff, GEN_INT (abs_inc * cmp_const),
        !           844:                             EQ, NULL_RTX, mode, 0, 0);
        !           845: 
        !           846:              if (i == 0)
        !           847:                emit_jump_insn (gen_beq (labels[i]));
        !           848:              else if (neg_inc)
        !           849:                emit_jump_insn (gen_bge (labels[i]));
        !           850:              else
        !           851:                emit_jump_insn (gen_ble (labels[i]));
        !           852:              JUMP_LABEL (get_last_insn ()) = labels[i];
        !           853:              LABEL_NUSES (labels[i])++;
        !           854:            }
        !           855: 
        !           856:          /* If the increment is greater than one, then we need another branch,
        !           857:             to handle other cases equivalent to 0.  */
        !           858: 
        !           859:          /* ??? This should be merged into the code above somehow to help
        !           860:             simplify the code here, and reduce the number of branches emitted.
        !           861:             For the negative increment case, the branch here could easily
        !           862:             be merged with the `0' case branch above.  For the positive
        !           863:             increment case, it is not clear how this can be simplified.  */
        !           864:             
        !           865:          if (abs_inc != 1)
        !           866:            {
        !           867:              int cmp_const;
        !           868: 
        !           869:              if (neg_inc)
        !           870:                cmp_const = abs_inc - 1;
        !           871:              else
        !           872:                cmp_const = abs_inc * (unroll_number - 1) + 1;
        !           873: 
        !           874:              emit_cmp_insn (diff, GEN_INT (cmp_const), EQ, NULL_RTX,
        !           875:                             mode, 0, 0);
        !           876: 
        !           877:              if (neg_inc)
        !           878:                emit_jump_insn (gen_ble (labels[0]));
        !           879:              else
        !           880:                emit_jump_insn (gen_bge (labels[0]));
        !           881:              JUMP_LABEL (get_last_insn ()) = labels[0];
        !           882:              LABEL_NUSES (labels[0])++;
        !           883:            }
        !           884: 
        !           885:          sequence = gen_sequence ();
        !           886:          end_sequence ();
        !           887:          emit_insn_before (sequence, loop_start);
        !           888:          
        !           889:          /* Only the last copy of the loop body here needs the exit
        !           890:             test, so set copy_end to exclude the compare/branch here,
        !           891:             and then reset it inside the loop when get to the last
        !           892:             copy.  */
        !           893: 
        !           894:          if (GET_CODE (last_loop_insn) == BARRIER)
        !           895:            copy_end = PREV_INSN (PREV_INSN (last_loop_insn));
        !           896:          else if (GET_CODE (last_loop_insn) == JUMP_INSN)
        !           897:            {
        !           898: #ifdef HAVE_cc0
        !           899:              /* The immediately preceding insn is a compare which we do not
        !           900:                 want to copy.  */
        !           901:              copy_end = PREV_INSN (PREV_INSN (last_loop_insn));
        !           902: #else
        !           903:              /* The immediately preceding insn may not be a compare, so we
        !           904:                 must copy it.  */
        !           905:              copy_end = PREV_INSN (last_loop_insn);
        !           906: #endif
        !           907:            }
        !           908:          else
        !           909:            abort ();
        !           910: 
        !           911:          for (i = 1; i < unroll_number; i++)
        !           912:            {
        !           913:              emit_label_after (labels[unroll_number - i],
        !           914:                                PREV_INSN (loop_start));
        !           915: 
        !           916:              bzero (map->insn_map, max_insnno * sizeof (rtx));
        !           917:              bzero (map->const_equiv_map, maxregnum * sizeof (rtx));
        !           918:              bzero (map->const_age_map, maxregnum * sizeof (unsigned));
        !           919:              map->const_age = 0;
        !           920: 
        !           921:              for (j = 0; j < max_labelno; j++)
        !           922:                if (local_label[j])
        !           923:                  map->label_map[j] = gen_label_rtx ();
        !           924: 
        !           925:              /* The last copy needs the compare/branch insns at the end,
        !           926:                 so reset copy_end here if the loop ends with a conditional
        !           927:                 branch.  */
        !           928: 
        !           929:              if (i == unroll_number - 1)
        !           930:                {
        !           931:                  if (GET_CODE (last_loop_insn) == BARRIER)
        !           932:                    copy_end = PREV_INSN (PREV_INSN (last_loop_insn));
        !           933:                  else
        !           934:                    copy_end = last_loop_insn;
        !           935:                }
        !           936: 
        !           937:              /* None of the copies are the `last_iteration', so just
        !           938:                 pass zero for that parameter.  */
        !           939:              copy_loop_body (copy_start, copy_end, map, exit_label, 0,
        !           940:                              unroll_type, start_label, loop_end,
        !           941:                              loop_start, copy_end);
        !           942:            }
        !           943:          emit_label_after (labels[0], PREV_INSN (loop_start));
        !           944: 
        !           945:          if (GET_CODE (last_loop_insn) == BARRIER)
        !           946:            {
        !           947:              insert_before = PREV_INSN (last_loop_insn);
        !           948:              copy_end = PREV_INSN (insert_before);
        !           949:            }
        !           950:          else
        !           951:            {
        !           952: #ifdef HAVE_cc0
        !           953:              /* The immediately preceding insn is a compare which we do not
        !           954:                 want to copy.  */
        !           955:              insert_before = PREV_INSN (last_loop_insn);
        !           956:              copy_end = PREV_INSN (insert_before);
        !           957: #else
        !           958:              /* The immediately preceding insn may not be a compare, so we
        !           959:                 must copy it.  */
        !           960:              insert_before = last_loop_insn;
        !           961:              copy_end = PREV_INSN (last_loop_insn);
        !           962: #endif
        !           963:            }
        !           964: 
        !           965:          /* Set unroll type to MODULO now.  */
        !           966:          unroll_type = UNROLL_MODULO;
        !           967:          loop_preconditioned = 1;
        !           968:        }
        !           969:     }
        !           970: 
        !           971:   /* If reach here, and the loop type is UNROLL_NAIVE, then don't unroll
        !           972:      the loop unless all loops are being unrolled.  */
        !           973:   if (unroll_type == UNROLL_NAIVE && ! flag_unroll_all_loops)
        !           974:     {
        !           975:       if (loop_dump_stream)
        !           976:        fprintf (loop_dump_stream, "Unrolling failure: Naive unrolling not being done.\n");
        !           977:       return;
        !           978:     }
        !           979: 
        !           980:   /* At this point, we are guaranteed to unroll the loop.  */
        !           981: 
        !           982:   /* For each biv and giv, determine whether it can be safely split into
        !           983:      a different variable for each unrolled copy of the loop body.
        !           984:      We precalculate and save this info here, since computing it is
        !           985:      expensive.
        !           986: 
        !           987:      Do this before deleting any instructions from the loop, so that
        !           988:      back_branch_in_range_p will work correctly.  */
        !           989: 
        !           990:   if (splitting_not_safe)
        !           991:     temp = 0;
        !           992:   else
        !           993:     temp = find_splittable_regs (unroll_type, loop_start, loop_end,
        !           994:                                end_insert_before, unroll_number);
        !           995: 
        !           996:   /* find_splittable_regs may have created some new registers, so must
        !           997:      reallocate the reg_map with the new larger size, and must realloc
        !           998:      the constant maps also.  */
        !           999: 
        !          1000:   maxregnum = max_reg_num ();
        !          1001:   map->reg_map = (rtx *) alloca (maxregnum * sizeof (rtx));
        !          1002: 
        !          1003:   init_reg_map (map, maxregnum);
        !          1004: 
        !          1005:   /* Space is needed in some of the map for new registers, so new_maxregnum
        !          1006:      is an (over)estimate of how many registers will exist at the end.  */
        !          1007:   new_maxregnum = maxregnum + (temp * unroll_number * 2);
        !          1008: 
        !          1009:   /* Must realloc space for the constant maps, because the number of registers
        !          1010:      may have changed.  */
        !          1011: 
        !          1012:   map->const_equiv_map = (rtx *) alloca (new_maxregnum * sizeof (rtx));
        !          1013:   map->const_age_map = (unsigned *) alloca (new_maxregnum * sizeof (unsigned));
        !          1014: 
        !          1015:   map->const_equiv_map_size = new_maxregnum;
        !          1016:   global_const_equiv_map = map->const_equiv_map;
        !          1017:   global_const_equiv_map_size = new_maxregnum;
        !          1018: 
        !          1019:   /* Search the list of bivs and givs to find ones which need to be remapped
        !          1020:      when split, and set their reg_map entry appropriately.  */
        !          1021: 
        !          1022:   for (bl = loop_iv_list; bl; bl = bl->next)
        !          1023:     {
        !          1024:       if (REGNO (bl->biv->src_reg) != bl->regno)
        !          1025:        map->reg_map[bl->regno] = bl->biv->src_reg;
        !          1026: #if 0
        !          1027:       /* Currently, non-reduced/final-value givs are never split.  */
        !          1028:       for (v = bl->giv; v; v = v->next_iv)
        !          1029:        if (REGNO (v->src_reg) != bl->regno)
        !          1030:          map->reg_map[REGNO (v->dest_reg)] = v->src_reg;
        !          1031: #endif
        !          1032:     }
        !          1033: 
        !          1034:   /* If the loop is being partially unrolled, and the iteration variables
        !          1035:      are being split, and are being renamed for the split, then must fix up
        !          1036:      the compare instruction at the end of the loop to refer to the new
        !          1037:      registers.  This compare isn't copied, so the registers used in it
        !          1038:      will never be replaced if it isn't done here.  */
        !          1039: 
        !          1040:   if (unroll_type == UNROLL_MODULO)
        !          1041:     {
        !          1042:       insn = NEXT_INSN (copy_end);
        !          1043:       if (GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SET)
        !          1044:        {
        !          1045: #if 0
        !          1046:          /* If non-reduced/final-value givs were split, then this would also
        !          1047:             have to remap those givs.  */
        !          1048: #endif
        !          1049: 
        !          1050:          tem = SET_SRC (PATTERN (insn));
        !          1051:          /* The set source is a register.  */
        !          1052:          if (GET_CODE (tem) == REG)
        !          1053:            {
        !          1054:              if (REGNO (tem) < max_reg_before_loop
        !          1055:                  && reg_iv_type[REGNO (tem)] == BASIC_INDUCT)
        !          1056:                SET_SRC (PATTERN (insn))
        !          1057:                  = reg_biv_class[REGNO (tem)]->biv->src_reg;
        !          1058:            }
        !          1059:          else
        !          1060:            {
        !          1061:              /* The set source is a compare of some sort.  */
        !          1062:              tem = XEXP (SET_SRC (PATTERN (insn)), 0);
        !          1063:              if (GET_CODE (tem) == REG
        !          1064:                  && REGNO (tem) < max_reg_before_loop
        !          1065:                  && reg_iv_type[REGNO (tem)] == BASIC_INDUCT)
        !          1066:                XEXP (SET_SRC (PATTERN (insn)), 0)
        !          1067:                  = reg_biv_class[REGNO (tem)]->biv->src_reg;
        !          1068:              
        !          1069:              tem = XEXP (SET_SRC (PATTERN (insn)), 1);
        !          1070:              if (GET_CODE (tem) == REG
        !          1071:                  && REGNO (tem) < max_reg_before_loop
        !          1072:                  && reg_iv_type[REGNO (tem)] == BASIC_INDUCT)
        !          1073:                XEXP (SET_SRC (PATTERN (insn)), 1)
        !          1074:                  = reg_biv_class[REGNO (tem)]->biv->src_reg;
        !          1075:            }
        !          1076:        }
        !          1077:     }
        !          1078: 
        !          1079:   /* For unroll_number - 1 times, make a copy of each instruction
        !          1080:      between copy_start and copy_end, and insert these new instructions
        !          1081:      before the end of the loop.  */
        !          1082: 
        !          1083:   for (i = 0; i < unroll_number; i++)
        !          1084:     {
        !          1085:       bzero (map->insn_map, max_insnno * sizeof (rtx));
        !          1086:       bzero (map->const_equiv_map, new_maxregnum * sizeof (rtx));
        !          1087:       bzero (map->const_age_map, new_maxregnum * sizeof (unsigned));
        !          1088:       map->const_age = 0;
        !          1089: 
        !          1090:       for (j = 0; j < max_labelno; j++)
        !          1091:        if (local_label[j])
        !          1092:          map->label_map[j] = gen_label_rtx ();
        !          1093: 
        !          1094:       /* If loop starts with a branch to the test, then fix it so that
        !          1095:         it points to the test of the first unrolled copy of the loop.  */
        !          1096:       if (i == 0 && loop_start != copy_start)
        !          1097:        {
        !          1098:          insn = PREV_INSN (copy_start);
        !          1099:          pattern = PATTERN (insn);
        !          1100:          
        !          1101:          tem = map->label_map[CODE_LABEL_NUMBER
        !          1102:                               (XEXP (SET_SRC (pattern), 0))];
        !          1103:          SET_SRC (pattern) = gen_rtx (LABEL_REF, VOIDmode, tem);
        !          1104: 
        !          1105:          /* Set the jump label so that it can be used by later loop unrolling
        !          1106:             passes.  */
        !          1107:          JUMP_LABEL (insn) = tem;
        !          1108:          LABEL_NUSES (tem)++;
        !          1109:        }
        !          1110: 
        !          1111:       copy_loop_body (copy_start, copy_end, map, exit_label,
        !          1112:                      i == unroll_number - 1, unroll_type, start_label,
        !          1113:                      loop_end, insert_before, insert_before);
        !          1114:     }
        !          1115: 
        !          1116:   /* Before deleting any insns, emit a CODE_LABEL immediately after the last
        !          1117:      insn to be deleted.  This prevents any runaway delete_insn call from
        !          1118:      more insns that it should, as it always stops at a CODE_LABEL.  */
        !          1119: 
        !          1120:   /* Delete the compare and branch at the end of the loop if completely
        !          1121:      unrolling the loop.  Deleting the backward branch at the end also
        !          1122:      deletes the code label at the start of the loop.  This is done at
        !          1123:      the very end to avoid problems with back_branch_in_range_p.  */
        !          1124: 
        !          1125:   if (unroll_type == UNROLL_COMPLETELY)
        !          1126:     safety_label = emit_label_after (gen_label_rtx (), last_loop_insn);
        !          1127:   else
        !          1128:     safety_label = emit_label_after (gen_label_rtx (), copy_end);
        !          1129: 
        !          1130:   /* Delete all of the original loop instructions.  Don't delete the 
        !          1131:      LOOP_BEG note, or the first code label in the loop.  */
        !          1132: 
        !          1133:   insn = NEXT_INSN (copy_start);
        !          1134:   while (insn != safety_label)
        !          1135:     {
        !          1136:       if (insn != start_label)
        !          1137:        insn = delete_insn (insn);
        !          1138:       else
        !          1139:        insn = NEXT_INSN (insn);
        !          1140:     }
        !          1141: 
        !          1142:   /* Can now delete the 'safety' label emitted to protect us from runaway
        !          1143:      delete_insn calls.  */
        !          1144:   if (INSN_DELETED_P (safety_label))
        !          1145:     abort ();
        !          1146:   delete_insn (safety_label);
        !          1147: 
        !          1148:   /* If exit_label exists, emit it after the loop.  Doing the emit here
        !          1149:      forces it to have a higher INSN_UID than any insn in the unrolled loop.
        !          1150:      This is needed so that mostly_true_jump in reorg.c will treat jumps
        !          1151:      to this loop end label correctly, i.e. predict that they are usually
        !          1152:      not taken.  */
        !          1153:   if (exit_label)
        !          1154:     emit_label_after (exit_label, loop_end);
        !          1155: }
        !          1156: 
        !          1157: /* Return true if the loop can be safely, and profitably, preconditioned
        !          1158:    so that the unrolled copies of the loop body don't need exit tests.
        !          1159: 
        !          1160:    This only works if final_value, initial_value and increment can be
        !          1161:    determined, and if increment is a constant power of 2.
        !          1162:    If increment is not a power of 2, then the preconditioning modulo
        !          1163:    operation would require a real modulo instead of a boolean AND, and this
        !          1164:    is not considered `profitable'.  */
        !          1165: 
        !          1166: /* ??? If the loop is known to be executed very many times, or the machine
        !          1167:    has a very cheap divide instruction, then preconditioning is a win even
        !          1168:    when the increment is not a power of 2.  Use RTX_COST to compute
        !          1169:    whether divide is cheap.  */
        !          1170: 
        !          1171: static int
        !          1172: precondition_loop_p (initial_value, final_value, increment, loop_start,
        !          1173:                     loop_end)
        !          1174:      rtx *initial_value, *final_value, *increment;
        !          1175:      rtx loop_start, loop_end;
        !          1176: {
        !          1177:   int unsigned_compare, compare_dir;
        !          1178: 
        !          1179:   if (loop_n_iterations > 0)
        !          1180:     {
        !          1181:       *initial_value = const0_rtx;
        !          1182:       *increment = const1_rtx;
        !          1183:       *final_value = GEN_INT (loop_n_iterations);
        !          1184: 
        !          1185:       if (loop_dump_stream)
        !          1186:        fprintf (loop_dump_stream,
        !          1187:                 "Preconditioning: Success, number of iterations known, %d.\n",
        !          1188:                 loop_n_iterations);
        !          1189:       return 1;
        !          1190:     }
        !          1191: 
        !          1192:   if (loop_initial_value == 0)
        !          1193:     {
        !          1194:       if (loop_dump_stream)
        !          1195:        fprintf (loop_dump_stream,
        !          1196:                 "Preconditioning: Could not find initial value.\n");
        !          1197:       return 0;
        !          1198:     }
        !          1199:   else if (loop_increment == 0)
        !          1200:     {
        !          1201:       if (loop_dump_stream)
        !          1202:        fprintf (loop_dump_stream,
        !          1203:                 "Preconditioning: Could not find increment value.\n");
        !          1204:       return 0;
        !          1205:     }
        !          1206:   else if (GET_CODE (loop_increment) != CONST_INT)
        !          1207:     {
        !          1208:       if (loop_dump_stream)
        !          1209:        fprintf (loop_dump_stream,
        !          1210:                 "Preconditioning: Increment not a constant.\n");
        !          1211:       return 0;
        !          1212:     }
        !          1213:   else if ((exact_log2 (INTVAL (loop_increment)) < 0)
        !          1214:           && (exact_log2 (- INTVAL (loop_increment)) < 0))
        !          1215:     {
        !          1216:       if (loop_dump_stream)
        !          1217:        fprintf (loop_dump_stream,
        !          1218:                 "Preconditioning: Increment not a constant power of 2.\n");
        !          1219:       return 0;
        !          1220:     }
        !          1221: 
        !          1222:   /* Unsigned_compare and compare_dir can be ignored here, since they do
        !          1223:      not matter for preconditioning.  */
        !          1224: 
        !          1225:   if (loop_final_value == 0)
        !          1226:     {
        !          1227:       if (loop_dump_stream)
        !          1228:        fprintf (loop_dump_stream,
        !          1229:                 "Preconditioning: EQ comparison loop.\n");
        !          1230:       return 0;
        !          1231:     }
        !          1232: 
        !          1233:   /* Must ensure that final_value is invariant, so call invariant_p to
        !          1234:      check.  Before doing so, must check regno against max_reg_before_loop
        !          1235:      to make sure that the register is in the range covered by invariant_p.
        !          1236:      If it isn't, then it is most likely a biv/giv which by definition are
        !          1237:      not invariant.  */
        !          1238:   if ((GET_CODE (loop_final_value) == REG
        !          1239:        && REGNO (loop_final_value) >= max_reg_before_loop)
        !          1240:       || (GET_CODE (loop_final_value) == PLUS
        !          1241:          && REGNO (XEXP (loop_final_value, 0)) >= max_reg_before_loop)
        !          1242:       || ! invariant_p (loop_final_value))
        !          1243:     {
        !          1244:       if (loop_dump_stream)
        !          1245:        fprintf (loop_dump_stream,
        !          1246:                 "Preconditioning: Final value not invariant.\n");
        !          1247:       return 0;
        !          1248:     }
        !          1249: 
        !          1250:   /* Fail for floating point values, since the caller of this function
        !          1251:      does not have code to deal with them.  */
        !          1252:   if (GET_MODE_CLASS (GET_MODE (loop_final_value)) == MODE_FLOAT
        !          1253:       || GET_MODE_CLASS (GET_MODE (loop_initial_value)) == MODE_FLOAT)
        !          1254:     {
        !          1255:       if (loop_dump_stream)
        !          1256:        fprintf (loop_dump_stream,
        !          1257:                 "Preconditioning: Floating point final or initial value.\n");
        !          1258:       return 0;
        !          1259:     }
        !          1260: 
        !          1261:   /* Now set initial_value to be the iteration_var, since that may be a
        !          1262:      simpler expression, and is guaranteed to be correct if all of the
        !          1263:      above tests succeed.
        !          1264: 
        !          1265:      We can not use the initial_value as calculated, because it will be
        !          1266:      one too small for loops of the form "while (i-- > 0)".  We can not
        !          1267:      emit code before the loop_skip_over insns to fix this problem as this
        !          1268:      will then give a number one too large for loops of the form
        !          1269:      "while (--i > 0)".
        !          1270: 
        !          1271:      Note that all loops that reach here are entered at the top, because
        !          1272:      this function is not called if the loop starts with a jump.  */
        !          1273: 
        !          1274:   /* Fail if loop_iteration_var is not live before loop_start, since we need
        !          1275:      to test its value in the preconditioning code.  */
        !          1276: 
        !          1277:   if (uid_luid[regno_first_uid[REGNO (loop_iteration_var)]]
        !          1278:       > INSN_LUID (loop_start))
        !          1279:     {
        !          1280:       if (loop_dump_stream)
        !          1281:        fprintf (loop_dump_stream,
        !          1282:                 "Preconditioning: Iteration var not live before loop start.\n");
        !          1283:       return 0;
        !          1284:     }
        !          1285: 
        !          1286:   *initial_value = loop_iteration_var;
        !          1287:   *increment = loop_increment;
        !          1288:   *final_value = loop_final_value;
        !          1289: 
        !          1290:   /* Success! */
        !          1291:   if (loop_dump_stream)
        !          1292:     fprintf (loop_dump_stream, "Preconditioning: Successful.\n");
        !          1293:   return 1;
        !          1294: }
        !          1295: 
        !          1296: 
        !          1297: /* All pseudo-registers must be mapped to themselves.  Two hard registers
        !          1298:    must be mapped, VIRTUAL_STACK_VARS_REGNUM and VIRTUAL_INCOMING_ARGS_
        !          1299:    REGNUM, to avoid function-inlining specific conversions of these
        !          1300:    registers.  All other hard regs can not be mapped because they may be
        !          1301:    used with different
        !          1302:    modes.  */
        !          1303: 
        !          1304: static void
        !          1305: init_reg_map (map, maxregnum)
        !          1306:      struct inline_remap *map;
        !          1307:      int maxregnum;
        !          1308: {
        !          1309:   int i;
        !          1310: 
        !          1311:   for (i = maxregnum - 1; i > LAST_VIRTUAL_REGISTER; i--)
        !          1312:     map->reg_map[i] = regno_reg_rtx[i];
        !          1313:   /* Just clear the rest of the entries.  */
        !          1314:   for (i = LAST_VIRTUAL_REGISTER; i >= 0; i--)
        !          1315:     map->reg_map[i] = 0;
        !          1316: 
        !          1317:   map->reg_map[VIRTUAL_STACK_VARS_REGNUM]
        !          1318:     = regno_reg_rtx[VIRTUAL_STACK_VARS_REGNUM];
        !          1319:   map->reg_map[VIRTUAL_INCOMING_ARGS_REGNUM]
        !          1320:     = regno_reg_rtx[VIRTUAL_INCOMING_ARGS_REGNUM];
        !          1321: }
        !          1322: 
        !          1323: /* Strength-reduction will often emit code for optimized biv/givs which
        !          1324:    calculates their value in a temporary register, and then copies the result
        !          1325:    to the iv.  This procedure reconstructs the pattern computing the iv;
        !          1326:    verifying that all operands are of the proper form.
        !          1327: 
        !          1328:    The return value is the amount that the giv is incremented by.  */
        !          1329: 
        !          1330: static rtx
        !          1331: calculate_giv_inc (pattern, src_insn, regno)
        !          1332:      rtx pattern, src_insn;
        !          1333:      int regno;
        !          1334: {
        !          1335:   rtx increment;
        !          1336:   rtx increment_total = 0;
        !          1337:   int tries = 0;
        !          1338: 
        !          1339:  retry:
        !          1340:   /* Verify that we have an increment insn here.  First check for a plus
        !          1341:      as the set source.  */
        !          1342:   if (GET_CODE (SET_SRC (pattern)) != PLUS)
        !          1343:     {
        !          1344:       /* SR sometimes computes the new giv value in a temp, then copies it
        !          1345:         to the new_reg.  */
        !          1346:       src_insn = PREV_INSN (src_insn);
        !          1347:       pattern = PATTERN (src_insn);
        !          1348:       if (GET_CODE (SET_SRC (pattern)) != PLUS)
        !          1349:        abort ();
        !          1350:                  
        !          1351:       /* The last insn emitted is not needed, so delete it to avoid confusing
        !          1352:         the second cse pass.  This insn sets the giv unnecessarily.  */
        !          1353:       delete_insn (get_last_insn ());
        !          1354:     }
        !          1355: 
        !          1356:   /* Verify that we have a constant as the second operand of the plus.  */
        !          1357:   increment = XEXP (SET_SRC (pattern), 1);
        !          1358:   if (GET_CODE (increment) != CONST_INT)
        !          1359:     {
        !          1360:       /* SR sometimes puts the constant in a register, especially if it is
        !          1361:         too big to be an add immed operand.  */
        !          1362:       src_insn = PREV_INSN (src_insn);
        !          1363:       increment = SET_SRC (PATTERN (src_insn));
        !          1364: 
        !          1365:       /* SR may have used LO_SUM to compute the constant if it is too large
        !          1366:         for a load immed operand.  In this case, the constant is in operand
        !          1367:         one of the LO_SUM rtx.  */
        !          1368:       if (GET_CODE (increment) == LO_SUM)
        !          1369:        increment = XEXP (increment, 1);
        !          1370: 
        !          1371:       if (GET_CODE (increment) != CONST_INT)
        !          1372:        abort ();
        !          1373:                  
        !          1374:       /* The insn loading the constant into a register is not longer needed,
        !          1375:         so delete it.  */
        !          1376:       delete_insn (get_last_insn ());
        !          1377:     }
        !          1378: 
        !          1379:   if (increment_total)
        !          1380:     increment_total = GEN_INT (INTVAL (increment_total) + INTVAL (increment));
        !          1381:   else
        !          1382:     increment_total = increment;
        !          1383: 
        !          1384:   /* Check that the source register is the same as the register we expected
        !          1385:      to see as the source.  If not, something is seriously wrong.  */
        !          1386:   if (GET_CODE (XEXP (SET_SRC (pattern), 0)) != REG
        !          1387:       || REGNO (XEXP (SET_SRC (pattern), 0)) != regno)
        !          1388:     {
        !          1389:       /* Some machines (e.g. the romp), may emit two add instructions for
        !          1390:         certain constants, so lets try looking for another add immediately
        !          1391:         before this one if we have only seen one add insn so far.  */
        !          1392: 
        !          1393:       if (tries == 0)
        !          1394:        {
        !          1395:          tries++;
        !          1396: 
        !          1397:          src_insn = PREV_INSN (src_insn);
        !          1398:          pattern = PATTERN (src_insn);
        !          1399: 
        !          1400:          delete_insn (get_last_insn ());
        !          1401: 
        !          1402:          goto retry;
        !          1403:        }
        !          1404: 
        !          1405:       abort ();
        !          1406:     }
        !          1407: 
        !          1408:   return increment_total;
        !          1409: }
        !          1410: 
        !          1411: /* Copy REG_NOTES, except for insn references, because not all insn_map
        !          1412:    entries are valid yet.  We do need to copy registers now though, because
        !          1413:    the reg_map entries can change during copying.  */
        !          1414: 
        !          1415: static rtx
        !          1416: initial_reg_note_copy (notes, map)
        !          1417:      rtx notes;
        !          1418:      struct inline_remap *map;
        !          1419: {
        !          1420:   rtx copy;
        !          1421: 
        !          1422:   if (notes == 0)
        !          1423:     return 0;
        !          1424: 
        !          1425:   copy = rtx_alloc (GET_CODE (notes));
        !          1426:   PUT_MODE (copy, GET_MODE (notes));
        !          1427: 
        !          1428:   if (GET_CODE (notes) == EXPR_LIST)
        !          1429:     XEXP (copy, 0) = copy_rtx_and_substitute (XEXP (notes, 0), map);
        !          1430:   else if (GET_CODE (notes) == INSN_LIST)
        !          1431:     /* Don't substitute for these yet.  */
        !          1432:     XEXP (copy, 0) = XEXP (notes, 0);
        !          1433:   else
        !          1434:     abort ();
        !          1435: 
        !          1436:   XEXP (copy, 1) = initial_reg_note_copy (XEXP (notes, 1), map);
        !          1437: 
        !          1438:   return copy;
        !          1439: }
        !          1440: 
        !          1441: /* Fixup insn references in copied REG_NOTES.  */
        !          1442: 
        !          1443: static void
        !          1444: final_reg_note_copy (notes, map)
        !          1445:      rtx notes;
        !          1446:      struct inline_remap *map;
        !          1447: {
        !          1448:   rtx note;
        !          1449: 
        !          1450:   for (note = notes; note; note = XEXP (note, 1))
        !          1451:     if (GET_CODE (note) == INSN_LIST)
        !          1452:       XEXP (note, 0) = map->insn_map[INSN_UID (XEXP (note, 0))];
        !          1453: }
        !          1454: 
        !          1455: /* Copy each instruction in the loop, substituting from map as appropriate.
        !          1456:    This is very similar to a loop in expand_inline_function.  */
        !          1457:   
        !          1458: static void
        !          1459: copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
        !          1460:                unroll_type, start_label, loop_end, insert_before,
        !          1461:                copy_notes_from)
        !          1462:      rtx copy_start, copy_end;
        !          1463:      struct inline_remap *map;
        !          1464:      rtx exit_label;
        !          1465:      int last_iteration;
        !          1466:      enum unroll_types unroll_type;
        !          1467:      rtx start_label, loop_end, insert_before, copy_notes_from;
        !          1468: {
        !          1469:   rtx insn, pattern;
        !          1470:   rtx tem, copy;
        !          1471:   int dest_reg_was_split, i;
        !          1472:   rtx cc0_insn = 0;
        !          1473:   rtx final_label = 0;
        !          1474:   rtx giv_inc, giv_dest_reg, giv_src_reg;
        !          1475: 
        !          1476:   /* If this isn't the last iteration, then map any references to the
        !          1477:      start_label to final_label.  Final label will then be emitted immediately
        !          1478:      after the end of this loop body if it was ever used.
        !          1479: 
        !          1480:      If this is the last iteration, then map references to the start_label
        !          1481:      to itself.  */
        !          1482:   if (! last_iteration)
        !          1483:     {
        !          1484:       final_label = gen_label_rtx ();
        !          1485:       map->label_map[CODE_LABEL_NUMBER (start_label)] = final_label;
        !          1486:     }
        !          1487:   else
        !          1488:     map->label_map[CODE_LABEL_NUMBER (start_label)] = start_label;
        !          1489: 
        !          1490:   start_sequence ();
        !          1491:   
        !          1492:   insn = copy_start;
        !          1493:   do
        !          1494:     {
        !          1495:       insn = NEXT_INSN (insn);
        !          1496:       
        !          1497:       map->orig_asm_operands_vector = 0;
        !          1498:       
        !          1499:       switch (GET_CODE (insn))
        !          1500:        {
        !          1501:        case INSN:
        !          1502:          pattern = PATTERN (insn);
        !          1503:          copy = 0;
        !          1504:          giv_inc = 0;
        !          1505:          
        !          1506:          /* Check to see if this is a giv that has been combined with
        !          1507:             some split address givs.  (Combined in the sense that 
        !          1508:             `combine_givs' in loop.c has put two givs in the same register.)
        !          1509:             In this case, we must search all givs based on the same biv to
        !          1510:             find the address givs.  Then split the address givs.
        !          1511:             Do this before splitting the giv, since that may map the
        !          1512:             SET_DEST to a new register.  */
        !          1513:          
        !          1514:          if (GET_CODE (pattern) == SET
        !          1515:              && GET_CODE (SET_DEST (pattern)) == REG
        !          1516:              && addr_combined_regs[REGNO (SET_DEST (pattern))])
        !          1517:            {
        !          1518:              struct iv_class *bl;
        !          1519:              struct induction *v, *tv;
        !          1520:              int regno = REGNO (SET_DEST (pattern));
        !          1521:              
        !          1522:              v = addr_combined_regs[REGNO (SET_DEST (pattern))];
        !          1523:              bl = reg_biv_class[REGNO (v->src_reg)];
        !          1524:              
        !          1525:              /* Although the giv_inc amount is not needed here, we must call
        !          1526:                 calculate_giv_inc here since it might try to delete the
        !          1527:                 last insn emitted.  If we wait until later to call it,
        !          1528:                 we might accidentally delete insns generated immediately
        !          1529:                 below by emit_unrolled_add.  */
        !          1530: 
        !          1531:              giv_inc = calculate_giv_inc (pattern, insn, regno);
        !          1532: 
        !          1533:              /* Now find all address giv's that were combined with this
        !          1534:                 giv 'v'.  */
        !          1535:              for (tv = bl->giv; tv; tv = tv->next_iv)
        !          1536:                if (tv->giv_type == DEST_ADDR && tv->same == v)
        !          1537:                  {
        !          1538:                    int this_giv_inc = INTVAL (giv_inc);
        !          1539: 
        !          1540:                    /* Scale this_giv_inc if the multiplicative factors of
        !          1541:                       the two givs are different.  */
        !          1542:                    if (tv->mult_val != v->mult_val)
        !          1543:                      this_giv_inc = (this_giv_inc / INTVAL (v->mult_val)
        !          1544:                                      * INTVAL (tv->mult_val));
        !          1545:                       
        !          1546:                    tv->dest_reg = plus_constant (tv->dest_reg, this_giv_inc);
        !          1547:                    *tv->location = tv->dest_reg;
        !          1548:                    
        !          1549:                    if (last_iteration && unroll_type != UNROLL_COMPLETELY)
        !          1550:                      {
        !          1551:                        /* Must emit an insn to increment the split address
        !          1552:                           giv.  Add in the const_adjust field in case there
        !          1553:                           was a constant eliminated from the address.  */
        !          1554:                        rtx value, dest_reg;
        !          1555:                        
        !          1556:                        /* tv->dest_reg will be either a bare register,
        !          1557:                           or else a register plus a constant.  */
        !          1558:                        if (GET_CODE (tv->dest_reg) == REG)
        !          1559:                          dest_reg = tv->dest_reg;
        !          1560:                        else
        !          1561:                          dest_reg = XEXP (tv->dest_reg, 0);
        !          1562:                        
        !          1563:                        /* tv->dest_reg may actually be a (PLUS (REG) (CONST))
        !          1564:                           here, so we must call plus_constant to add
        !          1565:                           the const_adjust amount before calling
        !          1566:                           emit_unrolled_add below.  */
        !          1567:                        value = plus_constant (tv->dest_reg, tv->const_adjust);
        !          1568: 
        !          1569:                        /* The constant could be too large for an add
        !          1570:                           immediate, so can't directly emit an insn here.  */
        !          1571:                        emit_unrolled_add (dest_reg, XEXP (value, 0),
        !          1572:                                           XEXP (value, 1));
        !          1573:                        
        !          1574:                        /* Reset the giv to be just the register again, in case
        !          1575:                           it is used after the set we have just emitted.
        !          1576:                           We must subtract the const_adjust factor added in
        !          1577:                           above.  */
        !          1578:                        tv->dest_reg = plus_constant (dest_reg,
        !          1579:                                                      - tv->const_adjust);
        !          1580:                        *tv->location = tv->dest_reg;
        !          1581:                      }
        !          1582:                  }
        !          1583:            }
        !          1584:          
        !          1585:          /* If this is a setting of a splittable variable, then determine
        !          1586:             how to split the variable, create a new set based on this split,
        !          1587:             and set up the reg_map so that later uses of the variable will
        !          1588:             use the new split variable.  */
        !          1589:          
        !          1590:          dest_reg_was_split = 0;
        !          1591:          
        !          1592:          if (GET_CODE (pattern) == SET
        !          1593:              && GET_CODE (SET_DEST (pattern)) == REG
        !          1594:              && splittable_regs[REGNO (SET_DEST (pattern))])
        !          1595:            {
        !          1596:              int regno = REGNO (SET_DEST (pattern));
        !          1597:              
        !          1598:              dest_reg_was_split = 1;
        !          1599:              
        !          1600:              /* Compute the increment value for the giv, if it wasn't
        !          1601:                 already computed above.  */
        !          1602: 
        !          1603:              if (giv_inc == 0)
        !          1604:                giv_inc = calculate_giv_inc (pattern, insn, regno);
        !          1605:              giv_dest_reg = SET_DEST (pattern);
        !          1606:              giv_src_reg = SET_DEST (pattern);
        !          1607: 
        !          1608:              if (unroll_type == UNROLL_COMPLETELY)
        !          1609:                {
        !          1610:                  /* Completely unrolling the loop.  Set the induction
        !          1611:                     variable to a known constant value.  */
        !          1612:                  
        !          1613:                  /* The value in splittable_regs may be an invariant
        !          1614:                     value, so we must use plus_constant here.  */
        !          1615:                  splittable_regs[regno]
        !          1616:                    = plus_constant (splittable_regs[regno], INTVAL (giv_inc));
        !          1617: 
        !          1618:                  if (GET_CODE (splittable_regs[regno]) == PLUS)
        !          1619:                    {
        !          1620:                      giv_src_reg = XEXP (splittable_regs[regno], 0);
        !          1621:                      giv_inc = XEXP (splittable_regs[regno], 1);
        !          1622:                    }
        !          1623:                  else
        !          1624:                    {
        !          1625:                      /* The splittable_regs value must be a REG or a
        !          1626:                         CONST_INT, so put the entire value in the giv_src_reg
        !          1627:                         variable.  */
        !          1628:                      giv_src_reg = splittable_regs[regno];
        !          1629:                      giv_inc = const0_rtx;
        !          1630:                    }
        !          1631:                }
        !          1632:              else
        !          1633:                {
        !          1634:                  /* Partially unrolling loop.  Create a new pseudo
        !          1635:                     register for the iteration variable, and set it to
        !          1636:                     be a constant plus the original register.  Except
        !          1637:                     on the last iteration, when the result has to
        !          1638:                     go back into the original iteration var register.  */
        !          1639:                  
        !          1640:                  /* Handle bivs which must be mapped to a new register
        !          1641:                     when split.  This happens for bivs which need their
        !          1642:                     final value set before loop entry.  The new register
        !          1643:                     for the biv was stored in the biv's first struct
        !          1644:                     induction entry by find_splittable_regs.  */
        !          1645: 
        !          1646:                  if (regno < max_reg_before_loop
        !          1647:                      && reg_iv_type[regno] == BASIC_INDUCT)
        !          1648:                    {
        !          1649:                      giv_src_reg = reg_biv_class[regno]->biv->src_reg;
        !          1650:                      giv_dest_reg = giv_src_reg;
        !          1651:                    }
        !          1652:                  
        !          1653: #if 0
        !          1654:                  /* If non-reduced/final-value givs were split, then
        !          1655:                     this would have to remap those givs also.  See
        !          1656:                     find_splittable_regs.  */
        !          1657: #endif
        !          1658:                  
        !          1659:                  splittable_regs[regno]
        !          1660:                    = GEN_INT (INTVAL (giv_inc)
        !          1661:                               + INTVAL (splittable_regs[regno]));
        !          1662:                  giv_inc = splittable_regs[regno];
        !          1663:                  
        !          1664:                  /* Now split the induction variable by changing the dest
        !          1665:                     of this insn to a new register, and setting its
        !          1666:                     reg_map entry to point to this new register.
        !          1667: 
        !          1668:                     If this is the last iteration, and this is the last insn
        !          1669:                     that will update the iv, then reuse the original dest,
        !          1670:                     to ensure that the iv will have the proper value when
        !          1671:                     the loop exits or repeats.
        !          1672: 
        !          1673:                     Using splittable_regs_updates here like this is safe,
        !          1674:                     because it can only be greater than one if all
        !          1675:                     instructions modifying the iv are always executed in
        !          1676:                     order.  */
        !          1677: 
        !          1678:                  if (! last_iteration
        !          1679:                      || (splittable_regs_updates[regno]-- != 1))
        !          1680:                    {
        !          1681:                      tem = gen_reg_rtx (GET_MODE (giv_src_reg));
        !          1682:                      giv_dest_reg = tem;
        !          1683:                      map->reg_map[regno] = tem;
        !          1684:                    }
        !          1685:                  else
        !          1686:                    map->reg_map[regno] = giv_src_reg;
        !          1687:                }
        !          1688: 
        !          1689:              /* The constant being added could be too large for an add
        !          1690:                 immediate, so can't directly emit an insn here.  */
        !          1691:              emit_unrolled_add (giv_dest_reg, giv_src_reg, giv_inc);
        !          1692:              copy = get_last_insn ();
        !          1693:              pattern = PATTERN (copy);
        !          1694:            }
        !          1695:          else
        !          1696:            {
        !          1697:              pattern = copy_rtx_and_substitute (pattern, map);
        !          1698:              copy = emit_insn (pattern);
        !          1699:            }
        !          1700:          REG_NOTES (copy) = initial_reg_note_copy (REG_NOTES (insn), map);
        !          1701:          
        !          1702: #ifdef HAVE_cc0
        !          1703:          /* If this insn is setting CC0, it may need to look at
        !          1704:             the insn that uses CC0 to see what type of insn it is.
        !          1705:             In that case, the call to recog via validate_change will
        !          1706:             fail.  So don't substitute constants here.  Instead,
        !          1707:             do it when we emit the following insn.
        !          1708: 
        !          1709:             For example, see the pyr.md file.  That machine has signed and
        !          1710:             unsigned compares.  The compare patterns must check the
        !          1711:             following branch insn to see which what kind of compare to
        !          1712:             emit.
        !          1713: 
        !          1714:             If the previous insn set CC0, substitute constants on it as
        !          1715:             well.  */
        !          1716:          if (sets_cc0_p (copy) != 0)
        !          1717:            cc0_insn = copy;
        !          1718:          else
        !          1719:            {
        !          1720:              if (cc0_insn)
        !          1721:                try_constants (cc0_insn, map);
        !          1722:              cc0_insn = 0;
        !          1723:              try_constants (copy, map);
        !          1724:            }
        !          1725: #else
        !          1726:          try_constants (copy, map);
        !          1727: #endif
        !          1728: 
        !          1729:          /* Make split induction variable constants `permanent' since we
        !          1730:             know there are no backward branches across iteration variable
        !          1731:             settings which would invalidate this.  */
        !          1732:          if (dest_reg_was_split)
        !          1733:            {
        !          1734:              int regno = REGNO (SET_DEST (pattern));
        !          1735: 
        !          1736:              if (regno < map->const_equiv_map_size
        !          1737:                  && map->const_age_map[regno] == map->const_age)
        !          1738:                map->const_age_map[regno] = -1;
        !          1739:            }
        !          1740:          break;
        !          1741:          
        !          1742:        case JUMP_INSN:
        !          1743:          pattern = copy_rtx_and_substitute (PATTERN (insn), map);
        !          1744:          copy = emit_jump_insn (pattern);
        !          1745:          REG_NOTES (copy) = initial_reg_note_copy (REG_NOTES (insn), map);
        !          1746: 
        !          1747:          if (JUMP_LABEL (insn) == start_label && insn == copy_end
        !          1748:              && ! last_iteration)
        !          1749:            {
        !          1750:              /* This is a branch to the beginning of the loop; this is the
        !          1751:                 last insn being copied; and this is not the last iteration.
        !          1752:                 In this case, we want to change the original fall through
        !          1753:                 case to be a branch past the end of the loop, and the
        !          1754:                 original jump label case to fall_through.  */
        !          1755: 
        !          1756:              if (! invert_exp (pattern, copy)
        !          1757:                  || ! redirect_exp (&pattern,
        !          1758:                                     map->label_map[CODE_LABEL_NUMBER
        !          1759:                                                    (JUMP_LABEL (insn))],
        !          1760:                                     exit_label, copy))
        !          1761:                abort ();
        !          1762:            }
        !          1763:          
        !          1764: #ifdef HAVE_cc0
        !          1765:          if (cc0_insn)
        !          1766:            try_constants (cc0_insn, map);
        !          1767:          cc0_insn = 0;
        !          1768: #endif
        !          1769:          try_constants (copy, map);
        !          1770: 
        !          1771:          /* Set the jump label of COPY correctly to avoid problems with
        !          1772:             later passes of unroll_loop, if INSN had jump label set.  */
        !          1773:          if (JUMP_LABEL (insn))
        !          1774:            {
        !          1775:              rtx label = 0;
        !          1776: 
        !          1777:              /* Can't use the label_map for every insn, since this may be
        !          1778:                 the backward branch, and hence the label was not mapped.  */
        !          1779:              if (GET_CODE (pattern) == SET)
        !          1780:                {
        !          1781:                  tem = SET_SRC (pattern);
        !          1782:                  if (GET_CODE (tem) == LABEL_REF)
        !          1783:                    label = XEXP (tem, 0);
        !          1784:                  else if (GET_CODE (tem) == IF_THEN_ELSE)
        !          1785:                    {
        !          1786:                      if (XEXP (tem, 1) != pc_rtx)
        !          1787:                        label = XEXP (XEXP (tem, 1), 0);
        !          1788:                      else
        !          1789:                        label = XEXP (XEXP (tem, 2), 0);
        !          1790:                    }
        !          1791:                }
        !          1792: 
        !          1793:              if (label && GET_CODE (label) == CODE_LABEL)
        !          1794:                JUMP_LABEL (copy) = label;
        !          1795:              else
        !          1796:                {
        !          1797:                  /* An unrecognizable jump insn, probably the entry jump
        !          1798:                     for a switch statement.  This label must have been mapped,
        !          1799:                     so just use the label_map to get the new jump label.  */
        !          1800:                  JUMP_LABEL (copy) = map->label_map[CODE_LABEL_NUMBER
        !          1801:                                                     (JUMP_LABEL (insn))];
        !          1802:                }
        !          1803:          
        !          1804:              /* If this is a non-local jump, then must increase the label
        !          1805:                 use count so that the label will not be deleted when the
        !          1806:                 original jump is deleted.  */
        !          1807:              LABEL_NUSES (JUMP_LABEL (copy))++;
        !          1808:            }
        !          1809:          else if (GET_CODE (PATTERN (copy)) == ADDR_VEC
        !          1810:                   || GET_CODE (PATTERN (copy)) == ADDR_DIFF_VEC)
        !          1811:            {
        !          1812:              rtx pat = PATTERN (copy);
        !          1813:              int diff_vec_p = GET_CODE (pat) == ADDR_DIFF_VEC;
        !          1814:              int len = XVECLEN (pat, diff_vec_p);
        !          1815:              int i;
        !          1816: 
        !          1817:              for (i = 0; i < len; i++)
        !          1818:                LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0))++;
        !          1819:            }
        !          1820: 
        !          1821:          /* If this used to be a conditional jump insn but whose branch
        !          1822:             direction is now known, we must do something special.  */
        !          1823:          if (condjump_p (insn) && !simplejump_p (insn) && map->last_pc_value)
        !          1824:            {
        !          1825: #ifdef HAVE_cc0
        !          1826:              /* The previous insn set cc0 for us.  So delete it.  */
        !          1827:              delete_insn (PREV_INSN (copy));
        !          1828: #endif
        !          1829: 
        !          1830:              /* If this is now a no-op, delete it.  */
        !          1831:              if (map->last_pc_value == pc_rtx)
        !          1832:                {
        !          1833:                  delete_insn (copy);
        !          1834:                  copy = 0;
        !          1835:                }
        !          1836:              else
        !          1837:                /* Otherwise, this is unconditional jump so we must put a
        !          1838:                   BARRIER after it.  We could do some dead code elimination
        !          1839:                   here, but jump.c will do it just as well.  */
        !          1840:                emit_barrier ();
        !          1841:            }
        !          1842:          break;
        !          1843:          
        !          1844:        case CALL_INSN:
        !          1845:          pattern = copy_rtx_and_substitute (PATTERN (insn), map);
        !          1846:          copy = emit_call_insn (pattern);
        !          1847:          REG_NOTES (copy) = initial_reg_note_copy (REG_NOTES (insn), map);
        !          1848: 
        !          1849: #ifdef HAVE_cc0
        !          1850:          if (cc0_insn)
        !          1851:            try_constants (cc0_insn, map);
        !          1852:          cc0_insn = 0;
        !          1853: #endif
        !          1854:          try_constants (copy, map);
        !          1855: 
        !          1856:          /* Be lazy and assume CALL_INSNs clobber all hard registers.  */
        !          1857:          for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          1858:            map->const_equiv_map[i] = 0;
        !          1859:          break;
        !          1860:          
        !          1861:        case CODE_LABEL:
        !          1862:          /* If this is the loop start label, then we don't need to emit a
        !          1863:             copy of this label since no one will use it.  */
        !          1864: 
        !          1865:          if (insn != start_label)
        !          1866:            {
        !          1867:              copy = emit_label (map->label_map[CODE_LABEL_NUMBER (insn)]);
        !          1868:              map->const_age++;
        !          1869:            }
        !          1870:          break;
        !          1871:          
        !          1872:        case BARRIER:
        !          1873:          copy = emit_barrier ();
        !          1874:          break;
        !          1875:          
        !          1876:        case NOTE:
        !          1877:          /* VTOP notes are valid only before the loop exit test.  If placed
        !          1878:             anywhere else, loop may generate bad code.  */
        !          1879:             
        !          1880:          if (NOTE_LINE_NUMBER (insn) != NOTE_INSN_DELETED
        !          1881:              && (NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_VTOP
        !          1882:                  || (last_iteration && unroll_type != UNROLL_COMPLETELY)))
        !          1883:            copy = emit_note (NOTE_SOURCE_FILE (insn),
        !          1884:                              NOTE_LINE_NUMBER (insn));
        !          1885:          else
        !          1886:            copy = 0;
        !          1887:          break;
        !          1888:          
        !          1889:        default:
        !          1890:          abort ();
        !          1891:          break;
        !          1892:        }
        !          1893:       
        !          1894:       map->insn_map[INSN_UID (insn)] = copy;
        !          1895:     }
        !          1896:   while (insn != copy_end);
        !          1897:   
        !          1898:   /* Now finish coping the REG_NOTES.  */
        !          1899:   insn = copy_start;
        !          1900:   do
        !          1901:     {
        !          1902:       insn = NEXT_INSN (insn);
        !          1903:       if ((GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
        !          1904:           || GET_CODE (insn) == CALL_INSN)
        !          1905:          && map->insn_map[INSN_UID (insn)])
        !          1906:        final_reg_note_copy (REG_NOTES (map->insn_map[INSN_UID (insn)]), map);
        !          1907:     }
        !          1908:   while (insn != copy_end);
        !          1909: 
        !          1910:   /* There may be notes between copy_notes_from and loop_end.  Emit a copy of
        !          1911:      each of these notes here, since there may be some important ones, such as
        !          1912:      NOTE_INSN_BLOCK_END notes, in this group.  We don't do this on the last
        !          1913:      iteration, because the original notes won't be deleted.
        !          1914: 
        !          1915:      We can't use insert_before here, because when from preconditioning,
        !          1916:      insert_before points before the loop.  We can't use copy_end, because
        !          1917:      there may be insns already inserted after it (which we don't want to
        !          1918:      copy) when not from preconditioning code.  */
        !          1919: 
        !          1920:   if (! last_iteration)
        !          1921:     {
        !          1922:       for (insn = copy_notes_from; insn != loop_end; insn = NEXT_INSN (insn))
        !          1923:        {
        !          1924:          if (GET_CODE (insn) == NOTE
        !          1925:              && NOTE_LINE_NUMBER (insn) != NOTE_INSN_DELETED)
        !          1926:            emit_note (NOTE_SOURCE_FILE (insn), NOTE_LINE_NUMBER (insn));
        !          1927:        }
        !          1928:     }
        !          1929: 
        !          1930:   if (final_label && LABEL_NUSES (final_label) > 0)
        !          1931:     emit_label (final_label);
        !          1932: 
        !          1933:   tem = gen_sequence ();
        !          1934:   end_sequence ();
        !          1935:   emit_insn_before (tem, insert_before);
        !          1936: }
        !          1937: 
        !          1938: /* Emit an insn, using the expand_binop to ensure that a valid insn is
        !          1939:    emitted.  This will correctly handle the case where the increment value
        !          1940:    won't fit in the immediate field of a PLUS insns.  */
        !          1941: 
        !          1942: void
        !          1943: emit_unrolled_add (dest_reg, src_reg, increment)
        !          1944:      rtx dest_reg, src_reg, increment;
        !          1945: {
        !          1946:   rtx result;
        !          1947: 
        !          1948:   result = expand_binop (GET_MODE (dest_reg), add_optab, src_reg, increment,
        !          1949:                         dest_reg, 0, OPTAB_LIB_WIDEN);
        !          1950: 
        !          1951:   if (dest_reg != result)
        !          1952:     emit_move_insn (dest_reg, result);
        !          1953: }
        !          1954: 
        !          1955: /* Searches the insns between INSN and LOOP_END.  Returns 1 if there
        !          1956:    is a backward branch in that range that branches to somewhere between
        !          1957:    LOOP_START and INSN.  Returns 0 otherwise.  */
        !          1958: 
        !          1959: /* ??? This is quadratic algorithm.  Could be rewritten to be linear.
        !          1960:    In practice, this is not a problem, because this function is seldom called,
        !          1961:    and uses a negligible amount of CPU time on average.  */
        !          1962: 
        !          1963: static int
        !          1964: back_branch_in_range_p (insn, loop_start, loop_end)
        !          1965:      rtx insn;
        !          1966:      rtx loop_start, loop_end;
        !          1967: {
        !          1968:   rtx p, q, target_insn;
        !          1969: 
        !          1970:   /* Stop before we get to the backward branch at the end of the loop.  */
        !          1971:   loop_end = prev_nonnote_insn (loop_end);
        !          1972:   if (GET_CODE (loop_end) == BARRIER)
        !          1973:     loop_end = PREV_INSN (loop_end);
        !          1974: 
        !          1975:   /* Check in case insn has been deleted, search forward for first non
        !          1976:      deleted insn following it.  */
        !          1977:   while (INSN_DELETED_P (insn))
        !          1978:     insn = NEXT_INSN (insn);
        !          1979: 
        !          1980:   /* Check for the case where insn is the last insn in the loop.  */
        !          1981:   if (insn == loop_end)
        !          1982:     return 0;
        !          1983: 
        !          1984:   for (p = NEXT_INSN (insn); p != loop_end; p = NEXT_INSN (p))
        !          1985:     {
        !          1986:       if (GET_CODE (p) == JUMP_INSN)
        !          1987:        {
        !          1988:          target_insn = JUMP_LABEL (p);
        !          1989:          
        !          1990:          /* Search from loop_start to insn, to see if one of them is
        !          1991:             the target_insn.  We can't use INSN_LUID comparisons here,
        !          1992:             since insn may not have an LUID entry.  */
        !          1993:          for (q = loop_start; q != insn; q = NEXT_INSN (q))
        !          1994:            if (q == target_insn)
        !          1995:              return 1;
        !          1996:        }
        !          1997:     }
        !          1998: 
        !          1999:   return 0;
        !          2000: }
        !          2001: 
        !          2002: /* Try to generate the simplest rtx for the expression
        !          2003:    (PLUS (MULT mult1 mult2) add1).  This is used to calculate the initial
        !          2004:    value of giv's.  */
        !          2005: 
        !          2006: static rtx
        !          2007: fold_rtx_mult_add (mult1, mult2, add1, mode)
        !          2008:      rtx mult1, mult2, add1;
        !          2009:      enum machine_mode mode;
        !          2010: {
        !          2011:   rtx temp, mult_res;
        !          2012:   rtx result;
        !          2013: 
        !          2014:   /* The modes must all be the same.  This should always be true.  For now,
        !          2015:      check to make sure.  */
        !          2016:   if ((GET_MODE (mult1) != mode && GET_MODE (mult1) != VOIDmode)
        !          2017:       || (GET_MODE (mult2) != mode && GET_MODE (mult2) != VOIDmode)
        !          2018:       || (GET_MODE (add1) != mode && GET_MODE (add1) != VOIDmode))
        !          2019:     abort ();
        !          2020: 
        !          2021:   /* Ensure that if at least one of mult1/mult2 are constant, then mult2
        !          2022:      will be a constant.  */
        !          2023:   if (GET_CODE (mult1) == CONST_INT)
        !          2024:     {
        !          2025:       temp = mult2;
        !          2026:       mult2 = mult1;
        !          2027:       mult1 = temp;
        !          2028:     }
        !          2029: 
        !          2030:   mult_res = simplify_binary_operation (MULT, mode, mult1, mult2);
        !          2031:   if (! mult_res)
        !          2032:     mult_res = gen_rtx (MULT, mode, mult1, mult2);
        !          2033: 
        !          2034:   /* Again, put the constant second.  */
        !          2035:   if (GET_CODE (add1) == CONST_INT)
        !          2036:     {
        !          2037:       temp = add1;
        !          2038:       add1 = mult_res;
        !          2039:       mult_res = temp;
        !          2040:     }
        !          2041: 
        !          2042:   result = simplify_binary_operation (PLUS, mode, add1, mult_res);
        !          2043:   if (! result)
        !          2044:     result = gen_rtx (PLUS, mode, add1, mult_res);
        !          2045: 
        !          2046:   return result;
        !          2047: }
        !          2048: 
        !          2049: /* Searches the list of induction struct's for the biv BL, to try to calculate
        !          2050:    the total increment value for one iteration of the loop as a constant.
        !          2051: 
        !          2052:    Returns the increment value as an rtx, simplified as much as possible,
        !          2053:    if it can be calculated.  Otherwise, returns 0.  */
        !          2054: 
        !          2055: rtx 
        !          2056: biv_total_increment (bl, loop_start, loop_end)
        !          2057:      struct iv_class *bl;
        !          2058:      rtx loop_start, loop_end;
        !          2059: {
        !          2060:   struct induction *v;
        !          2061:   rtx result;
        !          2062: 
        !          2063:   /* For increment, must check every instruction that sets it.  Each
        !          2064:      instruction must be executed only once each time through the loop.
        !          2065:      To verify this, we check that the the insn is always executed, and that
        !          2066:      there are no backward branches after the insn that branch to before it.
        !          2067:      Also, the insn must have a mult_val of one (to make sure it really is
        !          2068:      an increment).  */
        !          2069: 
        !          2070:   result = const0_rtx;
        !          2071:   for (v = bl->biv; v; v = v->next_iv)
        !          2072:     {
        !          2073:       if (v->always_computable && v->mult_val == const1_rtx
        !          2074:          && ! back_branch_in_range_p (v->insn, loop_start, loop_end))
        !          2075:        result = fold_rtx_mult_add (result, const1_rtx, v->add_val, v->mode);
        !          2076:       else
        !          2077:        return 0;
        !          2078:     }
        !          2079: 
        !          2080:   return result;
        !          2081: }
        !          2082: 
        !          2083: /* Determine the initial value of the iteration variable, and the amount
        !          2084:    that it is incremented each loop.  Use the tables constructed by
        !          2085:    the strength reduction pass to calculate these values.
        !          2086: 
        !          2087:    Initial_value and/or increment are set to zero if their values could not
        !          2088:    be calculated.  */
        !          2089: 
        !          2090: static void
        !          2091: iteration_info (iteration_var, initial_value, increment, loop_start, loop_end)
        !          2092:      rtx iteration_var, *initial_value, *increment;
        !          2093:      rtx loop_start, loop_end;
        !          2094: {
        !          2095:   struct iv_class *bl;
        !          2096:   struct induction *v, *b;
        !          2097: 
        !          2098:   /* Clear the result values, in case no answer can be found.  */
        !          2099:   *initial_value = 0;
        !          2100:   *increment = 0;
        !          2101: 
        !          2102:   /* The iteration variable can be either a giv or a biv.  Check to see
        !          2103:      which it is, and compute the variable's initial value, and increment
        !          2104:      value if possible.  */
        !          2105: 
        !          2106:   /* If this is a new register, can't handle it since we don't have any
        !          2107:      reg_iv_type entry for it.  */
        !          2108:   if (REGNO (iteration_var) >= max_reg_before_loop)
        !          2109:     {
        !          2110:       if (loop_dump_stream)
        !          2111:        fprintf (loop_dump_stream,
        !          2112:                 "Loop unrolling: No reg_iv_type entry for iteration var.\n");
        !          2113:       return;
        !          2114:     }
        !          2115:   /* Reject iteration variables larger than the host long size, since they
        !          2116:      could result in a number of iterations greater than the range of our
        !          2117:      `unsigned long' variable loop_n_iterations.  */
        !          2118:   else if (GET_MODE_BITSIZE (GET_MODE (iteration_var)) > HOST_BITS_PER_LONG)
        !          2119:     {
        !          2120:       if (loop_dump_stream)
        !          2121:        fprintf (loop_dump_stream,
        !          2122:                 "Loop unrolling: Iteration var rejected because mode larger than host long.\n");
        !          2123:       return;
        !          2124:     }
        !          2125:   else if (GET_MODE_CLASS (GET_MODE (iteration_var)) != MODE_INT)
        !          2126:     {
        !          2127:       if (loop_dump_stream)
        !          2128:        fprintf (loop_dump_stream,
        !          2129:                 "Loop unrolling: Iteration var not an integer.\n");
        !          2130:       return;
        !          2131:     }
        !          2132:   else if (reg_iv_type[REGNO (iteration_var)] == BASIC_INDUCT)
        !          2133:     {
        !          2134:       /* Grab initial value, only useful if it is a constant.  */
        !          2135:       bl = reg_biv_class[REGNO (iteration_var)];
        !          2136:       *initial_value = bl->initial_value;
        !          2137: 
        !          2138:       *increment = biv_total_increment (bl, loop_start, loop_end);
        !          2139:     }
        !          2140:   else if (reg_iv_type[REGNO (iteration_var)] == GENERAL_INDUCT)
        !          2141:     {
        !          2142: #if 1
        !          2143:       /* ??? The code below does not work because the incorrect number of
        !          2144:         iterations is calculated when the biv is incremented after the giv
        !          2145:         is set (which is the usual case).  This can probably be accounted
        !          2146:         for by biasing the initial_value by subtracting the amount of the
        !          2147:         increment that occurs between the giv set and the giv test.  However,
        !          2148:         a giv as an iterator is very rare, so it does not seem worthwhile
        !          2149:         to handle this.  */
        !          2150:       /* ??? An example failure is: i = 6; do {;} while (i++ < 9).  */
        !          2151:       if (loop_dump_stream)
        !          2152:        fprintf (loop_dump_stream,
        !          2153:                 "Loop unrolling: Giv iterators are not handled.\n");
        !          2154:       return;
        !          2155: #else
        !          2156:       /* Initial value is mult_val times the biv's initial value plus
        !          2157:         add_val.  Only useful if it is a constant.  */
        !          2158:       v = reg_iv_info[REGNO (iteration_var)];
        !          2159:       bl = reg_biv_class[REGNO (v->src_reg)];
        !          2160:       *initial_value = fold_rtx_mult_add (v->mult_val, bl->initial_value,
        !          2161:                                          v->add_val, v->mode);
        !          2162:       
        !          2163:       /* Increment value is mult_val times the increment value of the biv.  */
        !          2164: 
        !          2165:       *increment = biv_total_increment (bl, loop_start, loop_end);
        !          2166:       if (*increment)
        !          2167:        *increment = fold_rtx_mult_add (v->mult_val, *increment, const0_rtx,
        !          2168:                                        v->mode);
        !          2169: #endif
        !          2170:     }
        !          2171:   else
        !          2172:     {
        !          2173:       if (loop_dump_stream)
        !          2174:        fprintf (loop_dump_stream,
        !          2175:                 "Loop unrolling: Not basic or general induction var.\n");
        !          2176:       return;
        !          2177:     }
        !          2178: }
        !          2179: 
        !          2180: /* Calculate the approximate final value of the iteration variable
        !          2181:    which has an loop exit test with code COMPARISON_CODE and comparison value
        !          2182:    of COMPARISON_VALUE.  Also returns an indication of whether the comparison
        !          2183:    was signed or unsigned, and the direction of the comparison.  This info is
        !          2184:    needed to calculate the number of loop iterations.  */
        !          2185: 
        !          2186: static rtx
        !          2187: approx_final_value (comparison_code, comparison_value, unsigned_p, compare_dir)
        !          2188:      enum rtx_code comparison_code;
        !          2189:      rtx comparison_value;
        !          2190:      int *unsigned_p;
        !          2191:      int *compare_dir;
        !          2192: {
        !          2193:   /* Calculate the final value of the induction variable.
        !          2194:      The exact final value depends on the branch operator, and increment sign.
        !          2195:      This is only an approximate value.  It will be wrong if the iteration
        !          2196:      variable is not incremented by one each time through the loop, and
        !          2197:      approx final value - start value % increment != 0.  */
        !          2198: 
        !          2199:   *unsigned_p = 0;
        !          2200:   switch (comparison_code)
        !          2201:     {
        !          2202:     case LEU:
        !          2203:       *unsigned_p = 1;
        !          2204:     case LE:
        !          2205:       *compare_dir = 1;
        !          2206:       return plus_constant (comparison_value, 1);
        !          2207:     case GEU:
        !          2208:       *unsigned_p = 1;
        !          2209:     case GE:
        !          2210:       *compare_dir = -1;
        !          2211:       return plus_constant (comparison_value, -1);
        !          2212:     case EQ:
        !          2213:       /* Can not calculate a final value for this case.  */
        !          2214:       *compare_dir = 0;
        !          2215:       return 0;
        !          2216:     case LTU:
        !          2217:       *unsigned_p = 1;
        !          2218:     case LT:
        !          2219:       *compare_dir = 1;
        !          2220:       return comparison_value;
        !          2221:       break;
        !          2222:     case GTU:
        !          2223:       *unsigned_p = 1;
        !          2224:     case GT:
        !          2225:       *compare_dir = -1;
        !          2226:       return comparison_value;
        !          2227:     case NE:
        !          2228:       *compare_dir = 0;
        !          2229:       return comparison_value;
        !          2230:     default:
        !          2231:       abort ();
        !          2232:     }
        !          2233: }
        !          2234: 
        !          2235: /* For each biv and giv, determine whether it can be safely split into
        !          2236:    a different variable for each unrolled copy of the loop body.  If it
        !          2237:    is safe to split, then indicate that by saving some useful info
        !          2238:    in the splittable_regs array.
        !          2239: 
        !          2240:    If the loop is being completely unrolled, then splittable_regs will hold
        !          2241:    the current value of the induction variable while the loop is unrolled.
        !          2242:    It must be set to the initial value of the induction variable here.
        !          2243:    Otherwise, splittable_regs will hold the difference between the current
        !          2244:    value of the induction variable and the value the induction variable had
        !          2245:    at the top of the loop.  It must be set to the value 0 here.
        !          2246: 
        !          2247:    Returns the total number of instructions that set registers that are
        !          2248:    splittable.  */
        !          2249: 
        !          2250: /* ?? If the loop is only unrolled twice, then most of the restrictions to
        !          2251:    constant values are unnecessary, since we can easily calculate increment
        !          2252:    values in this case even if nothing is constant.  The increment value
        !          2253:    should not involve a multiply however.  */
        !          2254: 
        !          2255: /* ?? Even if the biv/giv increment values aren't constant, it may still
        !          2256:    be beneficial to split the variable if the loop is only unrolled a few
        !          2257:    times, since multiplies by small integers (1,2,3,4) are very cheap.  */
        !          2258: 
        !          2259: static int
        !          2260: find_splittable_regs (unroll_type, loop_start, loop_end, end_insert_before,
        !          2261:                     unroll_number)
        !          2262:      enum unroll_types unroll_type;
        !          2263:      rtx loop_start, loop_end;
        !          2264:      rtx end_insert_before;
        !          2265:      int unroll_number;
        !          2266: {
        !          2267:   struct iv_class *bl;
        !          2268:   struct induction *v;
        !          2269:   rtx increment, tem;
        !          2270:   rtx biv_final_value;
        !          2271:   int biv_splittable;
        !          2272:   int result = 0;
        !          2273: 
        !          2274:   for (bl = loop_iv_list; bl; bl = bl->next)
        !          2275:     {
        !          2276:       /* Biv_total_increment must return a constant value,
        !          2277:         otherwise we can not calculate the split values.  */
        !          2278: 
        !          2279:       increment = biv_total_increment (bl, loop_start, loop_end);
        !          2280:       if (! increment || GET_CODE (increment) != CONST_INT)
        !          2281:        continue;
        !          2282: 
        !          2283:       /* The loop must be unrolled completely, or else have a known number
        !          2284:         of iterations and only one exit, or else the biv must be dead
        !          2285:         outside the loop, or else the final value must be known.  Otherwise,
        !          2286:         it is unsafe to split the biv since it may not have the proper
        !          2287:         value on loop exit.  */
        !          2288: 
        !          2289:       /* loop_number_exit_labels is non-zero if the loop has an exit other than
        !          2290:         a fall through at the end.  */
        !          2291: 
        !          2292:       biv_splittable = 1;
        !          2293:       biv_final_value = 0;
        !          2294:       if (unroll_type != UNROLL_COMPLETELY
        !          2295:          && (loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]]
        !          2296:              || unroll_type == UNROLL_NAIVE)
        !          2297:          && (uid_luid[regno_last_uid[bl->regno]] >= INSN_LUID (loop_end)
        !          2298:              || ! bl->init_insn
        !          2299:              || INSN_UID (bl->init_insn) >= max_uid_for_loop
        !          2300:              || (uid_luid[regno_first_uid[bl->regno]]
        !          2301:                  < INSN_LUID (bl->init_insn))
        !          2302:              || reg_mentioned_p (bl->biv->dest_reg, SET_SRC (bl->init_set)))
        !          2303:          && ! (biv_final_value = final_biv_value (bl, loop_start, loop_end)))
        !          2304:        biv_splittable = 0;
        !          2305: 
        !          2306:       /* If any of the insns setting the BIV don't do so with a simple
        !          2307:         PLUS, we don't know how to split it.  */
        !          2308:       for (v = bl->biv; biv_splittable && v; v = v->next_iv)
        !          2309:        if ((tem = single_set (v->insn)) == 0
        !          2310:            || GET_CODE (SET_DEST (tem)) != REG
        !          2311:            || REGNO (SET_DEST (tem)) != bl->regno
        !          2312:            || GET_CODE (SET_SRC (tem)) != PLUS)
        !          2313:          biv_splittable = 0;
        !          2314: 
        !          2315:       /* If final value is non-zero, then must emit an instruction which sets
        !          2316:         the value of the biv to the proper value.  This is done after
        !          2317:         handling all of the givs, since some of them may need to use the
        !          2318:         biv's value in their initialization code.  */
        !          2319: 
        !          2320:       /* This biv is splittable.  If completely unrolling the loop, save
        !          2321:         the biv's initial value.  Otherwise, save the constant zero.  */
        !          2322: 
        !          2323:       if (biv_splittable == 1)
        !          2324:        {
        !          2325:          if (unroll_type == UNROLL_COMPLETELY)
        !          2326:            {
        !          2327:              /* If the initial value of the biv is itself (i.e. it is too
        !          2328:                 complicated for strength_reduce to compute), or is a hard
        !          2329:                 register, then we must create a new pseudo reg to hold the
        !          2330:                 initial value of the biv.  */
        !          2331: 
        !          2332:              if (GET_CODE (bl->initial_value) == REG
        !          2333:                  && (REGNO (bl->initial_value) == bl->regno
        !          2334:                      || REGNO (bl->initial_value) < FIRST_PSEUDO_REGISTER))
        !          2335:                {
        !          2336:                  rtx tem = gen_reg_rtx (bl->biv->mode);
        !          2337:                  
        !          2338:                  emit_insn_before (gen_move_insn (tem, bl->biv->src_reg),
        !          2339:                                    loop_start);
        !          2340: 
        !          2341:                  if (loop_dump_stream)
        !          2342:                    fprintf (loop_dump_stream, "Biv %d initial value remapped to %d.\n",
        !          2343:                             bl->regno, REGNO (tem));
        !          2344: 
        !          2345:                  splittable_regs[bl->regno] = tem;
        !          2346:                }
        !          2347:              else
        !          2348:                splittable_regs[bl->regno] = bl->initial_value;
        !          2349:            }
        !          2350:          else
        !          2351:            splittable_regs[bl->regno] = const0_rtx;
        !          2352: 
        !          2353:          /* Save the number of instructions that modify the biv, so that
        !          2354:             we can treat the last one specially.  */
        !          2355: 
        !          2356:          splittable_regs_updates[bl->regno] = bl->biv_count;
        !          2357:          result += bl->biv_count;
        !          2358: 
        !          2359:          if (loop_dump_stream)
        !          2360:            fprintf (loop_dump_stream,
        !          2361:                     "Biv %d safe to split.\n", bl->regno);
        !          2362:        }
        !          2363: 
        !          2364:       /* Check every giv that depends on this biv to see whether it is
        !          2365:         splittable also.  Even if the biv isn't splittable, givs which
        !          2366:         depend on it may be splittable if the biv is live outside the
        !          2367:         loop, and the givs aren't.  */
        !          2368: 
        !          2369:       result += find_splittable_givs (bl, unroll_type, loop_start, loop_end,
        !          2370:                                     increment, unroll_number);
        !          2371: 
        !          2372:       /* If final value is non-zero, then must emit an instruction which sets
        !          2373:         the value of the biv to the proper value.  This is done after
        !          2374:         handling all of the givs, since some of them may need to use the
        !          2375:         biv's value in their initialization code.  */
        !          2376:       if (biv_final_value)
        !          2377:        {
        !          2378:          /* If the loop has multiple exits, emit the insns before the
        !          2379:             loop to ensure that it will always be executed no matter
        !          2380:             how the loop exits.  Otherwise emit the insn after the loop,
        !          2381:             since this is slightly more efficient.  */
        !          2382:          if (! loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]])
        !          2383:            emit_insn_before (gen_move_insn (bl->biv->src_reg,
        !          2384:                                             biv_final_value),
        !          2385:                              end_insert_before);
        !          2386:          else
        !          2387:            {
        !          2388:              /* Create a new register to hold the value of the biv, and then
        !          2389:                 set the biv to its final value before the loop start.  The biv
        !          2390:                 is set to its final value before loop start to ensure that
        !          2391:                 this insn will always be executed, no matter how the loop
        !          2392:                 exits.  */
        !          2393:              rtx tem = gen_reg_rtx (bl->biv->mode);
        !          2394:              emit_insn_before (gen_move_insn (tem, bl->biv->src_reg),
        !          2395:                                loop_start);
        !          2396:              emit_insn_before (gen_move_insn (bl->biv->src_reg,
        !          2397:                                               biv_final_value),
        !          2398:                                loop_start);
        !          2399: 
        !          2400:              if (loop_dump_stream)
        !          2401:                fprintf (loop_dump_stream, "Biv %d mapped to %d for split.\n",
        !          2402:                         REGNO (bl->biv->src_reg), REGNO (tem));
        !          2403: 
        !          2404:              /* Set up the mapping from the original biv register to the new
        !          2405:                 register.  */
        !          2406:              bl->biv->src_reg = tem;
        !          2407:            }
        !          2408:        }
        !          2409:     }
        !          2410:   return result;
        !          2411: }
        !          2412: 
        !          2413: /* For every giv based on the biv BL, check to determine whether it is
        !          2414:    splittable.  This is a subroutine to find_splittable_regs ().
        !          2415: 
        !          2416:    Return the number of instructions that set splittable registers.  */
        !          2417: 
        !          2418: static int
        !          2419: find_splittable_givs (bl, unroll_type, loop_start, loop_end, increment,
        !          2420:                      unroll_number)
        !          2421:      struct iv_class *bl;
        !          2422:      enum unroll_types unroll_type;
        !          2423:      rtx loop_start, loop_end;
        !          2424:      rtx increment;
        !          2425:      int unroll_number;
        !          2426: {
        !          2427:   struct induction *v;
        !          2428:   rtx final_value;
        !          2429:   rtx tem;
        !          2430:   int result = 0;
        !          2431: 
        !          2432:   for (v = bl->giv; v; v = v->next_iv)
        !          2433:     {
        !          2434:       rtx giv_inc, value;
        !          2435: 
        !          2436:       /* Only split the giv if it has already been reduced, or if the loop is
        !          2437:         being completely unrolled.  */
        !          2438:       if (unroll_type != UNROLL_COMPLETELY && v->ignore)
        !          2439:        continue;
        !          2440: 
        !          2441:       /* The giv can be split if the insn that sets the giv is executed once
        !          2442:         and only once on every iteration of the loop.  */
        !          2443:       /* An address giv can always be split.  v->insn is just a use not a set,
        !          2444:         and hence it does not matter whether it is always executed.  All that
        !          2445:         matters is that all the biv increments are always executed, and we
        !          2446:         won't reach here if they aren't.  */
        !          2447:       if (v->giv_type != DEST_ADDR
        !          2448:          && (! v->always_computable
        !          2449:              || back_branch_in_range_p (v->insn, loop_start, loop_end)))
        !          2450:        continue;
        !          2451:       
        !          2452:       /* The giv increment value must be a constant.  */
        !          2453:       giv_inc = fold_rtx_mult_add (v->mult_val, increment, const0_rtx,
        !          2454:                                   v->mode);
        !          2455:       if (! giv_inc || GET_CODE (giv_inc) != CONST_INT)
        !          2456:        continue;
        !          2457: 
        !          2458:       /* The loop must be unrolled completely, or else have a known number of
        !          2459:         iterations and only one exit, or else the giv must be dead outside
        !          2460:         the loop, or else the final value of the giv must be known.
        !          2461:         Otherwise, it is not safe to split the giv since it may not have the
        !          2462:         proper value on loop exit.  */
        !          2463:          
        !          2464:       /* The used outside loop test will fail for DEST_ADDR givs.  They are
        !          2465:         never used outside the loop anyways, so it is always safe to split a
        !          2466:         DEST_ADDR giv.  */
        !          2467: 
        !          2468:       final_value = 0;
        !          2469:       if (unroll_type != UNROLL_COMPLETELY
        !          2470:          && (loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]]
        !          2471:              || unroll_type == UNROLL_NAIVE)
        !          2472:          && v->giv_type != DEST_ADDR
        !          2473:          && ((regno_first_uid[REGNO (v->dest_reg)] != INSN_UID (v->insn)
        !          2474:               /* Check for the case where the pseudo is set by a shift/add
        !          2475:                  sequence, in which case the first insn setting the pseudo
        !          2476:                  is the first insn of the shift/add sequence.  */
        !          2477:               && (! (tem = find_reg_note (v->insn, REG_RETVAL, NULL_RTX))
        !          2478:                   || (regno_first_uid[REGNO (v->dest_reg)]
        !          2479:                       != INSN_UID (XEXP (tem, 0)))))
        !          2480:              /* Line above always fails if INSN was moved by loop opt.  */
        !          2481:              || (uid_luid[regno_last_uid[REGNO (v->dest_reg)]]
        !          2482:                  >= INSN_LUID (loop_end)))
        !          2483:          && ! (final_value = v->final_value))
        !          2484:        continue;
        !          2485: 
        !          2486: #if 0
        !          2487:       /* Currently, non-reduced/final-value givs are never split.  */
        !          2488:       /* Should emit insns after the loop if possible, as the biv final value
        !          2489:         code below does.  */
        !          2490: 
        !          2491:       /* If the final value is non-zero, and the giv has not been reduced,
        !          2492:         then must emit an instruction to set the final value.  */
        !          2493:       if (final_value && !v->new_reg)
        !          2494:        {
        !          2495:          /* Create a new register to hold the value of the giv, and then set
        !          2496:             the giv to its final value before the loop start.  The giv is set
        !          2497:             to its final value before loop start to ensure that this insn
        !          2498:             will always be executed, no matter how we exit.  */
        !          2499:          tem = gen_reg_rtx (v->mode);
        !          2500:          emit_insn_before (gen_move_insn (tem, v->dest_reg), loop_start);
        !          2501:          emit_insn_before (gen_move_insn (v->dest_reg, final_value),
        !          2502:                            loop_start);
        !          2503:          
        !          2504:          if (loop_dump_stream)
        !          2505:            fprintf (loop_dump_stream, "Giv %d mapped to %d for split.\n",
        !          2506:                     REGNO (v->dest_reg), REGNO (tem));
        !          2507:          
        !          2508:          v->src_reg = tem;
        !          2509:        }
        !          2510: #endif
        !          2511: 
        !          2512:       /* This giv is splittable.  If completely unrolling the loop, save the
        !          2513:         giv's initial value.  Otherwise, save the constant zero for it.  */
        !          2514: 
        !          2515:       if (unroll_type == UNROLL_COMPLETELY)
        !          2516:        {
        !          2517:          /* It is not safe to use bl->initial_value here, because it may not
        !          2518:             be invariant.  It is safe to use the initial value stored in
        !          2519:             the splittable_regs array if it is set.  In rare cases, it won't
        !          2520:             be set, so then we do exactly the same thing as
        !          2521:             find_splittable_regs does to get a safe value.  */
        !          2522:          rtx biv_initial_value;
        !          2523: 
        !          2524:          if (splittable_regs[bl->regno])
        !          2525:            biv_initial_value = splittable_regs[bl->regno];
        !          2526:          else if (GET_CODE (bl->initial_value) != REG
        !          2527:                   || (REGNO (bl->initial_value) != bl->regno
        !          2528:                       && REGNO (bl->initial_value) >= FIRST_PSEUDO_REGISTER))
        !          2529:            biv_initial_value = bl->initial_value;
        !          2530:          else
        !          2531:            {
        !          2532:              rtx tem = gen_reg_rtx (bl->biv->mode);
        !          2533: 
        !          2534:              emit_insn_before (gen_move_insn (tem, bl->biv->src_reg),
        !          2535:                                loop_start);
        !          2536:              biv_initial_value = tem;
        !          2537:            }
        !          2538:          value = fold_rtx_mult_add (v->mult_val, biv_initial_value,
        !          2539:                                     v->add_val, v->mode);
        !          2540:        }
        !          2541:       else
        !          2542:        value = const0_rtx;
        !          2543: 
        !          2544:       if (v->new_reg)
        !          2545:        {
        !          2546:          /* If a giv was combined with another giv, then we can only split
        !          2547:             this giv if the giv it was combined with was reduced.  This
        !          2548:             is because the value of v->new_reg is meaningless in this
        !          2549:             case.  */
        !          2550:          if (v->same && ! v->same->new_reg)
        !          2551:            {
        !          2552:              if (loop_dump_stream)
        !          2553:                fprintf (loop_dump_stream,
        !          2554:                         "giv combined with unreduced giv not split.\n");
        !          2555:              continue;
        !          2556:            }
        !          2557:          /* If the giv is an address destination, it could be something other
        !          2558:             than a simple register, these have to be treated differently.  */
        !          2559:          else if (v->giv_type == DEST_REG)
        !          2560:            {
        !          2561:              /* If value is not a constant, register, or register plus
        !          2562:                 constant, then compute its value into a register before
        !          2563:                 loop start.  This prevents illegal rtx sharing, and should
        !          2564:                 generate better code.  We can use bl->initial_value here
        !          2565:                 instead of splittable_regs[bl->regno] because this code
        !          2566:                 is going before the loop start.  */
        !          2567:              if (unroll_type == UNROLL_COMPLETELY
        !          2568:                  && GET_CODE (value) != CONST_INT
        !          2569:                  && GET_CODE (value) != REG
        !          2570:                  && (GET_CODE (value) != PLUS
        !          2571:                      || GET_CODE (XEXP (value, 0)) != REG
        !          2572:                      || GET_CODE (XEXP (value, 1)) != CONST_INT))
        !          2573:                {
        !          2574:                  rtx tem = gen_reg_rtx (v->mode);
        !          2575:                  emit_iv_add_mult (bl->initial_value, v->mult_val,
        !          2576:                                    v->add_val, tem, loop_start);
        !          2577:                  value = tem;
        !          2578:                }
        !          2579:                
        !          2580:              splittable_regs[REGNO (v->new_reg)] = value;
        !          2581:            }
        !          2582:          else
        !          2583:            {
        !          2584:              /* Splitting address givs is useful since it will often allow us
        !          2585:                 to eliminate some increment insns for the base giv as
        !          2586:                 unnecessary.  */
        !          2587: 
        !          2588:              /* If the addr giv is combined with a dest_reg giv, then all
        !          2589:                 references to that dest reg will be remapped, which is NOT
        !          2590:                 what we want for split addr regs. We always create a new
        !          2591:                 register for the split addr giv, just to be safe.  */
        !          2592: 
        !          2593:              /* ??? If there are multiple address givs which have been
        !          2594:                 combined with the same dest_reg giv, then we may only need
        !          2595:                 one new register for them.  Pulling out constants below will
        !          2596:                 catch some of the common cases of this.  Currently, I leave
        !          2597:                 the work of simplifying multiple address givs to the
        !          2598:                 following cse pass.  */
        !          2599:              
        !          2600:              v->const_adjust = 0;
        !          2601:              if (unroll_type != UNROLL_COMPLETELY)
        !          2602:                {
        !          2603:                  /* If not completely unrolling the loop, then create a new
        !          2604:                     register to hold the split value of the DEST_ADDR giv.
        !          2605:                     Emit insn to initialize its value before loop start.  */
        !          2606:                  tem = gen_reg_rtx (v->mode);
        !          2607: 
        !          2608:                  /* If the address giv has a constant in its new_reg value,
        !          2609:                     then this constant can be pulled out and put in value,
        !          2610:                     instead of being part of the initialization code.  */
        !          2611:                  
        !          2612:                  if (GET_CODE (v->new_reg) == PLUS
        !          2613:                      && GET_CODE (XEXP (v->new_reg, 1)) == CONST_INT)
        !          2614:                    {
        !          2615:                      v->dest_reg
        !          2616:                        = plus_constant (tem, INTVAL (XEXP (v->new_reg,1)));
        !          2617:                      
        !          2618:                      /* Only succeed if this will give valid addresses.
        !          2619:                         Try to validate both the first and the last
        !          2620:                         address resulting from loop unrolling, if
        !          2621:                         one fails, then can't do const elim here.  */
        !          2622:                      if (memory_address_p (v->mem_mode, v->dest_reg)
        !          2623:                          && memory_address_p (v->mem_mode,
        !          2624:                                       plus_constant (v->dest_reg,
        !          2625:                                                      INTVAL (giv_inc)
        !          2626:                                                      * (unroll_number - 1))))
        !          2627:                        {
        !          2628:                          /* Save the negative of the eliminated const, so
        !          2629:                             that we can calculate the dest_reg's increment
        !          2630:                             value later.  */
        !          2631:                          v->const_adjust = - INTVAL (XEXP (v->new_reg, 1));
        !          2632: 
        !          2633:                          v->new_reg = XEXP (v->new_reg, 0);
        !          2634:                          if (loop_dump_stream)
        !          2635:                            fprintf (loop_dump_stream,
        !          2636:                                     "Eliminating constant from giv %d\n",
        !          2637:                                     REGNO (tem));
        !          2638:                        }
        !          2639:                      else
        !          2640:                        v->dest_reg = tem;
        !          2641:                    }
        !          2642:                  else
        !          2643:                    v->dest_reg = tem;
        !          2644:                  
        !          2645:                  /* If the address hasn't been checked for validity yet, do so
        !          2646:                     now, and fail completely if either the first or the last
        !          2647:                     unrolled copy of the address is not a valid address.  */
        !          2648:                  if (v->dest_reg == tem
        !          2649:                      && (! memory_address_p (v->mem_mode, v->dest_reg)
        !          2650:                          || ! memory_address_p (v->mem_mode,
        !          2651:                                 plus_constant (v->dest_reg,
        !          2652:                                                INTVAL (giv_inc)
        !          2653:                                                * (unroll_number -1)))))
        !          2654:                    {
        !          2655:                      if (loop_dump_stream)
        !          2656:                        fprintf (loop_dump_stream,
        !          2657:                                 "Illegal address for giv at insn %d\n",
        !          2658:                                 INSN_UID (v->insn));
        !          2659:                      continue;
        !          2660:                    }
        !          2661:                  
        !          2662:                  /* To initialize the new register, just move the value of
        !          2663:                     new_reg into it.  This is not guaranteed to give a valid
        !          2664:                     instruction on machines with complex addressing modes.
        !          2665:                     If we can't recognize it, then delete it and emit insns
        !          2666:                     to calculate the value from scratch.  */
        !          2667:                  emit_insn_before (gen_rtx (SET, VOIDmode, tem,
        !          2668:                                             copy_rtx (v->new_reg)),
        !          2669:                                    loop_start);
        !          2670:                  if (recog_memoized (PREV_INSN (loop_start)) < 0)
        !          2671:                    {
        !          2672:                      delete_insn (PREV_INSN (loop_start));
        !          2673:                      emit_iv_add_mult (bl->initial_value, v->mult_val,
        !          2674:                                        v->add_val, tem, loop_start);
        !          2675:                      if (loop_dump_stream)
        !          2676:                        fprintf (loop_dump_stream,
        !          2677:                                 "Illegal init insn, rewritten.\n");
        !          2678:                    }
        !          2679:                }
        !          2680:              else
        !          2681:                {
        !          2682:                  v->dest_reg = value;
        !          2683:                  
        !          2684:                  /* Check the resulting address for validity, and fail
        !          2685:                     if the resulting address would be illegal.  */
        !          2686:                  if (! memory_address_p (v->mem_mode, v->dest_reg)
        !          2687:                      || ! memory_address_p (v->mem_mode,
        !          2688:                                     plus_constant (v->dest_reg,
        !          2689:                                                    INTVAL (giv_inc) *
        !          2690:                                                    (unroll_number -1))))
        !          2691:                    {
        !          2692:                      if (loop_dump_stream)
        !          2693:                        fprintf (loop_dump_stream,
        !          2694:                                 "Illegal address for giv at insn %d\n",
        !          2695:                                 INSN_UID (v->insn));
        !          2696:                      continue;
        !          2697:                    }
        !          2698:                }
        !          2699:              
        !          2700:              /* Store the value of dest_reg into the insn.  This sharing
        !          2701:                 will not be a problem as this insn will always be copied
        !          2702:                 later.  */
        !          2703:              
        !          2704:              *v->location = v->dest_reg;
        !          2705:              
        !          2706:              /* If this address giv is combined with a dest reg giv, then
        !          2707:                 save the base giv's induction pointer so that we will be
        !          2708:                 able to handle this address giv properly.  The base giv
        !          2709:                 itself does not have to be splittable.  */
        !          2710:              
        !          2711:              if (v->same && v->same->giv_type == DEST_REG)
        !          2712:                addr_combined_regs[REGNO (v->same->new_reg)] = v->same;
        !          2713:              
        !          2714:              if (GET_CODE (v->new_reg) == REG)
        !          2715:                {
        !          2716:                  /* This giv maybe hasn't been combined with any others.
        !          2717:                     Make sure that it's giv is marked as splittable here.  */
        !          2718:                  
        !          2719:                  splittable_regs[REGNO (v->new_reg)] = value;
        !          2720:                  
        !          2721:                  /* Make it appear to depend upon itself, so that the
        !          2722:                     giv will be properly split in the main loop above.  */
        !          2723:                  if (! v->same)
        !          2724:                    {
        !          2725:                      v->same = v;
        !          2726:                      addr_combined_regs[REGNO (v->new_reg)] = v;
        !          2727:                    }
        !          2728:                }
        !          2729: 
        !          2730:              if (loop_dump_stream)
        !          2731:                fprintf (loop_dump_stream, "DEST_ADDR giv being split.\n");
        !          2732:            }
        !          2733:        }
        !          2734:       else
        !          2735:        {
        !          2736: #if 0
        !          2737:          /* Currently, unreduced giv's can't be split.  This is not too much
        !          2738:             of a problem since unreduced giv's are not live across loop
        !          2739:             iterations anyways.  When unrolling a loop completely though,
        !          2740:             it makes sense to reduce&split givs when possible, as this will
        !          2741:             result in simpler instructions, and will not require that a reg
        !          2742:             be live across loop iterations.  */
        !          2743:          
        !          2744:          splittable_regs[REGNO (v->dest_reg)] = value;
        !          2745:          fprintf (stderr, "Giv %d at insn %d not reduced\n",
        !          2746:                   REGNO (v->dest_reg), INSN_UID (v->insn));
        !          2747: #else
        !          2748:          continue;
        !          2749: #endif
        !          2750:        }
        !          2751:       
        !          2752:       /* Givs are only updated once by definition.  Mark it so if this is
        !          2753:         a splittable register.  Don't need to do anything for address givs
        !          2754:         where this may not be a register.  */
        !          2755: 
        !          2756:       if (GET_CODE (v->new_reg) == REG)
        !          2757:        splittable_regs_updates[REGNO (v->new_reg)] = 1;
        !          2758: 
        !          2759:       result++;
        !          2760:       
        !          2761:       if (loop_dump_stream)
        !          2762:        {
        !          2763:          int regnum;
        !          2764:          
        !          2765:          if (GET_CODE (v->dest_reg) == CONST_INT)
        !          2766:            regnum = -1;
        !          2767:          else if (GET_CODE (v->dest_reg) != REG)
        !          2768:            regnum = REGNO (XEXP (v->dest_reg, 0));
        !          2769:          else
        !          2770:            regnum = REGNO (v->dest_reg);
        !          2771:          fprintf (loop_dump_stream, "Giv %d at insn %d safe to split.\n",
        !          2772:                   regnum, INSN_UID (v->insn));
        !          2773:        }
        !          2774:     }
        !          2775: 
        !          2776:   return result;
        !          2777: }
        !          2778: 
        !          2779: /* Try to prove that the register is dead after the loop exits.  Trace every
        !          2780:    loop exit looking for an insn that will always be executed, which sets
        !          2781:    the register to some value, and appears before the first use of the register
        !          2782:    is found.  If successful, then return 1, otherwise return 0.  */
        !          2783: 
        !          2784: /* ?? Could be made more intelligent in the handling of jumps, so that
        !          2785:    it can search past if statements and other similar structures.  */
        !          2786: 
        !          2787: static int
        !          2788: reg_dead_after_loop (reg, loop_start, loop_end)
        !          2789:      rtx reg, loop_start, loop_end;
        !          2790: {
        !          2791:   rtx insn, label;
        !          2792:   enum rtx_code code;
        !          2793:   int jump_count = 0;
        !          2794: 
        !          2795:   /* HACK: Must also search the loop fall through exit, create a label_ref
        !          2796:      here which points to the loop_end, and append the loop_number_exit_labels
        !          2797:      list to it.  */
        !          2798:   label = gen_rtx (LABEL_REF, VOIDmode, loop_end);
        !          2799:   LABEL_NEXTREF (label)
        !          2800:     = loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]];
        !          2801: 
        !          2802:   for ( ; label; label = LABEL_NEXTREF (label))
        !          2803:     {
        !          2804:       /* Succeed if find an insn which sets the biv or if reach end of
        !          2805:         function.  Fail if find an insn that uses the biv, or if come to
        !          2806:         a conditional jump.  */
        !          2807: 
        !          2808:       insn = NEXT_INSN (XEXP (label, 0));
        !          2809:       while (insn)
        !          2810:        {
        !          2811:          code = GET_CODE (insn);
        !          2812:          if (GET_RTX_CLASS (code) == 'i')
        !          2813:            {
        !          2814:              rtx set;
        !          2815: 
        !          2816:              if (reg_referenced_p (reg, PATTERN (insn)))
        !          2817:                return 0;
        !          2818: 
        !          2819:              set = single_set (insn);
        !          2820:              if (set && rtx_equal_p (SET_DEST (set), reg))
        !          2821:                break;
        !          2822:            }
        !          2823: 
        !          2824:          if (code == JUMP_INSN)
        !          2825:            {
        !          2826:              if (GET_CODE (PATTERN (insn)) == RETURN)
        !          2827:                break;
        !          2828:              else if (! simplejump_p (insn)
        !          2829:                       /* Prevent infinite loop following infinite loops. */
        !          2830:                       || jump_count++ > 20)
        !          2831:                return 0;
        !          2832:              else
        !          2833:                insn = JUMP_LABEL (insn);
        !          2834:            }
        !          2835: 
        !          2836:          insn = NEXT_INSN (insn);
        !          2837:        }
        !          2838:     }
        !          2839: 
        !          2840:   /* Success, the register is dead on all loop exits.  */
        !          2841:   return 1;
        !          2842: }
        !          2843: 
        !          2844: /* Try to calculate the final value of the biv, the value it will have at
        !          2845:    the end of the loop.  If we can do it, return that value.  */
        !          2846:   
        !          2847: rtx
        !          2848: final_biv_value (bl, loop_start, loop_end)
        !          2849:      struct iv_class *bl;
        !          2850:      rtx loop_start, loop_end;
        !          2851: {
        !          2852:   rtx increment, tem;
        !          2853: 
        !          2854:   /* ??? This only works for MODE_INT biv's.  Reject all others for now.  */
        !          2855: 
        !          2856:   if (GET_MODE_CLASS (bl->biv->mode) != MODE_INT)
        !          2857:     return 0;
        !          2858: 
        !          2859:   /* The final value for reversed bivs must be calculated differently than
        !          2860:       for ordinary bivs.  In this case, there is already an insn after the
        !          2861:      loop which sets this biv's final value (if necessary), and there are
        !          2862:      no other loop exits, so we can return any value.  */
        !          2863:   if (bl->reversed)
        !          2864:     {
        !          2865:       if (loop_dump_stream)
        !          2866:        fprintf (loop_dump_stream,
        !          2867:                 "Final biv value for %d, reversed biv.\n", bl->regno);
        !          2868:                 
        !          2869:       return const0_rtx;
        !          2870:     }
        !          2871: 
        !          2872:   /* Try to calculate the final value as initial value + (number of iterations
        !          2873:      * increment).  For this to work, increment must be invariant, the only
        !          2874:      exit from the loop must be the fall through at the bottom (otherwise
        !          2875:      it may not have its final value when the loop exits), and the initial
        !          2876:      value of the biv must be invariant.  */
        !          2877: 
        !          2878:   if (loop_n_iterations != 0
        !          2879:       && ! loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]]
        !          2880:       && invariant_p (bl->initial_value))
        !          2881:     {
        !          2882:       increment = biv_total_increment (bl, loop_start, loop_end);
        !          2883:       
        !          2884:       if (increment && invariant_p (increment))
        !          2885:        {
        !          2886:          /* Can calculate the loop exit value, emit insns after loop
        !          2887:             end to calculate this value into a temporary register in
        !          2888:             case it is needed later.  */
        !          2889: 
        !          2890:          tem = gen_reg_rtx (bl->biv->mode);
        !          2891:          /* Make sure loop_end is not the last insn.  */
        !          2892:          if (NEXT_INSN (loop_end) == 0)
        !          2893:            emit_note_after (NOTE_INSN_DELETED, loop_end);
        !          2894:          emit_iv_add_mult (increment, GEN_INT (loop_n_iterations),
        !          2895:                            bl->initial_value, tem, NEXT_INSN (loop_end));
        !          2896: 
        !          2897:          if (loop_dump_stream)
        !          2898:            fprintf (loop_dump_stream,
        !          2899:                     "Final biv value for %d, calculated.\n", bl->regno);
        !          2900:          
        !          2901:          return tem;
        !          2902:        }
        !          2903:     }
        !          2904: 
        !          2905:   /* Check to see if the biv is dead at all loop exits.  */
        !          2906:   if (reg_dead_after_loop (bl->biv->src_reg, loop_start, loop_end))
        !          2907:     {
        !          2908:       if (loop_dump_stream)
        !          2909:        fprintf (loop_dump_stream,
        !          2910:                 "Final biv value for %d, biv dead after loop exit.\n",
        !          2911:                 bl->regno);
        !          2912: 
        !          2913:       return const0_rtx;
        !          2914:     }
        !          2915: 
        !          2916:   return 0;
        !          2917: }
        !          2918: 
        !          2919: /* Try to calculate the final value of the giv, the value it will have at
        !          2920:    the end of the loop.  If we can do it, return that value.  */
        !          2921: 
        !          2922: rtx
        !          2923: final_giv_value (v, loop_start, loop_end)
        !          2924:      struct induction *v;
        !          2925:      rtx loop_start, loop_end;
        !          2926: {
        !          2927:   struct iv_class *bl;
        !          2928:   rtx insn;
        !          2929:   rtx increment, tem;
        !          2930:   enum rtx_code code;
        !          2931:   rtx insert_before, seq;
        !          2932: 
        !          2933:   bl = reg_biv_class[REGNO (v->src_reg)];
        !          2934: 
        !          2935:   /* The final value for givs which depend on reversed bivs must be calculated
        !          2936:      differently than for ordinary givs.  In this case, there is already an
        !          2937:      insn after the loop which sets this giv's final value (if necessary),
        !          2938:      and there are no other loop exits, so we can return any value.  */
        !          2939:   if (bl->reversed)
        !          2940:     {
        !          2941:       if (loop_dump_stream)
        !          2942:        fprintf (loop_dump_stream,
        !          2943:                 "Final giv value for %d, depends on reversed biv\n",
        !          2944:                 REGNO (v->dest_reg));
        !          2945:       return const0_rtx;
        !          2946:     }
        !          2947: 
        !          2948:   /* Try to calculate the final value as a function of the biv it depends
        !          2949:      upon.  The only exit from the loop must be the fall through at the bottom
        !          2950:      (otherwise it may not have its final value when the loop exits).  */
        !          2951:       
        !          2952:   /* ??? Can calculate the final giv value by subtracting off the
        !          2953:      extra biv increments times the giv's mult_val.  The loop must have
        !          2954:      only one exit for this to work, but the loop iterations does not need
        !          2955:      to be known.  */
        !          2956: 
        !          2957:   if (loop_n_iterations != 0
        !          2958:       && ! loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]])
        !          2959:     {
        !          2960:       /* ?? It is tempting to use the biv's value here since these insns will
        !          2961:         be put after the loop, and hence the biv will have its final value
        !          2962:         then.  However, this fails if the biv is subsequently eliminated.
        !          2963:         Perhaps determine whether biv's are eliminable before trying to
        !          2964:         determine whether giv's are replaceable so that we can use the
        !          2965:         biv value here if it is not eliminable.  */
        !          2966: 
        !          2967:       increment = biv_total_increment (bl, loop_start, loop_end);
        !          2968: 
        !          2969:       if (increment && invariant_p (increment))
        !          2970:        {
        !          2971:          /* Can calculate the loop exit value of its biv as
        !          2972:             (loop_n_iterations * increment) + initial_value */
        !          2973:              
        !          2974:          /* The loop exit value of the giv is then
        !          2975:             (final_biv_value - extra increments) * mult_val + add_val.
        !          2976:             The extra increments are any increments to the biv which
        !          2977:             occur in the loop after the giv's value is calculated.
        !          2978:             We must search from the insn that sets the giv to the end
        !          2979:             of the loop to calculate this value.  */
        !          2980: 
        !          2981:          insert_before = NEXT_INSN (loop_end);
        !          2982: 
        !          2983:          /* Put the final biv value in tem.  */
        !          2984:          tem = gen_reg_rtx (bl->biv->mode);
        !          2985:          emit_iv_add_mult (increment, GEN_INT (loop_n_iterations),
        !          2986:                            bl->initial_value, tem, insert_before);
        !          2987: 
        !          2988:          /* Subtract off extra increments as we find them.  */
        !          2989:          for (insn = NEXT_INSN (v->insn); insn != loop_end;
        !          2990:               insn = NEXT_INSN (insn))
        !          2991:            {
        !          2992:              struct induction *biv;
        !          2993: 
        !          2994:              for (biv = bl->biv; biv; biv = biv->next_iv)
        !          2995:                if (biv->insn == insn)
        !          2996:                  {
        !          2997:                    start_sequence ();
        !          2998:                    tem = expand_binop (GET_MODE (tem), sub_optab, tem,
        !          2999:                                        biv->add_val, NULL_RTX, 0,
        !          3000:                                        OPTAB_LIB_WIDEN);
        !          3001:                    seq = gen_sequence ();
        !          3002:                    end_sequence ();
        !          3003:                    emit_insn_before (seq, insert_before);
        !          3004:                  }
        !          3005:            }
        !          3006:          
        !          3007:          /* Now calculate the giv's final value.  */
        !          3008:          emit_iv_add_mult (tem, v->mult_val, v->add_val, tem,
        !          3009:                            insert_before);
        !          3010:          
        !          3011:          if (loop_dump_stream)
        !          3012:            fprintf (loop_dump_stream,
        !          3013:                     "Final giv value for %d, calc from biv's value.\n",
        !          3014:                     REGNO (v->dest_reg));
        !          3015: 
        !          3016:          return tem;
        !          3017:        }
        !          3018:     }
        !          3019: 
        !          3020:   /* Replaceable giv's should never reach here.  */
        !          3021:   if (v->replaceable)
        !          3022:     abort ();
        !          3023: 
        !          3024:   /* Check to see if the biv is dead at all loop exits.  */
        !          3025:   if (reg_dead_after_loop (v->dest_reg, loop_start, loop_end))
        !          3026:     {
        !          3027:       if (loop_dump_stream)
        !          3028:        fprintf (loop_dump_stream,
        !          3029:                 "Final giv value for %d, giv dead after loop exit.\n",
        !          3030:                 REGNO (v->dest_reg));
        !          3031: 
        !          3032:       return const0_rtx;
        !          3033:     }
        !          3034: 
        !          3035:   return 0;
        !          3036: }
        !          3037: 
        !          3038: 
        !          3039: /* Calculate the number of loop iterations.  Returns the exact number of loop
        !          3040:    iterations if it can be calculated, otherwise returns zero.  */
        !          3041: 
        !          3042: unsigned HOST_WIDE_INT
        !          3043: loop_iterations (loop_start, loop_end)
        !          3044:      rtx loop_start, loop_end;
        !          3045: {
        !          3046:   rtx comparison, comparison_value;
        !          3047:   rtx iteration_var, initial_value, increment, final_value;
        !          3048:   enum rtx_code comparison_code;
        !          3049:   HOST_WIDE_INT i;
        !          3050:   int increment_dir;
        !          3051:   int unsigned_compare, compare_dir, final_larger;
        !          3052:   unsigned long tempu;
        !          3053:   rtx last_loop_insn;
        !          3054: 
        !          3055:   /* First find the iteration variable.  If the last insn is a conditional
        !          3056:      branch, and the insn before tests a register value, make that the
        !          3057:      iteration variable.  */
        !          3058:   
        !          3059:   loop_initial_value = 0;
        !          3060:   loop_increment = 0;
        !          3061:   loop_final_value = 0;
        !          3062:   loop_iteration_var = 0;
        !          3063: 
        !          3064:   last_loop_insn = prev_nonnote_insn (loop_end);
        !          3065: 
        !          3066:   comparison = get_condition_for_loop (last_loop_insn);
        !          3067:   if (comparison == 0)
        !          3068:     {
        !          3069:       if (loop_dump_stream)
        !          3070:        fprintf (loop_dump_stream,
        !          3071:                 "Loop unrolling: No final conditional branch found.\n");
        !          3072:       return 0;
        !          3073:     }
        !          3074: 
        !          3075:   /* ??? Get_condition may switch position of induction variable and
        !          3076:      invariant register when it canonicalizes the comparison.  */
        !          3077: 
        !          3078:   comparison_code = GET_CODE (comparison);
        !          3079:   iteration_var = XEXP (comparison, 0);
        !          3080:   comparison_value = XEXP (comparison, 1);
        !          3081: 
        !          3082:   if (GET_CODE (iteration_var) != REG)
        !          3083:     {
        !          3084:       if (loop_dump_stream)
        !          3085:        fprintf (loop_dump_stream,
        !          3086:                 "Loop unrolling: Comparison not against register.\n");
        !          3087:       return 0;
        !          3088:     }
        !          3089: 
        !          3090:   /* Loop iterations is always called before any new registers are created
        !          3091:      now, so this should never occur.  */
        !          3092: 
        !          3093:   if (REGNO (iteration_var) >= max_reg_before_loop)
        !          3094:     abort ();
        !          3095: 
        !          3096:   iteration_info (iteration_var, &initial_value, &increment,
        !          3097:                  loop_start, loop_end);
        !          3098:   if (initial_value == 0)
        !          3099:     /* iteration_info already printed a message.  */
        !          3100:     return 0;
        !          3101: 
        !          3102:   if (increment == 0)
        !          3103:     {
        !          3104:       if (loop_dump_stream)
        !          3105:        fprintf (loop_dump_stream,
        !          3106:                 "Loop unrolling: Increment value can't be calculated.\n");
        !          3107:       return 0;
        !          3108:     }
        !          3109:   if (GET_CODE (increment) != CONST_INT)
        !          3110:     {
        !          3111:       if (loop_dump_stream)
        !          3112:        fprintf (loop_dump_stream,
        !          3113:                 "Loop unrolling: Increment value not constant.\n");
        !          3114:       return 0;
        !          3115:     }
        !          3116:   if (GET_CODE (initial_value) != CONST_INT)
        !          3117:     {
        !          3118:       if (loop_dump_stream)
        !          3119:        fprintf (loop_dump_stream,
        !          3120:                 "Loop unrolling: Initial value not constant.\n");
        !          3121:       return 0;
        !          3122:     }
        !          3123: 
        !          3124:   /* If the comparison value is an invariant register, then try to find
        !          3125:      its value from the insns before the start of the loop.  */
        !          3126: 
        !          3127:   if (GET_CODE (comparison_value) == REG && invariant_p (comparison_value))
        !          3128:     {
        !          3129:       rtx insn, set;
        !          3130:     
        !          3131:       for (insn = PREV_INSN (loop_start); insn ; insn = PREV_INSN (insn))
        !          3132:        {
        !          3133:          if (GET_CODE (insn) == CODE_LABEL)
        !          3134:            break;
        !          3135: 
        !          3136:          else if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
        !          3137:                   && reg_set_p (comparison_value, insn))
        !          3138:            {
        !          3139:              /* We found the last insn before the loop that sets the register.
        !          3140:                 If it sets the entire register, and has a REG_EQUAL note,
        !          3141:                 then use the value of the REG_EQUAL note.  */
        !          3142:              if ((set = single_set (insn))
        !          3143:                  && (SET_DEST (set) == comparison_value))
        !          3144:                {
        !          3145:                  rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
        !          3146: 
        !          3147:                  if (note && GET_CODE (XEXP (note, 0)) != EXPR_LIST)
        !          3148:                    comparison_value = XEXP (note, 0);
        !          3149:                }
        !          3150:              break;
        !          3151:            }
        !          3152:        }
        !          3153:     }
        !          3154: 
        !          3155:   final_value = approx_final_value (comparison_code, comparison_value,
        !          3156:                                    &unsigned_compare, &compare_dir);
        !          3157: 
        !          3158:   /* Save the calculated values describing this loop's bounds, in case
        !          3159:      precondition_loop_p will need them later.  These values can not be
        !          3160:      recalculated inside precondition_loop_p because strength reduction
        !          3161:      optimizations may obscure the loop's structure.  */
        !          3162: 
        !          3163:   loop_iteration_var = iteration_var;
        !          3164:   loop_initial_value = initial_value;
        !          3165:   loop_increment = increment;
        !          3166:   loop_final_value = final_value;
        !          3167: 
        !          3168:   if (final_value == 0)
        !          3169:     {
        !          3170:       if (loop_dump_stream)
        !          3171:        fprintf (loop_dump_stream,
        !          3172:                 "Loop unrolling: EQ comparison loop.\n");
        !          3173:       return 0;
        !          3174:     }
        !          3175:   else if (GET_CODE (final_value) != CONST_INT)
        !          3176:     {
        !          3177:       if (loop_dump_stream)
        !          3178:        fprintf (loop_dump_stream,
        !          3179:                 "Loop unrolling: Final value not constant.\n");
        !          3180:       return 0;
        !          3181:     }
        !          3182: 
        !          3183:   /* ?? Final value and initial value do not have to be constants.
        !          3184:      Only their difference has to be constant.  When the iteration variable
        !          3185:      is an array address, the final value and initial value might both
        !          3186:      be addresses with the same base but different constant offsets.
        !          3187:      Final value must be invariant for this to work.
        !          3188: 
        !          3189:      To do this, need some way to find the values of registers which are
        !          3190:      invariant.  */
        !          3191: 
        !          3192:   /* Final_larger is 1 if final larger, 0 if they are equal, otherwise -1.  */
        !          3193:   if (unsigned_compare)
        !          3194:     final_larger
        !          3195:       = ((unsigned HOST_WIDE_INT) INTVAL (final_value)
        !          3196:         > (unsigned HOST_WIDE_INT) INTVAL (initial_value))
        !          3197:        - ((unsigned HOST_WIDE_INT) INTVAL (final_value)
        !          3198:           < (unsigned HOST_WIDE_INT) INTVAL (initial_value));
        !          3199:   else
        !          3200:     final_larger = (INTVAL (final_value) > INTVAL (initial_value))
        !          3201:       - (INTVAL (final_value) < INTVAL (initial_value));
        !          3202: 
        !          3203:   if (INTVAL (increment) > 0)
        !          3204:     increment_dir = 1;
        !          3205:   else if (INTVAL (increment) == 0)
        !          3206:     increment_dir = 0;
        !          3207:   else
        !          3208:     increment_dir = -1;
        !          3209: 
        !          3210:   /* There are 27 different cases: compare_dir = -1, 0, 1;
        !          3211:      final_larger = -1, 0, 1; increment_dir = -1, 0, 1.
        !          3212:      There are 4 normal cases, 4 reverse cases (where the iteration variable
        !          3213:      will overflow before the loop exits), 4 infinite loop cases, and 15
        !          3214:      immediate exit (0 or 1 iteration depending on loop type) cases.
        !          3215:      Only try to optimize the normal cases.  */
        !          3216:      
        !          3217:   /* (compare_dir/final_larger/increment_dir)
        !          3218:      Normal cases: (0/-1/-1), (0/1/1), (-1/-1/-1), (1/1/1)
        !          3219:      Reverse cases: (0/-1/1), (0/1/-1), (-1/-1/1), (1/1/-1)
        !          3220:      Infinite loops: (0/-1/0), (0/1/0), (-1/-1/0), (1/1/0)
        !          3221:      Immediate exit: (0/0/X), (-1/0/X), (-1/1/X), (1/0/X), (1/-1/X) */
        !          3222: 
        !          3223:   /* ?? If the meaning of reverse loops (where the iteration variable
        !          3224:      will overflow before the loop exits) is undefined, then could
        !          3225:      eliminate all of these special checks, and just always assume
        !          3226:      the loops are normal/immediate/infinite.  Note that this means
        !          3227:      the sign of increment_dir does not have to be known.  Also,
        !          3228:      since it does not really hurt if immediate exit loops or infinite loops
        !          3229:      are optimized, then that case could be ignored also, and hence all
        !          3230:      loops can be optimized.
        !          3231: 
        !          3232:      According to ANSI Spec, the reverse loop case result is undefined,
        !          3233:      because the action on overflow is undefined.
        !          3234: 
        !          3235:      See also the special test for NE loops below.  */
        !          3236: 
        !          3237:   if (final_larger == increment_dir && final_larger != 0
        !          3238:       && (final_larger == compare_dir || compare_dir == 0))
        !          3239:     /* Normal case.  */
        !          3240:     ;
        !          3241:   else
        !          3242:     {
        !          3243:       if (loop_dump_stream)
        !          3244:        fprintf (loop_dump_stream,
        !          3245:                 "Loop unrolling: Not normal loop.\n");
        !          3246:       return 0;
        !          3247:     }
        !          3248: 
        !          3249:   /* Calculate the number of iterations, final_value is only an approximation,
        !          3250:      so correct for that.  Note that tempu and loop_n_iterations are
        !          3251:      unsigned, because they can be as large as 2^n - 1.  */
        !          3252: 
        !          3253:   i = INTVAL (increment);
        !          3254:   if (i > 0)
        !          3255:     tempu = INTVAL (final_value) - INTVAL (initial_value);
        !          3256:   else if (i < 0)
        !          3257:     {
        !          3258:       tempu = INTVAL (initial_value) - INTVAL (final_value);
        !          3259:       i = -i;
        !          3260:     }
        !          3261:   else
        !          3262:     abort ();
        !          3263: 
        !          3264:   /* For NE tests, make sure that the iteration variable won't miss the
        !          3265:      final value.  If tempu mod i is not zero, then the iteration variable
        !          3266:      will overflow before the loop exits, and we can not calculate the
        !          3267:      number of iterations.  */
        !          3268:   if (compare_dir == 0 && (tempu % i) != 0)
        !          3269:     return 0;
        !          3270: 
        !          3271:   return tempu / i + ((tempu % i) != 0);
        !          3272: }

unix.superglobalmegacorp.com

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