OSDN Git Service

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