OSDN Git Service

2003-01-30 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
[pf3gnuchains/gcc-fork.git] / gcc / unroll.c
1 /* Try to unroll loops, and split induction variables.
2    Copyright (C) 1992, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002
3    Free Software Foundation, Inc.
4    Contributed by James E. Wilson, Cygnus Support/UC Berkeley.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING.  If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA.  */
22
23 /* Try to unroll a loop, and split induction variables.
24
25    Loops for which the number of iterations can be calculated exactly are
26    handled specially.  If the number of iterations times the insn_count is
27    less than MAX_UNROLLED_INSNS, then the loop is unrolled completely.
28    Otherwise, we try to unroll the loop a number of times modulo the number
29    of iterations, so that only one exit test will be needed.  It is unrolled
30    a number of times approximately equal to MAX_UNROLLED_INSNS divided by
31    the insn count.
32
33    Otherwise, if the number of iterations can be calculated exactly at
34    run time, and the loop is always entered at the top, then we try to
35    precondition the loop.  That is, at run time, calculate how many times
36    the loop will execute, and then execute the loop body a few times so
37    that the remaining iterations will be some multiple of 4 (or 2 if the
38    loop is large).  Then fall through to a loop unrolled 4 (or 2) times,
39    with only one exit test needed at the end of the loop.
40
41    Otherwise, if the number of iterations can not be calculated exactly,
42    not even at run time, then we still unroll the loop a number of times
43    approximately equal to MAX_UNROLLED_INSNS divided by the insn count,
44    but there must be an exit test after each copy of the loop body.
45
46    For each induction variable, which is dead outside the loop (replaceable)
47    or for which we can easily calculate the final value, if we can easily
48    calculate its value at each place where it is set as a function of the
49    current loop unroll count and the variable's value at loop entry, then
50    the induction variable is split into `N' different variables, one for
51    each copy of the loop body.  One variable is live across the backward
52    branch, and the others are all calculated as a function of this variable.
53    This helps eliminate data dependencies, and leads to further opportunities
54    for cse.  */
55
56 /* Possible improvements follow:  */
57
58 /* ??? Add an extra pass somewhere to determine whether unrolling will
59    give any benefit.  E.g. after generating all unrolled insns, compute the
60    cost of all insns and compare against cost of insns in rolled loop.
61
62    - On traditional architectures, unrolling a non-constant bound loop
63      is a win if there is a giv whose only use is in memory addresses, the
64      memory addresses can be split, and hence giv increments can be
65      eliminated.
66    - It is also a win if the loop is executed many times, and preconditioning
67      can be performed for the loop.
68    Add code to check for these and similar cases.  */
69
70 /* ??? Improve control of which loops get unrolled.  Could use profiling
71    info to only unroll the most commonly executed loops.  Perhaps have
72    a user specifiable option to control the amount of code expansion,
73    or the percent of loops to consider for unrolling.  Etc.  */
74
75 /* ??? Look at the register copies inside the loop to see if they form a
76    simple permutation.  If so, iterate the permutation until it gets back to
77    the start state.  This is how many times we should unroll the loop, for
78    best results, because then all register copies can be eliminated.
79    For example, the lisp nreverse function should be unrolled 3 times
80    while (this)
81      {
82        next = this->cdr;
83        this->cdr = prev;
84        prev = this;
85        this = next;
86      }
87
88    ??? The number of times to unroll the loop may also be based on data
89    references in the loop.  For example, if we have a loop that references
90    x[i-1], x[i], and x[i+1], we should unroll it a multiple of 3 times.  */
91
92 /* ??? Add some simple linear equation solving capability so that we can
93    determine the number of loop iterations for more complex loops.
94    For example, consider this loop from gdb
95    #define SWAP_TARGET_AND_HOST(buffer,len)
96      {
97        char tmp;
98        char *p = (char *) buffer;
99        char *q = ((char *) buffer) + len - 1;
100        int iterations = (len + 1) >> 1;
101        int i;
102        for (p; p < q; p++, q--;)
103          {
104            tmp = *q;
105            *q = *p;
106            *p = tmp;
107          }
108      }
109    Note that:
110      start value = p = &buffer + current_iteration
111      end value   = q = &buffer + len - 1 - current_iteration
112    Given the loop exit test of "p < q", then there must be "q - p" iterations,
113    set equal to zero and solve for number of iterations:
114      q - p = len - 1 - 2*current_iteration = 0
115      current_iteration = (len - 1) / 2
116    Hence, there are (len - 1) / 2 (rounded up to the nearest integer)
117    iterations of this loop.  */
118
119 /* ??? Currently, no labels are marked as loop invariant when doing loop
120    unrolling.  This is because an insn inside the loop, that loads the address
121    of a label inside the loop into a register, could be moved outside the loop
122    by the invariant code motion pass if labels were invariant.  If the loop
123    is subsequently unrolled, the code will be wrong because each unrolled
124    body of the loop will use the same address, whereas each actually needs a
125    different address.  A case where this happens is when a loop containing
126    a switch statement is unrolled.
127
128    It would be better to let labels be considered invariant.  When we
129    unroll loops here, check to see if any insns using a label local to the
130    loop were moved before the loop.  If so, then correct the problem, by
131    moving the insn back into the loop, or perhaps replicate the insn before
132    the loop, one copy for each time the loop is unrolled.  */
133
134 #include "config.h"
135 #include "system.h"
136 #include "coretypes.h"
137 #include "tm.h"
138 #include "rtl.h"
139 #include "tm_p.h"
140 #include "insn-config.h"
141 #include "integrate.h"
142 #include "regs.h"
143 #include "recog.h"
144 #include "flags.h"
145 #include "function.h"
146 #include "expr.h"
147 #include "loop.h"
148 #include "toplev.h"
149 #include "hard-reg-set.h"
150 #include "basic-block.h"
151 #include "predict.h"
152 #include "params.h"
153 #include "cfgloop.h"
154
155 /* The prime factors looked for when trying to unroll a loop by some
156    number which is modulo the total number of iterations.  Just checking
157    for these 4 prime factors will find at least one factor for 75% of
158    all numbers theoretically.  Practically speaking, this will succeed
159    almost all of the time since loops are generally a multiple of 2
160    and/or 5.  */
161
162 #define NUM_FACTORS 4
163
164 static struct _factor { const int factor; int count; }
165 factors[NUM_FACTORS] = { {2, 0}, {3, 0}, {5, 0}, {7, 0}};
166
167 /* Describes the different types of loop unrolling performed.  */
168
169 enum unroll_types
170 {
171   UNROLL_COMPLETELY,
172   UNROLL_MODULO,
173   UNROLL_NAIVE
174 };
175
176 /* Indexed by register number, if nonzero, then it contains a pointer
177    to a struct induction for a DEST_REG giv which has been combined with
178    one of more address givs.  This is needed because whenever such a DEST_REG
179    giv is modified, we must modify the value of all split address givs
180    that were combined with this DEST_REG giv.  */
181
182 static struct induction **addr_combined_regs;
183
184 /* Indexed by register number, if this is a splittable induction variable,
185    then this will hold the current value of the register, which depends on the
186    iteration number.  */
187
188 static rtx *splittable_regs;
189
190 /* Indexed by register number, if this is a splittable induction variable,
191    then this will hold the number of instructions in the loop that modify
192    the induction variable.  Used to ensure that only the last insn modifying
193    a split iv will update the original iv of the dest.  */
194
195 static int *splittable_regs_updates;
196
197 /* Forward declarations.  */
198
199 static rtx simplify_cmp_and_jump_insns PARAMS ((enum rtx_code,
200                                                 enum machine_mode,
201                                                 rtx, rtx, rtx));
202 static void init_reg_map PARAMS ((struct inline_remap *, int));
203 static rtx calculate_giv_inc PARAMS ((rtx, rtx, unsigned int));
204 static rtx initial_reg_note_copy PARAMS ((rtx, struct inline_remap *));
205 static void final_reg_note_copy PARAMS ((rtx *, struct inline_remap *));
206 static void copy_loop_body PARAMS ((struct loop *, rtx, rtx,
207                                     struct inline_remap *, rtx, int,
208                                     enum unroll_types, rtx, rtx, rtx, rtx));
209 static int find_splittable_regs PARAMS ((const struct loop *,
210                                          enum unroll_types, int));
211 static int find_splittable_givs PARAMS ((const struct loop *,
212                                          struct iv_class *, enum unroll_types,
213                                          rtx, int));
214 static int reg_dead_after_loop PARAMS ((const struct loop *, rtx));
215 static rtx fold_rtx_mult_add PARAMS ((rtx, rtx, rtx, enum machine_mode));
216 static rtx remap_split_bivs PARAMS ((struct loop *, rtx));
217 static rtx find_common_reg_term PARAMS ((rtx, rtx));
218 static rtx subtract_reg_term PARAMS ((rtx, rtx));
219 static rtx loop_find_equiv_value PARAMS ((const struct loop *, rtx));
220 static rtx ujump_to_loop_cont PARAMS ((rtx, rtx));
221
222 /* Try to unroll one loop and split induction variables in the loop.
223
224    The loop is described by the arguments LOOP and INSN_COUNT.
225    STRENGTH_REDUCTION_P indicates whether information generated in the
226    strength reduction pass is available.
227
228    This function is intended to be called from within `strength_reduce'
229    in loop.c.  */
230
231 void
232 unroll_loop (loop, insn_count, strength_reduce_p)
233      struct loop *loop;
234      int insn_count;
235      int strength_reduce_p;
236 {
237   struct loop_info *loop_info = LOOP_INFO (loop);
238   struct loop_ivs *ivs = LOOP_IVS (loop);
239   int i, j;
240   unsigned int r;
241   unsigned HOST_WIDE_INT temp;
242   int unroll_number = 1;
243   rtx copy_start, copy_end;
244   rtx insn, sequence, pattern, tem;
245   int max_labelno, max_insnno;
246   rtx insert_before;
247   struct inline_remap *map;
248   char *local_label = NULL;
249   char *local_regno;
250   unsigned int max_local_regnum;
251   unsigned int maxregnum;
252   rtx exit_label = 0;
253   rtx start_label;
254   struct iv_class *bl;
255   int splitting_not_safe = 0;
256   enum unroll_types unroll_type = UNROLL_NAIVE;
257   int loop_preconditioned = 0;
258   rtx safety_label;
259   /* This points to the last real insn in the loop, which should be either
260      a JUMP_INSN (for conditional jumps) or a BARRIER (for unconditional
261      jumps).  */
262   rtx last_loop_insn;
263   rtx loop_start = loop->start;
264   rtx loop_end = loop->end;
265
266   /* Don't bother unrolling huge loops.  Since the minimum factor is
267      two, loops greater than one half of MAX_UNROLLED_INSNS will never
268      be unrolled.  */
269   if (insn_count > MAX_UNROLLED_INSNS / 2)
270     {
271       if (loop_dump_stream)
272         fprintf (loop_dump_stream, "Unrolling failure: Loop too big.\n");
273       return;
274     }
275
276   /* Determine type of unroll to perform.  Depends on the number of iterations
277      and the size of the loop.  */
278
279   /* If there is no strength reduce info, then set
280      loop_info->n_iterations to zero.  This can happen if
281      strength_reduce can't find any bivs in the loop.  A value of zero
282      indicates that the number of iterations could not be calculated.  */
283
284   if (! strength_reduce_p)
285     loop_info->n_iterations = 0;
286
287   if (loop_dump_stream && loop_info->n_iterations > 0)
288     {
289       fputs ("Loop unrolling: ", loop_dump_stream);
290       fprintf (loop_dump_stream, HOST_WIDE_INT_PRINT_DEC,
291                loop_info->n_iterations);
292       fputs (" iterations.\n", loop_dump_stream);
293     }
294
295   /* Find and save a pointer to the last nonnote insn in the loop.  */
296
297   last_loop_insn = prev_nonnote_insn (loop_end);
298
299   /* Calculate how many times to unroll the loop.  Indicate whether or
300      not the loop is being completely unrolled.  */
301
302   if (loop_info->n_iterations == 1)
303     {
304       /* Handle the case where the loop begins with an unconditional
305          jump to the loop condition.  Make sure to delete the jump
306          insn, otherwise the loop body will never execute.  */
307
308       rtx ujump = ujump_to_loop_cont (loop->start, loop->cont);
309       if (ujump)
310         delete_related_insns (ujump);
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_related_insns (PREV_INSN (last_loop_insn));
323         }
324       else if (GET_CODE (last_loop_insn) == JUMP_INSN)
325         {
326 #ifdef HAVE_cc0
327           rtx prev = PREV_INSN (last_loop_insn);
328 #endif
329           delete_related_insns (last_loop_insn);
330 #ifdef HAVE_cc0
331           /* The immediately preceding insn may be a compare which must be
332              deleted.  */
333           if (only_sets_cc0_p (prev))
334             delete_related_insns (prev);
335 #endif
336         }
337
338       /* Remove the loop notes since this is no longer a loop.  */
339       if (loop->vtop)
340         delete_related_insns (loop->vtop);
341       if (loop->cont)
342         delete_related_insns (loop->cont);
343       if (loop_start)
344         delete_related_insns (loop_start);
345       if (loop_end)
346         delete_related_insns (loop_end);
347
348       return;
349     }
350   else if (loop_info->n_iterations > 0
351            /* Avoid overflow in the next expression.  */
352            && loop_info->n_iterations < (unsigned) MAX_UNROLLED_INSNS
353            && loop_info->n_iterations * insn_count < (unsigned) MAX_UNROLLED_INSNS)
354     {
355       unroll_number = loop_info->n_iterations;
356       unroll_type = UNROLL_COMPLETELY;
357     }
358   else if (loop_info->n_iterations > 0)
359     {
360       /* Try to factor the number of iterations.  Don't bother with the
361          general case, only using 2, 3, 5, and 7 will get 75% of all
362          numbers theoretically, and almost all in practice.  */
363
364       for (i = 0; i < NUM_FACTORS; i++)
365         factors[i].count = 0;
366
367       temp = loop_info->n_iterations;
368       for (i = NUM_FACTORS - 1; i >= 0; i--)
369         while (temp % factors[i].factor == 0)
370           {
371             factors[i].count++;
372             temp = temp / factors[i].factor;
373           }
374
375       /* Start with the larger factors first so that we generally
376          get lots of unrolling.  */
377
378       unroll_number = 1;
379       temp = insn_count;
380       for (i = 3; i >= 0; i--)
381         while (factors[i].count--)
382           {
383             if (temp * factors[i].factor < (unsigned) MAX_UNROLLED_INSNS)
384               {
385                 unroll_number *= factors[i].factor;
386                 temp *= factors[i].factor;
387               }
388             else
389               break;
390           }
391
392       /* If we couldn't find any factors, then unroll as in the normal
393          case.  */
394       if (unroll_number == 1)
395         {
396           if (loop_dump_stream)
397             fprintf (loop_dump_stream, "Loop unrolling: No factors found.\n");
398         }
399       else
400         unroll_type = UNROLL_MODULO;
401     }
402
403   /* Default case, calculate number of times to unroll loop based on its
404      size.  */
405   if (unroll_type == UNROLL_NAIVE)
406     {
407       if (8 * insn_count < MAX_UNROLLED_INSNS)
408         unroll_number = 8;
409       else if (4 * insn_count < MAX_UNROLLED_INSNS)
410         unroll_number = 4;
411       else
412         unroll_number = 2;
413     }
414
415   /* Now we know how many times to unroll the loop.  */
416
417   if (loop_dump_stream)
418     fprintf (loop_dump_stream, "Unrolling loop %d times.\n", unroll_number);
419
420   if (unroll_type == UNROLL_COMPLETELY || unroll_type == UNROLL_MODULO)
421     {
422       /* Loops of these types can start with jump down to the exit condition
423          in rare circumstances.
424
425          Consider a pair of nested loops where the inner loop is part
426          of the exit code for the outer loop.
427
428          In this case jump.c will not duplicate the exit test for the outer
429          loop, so it will start with a jump to the exit code.
430
431          Then consider if the inner loop turns out to iterate once and
432          only once.  We will end up deleting the jumps associated with
433          the inner loop.  However, the loop notes are not removed from
434          the instruction stream.
435
436          And finally assume that we can compute the number of iterations
437          for the outer loop.
438
439          In this case unroll may want to unroll the outer loop even though
440          it starts with a jump to the outer loop's exit code.
441
442          We could try to optimize this case, but it hardly seems worth it.
443          Just return without unrolling the loop in such cases.  */
444
445       insn = loop_start;
446       while (GET_CODE (insn) != CODE_LABEL && GET_CODE (insn) != JUMP_INSN)
447         insn = NEXT_INSN (insn);
448       if (GET_CODE (insn) == JUMP_INSN)
449         return;
450     }
451
452   if (unroll_type == UNROLL_COMPLETELY)
453     {
454       /* Completely unrolling the loop:  Delete the compare and branch at
455          the end (the last two instructions).   This delete must done at the
456          very end of loop unrolling, to avoid problems with calls to
457          back_branch_in_range_p, which is called by find_splittable_regs.
458          All increments of splittable bivs/givs are changed to load constant
459          instructions.  */
460
461       copy_start = loop_start;
462
463       /* Set insert_before to the instruction immediately after the JUMP_INSN
464          (or BARRIER), so that any NOTEs between the JUMP_INSN and the end of
465          the loop will be correctly handled by copy_loop_body.  */
466       insert_before = NEXT_INSN (last_loop_insn);
467
468       /* Set copy_end to the insn before the jump at the end of the loop.  */
469       if (GET_CODE (last_loop_insn) == BARRIER)
470         copy_end = PREV_INSN (PREV_INSN (last_loop_insn));
471       else if (GET_CODE (last_loop_insn) == JUMP_INSN)
472         {
473           copy_end = PREV_INSN (last_loop_insn);
474 #ifdef HAVE_cc0
475           /* The instruction immediately before the JUMP_INSN may be a compare
476              instruction which we do not want to copy.  */
477           if (sets_cc0_p (PREV_INSN (copy_end)))
478             copy_end = PREV_INSN (copy_end);
479 #endif
480         }
481       else
482         {
483           /* We currently can't unroll a loop if it doesn't end with a
484              JUMP_INSN.  There would need to be a mechanism that recognizes
485              this case, and then inserts a jump after each loop body, which
486              jumps to after the last loop body.  */
487           if (loop_dump_stream)
488             fprintf (loop_dump_stream,
489                      "Unrolling failure: loop does not end with a JUMP_INSN.\n");
490           return;
491         }
492     }
493   else if (unroll_type == UNROLL_MODULO)
494     {
495       /* Partially unrolling the loop:  The compare and branch at the end
496          (the last two instructions) must remain.  Don't copy the compare
497          and branch instructions at the end of the loop.  Insert the unrolled
498          code immediately before the compare/branch at the end so that the
499          code will fall through to them as before.  */
500
501       copy_start = loop_start;
502
503       /* Set insert_before to the jump insn at the end of the loop.
504          Set copy_end to before the jump insn at the end of the loop.  */
505       if (GET_CODE (last_loop_insn) == BARRIER)
506         {
507           insert_before = PREV_INSN (last_loop_insn);
508           copy_end = PREV_INSN (insert_before);
509         }
510       else if (GET_CODE (last_loop_insn) == JUMP_INSN)
511         {
512           insert_before = last_loop_insn;
513 #ifdef HAVE_cc0
514           /* The instruction immediately before the JUMP_INSN may be a compare
515              instruction which we do not want to copy or delete.  */
516           if (sets_cc0_p (PREV_INSN (insert_before)))
517             insert_before = PREV_INSN (insert_before);
518 #endif
519           copy_end = PREV_INSN (insert_before);
520         }
521       else
522         {
523           /* We currently can't unroll a loop if it doesn't end with a
524              JUMP_INSN.  There would need to be a mechanism that recognizes
525              this case, and then inserts a jump after each loop body, which
526              jumps to after the last loop body.  */
527           if (loop_dump_stream)
528             fprintf (loop_dump_stream,
529                      "Unrolling failure: loop does not end with a JUMP_INSN.\n");
530           return;
531         }
532     }
533   else
534     {
535       /* Normal case: Must copy the compare and branch instructions at the
536          end of the loop.  */
537
538       if (GET_CODE (last_loop_insn) == BARRIER)
539         {
540           /* Loop ends with an unconditional jump and a barrier.
541              Handle this like above, don't copy jump and barrier.
542              This is not strictly necessary, but doing so prevents generating
543              unconditional jumps to an immediately following label.
544
545              This will be corrected below if the target of this jump is
546              not the start_label.  */
547
548           insert_before = PREV_INSN (last_loop_insn);
549           copy_end = PREV_INSN (insert_before);
550         }
551       else if (GET_CODE (last_loop_insn) == JUMP_INSN)
552         {
553           /* Set insert_before to immediately after the JUMP_INSN, so that
554              NOTEs at the end of the loop will be correctly handled by
555              copy_loop_body.  */
556           insert_before = NEXT_INSN (last_loop_insn);
557           copy_end = last_loop_insn;
558         }
559       else
560         {
561           /* We currently can't unroll a loop if it doesn't end with a
562              JUMP_INSN.  There would need to be a mechanism that recognizes
563              this case, and then inserts a jump after each loop body, which
564              jumps to after the last loop body.  */
565           if (loop_dump_stream)
566             fprintf (loop_dump_stream,
567                      "Unrolling failure: loop does not end with a JUMP_INSN.\n");
568           return;
569         }
570
571       /* If copying exit test branches because they can not be eliminated,
572          then must convert the fall through case of the branch to a jump past
573          the end of the loop.  Create a label to emit after the loop and save
574          it for later use.  Do not use the label after the loop, if any, since
575          it might be used by insns outside the loop, or there might be insns
576          added before it later by final_[bg]iv_value which must be after
577          the real exit label.  */
578       exit_label = gen_label_rtx ();
579
580       insn = loop_start;
581       while (GET_CODE (insn) != CODE_LABEL && GET_CODE (insn) != JUMP_INSN)
582         insn = NEXT_INSN (insn);
583
584       if (GET_CODE (insn) == JUMP_INSN)
585         {
586           /* The loop starts with a jump down to the exit condition test.
587              Start copying the loop after the barrier following this
588              jump insn.  */
589           copy_start = NEXT_INSN (insn);
590
591           /* Splitting induction variables doesn't work when the loop is
592              entered via a jump to the bottom, because then we end up doing
593              a comparison against a new register for a split variable, but
594              we did not execute the set insn for the new register because
595              it was skipped over.  */
596           splitting_not_safe = 1;
597           if (loop_dump_stream)
598             fprintf (loop_dump_stream,
599                      "Splitting not safe, because loop not entered at top.\n");
600         }
601       else
602         copy_start = loop_start;
603     }
604
605   /* This should always be the first label in the loop.  */
606   start_label = NEXT_INSN (copy_start);
607   /* There may be a line number note and/or a loop continue note here.  */
608   while (GET_CODE (start_label) == NOTE)
609     start_label = NEXT_INSN (start_label);
610   if (GET_CODE (start_label) != CODE_LABEL)
611     {
612       /* This can happen as a result of jump threading.  If the first insns in
613          the loop test the same condition as the loop's backward jump, or the
614          opposite condition, then the backward jump will be modified to point
615          to elsewhere, and the loop's start label is deleted.
616
617          This case currently can not be handled by the loop unrolling code.  */
618
619       if (loop_dump_stream)
620         fprintf (loop_dump_stream,
621                  "Unrolling failure: unknown insns between BEG note and loop label.\n");
622       return;
623     }
624   if (LABEL_NAME (start_label))
625     {
626       /* The jump optimization pass must have combined the original start label
627          with a named label for a goto.  We can't unroll this case because
628          jumps which go to the named label must be handled differently than
629          jumps to the loop start, and it is impossible to differentiate them
630          in this case.  */
631       if (loop_dump_stream)
632         fprintf (loop_dump_stream,
633                  "Unrolling failure: loop start label is gone\n");
634       return;
635     }
636
637   if (unroll_type == UNROLL_NAIVE
638       && GET_CODE (last_loop_insn) == BARRIER
639       && GET_CODE (PREV_INSN (last_loop_insn)) == JUMP_INSN
640       && start_label != JUMP_LABEL (PREV_INSN (last_loop_insn)))
641     {
642       /* In this case, we must copy the jump and barrier, because they will
643          not be converted to jumps to an immediately following label.  */
644
645       insert_before = NEXT_INSN (last_loop_insn);
646       copy_end = last_loop_insn;
647     }
648
649   if (unroll_type == UNROLL_NAIVE
650       && GET_CODE (last_loop_insn) == JUMP_INSN
651       && start_label != JUMP_LABEL (last_loop_insn))
652     {
653       /* ??? The loop ends with a conditional branch that does not branch back
654          to the loop start label.  In this case, we must emit an unconditional
655          branch to the loop exit after emitting the final branch.
656          copy_loop_body does not have support for this currently, so we
657          give up.  It doesn't seem worthwhile to unroll anyways since
658          unrolling would increase the number of branch instructions
659          executed.  */
660       if (loop_dump_stream)
661         fprintf (loop_dump_stream,
662                  "Unrolling failure: final conditional branch not to loop start\n");
663       return;
664     }
665
666   /* Allocate a translation table for the labels and insn numbers.
667      They will be filled in as we copy the insns in the loop.  */
668
669   max_labelno = max_label_num ();
670   max_insnno = get_max_uid ();
671
672   /* Various paths through the unroll code may reach the "egress" label
673      without initializing fields within the map structure.
674
675      To be safe, we use xcalloc to zero the memory.  */
676   map = (struct inline_remap *) xcalloc (1, sizeof (struct inline_remap));
677
678   /* Allocate the label map.  */
679
680   if (max_labelno > 0)
681     {
682       map->label_map = (rtx *) xcalloc (max_labelno, sizeof (rtx));
683       local_label = (char *) xcalloc (max_labelno, sizeof (char));
684     }
685
686   /* Search the loop and mark all local labels, i.e. the ones which have to
687      be distinct labels when copied.  For all labels which might be
688      non-local, set their label_map entries to point to themselves.
689      If they happen to be local their label_map entries will be overwritten
690      before the loop body is copied.  The label_map entries for local labels
691      will be set to a different value each time the loop body is copied.  */
692
693   for (insn = copy_start; insn != loop_end; insn = NEXT_INSN (insn))
694     {
695       rtx note;
696
697       if (GET_CODE (insn) == CODE_LABEL)
698         local_label[CODE_LABEL_NUMBER (insn)] = 1;
699       else if (GET_CODE (insn) == JUMP_INSN)
700         {
701           if (JUMP_LABEL (insn))
702             set_label_in_map (map,
703                               CODE_LABEL_NUMBER (JUMP_LABEL (insn)),
704                               JUMP_LABEL (insn));
705           else if (GET_CODE (PATTERN (insn)) == ADDR_VEC
706                    || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
707             {
708               rtx pat = PATTERN (insn);
709               int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC;
710               int len = XVECLEN (pat, diff_vec_p);
711               rtx label;
712
713               for (i = 0; i < len; i++)
714                 {
715                   label = XEXP (XVECEXP (pat, diff_vec_p, i), 0);
716                   set_label_in_map (map, CODE_LABEL_NUMBER (label), label);
717                 }
718             }
719         }
720       if ((note = find_reg_note (insn, REG_LABEL, NULL_RTX)))
721         set_label_in_map (map, CODE_LABEL_NUMBER (XEXP (note, 0)),
722                           XEXP (note, 0));
723     }
724
725   /* Allocate space for the insn map.  */
726
727   map->insn_map = (rtx *) xmalloc (max_insnno * sizeof (rtx));
728
729   /* Set this to zero, to indicate that we are doing loop unrolling,
730      not function inlining.  */
731   map->inline_target = 0;
732
733   /* The register and constant maps depend on the number of registers
734      present, so the final maps can't be created until after
735      find_splittable_regs is called.  However, they are needed for
736      preconditioning, so we create temporary maps when preconditioning
737      is performed.  */
738
739   /* The preconditioning code may allocate two new pseudo registers.  */
740   maxregnum = max_reg_num ();
741
742   /* local_regno is only valid for regnos < max_local_regnum.  */
743   max_local_regnum = maxregnum;
744
745   /* Allocate and zero out the splittable_regs and addr_combined_regs
746      arrays.  These must be zeroed here because they will be used if
747      loop preconditioning is performed, and must be zero for that case.
748
749      It is safe to do this here, since the extra registers created by the
750      preconditioning code and find_splittable_regs will never be used
751      to access the splittable_regs[] and addr_combined_regs[] arrays.  */
752
753   splittable_regs = (rtx *) xcalloc (maxregnum, sizeof (rtx));
754   splittable_regs_updates = (int *) xcalloc (maxregnum, sizeof (int));
755   addr_combined_regs
756     = (struct induction **) xcalloc (maxregnum, sizeof (struct induction *));
757   local_regno = (char *) xcalloc (maxregnum, sizeof (char));
758
759   /* Mark all local registers, i.e. the ones which are referenced only
760      inside the loop.  */
761   if (INSN_UID (copy_end) < max_uid_for_loop)
762     {
763       int copy_start_luid = INSN_LUID (copy_start);
764       int copy_end_luid = INSN_LUID (copy_end);
765
766       /* If a register is used in the jump insn, we must not duplicate it
767          since it will also be used outside the loop.  */
768       if (GET_CODE (copy_end) == JUMP_INSN)
769         copy_end_luid--;
770
771       /* If we have a target that uses cc0, then we also must not duplicate
772          the insn that sets cc0 before the jump insn, if one is present.  */
773 #ifdef HAVE_cc0
774       if (GET_CODE (copy_end) == JUMP_INSN
775           && sets_cc0_p (PREV_INSN (copy_end)))
776         copy_end_luid--;
777 #endif
778
779       /* If copy_start points to the NOTE that starts the loop, then we must
780          use the next luid, because invariant pseudo-regs moved out of the loop
781          have their lifetimes modified to start here, but they are not safe
782          to duplicate.  */
783       if (copy_start == loop_start)
784         copy_start_luid++;
785
786       /* If a pseudo's lifetime is entirely contained within this loop, then we
787          can use a different pseudo in each unrolled copy of the loop.  This
788          results in better code.  */
789       /* We must limit the generic test to max_reg_before_loop, because only
790          these pseudo registers have valid regno_first_uid info.  */
791       for (r = FIRST_PSEUDO_REGISTER; r < max_reg_before_loop; ++r)
792         if (REGNO_FIRST_UID (r) > 0 && REGNO_FIRST_UID (r) <= max_uid_for_loop
793             && REGNO_FIRST_LUID (r) >= copy_start_luid
794             && REGNO_LAST_UID (r) > 0 && REGNO_LAST_UID (r) <= max_uid_for_loop
795             && REGNO_LAST_LUID (r) <= copy_end_luid)
796           {
797             /* However, we must also check for loop-carried dependencies.
798                If the value the pseudo has at the end of iteration X is
799                used by iteration X+1, then we can not use a different pseudo
800                for each unrolled copy of the loop.  */
801             /* A pseudo is safe if regno_first_uid is a set, and this
802                set dominates all instructions from regno_first_uid to
803                regno_last_uid.  */
804             /* ??? This check is simplistic.  We would get better code if
805                this check was more sophisticated.  */
806             if (set_dominates_use (r, REGNO_FIRST_UID (r), REGNO_LAST_UID (r),
807                                    copy_start, copy_end))
808               local_regno[r] = 1;
809
810             if (loop_dump_stream)
811               {
812                 if (local_regno[r])
813                   fprintf (loop_dump_stream, "Marked reg %d as local\n", r);
814                 else
815                   fprintf (loop_dump_stream, "Did not mark reg %d as local\n",
816                            r);
817               }
818           }
819     }
820
821   /* If this loop requires exit tests when unrolled, check to see if we
822      can precondition the loop so as to make the exit tests unnecessary.
823      Just like variable splitting, this is not safe if the loop is entered
824      via a jump to the bottom.  Also, can not do this if no strength
825      reduce info, because precondition_loop_p uses this info.  */
826
827   /* Must copy the loop body for preconditioning before the following
828      find_splittable_regs call since that will emit insns which need to
829      be after the preconditioned loop copies, but immediately before the
830      unrolled loop copies.  */
831
832   /* Also, it is not safe to split induction variables for the preconditioned
833      copies of the loop body.  If we split induction variables, then the code
834      assumes that each induction variable can be represented as a function
835      of its initial value and the loop iteration number.  This is not true
836      in this case, because the last preconditioned copy of the loop body
837      could be any iteration from the first up to the `unroll_number-1'th,
838      depending on the initial value of the iteration variable.  Therefore
839      we can not split induction variables here, because we can not calculate
840      their value.  Hence, this code must occur before find_splittable_regs
841      is called.  */
842
843   if (unroll_type == UNROLL_NAIVE && ! splitting_not_safe && strength_reduce_p)
844     {
845       rtx initial_value, final_value, increment;
846       enum machine_mode mode;
847
848       if (precondition_loop_p (loop,
849                                &initial_value, &final_value, &increment,
850                                &mode))
851         {
852           rtx diff, insn;
853           rtx *labels;
854           int abs_inc, neg_inc;
855           enum rtx_code cc = loop_info->comparison_code;
856           int less_p     = (cc == LE  || cc == LEU || cc == LT  || cc == LTU);
857           int unsigned_p = (cc == LEU || cc == GEU || cc == LTU || cc == GTU);
858
859           map->reg_map = (rtx *) xmalloc (maxregnum * sizeof (rtx));
860
861           VARRAY_CONST_EQUIV_INIT (map->const_equiv_varray, maxregnum,
862                                    "unroll_loop_precondition");
863           global_const_equiv_varray = map->const_equiv_varray;
864
865           init_reg_map (map, maxregnum);
866
867           /* Limit loop unrolling to 4, since this will make 7 copies of
868              the loop body.  */
869           if (unroll_number > 4)
870             unroll_number = 4;
871
872           /* Save the absolute value of the increment, and also whether or
873              not it is negative.  */
874           neg_inc = 0;
875           abs_inc = INTVAL (increment);
876           if (abs_inc < 0)
877             {
878               abs_inc = -abs_inc;
879               neg_inc = 1;
880             }
881
882           start_sequence ();
883
884           /* We must copy the final and initial values here to avoid
885              improperly shared rtl.  */
886           final_value = copy_rtx (final_value);
887           initial_value = copy_rtx (initial_value);
888
889           /* Final value may have form of (PLUS val1 const1_rtx).  We need
890              to convert it into general operand, so compute the real value.  */
891
892           final_value = force_operand (final_value, NULL_RTX);
893           if (!nonmemory_operand (final_value, VOIDmode))
894             final_value = force_reg (mode, final_value);
895
896           /* Calculate the difference between the final and initial values.
897              Final value may be a (plus (reg x) (const_int 1)) rtx.
898
899              We have to deal with for (i = 0; --i < 6;) type loops.
900              For such loops the real final value is the first time the
901              loop variable overflows, so the diff we calculate is the
902              distance from the overflow value.  This is 0 or ~0 for
903              unsigned loops depending on the direction, or INT_MAX,
904              INT_MAX+1 for signed loops.  We really do not need the
905              exact value, since we are only interested in the diff
906              modulo the increment, and the increment is a power of 2,
907              so we can pretend that the overflow value is 0/~0.  */
908
909           if (cc == NE || less_p != neg_inc)
910             diff = simplify_gen_binary (MINUS, mode, final_value,
911                                         initial_value);
912           else
913             diff = simplify_gen_unary (neg_inc ? NOT : NEG, mode,
914                                        initial_value, mode);
915           diff = force_operand (diff, NULL_RTX);
916
917           /* Now calculate (diff % (unroll * abs (increment))) by using an
918              and instruction.  */
919           diff = simplify_gen_binary (AND, mode, diff,
920                                       GEN_INT (unroll_number*abs_inc - 1));
921           diff = force_operand (diff, NULL_RTX);
922
923           /* Now emit a sequence of branches to jump to the proper precond
924              loop entry point.  */
925
926           labels = (rtx *) xmalloc (sizeof (rtx) * unroll_number);
927           for (i = 0; i < unroll_number; i++)
928             labels[i] = gen_label_rtx ();
929
930           /* Check for the case where the initial value is greater than or
931              equal to the final value.  In that case, we want to execute
932              exactly one loop iteration.  The code below will fail for this
933              case.  This check does not apply if the loop has a NE
934              comparison at the end.  */
935
936           if (cc != NE)
937             {
938               rtx incremented_initval;
939               enum rtx_code cmp_code;
940
941               incremented_initval
942                 = simplify_gen_binary (PLUS, mode, initial_value, increment);
943               incremented_initval
944                 = force_operand (incremented_initval, NULL_RTX);
945
946               cmp_code = (less_p
947                           ? (unsigned_p ? GEU : GE)
948                           : (unsigned_p ? LEU : LE));
949
950               insn = simplify_cmp_and_jump_insns (cmp_code, mode,
951                                                   incremented_initval,
952                                                   final_value, labels[1]);
953               if (insn)
954                 predict_insn_def (insn, PRED_LOOP_CONDITION, TAKEN);
955             }
956
957           /* Assuming the unroll_number is 4, and the increment is 2, then
958              for a negative increment:  for a positive increment:
959              diff = 0,1   precond 0     diff = 0,7   precond 0
960              diff = 2,3   precond 3     diff = 1,2   precond 1
961              diff = 4,5   precond 2     diff = 3,4   precond 2
962              diff = 6,7   precond 1     diff = 5,6   precond 3  */
963
964           /* We only need to emit (unroll_number - 1) branches here, the
965              last case just falls through to the following code.  */
966
967           /* ??? This would give better code if we emitted a tree of branches
968              instead of the current linear list of branches.  */
969
970           for (i = 0; i < unroll_number - 1; i++)
971             {
972               int cmp_const;
973               enum rtx_code cmp_code;
974
975               /* For negative increments, must invert the constant compared
976                  against, except when comparing against zero.  */
977               if (i == 0)
978                 {
979                   cmp_const = 0;
980                   cmp_code = EQ;
981                 }
982               else if (neg_inc)
983                 {
984                   cmp_const = unroll_number - i;
985                   cmp_code = GE;
986                 }
987               else
988                 {
989                   cmp_const = i;
990                   cmp_code = LE;
991                 }
992
993               insn = simplify_cmp_and_jump_insns (cmp_code, mode, diff,
994                                                   GEN_INT (abs_inc*cmp_const),
995                                                   labels[i]);
996               if (insn)
997                 predict_insn (insn, PRED_LOOP_PRECONDITIONING,
998                               REG_BR_PROB_BASE / (unroll_number - i));
999             }
1000
1001           /* If the increment is greater than one, then we need another branch,
1002              to handle other cases equivalent to 0.  */
1003
1004           /* ??? This should be merged into the code above somehow to help
1005              simplify the code here, and reduce the number of branches emitted.
1006              For the negative increment case, the branch here could easily
1007              be merged with the `0' case branch above.  For the positive
1008              increment case, it is not clear how this can be simplified.  */
1009
1010           if (abs_inc != 1)
1011             {
1012               int cmp_const;
1013               enum rtx_code cmp_code;
1014
1015               if (neg_inc)
1016                 {
1017                   cmp_const = abs_inc - 1;
1018                   cmp_code = LE;
1019                 }
1020               else
1021                 {
1022                   cmp_const = abs_inc * (unroll_number - 1) + 1;
1023                   cmp_code = GE;
1024                 }
1025
1026               simplify_cmp_and_jump_insns (cmp_code, mode, diff,
1027                                            GEN_INT (cmp_const), labels[0]);
1028             }
1029
1030           sequence = get_insns ();
1031           end_sequence ();
1032           loop_insn_hoist (loop, sequence);
1033
1034           /* Only the last copy of the loop body here needs the exit
1035              test, so set copy_end to exclude the compare/branch here,
1036              and then reset it inside the loop when get to the last
1037              copy.  */
1038
1039           if (GET_CODE (last_loop_insn) == BARRIER)
1040             copy_end = PREV_INSN (PREV_INSN (last_loop_insn));
1041           else if (GET_CODE (last_loop_insn) == JUMP_INSN)
1042             {
1043               copy_end = PREV_INSN (last_loop_insn);
1044 #ifdef HAVE_cc0
1045               /* The immediately preceding insn may be a compare which
1046                  we do not want to copy.  */
1047               if (sets_cc0_p (PREV_INSN (copy_end)))
1048                 copy_end = PREV_INSN (copy_end);
1049 #endif
1050             }
1051           else
1052             abort ();
1053
1054           for (i = 1; i < unroll_number; i++)
1055             {
1056               emit_label_after (labels[unroll_number - i],
1057                                 PREV_INSN (loop_start));
1058
1059               memset ((char *) map->insn_map, 0, max_insnno * sizeof (rtx));
1060               memset ((char *) &VARRAY_CONST_EQUIV (map->const_equiv_varray, 0),
1061                       0, (VARRAY_SIZE (map->const_equiv_varray)
1062                           * sizeof (struct const_equiv_data)));
1063               map->const_age = 0;
1064
1065               for (j = 0; j < max_labelno; j++)
1066                 if (local_label[j])
1067                   set_label_in_map (map, j, gen_label_rtx ());
1068
1069               for (r = FIRST_PSEUDO_REGISTER; r < max_local_regnum; r++)
1070                 if (local_regno[r])
1071                   {
1072                     map->reg_map[r]
1073                       = gen_reg_rtx (GET_MODE (regno_reg_rtx[r]));
1074                     record_base_value (REGNO (map->reg_map[r]),
1075                                        regno_reg_rtx[r], 0);
1076                   }
1077               /* The last copy needs the compare/branch insns at the end,
1078                  so reset copy_end here if the loop ends with a conditional
1079                  branch.  */
1080
1081               if (i == unroll_number - 1)
1082                 {
1083                   if (GET_CODE (last_loop_insn) == BARRIER)
1084                     copy_end = PREV_INSN (PREV_INSN (last_loop_insn));
1085                   else
1086                     copy_end = last_loop_insn;
1087                 }
1088
1089               /* None of the copies are the `last_iteration', so just
1090                  pass zero for that parameter.  */
1091               copy_loop_body (loop, copy_start, copy_end, map, exit_label, 0,
1092                               unroll_type, start_label, loop_end,
1093                               loop_start, copy_end);
1094             }
1095           emit_label_after (labels[0], PREV_INSN (loop_start));
1096
1097           if (GET_CODE (last_loop_insn) == BARRIER)
1098             {
1099               insert_before = PREV_INSN (last_loop_insn);
1100               copy_end = PREV_INSN (insert_before);
1101             }
1102           else
1103             {
1104               insert_before = last_loop_insn;
1105 #ifdef HAVE_cc0
1106               /* The instruction immediately before the JUMP_INSN may
1107                  be a compare instruction which we do not want to copy
1108                  or delete.  */
1109               if (sets_cc0_p (PREV_INSN (insert_before)))
1110                 insert_before = PREV_INSN (insert_before);
1111 #endif
1112               copy_end = PREV_INSN (insert_before);
1113             }
1114
1115           /* Set unroll type to MODULO now.  */
1116           unroll_type = UNROLL_MODULO;
1117           loop_preconditioned = 1;
1118
1119           /* Clean up.  */
1120           free (labels);
1121         }
1122     }
1123
1124   /* If reach here, and the loop type is UNROLL_NAIVE, then don't unroll
1125      the loop unless all loops are being unrolled.  */
1126   if (unroll_type == UNROLL_NAIVE && ! flag_unroll_all_loops)
1127     {
1128       if (loop_dump_stream)
1129         fprintf (loop_dump_stream,
1130                  "Unrolling failure: Naive unrolling not being done.\n");
1131       goto egress;
1132     }
1133
1134   /* At this point, we are guaranteed to unroll the loop.  */
1135
1136   /* Keep track of the unroll factor for the loop.  */
1137   loop_info->unroll_number = unroll_number;
1138
1139   /* And whether the loop has been preconditioned.  */
1140   loop_info->preconditioned = loop_preconditioned;
1141
1142   /* Remember whether it was preconditioned for the second loop pass.  */
1143   NOTE_PRECONDITIONED (loop->end) = loop_preconditioned;
1144
1145   /* For each biv and giv, determine whether it can be safely split into
1146      a different variable for each unrolled copy of the loop body.
1147      We precalculate and save this info here, since computing it is
1148      expensive.
1149
1150      Do this before deleting any instructions from the loop, so that
1151      back_branch_in_range_p will work correctly.  */
1152
1153   if (splitting_not_safe)
1154     temp = 0;
1155   else
1156     temp = find_splittable_regs (loop, unroll_type, unroll_number);
1157
1158   /* find_splittable_regs may have created some new registers, so must
1159      reallocate the reg_map with the new larger size, and must realloc
1160      the constant maps also.  */
1161
1162   maxregnum = max_reg_num ();
1163   map->reg_map = (rtx *) xmalloc (maxregnum * sizeof (rtx));
1164
1165   init_reg_map (map, maxregnum);
1166
1167   if (map->const_equiv_varray == 0)
1168     VARRAY_CONST_EQUIV_INIT (map->const_equiv_varray,
1169                              maxregnum + temp * unroll_number * 2,
1170                              "unroll_loop");
1171   global_const_equiv_varray = map->const_equiv_varray;
1172
1173   /* Search the list of bivs and givs to find ones which need to be remapped
1174      when split, and set their reg_map entry appropriately.  */
1175
1176   for (bl = ivs->list; bl; bl = bl->next)
1177     {
1178       if (REGNO (bl->biv->src_reg) != bl->regno)
1179         map->reg_map[bl->regno] = bl->biv->src_reg;
1180 #if 0
1181       /* Currently, non-reduced/final-value givs are never split.  */
1182       for (v = bl->giv; v; v = v->next_iv)
1183         if (REGNO (v->src_reg) != bl->regno)
1184           map->reg_map[REGNO (v->dest_reg)] = v->src_reg;
1185 #endif
1186     }
1187
1188   /* Use our current register alignment and pointer flags.  */
1189   map->regno_pointer_align = cfun->emit->regno_pointer_align;
1190   map->x_regno_reg_rtx = cfun->emit->x_regno_reg_rtx;
1191
1192   /* If the loop is being partially unrolled, and the iteration variables
1193      are being split, and are being renamed for the split, then must fix up
1194      the compare/jump instruction at the end of the loop to refer to the new
1195      registers.  This compare isn't copied, so the registers used in it
1196      will never be replaced if it isn't done here.  */
1197
1198   if (unroll_type == UNROLL_MODULO)
1199     {
1200       insn = NEXT_INSN (copy_end);
1201       if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN)
1202         PATTERN (insn) = remap_split_bivs (loop, PATTERN (insn));
1203     }
1204
1205   /* For unroll_number times, make a copy of each instruction
1206      between copy_start and copy_end, and insert these new instructions
1207      before the end of the loop.  */
1208
1209   for (i = 0; i < unroll_number; i++)
1210     {
1211       memset ((char *) map->insn_map, 0, max_insnno * sizeof (rtx));
1212       memset ((char *) &VARRAY_CONST_EQUIV (map->const_equiv_varray, 0), 0,
1213               VARRAY_SIZE (map->const_equiv_varray) * sizeof (struct const_equiv_data));
1214       map->const_age = 0;
1215
1216       for (j = 0; j < max_labelno; j++)
1217         if (local_label[j])
1218           set_label_in_map (map, j, gen_label_rtx ());
1219
1220       for (r = FIRST_PSEUDO_REGISTER; r < max_local_regnum; r++)
1221         if (local_regno[r])
1222           {
1223             map->reg_map[r] = gen_reg_rtx (GET_MODE (regno_reg_rtx[r]));
1224             record_base_value (REGNO (map->reg_map[r]),
1225                                regno_reg_rtx[r], 0);
1226           }
1227
1228       /* If loop starts with a branch to the test, then fix it so that
1229          it points to the test of the first unrolled copy of the loop.  */
1230       if (i == 0 && loop_start != copy_start)
1231         {
1232           insn = PREV_INSN (copy_start);
1233           pattern = PATTERN (insn);
1234
1235           tem = get_label_from_map (map,
1236                                     CODE_LABEL_NUMBER
1237                                     (XEXP (SET_SRC (pattern), 0)));
1238           SET_SRC (pattern) = gen_rtx_LABEL_REF (VOIDmode, tem);
1239
1240           /* Set the jump label so that it can be used by later loop unrolling
1241              passes.  */
1242           JUMP_LABEL (insn) = tem;
1243           LABEL_NUSES (tem)++;
1244         }
1245
1246       copy_loop_body (loop, copy_start, copy_end, map, exit_label,
1247                       i == unroll_number - 1, unroll_type, start_label,
1248                       loop_end, insert_before, insert_before);
1249     }
1250
1251   /* Before deleting any insns, emit a CODE_LABEL immediately after the last
1252      insn to be deleted.  This prevents any runaway delete_insn call from
1253      more insns that it should, as it always stops at a CODE_LABEL.  */
1254
1255   /* Delete the compare and branch at the end of the loop if completely
1256      unrolling the loop.  Deleting the backward branch at the end also
1257      deletes the code label at the start of the loop.  This is done at
1258      the very end to avoid problems with back_branch_in_range_p.  */
1259
1260   if (unroll_type == UNROLL_COMPLETELY)
1261     safety_label = emit_label_after (gen_label_rtx (), last_loop_insn);
1262   else
1263     safety_label = emit_label_after (gen_label_rtx (), copy_end);
1264
1265   /* Delete all of the original loop instructions.  Don't delete the
1266      LOOP_BEG note, or the first code label in the loop.  */
1267
1268   insn = NEXT_INSN (copy_start);
1269   while (insn != safety_label)
1270     {
1271       /* ??? Don't delete named code labels.  They will be deleted when the
1272          jump that references them is deleted.  Otherwise, we end up deleting
1273          them twice, which causes them to completely disappear instead of turn
1274          into NOTE_INSN_DELETED_LABEL notes.  This in turn causes aborts in
1275          dwarfout.c/dwarf2out.c.  We could perhaps fix the dwarf*out.c files
1276          to handle deleted labels instead.  Or perhaps fix DECL_RTL of the
1277          associated LABEL_DECL to point to one of the new label instances.  */
1278       /* ??? Likewise, we can't delete a NOTE_INSN_DELETED_LABEL note.  */
1279       if (insn != start_label
1280           && ! (GET_CODE (insn) == CODE_LABEL && LABEL_NAME (insn))
1281           && ! (GET_CODE (insn) == NOTE
1282                 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED_LABEL))
1283         insn = delete_related_insns (insn);
1284       else
1285         insn = NEXT_INSN (insn);
1286     }
1287
1288   /* Can now delete the 'safety' label emitted to protect us from runaway
1289      delete_related_insns calls.  */
1290   if (INSN_DELETED_P (safety_label))
1291     abort ();
1292   delete_related_insns (safety_label);
1293
1294   /* If exit_label exists, emit it after the loop.  Doing the emit here
1295      forces it to have a higher INSN_UID than any insn in the unrolled loop.
1296      This is needed so that mostly_true_jump in reorg.c will treat jumps
1297      to this loop end label correctly, i.e. predict that they are usually
1298      not taken.  */
1299   if (exit_label)
1300     emit_label_after (exit_label, loop_end);
1301
1302  egress:
1303   if (unroll_type == UNROLL_COMPLETELY)
1304     {
1305       /* Remove the loop notes since this is no longer a loop.  */
1306       if (loop->vtop)
1307         delete_related_insns (loop->vtop);
1308       if (loop->cont)
1309         delete_related_insns (loop->cont);
1310       if (loop_start)
1311         delete_related_insns (loop_start);
1312       if (loop_end)
1313         delete_related_insns (loop_end);
1314     }
1315
1316   if (map->const_equiv_varray)
1317     VARRAY_FREE (map->const_equiv_varray);
1318   if (map->label_map)
1319     {
1320       free (map->label_map);
1321       free (local_label);
1322     }
1323   free (map->insn_map);
1324   free (splittable_regs);
1325   free (splittable_regs_updates);
1326   free (addr_combined_regs);
1327   free (local_regno);
1328   if (map->reg_map)
1329     free (map->reg_map);
1330   free (map);
1331 }
1332
1333 /* A helper function for unroll_loop.  Emit a compare and branch to 
1334    satisfy (CMP OP1 OP2), but pass this through the simplifier first.
1335    If the branch turned out to be conditional, return it, otherwise
1336    return NULL.  */
1337
1338 static rtx
1339 simplify_cmp_and_jump_insns (code, mode, op0, op1, label)
1340      enum rtx_code code;
1341      enum machine_mode mode;
1342      rtx op0, op1, label;
1343 {
1344   rtx t, insn;
1345
1346   t = simplify_relational_operation (code, mode, op0, op1);
1347   if (!t)
1348     {
1349       enum rtx_code scode = signed_condition (code);
1350       emit_cmp_and_jump_insns (op0, op1, scode, NULL_RTX, mode,
1351                                code != scode, label);
1352       insn = get_last_insn ();
1353
1354       JUMP_LABEL (insn) = label;
1355       LABEL_NUSES (label) += 1;
1356
1357       return insn;
1358     }
1359   else if (t == const_true_rtx)
1360     {
1361       insn = emit_jump_insn (gen_jump (label));
1362       emit_barrier ();
1363       JUMP_LABEL (insn) = label;
1364       LABEL_NUSES (label) += 1;
1365     }
1366
1367   return NULL_RTX;
1368 }
1369 \f
1370 /* Return true if the loop can be safely, and profitably, preconditioned
1371    so that the unrolled copies of the loop body don't need exit tests.
1372
1373    This only works if final_value, initial_value and increment can be
1374    determined, and if increment is a constant power of 2.
1375    If increment is not a power of 2, then the preconditioning modulo
1376    operation would require a real modulo instead of a boolean AND, and this
1377    is not considered `profitable'.  */
1378
1379 /* ??? If the loop is known to be executed very many times, or the machine
1380    has a very cheap divide instruction, then preconditioning is a win even
1381    when the increment is not a power of 2.  Use RTX_COST to compute
1382    whether divide is cheap.
1383    ??? A divide by constant doesn't actually need a divide, look at
1384    expand_divmod.  The reduced cost of this optimized modulo is not
1385    reflected in RTX_COST.  */
1386
1387 int
1388 precondition_loop_p (loop, initial_value, final_value, increment, mode)
1389      const struct loop *loop;
1390      rtx *initial_value, *final_value, *increment;
1391      enum machine_mode *mode;
1392 {
1393   rtx loop_start = loop->start;
1394   struct loop_info *loop_info = LOOP_INFO (loop);
1395
1396   if (loop_info->n_iterations > 0)
1397     {
1398       if (INTVAL (loop_info->increment) > 0)
1399         {
1400           *initial_value = const0_rtx;
1401           *increment = const1_rtx;
1402           *final_value = GEN_INT (loop_info->n_iterations);
1403         }
1404       else
1405         {
1406           *initial_value = GEN_INT (loop_info->n_iterations);
1407           *increment = constm1_rtx;
1408           *final_value = const0_rtx;
1409         }
1410       *mode = word_mode;
1411
1412       if (loop_dump_stream)
1413         {
1414           fputs ("Preconditioning: Success, number of iterations known, ",
1415                  loop_dump_stream);
1416           fprintf (loop_dump_stream, HOST_WIDE_INT_PRINT_DEC,
1417                    loop_info->n_iterations);
1418           fputs (".\n", loop_dump_stream);
1419         }
1420       return 1;
1421     }
1422
1423   if (loop_info->iteration_var == 0)
1424     {
1425       if (loop_dump_stream)
1426         fprintf (loop_dump_stream,
1427                  "Preconditioning: Could not find iteration variable.\n");
1428       return 0;
1429     }
1430   else if (loop_info->initial_value == 0)
1431     {
1432       if (loop_dump_stream)
1433         fprintf (loop_dump_stream,
1434                  "Preconditioning: Could not find initial value.\n");
1435       return 0;
1436     }
1437   else if (loop_info->increment == 0)
1438     {
1439       if (loop_dump_stream)
1440         fprintf (loop_dump_stream,
1441                  "Preconditioning: Could not find increment value.\n");
1442       return 0;
1443     }
1444   else if (GET_CODE (loop_info->increment) != CONST_INT)
1445     {
1446       if (loop_dump_stream)
1447         fprintf (loop_dump_stream,
1448                  "Preconditioning: Increment not a constant.\n");
1449       return 0;
1450     }
1451   else if ((exact_log2 (INTVAL (loop_info->increment)) < 0)
1452            && (exact_log2 (-INTVAL (loop_info->increment)) < 0))
1453     {
1454       if (loop_dump_stream)
1455         fprintf (loop_dump_stream,
1456                  "Preconditioning: Increment not a constant power of 2.\n");
1457       return 0;
1458     }
1459
1460   /* Unsigned_compare and compare_dir can be ignored here, since they do
1461      not matter for preconditioning.  */
1462
1463   if (loop_info->final_value == 0)
1464     {
1465       if (loop_dump_stream)
1466         fprintf (loop_dump_stream,
1467                  "Preconditioning: EQ comparison loop.\n");
1468       return 0;
1469     }
1470
1471   /* Must ensure that final_value is invariant, so call
1472      loop_invariant_p to check.  Before doing so, must check regno
1473      against max_reg_before_loop to make sure that the register is in
1474      the range covered by loop_invariant_p.  If it isn't, then it is
1475      most likely a biv/giv which by definition are not invariant.  */
1476   if ((GET_CODE (loop_info->final_value) == REG
1477        && REGNO (loop_info->final_value) >= max_reg_before_loop)
1478       || (GET_CODE (loop_info->final_value) == PLUS
1479           && REGNO (XEXP (loop_info->final_value, 0)) >= max_reg_before_loop)
1480       || ! loop_invariant_p (loop, loop_info->final_value))
1481     {
1482       if (loop_dump_stream)
1483         fprintf (loop_dump_stream,
1484                  "Preconditioning: Final value not invariant.\n");
1485       return 0;
1486     }
1487
1488   /* Fail for floating point values, since the caller of this function
1489      does not have code to deal with them.  */
1490   if (GET_MODE_CLASS (GET_MODE (loop_info->final_value)) == MODE_FLOAT
1491       || GET_MODE_CLASS (GET_MODE (loop_info->initial_value)) == MODE_FLOAT)
1492     {
1493       if (loop_dump_stream)
1494         fprintf (loop_dump_stream,
1495                  "Preconditioning: Floating point final or initial value.\n");
1496       return 0;
1497     }
1498
1499   /* Fail if loop_info->iteration_var is not live before loop_start,
1500      since we need to test its value in the preconditioning code.  */
1501
1502   if (REGNO_FIRST_LUID (REGNO (loop_info->iteration_var))
1503       > INSN_LUID (loop_start))
1504     {
1505       if (loop_dump_stream)
1506         fprintf (loop_dump_stream,
1507                  "Preconditioning: Iteration var not live before loop start.\n");
1508       return 0;
1509     }
1510
1511   /* Note that loop_iterations biases the initial value for GIV iterators
1512      such as "while (i-- > 0)" so that we can calculate the number of
1513      iterations just like for BIV iterators.
1514
1515      Also note that the absolute values of initial_value and
1516      final_value are unimportant as only their difference is used for
1517      calculating the number of loop iterations.  */
1518   *initial_value = loop_info->initial_value;
1519   *increment = loop_info->increment;
1520   *final_value = loop_info->final_value;
1521
1522   /* Decide what mode to do these calculations in.  Choose the larger
1523      of final_value's mode and initial_value's mode, or a full-word if
1524      both are constants.  */
1525   *mode = GET_MODE (*final_value);
1526   if (*mode == VOIDmode)
1527     {
1528       *mode = GET_MODE (*initial_value);
1529       if (*mode == VOIDmode)
1530         *mode = word_mode;
1531     }
1532   else if (*mode != GET_MODE (*initial_value)
1533            && (GET_MODE_SIZE (*mode)
1534                < GET_MODE_SIZE (GET_MODE (*initial_value))))
1535     *mode = GET_MODE (*initial_value);
1536
1537   /* Success!  */
1538   if (loop_dump_stream)
1539     fprintf (loop_dump_stream, "Preconditioning: Successful.\n");
1540   return 1;
1541 }
1542
1543 /* All pseudo-registers must be mapped to themselves.  Two hard registers
1544    must be mapped, VIRTUAL_STACK_VARS_REGNUM and VIRTUAL_INCOMING_ARGS_
1545    REGNUM, to avoid function-inlining specific conversions of these
1546    registers.  All other hard regs can not be mapped because they may be
1547    used with different
1548    modes.  */
1549
1550 static void
1551 init_reg_map (map, maxregnum)
1552      struct inline_remap *map;
1553      int maxregnum;
1554 {
1555   int i;
1556
1557   for (i = maxregnum - 1; i > LAST_VIRTUAL_REGISTER; i--)
1558     map->reg_map[i] = regno_reg_rtx[i];
1559   /* Just clear the rest of the entries.  */
1560   for (i = LAST_VIRTUAL_REGISTER; i >= 0; i--)
1561     map->reg_map[i] = 0;
1562
1563   map->reg_map[VIRTUAL_STACK_VARS_REGNUM]
1564     = regno_reg_rtx[VIRTUAL_STACK_VARS_REGNUM];
1565   map->reg_map[VIRTUAL_INCOMING_ARGS_REGNUM]
1566     = regno_reg_rtx[VIRTUAL_INCOMING_ARGS_REGNUM];
1567 }
1568 \f
1569 /* Strength-reduction will often emit code for optimized biv/givs which
1570    calculates their value in a temporary register, and then copies the result
1571    to the iv.  This procedure reconstructs the pattern computing the iv;
1572    verifying that all operands are of the proper form.
1573
1574    PATTERN must be the result of single_set.
1575    The return value is the amount that the giv is incremented by.  */
1576
1577 static rtx
1578 calculate_giv_inc (pattern, src_insn, regno)
1579      rtx pattern, src_insn;
1580      unsigned int regno;
1581 {
1582   rtx increment;
1583   rtx increment_total = 0;
1584   int tries = 0;
1585
1586  retry:
1587   /* Verify that we have an increment insn here.  First check for a plus
1588      as the set source.  */
1589   if (GET_CODE (SET_SRC (pattern)) != PLUS)
1590     {
1591       /* SR sometimes computes the new giv value in a temp, then copies it
1592          to the new_reg.  */
1593       src_insn = PREV_INSN (src_insn);
1594       pattern = single_set (src_insn);
1595       if (GET_CODE (SET_SRC (pattern)) != PLUS)
1596         abort ();
1597
1598       /* The last insn emitted is not needed, so delete it to avoid confusing
1599          the second cse pass.  This insn sets the giv unnecessarily.  */
1600       delete_related_insns (get_last_insn ());
1601     }
1602
1603   /* Verify that we have a constant as the second operand of the plus.  */
1604   increment = XEXP (SET_SRC (pattern), 1);
1605   if (GET_CODE (increment) != CONST_INT)
1606     {
1607       /* SR sometimes puts the constant in a register, especially if it is
1608          too big to be an add immed operand.  */
1609       increment = find_last_value (increment, &src_insn, NULL_RTX, 0);
1610
1611       /* SR may have used LO_SUM to compute the constant if it is too large
1612          for a load immed operand.  In this case, the constant is in operand
1613          one of the LO_SUM rtx.  */
1614       if (GET_CODE (increment) == LO_SUM)
1615         increment = XEXP (increment, 1);
1616
1617       /* Some ports store large constants in memory and add a REG_EQUAL
1618          note to the store insn.  */
1619       else if (GET_CODE (increment) == MEM)
1620         {
1621           rtx note = find_reg_note (src_insn, REG_EQUAL, 0);
1622           if (note)
1623             increment = XEXP (note, 0);
1624         }
1625
1626       else if (GET_CODE (increment) == IOR
1627                || GET_CODE (increment) == ASHIFT
1628                || GET_CODE (increment) == PLUS)
1629         {
1630           /* The rs6000 port loads some constants with IOR.
1631              The alpha port loads some constants with ASHIFT and PLUS.  */
1632           rtx second_part = XEXP (increment, 1);
1633           enum rtx_code code = GET_CODE (increment);
1634
1635           increment = find_last_value (XEXP (increment, 0),
1636                                        &src_insn, NULL_RTX, 0);
1637           /* Don't need the last insn anymore.  */
1638           delete_related_insns (get_last_insn ());
1639
1640           if (GET_CODE (second_part) != CONST_INT
1641               || GET_CODE (increment) != CONST_INT)
1642             abort ();
1643
1644           if (code == IOR)
1645             increment = GEN_INT (INTVAL (increment) | INTVAL (second_part));
1646           else if (code == PLUS)
1647             increment = GEN_INT (INTVAL (increment) + INTVAL (second_part));
1648           else
1649             increment = GEN_INT (INTVAL (increment) << INTVAL (second_part));
1650         }
1651
1652       if (GET_CODE (increment) != CONST_INT)
1653         abort ();
1654
1655       /* The insn loading the constant into a register is no longer needed,
1656          so delete it.  */
1657       delete_related_insns (get_last_insn ());
1658     }
1659
1660   if (increment_total)
1661     increment_total = GEN_INT (INTVAL (increment_total) + INTVAL (increment));
1662   else
1663     increment_total = increment;
1664
1665   /* Check that the source register is the same as the register we expected
1666      to see as the source.  If not, something is seriously wrong.  */
1667   if (GET_CODE (XEXP (SET_SRC (pattern), 0)) != REG
1668       || REGNO (XEXP (SET_SRC (pattern), 0)) != regno)
1669     {
1670       /* Some machines (e.g. the romp), may emit two add instructions for
1671          certain constants, so lets try looking for another add immediately
1672          before this one if we have only seen one add insn so far.  */
1673
1674       if (tries == 0)
1675         {
1676           tries++;
1677
1678           src_insn = PREV_INSN (src_insn);
1679           pattern = single_set (src_insn);
1680
1681           delete_related_insns (get_last_insn ());
1682
1683           goto retry;
1684         }
1685
1686       abort ();
1687     }
1688
1689   return increment_total;
1690 }
1691
1692 /* Copy REG_NOTES, except for insn references, because not all insn_map
1693    entries are valid yet.  We do need to copy registers now though, because
1694    the reg_map entries can change during copying.  */
1695
1696 static rtx
1697 initial_reg_note_copy (notes, map)
1698      rtx notes;
1699      struct inline_remap *map;
1700 {
1701   rtx copy;
1702
1703   if (notes == 0)
1704     return 0;
1705
1706   copy = rtx_alloc (GET_CODE (notes));
1707   PUT_REG_NOTE_KIND (copy, REG_NOTE_KIND (notes));
1708
1709   if (GET_CODE (notes) == EXPR_LIST)
1710     XEXP (copy, 0) = copy_rtx_and_substitute (XEXP (notes, 0), map, 0);
1711   else if (GET_CODE (notes) == INSN_LIST)
1712     /* Don't substitute for these yet.  */
1713     XEXP (copy, 0) = copy_rtx (XEXP (notes, 0));
1714   else
1715     abort ();
1716
1717   XEXP (copy, 1) = initial_reg_note_copy (XEXP (notes, 1), map);
1718
1719   return copy;
1720 }
1721
1722 /* Fixup insn references in copied REG_NOTES.  */
1723
1724 static void
1725 final_reg_note_copy (notesp, map)
1726      rtx *notesp;
1727      struct inline_remap *map;
1728 {
1729   while (*notesp)
1730     {
1731       rtx note = *notesp;
1732
1733       if (GET_CODE (note) == INSN_LIST)
1734         {
1735           /* Sometimes, we have a REG_WAS_0 note that points to a
1736              deleted instruction.  In that case, we can just delete the
1737              note.  */
1738           if (REG_NOTE_KIND (note) == REG_WAS_0)
1739             {
1740               *notesp = XEXP (note, 1);
1741               continue;
1742             }
1743           else
1744             {
1745               rtx insn = map->insn_map[INSN_UID (XEXP (note, 0))];
1746
1747               /* If we failed to remap the note, something is awry.
1748                  Allow REG_LABEL as it may reference label outside
1749                  the unrolled loop.  */
1750               if (!insn)
1751                 {
1752                   if (REG_NOTE_KIND (note) != REG_LABEL)
1753                     abort ();
1754                 }
1755               else
1756                 XEXP (note, 0) = insn;
1757             }
1758         }
1759
1760       notesp = &XEXP (note, 1);
1761     }
1762 }
1763
1764 /* Copy each instruction in the loop, substituting from map as appropriate.
1765    This is very similar to a loop in expand_inline_function.  */
1766
1767 static void
1768 copy_loop_body (loop, copy_start, copy_end, map, exit_label, last_iteration,
1769                 unroll_type, start_label, loop_end, insert_before,
1770                 copy_notes_from)
1771      struct loop *loop;
1772      rtx copy_start, copy_end;
1773      struct inline_remap *map;
1774      rtx exit_label;
1775      int last_iteration;
1776      enum unroll_types unroll_type;
1777      rtx start_label, loop_end, insert_before, copy_notes_from;
1778 {
1779   struct loop_ivs *ivs = LOOP_IVS (loop);
1780   rtx insn, pattern;
1781   rtx set, tem, copy = NULL_RTX;
1782   int dest_reg_was_split, i;
1783 #ifdef HAVE_cc0
1784   rtx cc0_insn = 0;
1785 #endif
1786   rtx final_label = 0;
1787   rtx giv_inc, giv_dest_reg, giv_src_reg;
1788
1789   /* If this isn't the last iteration, then map any references to the
1790      start_label to final_label.  Final label will then be emitted immediately
1791      after the end of this loop body if it was ever used.
1792
1793      If this is the last iteration, then map references to the start_label
1794      to itself.  */
1795   if (! last_iteration)
1796     {
1797       final_label = gen_label_rtx ();
1798       set_label_in_map (map, CODE_LABEL_NUMBER (start_label), final_label);
1799     }
1800   else
1801     set_label_in_map (map, CODE_LABEL_NUMBER (start_label), start_label);
1802
1803   start_sequence ();
1804
1805   insn = copy_start;
1806   do
1807     {
1808       insn = NEXT_INSN (insn);
1809
1810       map->orig_asm_operands_vector = 0;
1811
1812       switch (GET_CODE (insn))
1813         {
1814         case INSN:
1815           pattern = PATTERN (insn);
1816           copy = 0;
1817           giv_inc = 0;
1818
1819           /* Check to see if this is a giv that has been combined with
1820              some split address givs.  (Combined in the sense that
1821              `combine_givs' in loop.c has put two givs in the same register.)
1822              In this case, we must search all givs based on the same biv to
1823              find the address givs.  Then split the address givs.
1824              Do this before splitting the giv, since that may map the
1825              SET_DEST to a new register.  */
1826
1827           if ((set = single_set (insn))
1828               && GET_CODE (SET_DEST (set)) == REG
1829               && addr_combined_regs[REGNO (SET_DEST (set))])
1830             {
1831               struct iv_class *bl;
1832               struct induction *v, *tv;
1833               unsigned int regno = REGNO (SET_DEST (set));
1834
1835               v = addr_combined_regs[REGNO (SET_DEST (set))];
1836               bl = REG_IV_CLASS (ivs, REGNO (v->src_reg));
1837
1838               /* Although the giv_inc amount is not needed here, we must call
1839                  calculate_giv_inc here since it might try to delete the
1840                  last insn emitted.  If we wait until later to call it,
1841                  we might accidentally delete insns generated immediately
1842                  below by emit_unrolled_add.  */
1843
1844               giv_inc = calculate_giv_inc (set, insn, regno);
1845
1846               /* Now find all address giv's that were combined with this
1847                  giv 'v'.  */
1848               for (tv = bl->giv; tv; tv = tv->next_iv)
1849                 if (tv->giv_type == DEST_ADDR && tv->same == v)
1850                   {
1851                     int this_giv_inc;
1852
1853                     /* If this DEST_ADDR giv was not split, then ignore it.  */
1854                     if (*tv->location != tv->dest_reg)
1855                       continue;
1856
1857                     /* Scale this_giv_inc if the multiplicative factors of
1858                        the two givs are different.  */
1859                     this_giv_inc = INTVAL (giv_inc);
1860                     if (tv->mult_val != v->mult_val)
1861                       this_giv_inc = (this_giv_inc / INTVAL (v->mult_val)
1862                                       * INTVAL (tv->mult_val));
1863
1864                     tv->dest_reg = plus_constant (tv->dest_reg, this_giv_inc);
1865                     *tv->location = tv->dest_reg;
1866
1867                     if (last_iteration && unroll_type != UNROLL_COMPLETELY)
1868                       {
1869                         /* Must emit an insn to increment the split address
1870                            giv.  Add in the const_adjust field in case there
1871                            was a constant eliminated from the address.  */
1872                         rtx value, dest_reg;
1873
1874                         /* tv->dest_reg will be either a bare register,
1875                            or else a register plus a constant.  */
1876                         if (GET_CODE (tv->dest_reg) == REG)
1877                           dest_reg = tv->dest_reg;
1878                         else
1879                           dest_reg = XEXP (tv->dest_reg, 0);
1880
1881                         /* Check for shared address givs, and avoid
1882                            incrementing the shared pseudo reg more than
1883                            once.  */
1884                         if (! tv->same_insn && ! tv->shared)
1885                           {
1886                             /* tv->dest_reg may actually be a (PLUS (REG)
1887                                (CONST)) here, so we must call plus_constant
1888                                to add the const_adjust amount before calling
1889                                emit_unrolled_add below.  */
1890                             value = plus_constant (tv->dest_reg,
1891                                                    tv->const_adjust);
1892
1893                             if (GET_CODE (value) == PLUS)
1894                               {
1895                                 /* The constant could be too large for an add
1896                                    immediate, so can't directly emit an insn
1897                                    here.  */
1898                                 emit_unrolled_add (dest_reg, XEXP (value, 0),
1899                                                    XEXP (value, 1));
1900                               }
1901                           }
1902
1903                         /* Reset the giv to be just the register again, in case
1904                            it is used after the set we have just emitted.
1905                            We must subtract the const_adjust factor added in
1906                            above.  */
1907                         tv->dest_reg = plus_constant (dest_reg,
1908                                                       -tv->const_adjust);
1909                         *tv->location = tv->dest_reg;
1910                       }
1911                   }
1912             }
1913
1914           /* If this is a setting of a splittable variable, then determine
1915              how to split the variable, create a new set based on this split,
1916              and set up the reg_map so that later uses of the variable will
1917              use the new split variable.  */
1918
1919           dest_reg_was_split = 0;
1920
1921           if ((set = single_set (insn))
1922               && GET_CODE (SET_DEST (set)) == REG
1923               && splittable_regs[REGNO (SET_DEST (set))])
1924             {
1925               unsigned int regno = REGNO (SET_DEST (set));
1926               unsigned int src_regno;
1927
1928               dest_reg_was_split = 1;
1929
1930               giv_dest_reg = SET_DEST (set);
1931               giv_src_reg = giv_dest_reg;
1932               /* Compute the increment value for the giv, if it wasn't
1933                  already computed above.  */
1934               if (giv_inc == 0)
1935                 giv_inc = calculate_giv_inc (set, insn, regno);
1936
1937               src_regno = REGNO (giv_src_reg);
1938
1939               if (unroll_type == UNROLL_COMPLETELY)
1940                 {
1941                   /* Completely unrolling the loop.  Set the induction
1942                      variable to a known constant value.  */
1943
1944                   /* The value in splittable_regs may be an invariant
1945                      value, so we must use plus_constant here.  */
1946                   splittable_regs[regno]
1947                     = plus_constant (splittable_regs[src_regno],
1948                                      INTVAL (giv_inc));
1949
1950                   if (GET_CODE (splittable_regs[regno]) == PLUS)
1951                     {
1952                       giv_src_reg = XEXP (splittable_regs[regno], 0);
1953                       giv_inc = XEXP (splittable_regs[regno], 1);
1954                     }
1955                   else
1956                     {
1957                       /* The splittable_regs value must be a REG or a
1958                          CONST_INT, so put the entire value in the giv_src_reg
1959                          variable.  */
1960                       giv_src_reg = splittable_regs[regno];
1961                       giv_inc = const0_rtx;
1962                     }
1963                 }
1964               else
1965                 {
1966                   /* Partially unrolling loop.  Create a new pseudo
1967                      register for the iteration variable, and set it to
1968                      be a constant plus the original register.  Except
1969                      on the last iteration, when the result has to
1970                      go back into the original iteration var register.  */
1971
1972                   /* Handle bivs which must be mapped to a new register
1973                      when split.  This happens for bivs which need their
1974                      final value set before loop entry.  The new register
1975                      for the biv was stored in the biv's first struct
1976                      induction entry by find_splittable_regs.  */
1977
1978                   if (regno < ivs->n_regs
1979                       && REG_IV_TYPE (ivs, regno) == BASIC_INDUCT)
1980                     {
1981                       giv_src_reg = REG_IV_CLASS (ivs, regno)->biv->src_reg;
1982                       giv_dest_reg = giv_src_reg;
1983                     }
1984
1985 #if 0
1986                   /* If non-reduced/final-value givs were split, then
1987                      this would have to remap those givs also.  See
1988                      find_splittable_regs.  */
1989 #endif
1990
1991                   splittable_regs[regno]
1992                     = simplify_gen_binary (PLUS, GET_MODE (giv_src_reg),
1993                                            giv_inc,
1994                                            splittable_regs[src_regno]);
1995                   giv_inc = splittable_regs[regno];
1996
1997                   /* Now split the induction variable by changing the dest
1998                      of this insn to a new register, and setting its
1999                      reg_map entry to point to this new register.
2000
2001                      If this is the last iteration, and this is the last insn
2002                      that will update the iv, then reuse the original dest,
2003                      to ensure that the iv will have the proper value when
2004                      the loop exits or repeats.
2005
2006                      Using splittable_regs_updates here like this is safe,
2007                      because it can only be greater than one if all
2008                      instructions modifying the iv are always executed in
2009                      order.  */
2010
2011                   if (! last_iteration
2012                       || (splittable_regs_updates[regno]-- != 1))
2013                     {
2014                       tem = gen_reg_rtx (GET_MODE (giv_src_reg));
2015                       giv_dest_reg = tem;
2016                       map->reg_map[regno] = tem;
2017                       record_base_value (REGNO (tem),
2018                                          giv_inc == const0_rtx
2019                                          ? giv_src_reg
2020                                          : gen_rtx_PLUS (GET_MODE (giv_src_reg),
2021                                                          giv_src_reg, giv_inc),
2022                                          1);
2023                     }
2024                   else
2025                     map->reg_map[regno] = giv_src_reg;
2026                 }
2027
2028               /* The constant being added could be too large for an add
2029                  immediate, so can't directly emit an insn here.  */
2030               emit_unrolled_add (giv_dest_reg, giv_src_reg, giv_inc);
2031               copy = get_last_insn ();
2032               pattern = PATTERN (copy);
2033             }
2034           else
2035             {
2036               pattern = copy_rtx_and_substitute (pattern, map, 0);
2037               copy = emit_insn (pattern);
2038             }
2039           REG_NOTES (copy) = initial_reg_note_copy (REG_NOTES (insn), map);
2040           INSN_SCOPE (copy) = INSN_SCOPE (insn);
2041
2042           /* If there is a REG_EQUAL note present whose value
2043              is not loop invariant, then delete it, since it
2044              may cause problems with later optimization passes.  */
2045           if ((tem = find_reg_note (copy, REG_EQUAL, NULL_RTX))
2046               && !loop_invariant_p (loop, XEXP (tem, 0)))
2047             remove_note (copy, tem);
2048
2049 #ifdef HAVE_cc0
2050           /* If this insn is setting CC0, it may need to look at
2051              the insn that uses CC0 to see what type of insn it is.
2052              In that case, the call to recog via validate_change will
2053              fail.  So don't substitute constants here.  Instead,
2054              do it when we emit the following insn.
2055
2056              For example, see the pyr.md file.  That machine has signed and
2057              unsigned compares.  The compare patterns must check the
2058              following branch insn to see which what kind of compare to
2059              emit.
2060
2061              If the previous insn set CC0, substitute constants on it as
2062              well.  */
2063           if (sets_cc0_p (PATTERN (copy)) != 0)
2064             cc0_insn = copy;
2065           else
2066             {
2067               if (cc0_insn)
2068                 try_constants (cc0_insn, map);
2069               cc0_insn = 0;
2070               try_constants (copy, map);
2071             }
2072 #else
2073           try_constants (copy, map);
2074 #endif
2075
2076           /* Make split induction variable constants `permanent' since we
2077              know there are no backward branches across iteration variable
2078              settings which would invalidate this.  */
2079           if (dest_reg_was_split)
2080             {
2081               int regno = REGNO (SET_DEST (set));
2082
2083               if ((size_t) regno < VARRAY_SIZE (map->const_equiv_varray)
2084                   && (VARRAY_CONST_EQUIV (map->const_equiv_varray, regno).age
2085                       == map->const_age))
2086                 VARRAY_CONST_EQUIV (map->const_equiv_varray, regno).age = -1;
2087             }
2088           break;
2089
2090         case JUMP_INSN:
2091           pattern = copy_rtx_and_substitute (PATTERN (insn), map, 0);
2092           copy = emit_jump_insn (pattern);
2093           REG_NOTES (copy) = initial_reg_note_copy (REG_NOTES (insn), map);
2094           INSN_SCOPE (copy) = INSN_SCOPE (insn);
2095
2096           if (JUMP_LABEL (insn))
2097             {
2098               JUMP_LABEL (copy) = get_label_from_map (map,
2099                                                       CODE_LABEL_NUMBER
2100                                                       (JUMP_LABEL (insn)));
2101               LABEL_NUSES (JUMP_LABEL (copy))++;
2102             }
2103           if (JUMP_LABEL (insn) == start_label && insn == copy_end
2104               && ! last_iteration)
2105             {
2106
2107               /* This is a branch to the beginning of the loop; this is the
2108                  last insn being copied; and this is not the last iteration.
2109                  In this case, we want to change the original fall through
2110                  case to be a branch past the end of the loop, and the
2111                  original jump label case to fall_through.  */
2112
2113               if (!invert_jump (copy, exit_label, 0))
2114                 {
2115                   rtx jmp;
2116                   rtx lab = gen_label_rtx ();
2117                   /* Can't do it by reversing the jump (probably because we
2118                      couldn't reverse the conditions), so emit a new
2119                      jump_insn after COPY, and redirect the jump around
2120                      that.  */
2121                   jmp = emit_jump_insn_after (gen_jump (exit_label), copy);
2122                   JUMP_LABEL (jmp) = exit_label;
2123                   LABEL_NUSES (exit_label)++;
2124                   jmp = emit_barrier_after (jmp);
2125                   emit_label_after (lab, jmp);
2126                   LABEL_NUSES (lab) = 0;
2127                   if (!redirect_jump (copy, lab, 0))
2128                     abort ();
2129                 }
2130             }
2131
2132 #ifdef HAVE_cc0
2133           if (cc0_insn)
2134             try_constants (cc0_insn, map);
2135           cc0_insn = 0;
2136 #endif
2137           try_constants (copy, map);
2138
2139           /* Set the jump label of COPY correctly to avoid problems with
2140              later passes of unroll_loop, if INSN had jump label set.  */
2141           if (JUMP_LABEL (insn))
2142             {
2143               rtx label = 0;
2144
2145               /* Can't use the label_map for every insn, since this may be
2146                  the backward branch, and hence the label was not mapped.  */
2147               if ((set = single_set (copy)))
2148                 {
2149                   tem = SET_SRC (set);
2150                   if (GET_CODE (tem) == LABEL_REF)
2151                     label = XEXP (tem, 0);
2152                   else if (GET_CODE (tem) == IF_THEN_ELSE)
2153                     {
2154                       if (XEXP (tem, 1) != pc_rtx)
2155                         label = XEXP (XEXP (tem, 1), 0);
2156                       else
2157                         label = XEXP (XEXP (tem, 2), 0);
2158                     }
2159                 }
2160
2161               if (label && GET_CODE (label) == CODE_LABEL)
2162                 JUMP_LABEL (copy) = label;
2163               else
2164                 {
2165                   /* An unrecognizable jump insn, probably the entry jump
2166                      for a switch statement.  This label must have been mapped,
2167                      so just use the label_map to get the new jump label.  */
2168                   JUMP_LABEL (copy)
2169                     = get_label_from_map (map,
2170                                           CODE_LABEL_NUMBER (JUMP_LABEL (insn)));
2171                 }
2172
2173               /* If this is a non-local jump, then must increase the label
2174                  use count so that the label will not be deleted when the
2175                  original jump is deleted.  */
2176               LABEL_NUSES (JUMP_LABEL (copy))++;
2177             }
2178           else if (GET_CODE (PATTERN (copy)) == ADDR_VEC
2179                    || GET_CODE (PATTERN (copy)) == ADDR_DIFF_VEC)
2180             {
2181               rtx pat = PATTERN (copy);
2182               int diff_vec_p = GET_CODE (pat) == ADDR_DIFF_VEC;
2183               int len = XVECLEN (pat, diff_vec_p);
2184               int i;
2185
2186               for (i = 0; i < len; i++)
2187                 LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0))++;
2188             }
2189
2190           /* If this used to be a conditional jump insn but whose branch
2191              direction is now known, we must do something special.  */
2192           if (any_condjump_p (insn) && onlyjump_p (insn) && map->last_pc_value)
2193             {
2194 #ifdef HAVE_cc0
2195               /* If the previous insn set cc0 for us, delete it.  */
2196               if (only_sets_cc0_p (PREV_INSN (copy)))
2197                 delete_related_insns (PREV_INSN (copy));
2198 #endif
2199
2200               /* If this is now a no-op, delete it.  */
2201               if (map->last_pc_value == pc_rtx)
2202                 {
2203                   delete_insn (copy);
2204                   copy = 0;
2205                 }
2206               else
2207                 /* Otherwise, this is unconditional jump so we must put a
2208                    BARRIER after it.  We could do some dead code elimination
2209                    here, but jump.c will do it just as well.  */
2210                 emit_barrier ();
2211             }
2212           break;
2213
2214         case CALL_INSN:
2215           pattern = copy_rtx_and_substitute (PATTERN (insn), map, 0);
2216           copy = emit_call_insn (pattern);
2217           REG_NOTES (copy) = initial_reg_note_copy (REG_NOTES (insn), map);
2218           INSN_SCOPE (copy) = INSN_SCOPE (insn);
2219           SIBLING_CALL_P (copy) = SIBLING_CALL_P (insn);
2220           CONST_OR_PURE_CALL_P (copy) = CONST_OR_PURE_CALL_P (insn);
2221
2222           /* Because the USAGE information potentially contains objects other
2223              than hard registers, we need to copy it.  */
2224           CALL_INSN_FUNCTION_USAGE (copy)
2225             = copy_rtx_and_substitute (CALL_INSN_FUNCTION_USAGE (insn),
2226                                        map, 0);
2227
2228 #ifdef HAVE_cc0
2229           if (cc0_insn)
2230             try_constants (cc0_insn, map);
2231           cc0_insn = 0;
2232 #endif
2233           try_constants (copy, map);
2234
2235           /* Be lazy and assume CALL_INSNs clobber all hard registers.  */
2236           for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
2237             VARRAY_CONST_EQUIV (map->const_equiv_varray, i).rtx = 0;
2238           break;
2239
2240         case CODE_LABEL:
2241           /* If this is the loop start label, then we don't need to emit a
2242              copy of this label since no one will use it.  */
2243
2244           if (insn != start_label)
2245             {
2246               copy = emit_label (get_label_from_map (map,
2247                                                      CODE_LABEL_NUMBER (insn)));
2248               map->const_age++;
2249             }
2250           break;
2251
2252         case BARRIER:
2253           copy = emit_barrier ();
2254           break;
2255
2256         case NOTE:
2257           /* VTOP and CONT notes are valid only before the loop exit test.
2258              If placed anywhere else, loop may generate bad code.  */
2259           /* BASIC_BLOCK notes exist to stabilize basic block structures with
2260              the associated rtl.  We do not want to share the structure in
2261              this new block.  */
2262
2263           if (NOTE_LINE_NUMBER (insn) != NOTE_INSN_DELETED
2264               && NOTE_LINE_NUMBER (insn) != NOTE_INSN_DELETED_LABEL
2265               && NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK
2266               && ((NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_VTOP
2267                    && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_CONT)
2268                   || (last_iteration && unroll_type != UNROLL_COMPLETELY)))
2269             copy = emit_note (NOTE_SOURCE_FILE (insn),
2270                               NOTE_LINE_NUMBER (insn));
2271           else
2272             copy = 0;
2273           break;
2274
2275         default:
2276           abort ();
2277         }
2278
2279       map->insn_map[INSN_UID (insn)] = copy;
2280     }
2281   while (insn != copy_end);
2282
2283   /* Now finish coping the REG_NOTES.  */
2284   insn = copy_start;
2285   do
2286     {
2287       insn = NEXT_INSN (insn);
2288       if ((GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
2289            || GET_CODE (insn) == CALL_INSN)
2290           && map->insn_map[INSN_UID (insn)])
2291         final_reg_note_copy (&REG_NOTES (map->insn_map[INSN_UID (insn)]), map);
2292     }
2293   while (insn != copy_end);
2294
2295   /* There may be notes between copy_notes_from and loop_end.  Emit a copy of
2296      each of these notes here, since there may be some important ones, such as
2297      NOTE_INSN_BLOCK_END notes, in this group.  We don't do this on the last
2298      iteration, because the original notes won't be deleted.
2299
2300      We can't use insert_before here, because when from preconditioning,
2301      insert_before points before the loop.  We can't use copy_end, because
2302      there may be insns already inserted after it (which we don't want to
2303      copy) when not from preconditioning code.  */
2304
2305   if (! last_iteration)
2306     {
2307       for (insn = copy_notes_from; insn != loop_end; insn = NEXT_INSN (insn))
2308         {
2309           /* VTOP notes are valid only before the loop exit test.
2310              If placed anywhere else, loop may generate bad code.
2311              Although COPY_NOTES_FROM will be at most one or two (for cc0)
2312              instructions before the last insn in the loop, COPY_NOTES_FROM
2313              can be a NOTE_INSN_LOOP_CONT note if there is no VTOP note,
2314              as in a do .. while loop.  */
2315           if (GET_CODE (insn) == NOTE
2316               && NOTE_LINE_NUMBER (insn) != NOTE_INSN_DELETED
2317               && NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK
2318               && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_VTOP
2319               && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_CONT)
2320             emit_note (NOTE_SOURCE_FILE (insn), NOTE_LINE_NUMBER (insn));
2321         }
2322     }
2323
2324   if (final_label && LABEL_NUSES (final_label) > 0)
2325     emit_label (final_label);
2326
2327   tem = get_insns ();
2328   end_sequence ();
2329   loop_insn_emit_before (loop, 0, insert_before, tem);
2330 }
2331 \f
2332 /* Emit an insn, using the expand_binop to ensure that a valid insn is
2333    emitted.  This will correctly handle the case where the increment value
2334    won't fit in the immediate field of a PLUS insns.  */
2335
2336 void
2337 emit_unrolled_add (dest_reg, src_reg, increment)
2338      rtx dest_reg, src_reg, increment;
2339 {
2340   rtx result;
2341
2342   result = expand_simple_binop (GET_MODE (dest_reg), PLUS, src_reg, increment,
2343                                 dest_reg, 0, OPTAB_LIB_WIDEN);
2344
2345   if (dest_reg != result)
2346     emit_move_insn (dest_reg, result);
2347 }
2348 \f
2349 /* Searches the insns between INSN and LOOP->END.  Returns 1 if there
2350    is a backward branch in that range that branches to somewhere between
2351    LOOP->START and INSN.  Returns 0 otherwise.  */
2352
2353 /* ??? This is quadratic algorithm.  Could be rewritten to be linear.
2354    In practice, this is not a problem, because this function is seldom called,
2355    and uses a negligible amount of CPU time on average.  */
2356
2357 int
2358 back_branch_in_range_p (loop, insn)
2359      const struct loop *loop;
2360      rtx insn;
2361 {
2362   rtx p, q, target_insn;
2363   rtx loop_start = loop->start;
2364   rtx loop_end = loop->end;
2365   rtx orig_loop_end = loop->end;
2366
2367   /* Stop before we get to the backward branch at the end of the loop.  */
2368   loop_end = prev_nonnote_insn (loop_end);
2369   if (GET_CODE (loop_end) == BARRIER)
2370     loop_end = PREV_INSN (loop_end);
2371
2372   /* Check in case insn has been deleted, search forward for first non
2373      deleted insn following it.  */
2374   while (INSN_DELETED_P (insn))
2375     insn = NEXT_INSN (insn);
2376
2377   /* Check for the case where insn is the last insn in the loop.  Deal
2378      with the case where INSN was a deleted loop test insn, in which case
2379      it will now be the NOTE_LOOP_END.  */
2380   if (insn == loop_end || insn == orig_loop_end)
2381     return 0;
2382
2383   for (p = NEXT_INSN (insn); p != loop_end; p = NEXT_INSN (p))
2384     {
2385       if (GET_CODE (p) == JUMP_INSN)
2386         {
2387           target_insn = JUMP_LABEL (p);
2388
2389           /* Search from loop_start to insn, to see if one of them is
2390              the target_insn.  We can't use INSN_LUID comparisons here,
2391              since insn may not have an LUID entry.  */
2392           for (q = loop_start; q != insn; q = NEXT_INSN (q))
2393             if (q == target_insn)
2394               return 1;
2395         }
2396     }
2397
2398   return 0;
2399 }
2400
2401 /* Try to generate the simplest rtx for the expression
2402    (PLUS (MULT mult1 mult2) add1).  This is used to calculate the initial
2403    value of giv's.  */
2404
2405 static rtx
2406 fold_rtx_mult_add (mult1, mult2, add1, mode)
2407      rtx mult1, mult2, add1;
2408      enum machine_mode mode;
2409 {
2410   rtx temp, mult_res;
2411   rtx result;
2412
2413   /* The modes must all be the same.  This should always be true.  For now,
2414      check to make sure.  */
2415   if ((GET_MODE (mult1) != mode && GET_MODE (mult1) != VOIDmode)
2416       || (GET_MODE (mult2) != mode && GET_MODE (mult2) != VOIDmode)
2417       || (GET_MODE (add1) != mode && GET_MODE (add1) != VOIDmode))
2418     abort ();
2419
2420   /* Ensure that if at least one of mult1/mult2 are constant, then mult2
2421      will be a constant.  */
2422   if (GET_CODE (mult1) == CONST_INT)
2423     {
2424       temp = mult2;
2425       mult2 = mult1;
2426       mult1 = temp;
2427     }
2428
2429   mult_res = simplify_binary_operation (MULT, mode, mult1, mult2);
2430   if (! mult_res)
2431     mult_res = gen_rtx_MULT (mode, mult1, mult2);
2432
2433   /* Again, put the constant second.  */
2434   if (GET_CODE (add1) == CONST_INT)
2435     {
2436       temp = add1;
2437       add1 = mult_res;
2438       mult_res = temp;
2439     }
2440
2441   result = simplify_binary_operation (PLUS, mode, add1, mult_res);
2442   if (! result)
2443     result = gen_rtx_PLUS (mode, add1, mult_res);
2444
2445   return result;
2446 }
2447
2448 /* Searches the list of induction struct's for the biv BL, to try to calculate
2449    the total increment value for one iteration of the loop as a constant.
2450
2451    Returns the increment value as an rtx, simplified as much as possible,
2452    if it can be calculated.  Otherwise, returns 0.  */
2453
2454 rtx
2455 biv_total_increment (bl)
2456      const struct iv_class *bl;
2457 {
2458   struct induction *v;
2459   rtx result;
2460
2461   /* For increment, must check every instruction that sets it.  Each
2462      instruction must be executed only once each time through the loop.
2463      To verify this, we check that the insn is always executed, and that
2464      there are no backward branches after the insn that branch to before it.
2465      Also, the insn must have a mult_val of one (to make sure it really is
2466      an increment).  */
2467
2468   result = const0_rtx;
2469   for (v = bl->biv; v; v = v->next_iv)
2470     {
2471       if (v->always_computable && v->mult_val == const1_rtx
2472           && ! v->maybe_multiple
2473           && SCALAR_INT_MODE_P (v->mode))
2474         result = fold_rtx_mult_add (result, const1_rtx, v->add_val, v->mode);
2475       else
2476         return 0;
2477     }
2478
2479   return result;
2480 }
2481
2482 /* For each biv and giv, determine whether it can be safely split into
2483    a different variable for each unrolled copy of the loop body.  If it
2484    is safe to split, then indicate that by saving some useful info
2485    in the splittable_regs array.
2486
2487    If the loop is being completely unrolled, then splittable_regs will hold
2488    the current value of the induction variable while the loop is unrolled.
2489    It must be set to the initial value of the induction variable here.
2490    Otherwise, splittable_regs will hold the difference between the current
2491    value of the induction variable and the value the induction variable had
2492    at the top of the loop.  It must be set to the value 0 here.
2493
2494    Returns the total number of instructions that set registers that are
2495    splittable.  */
2496
2497 /* ?? If the loop is only unrolled twice, then most of the restrictions to
2498    constant values are unnecessary, since we can easily calculate increment
2499    values in this case even if nothing is constant.  The increment value
2500    should not involve a multiply however.  */
2501
2502 /* ?? Even if the biv/giv increment values aren't constant, it may still
2503    be beneficial to split the variable if the loop is only unrolled a few
2504    times, since multiplies by small integers (1,2,3,4) are very cheap.  */
2505
2506 static int
2507 find_splittable_regs (loop, unroll_type, unroll_number)
2508      const struct loop *loop;
2509      enum unroll_types unroll_type;
2510      int unroll_number;
2511 {
2512   struct loop_ivs *ivs = LOOP_IVS (loop);
2513   struct iv_class *bl;
2514   struct induction *v;
2515   rtx increment, tem;
2516   rtx biv_final_value;
2517   int biv_splittable;
2518   int result = 0;
2519
2520   for (bl = ivs->list; bl; bl = bl->next)
2521     {
2522       /* Biv_total_increment must return a constant value,
2523          otherwise we can not calculate the split values.  */
2524
2525       increment = biv_total_increment (bl);
2526       if (! increment || GET_CODE (increment) != CONST_INT)
2527         continue;
2528
2529       /* The loop must be unrolled completely, or else have a known number
2530          of iterations and only one exit, or else the biv must be dead
2531          outside the loop, or else the final value must be known.  Otherwise,
2532          it is unsafe to split the biv since it may not have the proper
2533          value on loop exit.  */
2534
2535       /* loop_number_exit_count is nonzero if the loop has an exit other than
2536          a fall through at the end.  */
2537
2538       biv_splittable = 1;
2539       biv_final_value = 0;
2540       if (unroll_type != UNROLL_COMPLETELY
2541           && (loop->exit_count || unroll_type == UNROLL_NAIVE)
2542           && (REGNO_LAST_LUID (bl->regno) >= INSN_LUID (loop->end)
2543               || ! bl->init_insn
2544               || INSN_UID (bl->init_insn) >= max_uid_for_loop
2545               || (REGNO_FIRST_LUID (bl->regno)
2546                   < INSN_LUID (bl->init_insn))
2547               || reg_mentioned_p (bl->biv->dest_reg, SET_SRC (bl->init_set)))
2548           && ! (biv_final_value = final_biv_value (loop, bl)))
2549         biv_splittable = 0;
2550
2551       /* If any of the insns setting the BIV don't do so with a simple
2552          PLUS, we don't know how to split it.  */
2553       for (v = bl->biv; biv_splittable && v; v = v->next_iv)
2554         if ((tem = single_set (v->insn)) == 0
2555             || GET_CODE (SET_DEST (tem)) != REG
2556             || REGNO (SET_DEST (tem)) != bl->regno
2557             || GET_CODE (SET_SRC (tem)) != PLUS)
2558           biv_splittable = 0;
2559
2560       /* If final value is nonzero, then must emit an instruction which sets
2561          the value of the biv to the proper value.  This is done after
2562          handling all of the givs, since some of them may need to use the
2563          biv's value in their initialization code.  */
2564
2565       /* This biv is splittable.  If completely unrolling the loop, save
2566          the biv's initial value.  Otherwise, save the constant zero.  */
2567
2568       if (biv_splittable == 1)
2569         {
2570           if (unroll_type == UNROLL_COMPLETELY)
2571             {
2572               /* If the initial value of the biv is itself (i.e. it is too
2573                  complicated for strength_reduce to compute), or is a hard
2574                  register, or it isn't invariant, then we must create a new
2575                  pseudo reg to hold the initial value of the biv.  */
2576
2577               if (GET_CODE (bl->initial_value) == REG
2578                   && (REGNO (bl->initial_value) == bl->regno
2579                       || REGNO (bl->initial_value) < FIRST_PSEUDO_REGISTER
2580                       || ! loop_invariant_p (loop, bl->initial_value)))
2581                 {
2582                   rtx tem = gen_reg_rtx (bl->biv->mode);
2583
2584                   record_base_value (REGNO (tem), bl->biv->add_val, 0);
2585                   loop_insn_hoist (loop,
2586                                    gen_move_insn (tem, bl->biv->src_reg));
2587
2588                   if (loop_dump_stream)
2589                     fprintf (loop_dump_stream,
2590                              "Biv %d initial value remapped to %d.\n",
2591                              bl->regno, REGNO (tem));
2592
2593                   splittable_regs[bl->regno] = tem;
2594                 }
2595               else
2596                 splittable_regs[bl->regno] = bl->initial_value;
2597             }
2598           else
2599             splittable_regs[bl->regno] = const0_rtx;
2600
2601           /* Save the number of instructions that modify the biv, so that
2602              we can treat the last one specially.  */
2603
2604           splittable_regs_updates[bl->regno] = bl->biv_count;
2605           result += bl->biv_count;
2606
2607           if (loop_dump_stream)
2608             fprintf (loop_dump_stream,
2609                      "Biv %d safe to split.\n", bl->regno);
2610         }
2611
2612       /* Check every giv that depends on this biv to see whether it is
2613          splittable also.  Even if the biv isn't splittable, givs which
2614          depend on it may be splittable if the biv is live outside the
2615          loop, and the givs aren't.  */
2616
2617       result += find_splittable_givs (loop, bl, unroll_type, increment,
2618                                       unroll_number);
2619
2620       /* If final value is nonzero, then must emit an instruction which sets
2621          the value of the biv to the proper value.  This is done after
2622          handling all of the givs, since some of them may need to use the
2623          biv's value in their initialization code.  */
2624       if (biv_final_value)
2625         {
2626           /* If the loop has multiple exits, emit the insns before the
2627              loop to ensure that it will always be executed no matter
2628              how the loop exits.  Otherwise emit the insn after the loop,
2629              since this is slightly more efficient.  */
2630           if (! loop->exit_count)
2631             loop_insn_sink (loop, gen_move_insn (bl->biv->src_reg,
2632                                                  biv_final_value));
2633           else
2634             {
2635               /* Create a new register to hold the value of the biv, and then
2636                  set the biv to its final value before the loop start.  The biv
2637                  is set to its final value before loop start to ensure that
2638                  this insn will always be executed, no matter how the loop
2639                  exits.  */
2640               rtx tem = gen_reg_rtx (bl->biv->mode);
2641               record_base_value (REGNO (tem), bl->biv->add_val, 0);
2642
2643               loop_insn_hoist (loop, gen_move_insn (tem, bl->biv->src_reg));
2644               loop_insn_hoist (loop, gen_move_insn (bl->biv->src_reg,
2645                                                     biv_final_value));
2646
2647               if (loop_dump_stream)
2648                 fprintf (loop_dump_stream, "Biv %d mapped to %d for split.\n",
2649                          REGNO (bl->biv->src_reg), REGNO (tem));
2650
2651               /* Set up the mapping from the original biv register to the new
2652                  register.  */
2653               bl->biv->src_reg = tem;
2654             }
2655         }
2656     }
2657   return result;
2658 }
2659
2660 /* For every giv based on the biv BL, check to determine whether it is
2661    splittable.  This is a subroutine to find_splittable_regs ().
2662
2663    Return the number of instructions that set splittable registers.  */
2664
2665 static int
2666 find_splittable_givs (loop, bl, unroll_type, increment, unroll_number)
2667      const struct loop *loop;
2668      struct iv_class *bl;
2669      enum unroll_types unroll_type;
2670      rtx increment;
2671      int unroll_number ATTRIBUTE_UNUSED;
2672 {
2673   struct loop_ivs *ivs = LOOP_IVS (loop);
2674   struct induction *v, *v2;
2675   rtx final_value;
2676   rtx tem;
2677   int result = 0;
2678
2679   /* Scan the list of givs, and set the same_insn field when there are
2680      multiple identical givs in the same insn.  */
2681   for (v = bl->giv; v; v = v->next_iv)
2682     for (v2 = v->next_iv; v2; v2 = v2->next_iv)
2683       if (v->insn == v2->insn && rtx_equal_p (v->new_reg, v2->new_reg)
2684           && ! v2->same_insn)
2685         v2->same_insn = v;
2686
2687   for (v = bl->giv; v; v = v->next_iv)
2688     {
2689       rtx giv_inc, value;
2690
2691       /* Only split the giv if it has already been reduced, or if the loop is
2692          being completely unrolled.  */
2693       if (unroll_type != UNROLL_COMPLETELY && v->ignore)
2694         continue;
2695
2696       /* The giv can be split if the insn that sets the giv is executed once
2697          and only once on every iteration of the loop.  */
2698       /* An address giv can always be split.  v->insn is just a use not a set,
2699          and hence it does not matter whether it is always executed.  All that
2700          matters is that all the biv increments are always executed, and we
2701          won't reach here if they aren't.  */
2702       if (v->giv_type != DEST_ADDR
2703           && (! v->always_computable
2704               || back_branch_in_range_p (loop, v->insn)))
2705         continue;
2706
2707       /* The giv increment value must be a constant.  */
2708       giv_inc = fold_rtx_mult_add (v->mult_val, increment, const0_rtx,
2709                                    v->mode);
2710       if (! giv_inc || GET_CODE (giv_inc) != CONST_INT)
2711         continue;
2712
2713       /* The loop must be unrolled completely, or else have a known number of
2714          iterations and only one exit, or else the giv must be dead outside
2715          the loop, or else the final value of the giv must be known.
2716          Otherwise, it is not safe to split the giv since it may not have the
2717          proper value on loop exit.  */
2718
2719       /* The used outside loop test will fail for DEST_ADDR givs.  They are
2720          never used outside the loop anyways, so it is always safe to split a
2721          DEST_ADDR giv.  */
2722
2723       final_value = 0;
2724       if (unroll_type != UNROLL_COMPLETELY
2725           && (loop->exit_count || unroll_type == UNROLL_NAIVE)
2726           && v->giv_type != DEST_ADDR
2727           /* The next part is true if the pseudo is used outside the loop.
2728              We assume that this is true for any pseudo created after loop
2729              starts, because we don't have a reg_n_info entry for them.  */
2730           && (REGNO (v->dest_reg) >= max_reg_before_loop
2731               || (REGNO_FIRST_UID (REGNO (v->dest_reg)) != INSN_UID (v->insn)
2732                   /* Check for the case where the pseudo is set by a shift/add
2733                      sequence, in which case the first insn setting the pseudo
2734                      is the first insn of the shift/add sequence.  */
2735                   && (! (tem = find_reg_note (v->insn, REG_RETVAL, NULL_RTX))
2736                       || (REGNO_FIRST_UID (REGNO (v->dest_reg))
2737                           != INSN_UID (XEXP (tem, 0)))))
2738               /* Line above always fails if INSN was moved by loop opt.  */
2739               || (REGNO_LAST_LUID (REGNO (v->dest_reg))
2740                   >= INSN_LUID (loop->end)))
2741           && ! (final_value = v->final_value))
2742         continue;
2743
2744 #if 0
2745       /* Currently, non-reduced/final-value givs are never split.  */
2746       /* Should emit insns after the loop if possible, as the biv final value
2747          code below does.  */
2748
2749       /* If the final value is nonzero, and the giv has not been reduced,
2750          then must emit an instruction to set the final value.  */
2751       if (final_value && !v->new_reg)
2752         {
2753           /* Create a new register to hold the value of the giv, and then set
2754              the giv to its final value before the loop start.  The giv is set
2755              to its final value before loop start to ensure that this insn
2756              will always be executed, no matter how we exit.  */
2757           tem = gen_reg_rtx (v->mode);
2758           loop_insn_hoist (loop, gen_move_insn (tem, v->dest_reg));
2759           loop_insn_hoist (loop, gen_move_insn (v->dest_reg, final_value));
2760
2761           if (loop_dump_stream)
2762             fprintf (loop_dump_stream, "Giv %d mapped to %d for split.\n",
2763                      REGNO (v->dest_reg), REGNO (tem));
2764
2765           v->src_reg = tem;
2766         }
2767 #endif
2768
2769       /* This giv is splittable.  If completely unrolling the loop, save the
2770          giv's initial value.  Otherwise, save the constant zero for it.  */
2771
2772       if (unroll_type == UNROLL_COMPLETELY)
2773         {
2774           /* It is not safe to use bl->initial_value here, because it may not
2775              be invariant.  It is safe to use the initial value stored in
2776              the splittable_regs array if it is set.  In rare cases, it won't
2777              be set, so then we do exactly the same thing as
2778              find_splittable_regs does to get a safe value.  */
2779           rtx biv_initial_value;
2780
2781           if (splittable_regs[bl->regno])
2782             biv_initial_value = splittable_regs[bl->regno];
2783           else if (GET_CODE (bl->initial_value) != REG
2784                    || (REGNO (bl->initial_value) != bl->regno
2785                        && REGNO (bl->initial_value) >= FIRST_PSEUDO_REGISTER))
2786             biv_initial_value = bl->initial_value;
2787           else
2788             {
2789               rtx tem = gen_reg_rtx (bl->biv->mode);
2790
2791               record_base_value (REGNO (tem), bl->biv->add_val, 0);
2792               loop_insn_hoist (loop, gen_move_insn (tem, bl->biv->src_reg));
2793               biv_initial_value = tem;
2794             }
2795           biv_initial_value = extend_value_for_giv (v, biv_initial_value);
2796           value = fold_rtx_mult_add (v->mult_val, biv_initial_value,
2797                                      v->add_val, v->mode);
2798         }
2799       else
2800         value = const0_rtx;
2801
2802       if (v->new_reg)
2803         {
2804           /* If a giv was combined with another giv, then we can only split
2805              this giv if the giv it was combined with was reduced.  This
2806              is because the value of v->new_reg is meaningless in this
2807              case.  */
2808           if (v->same && ! v->same->new_reg)
2809             {
2810               if (loop_dump_stream)
2811                 fprintf (loop_dump_stream,
2812                          "giv combined with unreduced giv not split.\n");
2813               continue;
2814             }
2815           /* If the giv is an address destination, it could be something other
2816              than a simple register, these have to be treated differently.  */
2817           else if (v->giv_type == DEST_REG)
2818             {
2819               /* If value is not a constant, register, or register plus
2820                  constant, then compute its value into a register before
2821                  loop start.  This prevents invalid rtx sharing, and should
2822                  generate better code.  We can use bl->initial_value here
2823                  instead of splittable_regs[bl->regno] because this code
2824                  is going before the loop start.  */
2825               if (unroll_type == UNROLL_COMPLETELY
2826                   && GET_CODE (value) != CONST_INT
2827                   && GET_CODE (value) != REG
2828                   && (GET_CODE (value) != PLUS
2829                       || GET_CODE (XEXP (value, 0)) != REG
2830                       || GET_CODE (XEXP (value, 1)) != CONST_INT))
2831                 {
2832                   rtx tem = gen_reg_rtx (v->mode);
2833                   record_base_value (REGNO (tem), v->add_val, 0);
2834                   loop_iv_add_mult_hoist (loop, bl->initial_value, v->mult_val,
2835                                           v->add_val, tem);
2836                   value = tem;
2837                 }
2838
2839               splittable_regs[reg_or_subregno (v->new_reg)] = value;
2840             }
2841           else
2842             continue;
2843         }
2844       else
2845         {
2846 #if 0
2847           /* Currently, unreduced giv's can't be split.  This is not too much
2848              of a problem since unreduced giv's are not live across loop
2849              iterations anyways.  When unrolling a loop completely though,
2850              it makes sense to reduce&split givs when possible, as this will
2851              result in simpler instructions, and will not require that a reg
2852              be live across loop iterations.  */
2853
2854           splittable_regs[REGNO (v->dest_reg)] = value;
2855           fprintf (stderr, "Giv %d at insn %d not reduced\n",
2856                    REGNO (v->dest_reg), INSN_UID (v->insn));
2857 #else
2858           continue;
2859 #endif
2860         }
2861
2862       /* Unreduced givs are only updated once by definition.  Reduced givs
2863          are updated as many times as their biv is.  Mark it so if this is
2864          a splittable register.  Don't need to do anything for address givs
2865          where this may not be a register.  */
2866
2867       if (GET_CODE (v->new_reg) == REG)
2868         {
2869           int count = 1;
2870           if (! v->ignore)
2871             count = REG_IV_CLASS (ivs, REGNO (v->src_reg))->biv_count;
2872
2873           splittable_regs_updates[reg_or_subregno (v->new_reg)] = count;
2874         }
2875
2876       result++;
2877
2878       if (loop_dump_stream)
2879         {
2880           int regnum;
2881
2882           if (GET_CODE (v->dest_reg) == CONST_INT)
2883             regnum = -1;
2884           else if (GET_CODE (v->dest_reg) != REG)
2885             regnum = REGNO (XEXP (v->dest_reg, 0));
2886           else
2887             regnum = REGNO (v->dest_reg);
2888           fprintf (loop_dump_stream, "Giv %d at insn %d safe to split.\n",
2889                    regnum, INSN_UID (v->insn));
2890         }
2891     }
2892
2893   return result;
2894 }
2895 \f
2896 /* Try to prove that the register is dead after the loop exits.  Trace every
2897    loop exit looking for an insn that will always be executed, which sets
2898    the register to some value, and appears before the first use of the register
2899    is found.  If successful, then return 1, otherwise return 0.  */
2900
2901 /* ?? Could be made more intelligent in the handling of jumps, so that
2902    it can search past if statements and other similar structures.  */
2903
2904 static int
2905 reg_dead_after_loop (loop, reg)
2906      const struct loop *loop;
2907      rtx reg;
2908 {
2909   rtx insn, label;
2910   enum rtx_code code;
2911   int jump_count = 0;
2912   int label_count = 0;
2913
2914   /* In addition to checking all exits of this loop, we must also check
2915      all exits of inner nested loops that would exit this loop.  We don't
2916      have any way to identify those, so we just give up if there are any
2917      such inner loop exits.  */
2918
2919   for (label = loop->exit_labels; label; label = LABEL_NEXTREF (label))
2920     label_count++;
2921
2922   if (label_count != loop->exit_count)
2923     return 0;
2924
2925   /* HACK: Must also search the loop fall through exit, create a label_ref
2926      here which points to the loop->end, and append the loop_number_exit_labels
2927      list to it.  */
2928   label = gen_rtx_LABEL_REF (VOIDmode, loop->end);
2929   LABEL_NEXTREF (label) = loop->exit_labels;
2930
2931   for (; label; label = LABEL_NEXTREF (label))
2932     {
2933       /* Succeed if find an insn which sets the biv or if reach end of
2934          function.  Fail if find an insn that uses the biv, or if come to
2935          a conditional jump.  */
2936
2937       insn = NEXT_INSN (XEXP (label, 0));
2938       while (insn)
2939         {
2940           code = GET_CODE (insn);
2941           if (GET_RTX_CLASS (code) == 'i')
2942             {
2943               rtx set;
2944
2945               if (reg_referenced_p (reg, PATTERN (insn)))
2946                 return 0;
2947
2948               set = single_set (insn);
2949               if (set && rtx_equal_p (SET_DEST (set), reg))
2950                 break;
2951             }
2952
2953           if (code == JUMP_INSN)
2954             {
2955               if (GET_CODE (PATTERN (insn)) == RETURN)
2956                 break;
2957               else if (!any_uncondjump_p (insn)
2958                        /* Prevent infinite loop following infinite loops.  */
2959                        || jump_count++ > 20)
2960                 return 0;
2961               else
2962                 insn = JUMP_LABEL (insn);
2963             }
2964
2965           insn = NEXT_INSN (insn);
2966         }
2967     }
2968
2969   /* Success, the register is dead on all loop exits.  */
2970   return 1;
2971 }
2972
2973 /* Try to calculate the final value of the biv, the value it will have at
2974    the end of the loop.  If we can do it, return that value.  */
2975
2976 rtx
2977 final_biv_value (loop, bl)
2978      const struct loop *loop;
2979      struct iv_class *bl;
2980 {
2981   unsigned HOST_WIDE_INT n_iterations = LOOP_INFO (loop)->n_iterations;
2982   rtx increment, tem;
2983
2984   /* ??? This only works for MODE_INT biv's.  Reject all others for now.  */
2985
2986   if (GET_MODE_CLASS (bl->biv->mode) != MODE_INT)
2987     return 0;
2988
2989   /* The final value for reversed bivs must be calculated differently than
2990      for ordinary bivs.  In this case, there is already an insn after the
2991      loop which sets this biv's final value (if necessary), and there are
2992      no other loop exits, so we can return any value.  */
2993   if (bl->reversed)
2994     {
2995       if (loop_dump_stream)
2996         fprintf (loop_dump_stream,
2997                  "Final biv value for %d, reversed biv.\n", bl->regno);
2998
2999       return const0_rtx;
3000     }
3001
3002   /* Try to calculate the final value as initial value + (number of iterations
3003      * increment).  For this to work, increment must be invariant, the only
3004      exit from the loop must be the fall through at the bottom (otherwise
3005      it may not have its final value when the loop exits), and the initial
3006      value of the biv must be invariant.  */
3007
3008   if (n_iterations != 0
3009       && ! loop->exit_count
3010       && loop_invariant_p (loop, bl->initial_value))
3011     {
3012       increment = biv_total_increment (bl);
3013
3014       if (increment && loop_invariant_p (loop, increment))
3015         {
3016           /* Can calculate the loop exit value, emit insns after loop
3017              end to calculate this value into a temporary register in
3018              case it is needed later.  */
3019
3020           tem = gen_reg_rtx (bl->biv->mode);
3021           record_base_value (REGNO (tem), bl->biv->add_val, 0);
3022           loop_iv_add_mult_sink (loop, increment, GEN_INT (n_iterations),
3023                                  bl->initial_value, tem);
3024
3025           if (loop_dump_stream)
3026             fprintf (loop_dump_stream,
3027                      "Final biv value for %d, calculated.\n", bl->regno);
3028
3029           return tem;
3030         }
3031     }
3032
3033   /* Check to see if the biv is dead at all loop exits.  */
3034   if (reg_dead_after_loop (loop, bl->biv->src_reg))
3035     {
3036       if (loop_dump_stream)
3037         fprintf (loop_dump_stream,
3038                  "Final biv value for %d, biv dead after loop exit.\n",
3039                  bl->regno);
3040
3041       return const0_rtx;
3042     }
3043
3044   return 0;
3045 }
3046
3047 /* Try to calculate the final value of the giv, the value it will have at
3048    the end of the loop.  If we can do it, return that value.  */
3049
3050 rtx
3051 final_giv_value (loop, v)
3052      const struct loop *loop;
3053      struct induction *v;
3054 {
3055   struct loop_ivs *ivs = LOOP_IVS (loop);
3056   struct iv_class *bl;
3057   rtx insn;
3058   rtx increment, tem;
3059   rtx seq;
3060   rtx loop_end = loop->end;
3061   unsigned HOST_WIDE_INT n_iterations = LOOP_INFO (loop)->n_iterations;
3062
3063   bl = REG_IV_CLASS (ivs, REGNO (v->src_reg));
3064
3065   /* The final value for givs which depend on reversed bivs must be calculated
3066      differently than for ordinary givs.  In this case, there is already an
3067      insn after the loop which sets this giv's final value (if necessary),
3068      and there are no other loop exits, so we can return any value.  */
3069   if (bl->reversed)
3070     {
3071       if (loop_dump_stream)
3072         fprintf (loop_dump_stream,
3073                  "Final giv value for %d, depends on reversed biv\n",
3074                  REGNO (v->dest_reg));
3075       return const0_rtx;
3076     }
3077
3078   /* Try to calculate the final value as a function of the biv it depends
3079      upon.  The only exit from the loop must be the fall through at the bottom
3080      and the insn that sets the giv must be executed on every iteration
3081      (otherwise the giv may not have its final value when the loop exits).  */
3082
3083   /* ??? Can calculate the final giv value by subtracting off the
3084      extra biv increments times the giv's mult_val.  The loop must have
3085      only one exit for this to work, but the loop iterations does not need
3086      to be known.  */
3087
3088   if (n_iterations != 0
3089       && ! loop->exit_count
3090       && v->always_executed)
3091     {
3092       /* ?? It is tempting to use the biv's value here since these insns will
3093          be put after the loop, and hence the biv will have its final value
3094          then.  However, this fails if the biv is subsequently eliminated.
3095          Perhaps determine whether biv's are eliminable before trying to
3096          determine whether giv's are replaceable so that we can use the
3097          biv value here if it is not eliminable.  */
3098
3099       /* We are emitting code after the end of the loop, so we must make
3100          sure that bl->initial_value is still valid then.  It will still
3101          be valid if it is invariant.  */
3102
3103       increment = biv_total_increment (bl);
3104
3105       if (increment && loop_invariant_p (loop, increment)
3106           && loop_invariant_p (loop, bl->initial_value))
3107         {
3108           /* Can calculate the loop exit value of its biv as
3109              (n_iterations * increment) + initial_value */
3110
3111           /* The loop exit value of the giv is then
3112              (final_biv_value - extra increments) * mult_val + add_val.
3113              The extra increments are any increments to the biv which
3114              occur in the loop after the giv's value is calculated.
3115              We must search from the insn that sets the giv to the end
3116              of the loop to calculate this value.  */
3117
3118           /* Put the final biv value in tem.  */
3119           tem = gen_reg_rtx (v->mode);
3120           record_base_value (REGNO (tem), bl->biv->add_val, 0);
3121           loop_iv_add_mult_sink (loop, extend_value_for_giv (v, increment),
3122                                  GEN_INT (n_iterations),
3123                                  extend_value_for_giv (v, bl->initial_value),
3124                                  tem);
3125
3126           /* Subtract off extra increments as we find them.  */
3127           for (insn = NEXT_INSN (v->insn); insn != loop_end;
3128                insn = NEXT_INSN (insn))
3129             {
3130               struct induction *biv;
3131
3132               for (biv = bl->biv; biv; biv = biv->next_iv)
3133                 if (biv->insn == insn)
3134                   {
3135                     start_sequence ();
3136                     tem = expand_simple_binop (GET_MODE (tem), MINUS, tem,
3137                                                biv->add_val, NULL_RTX, 0,
3138                                                OPTAB_LIB_WIDEN);
3139                     seq = get_insns ();
3140                     end_sequence ();
3141                     loop_insn_sink (loop, seq);
3142                   }
3143             }
3144
3145           /* Now calculate the giv's final value.  */
3146           loop_iv_add_mult_sink (loop, tem, v->mult_val, v->add_val, tem);
3147
3148           if (loop_dump_stream)
3149             fprintf (loop_dump_stream,
3150                      "Final giv value for %d, calc from biv's value.\n",
3151                      REGNO (v->dest_reg));
3152
3153           return tem;
3154         }
3155     }
3156
3157   /* Replaceable giv's should never reach here.  */
3158   if (v->replaceable)
3159     abort ();
3160
3161   /* Check to see if the biv is dead at all loop exits.  */
3162   if (reg_dead_after_loop (loop, v->dest_reg))
3163     {
3164       if (loop_dump_stream)
3165         fprintf (loop_dump_stream,
3166                  "Final giv value for %d, giv dead after loop exit.\n",
3167                  REGNO (v->dest_reg));
3168
3169       return const0_rtx;
3170     }
3171
3172   return 0;
3173 }
3174
3175 /* Look back before LOOP->START for the insn that sets REG and return
3176    the equivalent constant if there is a REG_EQUAL note otherwise just
3177    the SET_SRC of REG.  */
3178
3179 static rtx
3180 loop_find_equiv_value (loop, reg)
3181      const struct loop *loop;
3182      rtx reg;
3183 {
3184   rtx loop_start = loop->start;
3185   rtx insn, set;
3186   rtx ret;
3187
3188   ret = reg;
3189   for (insn = PREV_INSN (loop_start); insn; insn = PREV_INSN (insn))
3190     {
3191       if (GET_CODE (insn) == CODE_LABEL)
3192         break;
3193
3194       else if (INSN_P (insn) && reg_set_p (reg, insn))
3195         {
3196           /* We found the last insn before the loop that sets the register.
3197              If it sets the entire register, and has a REG_EQUAL note,
3198              then use the value of the REG_EQUAL note.  */
3199           if ((set = single_set (insn))
3200               && (SET_DEST (set) == reg))
3201             {
3202               rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
3203
3204               /* Only use the REG_EQUAL note if it is a constant.
3205                  Other things, divide in particular, will cause
3206                  problems later if we use them.  */
3207               if (note && GET_CODE (XEXP (note, 0)) != EXPR_LIST
3208                   && CONSTANT_P (XEXP (note, 0)))
3209                 ret = XEXP (note, 0);
3210               else
3211                 ret = SET_SRC (set);
3212
3213               /* We cannot do this if it changes between the
3214                  assignment and loop start though.  */
3215               if (modified_between_p (ret, insn, loop_start))
3216                 ret = reg;
3217             }
3218           break;
3219         }
3220     }
3221   return ret;
3222 }
3223
3224 /* Return a simplified rtx for the expression OP - REG.
3225
3226    REG must appear in OP, and OP must be a register or the sum of a register
3227    and a second term.
3228
3229    Thus, the return value must be const0_rtx or the second term.
3230
3231    The caller is responsible for verifying that REG appears in OP and OP has
3232    the proper form.  */
3233
3234 static rtx
3235 subtract_reg_term (op, reg)
3236      rtx op, reg;
3237 {
3238   if (op == reg)
3239     return const0_rtx;
3240   if (GET_CODE (op) == PLUS)
3241     {
3242       if (XEXP (op, 0) == reg)
3243         return XEXP (op, 1);
3244       else if (XEXP (op, 1) == reg)
3245         return XEXP (op, 0);
3246     }
3247   /* OP does not contain REG as a term.  */
3248   abort ();
3249 }
3250
3251 /* Find and return register term common to both expressions OP0 and
3252    OP1 or NULL_RTX if no such term exists.  Each expression must be a
3253    REG or a PLUS of a REG.  */
3254
3255 static rtx
3256 find_common_reg_term (op0, op1)
3257      rtx op0, op1;
3258 {
3259   if ((GET_CODE (op0) == REG || GET_CODE (op0) == PLUS)
3260       && (GET_CODE (op1) == REG || GET_CODE (op1) == PLUS))
3261     {
3262       rtx op00;
3263       rtx op01;
3264       rtx op10;
3265       rtx op11;
3266
3267       if (GET_CODE (op0) == PLUS)
3268         op01 = XEXP (op0, 1), op00 = XEXP (op0, 0);
3269       else
3270         op01 = const0_rtx, op00 = op0;
3271
3272       if (GET_CODE (op1) == PLUS)
3273         op11 = XEXP (op1, 1), op10 = XEXP (op1, 0);
3274       else
3275         op11 = const0_rtx, op10 = op1;
3276
3277       /* Find and return common register term if present.  */
3278       if (REG_P (op00) && (op00 == op10 || op00 == op11))
3279         return op00;
3280       else if (REG_P (op01) && (op01 == op10 || op01 == op11))
3281         return op01;
3282     }
3283
3284   /* No common register term found.  */
3285   return NULL_RTX;
3286 }
3287
3288 /* Determine the loop iterator and calculate the number of loop
3289    iterations.  Returns the exact number of loop iterations if it can
3290    be calculated, otherwise returns zero.  */
3291
3292 unsigned HOST_WIDE_INT
3293 loop_iterations (loop)
3294      struct loop *loop;
3295 {
3296   struct loop_info *loop_info = LOOP_INFO (loop);
3297   struct loop_ivs *ivs = LOOP_IVS (loop);
3298   rtx comparison, comparison_value;
3299   rtx iteration_var, initial_value, increment, final_value;
3300   enum rtx_code comparison_code;
3301   HOST_WIDE_INT inc;
3302   unsigned HOST_WIDE_INT abs_inc;
3303   unsigned HOST_WIDE_INT abs_diff;
3304   int off_by_one;
3305   int increment_dir;
3306   int unsigned_p, compare_dir, final_larger;
3307   rtx last_loop_insn;
3308   rtx reg_term;
3309   struct iv_class *bl;
3310
3311   loop_info->n_iterations = 0;
3312   loop_info->initial_value = 0;
3313   loop_info->initial_equiv_value = 0;
3314   loop_info->comparison_value = 0;
3315   loop_info->final_value = 0;
3316   loop_info->final_equiv_value = 0;
3317   loop_info->increment = 0;
3318   loop_info->iteration_var = 0;
3319   loop_info->unroll_number = 1;
3320   loop_info->iv = 0;
3321
3322   /* We used to use prev_nonnote_insn here, but that fails because it might
3323      accidentally get the branch for a contained loop if the branch for this
3324      loop was deleted.  We can only trust branches immediately before the
3325      loop_end.  */
3326   last_loop_insn = PREV_INSN (loop->end);
3327
3328   /* ??? We should probably try harder to find the jump insn
3329      at the end of the loop.  The following code assumes that
3330      the last loop insn is a jump to the top of the loop.  */
3331   if (GET_CODE (last_loop_insn) != JUMP_INSN)
3332     {
3333       if (loop_dump_stream)
3334         fprintf (loop_dump_stream,
3335                  "Loop iterations: No final conditional branch found.\n");
3336       return 0;
3337     }
3338
3339   /* If there is a more than a single jump to the top of the loop
3340      we cannot (easily) determine the iteration count.  */
3341   if (LABEL_NUSES (JUMP_LABEL (last_loop_insn)) > 1)
3342     {
3343       if (loop_dump_stream)
3344         fprintf (loop_dump_stream,
3345                  "Loop iterations: Loop has multiple back edges.\n");
3346       return 0;
3347     }
3348
3349   /* If there are multiple conditionalized loop exit tests, they may jump
3350      back to differing CODE_LABELs.  */
3351   if (loop->top && loop->cont)
3352     {
3353       rtx temp = PREV_INSN (last_loop_insn);
3354
3355       do
3356         {
3357           if (GET_CODE (temp) == JUMP_INSN)
3358             {
3359               /* There are some kinds of jumps we can't deal with easily.  */
3360               if (JUMP_LABEL (temp) == 0)
3361                 {
3362                   if (loop_dump_stream)
3363                     fprintf
3364                       (loop_dump_stream,
3365                        "Loop iterations: Jump insn has null JUMP_LABEL.\n");
3366                   return 0;
3367                 }
3368
3369               if (/* Previous unrolling may have generated new insns not
3370                      covered by the uid_luid array.  */
3371                   INSN_UID (JUMP_LABEL (temp)) < max_uid_for_loop
3372                   /* Check if we jump back into the loop body.  */
3373                   && INSN_LUID (JUMP_LABEL (temp)) > INSN_LUID (loop->top)
3374                   && INSN_LUID (JUMP_LABEL (temp)) < INSN_LUID (loop->cont))
3375                 {
3376                   if (loop_dump_stream)
3377                     fprintf
3378                       (loop_dump_stream,
3379                        "Loop iterations: Loop has multiple back edges.\n");
3380                   return 0;
3381                 }
3382             }
3383         }
3384       while ((temp = PREV_INSN (temp)) != loop->cont);
3385     }
3386
3387   /* Find the iteration variable.  If the last insn is a conditional
3388      branch, and the insn before tests a register value, make that the
3389      iteration variable.  */
3390
3391   comparison = get_condition_for_loop (loop, last_loop_insn);
3392   if (comparison == 0)
3393     {
3394       if (loop_dump_stream)
3395         fprintf (loop_dump_stream,
3396                  "Loop iterations: No final comparison found.\n");
3397       return 0;
3398     }
3399
3400   /* ??? Get_condition may switch position of induction variable and
3401      invariant register when it canonicalizes the comparison.  */
3402
3403   comparison_code = GET_CODE (comparison);
3404   iteration_var = XEXP (comparison, 0);
3405   comparison_value = XEXP (comparison, 1);
3406
3407   if (GET_CODE (iteration_var) != REG)
3408     {
3409       if (loop_dump_stream)
3410         fprintf (loop_dump_stream,
3411                  "Loop iterations: Comparison not against register.\n");
3412       return 0;
3413     }
3414
3415   /* The only new registers that are created before loop iterations
3416      are givs made from biv increments or registers created by
3417      load_mems.  In the latter case, it is possible that try_copy_prop
3418      will propagate a new pseudo into the old iteration register but
3419      this will be marked by having the REG_USERVAR_P bit set.  */
3420
3421   if ((unsigned) REGNO (iteration_var) >= ivs->n_regs
3422       && ! REG_USERVAR_P (iteration_var))
3423     abort ();
3424
3425   /* Determine the initial value of the iteration variable, and the amount
3426      that it is incremented each loop.  Use the tables constructed by
3427      the strength reduction pass to calculate these values.  */
3428
3429   /* Clear the result values, in case no answer can be found.  */
3430   initial_value = 0;
3431   increment = 0;
3432
3433   /* The iteration variable can be either a giv or a biv.  Check to see
3434      which it is, and compute the variable's initial value, and increment
3435      value if possible.  */
3436
3437   /* If this is a new register, can't handle it since we don't have any
3438      reg_iv_type entry for it.  */
3439   if ((unsigned) REGNO (iteration_var) >= ivs->n_regs)
3440     {
3441       if (loop_dump_stream)
3442         fprintf (loop_dump_stream,
3443                  "Loop iterations: No reg_iv_type entry for iteration var.\n");
3444       return 0;
3445     }
3446
3447   /* Reject iteration variables larger than the host wide int size, since they
3448      could result in a number of iterations greater than the range of our
3449      `unsigned HOST_WIDE_INT' variable loop_info->n_iterations.  */
3450   else if ((GET_MODE_BITSIZE (GET_MODE (iteration_var))
3451             > HOST_BITS_PER_WIDE_INT))
3452     {
3453       if (loop_dump_stream)
3454         fprintf (loop_dump_stream,
3455                  "Loop iterations: Iteration var rejected because mode too large.\n");
3456       return 0;
3457     }
3458   else if (GET_MODE_CLASS (GET_MODE (iteration_var)) != MODE_INT)
3459     {
3460       if (loop_dump_stream)
3461         fprintf (loop_dump_stream,
3462                  "Loop iterations: Iteration var not an integer.\n");
3463       return 0;
3464     }
3465   else if (REG_IV_TYPE (ivs, REGNO (iteration_var)) == BASIC_INDUCT)
3466     {
3467       if (REGNO (iteration_var) >= ivs->n_regs)
3468         abort ();
3469
3470       /* Grab initial value, only useful if it is a constant.  */
3471       bl = REG_IV_CLASS (ivs, REGNO (iteration_var));
3472       initial_value = bl->initial_value;
3473       if (!bl->biv->always_executed || bl->biv->maybe_multiple)
3474         {
3475           if (loop_dump_stream)
3476             fprintf (loop_dump_stream,
3477                      "Loop iterations: Basic induction var not set once in each iteration.\n");
3478           return 0;
3479         }
3480
3481       increment = biv_total_increment (bl);
3482     }
3483   else if (REG_IV_TYPE (ivs, REGNO (iteration_var)) == GENERAL_INDUCT)
3484     {
3485       HOST_WIDE_INT offset = 0;
3486       struct induction *v = REG_IV_INFO (ivs, REGNO (iteration_var));
3487       rtx biv_initial_value;
3488
3489       if (REGNO (v->src_reg) >= ivs->n_regs)
3490         abort ();
3491
3492       if (!v->always_executed || v->maybe_multiple)
3493         {
3494           if (loop_dump_stream)
3495             fprintf (loop_dump_stream,
3496                      "Loop iterations: General induction var not set once in each iteration.\n");
3497           return 0;
3498         }
3499
3500       bl = REG_IV_CLASS (ivs, REGNO (v->src_reg));
3501
3502       /* Increment value is mult_val times the increment value of the biv.  */
3503
3504       increment = biv_total_increment (bl);
3505       if (increment)
3506         {
3507           struct induction *biv_inc;
3508
3509           increment = fold_rtx_mult_add (v->mult_val,
3510                                          extend_value_for_giv (v, increment),
3511                                          const0_rtx, v->mode);
3512           /* The caller assumes that one full increment has occurred at the
3513              first loop test.  But that's not true when the biv is incremented
3514              after the giv is set (which is the usual case), e.g.:
3515              i = 6; do {;} while (i++ < 9) .
3516              Therefore, we bias the initial value by subtracting the amount of
3517              the increment that occurs between the giv set and the giv test.  */
3518           for (biv_inc = bl->biv; biv_inc; biv_inc = biv_inc->next_iv)
3519             {
3520               if (loop_insn_first_p (v->insn, biv_inc->insn))
3521                 {
3522                   if (REG_P (biv_inc->add_val))
3523                     {
3524                       if (loop_dump_stream)
3525                         fprintf (loop_dump_stream,
3526                                  "Loop iterations: Basic induction var add_val is REG %d.\n",
3527                                  REGNO (biv_inc->add_val));
3528                         return 0;
3529                     }
3530
3531                   offset -= INTVAL (biv_inc->add_val);
3532                 }
3533             }
3534         }
3535       if (loop_dump_stream)
3536         fprintf (loop_dump_stream,
3537                  "Loop iterations: Giv iterator, initial value bias %ld.\n",
3538                  (long) offset);
3539
3540       /* Initial value is mult_val times the biv's initial value plus
3541          add_val.  Only useful if it is a constant.  */
3542       biv_initial_value = extend_value_for_giv (v, bl->initial_value);
3543       initial_value
3544         = fold_rtx_mult_add (v->mult_val,
3545                              plus_constant (biv_initial_value, offset),
3546                              v->add_val, v->mode);
3547     }
3548   else
3549     {
3550       if (loop_dump_stream)
3551         fprintf (loop_dump_stream,
3552                  "Loop iterations: Not basic or general induction var.\n");
3553       return 0;
3554     }
3555
3556   if (initial_value == 0)
3557     return 0;
3558
3559   unsigned_p = 0;
3560   off_by_one = 0;
3561   switch (comparison_code)
3562     {
3563     case LEU:
3564       unsigned_p = 1;
3565     case LE:
3566       compare_dir = 1;
3567       off_by_one = 1;
3568       break;
3569     case GEU:
3570       unsigned_p = 1;
3571     case GE:
3572       compare_dir = -1;
3573       off_by_one = -1;
3574       break;
3575     case EQ:
3576       /* Cannot determine loop iterations with this case.  */
3577       compare_dir = 0;
3578       break;
3579     case LTU:
3580       unsigned_p = 1;
3581     case LT:
3582       compare_dir = 1;
3583       break;
3584     case GTU:
3585       unsigned_p = 1;
3586     case GT:
3587       compare_dir = -1;
3588     case NE:
3589       compare_dir = 0;
3590       break;
3591     default:
3592       abort ();
3593     }
3594
3595   /* If the comparison value is an invariant register, then try to find
3596      its value from the insns before the start of the loop.  */
3597
3598   final_value = comparison_value;
3599   if (GET_CODE (comparison_value) == REG
3600       && loop_invariant_p (loop, comparison_value))
3601     {
3602       final_value = loop_find_equiv_value (loop, comparison_value);
3603
3604       /* If we don't get an invariant final value, we are better
3605          off with the original register.  */
3606       if (! loop_invariant_p (loop, final_value))
3607         final_value = comparison_value;
3608     }
3609
3610   /* Calculate the approximate final value of the induction variable
3611      (on the last successful iteration).  The exact final value
3612      depends on the branch operator, and increment sign.  It will be
3613      wrong if the iteration variable is not incremented by one each
3614      time through the loop and (comparison_value + off_by_one -
3615      initial_value) % increment != 0.
3616      ??? Note that the final_value may overflow and thus final_larger
3617      will be bogus.  A potentially infinite loop will be classified
3618      as immediate, e.g. for (i = 0x7ffffff0; i <= 0x7fffffff; i++)  */
3619   if (off_by_one)
3620     final_value = plus_constant (final_value, off_by_one);
3621
3622   /* Save the calculated values describing this loop's bounds, in case
3623      precondition_loop_p will need them later.  These values can not be
3624      recalculated inside precondition_loop_p because strength reduction
3625      optimizations may obscure the loop's structure.
3626
3627      These values are only required by precondition_loop_p and insert_bct
3628      whenever the number of iterations cannot be computed at compile time.
3629      Only the difference between final_value and initial_value is
3630      important.  Note that final_value is only approximate.  */
3631   loop_info->initial_value = initial_value;
3632   loop_info->comparison_value = comparison_value;
3633   loop_info->final_value = plus_constant (comparison_value, off_by_one);
3634   loop_info->increment = increment;
3635   loop_info->iteration_var = iteration_var;
3636   loop_info->comparison_code = comparison_code;
3637   loop_info->iv = bl;
3638
3639   /* Try to determine the iteration count for loops such
3640      as (for i = init; i < init + const; i++).  When running the
3641      loop optimization twice, the first pass often converts simple
3642      loops into this form.  */
3643
3644   if (REG_P (initial_value))
3645     {
3646       rtx reg1;
3647       rtx reg2;
3648       rtx const2;
3649
3650       reg1 = initial_value;
3651       if (GET_CODE (final_value) == PLUS)
3652         reg2 = XEXP (final_value, 0), const2 = XEXP (final_value, 1);
3653       else
3654         reg2 = final_value, const2 = const0_rtx;
3655
3656       /* Check for initial_value = reg1, final_value = reg2 + const2,
3657          where reg1 != reg2.  */
3658       if (REG_P (reg2) && reg2 != reg1)
3659         {
3660           rtx temp;
3661
3662           /* Find what reg1 is equivalent to.  Hopefully it will
3663              either be reg2 or reg2 plus a constant.  */
3664           temp = loop_find_equiv_value (loop, reg1);
3665
3666           if (find_common_reg_term (temp, reg2))
3667             initial_value = temp;
3668           else
3669             {
3670               /* Find what reg2 is equivalent to.  Hopefully it will
3671                  either be reg1 or reg1 plus a constant.  Let's ignore
3672                  the latter case for now since it is not so common.  */
3673               temp = loop_find_equiv_value (loop, reg2);
3674
3675               if (temp == loop_info->iteration_var)
3676                 temp = initial_value;
3677               if (temp == reg1)
3678                 final_value = (const2 == const0_rtx)
3679                   ? reg1 : gen_rtx_PLUS (GET_MODE (reg1), reg1, const2);
3680             }
3681         }
3682       else if (loop->vtop && GET_CODE (reg2) == CONST_INT)
3683         {
3684           rtx temp;
3685
3686           /* When running the loop optimizer twice, check_dbra_loop
3687              further obfuscates reversible loops of the form:
3688              for (i = init; i < init + const; i++).  We often end up with
3689              final_value = 0, initial_value = temp, temp = temp2 - init,
3690              where temp2 = init + const.  If the loop has a vtop we
3691              can replace initial_value with const.  */
3692
3693           temp = loop_find_equiv_value (loop, reg1);
3694
3695           if (GET_CODE (temp) == MINUS && REG_P (XEXP (temp, 0)))
3696             {
3697               rtx temp2 = loop_find_equiv_value (loop, XEXP (temp, 0));
3698
3699               if (GET_CODE (temp2) == PLUS
3700                   && XEXP (temp2, 0) == XEXP (temp, 1))
3701                 initial_value = XEXP (temp2, 1);
3702             }
3703         }
3704     }
3705
3706   /* If have initial_value = reg + const1 and final_value = reg +
3707      const2, then replace initial_value with const1 and final_value
3708      with const2.  This should be safe since we are protected by the
3709      initial comparison before entering the loop if we have a vtop.
3710      For example, a + b < a + c is not equivalent to b < c for all a
3711      when using modulo arithmetic.
3712
3713      ??? Without a vtop we could still perform the optimization if we check
3714      the initial and final values carefully.  */
3715   if (loop->vtop
3716       && (reg_term = find_common_reg_term (initial_value, final_value)))
3717     {
3718       initial_value = subtract_reg_term (initial_value, reg_term);
3719       final_value = subtract_reg_term (final_value, reg_term);
3720     }
3721
3722   loop_info->initial_equiv_value = initial_value;
3723   loop_info->final_equiv_value = final_value;
3724
3725   /* For EQ comparison loops, we don't have a valid final value.
3726      Check this now so that we won't leave an invalid value if we
3727      return early for any other reason.  */
3728   if (comparison_code == EQ)
3729     loop_info->final_equiv_value = loop_info->final_value = 0;
3730
3731   if (increment == 0)
3732     {
3733       if (loop_dump_stream)
3734         fprintf (loop_dump_stream,
3735                  "Loop iterations: Increment value can't be calculated.\n");
3736       return 0;
3737     }
3738
3739   if (GET_CODE (increment) != CONST_INT)
3740     {
3741       /* If we have a REG, check to see if REG holds a constant value.  */
3742       /* ??? Other RTL, such as (neg (reg)) is possible here, but it isn't
3743          clear if it is worthwhile to try to handle such RTL.  */
3744       if (GET_CODE (increment) == REG || GET_CODE (increment) == SUBREG)
3745         increment = loop_find_equiv_value (loop, increment);
3746
3747       if (GET_CODE (increment) != CONST_INT)
3748         {
3749           if (loop_dump_stream)
3750             {
3751               fprintf (loop_dump_stream,
3752                        "Loop iterations: Increment value not constant ");
3753               print_simple_rtl (loop_dump_stream, increment);
3754               fprintf (loop_dump_stream, ".\n");
3755             }
3756           return 0;
3757         }
3758       loop_info->increment = increment;
3759     }
3760
3761   if (GET_CODE (initial_value) != CONST_INT)
3762     {
3763       if (loop_dump_stream)
3764         {
3765           fprintf (loop_dump_stream,
3766                    "Loop iterations: Initial value not constant ");
3767           print_simple_rtl (loop_dump_stream, initial_value);
3768           fprintf (loop_dump_stream, ".\n");
3769         }
3770       return 0;
3771     }
3772   else if (GET_CODE (final_value) != CONST_INT)
3773     {
3774       if (loop_dump_stream)
3775         {
3776           fprintf (loop_dump_stream,
3777                    "Loop iterations: Final value not constant ");
3778           print_simple_rtl (loop_dump_stream, final_value);
3779           fprintf (loop_dump_stream, ".\n");
3780         }
3781       return 0;
3782     }
3783   else if (comparison_code == EQ)
3784     {
3785       rtx inc_once;
3786
3787       if (loop_dump_stream)
3788         fprintf (loop_dump_stream, "Loop iterations: EQ comparison loop.\n");
3789
3790       inc_once = gen_int_mode (INTVAL (initial_value) + INTVAL (increment),
3791                                GET_MODE (iteration_var));
3792
3793       if (inc_once == final_value)
3794         {
3795           /* The iterator value once through the loop is equal to the
3796              comparison value.  Either we have an infinite loop, or
3797              we'll loop twice.  */
3798           if (increment == const0_rtx)
3799             return 0;
3800           loop_info->n_iterations = 2;
3801         }
3802       else
3803         loop_info->n_iterations = 1;
3804
3805       if (GET_CODE (loop_info->initial_value) == CONST_INT)
3806         loop_info->final_value
3807           = gen_int_mode ((INTVAL (loop_info->initial_value)
3808                            + loop_info->n_iterations * INTVAL (increment)),
3809                           GET_MODE (iteration_var));
3810       else
3811         loop_info->final_value
3812           = plus_constant (loop_info->initial_value,
3813                            loop_info->n_iterations * INTVAL (increment));
3814       loop_info->final_equiv_value
3815         = gen_int_mode ((INTVAL (initial_value)
3816                          + loop_info->n_iterations * INTVAL (increment)),
3817                         GET_MODE (iteration_var));
3818       return loop_info->n_iterations;
3819     }
3820
3821   /* Final_larger is 1 if final larger, 0 if they are equal, otherwise -1.  */
3822   if (unsigned_p)
3823     final_larger
3824       = ((unsigned HOST_WIDE_INT) INTVAL (final_value)
3825          > (unsigned HOST_WIDE_INT) INTVAL (initial_value))
3826         - ((unsigned HOST_WIDE_INT) INTVAL (final_value)
3827            < (unsigned HOST_WIDE_INT) INTVAL (initial_value));
3828   else
3829     final_larger = (INTVAL (final_value) > INTVAL (initial_value))
3830       - (INTVAL (final_value) < INTVAL (initial_value));
3831
3832   if (INTVAL (increment) > 0)
3833     increment_dir = 1;
3834   else if (INTVAL (increment) == 0)
3835     increment_dir = 0;
3836   else
3837     increment_dir = -1;
3838
3839   /* There are 27 different cases: compare_dir = -1, 0, 1;
3840      final_larger = -1, 0, 1; increment_dir = -1, 0, 1.
3841      There are 4 normal cases, 4 reverse cases (where the iteration variable
3842      will overflow before the loop exits), 4 infinite loop cases, and 15
3843      immediate exit (0 or 1 iteration depending on loop type) cases.
3844      Only try to optimize the normal cases.  */
3845
3846   /* (compare_dir/final_larger/increment_dir)
3847      Normal cases: (0/-1/-1), (0/1/1), (-1/-1/-1), (1/1/1)
3848      Reverse cases: (0/-1/1), (0/1/-1), (-1/-1/1), (1/1/-1)
3849      Infinite loops: (0/-1/0), (0/1/0), (-1/-1/0), (1/1/0)
3850      Immediate exit: (0/0/X), (-1/0/X), (-1/1/X), (1/0/X), (1/-1/X) */
3851
3852   /* ?? If the meaning of reverse loops (where the iteration variable
3853      will overflow before the loop exits) is undefined, then could
3854      eliminate all of these special checks, and just always assume
3855      the loops are normal/immediate/infinite.  Note that this means
3856      the sign of increment_dir does not have to be known.  Also,
3857      since it does not really hurt if immediate exit loops or infinite loops
3858      are optimized, then that case could be ignored also, and hence all
3859      loops can be optimized.
3860
3861      According to ANSI Spec, the reverse loop case result is undefined,
3862      because the action on overflow is undefined.
3863
3864      See also the special test for NE loops below.  */
3865
3866   if (final_larger == increment_dir && final_larger != 0
3867       && (final_larger == compare_dir || compare_dir == 0))
3868     /* Normal case.  */
3869     ;
3870   else
3871     {
3872       if (loop_dump_stream)
3873         fprintf (loop_dump_stream, "Loop iterations: Not normal loop.\n");
3874       return 0;
3875     }
3876
3877   /* Calculate the number of iterations, final_value is only an approximation,
3878      so correct for that.  Note that abs_diff and n_iterations are
3879      unsigned, because they can be as large as 2^n - 1.  */
3880
3881   inc = INTVAL (increment);
3882   if (inc > 0)
3883     {
3884       abs_diff = INTVAL (final_value) - INTVAL (initial_value);
3885       abs_inc = inc;
3886     }
3887   else if (inc < 0)
3888     {
3889       abs_diff = INTVAL (initial_value) - INTVAL (final_value);
3890       abs_inc = -inc;
3891     }
3892   else
3893     abort ();
3894
3895   /* Given that iteration_var is going to iterate over its own mode,
3896      not HOST_WIDE_INT, disregard higher bits that might have come
3897      into the picture due to sign extension of initial and final
3898      values.  */
3899   abs_diff &= ((unsigned HOST_WIDE_INT) 1
3900                << (GET_MODE_BITSIZE (GET_MODE (iteration_var)) - 1)
3901                << 1) - 1;
3902
3903   /* For NE tests, make sure that the iteration variable won't miss
3904      the final value.  If abs_diff mod abs_incr is not zero, then the
3905      iteration variable will overflow before the loop exits, and we
3906      can not calculate the number of iterations.  */
3907   if (compare_dir == 0 && (abs_diff % abs_inc) != 0)
3908     return 0;
3909
3910   /* Note that the number of iterations could be calculated using
3911      (abs_diff + abs_inc - 1) / abs_inc, provided care was taken to
3912      handle potential overflow of the summation.  */
3913   loop_info->n_iterations = abs_diff / abs_inc + ((abs_diff % abs_inc) != 0);
3914   return loop_info->n_iterations;
3915 }
3916
3917 /* Replace uses of split bivs with their split pseudo register.  This is
3918    for original instructions which remain after loop unrolling without
3919    copying.  */
3920
3921 static rtx
3922 remap_split_bivs (loop, x)
3923      struct loop *loop;
3924      rtx x;
3925 {
3926   struct loop_ivs *ivs = LOOP_IVS (loop);
3927   enum rtx_code code;
3928   int i;
3929   const char *fmt;
3930
3931   if (x == 0)
3932     return x;
3933
3934   code = GET_CODE (x);
3935   switch (code)
3936     {
3937     case SCRATCH:
3938     case PC:
3939     case CC0:
3940     case CONST_INT:
3941     case CONST_DOUBLE:
3942     case CONST:
3943     case SYMBOL_REF:
3944     case LABEL_REF:
3945       return x;
3946
3947     case REG:
3948 #if 0
3949       /* If non-reduced/final-value givs were split, then this would also
3950          have to remap those givs also.  */
3951 #endif
3952       if (REGNO (x) < ivs->n_regs
3953           && REG_IV_TYPE (ivs, REGNO (x)) == BASIC_INDUCT)
3954         return REG_IV_CLASS (ivs, REGNO (x))->biv->src_reg;
3955       break;
3956
3957     default:
3958       break;
3959     }
3960
3961   fmt = GET_RTX_FORMAT (code);
3962   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3963     {
3964       if (fmt[i] == 'e')
3965         XEXP (x, i) = remap_split_bivs (loop, XEXP (x, i));
3966       else if (fmt[i] == 'E')
3967         {
3968           int j;
3969           for (j = 0; j < XVECLEN (x, i); j++)
3970             XVECEXP (x, i, j) = remap_split_bivs (loop, XVECEXP (x, i, j));
3971         }
3972     }
3973   return x;
3974 }
3975
3976 /* If FIRST_UID is a set of REGNO, and FIRST_UID dominates LAST_UID (e.g.
3977    FIST_UID is always executed if LAST_UID is), then return 1.  Otherwise
3978    return 0.  COPY_START is where we can start looking for the insns
3979    FIRST_UID and LAST_UID.  COPY_END is where we stop looking for these
3980    insns.
3981
3982    If there is no JUMP_INSN between LOOP_START and FIRST_UID, then FIRST_UID
3983    must dominate LAST_UID.
3984
3985    If there is a CODE_LABEL between FIRST_UID and LAST_UID, then FIRST_UID
3986    may not dominate LAST_UID.
3987
3988    If there is no CODE_LABEL between FIRST_UID and LAST_UID, then FIRST_UID
3989    must dominate LAST_UID.  */
3990
3991 int
3992 set_dominates_use (regno, first_uid, last_uid, copy_start, copy_end)
3993      int regno;
3994      int first_uid;
3995      int last_uid;
3996      rtx copy_start;
3997      rtx copy_end;
3998 {
3999   int passed_jump = 0;
4000   rtx p = NEXT_INSN (copy_start);
4001
4002   while (INSN_UID (p) != first_uid)
4003     {
4004       if (GET_CODE (p) == JUMP_INSN)
4005         passed_jump = 1;
4006       /* Could not find FIRST_UID.  */
4007       if (p == copy_end)
4008         return 0;
4009       p = NEXT_INSN (p);
4010     }
4011
4012   /* Verify that FIRST_UID is an insn that entirely sets REGNO.  */
4013   if (! INSN_P (p) || ! dead_or_set_regno_p (p, regno))
4014     return 0;
4015
4016   /* FIRST_UID is always executed.  */
4017   if (passed_jump == 0)
4018     return 1;
4019
4020   while (INSN_UID (p) != last_uid)
4021     {
4022       /* If we see a CODE_LABEL between FIRST_UID and LAST_UID, then we
4023          can not be sure that FIRST_UID dominates LAST_UID.  */
4024       if (GET_CODE (p) == CODE_LABEL)
4025         return 0;
4026       /* Could not find LAST_UID, but we reached the end of the loop, so
4027          it must be safe.  */
4028       else if (p == copy_end)
4029         return 1;
4030       p = NEXT_INSN (p);
4031     }
4032
4033   /* FIRST_UID is always executed if LAST_UID is executed.  */
4034   return 1;
4035 }
4036
4037 /* This routine is called when the number of iterations for the unrolled
4038    loop is one.   The goal is to identify a loop that begins with an
4039    unconditional branch to the loop continuation note (or a label just after).
4040    In this case, the unconditional branch that starts the loop needs to be
4041    deleted so that we execute the single iteration.  */
4042
4043 static rtx
4044 ujump_to_loop_cont (loop_start, loop_cont)
4045      rtx loop_start;
4046      rtx loop_cont;
4047 {
4048   rtx x, label, label_ref;
4049
4050   /* See if loop start, or the next insn is an unconditional jump.  */
4051   loop_start = next_nonnote_insn (loop_start);
4052
4053   x = pc_set (loop_start);
4054   if (!x)
4055     return NULL_RTX;
4056
4057   label_ref = SET_SRC (x);
4058   if (!label_ref)
4059     return NULL_RTX;
4060
4061   /* Examine insn after loop continuation note.  Return if not a label.  */
4062   label = next_nonnote_insn (loop_cont);
4063   if (label == 0 || GET_CODE (label) != CODE_LABEL)
4064     return NULL_RTX;
4065
4066   /* Return the loop start if the branch label matches the code label.  */
4067   if (CODE_LABEL_NUMBER (label) == CODE_LABEL_NUMBER (XEXP (label_ref, 0)))
4068     return loop_start;
4069   else
4070     return NULL_RTX;
4071 }