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