OSDN Git Service

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