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