|
|
1.1.1.8 root 1: /* Perform various loop optimizations, including strength reduction.
2: Copyright (C) 1987, 88, 89, 91-4, 1995 Free Software Foundation, Inc.
1.1 root 3:
4: This file is part of GNU CC.
5:
6: GNU CC is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 2, or (at your option)
9: any later version.
10:
11: GNU CC is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with GNU CC; see the file COPYING. If not, write to
1.1.1.8 root 18: the Free Software Foundation, 59 Temple Place - Suite 330,
19: Boston, MA 02111-1307, USA. */
1.1 root 20:
21:
22: /* This is the loop optimization pass of the compiler.
23: It finds invariant computations within loops and moves them
24: to the beginning of the loop. Then it identifies basic and
25: general induction variables. Strength reduction is applied to the general
26: induction variables, and induction variable elimination is applied to
27: the basic induction variables.
28:
29: It also finds cases where
30: a register is set within the loop by zero-extending a narrower value
31: and changes these to zero the entire register once before the loop
32: and merely copy the low part within the loop.
33:
34: Most of the complexity is in heuristics to decide when it is worth
35: while to do these things. */
36:
1.1.1.4 root 37: #include <stdio.h>
1.1 root 38: #include "config.h"
39: #include "rtl.h"
40: #include "obstack.h"
41: #include "expr.h"
42: #include "insn-config.h"
43: #include "insn-flags.h"
44: #include "regs.h"
45: #include "hard-reg-set.h"
46: #include "recog.h"
47: #include "flags.h"
48: #include "real.h"
49: #include "loop.h"
50:
51: /* Vector mapping INSN_UIDs to luids.
1.1.1.2 root 52: The luids are like uids but increase monotonically always.
1.1 root 53: We use them to see whether a jump comes from outside a given loop. */
54:
55: int *uid_luid;
56:
57: /* Indexed by INSN_UID, contains the ordinal giving the (innermost) loop
58: number the insn is contained in. */
59:
60: int *uid_loop_num;
61:
62: /* 1 + largest uid of any insn. */
63:
64: int max_uid_for_loop;
65:
66: /* 1 + luid of last insn. */
67:
68: static int max_luid;
69:
70: /* Number of loops detected in current function. Used as index to the
71: next few tables. */
72:
73: static int max_loop_num;
74:
75: /* Indexed by loop number, contains the first and last insn of each loop. */
76:
77: static rtx *loop_number_loop_starts, *loop_number_loop_ends;
78:
79: /* For each loop, gives the containing loop number, -1 if none. */
80:
81: int *loop_outer_loop;
82:
83: /* Indexed by loop number, contains a nonzero value if the "loop" isn't
84: really a loop (an insn outside the loop branches into it). */
85:
86: static char *loop_invalid;
87:
88: /* Indexed by loop number, links together all LABEL_REFs which refer to
89: code labels outside the loop. Used by routines that need to know all
90: loop exits, such as final_biv_value and final_giv_value.
91:
92: This does not include loop exits due to return instructions. This is
93: because all bivs and givs are pseudos, and hence must be dead after a
94: return, so the presense of a return does not affect any of the
95: optimizations that use this info. It is simpler to just not include return
96: instructions on this list. */
97:
98: rtx *loop_number_exit_labels;
99:
1.1.1.8 root 100: /* Indexed by loop number, counts the number of LABEL_REFs on
101: loop_number_exit_labels for this loop and all loops nested inside it. */
102:
103: int *loop_number_exit_count;
104:
1.1 root 105: /* Holds the number of loop iterations. It is zero if the number could not be
1.1.1.4 root 106: calculated. Must be unsigned since the number of iterations can
107: be as high as 2^wordsize-1. For loops with a wider iterator, this number
108: will will be zero if the number of loop iterations is too large for an
109: unsigned integer to hold. */
1.1 root 110:
1.1.1.4 root 111: unsigned HOST_WIDE_INT loop_n_iterations;
1.1 root 112:
113: /* Nonzero if there is a subroutine call in the current loop.
114: (unknown_address_altered is also nonzero in this case.) */
115:
116: static int loop_has_call;
117:
1.1.1.3 root 118: /* Nonzero if there is a volatile memory reference in the current
119: loop. */
120:
121: static int loop_has_volatile;
122:
1.1 root 123: /* Added loop_continue which is the NOTE_INSN_LOOP_CONT of the
124: current loop. A continue statement will generate a branch to
125: NEXT_INSN (loop_continue). */
126:
127: static rtx loop_continue;
128:
129: /* Indexed by register number, contains the number of times the reg
130: is set during the loop being scanned.
131: During code motion, a negative value indicates a reg that has been
132: made a candidate; in particular -2 means that it is an candidate that
1.1.1.3 root 133: we know is equal to a constant and -1 means that it is an candidate
1.1 root 134: not known equal to a constant.
135: After code motion, regs moved have 0 (which is accurate now)
136: while the failed candidates have the original number of times set.
137:
138: Therefore, at all times, == 0 indicates an invariant register;
139: < 0 a conditionally invariant one. */
140:
141: static short *n_times_set;
142:
143: /* Original value of n_times_set; same except that this value
144: is not set negative for a reg whose sets have been made candidates
145: and not set to 0 for a reg that is moved. */
146:
147: static short *n_times_used;
148:
149: /* Index by register number, 1 indicates that the register
150: cannot be moved or strength reduced. */
151:
152: static char *may_not_optimize;
153:
154: /* Nonzero means reg N has already been moved out of one loop.
155: This reduces the desire to move it out of another. */
156:
157: static char *moved_once;
158:
159: /* Array of MEMs that are stored in this loop. If there are too many to fit
160: here, we just turn on unknown_address_altered. */
161:
162: #define NUM_STORES 20
163: static rtx loop_store_mems[NUM_STORES];
164:
165: /* Index of first available slot in above array. */
166: static int loop_store_mems_idx;
167:
168: /* Nonzero if we don't know what MEMs were changed in the current loop.
1.1.1.3 root 169: This happens if the loop contains a call (in which case `loop_has_call'
1.1 root 170: will also be set) or if we store into more than NUM_STORES MEMs. */
171:
172: static int unknown_address_altered;
173:
174: /* Count of movable (i.e. invariant) instructions discovered in the loop. */
175: static int num_movables;
176:
177: /* Count of memory write instructions discovered in the loop. */
178: static int num_mem_sets;
179:
180: /* Number of loops contained within the current one, including itself. */
181: static int loops_enclosed;
182:
183: /* Bound on pseudo register number before loop optimization.
184: A pseudo has valid regscan info if its number is < max_reg_before_loop. */
185: int max_reg_before_loop;
186:
187: /* This obstack is used in product_cheap_p to allocate its rtl. It
188: may call gen_reg_rtx which, in turn, may reallocate regno_reg_rtx.
189: If we used the same obstack that it did, we would be deallocating
190: that array. */
191:
192: static struct obstack temp_obstack;
193:
194: /* This is where the pointer to the obstack being used for RTL is stored. */
195:
196: extern struct obstack *rtl_obstack;
197:
198: #define obstack_chunk_alloc xmalloc
199: #define obstack_chunk_free free
200:
201: extern char *oballoc ();
202:
203: /* During the analysis of a loop, a chain of `struct movable's
204: is made to record all the movable insns found.
205: Then the entire chain can be scanned to decide which to move. */
206:
207: struct movable
208: {
209: rtx insn; /* A movable insn */
210: rtx set_src; /* The expression this reg is set from. */
211: rtx set_dest; /* The destination of this SET. */
212: rtx dependencies; /* When INSN is libcall, this is an EXPR_LIST
213: of any registers used within the LIBCALL. */
214: int consec; /* Number of consecutive following insns
215: that must be moved with this one. */
216: int regno; /* The register it sets */
217: short lifetime; /* lifetime of that register;
218: may be adjusted when matching movables
219: that load the same value are found. */
220: short savings; /* Number of insns we can move for this reg,
221: including other movables that force this
222: or match this one. */
223: unsigned int cond : 1; /* 1 if only conditionally movable */
224: unsigned int force : 1; /* 1 means MUST move this insn */
225: unsigned int global : 1; /* 1 means reg is live outside this loop */
226: /* If PARTIAL is 1, GLOBAL means something different:
227: that the reg is live outside the range from where it is set
228: to the following label. */
229: unsigned int done : 1; /* 1 inhibits further processing of this */
230:
231: unsigned int partial : 1; /* 1 means this reg is used for zero-extending.
232: In particular, moving it does not make it
233: invariant. */
234: unsigned int move_insn : 1; /* 1 means that we call emit_move_insn to
235: load SRC, rather than copying INSN. */
236: unsigned int is_equiv : 1; /* 1 means a REG_EQUIV is present on INSN. */
237: enum machine_mode savemode; /* Nonzero means it is a mode for a low part
238: that we should avoid changing when clearing
239: the rest of the reg. */
240: struct movable *match; /* First entry for same value */
241: struct movable *forces; /* An insn that must be moved if this is */
242: struct movable *next;
243: };
244:
245: FILE *loop_dump_stream;
246:
247: /* Forward declarations. */
248:
249: static void find_and_verify_loops ();
250: static void mark_loop_jump ();
251: static void prescan_loop ();
252: static int reg_in_basic_block_p ();
253: static int consec_sets_invariant_p ();
254: static rtx libcall_other_reg ();
255: static int labels_in_range_p ();
256: static void count_loop_regs_set ();
257: static void note_addr_stored ();
258: static int loop_reg_used_before_p ();
259: static void scan_loop ();
260: static void replace_call_address ();
261: static rtx skip_consec_insns ();
262: static int libcall_benefit ();
263: static void ignore_some_movables ();
264: static void force_movables ();
265: static void combine_movables ();
266: static int rtx_equal_for_loop_p ();
267: static void move_movables ();
268: static void strength_reduce ();
269: static int valid_initial_value_p ();
270: static void find_mem_givs ();
271: static void record_biv ();
272: static void check_final_value ();
273: static void record_giv ();
274: static void update_giv_derive ();
275: static int basic_induction_var ();
276: static rtx simplify_giv_expr ();
277: static int general_induction_var ();
278: static int consec_sets_giv ();
279: static int check_dbra_loop ();
280: static rtx express_from ();
281: static int combine_givs_p ();
282: static void combine_givs ();
283: static int product_cheap_p ();
284: static int maybe_eliminate_biv ();
285: static int maybe_eliminate_biv_1 ();
286: static int last_use_this_basic_block ();
287: static void record_initial ();
288: static void update_reg_last_use ();
289:
290: /* Relative gain of eliminating various kinds of operations. */
291: int add_cost;
292: #if 0
293: int shift_cost;
294: int mult_cost;
295: #endif
296:
297: /* Benefit penalty, if a giv is not replaceable, i.e. must emit an insn to
298: copy the value of the strength reduced giv to its original register. */
299: int copy_cost;
300:
301: void
302: init_loop ()
303: {
304: char *free_point = (char *) oballoc (1);
1.1.1.4 root 305: rtx reg = gen_rtx (REG, word_mode, 0);
1.1 root 306:
1.1.1.4 root 307: add_cost = rtx_cost (gen_rtx (PLUS, word_mode, reg, reg), SET);
1.1 root 308:
309: /* We multiply by 2 to reconcile the difference in scale between
310: these two ways of computing costs. Otherwise the cost of a copy
311: will be far less than the cost of an add. */
1.1.1.4 root 312:
1.1 root 313: copy_cost = 2 * 2;
314:
315: /* Free the objects we just allocated. */
316: obfree (free_point);
317:
318: /* Initialize the obstack used for rtl in product_cheap_p. */
319: gcc_obstack_init (&temp_obstack);
320: }
321:
322: /* Entry point of this file. Perform loop optimization
323: on the current function. F is the first insn of the function
324: and DUMPFILE is a stream for output of a trace of actions taken
325: (or 0 if none should be output). */
326:
327: void
328: loop_optimize (f, dumpfile)
329: /* f is the first instruction of a chain of insns for one function */
330: rtx f;
331: FILE *dumpfile;
332: {
333: register rtx insn;
334: register int i;
335: rtx last_insn;
336:
337: loop_dump_stream = dumpfile;
338:
339: init_recog_no_volatile ();
340: init_alias_analysis ();
341:
342: max_reg_before_loop = max_reg_num ();
343:
344: moved_once = (char *) alloca (max_reg_before_loop);
345: bzero (moved_once, max_reg_before_loop);
346:
347: regs_may_share = 0;
348:
349: /* Count the number of loops. */
350:
351: max_loop_num = 0;
352: for (insn = f; insn; insn = NEXT_INSN (insn))
353: {
354: if (GET_CODE (insn) == NOTE
355: && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
356: max_loop_num++;
357: }
358:
359: /* Don't waste time if no loops. */
360: if (max_loop_num == 0)
361: return;
362:
363: /* Get size to use for tables indexed by uids.
364: Leave some space for labels allocated by find_and_verify_loops. */
1.1.1.4 root 365: max_uid_for_loop = get_max_uid () + 1 + max_loop_num * 32;
1.1 root 366:
367: uid_luid = (int *) alloca (max_uid_for_loop * sizeof (int));
368: uid_loop_num = (int *) alloca (max_uid_for_loop * sizeof (int));
369:
1.1.1.7 root 370: bzero ((char *) uid_luid, max_uid_for_loop * sizeof (int));
371: bzero ((char *) uid_loop_num, max_uid_for_loop * sizeof (int));
1.1 root 372:
373: /* Allocate tables for recording each loop. We set each entry, so they need
374: not be zeroed. */
375: loop_number_loop_starts = (rtx *) alloca (max_loop_num * sizeof (rtx));
376: loop_number_loop_ends = (rtx *) alloca (max_loop_num * sizeof (rtx));
377: loop_outer_loop = (int *) alloca (max_loop_num * sizeof (int));
378: loop_invalid = (char *) alloca (max_loop_num * sizeof (char));
379: loop_number_exit_labels = (rtx *) alloca (max_loop_num * sizeof (rtx));
1.1.1.8 root 380: loop_number_exit_count = (int *) alloca (max_loop_num * sizeof (int));
1.1 root 381:
382: /* Find and process each loop.
383: First, find them, and record them in order of their beginnings. */
384: find_and_verify_loops (f);
385:
386: /* Now find all register lifetimes. This must be done after
387: find_and_verify_loops, because it might reorder the insns in the
388: function. */
389: reg_scan (f, max_reg_num (), 1);
390:
1.1.1.4 root 391: /* See if we went too far. */
392: if (get_max_uid () > max_uid_for_loop)
393: abort ();
394:
1.1 root 395: /* Compute the mapping from uids to luids.
396: LUIDs are numbers assigned to insns, like uids,
397: except that luids increase monotonically through the code.
398: Don't assign luids to line-number NOTEs, so that the distance in luids
399: between two insns is not affected by -g. */
400:
401: for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
402: {
403: last_insn = insn;
404: if (GET_CODE (insn) != NOTE
405: || NOTE_LINE_NUMBER (insn) <= 0)
406: uid_luid[INSN_UID (insn)] = ++i;
407: else
408: /* Give a line number note the same luid as preceding insn. */
409: uid_luid[INSN_UID (insn)] = i;
410: }
411:
412: max_luid = i + 1;
413:
414: /* Don't leave gaps in uid_luid for insns that have been
415: deleted. It is possible that the first or last insn
416: using some register has been deleted by cross-jumping.
417: Make sure that uid_luid for that former insn's uid
418: points to the general area where that insn used to be. */
419: for (i = 0; i < max_uid_for_loop; i++)
420: {
421: uid_luid[0] = uid_luid[i];
422: if (uid_luid[0] != 0)
423: break;
424: }
425: for (i = 0; i < max_uid_for_loop; i++)
426: if (uid_luid[i] == 0)
427: uid_luid[i] = uid_luid[i - 1];
428:
429: /* Create a mapping from loops to BLOCK tree nodes. */
430: if (flag_unroll_loops && write_symbols != NO_DEBUG)
1.1.1.4 root 431: find_loop_tree_blocks ();
1.1 root 432:
433: /* Now scan the loops, last ones first, since this means inner ones are done
434: before outer ones. */
435: for (i = max_loop_num-1; i >= 0; i--)
436: if (! loop_invalid[i] && loop_number_loop_ends[i])
437: scan_loop (loop_number_loop_starts[i], loop_number_loop_ends[i],
438: max_reg_num ());
1.1.1.4 root 439:
440: /* If debugging and unrolling loops, we must replicate the tree nodes
441: corresponding to the blocks inside the loop, so that the original one
442: to one mapping will remain. */
443: if (flag_unroll_loops && write_symbols != NO_DEBUG)
444: unroll_block_trees ();
1.1 root 445: }
446:
447: /* Optimize one loop whose start is LOOP_START and end is END.
448: LOOP_START is the NOTE_INSN_LOOP_BEG and END is the matching
449: NOTE_INSN_LOOP_END. */
450:
451: /* ??? Could also move memory writes out of loops if the destination address
452: is invariant, the source is invariant, the memory write is not volatile,
453: and if we can prove that no read inside the loop can read this address
454: before the write occurs. If there is a read of this address after the
455: write, then we can also mark the memory read as invariant. */
456:
457: static void
458: scan_loop (loop_start, end, nregs)
459: rtx loop_start, end;
460: int nregs;
461: {
462: register int i;
463: register rtx p;
464: /* 1 if we are scanning insns that could be executed zero times. */
465: int maybe_never = 0;
466: /* 1 if we are scanning insns that might never be executed
467: due to a subroutine call which might exit before they are reached. */
468: int call_passed = 0;
469: /* For a rotated loop that is entered near the bottom,
470: this is the label at the top. Otherwise it is zero. */
471: rtx loop_top = 0;
472: /* Jump insn that enters the loop, or 0 if control drops in. */
473: rtx loop_entry_jump = 0;
474: /* Place in the loop where control enters. */
475: rtx scan_start;
476: /* Number of insns in the loop. */
477: int insn_count;
478: int in_libcall = 0;
479: int tem;
480: rtx temp;
481: /* The SET from an insn, if it is the only SET in the insn. */
482: rtx set, set1;
483: /* Chain describing insns movable in current loop. */
484: struct movable *movables = 0;
485: /* Last element in `movables' -- so we can add elements at the end. */
486: struct movable *last_movable = 0;
487: /* Ratio of extra register life span we can justify
488: for saving an instruction. More if loop doesn't call subroutines
489: since in that case saving an insn makes more difference
490: and more registers are available. */
491: int threshold;
492: /* If we have calls, contains the insn in which a register was used
493: if it was used exactly once; contains const0_rtx if it was used more
494: than once. */
495: rtx *reg_single_usage = 0;
1.1.1.7 root 496: /* Nonzero if we are scanning instructions in a sub-loop. */
497: int loop_depth = 0;
1.1 root 498:
499: n_times_set = (short *) alloca (nregs * sizeof (short));
500: n_times_used = (short *) alloca (nregs * sizeof (short));
501: may_not_optimize = (char *) alloca (nregs);
502:
503: /* Determine whether this loop starts with a jump down to a test at
504: the end. This will occur for a small number of loops with a test
505: that is too complex to duplicate in front of the loop.
506:
507: We search for the first insn or label in the loop, skipping NOTEs.
508: However, we must be careful not to skip past a NOTE_INSN_LOOP_BEG
509: (because we might have a loop executed only once that contains a
510: loop which starts with a jump to its exit test) or a NOTE_INSN_LOOP_END
511: (in case we have a degenerate loop).
512:
513: Note that if we mistakenly think that a loop is entered at the top
514: when, in fact, it is entered at the exit test, the only effect will be
515: slightly poorer optimization. Making the opposite error can generate
516: incorrect code. Since very few loops now start with a jump to the
517: exit test, the code here to detect that case is very conservative. */
518:
519: for (p = NEXT_INSN (loop_start);
520: p != end
521: && GET_CODE (p) != CODE_LABEL && GET_RTX_CLASS (GET_CODE (p)) != 'i'
522: && (GET_CODE (p) != NOTE
523: || (NOTE_LINE_NUMBER (p) != NOTE_INSN_LOOP_BEG
524: && NOTE_LINE_NUMBER (p) != NOTE_INSN_LOOP_END));
525: p = NEXT_INSN (p))
526: ;
527:
528: scan_start = p;
529:
530: /* Set up variables describing this loop. */
531: prescan_loop (loop_start, end);
532: threshold = (loop_has_call ? 1 : 2) * (1 + n_non_fixed_regs);
533:
534: /* If loop has a jump before the first label,
535: the true entry is the target of that jump.
536: Start scan from there.
537: But record in LOOP_TOP the place where the end-test jumps
538: back to so we can scan that after the end of the loop. */
539: if (GET_CODE (p) == JUMP_INSN)
540: {
541: loop_entry_jump = p;
542:
543: /* Loop entry must be unconditional jump (and not a RETURN) */
544: if (simplejump_p (p)
545: && JUMP_LABEL (p) != 0
546: /* Check to see whether the jump actually
547: jumps out of the loop (meaning it's no loop).
548: This case can happen for things like
549: do {..} while (0). If this label was generated previously
550: by loop, we can't tell anything about it and have to reject
551: the loop. */
552: && INSN_UID (JUMP_LABEL (p)) < max_uid_for_loop
553: && INSN_LUID (JUMP_LABEL (p)) >= INSN_LUID (loop_start)
554: && INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (end))
555: {
556: loop_top = next_label (scan_start);
557: scan_start = JUMP_LABEL (p);
558: }
559: }
560:
561: /* If SCAN_START was an insn created by loop, we don't know its luid
562: as required by loop_reg_used_before_p. So skip such loops. (This
563: test may never be true, but it's best to play it safe.)
564:
565: Also, skip loops where we do not start scanning at a label. This
566: test also rejects loops starting with a JUMP_INSN that failed the
567: test above. */
568:
569: if (INSN_UID (scan_start) >= max_uid_for_loop
570: || GET_CODE (scan_start) != CODE_LABEL)
571: {
572: if (loop_dump_stream)
573: fprintf (loop_dump_stream, "\nLoop from %d to %d is phony.\n\n",
574: INSN_UID (loop_start), INSN_UID (end));
575: return;
576: }
577:
578: /* Count number of times each reg is set during this loop.
579: Set may_not_optimize[I] if it is not safe to move out
580: the setting of register I. If this loop has calls, set
581: reg_single_usage[I]. */
582:
1.1.1.7 root 583: bzero ((char *) n_times_set, nregs * sizeof (short));
1.1 root 584: bzero (may_not_optimize, nregs);
585:
586: if (loop_has_call)
587: {
588: reg_single_usage = (rtx *) alloca (nregs * sizeof (rtx));
1.1.1.7 root 589: bzero ((char *) reg_single_usage, nregs * sizeof (rtx));
1.1 root 590: }
591:
592: count_loop_regs_set (loop_top ? loop_top : loop_start, end,
593: may_not_optimize, reg_single_usage, &insn_count, nregs);
594:
595: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
596: may_not_optimize[i] = 1, n_times_set[i] = 1;
1.1.1.7 root 597: bcopy ((char *) n_times_set, (char *) n_times_used, nregs * sizeof (short));
1.1 root 598:
599: if (loop_dump_stream)
600: {
601: fprintf (loop_dump_stream, "\nLoop from %d to %d: %d real insns.\n",
602: INSN_UID (loop_start), INSN_UID (end), insn_count);
603: if (loop_continue)
604: fprintf (loop_dump_stream, "Continue at insn %d.\n",
605: INSN_UID (loop_continue));
606: }
607:
608: /* Scan through the loop finding insns that are safe to move.
609: Set n_times_set negative for the reg being set, so that
610: this reg will be considered invariant for subsequent insns.
611: We consider whether subsequent insns use the reg
612: in deciding whether it is worth actually moving.
613:
614: MAYBE_NEVER is nonzero if we have passed a conditional jump insn
615: and therefore it is possible that the insns we are scanning
616: would never be executed. At such times, we must make sure
617: that it is safe to execute the insn once instead of zero times.
618: When MAYBE_NEVER is 0, all insns will be executed at least once
619: so that is not a problem. */
620:
621: p = scan_start;
622: while (1)
623: {
624: p = NEXT_INSN (p);
625: /* At end of a straight-in loop, we are done.
626: At end of a loop entered at the bottom, scan the top. */
627: if (p == scan_start)
628: break;
629: if (p == end)
630: {
631: if (loop_top != 0)
1.1.1.7 root 632: p = loop_top;
1.1 root 633: else
634: break;
635: if (p == scan_start)
636: break;
637: }
638:
639: if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
1.1.1.4 root 640: && find_reg_note (p, REG_LIBCALL, NULL_RTX))
1.1 root 641: in_libcall = 1;
642: else if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
1.1.1.4 root 643: && find_reg_note (p, REG_RETVAL, NULL_RTX))
1.1 root 644: in_libcall = 0;
645:
646: if (GET_CODE (p) == INSN
647: && (set = single_set (p))
648: && GET_CODE (SET_DEST (set)) == REG
649: && ! may_not_optimize[REGNO (SET_DEST (set))])
650: {
651: int tem1 = 0;
652: int tem2 = 0;
653: int move_insn = 0;
654: rtx src = SET_SRC (set);
655: rtx dependencies = 0;
656:
657: /* Figure out what to use as a source of this insn. If a REG_EQUIV
658: note is given or if a REG_EQUAL note with a constant operand is
659: specified, use it as the source and mark that we should move
660: this insn by calling emit_move_insn rather that duplicating the
661: insn.
662:
663: Otherwise, only use the REG_EQUAL contents if a REG_RETVAL note
664: is present. */
1.1.1.4 root 665: temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
1.1 root 666: if (temp)
667: src = XEXP (temp, 0), move_insn = 1;
668: else
669: {
1.1.1.4 root 670: temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
1.1 root 671: if (temp && CONSTANT_P (XEXP (temp, 0)))
672: src = XEXP (temp, 0), move_insn = 1;
1.1.1.4 root 673: if (temp && find_reg_note (p, REG_RETVAL, NULL_RTX))
1.1 root 674: {
675: src = XEXP (temp, 0);
676: /* A libcall block can use regs that don't appear in
677: the equivalent expression. To move the libcall,
678: we must move those regs too. */
679: dependencies = libcall_other_reg (p, src);
680: }
681: }
682:
683: /* Don't try to optimize a register that was made
684: by loop-optimization for an inner loop.
685: We don't know its life-span, so we can't compute the benefit. */
686: if (REGNO (SET_DEST (set)) >= max_reg_before_loop)
687: ;
688: /* In order to move a register, we need to have one of three cases:
689: (1) it is used only in the same basic block as the set
1.1.1.5 root 690: (2) it is not a user variable and it is not used in the
691: exit test (this can cause the variable to be used
692: before it is set just like a user-variable).
1.1 root 693: (3) the set is guaranteed to be executed once the loop starts,
694: and the reg is not used until after that. */
695: else if (! ((! maybe_never
696: && ! loop_reg_used_before_p (set, p, loop_start,
697: scan_start, end))
1.1.1.6 root 698: || (! REG_USERVAR_P (SET_DEST (set))
699: && ! REG_LOOP_TEST_P (SET_DEST (set)))
700: || reg_in_basic_block_p (p, SET_DEST (set))))
1.1 root 701: ;
702: else if ((tem = invariant_p (src))
703: && (dependencies == 0
704: || (tem2 = invariant_p (dependencies)) != 0)
705: && (n_times_set[REGNO (SET_DEST (set))] == 1
706: || (tem1
707: = consec_sets_invariant_p (SET_DEST (set),
708: n_times_set[REGNO (SET_DEST (set))],
709: p)))
710: /* If the insn can cause a trap (such as divide by zero),
711: can't move it unless it's guaranteed to be executed
712: once loop is entered. Even a function call might
713: prevent the trap insn from being reached
714: (since it might exit!) */
715: && ! ((maybe_never || call_passed)
716: && may_trap_p (src)))
717: {
718: register struct movable *m;
719: register int regno = REGNO (SET_DEST (set));
720:
721: /* A potential lossage is where we have a case where two insns
722: can be combined as long as they are both in the loop, but
723: we move one of them outside the loop. For large loops,
724: this can lose. The most common case of this is the address
725: of a function being called.
726:
727: Therefore, if this register is marked as being used exactly
728: once if we are in a loop with calls (a "large loop"), see if
729: we can replace the usage of this register with the source
730: of this SET. If we can, delete this insn.
731:
732: Don't do this if P has a REG_RETVAL note or if we have
733: SMALL_REGISTER_CLASSES and SET_SRC is a hard register. */
734:
735: if (reg_single_usage && reg_single_usage[regno] != 0
736: && reg_single_usage[regno] != const0_rtx
737: && regno_first_uid[regno] == INSN_UID (p)
738: && (regno_last_uid[regno]
739: == INSN_UID (reg_single_usage[regno]))
740: && n_times_set[REGNO (SET_DEST (set))] == 1
741: && ! side_effects_p (SET_SRC (set))
1.1.1.4 root 742: && ! find_reg_note (p, REG_RETVAL, NULL_RTX)
1.1 root 743: #ifdef SMALL_REGISTER_CLASSES
744: && ! (GET_CODE (SET_SRC (set)) == REG
745: && REGNO (SET_SRC (set)) < FIRST_PSEUDO_REGISTER)
746: #endif
747: /* This test is not redundant; SET_SRC (set) might be
748: a call-clobbered register and the life of REGNO
749: might span a call. */
750: && ! modified_between_p (SET_SRC (set), p,
1.1.1.7 root 751: reg_single_usage[regno])
752: && no_labels_between_p (p, reg_single_usage[regno])
1.1 root 753: && validate_replace_rtx (SET_DEST (set), SET_SRC (set),
754: reg_single_usage[regno]))
755: {
1.1.1.8 root 756: /* Replace any usage in a REG_EQUAL note. Must copy the
757: new source, so that we don't get rtx sharing between the
758: SET_SOURCE and REG_NOTES of insn p. */
1.1 root 759: REG_NOTES (reg_single_usage[regno])
760: = replace_rtx (REG_NOTES (reg_single_usage[regno]),
1.1.1.8 root 761: SET_DEST (set), copy_rtx (SET_SRC (set)));
1.1 root 762:
763: PUT_CODE (p, NOTE);
764: NOTE_LINE_NUMBER (p) = NOTE_INSN_DELETED;
765: NOTE_SOURCE_FILE (p) = 0;
766: n_times_set[regno] = 0;
767: continue;
768: }
769:
770: m = (struct movable *) alloca (sizeof (struct movable));
771: m->next = 0;
772: m->insn = p;
773: m->set_src = src;
774: m->dependencies = dependencies;
775: m->set_dest = SET_DEST (set);
776: m->force = 0;
777: m->consec = n_times_set[REGNO (SET_DEST (set))] - 1;
778: m->done = 0;
779: m->forces = 0;
780: m->partial = 0;
781: m->move_insn = move_insn;
1.1.1.4 root 782: m->is_equiv = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
1.1 root 783: m->savemode = VOIDmode;
784: m->regno = regno;
785: /* Set M->cond if either invariant_p or consec_sets_invariant_p
786: returned 2 (only conditionally invariant). */
787: m->cond = ((tem | tem1 | tem2) > 1);
788: m->global = (uid_luid[regno_last_uid[regno]] > INSN_LUID (end)
789: || uid_luid[regno_first_uid[regno]] < INSN_LUID (loop_start));
790: m->match = 0;
791: m->lifetime = (uid_luid[regno_last_uid[regno]]
792: - uid_luid[regno_first_uid[regno]]);
793: m->savings = n_times_used[regno];
1.1.1.4 root 794: if (find_reg_note (p, REG_RETVAL, NULL_RTX))
1.1 root 795: m->savings += libcall_benefit (p);
796: n_times_set[regno] = move_insn ? -2 : -1;
797: /* Add M to the end of the chain MOVABLES. */
798: if (movables == 0)
799: movables = m;
800: else
801: last_movable->next = m;
802: last_movable = m;
803:
804: if (m->consec > 0)
805: {
806: /* Skip this insn, not checking REG_LIBCALL notes. */
1.1.1.6 root 807: p = next_nonnote_insn (p);
1.1 root 808: /* Skip the consecutive insns, if there are any. */
809: p = skip_consec_insns (p, m->consec);
810: /* Back up to the last insn of the consecutive group. */
811: p = prev_nonnote_insn (p);
812:
813: /* We must now reset m->move_insn, m->is_equiv, and possibly
814: m->set_src to correspond to the effects of all the
815: insns. */
1.1.1.4 root 816: temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
1.1 root 817: if (temp)
818: m->set_src = XEXP (temp, 0), m->move_insn = 1;
819: else
820: {
1.1.1.4 root 821: temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
1.1 root 822: if (temp && CONSTANT_P (XEXP (temp, 0)))
823: m->set_src = XEXP (temp, 0), m->move_insn = 1;
824: else
825: m->move_insn = 0;
826:
827: }
1.1.1.4 root 828: m->is_equiv = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
1.1 root 829: }
830: }
831: /* If this register is always set within a STRICT_LOW_PART
832: or set to zero, then its high bytes are constant.
833: So clear them outside the loop and within the loop
834: just load the low bytes.
835: We must check that the machine has an instruction to do so.
836: Also, if the value loaded into the register
837: depends on the same register, this cannot be done. */
838: else if (SET_SRC (set) == const0_rtx
839: && GET_CODE (NEXT_INSN (p)) == INSN
840: && (set1 = single_set (NEXT_INSN (p)))
841: && GET_CODE (set1) == SET
842: && (GET_CODE (SET_DEST (set1)) == STRICT_LOW_PART)
843: && (GET_CODE (XEXP (SET_DEST (set1), 0)) == SUBREG)
844: && (SUBREG_REG (XEXP (SET_DEST (set1), 0))
845: == SET_DEST (set))
846: && !reg_mentioned_p (SET_DEST (set), SET_SRC (set1)))
847: {
848: register int regno = REGNO (SET_DEST (set));
849: if (n_times_set[regno] == 2)
850: {
851: register struct movable *m;
852: m = (struct movable *) alloca (sizeof (struct movable));
853: m->next = 0;
854: m->insn = p;
855: m->set_dest = SET_DEST (set);
856: m->dependencies = 0;
857: m->force = 0;
858: m->consec = 0;
859: m->done = 0;
860: m->forces = 0;
861: m->move_insn = 0;
862: m->partial = 1;
863: /* If the insn may not be executed on some cycles,
864: we can't clear the whole reg; clear just high part.
865: Not even if the reg is used only within this loop.
866: Consider this:
867: while (1)
868: while (s != t) {
869: if (foo ()) x = *s;
870: use (x);
871: }
872: Clearing x before the inner loop could clobber a value
873: being saved from the last time around the outer loop.
874: However, if the reg is not used outside this loop
875: and all uses of the register are in the same
876: basic block as the store, there is no problem.
877:
878: If this insn was made by loop, we don't know its
879: INSN_LUID and hence must make a conservative
880: assumption. */
881: m->global = (INSN_UID (p) >= max_uid_for_loop
882: || (uid_luid[regno_last_uid[regno]]
883: > INSN_LUID (end))
884: || (uid_luid[regno_first_uid[regno]]
885: < INSN_LUID (p))
886: || (labels_in_range_p
887: (p, uid_luid[regno_first_uid[regno]])));
888: if (maybe_never && m->global)
889: m->savemode = GET_MODE (SET_SRC (set1));
890: else
891: m->savemode = VOIDmode;
892: m->regno = regno;
893: m->cond = 0;
894: m->match = 0;
895: m->lifetime = (uid_luid[regno_last_uid[regno]]
896: - uid_luid[regno_first_uid[regno]]);
897: m->savings = 1;
898: n_times_set[regno] = -1;
899: /* Add M to the end of the chain MOVABLES. */
900: if (movables == 0)
901: movables = m;
902: else
903: last_movable->next = m;
904: last_movable = m;
905: }
906: }
907: }
908: /* Past a call insn, we get to insns which might not be executed
909: because the call might exit. This matters for insns that trap.
910: Call insns inside a REG_LIBCALL/REG_RETVAL block always return,
911: so they don't count. */
912: else if (GET_CODE (p) == CALL_INSN && ! in_libcall)
913: call_passed = 1;
914: /* Past a label or a jump, we get to insns for which we
915: can't count on whether or how many times they will be
916: executed during each iteration. Therefore, we can
917: only move out sets of trivial variables
918: (those not used after the loop). */
919: /* This code appears in three places, once in scan_loop, and twice
920: in strength_reduce. */
921: else if ((GET_CODE (p) == CODE_LABEL || GET_CODE (p) == JUMP_INSN)
922: /* If we enter the loop in the middle, and scan around to the
923: beginning, don't set maybe_never for that. This must be an
924: unconditional jump, otherwise the code at the top of the
925: loop might never be executed. Unconditional jumps are
926: followed a by barrier then loop end. */
927: && ! (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p) == loop_top
928: && NEXT_INSN (NEXT_INSN (p)) == end
929: && simplejump_p (p)))
930: maybe_never = 1;
1.1.1.7 root 931: else if (GET_CODE (p) == NOTE)
932: {
933: /* At the virtual top of a converted loop, insns are again known to
934: be executed: logically, the loop begins here even though the exit
935: code has been duplicated. */
936: if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_VTOP && loop_depth == 0)
937: maybe_never = call_passed = 0;
938: else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
939: loop_depth++;
940: else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END)
941: loop_depth--;
942: }
1.1 root 943: }
944:
945: /* If one movable subsumes another, ignore that other. */
946:
947: ignore_some_movables (movables);
948:
949: /* For each movable insn, see if the reg that it loads
950: leads when it dies right into another conditionally movable insn.
951: If so, record that the second insn "forces" the first one,
952: since the second can be moved only if the first is. */
953:
954: force_movables (movables);
955:
956: /* See if there are multiple movable insns that load the same value.
957: If there are, make all but the first point at the first one
958: through the `match' field, and add the priorities of them
959: all together as the priority of the first. */
960:
961: combine_movables (movables, nregs);
962:
963: /* Now consider each movable insn to decide whether it is worth moving.
964: Store 0 in n_times_set for each reg that is moved. */
965:
966: move_movables (movables, threshold,
967: insn_count, loop_start, end, nregs);
968:
969: /* Now candidates that still are negative are those not moved.
970: Change n_times_set to indicate that those are not actually invariant. */
971: for (i = 0; i < nregs; i++)
972: if (n_times_set[i] < 0)
973: n_times_set[i] = n_times_used[i];
974:
975: if (flag_strength_reduce)
976: strength_reduce (scan_start, end, loop_top,
977: insn_count, loop_start, end);
978: }
979:
980: /* Add elements to *OUTPUT to record all the pseudo-regs
981: mentioned in IN_THIS but not mentioned in NOT_IN_THIS. */
982:
983: void
984: record_excess_regs (in_this, not_in_this, output)
985: rtx in_this, not_in_this;
986: rtx *output;
987: {
988: enum rtx_code code;
989: char *fmt;
990: int i;
991:
992: code = GET_CODE (in_this);
993:
994: switch (code)
995: {
996: case PC:
997: case CC0:
998: case CONST_INT:
999: case CONST_DOUBLE:
1000: case CONST:
1001: case SYMBOL_REF:
1002: case LABEL_REF:
1003: return;
1004:
1005: case REG:
1006: if (REGNO (in_this) >= FIRST_PSEUDO_REGISTER
1007: && ! reg_mentioned_p (in_this, not_in_this))
1008: *output = gen_rtx (EXPR_LIST, VOIDmode, in_this, *output);
1009: return;
1010: }
1011:
1012: fmt = GET_RTX_FORMAT (code);
1013: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1014: {
1015: int j;
1016:
1017: switch (fmt[i])
1018: {
1019: case 'E':
1020: for (j = 0; j < XVECLEN (in_this, i); j++)
1021: record_excess_regs (XVECEXP (in_this, i, j), not_in_this, output);
1022: break;
1023:
1024: case 'e':
1025: record_excess_regs (XEXP (in_this, i), not_in_this, output);
1026: break;
1027: }
1028: }
1029: }
1030:
1031: /* Check what regs are referred to in the libcall block ending with INSN,
1032: aside from those mentioned in the equivalent value.
1033: If there are none, return 0.
1034: If there are one or more, return an EXPR_LIST containing all of them. */
1035:
1036: static rtx
1037: libcall_other_reg (insn, equiv)
1038: rtx insn, equiv;
1039: {
1.1.1.4 root 1040: rtx note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
1.1 root 1041: rtx p = XEXP (note, 0);
1042: rtx output = 0;
1043:
1044: /* First, find all the regs used in the libcall block
1045: that are not mentioned as inputs to the result. */
1046:
1047: while (p != insn)
1048: {
1049: if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
1050: || GET_CODE (p) == CALL_INSN)
1051: record_excess_regs (PATTERN (p), equiv, &output);
1052: p = NEXT_INSN (p);
1053: }
1054:
1055: return output;
1056: }
1057:
1058: /* Return 1 if all uses of REG
1059: are between INSN and the end of the basic block. */
1060:
1061: static int
1062: reg_in_basic_block_p (insn, reg)
1063: rtx insn, reg;
1064: {
1065: int regno = REGNO (reg);
1066: rtx p;
1067:
1068: if (regno_first_uid[regno] != INSN_UID (insn))
1069: return 0;
1070:
1071: /* Search this basic block for the already recorded last use of the reg. */
1072: for (p = insn; p; p = NEXT_INSN (p))
1073: {
1074: switch (GET_CODE (p))
1075: {
1076: case NOTE:
1077: break;
1078:
1079: case INSN:
1080: case CALL_INSN:
1081: /* Ordinary insn: if this is the last use, we win. */
1082: if (regno_last_uid[regno] == INSN_UID (p))
1083: return 1;
1084: break;
1085:
1086: case JUMP_INSN:
1087: /* Jump insn: if this is the last use, we win. */
1088: if (regno_last_uid[regno] == INSN_UID (p))
1089: return 1;
1090: /* Otherwise, it's the end of the basic block, so we lose. */
1091: return 0;
1092:
1093: case CODE_LABEL:
1094: case BARRIER:
1095: /* It's the end of the basic block, so we lose. */
1096: return 0;
1097: }
1098: }
1099:
1100: /* The "last use" doesn't follow the "first use"?? */
1101: abort ();
1102: }
1103:
1104: /* Compute the benefit of eliminating the insns in the block whose
1105: last insn is LAST. This may be a group of insns used to compute a
1106: value directly or can contain a library call. */
1107:
1108: static int
1109: libcall_benefit (last)
1110: rtx last;
1111: {
1112: rtx insn;
1113: int benefit = 0;
1114:
1.1.1.4 root 1115: for (insn = XEXP (find_reg_note (last, REG_RETVAL, NULL_RTX), 0);
1.1 root 1116: insn != last; insn = NEXT_INSN (insn))
1117: {
1118: if (GET_CODE (insn) == CALL_INSN)
1119: benefit += 10; /* Assume at least this many insns in a library
1120: routine. */
1121: else if (GET_CODE (insn) == INSN
1122: && GET_CODE (PATTERN (insn)) != USE
1123: && GET_CODE (PATTERN (insn)) != CLOBBER)
1124: benefit++;
1125: }
1126:
1127: return benefit;
1128: }
1129:
1130: /* Skip COUNT insns from INSN, counting library calls as 1 insn. */
1131:
1132: static rtx
1133: skip_consec_insns (insn, count)
1134: rtx insn;
1135: int count;
1136: {
1137: for (; count > 0; count--)
1138: {
1139: rtx temp;
1140:
1141: /* If first insn of libcall sequence, skip to end. */
1142: /* Do this at start of loop, since INSN is guaranteed to
1143: be an insn here. */
1144: if (GET_CODE (insn) != NOTE
1.1.1.4 root 1145: && (temp = find_reg_note (insn, REG_LIBCALL, NULL_RTX)))
1.1 root 1146: insn = XEXP (temp, 0);
1147:
1148: do insn = NEXT_INSN (insn);
1149: while (GET_CODE (insn) == NOTE);
1150: }
1151:
1152: return insn;
1153: }
1154:
1155: /* Ignore any movable whose insn falls within a libcall
1156: which is part of another movable.
1157: We make use of the fact that the movable for the libcall value
1158: was made later and so appears later on the chain. */
1159:
1160: static void
1161: ignore_some_movables (movables)
1162: struct movable *movables;
1163: {
1164: register struct movable *m, *m1;
1165:
1166: for (m = movables; m; m = m->next)
1167: {
1168: /* Is this a movable for the value of a libcall? */
1.1.1.4 root 1169: rtx note = find_reg_note (m->insn, REG_RETVAL, NULL_RTX);
1.1 root 1170: if (note)
1171: {
1172: rtx insn;
1173: /* Check for earlier movables inside that range,
1174: and mark them invalid. We cannot use LUIDs here because
1175: insns created by loop.c for prior loops don't have LUIDs.
1176: Rather than reject all such insns from movables, we just
1177: explicitly check each insn in the libcall (since invariant
1178: libcalls aren't that common). */
1179: for (insn = XEXP (note, 0); insn != m->insn; insn = NEXT_INSN (insn))
1180: for (m1 = movables; m1 != m; m1 = m1->next)
1181: if (m1->insn == insn)
1182: m1->done = 1;
1183: }
1184: }
1185: }
1186:
1187: /* For each movable insn, see if the reg that it loads
1188: leads when it dies right into another conditionally movable insn.
1189: If so, record that the second insn "forces" the first one,
1190: since the second can be moved only if the first is. */
1191:
1192: static void
1193: force_movables (movables)
1194: struct movable *movables;
1195: {
1196: register struct movable *m, *m1;
1197: for (m1 = movables; m1; m1 = m1->next)
1198: /* Omit this if moving just the (SET (REG) 0) of a zero-extend. */
1199: if (!m1->partial && !m1->done)
1200: {
1201: int regno = m1->regno;
1202: for (m = m1->next; m; m = m->next)
1203: /* ??? Could this be a bug? What if CSE caused the
1204: register of M1 to be used after this insn?
1205: Since CSE does not update regno_last_uid,
1206: this insn M->insn might not be where it dies.
1207: But very likely this doesn't matter; what matters is
1208: that M's reg is computed from M1's reg. */
1209: if (INSN_UID (m->insn) == regno_last_uid[regno]
1210: && !m->done)
1211: break;
1212: if (m != 0 && m->set_src == m1->set_dest
1213: /* If m->consec, m->set_src isn't valid. */
1214: && m->consec == 0)
1215: m = 0;
1216:
1217: /* Increase the priority of the moving the first insn
1218: since it permits the second to be moved as well. */
1219: if (m != 0)
1220: {
1221: m->forces = m1;
1222: m1->lifetime += m->lifetime;
1223: m1->savings += m1->savings;
1224: }
1225: }
1226: }
1227:
1228: /* Find invariant expressions that are equal and can be combined into
1229: one register. */
1230:
1231: static void
1232: combine_movables (movables, nregs)
1233: struct movable *movables;
1234: int nregs;
1235: {
1236: register struct movable *m;
1237: char *matched_regs = (char *) alloca (nregs);
1238: enum machine_mode mode;
1239:
1240: /* Regs that are set more than once are not allowed to match
1241: or be matched. I'm no longer sure why not. */
1242: /* Perhaps testing m->consec_sets would be more appropriate here? */
1243:
1244: for (m = movables; m; m = m->next)
1245: if (m->match == 0 && n_times_used[m->regno] == 1 && !m->partial)
1246: {
1247: register struct movable *m1;
1248: int regno = m->regno;
1249:
1250: bzero (matched_regs, nregs);
1251: matched_regs[regno] = 1;
1252:
1253: for (m1 = movables; m1; m1 = m1->next)
1254: if (m != m1 && m1->match == 0 && n_times_used[m1->regno] == 1
1255: /* A reg used outside the loop mustn't be eliminated. */
1256: && !m1->global
1257: /* A reg used for zero-extending mustn't be eliminated. */
1258: && !m1->partial
1259: && (matched_regs[m1->regno]
1260: ||
1261: (
1262: /* Can combine regs with different modes loaded from the
1263: same constant only if the modes are the same or
1264: if both are integer modes with M wider or the same
1265: width as M1. The check for integer is redundant, but
1266: safe, since the only case of differing destination
1267: modes with equal sources is when both sources are
1268: VOIDmode, i.e., CONST_INT. */
1269: (GET_MODE (m->set_dest) == GET_MODE (m1->set_dest)
1270: || (GET_MODE_CLASS (GET_MODE (m->set_dest)) == MODE_INT
1271: && GET_MODE_CLASS (GET_MODE (m1->set_dest)) == MODE_INT
1272: && (GET_MODE_BITSIZE (GET_MODE (m->set_dest))
1273: >= GET_MODE_BITSIZE (GET_MODE (m1->set_dest)))))
1274: /* See if the source of M1 says it matches M. */
1275: && ((GET_CODE (m1->set_src) == REG
1276: && matched_regs[REGNO (m1->set_src)])
1277: || rtx_equal_for_loop_p (m->set_src, m1->set_src,
1278: movables))))
1279: && ((m->dependencies == m1->dependencies)
1280: || rtx_equal_p (m->dependencies, m1->dependencies)))
1281: {
1282: m->lifetime += m1->lifetime;
1283: m->savings += m1->savings;
1284: m1->done = 1;
1285: m1->match = m;
1286: matched_regs[m1->regno] = 1;
1287: }
1288: }
1289:
1290: /* Now combine the regs used for zero-extension.
1291: This can be done for those not marked `global'
1292: provided their lives don't overlap. */
1293:
1294: for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
1295: mode = GET_MODE_WIDER_MODE (mode))
1296: {
1297: register struct movable *m0 = 0;
1298:
1299: /* Combine all the registers for extension from mode MODE.
1300: Don't combine any that are used outside this loop. */
1301: for (m = movables; m; m = m->next)
1302: if (m->partial && ! m->global
1303: && mode == GET_MODE (SET_SRC (PATTERN (NEXT_INSN (m->insn)))))
1304: {
1305: register struct movable *m1;
1306: int first = uid_luid[regno_first_uid[m->regno]];
1307: int last = uid_luid[regno_last_uid[m->regno]];
1308:
1309: if (m0 == 0)
1310: {
1311: /* First one: don't check for overlap, just record it. */
1312: m0 = m;
1313: continue;
1314: }
1315:
1316: /* Make sure they extend to the same mode.
1317: (Almost always true.) */
1318: if (GET_MODE (m->set_dest) != GET_MODE (m0->set_dest))
1319: continue;
1320:
1321: /* We already have one: check for overlap with those
1322: already combined together. */
1323: for (m1 = movables; m1 != m; m1 = m1->next)
1324: if (m1 == m0 || (m1->partial && m1->match == m0))
1325: if (! (uid_luid[regno_first_uid[m1->regno]] > last
1326: || uid_luid[regno_last_uid[m1->regno]] < first))
1327: goto overlap;
1328:
1329: /* No overlap: we can combine this with the others. */
1330: m0->lifetime += m->lifetime;
1331: m0->savings += m->savings;
1332: m->done = 1;
1333: m->match = m0;
1334:
1335: overlap: ;
1336: }
1337: }
1338: }
1339:
1340: /* Return 1 if regs X and Y will become the same if moved. */
1341:
1342: static int
1343: regs_match_p (x, y, movables)
1344: rtx x, y;
1345: struct movable *movables;
1346: {
1347: int xn = REGNO (x);
1348: int yn = REGNO (y);
1349: struct movable *mx, *my;
1350:
1351: for (mx = movables; mx; mx = mx->next)
1352: if (mx->regno == xn)
1353: break;
1354:
1355: for (my = movables; my; my = my->next)
1356: if (my->regno == yn)
1357: break;
1358:
1359: return (mx && my
1360: && ((mx->match == my->match && mx->match != 0)
1361: || mx->match == my
1362: || mx == my->match));
1363: }
1364:
1365: /* Return 1 if X and Y are identical-looking rtx's.
1366: This is the Lisp function EQUAL for rtx arguments.
1367:
1368: If two registers are matching movables or a movable register and an
1369: equivalent constant, consider them equal. */
1370:
1371: static int
1372: rtx_equal_for_loop_p (x, y, movables)
1373: rtx x, y;
1374: struct movable *movables;
1375: {
1376: register int i;
1377: register int j;
1378: register struct movable *m;
1379: register enum rtx_code code;
1380: register char *fmt;
1381:
1382: if (x == y)
1383: return 1;
1384: if (x == 0 || y == 0)
1385: return 0;
1386:
1387: code = GET_CODE (x);
1388:
1389: /* If we have a register and a constant, they may sometimes be
1390: equal. */
1391: if (GET_CODE (x) == REG && n_times_set[REGNO (x)] == -2
1392: && CONSTANT_P (y))
1393: for (m = movables; m; m = m->next)
1394: if (m->move_insn && m->regno == REGNO (x)
1395: && rtx_equal_p (m->set_src, y))
1396: return 1;
1397:
1398: else if (GET_CODE (y) == REG && n_times_set[REGNO (y)] == -2
1399: && CONSTANT_P (x))
1400: for (m = movables; m; m = m->next)
1401: if (m->move_insn && m->regno == REGNO (y)
1402: && rtx_equal_p (m->set_src, x))
1403: return 1;
1404:
1405: /* Otherwise, rtx's of different codes cannot be equal. */
1406: if (code != GET_CODE (y))
1407: return 0;
1408:
1409: /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
1410: (REG:SI x) and (REG:HI x) are NOT equivalent. */
1411:
1412: if (GET_MODE (x) != GET_MODE (y))
1413: return 0;
1414:
1415: /* These three types of rtx's can be compared nonrecursively. */
1416: if (code == REG)
1417: return (REGNO (x) == REGNO (y) || regs_match_p (x, y, movables));
1418:
1419: if (code == LABEL_REF)
1420: return XEXP (x, 0) == XEXP (y, 0);
1421: if (code == SYMBOL_REF)
1422: return XSTR (x, 0) == XSTR (y, 0);
1423:
1424: /* Compare the elements. If any pair of corresponding elements
1425: fail to match, return 0 for the whole things. */
1426:
1427: fmt = GET_RTX_FORMAT (code);
1428: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1429: {
1430: switch (fmt[i])
1431: {
1.1.1.4 root 1432: case 'w':
1433: if (XWINT (x, i) != XWINT (y, i))
1434: return 0;
1435: break;
1436:
1.1 root 1437: case 'i':
1438: if (XINT (x, i) != XINT (y, i))
1439: return 0;
1440: break;
1441:
1442: case 'E':
1443: /* Two vectors must have the same length. */
1444: if (XVECLEN (x, i) != XVECLEN (y, i))
1445: return 0;
1446:
1447: /* And the corresponding elements must match. */
1448: for (j = 0; j < XVECLEN (x, i); j++)
1449: if (rtx_equal_for_loop_p (XVECEXP (x, i, j), XVECEXP (y, i, j), movables) == 0)
1450: return 0;
1451: break;
1452:
1453: case 'e':
1454: if (rtx_equal_for_loop_p (XEXP (x, i), XEXP (y, i), movables) == 0)
1455: return 0;
1456: break;
1457:
1458: case 's':
1459: if (strcmp (XSTR (x, i), XSTR (y, i)))
1460: return 0;
1461: break;
1462:
1463: case 'u':
1464: /* These are just backpointers, so they don't matter. */
1465: break;
1466:
1467: case '0':
1468: break;
1469:
1470: /* It is believed that rtx's at this level will never
1471: contain anything but integers and other rtx's,
1472: except for within LABEL_REFs and SYMBOL_REFs. */
1473: default:
1474: abort ();
1475: }
1476: }
1477: return 1;
1478: }
1479:
1.1.1.2 root 1480: /* If X contains any LABEL_REF's, add REG_LABEL notes for them to all
1481: insns in INSNS which use thet reference. */
1482:
1483: static void
1484: add_label_notes (x, insns)
1485: rtx x;
1486: rtx insns;
1487: {
1488: enum rtx_code code = GET_CODE (x);
1.1.1.3 root 1489: int i, j;
1.1.1.2 root 1490: char *fmt;
1491: rtx insn;
1492:
1.1.1.4 root 1493: if (code == LABEL_REF && !LABEL_REF_NONLOCAL_P (x))
1.1.1.2 root 1494: {
1.1.1.5 root 1495: rtx next = next_real_insn (XEXP (x, 0));
1496:
1497: /* Don't record labels that refer to dispatch tables.
1498: This is not necessary, since the tablejump references the same label.
1499: And if we did record them, flow.c would make worse code. */
1500: if (next == 0
1501: || ! (GET_CODE (next) == JUMP_INSN
1502: && (GET_CODE (PATTERN (next)) == ADDR_VEC
1503: || GET_CODE (PATTERN (next)) == ADDR_DIFF_VEC)))
1504: {
1505: for (insn = insns; insn; insn = NEXT_INSN (insn))
1506: if (reg_mentioned_p (XEXP (x, 0), insn))
1507: REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_LABEL, XEXP (x, 0),
1508: REG_NOTES (insn));
1509: }
1.1.1.2 root 1510: return;
1511: }
1512:
1513: fmt = GET_RTX_FORMAT (code);
1514: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1.1.1.3 root 1515: {
1516: if (fmt[i] == 'e')
1517: add_label_notes (XEXP (x, i), insns);
1518: else if (fmt[i] == 'E')
1519: for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1520: add_label_notes (XVECEXP (x, i, j), insns);
1521: }
1.1.1.2 root 1522: }
1523:
1.1 root 1524: /* Scan MOVABLES, and move the insns that deserve to be moved.
1525: If two matching movables are combined, replace one reg with the
1526: other throughout. */
1527:
1528: static void
1529: move_movables (movables, threshold, insn_count, loop_start, end, nregs)
1530: struct movable *movables;
1531: int threshold;
1532: int insn_count;
1533: rtx loop_start;
1534: rtx end;
1535: int nregs;
1536: {
1537: rtx new_start = 0;
1538: register struct movable *m;
1539: register rtx p;
1540: /* Map of pseudo-register replacements to handle combining
1541: when we move several insns that load the same value
1542: into different pseudo-registers. */
1543: rtx *reg_map = (rtx *) alloca (nregs * sizeof (rtx));
1544: char *already_moved = (char *) alloca (nregs);
1545:
1546: bzero (already_moved, nregs);
1.1.1.7 root 1547: bzero ((char *) reg_map, nregs * sizeof (rtx));
1.1 root 1548:
1549: num_movables = 0;
1550:
1551: for (m = movables; m; m = m->next)
1552: {
1553: /* Describe this movable insn. */
1554:
1555: if (loop_dump_stream)
1556: {
1557: fprintf (loop_dump_stream, "Insn %d: regno %d (life %d), ",
1558: INSN_UID (m->insn), m->regno, m->lifetime);
1559: if (m->consec > 0)
1560: fprintf (loop_dump_stream, "consec %d, ", m->consec);
1561: if (m->cond)
1562: fprintf (loop_dump_stream, "cond ");
1563: if (m->force)
1564: fprintf (loop_dump_stream, "force ");
1565: if (m->global)
1566: fprintf (loop_dump_stream, "global ");
1567: if (m->done)
1568: fprintf (loop_dump_stream, "done ");
1569: if (m->move_insn)
1570: fprintf (loop_dump_stream, "move-insn ");
1571: if (m->match)
1572: fprintf (loop_dump_stream, "matches %d ",
1573: INSN_UID (m->match->insn));
1574: if (m->forces)
1575: fprintf (loop_dump_stream, "forces %d ",
1576: INSN_UID (m->forces->insn));
1577: }
1578:
1579: /* Count movables. Value used in heuristics in strength_reduce. */
1580: num_movables++;
1581:
1582: /* Ignore the insn if it's already done (it matched something else).
1583: Otherwise, see if it is now safe to move. */
1584:
1585: if (!m->done
1586: && (! m->cond
1587: || (1 == invariant_p (m->set_src)
1588: && (m->dependencies == 0
1589: || 1 == invariant_p (m->dependencies))
1590: && (m->consec == 0
1591: || 1 == consec_sets_invariant_p (m->set_dest,
1592: m->consec + 1,
1593: m->insn))))
1594: && (! m->forces || m->forces->done))
1595: {
1596: register int regno;
1597: register rtx p;
1598: int savings = m->savings;
1599:
1600: /* We have an insn that is safe to move.
1601: Compute its desirability. */
1602:
1603: p = m->insn;
1604: regno = m->regno;
1605:
1606: if (loop_dump_stream)
1607: fprintf (loop_dump_stream, "savings %d ", savings);
1608:
1609: if (moved_once[regno])
1610: {
1611: insn_count *= 2;
1612:
1613: if (loop_dump_stream)
1614: fprintf (loop_dump_stream, "halved since already moved ");
1615: }
1616:
1617: /* An insn MUST be moved if we already moved something else
1618: which is safe only if this one is moved too: that is,
1619: if already_moved[REGNO] is nonzero. */
1620:
1621: /* An insn is desirable to move if the new lifetime of the
1622: register is no more than THRESHOLD times the old lifetime.
1623: If it's not desirable, it means the loop is so big
1624: that moving won't speed things up much,
1625: and it is liable to make register usage worse. */
1626:
1627: /* It is also desirable to move if it can be moved at no
1628: extra cost because something else was already moved. */
1629:
1630: if (already_moved[regno]
1631: || (threshold * savings * m->lifetime) >= insn_count
1632: || (m->forces && m->forces->done
1633: && n_times_used[m->forces->regno] == 1))
1634: {
1635: int count;
1636: register struct movable *m1;
1637: rtx first;
1638:
1639: /* Now move the insns that set the reg. */
1640:
1641: if (m->partial && m->match)
1642: {
1643: rtx newpat, i1;
1644: rtx r1, r2;
1645: /* Find the end of this chain of matching regs.
1646: Thus, we load each reg in the chain from that one reg.
1647: And that reg is loaded with 0 directly,
1648: since it has ->match == 0. */
1649: for (m1 = m; m1->match; m1 = m1->match);
1650: newpat = gen_move_insn (SET_DEST (PATTERN (m->insn)),
1651: SET_DEST (PATTERN (m1->insn)));
1652: i1 = emit_insn_before (newpat, loop_start);
1653:
1654: /* Mark the moved, invariant reg as being allowed to
1655: share a hard reg with the other matching invariant. */
1656: REG_NOTES (i1) = REG_NOTES (m->insn);
1657: r1 = SET_DEST (PATTERN (m->insn));
1658: r2 = SET_DEST (PATTERN (m1->insn));
1659: regs_may_share = gen_rtx (EXPR_LIST, VOIDmode, r1,
1660: gen_rtx (EXPR_LIST, VOIDmode, r2,
1661: regs_may_share));
1662: delete_insn (m->insn);
1663:
1664: if (new_start == 0)
1665: new_start = i1;
1666:
1667: if (loop_dump_stream)
1668: fprintf (loop_dump_stream, " moved to %d", INSN_UID (i1));
1669: }
1670: /* If we are to re-generate the item being moved with a
1671: new move insn, first delete what we have and then emit
1672: the move insn before the loop. */
1673: else if (m->move_insn)
1674: {
1675: rtx i1, temp;
1676:
1677: for (count = m->consec; count >= 0; count--)
1678: {
1679: /* If this is the first insn of a library call sequence,
1680: skip to the end. */
1681: if (GET_CODE (p) != NOTE
1.1.1.4 root 1682: && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
1.1 root 1683: p = XEXP (temp, 0);
1684:
1685: /* If this is the last insn of a libcall sequence, then
1686: delete every insn in the sequence except the last.
1687: The last insn is handled in the normal manner. */
1688: if (GET_CODE (p) != NOTE
1.1.1.4 root 1689: && (temp = find_reg_note (p, REG_RETVAL, NULL_RTX)))
1.1 root 1690: {
1691: temp = XEXP (temp, 0);
1692: while (temp != p)
1693: temp = delete_insn (temp);
1694: }
1695:
1696: p = delete_insn (p);
1.1.1.7 root 1697: while (p && GET_CODE (p) == NOTE)
1698: p = NEXT_INSN (p);
1.1 root 1699: }
1700:
1701: start_sequence ();
1702: emit_move_insn (m->set_dest, m->set_src);
1.1.1.2 root 1703: temp = get_insns ();
1.1 root 1704: end_sequence ();
1705:
1.1.1.2 root 1706: add_label_notes (m->set_src, temp);
1707:
1708: i1 = emit_insns_before (temp, loop_start);
1.1.1.4 root 1709: if (! find_reg_note (i1, REG_EQUAL, NULL_RTX))
1.1 root 1710: REG_NOTES (i1)
1711: = gen_rtx (EXPR_LIST,
1712: m->is_equiv ? REG_EQUIV : REG_EQUAL,
1713: m->set_src, REG_NOTES (i1));
1714:
1715: if (loop_dump_stream)
1716: fprintf (loop_dump_stream, " moved to %d", INSN_UID (i1));
1717:
1718: /* The more regs we move, the less we like moving them. */
1719: threshold -= 3;
1720: }
1721: else
1722: {
1723: for (count = m->consec; count >= 0; count--)
1724: {
1725: rtx i1, temp;
1726:
1727: /* If first insn of libcall sequence, skip to end. */
1728: /* Do this at start of loop, since p is guaranteed to
1729: be an insn here. */
1730: if (GET_CODE (p) != NOTE
1.1.1.4 root 1731: && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
1.1 root 1732: p = XEXP (temp, 0);
1733:
1734: /* If last insn of libcall sequence, move all
1735: insns except the last before the loop. The last
1736: insn is handled in the normal manner. */
1737: if (GET_CODE (p) != NOTE
1.1.1.4 root 1738: && (temp = find_reg_note (p, REG_RETVAL, NULL_RTX)))
1.1 root 1739: {
1740: rtx fn_address = 0;
1741: rtx fn_reg = 0;
1742: rtx fn_address_insn = 0;
1743:
1744: first = 0;
1745: for (temp = XEXP (temp, 0); temp != p;
1746: temp = NEXT_INSN (temp))
1747: {
1748: rtx body;
1749: rtx n;
1750: rtx next;
1751:
1752: if (GET_CODE (temp) == NOTE)
1753: continue;
1754:
1755: body = PATTERN (temp);
1756:
1757: /* Find the next insn after TEMP,
1758: not counting USE or NOTE insns. */
1759: for (next = NEXT_INSN (temp); next != p;
1760: next = NEXT_INSN (next))
1761: if (! (GET_CODE (next) == INSN
1762: && GET_CODE (PATTERN (next)) == USE)
1763: && GET_CODE (next) != NOTE)
1764: break;
1765:
1766: /* If that is the call, this may be the insn
1767: that loads the function address.
1768:
1769: Extract the function address from the insn
1770: that loads it into a register.
1771: If this insn was cse'd, we get incorrect code.
1772:
1773: So emit a new move insn that copies the
1774: function address into the register that the
1775: call insn will use. flow.c will delete any
1776: redundant stores that we have created. */
1777: if (GET_CODE (next) == CALL_INSN
1778: && GET_CODE (body) == SET
1779: && GET_CODE (SET_DEST (body)) == REG
1.1.1.4 root 1780: && (n = find_reg_note (temp, REG_EQUAL,
1781: NULL_RTX)))
1.1 root 1782: {
1783: fn_reg = SET_SRC (body);
1784: if (GET_CODE (fn_reg) != REG)
1785: fn_reg = SET_DEST (body);
1786: fn_address = XEXP (n, 0);
1787: fn_address_insn = temp;
1788: }
1789: /* We have the call insn.
1790: If it uses the register we suspect it might,
1791: load it with the correct address directly. */
1792: if (GET_CODE (temp) == CALL_INSN
1793: && fn_address != 0
1.1.1.4 root 1794: && reg_referenced_p (fn_reg, body))
1.1 root 1795: emit_insn_after (gen_move_insn (fn_reg,
1796: fn_address),
1797: fn_address_insn);
1798:
1799: if (GET_CODE (temp) == CALL_INSN)
1.1.1.7 root 1800: {
1801: i1 = emit_call_insn_before (body, loop_start);
1802: /* Because the USAGE information potentially
1803: contains objects other than hard registers
1804: we need to copy it. */
1805: if (CALL_INSN_FUNCTION_USAGE (temp))
1806: CALL_INSN_FUNCTION_USAGE (i1) =
1807: copy_rtx (CALL_INSN_FUNCTION_USAGE (temp));
1808: }
1.1 root 1809: else
1810: i1 = emit_insn_before (body, loop_start);
1811: if (first == 0)
1812: first = i1;
1813: if (temp == fn_address_insn)
1814: fn_address_insn = i1;
1815: REG_NOTES (i1) = REG_NOTES (temp);
1816: delete_insn (temp);
1817: }
1818: }
1819: if (m->savemode != VOIDmode)
1820: {
1821: /* P sets REG to zero; but we should clear only
1822: the bits that are not covered by the mode
1823: m->savemode. */
1824: rtx reg = m->set_dest;
1825: rtx sequence;
1826: rtx tem;
1827:
1828: start_sequence ();
1829: tem = expand_binop
1830: (GET_MODE (reg), and_optab, reg,
1.1.1.4 root 1831: GEN_INT ((((HOST_WIDE_INT) 1
1832: << GET_MODE_BITSIZE (m->savemode)))
1.1 root 1833: - 1),
1834: reg, 1, OPTAB_LIB_WIDEN);
1835: if (tem == 0)
1836: abort ();
1837: if (tem != reg)
1838: emit_move_insn (reg, tem);
1839: sequence = gen_sequence ();
1840: end_sequence ();
1841: i1 = emit_insn_before (sequence, loop_start);
1842: }
1843: else if (GET_CODE (p) == CALL_INSN)
1.1.1.7 root 1844: {
1845: i1 = emit_call_insn_before (PATTERN (p), loop_start);
1846: /* Because the USAGE information potentially
1847: contains objects other than hard registers
1848: we need to copy it. */
1849: if (CALL_INSN_FUNCTION_USAGE (p))
1850: CALL_INSN_FUNCTION_USAGE (i1) =
1851: copy_rtx (CALL_INSN_FUNCTION_USAGE (p));
1852: }
1.1 root 1853: else
1854: i1 = emit_insn_before (PATTERN (p), loop_start);
1855:
1856: REG_NOTES (i1) = REG_NOTES (p);
1857:
1.1.1.5 root 1858: /* If there is a REG_EQUAL note present whose value is
1859: not loop invariant, then delete it, since it may
1860: cause problems with later optimization passes.
1861: It is possible for cse to create such notes
1862: like this as a result of record_jump_cond. */
1863:
1864: if ((temp = find_reg_note (i1, REG_EQUAL, NULL_RTX))
1865: && ! invariant_p (XEXP (temp, 0)))
1866: remove_note (i1, temp);
1867:
1.1 root 1868: if (new_start == 0)
1869: new_start = i1;
1870:
1871: if (loop_dump_stream)
1872: fprintf (loop_dump_stream, " moved to %d",
1873: INSN_UID (i1));
1874:
1875: #if 0
1876: /* This isn't needed because REG_NOTES is copied
1877: below and is wrong since P might be a PARALLEL. */
1878: if (REG_NOTES (i1) == 0
1879: && ! m->partial /* But not if it's a zero-extend clr. */
1880: && ! m->global /* and not if used outside the loop
1881: (since it might get set outside). */
1882: && CONSTANT_P (SET_SRC (PATTERN (p))))
1883: REG_NOTES (i1)
1884: = gen_rtx (EXPR_LIST, REG_EQUAL,
1885: SET_SRC (PATTERN (p)), REG_NOTES (i1));
1886: #endif
1887:
1888: /* If library call, now fix the REG_NOTES that contain
1889: insn pointers, namely REG_LIBCALL on FIRST
1890: and REG_RETVAL on I1. */
1.1.1.4 root 1891: if (temp = find_reg_note (i1, REG_RETVAL, NULL_RTX))
1.1 root 1892: {
1893: XEXP (temp, 0) = first;
1.1.1.4 root 1894: temp = find_reg_note (first, REG_LIBCALL, NULL_RTX);
1.1 root 1895: XEXP (temp, 0) = i1;
1896: }
1897:
1898: delete_insn (p);
1899: do p = NEXT_INSN (p);
1900: while (p && GET_CODE (p) == NOTE);
1901: }
1902:
1903: /* The more regs we move, the less we like moving them. */
1904: threshold -= 3;
1905: }
1906:
1907: /* Any other movable that loads the same register
1908: MUST be moved. */
1909: already_moved[regno] = 1;
1910:
1911: /* This reg has been moved out of one loop. */
1912: moved_once[regno] = 1;
1913:
1914: /* The reg set here is now invariant. */
1915: if (! m->partial)
1916: n_times_set[regno] = 0;
1917:
1918: m->done = 1;
1919:
1920: /* Change the length-of-life info for the register
1921: to say it lives at least the full length of this loop.
1922: This will help guide optimizations in outer loops. */
1923:
1924: if (uid_luid[regno_first_uid[regno]] > INSN_LUID (loop_start))
1925: /* This is the old insn before all the moved insns.
1926: We can't use the moved insn because it is out of range
1927: in uid_luid. Only the old insns have luids. */
1928: regno_first_uid[regno] = INSN_UID (loop_start);
1929: if (uid_luid[regno_last_uid[regno]] < INSN_LUID (end))
1930: regno_last_uid[regno] = INSN_UID (end);
1931:
1932: /* Combine with this moved insn any other matching movables. */
1933:
1934: if (! m->partial)
1935: for (m1 = movables; m1; m1 = m1->next)
1936: if (m1->match == m)
1937: {
1938: rtx temp;
1939:
1940: /* Schedule the reg loaded by M1
1941: for replacement so that shares the reg of M.
1942: If the modes differ (only possible in restricted
1943: circumstances, make a SUBREG. */
1944: if (GET_MODE (m->set_dest) == GET_MODE (m1->set_dest))
1945: reg_map[m1->regno] = m->set_dest;
1946: else
1947: reg_map[m1->regno]
1948: = gen_lowpart_common (GET_MODE (m1->set_dest),
1949: m->set_dest);
1950:
1951: /* Get rid of the matching insn
1952: and prevent further processing of it. */
1953: m1->done = 1;
1954:
1955: /* if library call, delete all insn except last, which
1956: is deleted below */
1.1.1.4 root 1957: if (temp = find_reg_note (m1->insn, REG_RETVAL,
1958: NULL_RTX))
1.1 root 1959: {
1960: for (temp = XEXP (temp, 0); temp != m1->insn;
1961: temp = NEXT_INSN (temp))
1962: delete_insn (temp);
1963: }
1964: delete_insn (m1->insn);
1965:
1966: /* Any other movable that loads the same register
1967: MUST be moved. */
1968: already_moved[m1->regno] = 1;
1969:
1970: /* The reg merged here is now invariant,
1971: if the reg it matches is invariant. */
1972: if (! m->partial)
1973: n_times_set[m1->regno] = 0;
1974: }
1975: }
1976: else if (loop_dump_stream)
1977: fprintf (loop_dump_stream, "not desirable");
1978: }
1979: else if (loop_dump_stream && !m->match)
1980: fprintf (loop_dump_stream, "not safe");
1981:
1982: if (loop_dump_stream)
1983: fprintf (loop_dump_stream, "\n");
1984: }
1985:
1986: if (new_start == 0)
1987: new_start = loop_start;
1988:
1989: /* Go through all the instructions in the loop, making
1990: all the register substitutions scheduled in REG_MAP. */
1991: for (p = new_start; p != end; p = NEXT_INSN (p))
1992: if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
1993: || GET_CODE (p) == CALL_INSN)
1994: {
1995: replace_regs (PATTERN (p), reg_map, nregs, 0);
1996: replace_regs (REG_NOTES (p), reg_map, nregs, 0);
1.1.1.5 root 1997: INSN_CODE (p) = -1;
1.1 root 1998: }
1999: }
2000:
2001: #if 0
2002: /* Scan X and replace the address of any MEM in it with ADDR.
2003: REG is the address that MEM should have before the replacement. */
2004:
2005: static void
2006: replace_call_address (x, reg, addr)
2007: rtx x, reg, addr;
2008: {
2009: register enum rtx_code code;
2010: register int i;
2011: register char *fmt;
2012:
2013: if (x == 0)
2014: return;
2015: code = GET_CODE (x);
2016: switch (code)
2017: {
2018: case PC:
2019: case CC0:
2020: case CONST_INT:
2021: case CONST_DOUBLE:
2022: case CONST:
2023: case SYMBOL_REF:
2024: case LABEL_REF:
2025: case REG:
2026: return;
2027:
2028: case SET:
2029: /* Short cut for very common case. */
2030: replace_call_address (XEXP (x, 1), reg, addr);
2031: return;
2032:
2033: case CALL:
2034: /* Short cut for very common case. */
2035: replace_call_address (XEXP (x, 0), reg, addr);
2036: return;
2037:
2038: case MEM:
2039: /* If this MEM uses a reg other than the one we expected,
2040: something is wrong. */
2041: if (XEXP (x, 0) != reg)
2042: abort ();
2043: XEXP (x, 0) = addr;
2044: return;
2045: }
2046:
2047: fmt = GET_RTX_FORMAT (code);
2048: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2049: {
2050: if (fmt[i] == 'e')
2051: replace_call_address (XEXP (x, i), reg, addr);
2052: if (fmt[i] == 'E')
2053: {
2054: register int j;
2055: for (j = 0; j < XVECLEN (x, i); j++)
2056: replace_call_address (XVECEXP (x, i, j), reg, addr);
2057: }
2058: }
2059: }
2060: #endif
2061:
2062: /* Return the number of memory refs to addresses that vary
2063: in the rtx X. */
2064:
2065: static int
2066: count_nonfixed_reads (x)
2067: rtx x;
2068: {
2069: register enum rtx_code code;
2070: register int i;
2071: register char *fmt;
2072: int value;
2073:
2074: if (x == 0)
2075: return 0;
2076:
2077: code = GET_CODE (x);
2078: switch (code)
2079: {
2080: case PC:
2081: case CC0:
2082: case CONST_INT:
2083: case CONST_DOUBLE:
2084: case CONST:
2085: case SYMBOL_REF:
2086: case LABEL_REF:
2087: case REG:
2088: return 0;
2089:
2090: case MEM:
2091: return ((invariant_p (XEXP (x, 0)) != 1)
2092: + count_nonfixed_reads (XEXP (x, 0)));
2093: }
2094:
2095: value = 0;
2096: fmt = GET_RTX_FORMAT (code);
2097: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2098: {
2099: if (fmt[i] == 'e')
2100: value += count_nonfixed_reads (XEXP (x, i));
2101: if (fmt[i] == 'E')
2102: {
2103: register int j;
2104: for (j = 0; j < XVECLEN (x, i); j++)
2105: value += count_nonfixed_reads (XVECEXP (x, i, j));
2106: }
2107: }
2108: return value;
2109: }
2110:
2111:
2112: #if 0
2113: /* P is an instruction that sets a register to the result of a ZERO_EXTEND.
2114: Replace it with an instruction to load just the low bytes
2115: if the machine supports such an instruction,
2116: and insert above LOOP_START an instruction to clear the register. */
2117:
2118: static void
2119: constant_high_bytes (p, loop_start)
2120: rtx p, loop_start;
2121: {
2122: register rtx new;
2123: register int insn_code_number;
2124:
2125: /* Try to change (SET (REG ...) (ZERO_EXTEND (..:B ...)))
2126: to (SET (STRICT_LOW_PART (SUBREG:B (REG...))) ...). */
2127:
2128: new = gen_rtx (SET, VOIDmode,
2129: gen_rtx (STRICT_LOW_PART, VOIDmode,
2130: gen_rtx (SUBREG, GET_MODE (XEXP (SET_SRC (PATTERN (p)), 0)),
2131: SET_DEST (PATTERN (p)),
2132: 0)),
2133: XEXP (SET_SRC (PATTERN (p)), 0));
2134: insn_code_number = recog (new, p);
2135:
2136: if (insn_code_number)
2137: {
2138: register int i;
2139:
2140: /* Clear destination register before the loop. */
2141: emit_insn_before (gen_rtx (SET, VOIDmode,
2142: SET_DEST (PATTERN (p)),
2143: const0_rtx),
2144: loop_start);
2145:
2146: /* Inside the loop, just load the low part. */
2147: PATTERN (p) = new;
2148: }
2149: }
2150: #endif
2151:
2152: /* Scan a loop setting the variables `unknown_address_altered',
1.1.1.3 root 2153: `num_mem_sets', `loop_continue', loops_enclosed', `loop_has_call',
2154: and `loop_has_volatile'.
1.1 root 2155: Also, fill in the array `loop_store_mems'. */
2156:
2157: static void
2158: prescan_loop (start, end)
2159: rtx start, end;
2160: {
2161: register int level = 1;
2162: register rtx insn;
2163:
2164: unknown_address_altered = 0;
2165: loop_has_call = 0;
1.1.1.3 root 2166: loop_has_volatile = 0;
1.1 root 2167: loop_store_mems_idx = 0;
2168:
2169: num_mem_sets = 0;
2170: loops_enclosed = 1;
2171: loop_continue = 0;
2172:
2173: for (insn = NEXT_INSN (start); insn != NEXT_INSN (end);
2174: insn = NEXT_INSN (insn))
2175: {
2176: if (GET_CODE (insn) == NOTE)
2177: {
2178: if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
2179: {
2180: ++level;
2181: /* Count number of loops contained in this one. */
2182: loops_enclosed++;
2183: }
2184: else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
2185: {
2186: --level;
2187: if (level == 0)
2188: {
2189: end = insn;
2190: break;
2191: }
2192: }
2193: else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_CONT)
2194: {
2195: if (level == 1)
2196: loop_continue = insn;
2197: }
2198: }
2199: else if (GET_CODE (insn) == CALL_INSN)
2200: {
2201: unknown_address_altered = 1;
2202: loop_has_call = 1;
2203: }
2204: else
2205: {
2206: if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN)
1.1.1.3 root 2207: {
2208: if (volatile_refs_p (PATTERN (insn)))
2209: loop_has_volatile = 1;
2210:
2211: note_stores (PATTERN (insn), note_addr_stored);
2212: }
1.1 root 2213: }
2214: }
2215: }
2216:
2217: /* Scan the function looking for loops. Record the start and end of each loop.
2218: Also mark as invalid loops any loops that contain a setjmp or are branched
2219: to from outside the loop. */
2220:
2221: static void
2222: find_and_verify_loops (f)
2223: rtx f;
2224: {
1.1.1.5 root 2225: rtx insn, label;
1.1 root 2226: int current_loop = -1;
2227: int next_loop = -1;
2228: int loop;
2229:
2230: /* If there are jumps to undefined labels,
2231: treat them as jumps out of any/all loops.
2232: This also avoids writing past end of tables when there are no loops. */
2233: uid_loop_num[0] = -1;
2234:
2235: /* Find boundaries of loops, mark which loops are contained within
2236: loops, and invalidate loops that have setjmp. */
2237:
2238: for (insn = f; insn; insn = NEXT_INSN (insn))
2239: {
2240: if (GET_CODE (insn) == NOTE)
2241: switch (NOTE_LINE_NUMBER (insn))
2242: {
2243: case NOTE_INSN_LOOP_BEG:
2244: loop_number_loop_starts[++next_loop] = insn;
2245: loop_number_loop_ends[next_loop] = 0;
2246: loop_outer_loop[next_loop] = current_loop;
2247: loop_invalid[next_loop] = 0;
2248: loop_number_exit_labels[next_loop] = 0;
1.1.1.8 root 2249: loop_number_exit_count[next_loop] = 0;
1.1 root 2250: current_loop = next_loop;
2251: break;
2252:
2253: case NOTE_INSN_SETJMP:
2254: /* In this case, we must invalidate our current loop and any
2255: enclosing loop. */
2256: for (loop = current_loop; loop != -1; loop = loop_outer_loop[loop])
2257: {
2258: loop_invalid[loop] = 1;
2259: if (loop_dump_stream)
2260: fprintf (loop_dump_stream,
2261: "\nLoop at %d ignored due to setjmp.\n",
2262: INSN_UID (loop_number_loop_starts[loop]));
2263: }
2264: break;
2265:
2266: case NOTE_INSN_LOOP_END:
2267: if (current_loop == -1)
2268: abort ();
2269:
2270: loop_number_loop_ends[current_loop] = insn;
2271: current_loop = loop_outer_loop[current_loop];
2272: break;
2273:
2274: }
2275:
2276: /* Note that this will mark the NOTE_INSN_LOOP_END note as being in the
2277: enclosing loop, but this doesn't matter. */
2278: uid_loop_num[INSN_UID (insn)] = current_loop;
2279: }
2280:
1.1.1.5 root 2281: /* Any loop containing a label used in an initializer must be invalidated,
2282: because it can be jumped into from anywhere. */
2283:
2284: for (label = forced_labels; label; label = XEXP (label, 1))
2285: {
2286: int loop_num;
2287:
2288: for (loop_num = uid_loop_num[INSN_UID (XEXP (label, 0))];
2289: loop_num != -1;
2290: loop_num = loop_outer_loop[loop_num])
2291: loop_invalid[loop_num] = 1;
2292: }
2293:
2294: /* Now scan all insn's in the function. If any JUMP_INSN branches into a
2295: loop that it is not contained within, that loop is marked invalid.
2296: If any INSN or CALL_INSN uses a label's address, then the loop containing
2297: that label is marked invalid, because it could be jumped into from
2298: anywhere.
1.1 root 2299:
2300: Also look for blocks of code ending in an unconditional branch that
2301: exits the loop. If such a block is surrounded by a conditional
2302: branch around the block, move the block elsewhere (see below) and
2303: invert the jump to point to the code block. This may eliminate a
2304: label in our loop and will simplify processing by both us and a
2305: possible second cse pass. */
2306:
2307: for (insn = f; insn; insn = NEXT_INSN (insn))
1.1.1.5 root 2308: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
1.1 root 2309: {
2310: int this_loop_num = uid_loop_num[INSN_UID (insn)];
2311:
1.1.1.5 root 2312: if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
2313: {
2314: rtx note = find_reg_note (insn, REG_LABEL, NULL_RTX);
2315: if (note)
2316: {
2317: int loop_num;
2318:
2319: for (loop_num = uid_loop_num[INSN_UID (XEXP (note, 0))];
2320: loop_num != -1;
2321: loop_num = loop_outer_loop[loop_num])
2322: loop_invalid[loop_num] = 1;
2323: }
2324: }
2325:
2326: if (GET_CODE (insn) != JUMP_INSN)
2327: continue;
2328:
1.1 root 2329: mark_loop_jump (PATTERN (insn), this_loop_num);
2330:
2331: /* See if this is an unconditional branch outside the loop. */
2332: if (this_loop_num != -1
2333: && (GET_CODE (PATTERN (insn)) == RETURN
2334: || (simplejump_p (insn)
2335: && (uid_loop_num[INSN_UID (JUMP_LABEL (insn))]
1.1.1.4 root 2336: != this_loop_num)))
2337: && get_max_uid () < max_uid_for_loop)
1.1 root 2338: {
2339: rtx p;
2340: rtx our_next = next_real_insn (insn);
1.1.1.8 root 2341: int dest_loop;
2342: int outer_loop = -1;
1.1 root 2343:
2344: /* Go backwards until we reach the start of the loop, a label,
2345: or a JUMP_INSN. */
2346: for (p = PREV_INSN (insn);
2347: GET_CODE (p) != CODE_LABEL
2348: && ! (GET_CODE (p) == NOTE
2349: && NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
2350: && GET_CODE (p) != JUMP_INSN;
2351: p = PREV_INSN (p))
2352: ;
2353:
1.1.1.8 root 2354: /* Check for the case where we have a jump to an inner nested
2355: loop, and do not perform the optimization in that case. */
2356:
2357: if (JUMP_LABEL (insn))
2358: {
2359: dest_loop = uid_loop_num[INSN_UID (JUMP_LABEL (insn))];
2360: if (dest_loop != -1)
2361: {
2362: for (outer_loop = dest_loop; outer_loop != -1;
2363: outer_loop = loop_outer_loop[outer_loop])
2364: if (outer_loop == this_loop_num)
2365: break;
2366: }
2367: }
2368:
2369: /* Make sure that the target of P is within the current loop. */
2370:
2371: if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p)
2372: && uid_loop_num[INSN_UID (JUMP_LABEL (p))] != this_loop_num)
2373: outer_loop = this_loop_num;
2374:
1.1 root 2375: /* If we stopped on a JUMP_INSN to the next insn after INSN,
2376: we have a block of code to try to move.
2377:
2378: We look backward and then forward from the target of INSN
2379: to find a BARRIER at the same loop depth as the target.
2380: If we find such a BARRIER, we make a new label for the start
2381: of the block, invert the jump in P and point it to that label,
2382: and move the block of code to the spot we found. */
2383:
1.1.1.8 root 2384: if (outer_loop == -1
2385: && GET_CODE (p) == JUMP_INSN
1.1.1.4 root 2386: && JUMP_LABEL (p) != 0
2387: /* Just ignore jumps to labels that were never emitted.
2388: These always indicate compilation errors. */
2389: && INSN_UID (JUMP_LABEL (p)) != 0
2390: && condjump_p (p)
2391: && ! simplejump_p (p)
2392: && next_real_insn (JUMP_LABEL (p)) == our_next)
1.1 root 2393: {
2394: rtx target
2395: = JUMP_LABEL (insn) ? JUMP_LABEL (insn) : get_last_insn ();
2396: int target_loop_num = uid_loop_num[INSN_UID (target)];
2397: rtx loc;
2398:
2399: for (loc = target; loc; loc = PREV_INSN (loc))
2400: if (GET_CODE (loc) == BARRIER
2401: && uid_loop_num[INSN_UID (loc)] == target_loop_num)
2402: break;
2403:
2404: if (loc == 0)
2405: for (loc = target; loc; loc = NEXT_INSN (loc))
2406: if (GET_CODE (loc) == BARRIER
2407: && uid_loop_num[INSN_UID (loc)] == target_loop_num)
2408: break;
2409:
2410: if (loc)
2411: {
2412: rtx cond_label = JUMP_LABEL (p);
2413: rtx new_label = get_label_after (p);
2414:
2415: /* Ensure our label doesn't go away. */
2416: LABEL_NUSES (cond_label)++;
2417:
2418: /* Verify that uid_loop_num is large enough and that
2419: we can invert P. */
1.1.1.4 root 2420: if (invert_jump (p, new_label))
1.1 root 2421: {
2422: rtx q, r;
2423:
2424: /* Include the BARRIER after INSN and copy the
2425: block after LOC. */
1.1.1.3 root 2426: new_label = squeeze_notes (new_label, NEXT_INSN (insn));
1.1 root 2427: reorder_insns (new_label, NEXT_INSN (insn), loc);
2428:
2429: /* All those insns are now in TARGET_LOOP_NUM. */
2430: for (q = new_label; q != NEXT_INSN (NEXT_INSN (insn));
2431: q = NEXT_INSN (q))
2432: uid_loop_num[INSN_UID (q)] = target_loop_num;
2433:
2434: /* The label jumped to by INSN is no longer a loop exit.
2435: Unless INSN does not have a label (e.g., it is a
2436: RETURN insn), search loop_number_exit_labels to find
2437: its label_ref, and remove it. Also turn off
2438: LABEL_OUTSIDE_LOOP_P bit. */
2439: if (JUMP_LABEL (insn))
2440: {
1.1.1.8 root 2441: int loop_num;
2442:
1.1 root 2443: for (q = 0,
2444: r = loop_number_exit_labels[this_loop_num];
2445: r; q = r, r = LABEL_NEXTREF (r))
2446: if (XEXP (r, 0) == JUMP_LABEL (insn))
2447: {
2448: LABEL_OUTSIDE_LOOP_P (r) = 0;
2449: if (q)
2450: LABEL_NEXTREF (q) = LABEL_NEXTREF (r);
2451: else
2452: loop_number_exit_labels[this_loop_num]
2453: = LABEL_NEXTREF (r);
2454: break;
2455: }
2456:
1.1.1.8 root 2457: for (loop_num = this_loop_num;
2458: loop_num != -1 && loop_num != target_loop_num;
2459: loop_num = loop_outer_loop[loop_num])
2460: loop_number_exit_count[loop_num]--;
2461:
1.1 root 2462: /* If we didn't find it, then something is wrong. */
2463: if (! r)
2464: abort ();
2465: }
2466:
2467: /* P is now a jump outside the loop, so it must be put
2468: in loop_number_exit_labels, and marked as such.
2469: The easiest way to do this is to just call
2470: mark_loop_jump again for P. */
2471: mark_loop_jump (PATTERN (p), this_loop_num);
2472:
2473: /* If INSN now jumps to the insn after it,
2474: delete INSN. */
2475: if (JUMP_LABEL (insn) != 0
2476: && (next_real_insn (JUMP_LABEL (insn))
2477: == next_real_insn (insn)))
2478: delete_insn (insn);
2479: }
2480:
2481: /* Continue the loop after where the conditional
2482: branch used to jump, since the only branch insn
2483: in the block (if it still remains) is an inter-loop
2484: branch and hence needs no processing. */
2485: insn = NEXT_INSN (cond_label);
2486:
2487: if (--LABEL_NUSES (cond_label) == 0)
2488: delete_insn (cond_label);
1.1.1.6 root 2489:
2490: /* This loop will be continued with NEXT_INSN (insn). */
2491: insn = PREV_INSN (insn);
1.1 root 2492: }
2493: }
2494: }
2495: }
2496: }
2497:
2498: /* If any label in X jumps to a loop different from LOOP_NUM and any of the
2499: loops it is contained in, mark the target loop invalid.
2500:
2501: For speed, we assume that X is part of a pattern of a JUMP_INSN. */
2502:
2503: static void
2504: mark_loop_jump (x, loop_num)
2505: rtx x;
2506: int loop_num;
2507: {
2508: int dest_loop;
2509: int outer_loop;
2510: int i;
2511:
2512: switch (GET_CODE (x))
2513: {
2514: case PC:
2515: case USE:
2516: case CLOBBER:
2517: case REG:
2518: case MEM:
2519: case CONST_INT:
2520: case CONST_DOUBLE:
2521: case RETURN:
2522: return;
2523:
2524: case CONST:
2525: /* There could be a label reference in here. */
2526: mark_loop_jump (XEXP (x, 0), loop_num);
2527: return;
2528:
2529: case PLUS:
2530: case MINUS:
2531: case MULT:
2532: mark_loop_jump (XEXP (x, 0), loop_num);
2533: mark_loop_jump (XEXP (x, 1), loop_num);
2534: return;
2535:
2536: case SIGN_EXTEND:
2537: case ZERO_EXTEND:
2538: mark_loop_jump (XEXP (x, 0), loop_num);
2539: return;
2540:
2541: case LABEL_REF:
2542: dest_loop = uid_loop_num[INSN_UID (XEXP (x, 0))];
2543:
2544: /* Link together all labels that branch outside the loop. This
2545: is used by final_[bg]iv_value and the loop unrolling code. Also
2546: mark this LABEL_REF so we know that this branch should predict
2547: false. */
2548:
1.1.1.8 root 2549: /* A check to make sure the label is not in an inner nested loop,
2550: since this does not count as a loop exit. */
2551: if (dest_loop != -1)
2552: {
2553: for (outer_loop = dest_loop; outer_loop != -1;
2554: outer_loop = loop_outer_loop[outer_loop])
2555: if (outer_loop == loop_num)
2556: break;
2557: }
2558: else
2559: outer_loop = -1;
2560:
2561: if (loop_num != -1 && outer_loop == -1)
1.1 root 2562: {
2563: LABEL_OUTSIDE_LOOP_P (x) = 1;
2564: LABEL_NEXTREF (x) = loop_number_exit_labels[loop_num];
2565: loop_number_exit_labels[loop_num] = x;
1.1.1.8 root 2566:
2567: for (outer_loop = loop_num;
2568: outer_loop != -1 && outer_loop != dest_loop;
2569: outer_loop = loop_outer_loop[outer_loop])
2570: loop_number_exit_count[outer_loop]++;
1.1 root 2571: }
2572:
2573: /* If this is inside a loop, but not in the current loop or one enclosed
2574: by it, it invalidates at least one loop. */
2575:
2576: if (dest_loop == -1)
2577: return;
2578:
2579: /* We must invalidate every nested loop containing the target of this
2580: label, except those that also contain the jump insn. */
2581:
2582: for (; dest_loop != -1; dest_loop = loop_outer_loop[dest_loop])
2583: {
2584: /* Stop when we reach a loop that also contains the jump insn. */
2585: for (outer_loop = loop_num; outer_loop != -1;
2586: outer_loop = loop_outer_loop[outer_loop])
2587: if (dest_loop == outer_loop)
2588: return;
2589:
2590: /* If we get here, we know we need to invalidate a loop. */
2591: if (loop_dump_stream && ! loop_invalid[dest_loop])
2592: fprintf (loop_dump_stream,
2593: "\nLoop at %d ignored due to multiple entry points.\n",
2594: INSN_UID (loop_number_loop_starts[dest_loop]));
2595:
2596: loop_invalid[dest_loop] = 1;
2597: }
2598: return;
2599:
2600: case SET:
2601: /* If this is not setting pc, ignore. */
2602: if (SET_DEST (x) == pc_rtx)
2603: mark_loop_jump (SET_SRC (x), loop_num);
2604: return;
2605:
2606: case IF_THEN_ELSE:
2607: mark_loop_jump (XEXP (x, 1), loop_num);
2608: mark_loop_jump (XEXP (x, 2), loop_num);
2609: return;
2610:
2611: case PARALLEL:
2612: case ADDR_VEC:
2613: for (i = 0; i < XVECLEN (x, 0); i++)
2614: mark_loop_jump (XVECEXP (x, 0, i), loop_num);
2615: return;
2616:
2617: case ADDR_DIFF_VEC:
2618: for (i = 0; i < XVECLEN (x, 1); i++)
2619: mark_loop_jump (XVECEXP (x, 1, i), loop_num);
2620: return;
2621:
2622: default:
1.1.1.6 root 2623: /* Treat anything else (such as a symbol_ref)
2624: as a branch out of this loop, but not into any loop. */
2625:
2626: if (loop_num != -1)
2627: {
2628: loop_number_exit_labels[loop_num] = x;
2629:
1.1.1.8 root 2630: for (outer_loop = loop_num; outer_loop != -1;
2631: outer_loop = loop_outer_loop[outer_loop])
2632: loop_number_exit_count[outer_loop]++;
2633: }
1.1.1.6 root 2634: return;
1.1 root 2635: }
2636: }
2637:
2638: /* Return nonzero if there is a label in the range from
2639: insn INSN to and including the insn whose luid is END
2640: INSN must have an assigned luid (i.e., it must not have
2641: been previously created by loop.c). */
2642:
2643: static int
2644: labels_in_range_p (insn, end)
2645: rtx insn;
2646: int end;
2647: {
2648: while (insn && INSN_LUID (insn) <= end)
2649: {
2650: if (GET_CODE (insn) == CODE_LABEL)
2651: return 1;
2652: insn = NEXT_INSN (insn);
2653: }
2654:
2655: return 0;
2656: }
2657:
2658: /* Record that a memory reference X is being set. */
2659:
2660: static void
2661: note_addr_stored (x)
2662: rtx x;
2663: {
2664: register int i;
2665:
2666: if (x == 0 || GET_CODE (x) != MEM)
2667: return;
2668:
2669: /* Count number of memory writes.
2670: This affects heuristics in strength_reduce. */
2671: num_mem_sets++;
2672:
1.1.1.7 root 2673: /* BLKmode MEM means all memory is clobbered. */
2674: if (GET_MODE (x) == BLKmode)
2675: unknown_address_altered = 1;
2676:
1.1 root 2677: if (unknown_address_altered)
2678: return;
2679:
2680: for (i = 0; i < loop_store_mems_idx; i++)
2681: if (rtx_equal_p (XEXP (loop_store_mems[i], 0), XEXP (x, 0))
2682: && MEM_IN_STRUCT_P (x) == MEM_IN_STRUCT_P (loop_store_mems[i]))
2683: {
2684: /* We are storing at the same address as previously noted. Save the
1.1.1.7 root 2685: wider reference. */
2686: if (GET_MODE_SIZE (GET_MODE (x))
2687: > GET_MODE_SIZE (GET_MODE (loop_store_mems[i])))
1.1 root 2688: loop_store_mems[i] = x;
2689: break;
2690: }
2691:
2692: if (i == NUM_STORES)
2693: unknown_address_altered = 1;
2694:
2695: else if (i == loop_store_mems_idx)
2696: loop_store_mems[loop_store_mems_idx++] = x;
2697: }
2698:
2699: /* Return nonzero if the rtx X is invariant over the current loop.
2700:
2701: The value is 2 if we refer to something only conditionally invariant.
2702:
2703: If `unknown_address_altered' is nonzero, no memory ref is invariant.
2704: Otherwise, a memory ref is invariant if it does not conflict with
2705: anything stored in `loop_store_mems'. */
2706:
2707: int
2708: invariant_p (x)
2709: register rtx x;
2710: {
2711: register int i;
2712: register enum rtx_code code;
2713: register char *fmt;
2714: int conditional = 0;
2715:
2716: if (x == 0)
2717: return 1;
2718: code = GET_CODE (x);
2719: switch (code)
2720: {
2721: case CONST_INT:
2722: case CONST_DOUBLE:
2723: case SYMBOL_REF:
2724: case CONST:
2725: return 1;
2726:
2727: case LABEL_REF:
2728: /* A LABEL_REF is normally invariant, however, if we are unrolling
2729: loops, and this label is inside the loop, then it isn't invariant.
2730: This is because each unrolled copy of the loop body will have
2731: a copy of this label. If this was invariant, then an insn loading
2732: the address of this label into a register might get moved outside
2733: the loop, and then each loop body would end up using the same label.
2734:
2735: We don't know the loop bounds here though, so just fail for all
2736: labels. */
2737: if (flag_unroll_loops)
2738: return 0;
2739: else
2740: return 1;
2741:
2742: case PC:
2743: case CC0:
2744: case UNSPEC_VOLATILE:
2745: return 0;
2746:
2747: case REG:
2748: /* We used to check RTX_UNCHANGING_P (x) here, but that is invalid
2749: since the reg might be set by initialization within the loop. */
1.1.1.6 root 2750: if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
2751: || x == arg_pointer_rtx)
1.1 root 2752: return 1;
2753: if (loop_has_call
2754: && REGNO (x) < FIRST_PSEUDO_REGISTER && call_used_regs[REGNO (x)])
2755: return 0;
2756: if (n_times_set[REGNO (x)] < 0)
2757: return 2;
2758: return n_times_set[REGNO (x)] == 0;
2759:
2760: case MEM:
1.1.1.8 root 2761: /* Volatile memory references must be rejected. Do this before
2762: checking for read-only items, so that volatile read-only items
2763: will be rejected also. */
2764: if (MEM_VOLATILE_P (x))
2765: return 0;
2766:
1.1 root 2767: /* Read-only items (such as constants in a constant pool) are
2768: invariant if their address is. */
2769: if (RTX_UNCHANGING_P (x))
2770: break;
2771:
2772: /* If we filled the table (or had a subroutine call), any location
2773: in memory could have been clobbered. */
1.1.1.8 root 2774: if (unknown_address_altered)
1.1 root 2775: return 0;
2776:
2777: /* See if there is any dependence between a store and this load. */
2778: for (i = loop_store_mems_idx - 1; i >= 0; i--)
2779: if (true_dependence (loop_store_mems[i], x))
2780: return 0;
2781:
2782: /* It's not invalidated by a store in memory
2783: but we must still verify the address is invariant. */
2784: break;
2785:
2786: case ASM_OPERANDS:
2787: /* Don't mess with insns declared volatile. */
2788: if (MEM_VOLATILE_P (x))
2789: return 0;
2790: }
2791:
2792: fmt = GET_RTX_FORMAT (code);
2793: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2794: {
2795: if (fmt[i] == 'e')
2796: {
2797: int tem = invariant_p (XEXP (x, i));
2798: if (tem == 0)
2799: return 0;
2800: if (tem == 2)
2801: conditional = 1;
2802: }
2803: else if (fmt[i] == 'E')
2804: {
2805: register int j;
2806: for (j = 0; j < XVECLEN (x, i); j++)
2807: {
2808: int tem = invariant_p (XVECEXP (x, i, j));
2809: if (tem == 0)
2810: return 0;
2811: if (tem == 2)
2812: conditional = 1;
2813: }
2814:
2815: }
2816: }
2817:
2818: return 1 + conditional;
2819: }
2820:
2821:
2822: /* Return nonzero if all the insns in the loop that set REG
2823: are INSN and the immediately following insns,
2824: and if each of those insns sets REG in an invariant way
2825: (not counting uses of REG in them).
2826:
2827: The value is 2 if some of these insns are only conditionally invariant.
2828:
2829: We assume that INSN itself is the first set of REG
2830: and that its source is invariant. */
2831:
2832: static int
2833: consec_sets_invariant_p (reg, n_sets, insn)
2834: int n_sets;
2835: rtx reg, insn;
2836: {
2837: register rtx p = insn;
2838: register int regno = REGNO (reg);
2839: rtx temp;
2840: /* Number of sets we have to insist on finding after INSN. */
2841: int count = n_sets - 1;
2842: int old = n_times_set[regno];
2843: int value = 0;
2844: int this;
2845:
2846: /* If N_SETS hit the limit, we can't rely on its value. */
2847: if (n_sets == 127)
2848: return 0;
2849:
2850: n_times_set[regno] = 0;
2851:
2852: while (count > 0)
2853: {
2854: register enum rtx_code code;
2855: rtx set;
2856:
2857: p = NEXT_INSN (p);
2858: code = GET_CODE (p);
2859:
2860: /* If library call, skip to end of of it. */
1.1.1.4 root 2861: if (code == INSN && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
1.1 root 2862: p = XEXP (temp, 0);
2863:
2864: this = 0;
2865: if (code == INSN
2866: && (set = single_set (p))
2867: && GET_CODE (SET_DEST (set)) == REG
2868: && REGNO (SET_DEST (set)) == regno)
2869: {
2870: this = invariant_p (SET_SRC (set));
2871: if (this != 0)
2872: value |= this;
1.1.1.4 root 2873: else if (temp = find_reg_note (p, REG_EQUAL, NULL_RTX))
1.1 root 2874: {
1.1.1.5 root 2875: /* If this is a libcall, then any invariant REG_EQUAL note is OK.
2876: If this is an ordinary insn, then only CONSTANT_P REG_EQUAL
2877: notes are OK. */
2878: this = (CONSTANT_P (XEXP (temp, 0))
2879: || (find_reg_note (p, REG_RETVAL, NULL_RTX)
2880: && invariant_p (XEXP (temp, 0))));
1.1 root 2881: if (this != 0)
2882: value |= this;
2883: }
2884: }
2885: if (this != 0)
2886: count--;
2887: else if (code != NOTE)
2888: {
2889: n_times_set[regno] = old;
2890: return 0;
2891: }
2892: }
2893:
2894: n_times_set[regno] = old;
2895: /* If invariant_p ever returned 2, we return 2. */
2896: return 1 + (value & 2);
2897: }
2898:
2899: #if 0
2900: /* I don't think this condition is sufficient to allow INSN
2901: to be moved, so we no longer test it. */
2902:
2903: /* Return 1 if all insns in the basic block of INSN and following INSN
2904: that set REG are invariant according to TABLE. */
2905:
2906: static int
2907: all_sets_invariant_p (reg, insn, table)
2908: rtx reg, insn;
2909: short *table;
2910: {
2911: register rtx p = insn;
2912: register int regno = REGNO (reg);
2913:
2914: while (1)
2915: {
2916: register enum rtx_code code;
2917: p = NEXT_INSN (p);
2918: code = GET_CODE (p);
2919: if (code == CODE_LABEL || code == JUMP_INSN)
2920: return 1;
2921: if (code == INSN && GET_CODE (PATTERN (p)) == SET
2922: && GET_CODE (SET_DEST (PATTERN (p))) == REG
2923: && REGNO (SET_DEST (PATTERN (p))) == regno)
2924: {
2925: if (!invariant_p (SET_SRC (PATTERN (p)), table))
2926: return 0;
2927: }
2928: }
2929: }
2930: #endif /* 0 */
2931:
2932: /* Look at all uses (not sets) of registers in X. For each, if it is
2933: the single use, set USAGE[REGNO] to INSN; if there was a previous use in
2934: a different insn, set USAGE[REGNO] to const0_rtx. */
2935:
2936: static void
2937: find_single_use_in_loop (insn, x, usage)
2938: rtx insn;
2939: rtx x;
2940: rtx *usage;
2941: {
2942: enum rtx_code code = GET_CODE (x);
2943: char *fmt = GET_RTX_FORMAT (code);
2944: int i, j;
2945:
2946: if (code == REG)
2947: usage[REGNO (x)]
2948: = (usage[REGNO (x)] != 0 && usage[REGNO (x)] != insn)
2949: ? const0_rtx : insn;
2950:
2951: else if (code == SET)
2952: {
2953: /* Don't count SET_DEST if it is a REG; otherwise count things
2954: in SET_DEST because if a register is partially modified, it won't
2955: show up as a potential movable so we don't care how USAGE is set
2956: for it. */
2957: if (GET_CODE (SET_DEST (x)) != REG)
2958: find_single_use_in_loop (insn, SET_DEST (x), usage);
2959: find_single_use_in_loop (insn, SET_SRC (x), usage);
2960: }
2961: else
2962: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2963: {
2964: if (fmt[i] == 'e' && XEXP (x, i) != 0)
2965: find_single_use_in_loop (insn, XEXP (x, i), usage);
2966: else if (fmt[i] == 'E')
2967: for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2968: find_single_use_in_loop (insn, XVECEXP (x, i, j), usage);
2969: }
2970: }
2971:
2972: /* Increment N_TIMES_SET at the index of each register
2973: that is modified by an insn between FROM and TO.
2974: If the value of an element of N_TIMES_SET becomes 127 or more,
2975: stop incrementing it, to avoid overflow.
2976:
2977: Store in SINGLE_USAGE[I] the single insn in which register I is
2978: used, if it is only used once. Otherwise, it is set to 0 (for no
2979: uses) or const0_rtx for more than one use. This parameter may be zero,
2980: in which case this processing is not done.
2981:
2982: Store in *COUNT_PTR the number of actual instruction
2983: in the loop. We use this to decide what is worth moving out. */
2984:
2985: /* last_set[n] is nonzero iff reg n has been set in the current basic block.
2986: In that case, it is the insn that last set reg n. */
2987:
2988: static void
2989: count_loop_regs_set (from, to, may_not_move, single_usage, count_ptr, nregs)
2990: register rtx from, to;
2991: char *may_not_move;
2992: rtx *single_usage;
2993: int *count_ptr;
2994: int nregs;
2995: {
2996: register rtx *last_set = (rtx *) alloca (nregs * sizeof (rtx));
2997: register rtx insn;
2998: register int count = 0;
2999: register rtx dest;
3000:
1.1.1.7 root 3001: bzero ((char *) last_set, nregs * sizeof (rtx));
1.1 root 3002: for (insn = from; insn != to; insn = NEXT_INSN (insn))
3003: {
3004: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
3005: {
3006: ++count;
3007:
3008: /* If requested, record registers that have exactly one use. */
3009: if (single_usage)
3010: {
3011: find_single_use_in_loop (insn, PATTERN (insn), single_usage);
3012:
3013: /* Include uses in REG_EQUAL notes. */
3014: if (REG_NOTES (insn))
3015: find_single_use_in_loop (insn, REG_NOTES (insn), single_usage);
3016: }
3017:
3018: if (GET_CODE (PATTERN (insn)) == CLOBBER
3019: && GET_CODE (XEXP (PATTERN (insn), 0)) == REG)
3020: /* Don't move a reg that has an explicit clobber.
3021: We might do so sometimes, but it's not worth the pain. */
3022: may_not_move[REGNO (XEXP (PATTERN (insn), 0))] = 1;
3023:
3024: if (GET_CODE (PATTERN (insn)) == SET
3025: || GET_CODE (PATTERN (insn)) == CLOBBER)
3026: {
3027: dest = SET_DEST (PATTERN (insn));
3028: while (GET_CODE (dest) == SUBREG
3029: || GET_CODE (dest) == ZERO_EXTRACT
3030: || GET_CODE (dest) == SIGN_EXTRACT
3031: || GET_CODE (dest) == STRICT_LOW_PART)
3032: dest = XEXP (dest, 0);
3033: if (GET_CODE (dest) == REG)
3034: {
3035: register int regno = REGNO (dest);
3036: /* If this is the first setting of this reg
3037: in current basic block, and it was set before,
3038: it must be set in two basic blocks, so it cannot
3039: be moved out of the loop. */
3040: if (n_times_set[regno] > 0 && last_set[regno] == 0)
3041: may_not_move[regno] = 1;
3042: /* If this is not first setting in current basic block,
3043: see if reg was used in between previous one and this.
3044: If so, neither one can be moved. */
3045: if (last_set[regno] != 0
3046: && reg_used_between_p (dest, last_set[regno], insn))
3047: may_not_move[regno] = 1;
3048: if (n_times_set[regno] < 127)
3049: ++n_times_set[regno];
3050: last_set[regno] = insn;
3051: }
3052: }
3053: else if (GET_CODE (PATTERN (insn)) == PARALLEL)
3054: {
3055: register int i;
3056: for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
3057: {
3058: register rtx x = XVECEXP (PATTERN (insn), 0, i);
3059: if (GET_CODE (x) == CLOBBER && GET_CODE (XEXP (x, 0)) == REG)
3060: /* Don't move a reg that has an explicit clobber.
3061: It's not worth the pain to try to do it correctly. */
3062: may_not_move[REGNO (XEXP (x, 0))] = 1;
3063:
3064: if (GET_CODE (x) == SET || GET_CODE (x) == CLOBBER)
3065: {
3066: dest = SET_DEST (x);
3067: while (GET_CODE (dest) == SUBREG
3068: || GET_CODE (dest) == ZERO_EXTRACT
3069: || GET_CODE (dest) == SIGN_EXTRACT
3070: || GET_CODE (dest) == STRICT_LOW_PART)
3071: dest = XEXP (dest, 0);
3072: if (GET_CODE (dest) == REG)
3073: {
3074: register int regno = REGNO (dest);
3075: if (n_times_set[regno] > 0 && last_set[regno] == 0)
3076: may_not_move[regno] = 1;
3077: if (last_set[regno] != 0
3078: && reg_used_between_p (dest, last_set[regno], insn))
3079: may_not_move[regno] = 1;
3080: if (n_times_set[regno] < 127)
3081: ++n_times_set[regno];
3082: last_set[regno] = insn;
3083: }
3084: }
3085: }
3086: }
3087: }
1.1.1.7 root 3088:
1.1 root 3089: if (GET_CODE (insn) == CODE_LABEL || GET_CODE (insn) == JUMP_INSN)
1.1.1.7 root 3090: bzero ((char *) last_set, nregs * sizeof (rtx));
1.1 root 3091: }
3092: *count_ptr = count;
3093: }
3094:
3095: /* Given a loop that is bounded by LOOP_START and LOOP_END
3096: and that is entered at SCAN_START,
3097: return 1 if the register set in SET contained in insn INSN is used by
3098: any insn that precedes INSN in cyclic order starting
3099: from the loop entry point.
3100:
3101: We don't want to use INSN_LUID here because if we restrict INSN to those
3102: that have a valid INSN_LUID, it means we cannot move an invariant out
3103: from an inner loop past two loops. */
3104:
3105: static int
3106: loop_reg_used_before_p (set, insn, loop_start, scan_start, loop_end)
3107: rtx set, insn, loop_start, scan_start, loop_end;
3108: {
3109: rtx reg = SET_DEST (set);
3110: rtx p;
3111:
3112: /* Scan forward checking for register usage. If we hit INSN, we
3113: are done. Otherwise, if we hit LOOP_END, wrap around to LOOP_START. */
3114: for (p = scan_start; p != insn; p = NEXT_INSN (p))
3115: {
3116: if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
3117: && reg_overlap_mentioned_p (reg, PATTERN (p)))
3118: return 1;
3119:
3120: if (p == loop_end)
3121: p = loop_start;
3122: }
3123:
3124: return 0;
3125: }
3126:
3127: /* A "basic induction variable" or biv is a pseudo reg that is set
3128: (within this loop) only by incrementing or decrementing it. */
3129: /* A "general induction variable" or giv is a pseudo reg whose
3130: value is a linear function of a biv. */
3131:
3132: /* Bivs are recognized by `basic_induction_var';
3133: Givs by `general_induct_var'. */
3134:
3135: /* Indexed by register number, indicates whether or not register is an
3136: induction variable, and if so what type. */
3137:
3138: enum iv_mode *reg_iv_type;
3139:
3140: /* Indexed by register number, contains pointer to `struct induction'
3141: if register is an induction variable. This holds general info for
3142: all induction variables. */
3143:
3144: struct induction **reg_iv_info;
3145:
3146: /* Indexed by register number, contains pointer to `struct iv_class'
3147: if register is a basic induction variable. This holds info describing
3148: the class (a related group) of induction variables that the biv belongs
3149: to. */
3150:
3151: struct iv_class **reg_biv_class;
3152:
3153: /* The head of a list which links together (via the next field)
3154: every iv class for the current loop. */
3155:
3156: struct iv_class *loop_iv_list;
3157:
3158: /* Communication with routines called via `note_stores'. */
3159:
3160: static rtx note_insn;
3161:
3162: /* Dummy register to have non-zero DEST_REG for DEST_ADDR type givs. */
3163:
3164: static rtx addr_placeholder;
3165:
3166: /* ??? Unfinished optimizations, and possible future optimizations,
3167: for the strength reduction code. */
3168:
3169: /* ??? There is one more optimization you might be interested in doing: to
3170: allocate pseudo registers for frequently-accessed memory locations.
3171: If the same memory location is referenced each time around, it might
3172: be possible to copy it into a register before and out after.
3173: This is especially useful when the memory location is a variable which
3174: is in a stack slot because somewhere its address is taken. If the
3175: loop doesn't contain a function call and the variable isn't volatile,
3176: it is safe to keep the value in a register for the duration of the
3177: loop. One tricky thing is that the copying of the value back from the
3178: register has to be done on all exits from the loop. You need to check that
3179: all the exits from the loop go to the same place. */
3180:
3181: /* ??? The interaction of biv elimination, and recognition of 'constant'
3182: bivs, may cause problems. */
3183:
3184: /* ??? Add heuristics so that DEST_ADDR strength reduction does not cause
3185: performance problems.
3186:
3187: Perhaps don't eliminate things that can be combined with an addressing
3188: mode. Find all givs that have the same biv, mult_val, and add_val;
3189: then for each giv, check to see if its only use dies in a following
3190: memory address. If so, generate a new memory address and check to see
3191: if it is valid. If it is valid, then store the modified memory address,
3192: otherwise, mark the giv as not done so that it will get its own iv. */
3193:
3194: /* ??? Could try to optimize branches when it is known that a biv is always
3195: positive. */
3196:
3197: /* ??? When replace a biv in a compare insn, we should replace with closest
3198: giv so that an optimized branch can still be recognized by the combiner,
3199: e.g. the VAX acb insn. */
3200:
3201: /* ??? Many of the checks involving uid_luid could be simplified if regscan
3202: was rerun in loop_optimize whenever a register was added or moved.
3203: Also, some of the optimizations could be a little less conservative. */
3204:
3205: /* Perform strength reduction and induction variable elimination. */
3206:
3207: /* Pseudo registers created during this function will be beyond the last
3208: valid index in several tables including n_times_set and regno_last_uid.
3209: This does not cause a problem here, because the added registers cannot be
3210: givs outside of their loop, and hence will never be reconsidered.
3211: But scan_loop must check regnos to make sure they are in bounds. */
3212:
3213: static void
3214: strength_reduce (scan_start, end, loop_top, insn_count,
3215: loop_start, loop_end)
3216: rtx scan_start;
3217: rtx end;
3218: rtx loop_top;
3219: int insn_count;
3220: rtx loop_start;
3221: rtx loop_end;
3222: {
3223: rtx p;
3224: rtx set;
3225: rtx inc_val;
3226: rtx mult_val;
3227: rtx dest_reg;
3228: /* This is 1 if current insn is not executed at least once for every loop
3229: iteration. */
3230: int not_every_iteration = 0;
1.1.1.3 root 3231: /* This is 1 if current insn may be executed more than once for every
3232: loop iteration. */
3233: int maybe_multiple = 0;
1.1 root 3234: /* Temporary list pointers for traversing loop_iv_list. */
3235: struct iv_class *bl, **backbl;
3236: /* Ratio of extra register life span we can justify
3237: for saving an instruction. More if loop doesn't call subroutines
3238: since in that case saving an insn makes more difference
3239: and more registers are available. */
3240: /* ??? could set this to last value of threshold in move_movables */
3241: int threshold = (loop_has_call ? 1 : 2) * (3 + n_non_fixed_regs);
3242: /* Map of pseudo-register replacements. */
3243: rtx *reg_map;
3244: int call_seen;
3245: rtx test;
3246: rtx end_insert_before;
1.1.1.7 root 3247: int loop_depth = 0;
1.1 root 3248:
3249: reg_iv_type = (enum iv_mode *) alloca (max_reg_before_loop
3250: * sizeof (enum iv_mode *));
3251: bzero ((char *) reg_iv_type, max_reg_before_loop * sizeof (enum iv_mode *));
3252: reg_iv_info = (struct induction **)
3253: alloca (max_reg_before_loop * sizeof (struct induction *));
3254: bzero ((char *) reg_iv_info, (max_reg_before_loop
3255: * sizeof (struct induction *)));
3256: reg_biv_class = (struct iv_class **)
3257: alloca (max_reg_before_loop * sizeof (struct iv_class *));
3258: bzero ((char *) reg_biv_class, (max_reg_before_loop
3259: * sizeof (struct iv_class *)));
3260:
3261: loop_iv_list = 0;
3262: addr_placeholder = gen_reg_rtx (Pmode);
3263:
3264: /* Save insn immediately after the loop_end. Insns inserted after loop_end
3265: must be put before this insn, so that they will appear in the right
1.1.1.5 root 3266: order (i.e. loop order).
1.1 root 3267:
1.1.1.5 root 3268: If loop_end is the end of the current function, then emit a
3269: NOTE_INSN_DELETED after loop_end and set end_insert_before to the
3270: dummy note insn. */
3271: if (NEXT_INSN (loop_end) != 0)
3272: end_insert_before = NEXT_INSN (loop_end);
3273: else
3274: end_insert_before = emit_note_after (NOTE_INSN_DELETED, loop_end);
1.1 root 3275:
3276: /* Scan through loop to find all possible bivs. */
3277:
3278: p = scan_start;
3279: while (1)
3280: {
3281: p = NEXT_INSN (p);
3282: /* At end of a straight-in loop, we are done.
3283: At end of a loop entered at the bottom, scan the top. */
3284: if (p == scan_start)
3285: break;
3286: if (p == end)
3287: {
3288: if (loop_top != 0)
1.1.1.7 root 3289: p = loop_top;
1.1 root 3290: else
3291: break;
3292: if (p == scan_start)
3293: break;
3294: }
3295:
3296: if (GET_CODE (p) == INSN
3297: && (set = single_set (p))
3298: && GET_CODE (SET_DEST (set)) == REG)
3299: {
3300: dest_reg = SET_DEST (set);
3301: if (REGNO (dest_reg) < max_reg_before_loop
3302: && REGNO (dest_reg) >= FIRST_PSEUDO_REGISTER
3303: && reg_iv_type[REGNO (dest_reg)] != NOT_BASIC_INDUCT)
3304: {
1.1.1.6 root 3305: if (basic_induction_var (SET_SRC (set), GET_MODE (SET_SRC (set)),
3306: dest_reg, p, &inc_val, &mult_val))
1.1 root 3307: {
3308: /* It is a possible basic induction variable.
3309: Create and initialize an induction structure for it. */
3310:
3311: struct induction *v
3312: = (struct induction *) alloca (sizeof (struct induction));
3313:
3314: record_biv (v, p, dest_reg, inc_val, mult_val,
1.1.1.3 root 3315: not_every_iteration, maybe_multiple);
1.1 root 3316: reg_iv_type[REGNO (dest_reg)] = BASIC_INDUCT;
3317: }
3318: else if (REGNO (dest_reg) < max_reg_before_loop)
3319: reg_iv_type[REGNO (dest_reg)] = NOT_BASIC_INDUCT;
3320: }
3321: }
3322:
1.1.1.3 root 3323: /* Past CODE_LABEL, we get to insns that may be executed multiple
3324: times. The only way we can be sure that they can't is if every
3325: every jump insn between here and the end of the loop either
3326: returns, exits the loop, or is a forward jump. */
3327:
3328: if (GET_CODE (p) == CODE_LABEL)
3329: {
3330: rtx insn = p;
3331:
3332: maybe_multiple = 0;
3333:
3334: while (1)
3335: {
3336: insn = NEXT_INSN (insn);
3337: if (insn == scan_start)
3338: break;
3339: if (insn == end)
3340: {
3341: if (loop_top != 0)
1.1.1.7 root 3342: insn = loop_top;
1.1.1.3 root 3343: else
3344: break;
3345: if (insn == scan_start)
3346: break;
3347: }
3348:
3349: if (GET_CODE (insn) == JUMP_INSN
3350: && GET_CODE (PATTERN (insn)) != RETURN
3351: && (! condjump_p (insn)
3352: || (JUMP_LABEL (insn) != 0
3353: && (INSN_UID (JUMP_LABEL (insn)) >= max_uid_for_loop
3354: || INSN_UID (insn) >= max_uid_for_loop
3355: || (INSN_LUID (JUMP_LABEL (insn))
3356: < INSN_LUID (insn))))))
3357: {
3358: maybe_multiple = 1;
3359: break;
3360: }
3361: }
3362: }
3363:
1.1 root 3364: /* Past a label or a jump, we get to insns for which we can't count
3365: on whether or how many times they will be executed during each
3366: iteration. */
3367: /* This code appears in three places, once in scan_loop, and twice
3368: in strength_reduce. */
3369: if ((GET_CODE (p) == CODE_LABEL || GET_CODE (p) == JUMP_INSN)
3370: /* If we enter the loop in the middle, and scan around to the
3371: beginning, don't set not_every_iteration for that.
3372: This can be any kind of jump, since we want to know if insns
3373: will be executed if the loop is executed. */
3374: && ! (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p) == loop_top
3375: && ((NEXT_INSN (NEXT_INSN (p)) == loop_end && simplejump_p (p))
3376: || (NEXT_INSN (p) == loop_end && condjump_p (p)))))
3377: not_every_iteration = 1;
3378:
1.1.1.7 root 3379: else if (GET_CODE (p) == NOTE)
3380: {
3381: /* At the virtual top of a converted loop, insns are again known to
3382: be executed each iteration: logically, the loop begins here
3383: even though the exit code has been duplicated. */
3384: if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_VTOP && loop_depth == 0)
3385: not_every_iteration = 0;
3386: else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
3387: loop_depth++;
3388: else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END)
3389: loop_depth--;
3390: }
1.1 root 3391:
3392: /* Unlike in the code motion pass where MAYBE_NEVER indicates that
3393: an insn may never be executed, NOT_EVERY_ITERATION indicates whether
3394: or not an insn is known to be executed each iteration of the
3395: loop, whether or not any iterations are known to occur.
3396:
3397: Therefore, if we have just passed a label and have no more labels
3398: between here and the test insn of the loop, we know these insns
3399: will be executed each iteration. This can also happen if we
3400: have just passed a jump, for example, when there are nested loops. */
3401:
3402: if (not_every_iteration && GET_CODE (p) == CODE_LABEL
3403: && no_labels_between_p (p, loop_end))
3404: not_every_iteration = 0;
3405: }
3406:
3407: /* Scan loop_iv_list to remove all regs that proved not to be bivs.
3408: Make a sanity check against n_times_set. */
3409: for (backbl = &loop_iv_list, bl = *backbl; bl; bl = bl->next)
3410: {
3411: if (reg_iv_type[bl->regno] != BASIC_INDUCT
3412: /* Above happens if register modified by subreg, etc. */
3413: /* Make sure it is not recognized as a basic induction var: */
3414: || n_times_set[bl->regno] != bl->biv_count
3415: /* If never incremented, it is invariant that we decided not to
3416: move. So leave it alone. */
3417: || ! bl->incremented)
3418: {
3419: if (loop_dump_stream)
3420: fprintf (loop_dump_stream, "Reg %d: biv discarded, %s\n",
3421: bl->regno,
3422: (reg_iv_type[bl->regno] != BASIC_INDUCT
3423: ? "not induction variable"
3424: : (! bl->incremented ? "never incremented"
3425: : "count error")));
3426:
3427: reg_iv_type[bl->regno] = NOT_BASIC_INDUCT;
3428: *backbl = bl->next;
3429: }
3430: else
3431: {
3432: backbl = &bl->next;
3433:
3434: if (loop_dump_stream)
3435: fprintf (loop_dump_stream, "Reg %d: biv verified\n", bl->regno);
3436: }
3437: }
3438:
3439: /* Exit if there are no bivs. */
3440: if (! loop_iv_list)
3441: {
3442: /* Can still unroll the loop anyways, but indicate that there is no
3443: strength reduction info available. */
3444: if (flag_unroll_loops)
3445: unroll_loop (loop_end, insn_count, loop_start, end_insert_before, 0);
3446:
3447: return;
3448: }
3449:
3450: /* Find initial value for each biv by searching backwards from loop_start,
3451: halting at first label. Also record any test condition. */
3452:
3453: call_seen = 0;
3454: for (p = loop_start; p && GET_CODE (p) != CODE_LABEL; p = PREV_INSN (p))
3455: {
3456: note_insn = p;
3457:
3458: if (GET_CODE (p) == CALL_INSN)
3459: call_seen = 1;
3460:
3461: if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
3462: || GET_CODE (p) == CALL_INSN)
3463: note_stores (PATTERN (p), record_initial);
3464:
3465: /* Record any test of a biv that branches around the loop if no store
3466: between it and the start of loop. We only care about tests with
3467: constants and registers and only certain of those. */
3468: if (GET_CODE (p) == JUMP_INSN
3469: && JUMP_LABEL (p) != 0
3470: && next_real_insn (JUMP_LABEL (p)) == next_real_insn (loop_end)
3471: && (test = get_condition_for_loop (p)) != 0
3472: && GET_CODE (XEXP (test, 0)) == REG
3473: && REGNO (XEXP (test, 0)) < max_reg_before_loop
3474: && (bl = reg_biv_class[REGNO (XEXP (test, 0))]) != 0
3475: && valid_initial_value_p (XEXP (test, 1), p, call_seen, loop_start)
3476: && bl->init_insn == 0)
3477: {
3478: /* If an NE test, we have an initial value! */
3479: if (GET_CODE (test) == NE)
3480: {
3481: bl->init_insn = p;
3482: bl->init_set = gen_rtx (SET, VOIDmode,
3483: XEXP (test, 0), XEXP (test, 1));
3484: }
3485: else
3486: bl->initial_test = test;
3487: }
3488: }
3489:
3490: /* Look at the each biv and see if we can say anything better about its
3491: initial value from any initializing insns set up above. (This is done
3492: in two passes to avoid missing SETs in a PARALLEL.) */
3493: for (bl = loop_iv_list; bl; bl = bl->next)
3494: {
3495: rtx src;
3496:
3497: if (! bl->init_insn)
3498: continue;
3499:
3500: src = SET_SRC (bl->init_set);
3501:
3502: if (loop_dump_stream)
3503: fprintf (loop_dump_stream,
3504: "Biv %d initialized at insn %d: initial value ",
3505: bl->regno, INSN_UID (bl->init_insn));
3506:
1.1.1.6 root 3507: if ((GET_MODE (src) == GET_MODE (regno_reg_rtx[bl->regno])
3508: || GET_MODE (src) == VOIDmode)
3509: && valid_initial_value_p (src, bl->init_insn, call_seen, loop_start))
1.1 root 3510: {
3511: bl->initial_value = src;
3512:
3513: if (loop_dump_stream)
3514: {
3515: if (GET_CODE (src) == CONST_INT)
3516: fprintf (loop_dump_stream, "%d\n", INTVAL (src));
3517: else
3518: {
3519: print_rtl (loop_dump_stream, src);
3520: fprintf (loop_dump_stream, "\n");
3521: }
3522: }
3523: }
3524: else
3525: {
3526: /* Biv initial value is not simple move,
1.1.1.2 root 3527: so let it keep initial value of "itself". */
1.1 root 3528:
3529: if (loop_dump_stream)
3530: fprintf (loop_dump_stream, "is complex\n");
3531: }
3532: }
3533:
3534: /* Search the loop for general induction variables. */
3535:
3536: /* A register is a giv if: it is only set once, it is a function of a
3537: biv and a constant (or invariant), and it is not a biv. */
3538:
3539: not_every_iteration = 0;
1.1.1.7 root 3540: loop_depth = 0;
1.1 root 3541: p = scan_start;
3542: while (1)
3543: {
3544: p = NEXT_INSN (p);
3545: /* At end of a straight-in loop, we are done.
3546: At end of a loop entered at the bottom, scan the top. */
3547: if (p == scan_start)
3548: break;
3549: if (p == end)
3550: {
3551: if (loop_top != 0)
1.1.1.7 root 3552: p = loop_top;
1.1 root 3553: else
3554: break;
3555: if (p == scan_start)
3556: break;
3557: }
3558:
3559: /* Look for a general induction variable in a register. */
3560: if (GET_CODE (p) == INSN
3561: && (set = single_set (p))
3562: && GET_CODE (SET_DEST (set)) == REG
3563: && ! may_not_optimize[REGNO (SET_DEST (set))])
3564: {
3565: rtx src_reg;
3566: rtx add_val;
3567: rtx mult_val;
3568: int benefit;
3569: rtx regnote = 0;
3570:
3571: dest_reg = SET_DEST (set);
3572: if (REGNO (dest_reg) < FIRST_PSEUDO_REGISTER)
3573: continue;
3574:
3575: if (/* SET_SRC is a giv. */
3576: ((benefit = general_induction_var (SET_SRC (set),
3577: &src_reg, &add_val,
3578: &mult_val))
3579: /* Equivalent expression is a giv. */
1.1.1.4 root 3580: || ((regnote = find_reg_note (p, REG_EQUAL, NULL_RTX))
1.1 root 3581: && (benefit = general_induction_var (XEXP (regnote, 0),
3582: &src_reg,
3583: &add_val, &mult_val))))
3584: /* Don't try to handle any regs made by loop optimization.
3585: We have nothing on them in regno_first_uid, etc. */
3586: && REGNO (dest_reg) < max_reg_before_loop
3587: /* Don't recognize a BASIC_INDUCT_VAR here. */
3588: && dest_reg != src_reg
3589: /* This must be the only place where the register is set. */
3590: && (n_times_set[REGNO (dest_reg)] == 1
3591: /* or all sets must be consecutive and make a giv. */
3592: || (benefit = consec_sets_giv (benefit, p,
3593: src_reg, dest_reg,
3594: &add_val, &mult_val))))
3595: {
3596: int count;
3597: struct induction *v
3598: = (struct induction *) alloca (sizeof (struct induction));
3599: rtx temp;
3600:
3601: /* If this is a library call, increase benefit. */
1.1.1.4 root 3602: if (find_reg_note (p, REG_RETVAL, NULL_RTX))
1.1 root 3603: benefit += libcall_benefit (p);
3604:
3605: /* Skip the consecutive insns, if there are any. */
3606: for (count = n_times_set[REGNO (dest_reg)] - 1;
3607: count > 0; count--)
3608: {
3609: /* If first insn of libcall sequence, skip to end.
3610: Do this at start of loop, since INSN is guaranteed to
3611: be an insn here. */
3612: if (GET_CODE (p) != NOTE
1.1.1.4 root 3613: && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
1.1 root 3614: p = XEXP (temp, 0);
3615:
3616: do p = NEXT_INSN (p);
3617: while (GET_CODE (p) == NOTE);
3618: }
3619:
3620: record_giv (v, p, src_reg, dest_reg, mult_val, add_val, benefit,
1.1.1.4 root 3621: DEST_REG, not_every_iteration, NULL_PTR, loop_start,
1.1 root 3622: loop_end);
3623:
3624: }
3625: }
3626:
3627: #ifndef DONT_REDUCE_ADDR
3628: /* Look for givs which are memory addresses. */
3629: /* This resulted in worse code on a VAX 8600. I wonder if it
3630: still does. */
3631: if (GET_CODE (p) == INSN)
3632: find_mem_givs (PATTERN (p), p, not_every_iteration, loop_start,
3633: loop_end);
3634: #endif
3635:
3636: /* Update the status of whether giv can derive other givs. This can
3637: change when we pass a label or an insn that updates a biv. */
1.1.1.3 root 3638: if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
3639: || GET_CODE (p) == CODE_LABEL)
1.1 root 3640: update_giv_derive (p);
3641:
3642: /* Past a label or a jump, we get to insns for which we can't count
3643: on whether or how many times they will be executed during each
3644: iteration. */
3645: /* This code appears in three places, once in scan_loop, and twice
3646: in strength_reduce. */
3647: if ((GET_CODE (p) == CODE_LABEL || GET_CODE (p) == JUMP_INSN)
3648: /* If we enter the loop in the middle, and scan around
3649: to the beginning, don't set not_every_iteration for that.
3650: This can be any kind of jump, since we want to know if insns
3651: will be executed if the loop is executed. */
3652: && ! (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p) == loop_top
3653: && ((NEXT_INSN (NEXT_INSN (p)) == loop_end && simplejump_p (p))
3654: || (NEXT_INSN (p) == loop_end && condjump_p (p)))))
3655: not_every_iteration = 1;
3656:
1.1.1.7 root 3657: else if (GET_CODE (p) == NOTE)
3658: {
3659: /* At the virtual top of a converted loop, insns are again known to
3660: be executed each iteration: logically, the loop begins here
3661: even though the exit code has been duplicated. */
3662: if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_VTOP && loop_depth == 0)
3663: not_every_iteration = 0;
3664: else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
3665: loop_depth++;
3666: else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END)
3667: loop_depth--;
3668: }
1.1 root 3669:
3670: /* Unlike in the code motion pass where MAYBE_NEVER indicates that
3671: an insn may never be executed, NOT_EVERY_ITERATION indicates whether
3672: or not an insn is known to be executed each iteration of the
3673: loop, whether or not any iterations are known to occur.
3674:
3675: Therefore, if we have just passed a label and have no more labels
3676: between here and the test insn of the loop, we know these insns
3677: will be executed each iteration. */
3678:
3679: if (not_every_iteration && GET_CODE (p) == CODE_LABEL
3680: && no_labels_between_p (p, loop_end))
3681: not_every_iteration = 0;
3682: }
3683:
3684: /* Try to calculate and save the number of loop iterations. This is
3685: set to zero if the actual number can not be calculated. This must
3686: be called after all giv's have been identified, since otherwise it may
3687: fail if the iteration variable is a giv. */
3688:
3689: loop_n_iterations = loop_iterations (loop_start, loop_end);
3690:
3691: /* Now for each giv for which we still don't know whether or not it is
3692: replaceable, check to see if it is replaceable because its final value
3693: can be calculated. This must be done after loop_iterations is called,
3694: so that final_giv_value will work correctly. */
3695:
3696: for (bl = loop_iv_list; bl; bl = bl->next)
3697: {
3698: struct induction *v;
3699:
3700: for (v = bl->giv; v; v = v->next_iv)
3701: if (! v->replaceable && ! v->not_replaceable)
3702: check_final_value (v, loop_start, loop_end);
3703: }
3704:
3705: /* Try to prove that the loop counter variable (if any) is always
3706: nonnegative; if so, record that fact with a REG_NONNEG note
3707: so that "decrement and branch until zero" insn can be used. */
3708: check_dbra_loop (loop_end, insn_count, loop_start);
3709:
3710: /* Create reg_map to hold substitutions for replaceable giv regs. */
3711: reg_map = (rtx *) alloca (max_reg_before_loop * sizeof (rtx));
3712: bzero ((char *) reg_map, max_reg_before_loop * sizeof (rtx));
3713:
3714: /* Examine each iv class for feasibility of strength reduction/induction
3715: variable elimination. */
3716:
3717: for (bl = loop_iv_list; bl; bl = bl->next)
3718: {
3719: struct induction *v;
3720: int benefit;
3721: int all_reduced;
3722: rtx final_value = 0;
3723:
3724: /* Test whether it will be possible to eliminate this biv
3725: provided all givs are reduced. This is possible if either
3726: the reg is not used outside the loop, or we can compute
3727: what its final value will be.
3728:
3729: For architectures with a decrement_and_branch_until_zero insn,
3730: don't do this if we put a REG_NONNEG note on the endtest for
3731: this biv. */
3732:
3733: /* Compare against bl->init_insn rather than loop_start.
3734: We aren't concerned with any uses of the biv between
3735: init_insn and loop_start since these won't be affected
3736: by the value of the biv elsewhere in the function, so
3737: long as init_insn doesn't use the biv itself.
3738: March 14, 1989 -- [email protected] */
3739:
3740: if ((uid_luid[regno_last_uid[bl->regno]] < INSN_LUID (loop_end)
3741: && bl->init_insn
3742: && INSN_UID (bl->init_insn) < max_uid_for_loop
3743: && uid_luid[regno_first_uid[bl->regno]] >= INSN_LUID (bl->init_insn)
3744: #ifdef HAVE_decrement_and_branch_until_zero
3745: && ! bl->nonneg
3746: #endif
3747: && ! reg_mentioned_p (bl->biv->dest_reg, SET_SRC (bl->init_set)))
3748: || ((final_value = final_biv_value (bl, loop_start, loop_end))
3749: #ifdef HAVE_decrement_and_branch_until_zero
3750: && ! bl->nonneg
3751: #endif
3752: ))
3753: bl->eliminable = maybe_eliminate_biv (bl, loop_start, end, 0,
3754: threshold, insn_count);
3755: else
3756: {
3757: if (loop_dump_stream)
3758: {
3759: fprintf (loop_dump_stream,
3760: "Cannot eliminate biv %d.\n",
3761: bl->regno);
3762: fprintf (loop_dump_stream,
3763: "First use: insn %d, last use: insn %d.\n",
3764: regno_first_uid[bl->regno],
3765: regno_last_uid[bl->regno]);
3766: }
3767: }
3768:
3769: /* Combine all giv's for this iv_class. */
3770: combine_givs (bl);
3771:
3772: /* This will be true at the end, if all givs which depend on this
3773: biv have been strength reduced.
3774: We can't (currently) eliminate the biv unless this is so. */
3775: all_reduced = 1;
3776:
3777: /* Check each giv in this class to see if we will benefit by reducing
3778: it. Skip giv's combined with others. */
3779: for (v = bl->giv; v; v = v->next_iv)
3780: {
3781: struct induction *tv;
3782:
3783: if (v->ignore || v->same)
3784: continue;
3785:
3786: benefit = v->benefit;
3787:
3788: /* Reduce benefit if not replaceable, since we will insert
3789: a move-insn to replace the insn that calculates this giv.
3790: Don't do this unless the giv is a user variable, since it
3791: will often be marked non-replaceable because of the duplication
3792: of the exit code outside the loop. In such a case, the copies
3793: we insert are dead and will be deleted. So they don't have
3794: a cost. Similar situations exist. */
3795: /* ??? The new final_[bg]iv_value code does a much better job
3796: of finding replaceable giv's, and hence this code may no longer
3797: be necessary. */
3798: if (! v->replaceable && ! bl->eliminable
3799: && REG_USERVAR_P (v->dest_reg))
3800: benefit -= copy_cost;
3801:
3802: /* Decrease the benefit to count the add-insns that we will
3803: insert to increment the reduced reg for the giv. */
3804: benefit -= add_cost * bl->biv_count;
3805:
3806: /* Decide whether to strength-reduce this giv or to leave the code
3807: unchanged (recompute it from the biv each time it is used).
3808: This decision can be made independently for each giv. */
3809:
3810: /* ??? Perhaps attempt to guess whether autoincrement will handle
3811: some of the new add insns; if so, can increase BENEFIT
3812: (undo the subtraction of add_cost that was done above). */
3813:
3814: /* If an insn is not to be strength reduced, then set its ignore
3815: flag, and clear all_reduced. */
3816:
1.1.1.6 root 3817: /* A giv that depends on a reversed biv must be reduced if it is
3818: used after the loop exit, otherwise, it would have the wrong
3819: value after the loop exit. To make it simple, just reduce all
3820: of such giv's whether or not we know they are used after the loop
3821: exit. */
3822:
3823: if (v->lifetime * threshold * benefit < insn_count
3824: && ! bl->reversed)
1.1 root 3825: {
3826: if (loop_dump_stream)
3827: fprintf (loop_dump_stream,
3828: "giv of insn %d not worth while, %d vs %d.\n",
3829: INSN_UID (v->insn),
3830: v->lifetime * threshold * benefit, insn_count);
3831: v->ignore = 1;
3832: all_reduced = 0;
3833: }
3834: else
3835: {
3836: /* Check that we can increment the reduced giv without a
3837: multiply insn. If not, reject it. */
3838:
3839: for (tv = bl->biv; tv; tv = tv->next_iv)
3840: if (tv->mult_val == const1_rtx
3841: && ! product_cheap_p (tv->add_val, v->mult_val))
3842: {
3843: if (loop_dump_stream)
3844: fprintf (loop_dump_stream,
3845: "giv of insn %d: would need a multiply.\n",
3846: INSN_UID (v->insn));
3847: v->ignore = 1;
3848: all_reduced = 0;
3849: break;
3850: }
3851: }
3852: }
3853:
3854: /* Reduce each giv that we decided to reduce. */
3855:
3856: for (v = bl->giv; v; v = v->next_iv)
3857: {
3858: struct induction *tv;
3859: if (! v->ignore && v->same == 0)
3860: {
3861: v->new_reg = gen_reg_rtx (v->mode);
3862:
3863: /* For each place where the biv is incremented,
3864: add an insn to increment the new, reduced reg for the giv. */
3865: for (tv = bl->biv; tv; tv = tv->next_iv)
3866: {
3867: if (tv->mult_val == const1_rtx)
3868: emit_iv_add_mult (tv->add_val, v->mult_val,
3869: v->new_reg, v->new_reg, tv->insn);
3870: else /* tv->mult_val == const0_rtx */
3871: /* A multiply is acceptable here
3872: since this is presumed to be seldom executed. */
3873: emit_iv_add_mult (tv->add_val, v->mult_val,
3874: v->add_val, v->new_reg, tv->insn);
3875: }
3876:
3877: /* Add code at loop start to initialize giv's reduced reg. */
3878:
3879: emit_iv_add_mult (bl->initial_value, v->mult_val,
3880: v->add_val, v->new_reg, loop_start);
3881: }
3882: }
3883:
3884: /* Rescan all givs. If a giv is the same as a giv not reduced, mark it
3885: as not reduced.
3886:
3887: For each giv register that can be reduced now: if replaceable,
3888: substitute reduced reg wherever the old giv occurs;
3889: else add new move insn "giv_reg = reduced_reg".
3890:
3891: Also check for givs whose first use is their definition and whose
3892: last use is the definition of another giv. If so, it is likely
3893: dead and should not be used to eliminate a biv. */
3894: for (v = bl->giv; v; v = v->next_iv)
3895: {
3896: if (v->same && v->same->ignore)
3897: v->ignore = 1;
3898:
3899: if (v->ignore)
3900: continue;
3901:
3902: if (v->giv_type == DEST_REG
3903: && regno_first_uid[REGNO (v->dest_reg)] == INSN_UID (v->insn))
3904: {
3905: struct induction *v1;
3906:
3907: for (v1 = bl->giv; v1; v1 = v1->next_iv)
3908: if (regno_last_uid[REGNO (v->dest_reg)] == INSN_UID (v1->insn))
3909: v->maybe_dead = 1;
3910: }
3911:
3912: /* Update expression if this was combined, in case other giv was
3913: replaced. */
3914: if (v->same)
3915: v->new_reg = replace_rtx (v->new_reg,
3916: v->same->dest_reg, v->same->new_reg);
3917:
3918: if (v->giv_type == DEST_ADDR)
3919: /* Store reduced reg as the address in the memref where we found
3920: this giv. */
1.1.1.7 root 3921: validate_change (v->insn, v->location, v->new_reg, 0);
1.1 root 3922: else if (v->replaceable)
3923: {
3924: reg_map[REGNO (v->dest_reg)] = v->new_reg;
3925:
3926: #if 0
3927: /* I can no longer duplicate the original problem. Perhaps
3928: this is unnecessary now? */
3929:
3930: /* Replaceable; it isn't strictly necessary to delete the old
3931: insn and emit a new one, because v->dest_reg is now dead.
3932:
3933: However, especially when unrolling loops, the special
3934: handling for (set REG0 REG1) in the second cse pass may
3935: make v->dest_reg live again. To avoid this problem, emit
3936: an insn to set the original giv reg from the reduced giv.
3937: We can not delete the original insn, since it may be part
3938: of a LIBCALL, and the code in flow that eliminates dead
3939: libcalls will fail if it is deleted. */
3940: emit_insn_after (gen_move_insn (v->dest_reg, v->new_reg),
3941: v->insn);
3942: #endif
3943: }
3944: else
3945: {
3946: /* Not replaceable; emit an insn to set the original giv reg from
3947: the reduced giv, same as above. */
3948: emit_insn_after (gen_move_insn (v->dest_reg, v->new_reg),
3949: v->insn);
3950: }
3951:
3952: /* When a loop is reversed, givs which depend on the reversed
3953: biv, and which are live outside the loop, must be set to their
3954: correct final value. This insn is only needed if the giv is
3955: not replaceable. The correct final value is the same as the
3956: value that the giv starts the reversed loop with. */
3957: if (bl->reversed && ! v->replaceable)
3958: emit_iv_add_mult (bl->initial_value, v->mult_val,
3959: v->add_val, v->dest_reg, end_insert_before);
3960: else if (v->final_value)
3961: {
3962: rtx insert_before;
3963:
3964: /* If the loop has multiple exits, emit the insn before the
3965: loop to ensure that it will always be executed no matter
3966: how the loop exits. Otherwise, emit the insn after the loop,
3967: since this is slightly more efficient. */
1.1.1.8 root 3968: if (loop_number_exit_count[uid_loop_num[INSN_UID (loop_start)]])
1.1 root 3969: insert_before = loop_start;
3970: else
3971: insert_before = end_insert_before;
3972: emit_insn_before (gen_move_insn (v->dest_reg, v->final_value),
3973: insert_before);
3974:
3975: #if 0
3976: /* If the insn to set the final value of the giv was emitted
3977: before the loop, then we must delete the insn inside the loop
3978: that sets it. If this is a LIBCALL, then we must delete
3979: every insn in the libcall. Note, however, that
3980: final_giv_value will only succeed when there are multiple
3981: exits if the giv is dead at each exit, hence it does not
3982: matter that the original insn remains because it is dead
3983: anyways. */
3984: /* Delete the insn inside the loop that sets the giv since
3985: the giv is now set before (or after) the loop. */
3986: delete_insn (v->insn);
3987: #endif
3988: }
3989:
3990: if (loop_dump_stream)
3991: {
3992: fprintf (loop_dump_stream, "giv at %d reduced to ",
3993: INSN_UID (v->insn));
3994: print_rtl (loop_dump_stream, v->new_reg);
3995: fprintf (loop_dump_stream, "\n");
3996: }
3997: }
3998:
3999: /* All the givs based on the biv bl have been reduced if they
4000: merit it. */
4001:
4002: /* For each giv not marked as maybe dead that has been combined with a
4003: second giv, clear any "maybe dead" mark on that second giv.
4004: v->new_reg will either be or refer to the register of the giv it
4005: combined with.
4006:
4007: Doing this clearing avoids problems in biv elimination where a
4008: giv's new_reg is a complex value that can't be put in the insn but
4009: the giv combined with (with a reg as new_reg) is marked maybe_dead.
4010: Since the register will be used in either case, we'd prefer it be
4011: used from the simpler giv. */
4012:
4013: for (v = bl->giv; v; v = v->next_iv)
4014: if (! v->maybe_dead && v->same)
4015: v->same->maybe_dead = 0;
4016:
4017: /* Try to eliminate the biv, if it is a candidate.
4018: This won't work if ! all_reduced,
4019: since the givs we planned to use might not have been reduced.
4020:
1.1.1.2 root 4021: We have to be careful that we didn't initially think we could eliminate
1.1 root 4022: this biv because of a giv that we now think may be dead and shouldn't
4023: be used as a biv replacement.
4024:
4025: Also, there is the possibility that we may have a giv that looks
4026: like it can be used to eliminate a biv, but the resulting insn
4027: isn't valid. This can happen, for example, on the 88k, where a
4028: JUMP_INSN can compare a register only with zero. Attempts to
1.1.1.3 root 4029: replace it with a compare with a constant will fail.
1.1 root 4030:
4031: Note that in cases where this call fails, we may have replaced some
4032: of the occurrences of the biv with a giv, but no harm was done in
4033: doing so in the rare cases where it can occur. */
4034:
4035: if (all_reduced == 1 && bl->eliminable
4036: && maybe_eliminate_biv (bl, loop_start, end, 1,
4037: threshold, insn_count))
4038:
4039: {
4040: /* ?? If we created a new test to bypass the loop entirely,
4041: or otherwise drop straight in, based on this test, then
4042: we might want to rewrite it also. This way some later
4043: pass has more hope of removing the initialization of this
4044: biv entirely. */
4045:
4046: /* If final_value != 0, then the biv may be used after loop end
4047: and we must emit an insn to set it just in case.
4048:
4049: Reversed bivs already have an insn after the loop setting their
4050: value, so we don't need another one. We can't calculate the
4051: proper final value for such a biv here anyways. */
4052: if (final_value != 0 && ! bl->reversed)
4053: {
4054: rtx insert_before;
4055:
4056: /* If the loop has multiple exits, emit the insn before the
4057: loop to ensure that it will always be executed no matter
4058: how the loop exits. Otherwise, emit the insn after the
4059: loop, since this is slightly more efficient. */
1.1.1.8 root 4060: if (loop_number_exit_count[uid_loop_num[INSN_UID (loop_start)]])
1.1 root 4061: insert_before = loop_start;
4062: else
4063: insert_before = end_insert_before;
4064:
4065: emit_insn_before (gen_move_insn (bl->biv->dest_reg, final_value),
4066: end_insert_before);
4067: }
4068:
4069: #if 0
4070: /* Delete all of the instructions inside the loop which set
4071: the biv, as they are all dead. If is safe to delete them,
4072: because an insn setting a biv will never be part of a libcall. */
4073: /* However, deleting them will invalidate the regno_last_uid info,
4074: so keeping them around is more convenient. Final_biv_value
4075: will only succeed when there are multiple exits if the biv
4076: is dead at each exit, hence it does not matter that the original
4077: insn remains, because it is dead anyways. */
4078: for (v = bl->biv; v; v = v->next_iv)
4079: delete_insn (v->insn);
4080: #endif
4081:
4082: if (loop_dump_stream)
4083: fprintf (loop_dump_stream, "Reg %d: biv eliminated\n",
4084: bl->regno);
4085: }
4086: }
4087:
4088: /* Go through all the instructions in the loop, making all the
4089: register substitutions scheduled in REG_MAP. */
4090:
4091: for (p = loop_start; p != end; p = NEXT_INSN (p))
4092: if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
4093: || GET_CODE (p) == CALL_INSN)
4094: {
4095: replace_regs (PATTERN (p), reg_map, max_reg_before_loop, 0);
4096: replace_regs (REG_NOTES (p), reg_map, max_reg_before_loop, 0);
1.1.1.5 root 4097: INSN_CODE (p) = -1;
1.1 root 4098: }
4099:
4100: /* Unroll loops from within strength reduction so that we can use the
4101: induction variable information that strength_reduce has already
4102: collected. */
4103:
4104: if (flag_unroll_loops)
4105: unroll_loop (loop_end, insn_count, loop_start, end_insert_before, 1);
4106:
4107: if (loop_dump_stream)
4108: fprintf (loop_dump_stream, "\n");
4109: }
4110:
4111: /* Return 1 if X is a valid source for an initial value (or as value being
4112: compared against in an initial test).
4113:
4114: X must be either a register or constant and must not be clobbered between
4115: the current insn and the start of the loop.
4116:
4117: INSN is the insn containing X. */
4118:
4119: static int
4120: valid_initial_value_p (x, insn, call_seen, loop_start)
4121: rtx x;
4122: rtx insn;
4123: int call_seen;
4124: rtx loop_start;
4125: {
4126: if (CONSTANT_P (x))
4127: return 1;
4128:
1.1.1.2 root 4129: /* Only consider pseudos we know about initialized in insns whose luids
1.1 root 4130: we know. */
4131: if (GET_CODE (x) != REG
4132: || REGNO (x) >= max_reg_before_loop)
4133: return 0;
4134:
4135: /* Don't use call-clobbered registers across a call which clobbers it. On
4136: some machines, don't use any hard registers at all. */
4137: if (REGNO (x) < FIRST_PSEUDO_REGISTER
4138: #ifndef SMALL_REGISTER_CLASSES
4139: && call_used_regs[REGNO (x)] && call_seen
4140: #endif
4141: )
4142: return 0;
4143:
4144: /* Don't use registers that have been clobbered before the start of the
4145: loop. */
4146: if (reg_set_between_p (x, insn, loop_start))
4147: return 0;
4148:
4149: return 1;
4150: }
4151:
4152: /* Scan X for memory refs and check each memory address
4153: as a possible giv. INSN is the insn whose pattern X comes from.
4154: NOT_EVERY_ITERATION is 1 if the insn might not be executed during
4155: every loop iteration. */
4156:
4157: static void
4158: find_mem_givs (x, insn, not_every_iteration, loop_start, loop_end)
4159: rtx x;
4160: rtx insn;
4161: int not_every_iteration;
4162: rtx loop_start, loop_end;
4163: {
4164: register int i, j;
4165: register enum rtx_code code;
4166: register char *fmt;
4167:
4168: if (x == 0)
4169: return;
4170:
4171: code = GET_CODE (x);
4172: switch (code)
4173: {
4174: case REG:
4175: case CONST_INT:
4176: case CONST:
4177: case CONST_DOUBLE:
4178: case SYMBOL_REF:
4179: case LABEL_REF:
4180: case PC:
4181: case CC0:
4182: case ADDR_VEC:
4183: case ADDR_DIFF_VEC:
4184: case USE:
4185: case CLOBBER:
4186: return;
4187:
4188: case MEM:
4189: {
4190: rtx src_reg;
4191: rtx add_val;
4192: rtx mult_val;
4193: int benefit;
4194:
4195: benefit = general_induction_var (XEXP (x, 0),
4196: &src_reg, &add_val, &mult_val);
4197:
4198: /* Don't make a DEST_ADDR giv with mult_val == 1 && add_val == 0.
4199: Such a giv isn't useful. */
4200: if (benefit > 0 && (mult_val != const1_rtx || add_val != const0_rtx))
4201: {
4202: /* Found one; record it. */
4203: struct induction *v
4204: = (struct induction *) oballoc (sizeof (struct induction));
4205:
4206: record_giv (v, insn, src_reg, addr_placeholder, mult_val,
4207: add_val, benefit, DEST_ADDR, not_every_iteration,
4208: &XEXP (x, 0), loop_start, loop_end);
4209:
4210: v->mem_mode = GET_MODE (x);
4211: }
4212: return;
4213: }
4214: }
4215:
4216: /* Recursively scan the subexpressions for other mem refs. */
4217:
4218: fmt = GET_RTX_FORMAT (code);
4219: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
4220: if (fmt[i] == 'e')
4221: find_mem_givs (XEXP (x, i), insn, not_every_iteration, loop_start,
4222: loop_end);
4223: else if (fmt[i] == 'E')
4224: for (j = 0; j < XVECLEN (x, i); j++)
4225: find_mem_givs (XVECEXP (x, i, j), insn, not_every_iteration,
4226: loop_start, loop_end);
4227: }
4228:
4229: /* Fill in the data about one biv update.
4230: V is the `struct induction' in which we record the biv. (It is
4231: allocated by the caller, with alloca.)
4232: INSN is the insn that sets it.
4233: DEST_REG is the biv's reg.
4234:
4235: MULT_VAL is const1_rtx if the biv is being incremented here, in which case
4236: INC_VAL is the increment. Otherwise, MULT_VAL is const0_rtx and the biv is
1.1.1.3 root 4237: being set to INC_VAL.
4238:
4239: NOT_EVERY_ITERATION is nonzero if this biv update is not know to be
4240: executed every iteration; MAYBE_MULTIPLE is nonzero if this biv update
4241: can be executed more than once per iteration. If MAYBE_MULTIPLE
4242: and NOT_EVERY_ITERATION are both zero, we know that the biv update is
4243: executed exactly once per iteration. */
1.1 root 4244:
4245: static void
1.1.1.3 root 4246: record_biv (v, insn, dest_reg, inc_val, mult_val,
4247: not_every_iteration, maybe_multiple)
1.1 root 4248: struct induction *v;
4249: rtx insn;
4250: rtx dest_reg;
4251: rtx inc_val;
4252: rtx mult_val;
4253: int not_every_iteration;
1.1.1.3 root 4254: int maybe_multiple;
1.1 root 4255: {
4256: struct iv_class *bl;
4257:
4258: v->insn = insn;
4259: v->src_reg = dest_reg;
4260: v->dest_reg = dest_reg;
4261: v->mult_val = mult_val;
4262: v->add_val = inc_val;
4263: v->mode = GET_MODE (dest_reg);
4264: v->always_computable = ! not_every_iteration;
1.1.1.3 root 4265: v->maybe_multiple = maybe_multiple;
1.1 root 4266:
4267: /* Add this to the reg's iv_class, creating a class
4268: if this is the first incrementation of the reg. */
4269:
4270: bl = reg_biv_class[REGNO (dest_reg)];
4271: if (bl == 0)
4272: {
4273: /* Create and initialize new iv_class. */
4274:
4275: bl = (struct iv_class *) oballoc (sizeof (struct iv_class));
4276:
4277: bl->regno = REGNO (dest_reg);
4278: bl->biv = 0;
4279: bl->giv = 0;
4280: bl->biv_count = 0;
4281: bl->giv_count = 0;
4282:
4283: /* Set initial value to the reg itself. */
4284: bl->initial_value = dest_reg;
1.1.1.3 root 4285: /* We haven't seen the initializing insn yet */
1.1 root 4286: bl->init_insn = 0;
4287: bl->init_set = 0;
4288: bl->initial_test = 0;
4289: bl->incremented = 0;
4290: bl->eliminable = 0;
4291: bl->nonneg = 0;
4292: bl->reversed = 0;
1.1.1.4 root 4293: bl->total_benefit = 0;
1.1 root 4294:
4295: /* Add this class to loop_iv_list. */
4296: bl->next = loop_iv_list;
4297: loop_iv_list = bl;
4298:
4299: /* Put it in the array of biv register classes. */
4300: reg_biv_class[REGNO (dest_reg)] = bl;
4301: }
4302:
4303: /* Update IV_CLASS entry for this biv. */
4304: v->next_iv = bl->biv;
4305: bl->biv = v;
4306: bl->biv_count++;
4307: if (mult_val == const1_rtx)
4308: bl->incremented = 1;
4309:
4310: if (loop_dump_stream)
4311: {
4312: fprintf (loop_dump_stream,
4313: "Insn %d: possible biv, reg %d,",
4314: INSN_UID (insn), REGNO (dest_reg));
4315: if (GET_CODE (inc_val) == CONST_INT)
4316: fprintf (loop_dump_stream, " const = %d\n",
4317: INTVAL (inc_val));
4318: else
4319: {
4320: fprintf (loop_dump_stream, " const = ");
4321: print_rtl (loop_dump_stream, inc_val);
4322: fprintf (loop_dump_stream, "\n");
4323: }
4324: }
4325: }
4326:
4327: /* Fill in the data about one giv.
4328: V is the `struct induction' in which we record the giv. (It is
4329: allocated by the caller, with alloca.)
4330: INSN is the insn that sets it.
4331: BENEFIT estimates the savings from deleting this insn.
4332: TYPE is DEST_REG or DEST_ADDR; it says whether the giv is computed
4333: into a register or is used as a memory address.
4334:
4335: SRC_REG is the biv reg which the giv is computed from.
4336: DEST_REG is the giv's reg (if the giv is stored in a reg).
4337: MULT_VAL and ADD_VAL are the coefficients used to compute the giv.
4338: LOCATION points to the place where this giv's value appears in INSN. */
4339:
4340: static void
4341: record_giv (v, insn, src_reg, dest_reg, mult_val, add_val, benefit,
4342: type, not_every_iteration, location, loop_start, loop_end)
4343: struct induction *v;
4344: rtx insn;
4345: rtx src_reg;
4346: rtx dest_reg;
4347: rtx mult_val, add_val;
4348: int benefit;
4349: enum g_types type;
4350: int not_every_iteration;
4351: rtx *location;
4352: rtx loop_start, loop_end;
4353: {
4354: struct induction *b;
4355: struct iv_class *bl;
4356: rtx set = single_set (insn);
4357: rtx p;
4358:
4359: v->insn = insn;
4360: v->src_reg = src_reg;
4361: v->giv_type = type;
4362: v->dest_reg = dest_reg;
4363: v->mult_val = mult_val;
4364: v->add_val = add_val;
4365: v->benefit = benefit;
4366: v->location = location;
4367: v->cant_derive = 0;
4368: v->combined_with = 0;
1.1.1.3 root 4369: v->maybe_multiple = 0;
1.1 root 4370: v->maybe_dead = 0;
4371: v->derive_adjustment = 0;
4372: v->same = 0;
4373: v->ignore = 0;
4374: v->new_reg = 0;
4375: v->final_value = 0;
1.1.1.8 root 4376: v->same_insn = 0;
1.1 root 4377:
4378: /* The v->always_computable field is used in update_giv_derive, to
4379: determine whether a giv can be used to derive another giv. For a
4380: DEST_REG giv, INSN computes a new value for the giv, so its value
4381: isn't computable if INSN insn't executed every iteration.
4382: However, for a DEST_ADDR giv, INSN merely uses the value of the giv;
4383: it does not compute a new value. Hence the value is always computable
1.1.1.2 root 4384: regardless of whether INSN is executed each iteration. */
1.1 root 4385:
4386: if (type == DEST_ADDR)
4387: v->always_computable = 1;
4388: else
4389: v->always_computable = ! not_every_iteration;
4390:
4391: if (type == DEST_ADDR)
4392: {
4393: v->mode = GET_MODE (*location);
4394: v->lifetime = 1;
4395: v->times_used = 1;
4396: }
4397: else /* type == DEST_REG */
4398: {
4399: v->mode = GET_MODE (SET_DEST (set));
4400:
4401: v->lifetime = (uid_luid[regno_last_uid[REGNO (dest_reg)]]
4402: - uid_luid[regno_first_uid[REGNO (dest_reg)]]);
4403:
4404: v->times_used = n_times_used[REGNO (dest_reg)];
4405:
4406: /* If the lifetime is zero, it means that this register is
4407: really a dead store. So mark this as a giv that can be
4408: ignored. This will not prevent the biv from being eliminated. */
4409: if (v->lifetime == 0)
4410: v->ignore = 1;
4411:
4412: reg_iv_type[REGNO (dest_reg)] = GENERAL_INDUCT;
4413: reg_iv_info[REGNO (dest_reg)] = v;
4414: }
4415:
4416: /* Add the giv to the class of givs computed from one biv. */
4417:
4418: bl = reg_biv_class[REGNO (src_reg)];
4419: if (bl)
4420: {
4421: v->next_iv = bl->giv;
4422: bl->giv = v;
4423: /* Don't count DEST_ADDR. This is supposed to count the number of
4424: insns that calculate givs. */
4425: if (type == DEST_REG)
4426: bl->giv_count++;
4427: bl->total_benefit += benefit;
4428: }
4429: else
4430: /* Fatal error, biv missing for this giv? */
4431: abort ();
4432:
4433: if (type == DEST_ADDR)
4434: v->replaceable = 1;
4435: else
4436: {
4437: /* The giv can be replaced outright by the reduced register only if all
4438: of the following conditions are true:
4439: - the insn that sets the giv is always executed on any iteration
4440: on which the giv is used at all
4441: (there are two ways to deduce this:
4442: either the insn is executed on every iteration,
4443: or all uses follow that insn in the same basic block),
4444: - the giv is not used outside the loop
4445: - no assignments to the biv occur during the giv's lifetime. */
4446:
4447: if (regno_first_uid[REGNO (dest_reg)] == INSN_UID (insn)
4448: /* Previous line always fails if INSN was moved by loop opt. */
4449: && uid_luid[regno_last_uid[REGNO (dest_reg)]] < INSN_LUID (loop_end)
4450: && (! not_every_iteration
4451: || last_use_this_basic_block (dest_reg, insn)))
4452: {
4453: /* Now check that there are no assignments to the biv within the
4454: giv's lifetime. This requires two separate checks. */
4455:
4456: /* Check each biv update, and fail if any are between the first
4457: and last use of the giv.
4458:
4459: If this loop contains an inner loop that was unrolled, then
4460: the insn modifying the biv may have been emitted by the loop
4461: unrolling code, and hence does not have a valid luid. Just
4462: mark the biv as not replaceable in this case. It is not very
4463: useful as a biv, because it is used in two different loops.
4464: It is very unlikely that we would be able to optimize the giv
4465: using this biv anyways. */
4466:
4467: v->replaceable = 1;
4468: for (b = bl->biv; b; b = b->next_iv)
4469: {
4470: if (INSN_UID (b->insn) >= max_uid_for_loop
4471: || ((uid_luid[INSN_UID (b->insn)]
4472: >= uid_luid[regno_first_uid[REGNO (dest_reg)]])
4473: && (uid_luid[INSN_UID (b->insn)]
4474: <= uid_luid[regno_last_uid[REGNO (dest_reg)]])))
4475: {
4476: v->replaceable = 0;
4477: v->not_replaceable = 1;
4478: break;
4479: }
4480: }
4481:
1.1.1.8 root 4482: /* If there are any backwards branches that go from after the
4483: biv update to before it, then this giv is not replaceable. */
1.1 root 4484: if (v->replaceable)
1.1.1.8 root 4485: for (b = bl->biv; b; b = b->next_iv)
4486: if (back_branch_in_range_p (b->insn, loop_start, loop_end))
4487: {
4488: v->replaceable = 0;
4489: v->not_replaceable = 1;
4490: break;
4491: }
1.1 root 4492: }
4493: else
4494: {
4495: /* May still be replaceable, we don't have enough info here to
4496: decide. */
4497: v->replaceable = 0;
4498: v->not_replaceable = 0;
4499: }
4500: }
4501:
4502: if (loop_dump_stream)
4503: {
4504: if (type == DEST_REG)
4505: fprintf (loop_dump_stream, "Insn %d: giv reg %d",
4506: INSN_UID (insn), REGNO (dest_reg));
4507: else
4508: fprintf (loop_dump_stream, "Insn %d: dest address",
4509: INSN_UID (insn));
4510:
4511: fprintf (loop_dump_stream, " src reg %d benefit %d",
4512: REGNO (src_reg), v->benefit);
4513: fprintf (loop_dump_stream, " used %d lifetime %d",
4514: v->times_used, v->lifetime);
4515:
4516: if (v->replaceable)
4517: fprintf (loop_dump_stream, " replaceable");
4518:
4519: if (GET_CODE (mult_val) == CONST_INT)
4520: fprintf (loop_dump_stream, " mult %d",
4521: INTVAL (mult_val));
4522: else
4523: {
4524: fprintf (loop_dump_stream, " mult ");
4525: print_rtl (loop_dump_stream, mult_val);
4526: }
4527:
4528: if (GET_CODE (add_val) == CONST_INT)
4529: fprintf (loop_dump_stream, " add %d",
4530: INTVAL (add_val));
4531: else
4532: {
4533: fprintf (loop_dump_stream, " add ");
4534: print_rtl (loop_dump_stream, add_val);
4535: }
4536: }
4537:
4538: if (loop_dump_stream)
4539: fprintf (loop_dump_stream, "\n");
4540:
4541: }
4542:
4543:
4544: /* All this does is determine whether a giv can be made replaceable because
4545: its final value can be calculated. This code can not be part of record_giv
4546: above, because final_giv_value requires that the number of loop iterations
4547: be known, and that can not be accurately calculated until after all givs
4548: have been identified. */
4549:
4550: static void
4551: check_final_value (v, loop_start, loop_end)
4552: struct induction *v;
4553: rtx loop_start, loop_end;
4554: {
4555: struct iv_class *bl;
4556: rtx final_value = 0;
4557:
4558: bl = reg_biv_class[REGNO (v->src_reg)];
4559:
4560: /* DEST_ADDR givs will never reach here, because they are always marked
4561: replaceable above in record_giv. */
4562:
4563: /* The giv can be replaced outright by the reduced register only if all
4564: of the following conditions are true:
4565: - the insn that sets the giv is always executed on any iteration
4566: on which the giv is used at all
4567: (there are two ways to deduce this:
4568: either the insn is executed on every iteration,
4569: or all uses follow that insn in the same basic block),
4570: - its final value can be calculated (this condition is different
4571: than the one above in record_giv)
4572: - no assignments to the biv occur during the giv's lifetime. */
4573:
4574: #if 0
4575: /* This is only called now when replaceable is known to be false. */
4576: /* Clear replaceable, so that it won't confuse final_giv_value. */
4577: v->replaceable = 0;
4578: #endif
4579:
4580: if ((final_value = final_giv_value (v, loop_start, loop_end))
4581: && (v->always_computable || last_use_this_basic_block (v->dest_reg, v->insn)))
4582: {
4583: int biv_increment_seen = 0;
4584: rtx p = v->insn;
4585: rtx last_giv_use;
4586:
4587: v->replaceable = 1;
4588:
4589: /* When trying to determine whether or not a biv increment occurs
4590: during the lifetime of the giv, we can ignore uses of the variable
4591: outside the loop because final_value is true. Hence we can not
4592: use regno_last_uid and regno_first_uid as above in record_giv. */
4593:
4594: /* Search the loop to determine whether any assignments to the
4595: biv occur during the giv's lifetime. Start with the insn
4596: that sets the giv, and search around the loop until we come
4597: back to that insn again.
4598:
4599: Also fail if there is a jump within the giv's lifetime that jumps
4600: to somewhere outside the lifetime but still within the loop. This
4601: catches spaghetti code where the execution order is not linear, and
4602: hence the above test fails. Here we assume that the giv lifetime
4603: does not extend from one iteration of the loop to the next, so as
4604: to make the test easier. Since the lifetime isn't known yet,
4605: this requires two loops. See also record_giv above. */
4606:
4607: last_giv_use = v->insn;
4608:
4609: while (1)
4610: {
4611: p = NEXT_INSN (p);
4612: if (p == loop_end)
4613: p = NEXT_INSN (loop_start);
4614: if (p == v->insn)
4615: break;
4616:
4617: if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
4618: || GET_CODE (p) == CALL_INSN)
4619: {
4620: if (biv_increment_seen)
4621: {
4622: if (reg_mentioned_p (v->dest_reg, PATTERN (p)))
4623: {
4624: v->replaceable = 0;
4625: v->not_replaceable = 1;
4626: break;
4627: }
4628: }
4629: else if (GET_CODE (PATTERN (p)) == SET
4630: && SET_DEST (PATTERN (p)) == v->src_reg)
4631: biv_increment_seen = 1;
4632: else if (reg_mentioned_p (v->dest_reg, PATTERN (p)))
4633: last_giv_use = p;
4634: }
4635: }
4636:
4637: /* Now that the lifetime of the giv is known, check for branches
4638: from within the lifetime to outside the lifetime if it is still
4639: replaceable. */
4640:
4641: if (v->replaceable)
4642: {
4643: p = v->insn;
4644: while (1)
4645: {
4646: p = NEXT_INSN (p);
4647: if (p == loop_end)
4648: p = NEXT_INSN (loop_start);
4649: if (p == last_giv_use)
4650: break;
4651:
4652: if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p)
4653: && LABEL_NAME (JUMP_LABEL (p))
4654: && ((INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (v->insn)
4655: && INSN_LUID (JUMP_LABEL (p)) > INSN_LUID (loop_start))
4656: || (INSN_LUID (JUMP_LABEL (p)) > INSN_LUID (last_giv_use)
4657: && INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (loop_end))))
4658: {
4659: v->replaceable = 0;
4660: v->not_replaceable = 1;
4661:
4662: if (loop_dump_stream)
4663: fprintf (loop_dump_stream,
4664: "Found branch outside giv lifetime.\n");
4665:
4666: break;
4667: }
4668: }
4669: }
4670:
4671: /* If it is replaceable, then save the final value. */
4672: if (v->replaceable)
4673: v->final_value = final_value;
4674: }
4675:
4676: if (loop_dump_stream && v->replaceable)
4677: fprintf (loop_dump_stream, "Insn %d: giv reg %d final_value replaceable\n",
4678: INSN_UID (v->insn), REGNO (v->dest_reg));
4679: }
4680:
4681: /* Update the status of whether a giv can derive other givs.
4682:
4683: We need to do something special if there is or may be an update to the biv
4684: between the time the giv is defined and the time it is used to derive
4685: another giv.
4686:
4687: In addition, a giv that is only conditionally set is not allowed to
4688: derive another giv once a label has been passed.
4689:
4690: The cases we look at are when a label or an update to a biv is passed. */
4691:
4692: static void
4693: update_giv_derive (p)
4694: rtx p;
4695: {
4696: struct iv_class *bl;
4697: struct induction *biv, *giv;
4698: rtx tem;
4699: int dummy;
4700:
4701: /* Search all IV classes, then all bivs, and finally all givs.
4702:
1.1.1.3 root 4703: There are three cases we are concerned with. First we have the situation
1.1 root 4704: of a giv that is only updated conditionally. In that case, it may not
4705: derive any givs after a label is passed.
4706:
4707: The second case is when a biv update occurs, or may occur, after the
4708: definition of a giv. For certain biv updates (see below) that are
4709: known to occur between the giv definition and use, we can adjust the
4710: giv definition. For others, or when the biv update is conditional,
4711: we must prevent the giv from deriving any other givs. There are two
4712: sub-cases within this case.
4713:
4714: If this is a label, we are concerned with any biv update that is done
4715: conditionally, since it may be done after the giv is defined followed by
4716: a branch here (actually, we need to pass both a jump and a label, but
4717: this extra tracking doesn't seem worth it).
4718:
1.1.1.3 root 4719: If this is a jump, we are concerned about any biv update that may be
4720: executed multiple times. We are actually only concerned about
4721: backward jumps, but it is probably not worth performing the test
4722: on the jump again here.
4723:
4724: If this is a biv update, we must adjust the giv status to show that a
1.1 root 4725: subsequent biv update was performed. If this adjustment cannot be done,
4726: the giv cannot derive further givs. */
4727:
4728: for (bl = loop_iv_list; bl; bl = bl->next)
4729: for (biv = bl->biv; biv; biv = biv->next_iv)
1.1.1.3 root 4730: if (GET_CODE (p) == CODE_LABEL || GET_CODE (p) == JUMP_INSN
4731: || biv->insn == p)
1.1 root 4732: {
4733: for (giv = bl->giv; giv; giv = giv->next_iv)
4734: {
4735: /* If cant_derive is already true, there is no point in
4736: checking all of these conditions again. */
4737: if (giv->cant_derive)
4738: continue;
4739:
4740: /* If this giv is conditionally set and we have passed a label,
4741: it cannot derive anything. */
4742: if (GET_CODE (p) == CODE_LABEL && ! giv->always_computable)
4743: giv->cant_derive = 1;
4744:
4745: /* Skip givs that have mult_val == 0, since
4746: they are really invariants. Also skip those that are
4747: replaceable, since we know their lifetime doesn't contain
4748: any biv update. */
4749: else if (giv->mult_val == const0_rtx || giv->replaceable)
4750: continue;
4751:
4752: /* The only way we can allow this giv to derive another
4753: is if this is a biv increment and we can form the product
4754: of biv->add_val and giv->mult_val. In this case, we will
4755: be able to compute a compensation. */
4756: else if (biv->insn == p)
4757: {
1.1.1.2 root 4758: tem = 0;
4759:
4760: if (biv->mult_val == const1_rtx)
4761: tem = simplify_giv_expr (gen_rtx (MULT, giv->mode,
4762: biv->add_val,
4763: giv->mult_val),
4764: &dummy);
4765:
4766: if (tem && giv->derive_adjustment)
4767: tem = simplify_giv_expr (gen_rtx (PLUS, giv->mode, tem,
4768: giv->derive_adjustment),
4769: &dummy);
4770: if (tem)
1.1 root 4771: giv->derive_adjustment = tem;
4772: else
4773: giv->cant_derive = 1;
4774: }
1.1.1.3 root 4775: else if ((GET_CODE (p) == CODE_LABEL && ! biv->always_computable)
4776: || (GET_CODE (p) == JUMP_INSN && biv->maybe_multiple))
1.1 root 4777: giv->cant_derive = 1;
4778: }
4779: }
4780: }
4781:
4782: /* Check whether an insn is an increment legitimate for a basic induction var.
1.1.1.6 root 4783: X is the source of insn P, or a part of it.
4784: MODE is the mode in which X should be interpreted.
4785:
1.1 root 4786: DEST_REG is the putative biv, also the destination of the insn.
4787: We accept patterns of these forms:
1.1.1.4 root 4788: REG = REG + INVARIANT (includes REG = REG - CONSTANT)
1.1 root 4789: REG = INVARIANT + REG
4790:
4791: If X is suitable, we return 1, set *MULT_VAL to CONST1_RTX,
4792: and store the additive term into *INC_VAL.
4793:
4794: If X is an assignment of an invariant into DEST_REG, we set
4795: *MULT_VAL to CONST0_RTX, and store the invariant into *INC_VAL.
4796:
1.1.1.4 root 4797: We also want to detect a BIV when it corresponds to a variable
4798: whose mode was promoted via PROMOTED_MODE. In that case, an increment
4799: of the variable may be a PLUS that adds a SUBREG of that variable to
4800: an invariant and then sign- or zero-extends the result of the PLUS
4801: into the variable.
4802:
4803: Most GIVs in such cases will be in the promoted mode, since that is the
4804: probably the natural computation mode (and almost certainly the mode
4805: used for addresses) on the machine. So we view the pseudo-reg containing
4806: the variable as the BIV, as if it were simply incremented.
4807:
4808: Note that treating the entire pseudo as a BIV will result in making
4809: simple increments to any GIVs based on it. However, if the variable
4810: overflows in its declared mode but not its promoted mode, the result will
4811: be incorrect. This is acceptable if the variable is signed, since
4812: overflows in such cases are undefined, but not if it is unsigned, since
4813: those overflows are defined. So we only check for SIGN_EXTEND and
4814: not ZERO_EXTEND.
4815:
4816: If we cannot find a biv, we return 0. */
1.1 root 4817:
4818: static int
1.1.1.6 root 4819: basic_induction_var (x, mode, dest_reg, p, inc_val, mult_val)
1.1 root 4820: register rtx x;
1.1.1.6 root 4821: enum machine_mode mode;
1.1.1.4 root 4822: rtx p;
1.1 root 4823: rtx dest_reg;
4824: rtx *inc_val;
4825: rtx *mult_val;
4826: {
4827: register enum rtx_code code;
4828: rtx arg;
1.1.1.4 root 4829: rtx insn, set = 0;
1.1 root 4830:
4831: code = GET_CODE (x);
4832: switch (code)
4833: {
4834: case PLUS:
1.1.1.4 root 4835: if (XEXP (x, 0) == dest_reg
4836: || (GET_CODE (XEXP (x, 0)) == SUBREG
4837: && SUBREG_PROMOTED_VAR_P (XEXP (x, 0))
4838: && SUBREG_REG (XEXP (x, 0)) == dest_reg))
1.1 root 4839: arg = XEXP (x, 1);
1.1.1.4 root 4840: else if (XEXP (x, 1) == dest_reg
4841: || (GET_CODE (XEXP (x, 1)) == SUBREG
4842: && SUBREG_PROMOTED_VAR_P (XEXP (x, 1))
4843: && SUBREG_REG (XEXP (x, 1)) == dest_reg))
1.1 root 4844: arg = XEXP (x, 0);
4845: else
4846: return 0;
4847:
4848: if (invariant_p (arg) != 1)
4849: return 0;
4850:
1.1.1.6 root 4851: *inc_val = convert_modes (GET_MODE (dest_reg), GET_MODE (x), arg, 0);
1.1 root 4852: *mult_val = const1_rtx;
4853: return 1;
4854:
1.1.1.4 root 4855: case SUBREG:
4856: /* If this is a SUBREG for a promoted variable, check the inner
4857: value. */
4858: if (SUBREG_PROMOTED_VAR_P (x))
1.1.1.6 root 4859: return basic_induction_var (SUBREG_REG (x), GET_MODE (SUBREG_REG (x)),
4860: dest_reg, p, inc_val, mult_val);
1.1 root 4861:
1.1.1.4 root 4862: case REG:
4863: /* If this register is assigned in the previous insn, look at its
4864: source, but don't go outside the loop or past a label. */
4865:
4866: for (insn = PREV_INSN (p);
4867: (insn && GET_CODE (insn) == NOTE
4868: && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG);
4869: insn = PREV_INSN (insn))
4870: ;
4871:
4872: if (insn)
4873: set = single_set (insn);
4874:
1.1.1.7 root 4875: if (set != 0
4876: && (SET_DEST (set) == x
4877: || (GET_CODE (SET_DEST (set)) == SUBREG
4878: && (GET_MODE_SIZE (GET_MODE (SET_DEST (set)))
4879: <= UNITS_PER_WORD)
4880: && SUBREG_REG (SET_DEST (set)) == x)))
1.1.1.6 root 4881: return basic_induction_var (SET_SRC (set),
4882: (GET_MODE (SET_SRC (set)) == VOIDmode
4883: ? GET_MODE (x)
4884: : GET_MODE (SET_SRC (set))),
4885: dest_reg, insn,
1.1.1.4 root 4886: inc_val, mult_val);
4887: /* ... fall through ... */
1.1 root 4888:
4889: /* Can accept constant setting of biv only when inside inner most loop.
4890: Otherwise, a biv of an inner loop may be incorrectly recognized
4891: as a biv of the outer loop,
4892: causing code to be moved INTO the inner loop. */
4893: case MEM:
4894: if (invariant_p (x) != 1)
4895: return 0;
4896: case CONST_INT:
4897: case SYMBOL_REF:
4898: case CONST:
4899: if (loops_enclosed == 1)
4900: {
1.1.1.6 root 4901: /* Possible bug here? Perhaps we don't know the mode of X. */
4902: *inc_val = convert_modes (GET_MODE (dest_reg), mode, x, 0);
1.1 root 4903: *mult_val = const0_rtx;
4904: return 1;
4905: }
4906: else
4907: return 0;
4908:
1.1.1.4 root 4909: case SIGN_EXTEND:
1.1.1.6 root 4910: return basic_induction_var (XEXP (x, 0), GET_MODE (XEXP (x, 0)),
4911: dest_reg, p, inc_val, mult_val);
1.1.1.4 root 4912: case ASHIFTRT:
4913: /* Similar, since this can be a sign extension. */
4914: for (insn = PREV_INSN (p);
4915: (insn && GET_CODE (insn) == NOTE
4916: && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG);
4917: insn = PREV_INSN (insn))
4918: ;
4919:
4920: if (insn)
4921: set = single_set (insn);
4922:
4923: if (set && SET_DEST (set) == XEXP (x, 0)
4924: && GET_CODE (XEXP (x, 1)) == CONST_INT
4925: && INTVAL (XEXP (x, 1)) >= 0
4926: && GET_CODE (SET_SRC (set)) == ASHIFT
4927: && XEXP (x, 1) == XEXP (SET_SRC (set), 1))
1.1.1.6 root 4928: return basic_induction_var (XEXP (SET_SRC (set), 0),
4929: GET_MODE (XEXP (x, 0)),
4930: dest_reg, insn, inc_val, mult_val);
1.1.1.4 root 4931: return 0;
4932:
1.1 root 4933: default:
4934: return 0;
4935: }
4936: }
4937:
4938: /* A general induction variable (giv) is any quantity that is a linear
4939: function of a basic induction variable,
4940: i.e. giv = biv * mult_val + add_val.
4941: The coefficients can be any loop invariant quantity.
4942: A giv need not be computed directly from the biv;
4943: it can be computed by way of other givs. */
4944:
4945: /* Determine whether X computes a giv.
4946: If it does, return a nonzero value
4947: which is the benefit from eliminating the computation of X;
4948: set *SRC_REG to the register of the biv that it is computed from;
4949: set *ADD_VAL and *MULT_VAL to the coefficients,
4950: such that the value of X is biv * mult + add; */
4951:
4952: static int
4953: general_induction_var (x, src_reg, add_val, mult_val)
4954: rtx x;
4955: rtx *src_reg;
4956: rtx *add_val;
4957: rtx *mult_val;
4958: {
4959: rtx orig_x = x;
4960: int benefit = 0;
4961: char *storage;
4962:
4963: /* If this is an invariant, forget it, it isn't a giv. */
4964: if (invariant_p (x) == 1)
4965: return 0;
4966:
4967: /* See if the expression could be a giv and get its form.
4968: Mark our place on the obstack in case we don't find a giv. */
4969: storage = (char *) oballoc (0);
4970: x = simplify_giv_expr (x, &benefit);
4971: if (x == 0)
4972: {
4973: obfree (storage);
4974: return 0;
4975: }
4976:
4977: switch (GET_CODE (x))
4978: {
4979: case USE:
4980: case CONST_INT:
4981: /* Since this is now an invariant and wasn't before, it must be a giv
4982: with MULT_VAL == 0. It doesn't matter which BIV we associate this
4983: with. */
4984: *src_reg = loop_iv_list->biv->dest_reg;
4985: *mult_val = const0_rtx;
4986: *add_val = x;
4987: break;
4988:
4989: case REG:
4990: /* This is equivalent to a BIV. */
4991: *src_reg = x;
4992: *mult_val = const1_rtx;
4993: *add_val = const0_rtx;
4994: break;
4995:
4996: case PLUS:
4997: /* Either (plus (biv) (invar)) or
4998: (plus (mult (biv) (invar_1)) (invar_2)). */
4999: if (GET_CODE (XEXP (x, 0)) == MULT)
5000: {
5001: *src_reg = XEXP (XEXP (x, 0), 0);
5002: *mult_val = XEXP (XEXP (x, 0), 1);
5003: }
5004: else
5005: {
5006: *src_reg = XEXP (x, 0);
5007: *mult_val = const1_rtx;
5008: }
5009: *add_val = XEXP (x, 1);
5010: break;
5011:
5012: case MULT:
5013: /* ADD_VAL is zero. */
5014: *src_reg = XEXP (x, 0);
5015: *mult_val = XEXP (x, 1);
5016: *add_val = const0_rtx;
5017: break;
5018:
5019: default:
5020: abort ();
5021: }
5022:
5023: /* Remove any enclosing USE from ADD_VAL and MULT_VAL (there will be
5024: unless they are CONST_INT). */
5025: if (GET_CODE (*add_val) == USE)
5026: *add_val = XEXP (*add_val, 0);
5027: if (GET_CODE (*mult_val) == USE)
5028: *mult_val = XEXP (*mult_val, 0);
5029:
1.1.1.3 root 5030: benefit += rtx_cost (orig_x, SET);
1.1 root 5031:
5032: /* Always return some benefit if this is a giv so it will be detected
5033: as such. This allows elimination of bivs that might otherwise
5034: not be eliminated. */
5035: return benefit == 0 ? 1 : benefit;
5036: }
5037:
5038: /* Given an expression, X, try to form it as a linear function of a biv.
5039: We will canonicalize it to be of the form
5040: (plus (mult (BIV) (invar_1))
5041: (invar_2))
1.1.1.3 root 5042: with possible degeneracies.
1.1 root 5043:
5044: The invariant expressions must each be of a form that can be used as a
5045: machine operand. We surround then with a USE rtx (a hack, but localized
5046: and certainly unambiguous!) if not a CONST_INT for simplicity in this
5047: routine; it is the caller's responsibility to strip them.
5048:
5049: If no such canonicalization is possible (i.e., two biv's are used or an
5050: expression that is neither invariant nor a biv or giv), this routine
5051: returns 0.
5052:
5053: For a non-zero return, the result will have a code of CONST_INT, USE,
5054: REG (for a BIV), PLUS, or MULT. No other codes will occur.
5055:
5056: *BENEFIT will be incremented by the benefit of any sub-giv encountered. */
5057:
5058: static rtx
5059: simplify_giv_expr (x, benefit)
5060: rtx x;
5061: int *benefit;
5062: {
5063: enum machine_mode mode = GET_MODE (x);
5064: rtx arg0, arg1;
5065: rtx tem;
5066:
5067: /* If this is not an integer mode, or if we cannot do arithmetic in this
5068: mode, this can't be a giv. */
5069: if (mode != VOIDmode
5070: && (GET_MODE_CLASS (mode) != MODE_INT
1.1.1.4 root 5071: || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT))
1.1 root 5072: return 0;
5073:
5074: switch (GET_CODE (x))
5075: {
5076: case PLUS:
5077: arg0 = simplify_giv_expr (XEXP (x, 0), benefit);
5078: arg1 = simplify_giv_expr (XEXP (x, 1), benefit);
5079: if (arg0 == 0 || arg1 == 0)
5080: return 0;
5081:
5082: /* Put constant last, CONST_INT last if both constant. */
5083: if ((GET_CODE (arg0) == USE
5084: || GET_CODE (arg0) == CONST_INT)
5085: && GET_CODE (arg1) != CONST_INT)
5086: tem = arg0, arg0 = arg1, arg1 = tem;
5087:
5088: /* Handle addition of zero, then addition of an invariant. */
5089: if (arg1 == const0_rtx)
5090: return arg0;
5091: else if (GET_CODE (arg1) == CONST_INT || GET_CODE (arg1) == USE)
5092: switch (GET_CODE (arg0))
5093: {
5094: case CONST_INT:
5095: case USE:
5096: /* Both invariant. Only valid if sum is machine operand.
5097: First strip off possible USE on first operand. */
5098: if (GET_CODE (arg0) == USE)
5099: arg0 = XEXP (arg0, 0);
5100:
5101: tem = 0;
5102: if (CONSTANT_P (arg0) && GET_CODE (arg1) == CONST_INT)
5103: {
5104: tem = plus_constant (arg0, INTVAL (arg1));
5105: if (GET_CODE (tem) != CONST_INT)
5106: tem = gen_rtx (USE, mode, tem);
5107: }
5108:
5109: return tem;
5110:
5111: case REG:
5112: case MULT:
5113: /* biv + invar or mult + invar. Return sum. */
5114: return gen_rtx (PLUS, mode, arg0, arg1);
5115:
5116: case PLUS:
5117: /* (a + invar_1) + invar_2. Associate. */
5118: return simplify_giv_expr (gen_rtx (PLUS, mode,
5119: XEXP (arg0, 0),
5120: gen_rtx (PLUS, mode,
5121: XEXP (arg0, 1), arg1)),
5122: benefit);
5123:
5124: default:
5125: abort ();
5126: }
5127:
5128: /* Each argument must be either REG, PLUS, or MULT. Convert REG to
5129: MULT to reduce cases. */
5130: if (GET_CODE (arg0) == REG)
5131: arg0 = gen_rtx (MULT, mode, arg0, const1_rtx);
5132: if (GET_CODE (arg1) == REG)
5133: arg1 = gen_rtx (MULT, mode, arg1, const1_rtx);
5134:
5135: /* Now have PLUS + PLUS, PLUS + MULT, MULT + PLUS, or MULT + MULT.
5136: Put a MULT first, leaving PLUS + PLUS, MULT + PLUS, or MULT + MULT.
5137: Recurse to associate the second PLUS. */
5138: if (GET_CODE (arg1) == MULT)
5139: tem = arg0, arg0 = arg1, arg1 = tem;
5140:
5141: if (GET_CODE (arg1) == PLUS)
5142: return simplify_giv_expr (gen_rtx (PLUS, mode,
5143: gen_rtx (PLUS, mode,
5144: arg0, XEXP (arg1, 0)),
5145: XEXP (arg1, 1)),
5146: benefit);
5147:
5148: /* Now must have MULT + MULT. Distribute if same biv, else not giv. */
5149: if (GET_CODE (arg0) != MULT || GET_CODE (arg1) != MULT)
5150: abort ();
5151:
5152: if (XEXP (arg0, 0) != XEXP (arg1, 0))
5153: return 0;
5154:
5155: return simplify_giv_expr (gen_rtx (MULT, mode,
5156: XEXP (arg0, 0),
5157: gen_rtx (PLUS, mode,
5158: XEXP (arg0, 1),
5159: XEXP (arg1, 1))),
5160: benefit);
5161:
5162: case MINUS:
5163: /* Handle "a - b" as "a + b * (-1)". */
5164: return simplify_giv_expr (gen_rtx (PLUS, mode,
5165: XEXP (x, 0),
5166: gen_rtx (MULT, mode,
1.1.1.4 root 5167: XEXP (x, 1), constm1_rtx)),
1.1 root 5168: benefit);
5169:
5170: case MULT:
5171: arg0 = simplify_giv_expr (XEXP (x, 0), benefit);
5172: arg1 = simplify_giv_expr (XEXP (x, 1), benefit);
5173: if (arg0 == 0 || arg1 == 0)
5174: return 0;
5175:
5176: /* Put constant last, CONST_INT last if both constant. */
5177: if ((GET_CODE (arg0) == USE || GET_CODE (arg0) == CONST_INT)
5178: && GET_CODE (arg1) != CONST_INT)
5179: tem = arg0, arg0 = arg1, arg1 = tem;
5180:
5181: /* If second argument is not now constant, not giv. */
5182: if (GET_CODE (arg1) != USE && GET_CODE (arg1) != CONST_INT)
5183: return 0;
5184:
5185: /* Handle multiply by 0 or 1. */
5186: if (arg1 == const0_rtx)
5187: return const0_rtx;
5188:
5189: else if (arg1 == const1_rtx)
5190: return arg0;
5191:
5192: switch (GET_CODE (arg0))
5193: {
5194: case REG:
5195: /* biv * invar. Done. */
5196: return gen_rtx (MULT, mode, arg0, arg1);
5197:
5198: case CONST_INT:
5199: /* Product of two constants. */
1.1.1.4 root 5200: return GEN_INT (INTVAL (arg0) * INTVAL (arg1));
1.1 root 5201:
5202: case USE:
5203: /* invar * invar. Not giv. */
5204: return 0;
5205:
5206: case MULT:
5207: /* (a * invar_1) * invar_2. Associate. */
5208: return simplify_giv_expr (gen_rtx (MULT, mode,
5209: XEXP (arg0, 0),
5210: gen_rtx (MULT, mode,
5211: XEXP (arg0, 1), arg1)),
5212: benefit);
5213:
5214: case PLUS:
5215: /* (a + invar_1) * invar_2. Distribute. */
5216: return simplify_giv_expr (gen_rtx (PLUS, mode,
5217: gen_rtx (MULT, mode,
5218: XEXP (arg0, 0), arg1),
5219: gen_rtx (MULT, mode,
5220: XEXP (arg0, 1), arg1)),
5221: benefit);
5222:
5223: default:
5224: abort ();
5225: }
5226:
5227: case ASHIFT:
5228: /* Shift by constant is multiply by power of two. */
5229: if (GET_CODE (XEXP (x, 1)) != CONST_INT)
5230: return 0;
5231:
5232: return simplify_giv_expr (gen_rtx (MULT, mode,
5233: XEXP (x, 0),
1.1.1.4 root 5234: GEN_INT ((HOST_WIDE_INT) 1
5235: << INTVAL (XEXP (x, 1)))),
1.1 root 5236: benefit);
5237:
5238: case NEG:
5239: /* "-a" is "a * (-1)" */
1.1.1.4 root 5240: return simplify_giv_expr (gen_rtx (MULT, mode, XEXP (x, 0), constm1_rtx),
1.1 root 5241: benefit);
5242:
5243: case NOT:
5244: /* "~a" is "-a - 1". Silly, but easy. */
5245: return simplify_giv_expr (gen_rtx (MINUS, mode,
5246: gen_rtx (NEG, mode, XEXP (x, 0)),
5247: const1_rtx),
5248: benefit);
5249:
5250: case USE:
5251: /* Already in proper form for invariant. */
5252: return x;
5253:
5254: case REG:
5255: /* If this is a new register, we can't deal with it. */
5256: if (REGNO (x) >= max_reg_before_loop)
5257: return 0;
5258:
5259: /* Check for biv or giv. */
5260: switch (reg_iv_type[REGNO (x)])
5261: {
5262: case BASIC_INDUCT:
5263: return x;
5264: case GENERAL_INDUCT:
5265: {
5266: struct induction *v = reg_iv_info[REGNO (x)];
5267:
5268: /* Form expression from giv and add benefit. Ensure this giv
5269: can derive another and subtract any needed adjustment if so. */
5270: *benefit += v->benefit;
5271: if (v->cant_derive)
5272: return 0;
5273:
5274: tem = gen_rtx (PLUS, mode, gen_rtx (MULT, mode,
5275: v->src_reg, v->mult_val),
5276: v->add_val);
5277: if (v->derive_adjustment)
5278: tem = gen_rtx (MINUS, mode, tem, v->derive_adjustment);
5279: return simplify_giv_expr (tem, benefit);
5280: }
5281: }
5282:
5283: /* Fall through to general case. */
5284: default:
5285: /* If invariant, return as USE (unless CONST_INT).
5286: Otherwise, not giv. */
5287: if (GET_CODE (x) == USE)
5288: x = XEXP (x, 0);
5289:
5290: if (invariant_p (x) == 1)
5291: {
5292: if (GET_CODE (x) == CONST_INT)
5293: return x;
5294: else
5295: return gen_rtx (USE, mode, x);
5296: }
5297: else
5298: return 0;
5299: }
5300: }
5301:
5302: /* Help detect a giv that is calculated by several consecutive insns;
5303: for example,
5304: giv = biv * M
5305: giv = giv + A
5306: The caller has already identified the first insn P as having a giv as dest;
5307: we check that all other insns that set the same register follow
5308: immediately after P, that they alter nothing else,
5309: and that the result of the last is still a giv.
5310:
5311: The value is 0 if the reg set in P is not really a giv.
5312: Otherwise, the value is the amount gained by eliminating
5313: all the consecutive insns that compute the value.
5314:
5315: FIRST_BENEFIT is the amount gained by eliminating the first insn, P.
5316: SRC_REG is the reg of the biv; DEST_REG is the reg of the giv.
5317:
5318: The coefficients of the ultimate giv value are stored in
5319: *MULT_VAL and *ADD_VAL. */
5320:
5321: static int
5322: consec_sets_giv (first_benefit, p, src_reg, dest_reg,
5323: add_val, mult_val)
5324: int first_benefit;
5325: rtx p;
5326: rtx src_reg;
5327: rtx dest_reg;
5328: rtx *add_val;
5329: rtx *mult_val;
5330: {
5331: int count;
5332: enum rtx_code code;
5333: int benefit;
5334: rtx temp;
5335: rtx set;
5336:
5337: /* Indicate that this is a giv so that we can update the value produced in
5338: each insn of the multi-insn sequence.
5339:
5340: This induction structure will be used only by the call to
5341: general_induction_var below, so we can allocate it on our stack.
5342: If this is a giv, our caller will replace the induct var entry with
5343: a new induction structure. */
5344: struct induction *v
5345: = (struct induction *) alloca (sizeof (struct induction));
5346: v->src_reg = src_reg;
5347: v->mult_val = *mult_val;
5348: v->add_val = *add_val;
5349: v->benefit = first_benefit;
5350: v->cant_derive = 0;
5351: v->derive_adjustment = 0;
5352:
5353: reg_iv_type[REGNO (dest_reg)] = GENERAL_INDUCT;
5354: reg_iv_info[REGNO (dest_reg)] = v;
5355:
5356: count = n_times_set[REGNO (dest_reg)] - 1;
5357:
5358: while (count > 0)
5359: {
5360: p = NEXT_INSN (p);
5361: code = GET_CODE (p);
5362:
5363: /* If libcall, skip to end of call sequence. */
1.1.1.4 root 5364: if (code == INSN && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
1.1 root 5365: p = XEXP (temp, 0);
5366:
5367: if (code == INSN
5368: && (set = single_set (p))
5369: && GET_CODE (SET_DEST (set)) == REG
5370: && SET_DEST (set) == dest_reg
5371: && ((benefit = general_induction_var (SET_SRC (set), &src_reg,
5372: add_val, mult_val))
5373: /* Giv created by equivalent expression. */
1.1.1.4 root 5374: || ((temp = find_reg_note (p, REG_EQUAL, NULL_RTX))
1.1 root 5375: && (benefit = general_induction_var (XEXP (temp, 0), &src_reg,
5376: add_val, mult_val))))
5377: && src_reg == v->src_reg)
5378: {
1.1.1.4 root 5379: if (find_reg_note (p, REG_RETVAL, NULL_RTX))
1.1 root 5380: benefit += libcall_benefit (p);
5381:
5382: count--;
5383: v->mult_val = *mult_val;
5384: v->add_val = *add_val;
5385: v->benefit = benefit;
5386: }
5387: else if (code != NOTE)
5388: {
5389: /* Allow insns that set something other than this giv to a
5390: constant. Such insns are needed on machines which cannot
5391: include long constants and should not disqualify a giv. */
5392: if (code == INSN
5393: && (set = single_set (p))
5394: && SET_DEST (set) != dest_reg
5395: && CONSTANT_P (SET_SRC (set)))
5396: continue;
5397:
5398: reg_iv_type[REGNO (dest_reg)] = UNKNOWN_INDUCT;
5399: return 0;
5400: }
5401: }
5402:
5403: return v->benefit;
5404: }
5405:
5406: /* Return an rtx, if any, that expresses giv G2 as a function of the register
5407: represented by G1. If no such expression can be found, or it is clear that
5408: it cannot possibly be a valid address, 0 is returned.
5409:
5410: To perform the computation, we note that
5411: G1 = a * v + b and
5412: G2 = c * v + d
5413: where `v' is the biv.
5414:
5415: So G2 = (c/a) * G1 + (d - b*c/a) */
5416:
5417: #ifdef ADDRESS_COST
5418: static rtx
5419: express_from (g1, g2)
5420: struct induction *g1, *g2;
5421: {
5422: rtx mult, add;
5423:
5424: /* The value that G1 will be multiplied by must be a constant integer. Also,
5425: the only chance we have of getting a valid address is if b*c/a (see above
5426: for notation) is also an integer. */
5427: if (GET_CODE (g1->mult_val) != CONST_INT
5428: || GET_CODE (g2->mult_val) != CONST_INT
5429: || GET_CODE (g1->add_val) != CONST_INT
5430: || g1->mult_val == const0_rtx
5431: || INTVAL (g2->mult_val) % INTVAL (g1->mult_val) != 0)
5432: return 0;
5433:
1.1.1.4 root 5434: mult = GEN_INT (INTVAL (g2->mult_val) / INTVAL (g1->mult_val));
1.1 root 5435: add = plus_constant (g2->add_val, - INTVAL (g1->add_val) * INTVAL (mult));
5436:
5437: /* Form simplified final result. */
5438: if (mult == const0_rtx)
5439: return add;
5440: else if (mult == const1_rtx)
5441: mult = g1->dest_reg;
5442: else
5443: mult = gen_rtx (MULT, g2->mode, g1->dest_reg, mult);
5444:
5445: if (add == const0_rtx)
5446: return mult;
5447: else
5448: return gen_rtx (PLUS, g2->mode, mult, add);
5449: }
5450: #endif
5451:
5452: /* Return 1 if giv G2 can be combined with G1. This means that G2 can use
5453: (either directly or via an address expression) a register used to represent
5454: G1. Set g2->new_reg to a represtation of G1 (normally just
5455: g1->dest_reg). */
5456:
5457: static int
5458: combine_givs_p (g1, g2)
5459: struct induction *g1, *g2;
5460: {
5461: rtx tem;
5462:
5463: /* If these givs are identical, they can be combined. */
5464: if (rtx_equal_p (g1->mult_val, g2->mult_val)
5465: && rtx_equal_p (g1->add_val, g2->add_val))
5466: {
5467: g2->new_reg = g1->dest_reg;
5468: return 1;
5469: }
5470:
5471: #ifdef ADDRESS_COST
5472: /* If G2 can be expressed as a function of G1 and that function is valid
5473: as an address and no more expensive than using a register for G2,
5474: the expression of G2 in terms of G1 can be used. */
5475: if (g2->giv_type == DEST_ADDR
5476: && (tem = express_from (g1, g2)) != 0
5477: && memory_address_p (g2->mem_mode, tem)
5478: && ADDRESS_COST (tem) <= ADDRESS_COST (*g2->location))
5479: {
5480: g2->new_reg = tem;
5481: return 1;
5482: }
5483: #endif
5484:
5485: return 0;
5486: }
5487:
5488: /* Check all pairs of givs for iv_class BL and see if any can be combined with
5489: any other. If so, point SAME to the giv combined with and set NEW_REG to
5490: be an expression (in terms of the other giv's DEST_REG) equivalent to the
5491: giv. Also, update BENEFIT and related fields for cost/benefit analysis. */
5492:
5493: static void
5494: combine_givs (bl)
5495: struct iv_class *bl;
5496: {
5497: struct induction *g1, *g2;
5498: int pass;
5499:
5500: for (g1 = bl->giv; g1; g1 = g1->next_iv)
5501: for (pass = 0; pass <= 1; pass++)
5502: for (g2 = bl->giv; g2; g2 = g2->next_iv)
5503: if (g1 != g2
5504: /* First try to combine with replaceable givs, then all givs. */
5505: && (g1->replaceable || pass == 1)
5506: /* If either has already been combined or is to be ignored, can't
5507: combine. */
5508: && ! g1->ignore && ! g2->ignore && ! g1->same && ! g2->same
5509: /* If something has been based on G2, G2 cannot itself be based
5510: on something else. */
5511: && ! g2->combined_with
5512: && combine_givs_p (g1, g2))
5513: {
5514: /* g2->new_reg set by `combine_givs_p' */
5515: g2->same = g1;
5516: g1->combined_with = 1;
5517: g1->benefit += g2->benefit;
5518: /* ??? The new final_[bg]iv_value code does a much better job
5519: of finding replaceable giv's, and hence this code may no
5520: longer be necessary. */
5521: if (! g2->replaceable && REG_USERVAR_P (g2->dest_reg))
5522: g1->benefit -= copy_cost;
5523: g1->lifetime += g2->lifetime;
5524: g1->times_used += g2->times_used;
5525:
5526: if (loop_dump_stream)
5527: fprintf (loop_dump_stream, "giv at %d combined with giv at %d\n",
5528: INSN_UID (g2->insn), INSN_UID (g1->insn));
5529: }
5530: }
5531:
5532: /* EMIT code before INSERT_BEFORE to set REG = B * M + A. */
5533:
5534: void
5535: emit_iv_add_mult (b, m, a, reg, insert_before)
5536: rtx b; /* initial value of basic induction variable */
5537: rtx m; /* multiplicative constant */
5538: rtx a; /* additive constant */
5539: rtx reg; /* destination register */
5540: rtx insert_before;
5541: {
5542: rtx seq;
5543: rtx result;
5544:
5545: /* Prevent unexpected sharing of these rtx. */
5546: a = copy_rtx (a);
5547: b = copy_rtx (b);
5548:
5549: /* Increase the lifetime of any invariants moved further in code. */
5550: update_reg_last_use (a, insert_before);
5551: update_reg_last_use (b, insert_before);
5552: update_reg_last_use (m, insert_before);
5553:
5554: start_sequence ();
5555: result = expand_mult_add (b, reg, m, a, GET_MODE (reg), 0);
5556: if (reg != result)
5557: emit_move_insn (reg, result);
5558: seq = gen_sequence ();
5559: end_sequence ();
5560:
5561: emit_insn_before (seq, insert_before);
5562: }
5563:
5564: /* Test whether A * B can be computed without
5565: an actual multiply insn. Value is 1 if so. */
5566:
5567: static int
5568: product_cheap_p (a, b)
5569: rtx a;
5570: rtx b;
5571: {
5572: int i;
5573: rtx tmp;
5574: struct obstack *old_rtl_obstack = rtl_obstack;
5575: char *storage = (char *) obstack_alloc (&temp_obstack, 0);
5576: int win = 1;
5577:
5578: /* If only one is constant, make it B. */
5579: if (GET_CODE (a) == CONST_INT)
5580: tmp = a, a = b, b = tmp;
5581:
5582: /* If first constant, both constant, so don't need multiply. */
5583: if (GET_CODE (a) == CONST_INT)
5584: return 1;
5585:
5586: /* If second not constant, neither is constant, so would need multiply. */
5587: if (GET_CODE (b) != CONST_INT)
5588: return 0;
5589:
5590: /* One operand is constant, so might not need multiply insn. Generate the
5591: code for the multiply and see if a call or multiply, or long sequence
5592: of insns is generated. */
5593:
5594: rtl_obstack = &temp_obstack;
5595: start_sequence ();
1.1.1.4 root 5596: expand_mult (GET_MODE (a), a, b, NULL_RTX, 0);
1.1 root 5597: tmp = gen_sequence ();
5598: end_sequence ();
5599:
5600: if (GET_CODE (tmp) == SEQUENCE)
5601: {
5602: if (XVEC (tmp, 0) == 0)
5603: win = 1;
5604: else if (XVECLEN (tmp, 0) > 3)
5605: win = 0;
5606: else
5607: for (i = 0; i < XVECLEN (tmp, 0); i++)
5608: {
5609: rtx insn = XVECEXP (tmp, 0, i);
5610:
5611: if (GET_CODE (insn) != INSN
5612: || (GET_CODE (PATTERN (insn)) == SET
5613: && GET_CODE (SET_SRC (PATTERN (insn))) == MULT)
5614: || (GET_CODE (PATTERN (insn)) == PARALLEL
5615: && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET
5616: && GET_CODE (SET_SRC (XVECEXP (PATTERN (insn), 0, 0))) == MULT))
5617: {
5618: win = 0;
5619: break;
5620: }
5621: }
5622: }
5623: else if (GET_CODE (tmp) == SET
5624: && GET_CODE (SET_SRC (tmp)) == MULT)
5625: win = 0;
5626: else if (GET_CODE (tmp) == PARALLEL
5627: && GET_CODE (XVECEXP (tmp, 0, 0)) == SET
5628: && GET_CODE (SET_SRC (XVECEXP (tmp, 0, 0))) == MULT)
5629: win = 0;
5630:
5631: /* Free any storage we obtained in generating this multiply and restore rtl
5632: allocation to its normal obstack. */
5633: obstack_free (&temp_obstack, storage);
5634: rtl_obstack = old_rtl_obstack;
5635:
5636: return win;
5637: }
5638:
5639: /* Check to see if loop can be terminated by a "decrement and branch until
5640: zero" instruction. If so, add a REG_NONNEG note to the branch insn if so.
5641: Also try reversing an increment loop to a decrement loop
5642: to see if the optimization can be performed.
5643: Value is nonzero if optimization was performed. */
5644:
5645: /* This is useful even if the architecture doesn't have such an insn,
5646: because it might change a loops which increments from 0 to n to a loop
5647: which decrements from n to 0. A loop that decrements to zero is usually
5648: faster than one that increments from zero. */
5649:
5650: /* ??? This could be rewritten to use some of the loop unrolling procedures,
5651: such as approx_final_value, biv_total_increment, loop_iterations, and
5652: final_[bg]iv_value. */
5653:
5654: static int
5655: check_dbra_loop (loop_end, insn_count, loop_start)
5656: rtx loop_end;
5657: int insn_count;
5658: rtx loop_start;
5659: {
5660: struct iv_class *bl;
5661: rtx reg;
5662: rtx jump_label;
5663: rtx final_value;
5664: rtx start_value;
5665: rtx new_add_val;
5666: rtx comparison;
5667: rtx before_comparison;
5668: rtx p;
5669:
5670: /* If last insn is a conditional branch, and the insn before tests a
5671: register value, try to optimize it. Otherwise, we can't do anything. */
5672:
5673: comparison = get_condition_for_loop (PREV_INSN (loop_end));
5674: if (comparison == 0)
5675: return 0;
5676:
5677: /* Check all of the bivs to see if the compare uses one of them.
5678: Skip biv's set more than once because we can't guarantee that
5679: it will be zero on the last iteration. Also skip if the biv is
5680: used between its update and the test insn. */
5681:
5682: for (bl = loop_iv_list; bl; bl = bl->next)
5683: {
5684: if (bl->biv_count == 1
5685: && bl->biv->dest_reg == XEXP (comparison, 0)
5686: && ! reg_used_between_p (regno_reg_rtx[bl->regno], bl->biv->insn,
5687: PREV_INSN (PREV_INSN (loop_end))))
5688: break;
5689: }
5690:
5691: if (! bl)
5692: return 0;
5693:
5694: /* Look for the case where the basic induction variable is always
5695: nonnegative, and equals zero on the last iteration.
5696: In this case, add a reg_note REG_NONNEG, which allows the
5697: m68k DBRA instruction to be used. */
5698:
5699: if (((GET_CODE (comparison) == GT
5700: && GET_CODE (XEXP (comparison, 1)) == CONST_INT
5701: && INTVAL (XEXP (comparison, 1)) == -1)
5702: || (GET_CODE (comparison) == NE && XEXP (comparison, 1) == const0_rtx))
5703: && GET_CODE (bl->biv->add_val) == CONST_INT
5704: && INTVAL (bl->biv->add_val) < 0)
5705: {
5706: /* Initial value must be greater than 0,
5707: init_val % -dec_value == 0 to ensure that it equals zero on
5708: the last iteration */
5709:
5710: if (GET_CODE (bl->initial_value) == CONST_INT
5711: && INTVAL (bl->initial_value) > 0
5712: && (INTVAL (bl->initial_value) %
5713: (-INTVAL (bl->biv->add_val))) == 0)
5714: {
5715: /* register always nonnegative, add REG_NOTE to branch */
5716: REG_NOTES (PREV_INSN (loop_end))
1.1.1.4 root 5717: = gen_rtx (EXPR_LIST, REG_NONNEG, NULL_RTX,
1.1 root 5718: REG_NOTES (PREV_INSN (loop_end)));
5719: bl->nonneg = 1;
5720:
5721: return 1;
5722: }
5723:
5724: /* If the decrement is 1 and the value was tested as >= 0 before
5725: the loop, then we can safely optimize. */
5726: for (p = loop_start; p; p = PREV_INSN (p))
5727: {
5728: if (GET_CODE (p) == CODE_LABEL)
5729: break;
5730: if (GET_CODE (p) != JUMP_INSN)
5731: continue;
5732:
5733: before_comparison = get_condition_for_loop (p);
5734: if (before_comparison
5735: && XEXP (before_comparison, 0) == bl->biv->dest_reg
5736: && GET_CODE (before_comparison) == LT
5737: && XEXP (before_comparison, 1) == const0_rtx
5738: && ! reg_set_between_p (bl->biv->dest_reg, p, loop_start)
5739: && INTVAL (bl->biv->add_val) == -1)
5740: {
5741: REG_NOTES (PREV_INSN (loop_end))
1.1.1.4 root 5742: = gen_rtx (EXPR_LIST, REG_NONNEG, NULL_RTX,
1.1 root 5743: REG_NOTES (PREV_INSN (loop_end)));
5744: bl->nonneg = 1;
5745:
5746: return 1;
5747: }
5748: }
5749: }
5750: else if (num_mem_sets <= 1)
5751: {
5752: /* Try to change inc to dec, so can apply above optimization. */
5753: /* Can do this if:
5754: all registers modified are induction variables or invariant,
5755: all memory references have non-overlapping addresses
5756: (obviously true if only one write)
5757: allow 2 insns for the compare/jump at the end of the loop. */
1.1.1.8 root 5758: /* Also, we must avoid any instructions which use both the reversed
5759: biv and another biv. Such instructions will fail if the loop is
5760: reversed. We meet this condition by requiring that either
5761: no_use_except_counting is true, or else that there is only
5762: one biv. */
1.1 root 5763: int num_nonfixed_reads = 0;
5764: /* 1 if the iteration var is used only to count iterations. */
5765: int no_use_except_counting = 0;
1.1.1.7 root 5766: /* 1 if the loop has no memory store, or it has a single memory store
5767: which is reversible. */
5768: int reversible_mem_store = 1;
1.1 root 5769:
5770: for (p = loop_start; p != loop_end; p = NEXT_INSN (p))
5771: if (GET_RTX_CLASS (GET_CODE (p)) == 'i')
5772: num_nonfixed_reads += count_nonfixed_reads (PATTERN (p));
5773:
5774: if (bl->giv_count == 0
1.1.1.8 root 5775: && ! loop_number_exit_count[uid_loop_num[INSN_UID (loop_start)]])
1.1 root 5776: {
5777: rtx bivreg = regno_reg_rtx[bl->regno];
5778:
5779: /* If there are no givs for this biv, and the only exit is the
5780: fall through at the end of the the loop, then
5781: see if perhaps there are no uses except to count. */
5782: no_use_except_counting = 1;
5783: for (p = loop_start; p != loop_end; p = NEXT_INSN (p))
5784: if (GET_RTX_CLASS (GET_CODE (p)) == 'i')
5785: {
5786: rtx set = single_set (p);
5787:
5788: if (set && GET_CODE (SET_DEST (set)) == REG
5789: && REGNO (SET_DEST (set)) == bl->regno)
5790: /* An insn that sets the biv is okay. */
5791: ;
5792: else if (p == prev_nonnote_insn (prev_nonnote_insn (loop_end))
5793: || p == prev_nonnote_insn (loop_end))
5794: /* Don't bother about the end test. */
5795: ;
5796: else if (reg_mentioned_p (bivreg, PATTERN (p)))
5797: /* Any other use of the biv is no good. */
5798: {
5799: no_use_except_counting = 0;
5800: break;
5801: }
5802: }
5803: }
5804:
1.1.1.7 root 5805: /* If the loop has a single store, and the destination address is
5806: invariant, then we can't reverse the loop, because this address
5807: might then have the wrong value at loop exit.
5808: This would work if the source was invariant also, however, in that
5809: case, the insn should have been moved out of the loop. */
5810:
5811: if (num_mem_sets == 1)
5812: reversible_mem_store
5813: = (! unknown_address_altered
5814: && ! invariant_p (XEXP (loop_store_mems[0], 0)));
5815:
1.1 root 5816: /* This code only acts for innermost loops. Also it simplifies
5817: the memory address check by only reversing loops with
5818: zero or one memory access.
5819: Two memory accesses could involve parts of the same array,
5820: and that can't be reversed. */
5821:
5822: if (num_nonfixed_reads <= 1
5823: && !loop_has_call
1.1.1.3 root 5824: && !loop_has_volatile
1.1.1.7 root 5825: && reversible_mem_store
1.1 root 5826: && (no_use_except_counting
1.1.1.8 root 5827: || ((bl->giv_count + bl->biv_count + num_mem_sets
5828: + num_movables + 2 == insn_count)
5829: && (bl == loop_iv_list && bl->next == 0))))
1.1 root 5830: {
5831: rtx tem;
5832:
5833: /* Loop can be reversed. */
5834: if (loop_dump_stream)
5835: fprintf (loop_dump_stream, "Can reverse loop\n");
5836:
5837: /* Now check other conditions:
5838: initial_value must be zero,
5839: final_value % add_val == 0, so that when reversed, the
5840: biv will be zero on the last iteration.
5841:
5842: This test can probably be improved since +/- 1 in the constant
5843: can be obtained by changing LT to LE and vice versa; this is
5844: confusing. */
5845:
5846: if (comparison && bl->initial_value == const0_rtx
5847: && GET_CODE (XEXP (comparison, 1)) == CONST_INT
5848: /* LE gets turned into LT */
5849: && GET_CODE (comparison) == LT
5850: && (INTVAL (XEXP (comparison, 1))
5851: % INTVAL (bl->biv->add_val)) == 0)
5852: {
5853: /* Register will always be nonnegative, with value
5854: 0 on last iteration if loop reversed */
5855:
5856: /* Save some info needed to produce the new insns. */
5857: reg = bl->biv->dest_reg;
5858: jump_label = XEXP (SET_SRC (PATTERN (PREV_INSN (loop_end))), 1);
1.1.1.4 root 5859: new_add_val = GEN_INT (- INTVAL (bl->biv->add_val));
1.1 root 5860:
5861: final_value = XEXP (comparison, 1);
1.1.1.4 root 5862: start_value = GEN_INT (INTVAL (XEXP (comparison, 1))
5863: - INTVAL (bl->biv->add_val));
1.1 root 5864:
5865: /* Initialize biv to start_value before loop start.
5866: The old initializing insn will be deleted as a
5867: dead store by flow.c. */
5868: emit_insn_before (gen_move_insn (reg, start_value), loop_start);
5869:
5870: /* Add insn to decrement register, and delete insn
5871: that incremented the register. */
5872: p = emit_insn_before (gen_add2_insn (reg, new_add_val),
5873: bl->biv->insn);
5874: delete_insn (bl->biv->insn);
5875:
5876: /* Update biv info to reflect its new status. */
5877: bl->biv->insn = p;
5878: bl->initial_value = start_value;
5879: bl->biv->add_val = new_add_val;
5880:
5881: /* Inc LABEL_NUSES so that delete_insn will
5882: not delete the label. */
5883: LABEL_NUSES (XEXP (jump_label, 0)) ++;
5884:
5885: /* Emit an insn after the end of the loop to set the biv's
5886: proper exit value if it is used anywhere outside the loop. */
5887: if ((regno_last_uid[bl->regno]
5888: != INSN_UID (PREV_INSN (PREV_INSN (loop_end))))
5889: || ! bl->init_insn
5890: || regno_first_uid[bl->regno] != INSN_UID (bl->init_insn))
5891: emit_insn_after (gen_move_insn (reg, final_value),
5892: loop_end);
5893:
5894: /* Delete compare/branch at end of loop. */
5895: delete_insn (PREV_INSN (loop_end));
5896: delete_insn (PREV_INSN (loop_end));
5897:
5898: /* Add new compare/branch insn at end of loop. */
5899: start_sequence ();
1.1.1.4 root 5900: emit_cmp_insn (reg, const0_rtx, GE, NULL_RTX,
5901: GET_MODE (reg), 0, 0);
1.1 root 5902: emit_jump_insn (gen_bge (XEXP (jump_label, 0)));
5903: tem = gen_sequence ();
5904: end_sequence ();
5905: emit_jump_insn_before (tem, loop_end);
5906:
5907: for (tem = PREV_INSN (loop_end);
5908: tem && GET_CODE (tem) != JUMP_INSN; tem = PREV_INSN (tem))
5909: ;
5910: if (tem)
5911: {
5912: JUMP_LABEL (tem) = XEXP (jump_label, 0);
5913:
5914: /* Increment of LABEL_NUSES done above. */
5915: /* Register is now always nonnegative,
5916: so add REG_NONNEG note to the branch. */
1.1.1.4 root 5917: REG_NOTES (tem) = gen_rtx (EXPR_LIST, REG_NONNEG, NULL_RTX,
1.1 root 5918: REG_NOTES (tem));
5919: }
5920:
5921: bl->nonneg = 1;
5922:
5923: /* Mark that this biv has been reversed. Each giv which depends
5924: on this biv, and which is also live past the end of the loop
5925: will have to be fixed up. */
5926:
5927: bl->reversed = 1;
5928:
5929: if (loop_dump_stream)
5930: fprintf (loop_dump_stream,
5931: "Reversed loop and added reg_nonneg\n");
5932:
5933: return 1;
5934: }
5935: }
5936: }
5937:
5938: return 0;
5939: }
5940:
5941: /* Verify whether the biv BL appears to be eliminable,
5942: based on the insns in the loop that refer to it.
5943: LOOP_START is the first insn of the loop, and END is the end insn.
5944:
5945: If ELIMINATE_P is non-zero, actually do the elimination.
5946:
5947: THRESHOLD and INSN_COUNT are from loop_optimize and are used to
5948: determine whether invariant insns should be placed inside or at the
5949: start of the loop. */
5950:
5951: static int
5952: maybe_eliminate_biv (bl, loop_start, end, eliminate_p, threshold, insn_count)
5953: struct iv_class *bl;
5954: rtx loop_start;
5955: rtx end;
5956: int eliminate_p;
5957: int threshold, insn_count;
5958: {
5959: rtx reg = bl->biv->dest_reg;
1.1.1.7 root 5960: rtx p;
1.1 root 5961:
5962: /* Scan all insns in the loop, stopping if we find one that uses the
5963: biv in a way that we cannot eliminate. */
5964:
5965: for (p = loop_start; p != end; p = NEXT_INSN (p))
5966: {
5967: enum rtx_code code = GET_CODE (p);
5968: rtx where = threshold >= insn_count ? loop_start : p;
5969:
5970: if ((code == INSN || code == JUMP_INSN || code == CALL_INSN)
5971: && reg_mentioned_p (reg, PATTERN (p))
5972: && ! maybe_eliminate_biv_1 (PATTERN (p), p, bl, eliminate_p, where))
5973: {
5974: if (loop_dump_stream)
5975: fprintf (loop_dump_stream,
5976: "Cannot eliminate biv %d: biv used in insn %d.\n",
5977: bl->regno, INSN_UID (p));
5978: break;
5979: }
5980: }
5981:
5982: if (p == end)
5983: {
5984: if (loop_dump_stream)
5985: fprintf (loop_dump_stream, "biv %d %s eliminated.\n",
5986: bl->regno, eliminate_p ? "was" : "can be");
5987: return 1;
5988: }
5989:
5990: return 0;
5991: }
5992:
5993: /* If BL appears in X (part of the pattern of INSN), see if we can
5994: eliminate its use. If so, return 1. If not, return 0.
5995:
5996: If BIV does not appear in X, return 1.
5997:
5998: If ELIMINATE_P is non-zero, actually do the elimination. WHERE indicates
5999: where extra insns should be added. Depending on how many items have been
6000: moved out of the loop, it will either be before INSN or at the start of
6001: the loop. */
6002:
6003: static int
6004: maybe_eliminate_biv_1 (x, insn, bl, eliminate_p, where)
6005: rtx x, insn;
6006: struct iv_class *bl;
6007: int eliminate_p;
6008: rtx where;
6009: {
6010: enum rtx_code code = GET_CODE (x);
6011: rtx reg = bl->biv->dest_reg;
6012: enum machine_mode mode = GET_MODE (reg);
6013: struct induction *v;
6014: rtx arg, new, tem;
6015: int arg_operand;
6016: char *fmt;
6017: int i, j;
6018:
6019: switch (code)
6020: {
6021: case REG:
6022: /* If we haven't already been able to do something with this BIV,
6023: we can't eliminate it. */
6024: if (x == reg)
6025: return 0;
6026: return 1;
6027:
6028: case SET:
6029: /* If this sets the BIV, it is not a problem. */
6030: if (SET_DEST (x) == reg)
6031: return 1;
6032:
6033: /* If this is an insn that defines a giv, it is also ok because
6034: it will go away when the giv is reduced. */
6035: for (v = bl->giv; v; v = v->next_iv)
6036: if (v->giv_type == DEST_REG && SET_DEST (x) == v->dest_reg)
6037: return 1;
6038:
6039: #ifdef HAVE_cc0
6040: if (SET_DEST (x) == cc0_rtx && SET_SRC (x) == reg)
6041: {
6042: /* Can replace with any giv that was reduced and
6043: that has (MULT_VAL != 0) and (ADD_VAL == 0).
1.1.1.9 ! root 6044: Require a constant for MULT_VAL, so we know it's nonzero.
! 6045: ??? We disable this optimization to avoid potential
! 6046: overflows. */
1.1 root 6047:
6048: for (v = bl->giv; v; v = v->next_iv)
6049: if (CONSTANT_P (v->mult_val) && v->mult_val != const0_rtx
6050: && v->add_val == const0_rtx
1.1.1.7 root 6051: && ! v->ignore && ! v->maybe_dead && v->always_computable
1.1.1.9 ! root 6052: && v->mode == mode
! 6053: && 0)
1.1 root 6054: {
6055: if (! eliminate_p)
6056: return 1;
6057:
6058: /* If the giv has the opposite direction of change,
6059: then reverse the comparison. */
6060: if (INTVAL (v->mult_val) < 0)
6061: new = gen_rtx (COMPARE, GET_MODE (v->new_reg),
6062: const0_rtx, v->new_reg);
6063: else
6064: new = v->new_reg;
6065:
6066: /* We can probably test that giv's reduced reg. */
6067: if (validate_change (insn, &SET_SRC (x), new, 0))
6068: return 1;
6069: }
6070:
6071: /* Look for a giv with (MULT_VAL != 0) and (ADD_VAL != 0);
6072: replace test insn with a compare insn (cmp REDUCED_GIV ADD_VAL).
1.1.1.9 ! root 6073: Require a constant for MULT_VAL, so we know it's nonzero.
! 6074: ??? Do this only if ADD_VAL is a pointer to avoid a potential
! 6075: overflow problem. */
1.1 root 6076:
6077: for (v = bl->giv; v; v = v->next_iv)
6078: if (CONSTANT_P (v->mult_val) && v->mult_val != const0_rtx
1.1.1.7 root 6079: && ! v->ignore && ! v->maybe_dead && v->always_computable
1.1.1.9 ! root 6080: && v->mode == mode
! 6081: && (GET_CODE (v->add_val) == SYMBOL_REF
! 6082: || GET_CODE (v->add_val) == LABEL_REF
! 6083: || GET_CODE (v->add_val) == CONST
! 6084: || (GET_CODE (v->add_val) == REG
! 6085: && REGNO_POINTER_FLAG (REGNO (v->add_val)))))
1.1 root 6086: {
6087: if (! eliminate_p)
6088: return 1;
6089:
6090: /* If the giv has the opposite direction of change,
6091: then reverse the comparison. */
6092: if (INTVAL (v->mult_val) < 0)
6093: new = gen_rtx (COMPARE, VOIDmode, copy_rtx (v->add_val),
6094: v->new_reg);
6095: else
6096: new = gen_rtx (COMPARE, VOIDmode, v->new_reg,
6097: copy_rtx (v->add_val));
6098:
6099: /* Replace biv with the giv's reduced register. */
6100: update_reg_last_use (v->add_val, insn);
6101: if (validate_change (insn, &SET_SRC (PATTERN (insn)), new, 0))
6102: return 1;
6103:
6104: /* Insn doesn't support that constant or invariant. Copy it
6105: into a register (it will be a loop invariant.) */
6106: tem = gen_reg_rtx (GET_MODE (v->new_reg));
6107:
6108: emit_insn_before (gen_move_insn (tem, copy_rtx (v->add_val)),
6109: where);
6110:
6111: if (validate_change (insn, &SET_SRC (PATTERN (insn)),
6112: gen_rtx (COMPARE, VOIDmode,
6113: v->new_reg, tem), 0))
6114: return 1;
6115: }
6116: }
6117: #endif
6118: break;
6119:
6120: case COMPARE:
6121: case EQ: case NE:
6122: case GT: case GE: case GTU: case GEU:
6123: case LT: case LE: case LTU: case LEU:
6124: /* See if either argument is the biv. */
6125: if (XEXP (x, 0) == reg)
6126: arg = XEXP (x, 1), arg_operand = 1;
6127: else if (XEXP (x, 1) == reg)
6128: arg = XEXP (x, 0), arg_operand = 0;
6129: else
6130: break;
6131:
6132: if (CONSTANT_P (arg))
6133: {
6134: /* First try to replace with any giv that has constant positive
6135: mult_val and constant add_val. We might be able to support
6136: negative mult_val, but it seems complex to do it in general. */
6137:
6138: for (v = bl->giv; v; v = v->next_iv)
6139: if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
1.1.1.9 ! root 6140: && (GET_CODE (v->add_val) == SYMBOL_REF
! 6141: || GET_CODE (v->add_val) == LABEL_REF
! 6142: || GET_CODE (v->add_val) == CONST
! 6143: || (GET_CODE (v->add_val) == REG
! 6144: && REGNO_POINTER_FLAG (REGNO (v->add_val))))
1.1.1.7 root 6145: && ! v->ignore && ! v->maybe_dead && v->always_computable
1.1 root 6146: && v->mode == mode)
6147: {
6148: if (! eliminate_p)
6149: return 1;
6150:
6151: /* Replace biv with the giv's reduced reg. */
6152: XEXP (x, 1-arg_operand) = v->new_reg;
6153:
6154: /* If all constants are actually constant integers and
6155: the derived constant can be directly placed in the COMPARE,
6156: do so. */
6157: if (GET_CODE (arg) == CONST_INT
6158: && GET_CODE (v->mult_val) == CONST_INT
6159: && GET_CODE (v->add_val) == CONST_INT
6160: && validate_change (insn, &XEXP (x, arg_operand),
1.1.1.4 root 6161: GEN_INT (INTVAL (arg)
6162: * INTVAL (v->mult_val)
6163: + INTVAL (v->add_val)), 0))
1.1 root 6164: return 1;
6165:
6166: /* Otherwise, load it into a register. */
6167: tem = gen_reg_rtx (mode);
6168: emit_iv_add_mult (arg, v->mult_val, v->add_val, tem, where);
6169: if (validate_change (insn, &XEXP (x, arg_operand), tem, 0))
6170: return 1;
6171:
6172: /* If that failed, put back the change we made above. */
6173: XEXP (x, 1-arg_operand) = reg;
6174: }
6175:
6176: /* Look for giv with positive constant mult_val and nonconst add_val.
1.1.1.9 ! root 6177: Insert insns to calculate new compare value.
! 6178: ??? Turn this off due to possible overflow. */
1.1 root 6179:
6180: for (v = bl->giv; v; v = v->next_iv)
1.1.1.2 root 6181: if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
1.1.1.7 root 6182: && ! v->ignore && ! v->maybe_dead && v->always_computable
1.1.1.9 ! root 6183: && v->mode == mode
! 6184: && 0)
1.1 root 6185: {
6186: rtx tem;
6187:
6188: if (! eliminate_p)
6189: return 1;
6190:
6191: tem = gen_reg_rtx (mode);
6192:
6193: /* Replace biv with giv's reduced register. */
6194: validate_change (insn, &XEXP (x, 1 - arg_operand),
6195: v->new_reg, 1);
6196:
6197: /* Compute value to compare against. */
6198: emit_iv_add_mult (arg, v->mult_val, v->add_val, tem, where);
6199: /* Use it in this insn. */
6200: validate_change (insn, &XEXP (x, arg_operand), tem, 1);
6201: if (apply_change_group ())
6202: return 1;
6203: }
6204: }
6205: else if (GET_CODE (arg) == REG || GET_CODE (arg) == MEM)
6206: {
6207: if (invariant_p (arg) == 1)
6208: {
6209: /* Look for giv with constant positive mult_val and nonconst
1.1.1.9 ! root 6210: add_val. Insert insns to compute new compare value.
! 6211: ??? Turn this off due to possible overflow. */
1.1 root 6212:
6213: for (v = bl->giv; v; v = v->next_iv)
6214: if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
1.1.1.7 root 6215: && ! v->ignore && ! v->maybe_dead && v->always_computable
1.1.1.9 ! root 6216: && v->mode == mode
! 6217: && 0)
1.1 root 6218: {
6219: rtx tem;
6220:
6221: if (! eliminate_p)
6222: return 1;
6223:
6224: tem = gen_reg_rtx (mode);
6225:
6226: /* Replace biv with giv's reduced register. */
6227: validate_change (insn, &XEXP (x, 1 - arg_operand),
6228: v->new_reg, 1);
6229:
6230: /* Compute value to compare against. */
6231: emit_iv_add_mult (arg, v->mult_val, v->add_val,
6232: tem, where);
6233: validate_change (insn, &XEXP (x, arg_operand), tem, 1);
6234: if (apply_change_group ())
6235: return 1;
6236: }
6237: }
6238:
6239: /* This code has problems. Basically, you can't know when
6240: seeing if we will eliminate BL, whether a particular giv
6241: of ARG will be reduced. If it isn't going to be reduced,
6242: we can't eliminate BL. We can try forcing it to be reduced,
6243: but that can generate poor code.
6244:
6245: The problem is that the benefit of reducing TV, below should
6246: be increased if BL can actually be eliminated, but this means
6247: we might have to do a topological sort of the order in which
6248: we try to process biv. It doesn't seem worthwhile to do
6249: this sort of thing now. */
6250:
6251: #if 0
6252: /* Otherwise the reg compared with had better be a biv. */
6253: if (GET_CODE (arg) != REG
6254: || reg_iv_type[REGNO (arg)] != BASIC_INDUCT)
6255: return 0;
6256:
6257: /* Look for a pair of givs, one for each biv,
6258: with identical coefficients. */
6259: for (v = bl->giv; v; v = v->next_iv)
6260: {
6261: struct induction *tv;
6262:
6263: if (v->ignore || v->maybe_dead || v->mode != mode)
6264: continue;
6265:
6266: for (tv = reg_biv_class[REGNO (arg)]->giv; tv; tv = tv->next_iv)
6267: if (! tv->ignore && ! tv->maybe_dead
6268: && rtx_equal_p (tv->mult_val, v->mult_val)
6269: && rtx_equal_p (tv->add_val, v->add_val)
6270: && tv->mode == mode)
6271: {
6272: if (! eliminate_p)
6273: return 1;
6274:
6275: /* Replace biv with its giv's reduced reg. */
6276: XEXP (x, 1-arg_operand) = v->new_reg;
6277: /* Replace other operand with the other giv's
6278: reduced reg. */
6279: XEXP (x, arg_operand) = tv->new_reg;
6280: return 1;
6281: }
6282: }
6283: #endif
6284: }
6285:
6286: /* If we get here, the biv can't be eliminated. */
6287: return 0;
6288:
6289: case MEM:
6290: /* If this address is a DEST_ADDR giv, it doesn't matter if the
6291: biv is used in it, since it will be replaced. */
6292: for (v = bl->giv; v; v = v->next_iv)
6293: if (v->giv_type == DEST_ADDR && v->location == &XEXP (x, 0))
6294: return 1;
6295: break;
6296: }
6297:
6298: /* See if any subexpression fails elimination. */
6299: fmt = GET_RTX_FORMAT (code);
6300: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
6301: {
6302: switch (fmt[i])
6303: {
6304: case 'e':
6305: if (! maybe_eliminate_biv_1 (XEXP (x, i), insn, bl,
6306: eliminate_p, where))
6307: return 0;
6308: break;
6309:
6310: case 'E':
6311: for (j = XVECLEN (x, i) - 1; j >= 0; j--)
6312: if (! maybe_eliminate_biv_1 (XVECEXP (x, i, j), insn, bl,
6313: eliminate_p, where))
6314: return 0;
6315: break;
6316: }
6317: }
6318:
6319: return 1;
6320: }
6321:
6322: /* Return nonzero if the last use of REG
6323: is in an insn following INSN in the same basic block. */
6324:
6325: static int
6326: last_use_this_basic_block (reg, insn)
6327: rtx reg;
6328: rtx insn;
6329: {
6330: rtx n;
6331: for (n = insn;
6332: n && GET_CODE (n) != CODE_LABEL && GET_CODE (n) != JUMP_INSN;
6333: n = NEXT_INSN (n))
6334: {
6335: if (regno_last_uid[REGNO (reg)] == INSN_UID (n))
6336: return 1;
6337: }
6338: return 0;
6339: }
6340:
6341: /* Called via `note_stores' to record the initial value of a biv. Here we
6342: just record the location of the set and process it later. */
6343:
6344: static void
6345: record_initial (dest, set)
6346: rtx dest;
6347: rtx set;
6348: {
6349: struct iv_class *bl;
6350:
6351: if (GET_CODE (dest) != REG
6352: || REGNO (dest) >= max_reg_before_loop
1.1.1.6 root 6353: || reg_iv_type[REGNO (dest)] != BASIC_INDUCT)
1.1 root 6354: return;
6355:
6356: bl = reg_biv_class[REGNO (dest)];
6357:
6358: /* If this is the first set found, record it. */
6359: if (bl->init_insn == 0)
6360: {
6361: bl->init_insn = note_insn;
6362: bl->init_set = set;
6363: }
6364: }
6365:
6366: /* If any of the registers in X are "old" and currently have a last use earlier
6367: than INSN, update them to have a last use of INSN. Their actual last use
6368: will be the previous insn but it will not have a valid uid_luid so we can't
6369: use it. */
6370:
6371: static void
6372: update_reg_last_use (x, insn)
6373: rtx x;
6374: rtx insn;
6375: {
6376: /* Check for the case where INSN does not have a valid luid. In this case,
6377: there is no need to modify the regno_last_uid, as this can only happen
6378: when code is inserted after the loop_end to set a pseudo's final value,
6379: and hence this insn will never be the last use of x. */
6380: if (GET_CODE (x) == REG && REGNO (x) < max_reg_before_loop
6381: && INSN_UID (insn) < max_uid_for_loop
6382: && uid_luid[regno_last_uid[REGNO (x)]] < uid_luid[INSN_UID (insn)])
6383: regno_last_uid[REGNO (x)] = INSN_UID (insn);
6384: else
6385: {
6386: register int i, j;
6387: register char *fmt = GET_RTX_FORMAT (GET_CODE (x));
6388: for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
6389: {
6390: if (fmt[i] == 'e')
6391: update_reg_last_use (XEXP (x, i), insn);
6392: else if (fmt[i] == 'E')
6393: for (j = XVECLEN (x, i) - 1; j >= 0; j--)
6394: update_reg_last_use (XVECEXP (x, i, j), insn);
6395: }
6396: }
6397: }
6398:
6399: /* Given a jump insn JUMP, return the condition that will cause it to branch
6400: to its JUMP_LABEL. If the condition cannot be understood, or is an
6401: inequality floating-point comparison which needs to be reversed, 0 will
6402: be returned.
6403:
6404: If EARLIEST is non-zero, it is a pointer to a place where the earliest
6405: insn used in locating the condition was found. If a replacement test
6406: of the condition is desired, it should be placed in front of that
6407: insn and we will be sure that the inputs are still valid.
6408:
6409: The condition will be returned in a canonical form to simplify testing by
6410: callers. Specifically:
6411:
6412: (1) The code will always be a comparison operation (EQ, NE, GT, etc.).
6413: (2) Both operands will be machine operands; (cc0) will have been replaced.
6414: (3) If an operand is a constant, it will be the second operand.
6415: (4) (LE x const) will be replaced with (LT x <const+1>) and similarly
6416: for GE, GEU, and LEU. */
6417:
6418: rtx
6419: get_condition (jump, earliest)
6420: rtx jump;
6421: rtx *earliest;
6422: {
6423: enum rtx_code code;
6424: rtx prev = jump;
6425: rtx set;
6426: rtx tem;
6427: rtx op0, op1;
6428: int reverse_code = 0;
6429: int did_reverse_condition = 0;
6430:
6431: /* If this is not a standard conditional jump, we can't parse it. */
6432: if (GET_CODE (jump) != JUMP_INSN
6433: || ! condjump_p (jump) || simplejump_p (jump))
6434: return 0;
6435:
6436: code = GET_CODE (XEXP (SET_SRC (PATTERN (jump)), 0));
6437: op0 = XEXP (XEXP (SET_SRC (PATTERN (jump)), 0), 0);
6438: op1 = XEXP (XEXP (SET_SRC (PATTERN (jump)), 0), 1);
6439:
6440: if (earliest)
6441: *earliest = jump;
6442:
6443: /* If this branches to JUMP_LABEL when the condition is false, reverse
6444: the condition. */
1.1.1.4 root 6445: if (GET_CODE (XEXP (SET_SRC (PATTERN (jump)), 2)) == LABEL_REF
6446: && XEXP (XEXP (SET_SRC (PATTERN (jump)), 2), 0) == JUMP_LABEL (jump))
1.1 root 6447: code = reverse_condition (code), did_reverse_condition ^= 1;
6448:
6449: /* If we are comparing a register with zero, see if the register is set
6450: in the previous insn to a COMPARE or a comparison operation. Perform
6451: the same tests as a function of STORE_FLAG_VALUE as find_comparison_args
6452: in cse.c */
6453:
1.1.1.8 root 6454: while (GET_RTX_CLASS (code) == '<' && op1 == CONST0_RTX (GET_MODE (op0)))
1.1 root 6455: {
6456: /* Set non-zero when we find something of interest. */
6457: rtx x = 0;
6458:
6459: #ifdef HAVE_cc0
6460: /* If comparison with cc0, import actual comparison from compare
6461: insn. */
6462: if (op0 == cc0_rtx)
6463: {
6464: if ((prev = prev_nonnote_insn (prev)) == 0
6465: || GET_CODE (prev) != INSN
6466: || (set = single_set (prev)) == 0
6467: || SET_DEST (set) != cc0_rtx)
6468: return 0;
6469:
6470: op0 = SET_SRC (set);
6471: op1 = CONST0_RTX (GET_MODE (op0));
6472: if (earliest)
6473: *earliest = prev;
6474: }
6475: #endif
6476:
6477: /* If this is a COMPARE, pick up the two things being compared. */
6478: if (GET_CODE (op0) == COMPARE)
6479: {
6480: op1 = XEXP (op0, 1);
6481: op0 = XEXP (op0, 0);
6482: continue;
6483: }
6484: else if (GET_CODE (op0) != REG)
6485: break;
6486:
6487: /* Go back to the previous insn. Stop if it is not an INSN. We also
6488: stop if it isn't a single set or if it has a REG_INC note because
6489: we don't want to bother dealing with it. */
6490:
6491: if ((prev = prev_nonnote_insn (prev)) == 0
6492: || GET_CODE (prev) != INSN
6493: || FIND_REG_INC_NOTE (prev, 0)
6494: || (set = single_set (prev)) == 0)
6495: break;
6496:
6497: /* If this is setting OP0, get what it sets it to if it looks
6498: relevant. */
6499: if (SET_DEST (set) == op0)
6500: {
6501: enum machine_mode inner_mode = GET_MODE (SET_SRC (set));
6502:
6503: if ((GET_CODE (SET_SRC (set)) == COMPARE
1.1.1.4 root 6504: || (((code == NE
6505: || (code == LT
6506: && GET_MODE_CLASS (inner_mode) == MODE_INT
6507: && (GET_MODE_BITSIZE (inner_mode)
6508: <= HOST_BITS_PER_WIDE_INT)
6509: && (STORE_FLAG_VALUE
6510: & ((HOST_WIDE_INT) 1
6511: << (GET_MODE_BITSIZE (inner_mode) - 1))))
6512: #ifdef FLOAT_STORE_FLAG_VALUE
6513: || (code == LT
6514: && GET_MODE_CLASS (inner_mode) == MODE_FLOAT
6515: && FLOAT_STORE_FLAG_VALUE < 0)
6516: #endif
6517: ))
1.1 root 6518: && GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<')))
6519: x = SET_SRC (set);
1.1.1.4 root 6520: else if (((code == EQ
6521: || (code == GE
6522: && (GET_MODE_BITSIZE (inner_mode)
6523: <= HOST_BITS_PER_WIDE_INT)
6524: && GET_MODE_CLASS (inner_mode) == MODE_INT
6525: && (STORE_FLAG_VALUE
6526: & ((HOST_WIDE_INT) 1
6527: << (GET_MODE_BITSIZE (inner_mode) - 1))))
6528: #ifdef FLOAT_STORE_FLAG_VALUE
6529: || (code == GE
6530: && GET_MODE_CLASS (inner_mode) == MODE_FLOAT
6531: && FLOAT_STORE_FLAG_VALUE < 0)
6532: #endif
6533: ))
1.1 root 6534: && GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<')
6535: {
6536: /* We might have reversed a LT to get a GE here. But this wasn't
6537: actually the comparison of data, so we don't flag that we
6538: have had to reverse the condition. */
6539: did_reverse_condition ^= 1;
6540: reverse_code = 1;
6541: x = SET_SRC (set);
6542: }
1.1.1.7 root 6543: else
6544: break;
1.1 root 6545: }
6546:
6547: else if (reg_set_p (op0, prev))
6548: /* If this sets OP0, but not directly, we have to give up. */
6549: break;
6550:
6551: if (x)
6552: {
6553: if (GET_RTX_CLASS (GET_CODE (x)) == '<')
6554: code = GET_CODE (x);
6555: if (reverse_code)
6556: {
6557: code = reverse_condition (code);
6558: did_reverse_condition ^= 1;
6559: reverse_code = 0;
6560: }
6561:
6562: op0 = XEXP (x, 0), op1 = XEXP (x, 1);
6563: if (earliest)
6564: *earliest = prev;
6565: }
6566: }
6567:
6568: /* If constant is first, put it last. */
6569: if (CONSTANT_P (op0))
6570: code = swap_condition (code), tem = op0, op0 = op1, op1 = tem;
6571:
6572: /* If OP0 is the result of a comparison, we weren't able to find what
6573: was really being compared, so fail. */
6574: if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
6575: return 0;
6576:
1.1.1.4 root 6577: /* Canonicalize any ordered comparison with integers involving equality
6578: if we can do computations in the relevant mode and we do not
6579: overflow. */
6580:
6581: if (GET_CODE (op1) == CONST_INT
6582: && GET_MODE (op0) != VOIDmode
6583: && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT)
6584: {
6585: HOST_WIDE_INT const_val = INTVAL (op1);
6586: unsigned HOST_WIDE_INT uconst_val = const_val;
6587: unsigned HOST_WIDE_INT max_val
6588: = (unsigned HOST_WIDE_INT) GET_MODE_MASK (GET_MODE (op0));
1.1 root 6589:
6590: switch (code)
1.1.1.4 root 6591: {
6592: case LE:
6593: if (const_val != max_val >> 1)
6594: code = LT, op1 = GEN_INT (const_val + 1);
6595: break;
1.1 root 6596:
1.1.1.4 root 6597: case GE:
6598: if (const_val
6599: != (((HOST_WIDE_INT) 1
6600: << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
6601: code = GT, op1 = GEN_INT (const_val - 1);
6602: break;
1.1 root 6603:
1.1.1.4 root 6604: case LEU:
6605: if (uconst_val != max_val)
6606: code = LTU, op1 = GEN_INT (uconst_val + 1);
6607: break;
1.1 root 6608:
1.1.1.4 root 6609: case GEU:
6610: if (uconst_val != 0)
6611: code = GTU, op1 = GEN_INT (uconst_val - 1);
6612: break;
6613: }
1.1 root 6614: }
6615:
6616: /* If this was floating-point and we reversed anything other than an
6617: EQ or NE, return zero. */
6618: if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
6619: && did_reverse_condition && code != NE && code != EQ
1.1.1.7 root 6620: && ! flag_fast_math
1.1 root 6621: && GET_MODE_CLASS (GET_MODE (op0)) == MODE_FLOAT)
6622: return 0;
6623:
6624: #ifdef HAVE_cc0
6625: /* Never return CC0; return zero instead. */
6626: if (op0 == cc0_rtx)
6627: return 0;
6628: #endif
6629:
6630: return gen_rtx (code, VOIDmode, op0, op1);
6631: }
6632:
6633: /* Similar to above routine, except that we also put an invariant last
6634: unless both operands are invariants. */
6635:
6636: rtx
6637: get_condition_for_loop (x)
6638: rtx x;
6639: {
1.1.1.4 root 6640: rtx comparison = get_condition (x, NULL_PTR);
1.1 root 6641:
6642: if (comparison == 0
6643: || ! invariant_p (XEXP (comparison, 0))
6644: || invariant_p (XEXP (comparison, 1)))
6645: return comparison;
6646:
6647: return gen_rtx (swap_condition (GET_CODE (comparison)), VOIDmode,
6648: XEXP (comparison, 1), XEXP (comparison, 0));
6649: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.