OSDN Git Service

d
[pf3gnuchains/gcc-fork.git] / gcc / loop.c
1 /* Perform various loop optimizations, including strength reduction.
2    Copyright (C) 1987, 88, 89, 91-97, 1998 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.  */
20
21
22 /* This is the loop optimization pass of the compiler.
23    It finds invariant computations within loops and moves them
24    to the beginning of the loop.  Then it identifies basic and 
25    general induction variables.  Strength reduction is applied to the general
26    induction variables, and induction variable elimination is applied to
27    the basic induction variables.
28
29    It also finds cases where
30    a register is set within the loop by zero-extending a narrower value
31    and changes these to zero the entire register once before the loop
32    and merely copy the low part within the loop.
33
34    Most of the complexity is in heuristics to decide when it is worth
35    while to do these things.  */
36
37 #include "config.h"
38 #include "system.h"
39 #include "rtl.h"
40 #include "obstack.h"
41 #include "expr.h"
42 #include "insn-config.h"
43 #include "insn-flags.h"
44 #include "regs.h"
45 #include "hard-reg-set.h"
46 #include "recog.h"
47 #include "flags.h"
48 #include "real.h"
49 #include "loop.h"
50 #include "except.h"
51 #include "toplev.h"
52
53 /* Vector mapping INSN_UIDs to luids.
54    The luids are like uids but increase monotonically always.
55    We use them to see whether a jump comes from outside a given loop.  */
56
57 int *uid_luid;
58
59 /* Indexed by INSN_UID, contains the ordinal giving the (innermost) loop
60    number the insn is contained in.  */
61
62 int *uid_loop_num;
63
64 /* 1 + largest uid of any insn.  */
65
66 int max_uid_for_loop;
67
68 /* 1 + luid of last insn.  */
69
70 static int max_luid;
71
72 /* Number of loops detected in current function.  Used as index to the
73    next few tables.  */
74
75 static int max_loop_num;
76
77 /* Indexed by loop number, contains the first and last insn of each loop.  */
78
79 static rtx *loop_number_loop_starts, *loop_number_loop_ends;
80
81 /* For each loop, gives the containing loop number, -1 if none.  */
82
83 int *loop_outer_loop;
84
85 #ifdef HAVE_decrement_and_branch_on_count
86 /* Records whether resource in use by inner loop.  */
87
88 int *loop_used_count_register;
89 #endif  /* HAVE_decrement_and_branch_on_count */
90
91 /* For each loop, keep track of its unrolling factor.
92    Potential values:
93       0: unrolled
94       1: not unrolled.
95      -1: completely unrolled
96      >0: holds the unroll exact factor.  */
97 int *loop_unroll_factor;
98
99 /* Indexed by loop number, contains a nonzero value if the "loop" isn't
100    really a loop (an insn outside the loop branches into it).  */
101
102 static char *loop_invalid;
103
104 /* Indexed by loop number, links together all LABEL_REFs which refer to
105    code labels outside the loop.  Used by routines that need to know all
106    loop exits, such as final_biv_value and final_giv_value.
107
108    This does not include loop exits due to return instructions.  This is
109    because all bivs and givs are pseudos, and hence must be dead after a
110    return, so the presense of a return does not affect any of the
111    optimizations that use this info.  It is simpler to just not include return
112    instructions on this list.  */
113
114 rtx *loop_number_exit_labels;
115
116 /* Indexed by loop number, counts the number of LABEL_REFs on
117    loop_number_exit_labels for this loop and all loops nested inside it.  */
118
119 int *loop_number_exit_count;
120
121 /* Holds the number of loop iterations.  It is zero if the number could not be
122    calculated.  Must be unsigned since the number of iterations can
123    be as high as 2^wordsize-1.  For loops with a wider iterator, this number
124    will be zero if the number of loop iterations is too large for an
125    unsigned integer to hold.  */
126
127 unsigned HOST_WIDE_INT loop_n_iterations;
128
129 /* Nonzero if there is a subroutine call in the current loop.  */
130
131 static int loop_has_call;
132
133 /* Nonzero if there is a volatile memory reference in the current
134    loop.  */
135
136 static int loop_has_volatile;
137
138 /* Nonzero if there is a tablejump in the current loop.  */
139
140 static int loop_has_tablejump;
141
142 /* Added loop_continue which is the NOTE_INSN_LOOP_CONT of the
143    current loop.  A continue statement will generate a branch to
144    NEXT_INSN (loop_continue).  */
145
146 static rtx loop_continue;
147
148 /* Indexed by register number, contains the number of times the reg
149    is set during the loop being scanned.
150    During code motion, a negative value indicates a reg that has been
151    made a candidate; in particular -2 means that it is an candidate that
152    we know is equal to a constant and -1 means that it is an candidate
153    not known equal to a constant.
154    After code motion, regs moved have 0 (which is accurate now)
155    while the failed candidates have the original number of times set.
156
157    Therefore, at all times, == 0 indicates an invariant register;
158    < 0 a conditionally invariant one.  */
159
160 static varray_type n_times_set;
161
162 /* Original value of n_times_set; same except that this value
163    is not set negative for a reg whose sets have been made candidates
164    and not set to 0 for a reg that is moved.  */
165
166 static varray_type n_times_used;
167
168 /* Index by register number, 1 indicates that the register
169    cannot be moved or strength reduced.  */
170
171 static varray_type may_not_optimize;
172
173 /* Nonzero means reg N has already been moved out of one loop.
174    This reduces the desire to move it out of another.  */
175
176 static char *moved_once;
177
178 /* Array of MEMs that are stored in this loop. If there are too many to fit
179    here, we just turn on unknown_address_altered.  */
180
181 #define NUM_STORES 30
182 static rtx loop_store_mems[NUM_STORES];
183
184 /* Index of first available slot in above array.  */
185 static int loop_store_mems_idx;
186
187 typedef struct loop_mem_info {
188   rtx mem;      /* The MEM itself.  */
189   rtx reg;      /* Corresponding pseudo, if any.  */
190   int optimize; /* Nonzero if we can optimize access to this MEM.  */
191 } loop_mem_info;
192
193 /* Array of MEMs that are used (read or written) in this loop, but
194    cannot be aliased by anything in this loop, except perhaps
195    themselves.  In other words, if loop_mems[i] is altered during the
196    loop, it is altered by an expression that is rtx_equal_p to it.  */
197
198 static loop_mem_info *loop_mems;
199
200 /* The index of the next available slot in LOOP_MEMS.  */
201
202 static int loop_mems_idx;
203
204 /* The number of elements allocated in LOOP_MEMs.  */
205
206 static int loop_mems_allocated;
207
208 /* Nonzero if we don't know what MEMs were changed in the current loop.
209    This happens if the loop contains a call (in which case `loop_has_call'
210    will also be set) or if we store into more than NUM_STORES MEMs.  */
211
212 static int unknown_address_altered;
213
214 /* Count of movable (i.e. invariant) instructions discovered in the loop.  */
215 static int num_movables;
216
217 /* Count of memory write instructions discovered in the loop.  */
218 static int num_mem_sets;
219
220 /* Number of loops contained within the current one, including itself.  */
221 static int loops_enclosed;
222
223 /* Bound on pseudo register number before loop optimization.
224    A pseudo has valid regscan info if its number is < max_reg_before_loop.  */
225 int max_reg_before_loop;
226
227 /* This obstack is used in product_cheap_p to allocate its rtl.  It
228    may call gen_reg_rtx which, in turn, may reallocate regno_reg_rtx.
229    If we used the same obstack that it did, we would be deallocating
230    that array.  */
231
232 static struct obstack temp_obstack;
233
234 /* This is where the pointer to the obstack being used for RTL is stored.  */
235
236 extern struct obstack *rtl_obstack;
237
238 #define obstack_chunk_alloc xmalloc
239 #define obstack_chunk_free free
240 \f
241 /* During the analysis of a loop, a chain of `struct movable's
242    is made to record all the movable insns found.
243    Then the entire chain can be scanned to decide which to move.  */
244
245 struct movable
246 {
247   rtx insn;                     /* A movable insn */
248   rtx set_src;                  /* The expression this reg is set from.  */
249   rtx set_dest;                 /* The destination of this SET.  */
250   rtx dependencies;             /* When INSN is libcall, this is an EXPR_LIST
251                                    of any registers used within the LIBCALL.  */
252   int consec;                   /* Number of consecutive following insns 
253                                    that must be moved with this one.  */
254   int regno;                    /* The register it sets */
255   short lifetime;               /* lifetime of that register;
256                                    may be adjusted when matching movables
257                                    that load the same value are found.  */
258   short savings;                /* Number of insns we can move for this reg,
259                                    including other movables that force this
260                                    or match this one.  */
261   unsigned int cond : 1;        /* 1 if only conditionally movable */
262   unsigned int force : 1;       /* 1 means MUST move this insn */
263   unsigned int global : 1;      /* 1 means reg is live outside this loop */
264                 /* If PARTIAL is 1, GLOBAL means something different:
265                    that the reg is live outside the range from where it is set
266                    to the following label.  */
267   unsigned int done : 1;        /* 1 inhibits further processing of this */
268   
269   unsigned int partial : 1;     /* 1 means this reg is used for zero-extending.
270                                    In particular, moving it does not make it
271                                    invariant.  */
272   unsigned int move_insn : 1;   /* 1 means that we call emit_move_insn to
273                                    load SRC, rather than copying INSN.  */
274   unsigned int move_insn_first:1;/* Same as above, if this is necessary for the
275                                     first insn of a consecutive sets group.  */
276   unsigned int is_equiv : 1;    /* 1 means a REG_EQUIV is present on INSN.  */
277   enum machine_mode savemode;   /* Nonzero means it is a mode for a low part
278                                    that we should avoid changing when clearing
279                                    the rest of the reg.  */
280   struct movable *match;        /* First entry for same value */
281   struct movable *forces;       /* An insn that must be moved if this is */
282   struct movable *next;
283 };
284
285 static struct movable *the_movables;
286
287 FILE *loop_dump_stream;
288
289 /* Forward declarations.  */
290
291 static void find_and_verify_loops PROTO((rtx));
292 static void mark_loop_jump PROTO((rtx, int));
293 static void prescan_loop PROTO((rtx, rtx));
294 static int reg_in_basic_block_p PROTO((rtx, rtx));
295 static int consec_sets_invariant_p PROTO((rtx, int, rtx));
296 static rtx libcall_other_reg PROTO((rtx, rtx));
297 static int labels_in_range_p PROTO((rtx, int));
298 static void count_one_set PROTO((rtx, rtx, varray_type, rtx *));
299
300 static void count_loop_regs_set PROTO((rtx, rtx, varray_type, varray_type,
301                                        int *, int)); 
302 static void note_addr_stored PROTO((rtx, rtx));
303 static int loop_reg_used_before_p PROTO((rtx, rtx, rtx, rtx, rtx));
304 static void scan_loop PROTO((rtx, rtx, int, int));
305 #if 0
306 static void replace_call_address PROTO((rtx, rtx, rtx));
307 #endif
308 static rtx skip_consec_insns PROTO((rtx, int));
309 static int libcall_benefit PROTO((rtx));
310 static void ignore_some_movables PROTO((struct movable *));
311 static void force_movables PROTO((struct movable *));
312 static void combine_movables PROTO((struct movable *, int));
313 static int regs_match_p PROTO((rtx, rtx, struct movable *));
314 static int rtx_equal_for_loop_p PROTO((rtx, rtx, struct movable *));
315 static void add_label_notes PROTO((rtx, rtx));
316 static void move_movables PROTO((struct movable *, int, int, rtx, rtx, int));
317 static int count_nonfixed_reads PROTO((rtx));
318 static void strength_reduce PROTO((rtx, rtx, rtx, int, rtx, rtx, int, int));
319 static void find_single_use_in_loop PROTO((rtx, rtx, varray_type));
320 static int valid_initial_value_p PROTO((rtx, rtx, int, rtx));
321 static void find_mem_givs PROTO((rtx, rtx, int, rtx, rtx));
322 static void record_biv PROTO((struct induction *, rtx, rtx, rtx, rtx, int, int));
323 static void check_final_value PROTO((struct induction *, rtx, rtx));
324 static void record_giv PROTO((struct induction *, rtx, rtx, rtx, rtx, rtx, int, enum g_types, int, rtx *, rtx, rtx));
325 static void update_giv_derive PROTO((rtx));
326 static int basic_induction_var PROTO((rtx, enum machine_mode, rtx, rtx, rtx *, rtx *));
327 static rtx simplify_giv_expr PROTO((rtx, int *));
328 static int general_induction_var PROTO((rtx, rtx *, rtx *, rtx *, int, int *));
329 static int consec_sets_giv PROTO((int, rtx, rtx, rtx, rtx *, rtx *));
330 static int check_dbra_loop PROTO((rtx, int, rtx));
331 static rtx express_from_1 PROTO((rtx, rtx, rtx));
332 static rtx express_from PROTO((struct induction *, struct induction *));
333 static rtx combine_givs_p PROTO((struct induction *, struct induction *));
334 static void combine_givs PROTO((struct iv_class *));
335 static int product_cheap_p PROTO((rtx, rtx));
336 static int maybe_eliminate_biv PROTO((struct iv_class *, rtx, rtx, int, int, int));
337 static int maybe_eliminate_biv_1 PROTO((rtx, rtx, struct iv_class *, int, rtx));
338 static int last_use_this_basic_block PROTO((rtx, rtx));
339 static void record_initial PROTO((rtx, rtx));
340 static void update_reg_last_use PROTO((rtx, rtx));
341 static rtx next_insn_in_loop PROTO((rtx, rtx, rtx, rtx));
342 static void load_mems_and_recount_loop_regs_set PROTO((rtx, rtx, rtx,
343                                                        rtx, varray_type, 
344                                                        int *));
345 static void load_mems PROTO((rtx, rtx, rtx, rtx));
346 static int insert_loop_mem PROTO((rtx *, void *));
347 static int replace_loop_mem PROTO((rtx *, void *));
348 static int replace_label PROTO((rtx *, void *));
349
350 typedef struct rtx_and_int {
351   rtx r;
352   int i;
353 } rtx_and_int;
354
355 typedef struct rtx_pair {
356   rtx r1;
357   rtx r2;
358 } rtx_pair;
359
360 /* Nonzero iff INSN is between START and END, inclusive.  */
361 #define INSN_IN_RANGE_P(INSN, START, END)       \
362   (INSN_UID (INSN) < max_uid_for_loop           \
363    && INSN_LUID (INSN) >= INSN_LUID (START)     \
364    && INSN_LUID (INSN) <= INSN_LUID (END))
365
366 #ifdef HAVE_decrement_and_branch_on_count
367 /* Test whether BCT applicable and safe.  */
368 static void insert_bct PROTO((rtx, rtx));
369
370 /* Auxiliary function that inserts the BCT pattern into the loop.  */
371 static void instrument_loop_bct PROTO((rtx, rtx, rtx));
372 #endif /* HAVE_decrement_and_branch_on_count */
373
374 /* Indirect_jump_in_function is computed once per function.  */
375 int indirect_jump_in_function = 0;
376 static int indirect_jump_in_function_p PROTO((rtx));
377
378 \f
379 /* Relative gain of eliminating various kinds of operations.  */
380 static int add_cost;
381 #if 0
382 static int shift_cost;
383 static int mult_cost;
384 #endif
385
386 /* Benefit penalty, if a giv is not replaceable, i.e. must emit an insn to
387    copy the value of the strength reduced giv to its original register.  */
388 static int copy_cost;
389
390 /* Cost of using a register, to normalize the benefits of a giv.  */
391 static int reg_address_cost;
392
393
394 void
395 init_loop ()
396 {
397   char *free_point = (char *) oballoc (1);
398   rtx reg = gen_rtx_REG (word_mode, LAST_VIRTUAL_REGISTER + 1);
399
400   add_cost = rtx_cost (gen_rtx_PLUS (word_mode, reg, reg), SET);
401
402 #ifdef ADDRESS_COST
403   reg_address_cost = ADDRESS_COST (reg);
404 #else
405   reg_address_cost = rtx_cost (reg, MEM);
406 #endif
407
408   /* We multiply by 2 to reconcile the difference in scale between
409      these two ways of computing costs.  Otherwise the cost of a copy
410      will be far less than the cost of an add.  */
411
412   copy_cost = 2 * 2;
413
414   /* Free the objects we just allocated.  */
415   obfree (free_point);
416
417   /* Initialize the obstack used for rtl in product_cheap_p.  */
418   gcc_obstack_init (&temp_obstack);
419 }
420 \f
421 /* Entry point of this file.  Perform loop optimization
422    on the current function.  F is the first insn of the function
423    and DUMPFILE is a stream for output of a trace of actions taken
424    (or 0 if none should be output).  */
425
426 void
427 loop_optimize (f, dumpfile, unroll_p, bct_p)
428      /* f is the first instruction of a chain of insns for one function */
429      rtx f;
430      FILE *dumpfile;
431      int unroll_p, bct_p;
432 {
433   register rtx insn;
434   register int i;
435   rtx last_insn;
436
437   loop_dump_stream = dumpfile;
438
439   init_recog_no_volatile ();
440
441   max_reg_before_loop = max_reg_num ();
442
443   moved_once = (char *) alloca (max_reg_before_loop);
444   bzero (moved_once, max_reg_before_loop);
445
446   regs_may_share = 0;
447
448   /* Count the number of loops.  */
449
450   max_loop_num = 0;
451   for (insn = f; insn; insn = NEXT_INSN (insn))
452     {
453       if (GET_CODE (insn) == NOTE
454           && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
455         max_loop_num++;
456     }
457
458   /* Don't waste time if no loops.  */
459   if (max_loop_num == 0)
460     return;
461
462   /* Get size to use for tables indexed by uids.
463      Leave some space for labels allocated by find_and_verify_loops.  */
464   max_uid_for_loop = get_max_uid () + 1 + max_loop_num * 32;
465
466   uid_luid = (int *) alloca (max_uid_for_loop * sizeof (int));
467   uid_loop_num = (int *) alloca (max_uid_for_loop * sizeof (int));
468
469   bzero ((char *) uid_luid, max_uid_for_loop * sizeof (int));
470   bzero ((char *) uid_loop_num, max_uid_for_loop * sizeof (int));
471
472   /* Allocate tables for recording each loop.  We set each entry, so they need
473      not be zeroed.  */
474   loop_number_loop_starts = (rtx *) alloca (max_loop_num * sizeof (rtx));
475   loop_number_loop_ends = (rtx *) alloca (max_loop_num * sizeof (rtx));
476   loop_outer_loop = (int *) alloca (max_loop_num * sizeof (int));
477   loop_invalid = (char *) alloca (max_loop_num * sizeof (char));
478   loop_number_exit_labels = (rtx *) alloca (max_loop_num * sizeof (rtx));
479   loop_number_exit_count = (int *) alloca (max_loop_num * sizeof (int));
480
481   /* This is initialized by the unrolling code, so we go ahead
482      and clear them just in case we are not performing loop
483      unrolling.  */
484   loop_unroll_factor = (int *) alloca (max_loop_num *sizeof (int));
485   bzero ((char *) loop_unroll_factor, max_loop_num * sizeof (int));
486
487 #ifdef HAVE_decrement_and_branch_on_count
488   /* Allocate for BCT optimization */
489   loop_used_count_register = (int *) alloca (max_loop_num * sizeof (int));
490   bzero ((char *) loop_used_count_register, max_loop_num * sizeof (int));
491 #endif  /* HAVE_decrement_and_branch_on_count */
492
493   /* Find and process each loop.
494      First, find them, and record them in order of their beginnings.  */
495   find_and_verify_loops (f);
496
497   /* Now find all register lifetimes.  This must be done after
498      find_and_verify_loops, because it might reorder the insns in the
499      function.  */
500   reg_scan (f, max_reg_num (), 1);
501
502   /* This must occur after reg_scan so that registers created by gcse
503      will have entries in the register tables.
504
505      We could have added a call to reg_scan after gcse_main in toplev.c,
506      but moving this call to init_alias_analysis is more efficient.  */
507   init_alias_analysis ();
508
509   /* See if we went too far.  */
510   if (get_max_uid () > max_uid_for_loop)
511     abort ();
512   /* Now reset it to the actual size we need.  See above.  */
513   max_uid_for_loop = get_max_uid () + 1;
514
515   /* Compute the mapping from uids to luids.
516      LUIDs are numbers assigned to insns, like uids,
517      except that luids increase monotonically through the code.
518      Don't assign luids to line-number NOTEs, so that the distance in luids
519      between two insns is not affected by -g.  */
520
521   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
522     {
523       last_insn = insn;
524       if (GET_CODE (insn) != NOTE
525           || NOTE_LINE_NUMBER (insn) <= 0)
526         uid_luid[INSN_UID (insn)] = ++i;
527       else
528         /* Give a line number note the same luid as preceding insn.  */
529         uid_luid[INSN_UID (insn)] = i;
530     }
531
532   max_luid = i + 1;
533
534   /* Don't leave gaps in uid_luid for insns that have been
535      deleted.  It is possible that the first or last insn
536      using some register has been deleted by cross-jumping.
537      Make sure that uid_luid for that former insn's uid
538      points to the general area where that insn used to be.  */
539   for (i = 0; i < max_uid_for_loop; i++)
540     {
541       uid_luid[0] = uid_luid[i];
542       if (uid_luid[0] != 0)
543         break;
544     }
545   for (i = 0; i < max_uid_for_loop; i++)
546     if (uid_luid[i] == 0)
547       uid_luid[i] = uid_luid[i - 1];
548
549   /* Create a mapping from loops to BLOCK tree nodes.  */
550   if (unroll_p && write_symbols != NO_DEBUG)
551     find_loop_tree_blocks ();
552
553   /* Determine if the function has indirect jump.  On some systems
554      this prevents low overhead loop instructions from being used.  */
555   indirect_jump_in_function = indirect_jump_in_function_p (f);
556
557   /* Now scan the loops, last ones first, since this means inner ones are done
558      before outer ones.  */
559   for (i = max_loop_num-1; i >= 0; i--)
560     if (! loop_invalid[i] && loop_number_loop_ends[i])
561       scan_loop (loop_number_loop_starts[i], loop_number_loop_ends[i],
562                  unroll_p, bct_p);
563
564   /* If debugging and unrolling loops, we must replicate the tree nodes
565      corresponding to the blocks inside the loop, so that the original one
566      to one mapping will remain.  */
567   if (unroll_p && write_symbols != NO_DEBUG)
568     unroll_block_trees ();
569
570   end_alias_analysis ();
571 }
572 \f
573 /* Returns the next insn, in execution order, after INSN.  START and
574    END are the NOTE_INSN_LOOP_BEG and NOTE_INSN_LOOP_END for the loop,
575    respectively.  LOOP_TOP, if non-NULL, is the top of the loop in the
576    insn-stream; it is used with loops that are entered near the
577    bottom.  */
578
579 static rtx
580 next_insn_in_loop (insn, start, end, loop_top)
581      rtx insn;
582      rtx start;
583      rtx end;
584      rtx loop_top;
585 {
586   insn = NEXT_INSN (insn);
587
588   if (insn == end)
589     {
590       if (loop_top)
591         /* Go to the top of the loop, and continue there.  */
592         insn = loop_top;
593       else
594         /* We're done.  */
595         insn = NULL_RTX;
596     }
597
598   if (insn == start)
599     /* We're done.  */
600     insn = NULL_RTX;
601
602   return insn;
603 }
604
605 /* Optimize one loop whose start is LOOP_START and end is END.
606    LOOP_START is the NOTE_INSN_LOOP_BEG and END is the matching
607    NOTE_INSN_LOOP_END.  */
608
609 /* ??? Could also move memory writes out of loops if the destination address
610    is invariant, the source is invariant, the memory write is not volatile,
611    and if we can prove that no read inside the loop can read this address
612    before the write occurs.  If there is a read of this address after the
613    write, then we can also mark the memory read as invariant.  */
614
615 static void
616 scan_loop (loop_start, end, unroll_p, bct_p)
617      rtx loop_start, end;
618      int unroll_p, bct_p;
619 {
620   register int i;
621   rtx p;
622   /* 1 if we are scanning insns that could be executed zero times.  */
623   int maybe_never = 0;
624   /* 1 if we are scanning insns that might never be executed
625      due to a subroutine call which might exit before they are reached.  */
626   int call_passed = 0;
627   /* For a rotated loop that is entered near the bottom,
628      this is the label at the top.  Otherwise it is zero.  */
629   rtx loop_top = 0;
630   /* Jump insn that enters the loop, or 0 if control drops in.  */
631   rtx loop_entry_jump = 0;
632   /* Place in the loop where control enters.  */
633   rtx scan_start;
634   /* Number of insns in the loop.  */
635   int insn_count;
636   int in_libcall = 0;
637   int tem;
638   rtx temp;
639   /* The SET from an insn, if it is the only SET in the insn.  */
640   rtx set, set1;
641   /* Chain describing insns movable in current loop.  */
642   struct movable *movables = 0;
643   /* Last element in `movables' -- so we can add elements at the end.  */
644   struct movable *last_movable = 0;
645   /* Ratio of extra register life span we can justify
646      for saving an instruction.  More if loop doesn't call subroutines
647      since in that case saving an insn makes more difference
648      and more registers are available.  */
649   int threshold;
650   /* If we have calls, contains the insn in which a register was used
651      if it was used exactly once; contains const0_rtx if it was used more
652      than once.  */
653   varray_type reg_single_usage = 0;
654   /* Nonzero if we are scanning instructions in a sub-loop.  */
655   int loop_depth = 0;
656   int nregs;
657
658   /* Determine whether this loop starts with a jump down to a test at
659      the end.  This will occur for a small number of loops with a test
660      that is too complex to duplicate in front of the loop.
661
662      We search for the first insn or label in the loop, skipping NOTEs.
663      However, we must be careful not to skip past a NOTE_INSN_LOOP_BEG
664      (because we might have a loop executed only once that contains a
665      loop which starts with a jump to its exit test) or a NOTE_INSN_LOOP_END
666      (in case we have a degenerate loop).
667
668      Note that if we mistakenly think that a loop is entered at the top
669      when, in fact, it is entered at the exit test, the only effect will be
670      slightly poorer optimization.  Making the opposite error can generate
671      incorrect code.  Since very few loops now start with a jump to the 
672      exit test, the code here to detect that case is very conservative.  */
673
674   for (p = NEXT_INSN (loop_start);
675        p != end
676          && GET_CODE (p) != CODE_LABEL && GET_RTX_CLASS (GET_CODE (p)) != 'i'
677          && (GET_CODE (p) != NOTE
678              || (NOTE_LINE_NUMBER (p) != NOTE_INSN_LOOP_BEG
679                  && NOTE_LINE_NUMBER (p) != NOTE_INSN_LOOP_END));
680        p = NEXT_INSN (p))
681     ;
682
683   scan_start = p;
684
685   /* Set up variables describing this loop.  */
686   prescan_loop (loop_start, end);
687   threshold = (loop_has_call ? 1 : 2) * (1 + n_non_fixed_regs);
688
689   /* If loop has a jump before the first label,
690      the true entry is the target of that jump.
691      Start scan from there.
692      But record in LOOP_TOP the place where the end-test jumps
693      back to so we can scan that after the end of the loop.  */
694   if (GET_CODE (p) == JUMP_INSN)
695     {
696       loop_entry_jump = p;
697
698       /* Loop entry must be unconditional jump (and not a RETURN)  */
699       if (simplejump_p (p)
700           && JUMP_LABEL (p) != 0
701           /* Check to see whether the jump actually
702              jumps out of the loop (meaning it's no loop).
703              This case can happen for things like
704              do {..} while (0).  If this label was generated previously
705              by loop, we can't tell anything about it and have to reject
706              the loop.  */
707           && INSN_IN_RANGE_P (JUMP_LABEL (p), loop_start, end))
708         {
709           loop_top = next_label (scan_start);
710           scan_start = JUMP_LABEL (p);
711         }
712     }
713
714   /* If SCAN_START was an insn created by loop, we don't know its luid
715      as required by loop_reg_used_before_p.  So skip such loops.  (This
716      test may never be true, but it's best to play it safe.) 
717
718      Also, skip loops where we do not start scanning at a label.  This
719      test also rejects loops starting with a JUMP_INSN that failed the
720      test above.  */
721
722   if (INSN_UID (scan_start) >= max_uid_for_loop
723       || GET_CODE (scan_start) != CODE_LABEL)
724     {
725       if (loop_dump_stream)
726         fprintf (loop_dump_stream, "\nLoop from %d to %d is phony.\n\n",
727                  INSN_UID (loop_start), INSN_UID (end));
728       return;
729     }
730
731   /* Count number of times each reg is set during this loop.
732      Set VARRAY_CHAR (may_not_optimize, I) if it is not safe to move out
733      the setting of register I.  If this loop has calls, set
734      VARRAY_RTX (reg_single_usage, I).  */
735   
736   /* Allocate extra space for REGS that might be created by
737      load_mems.  We allocate a little extra slop as well, in the hopes
738      that even after the moving of movables creates some new registers
739      we won't have to reallocate these arrays.  However, we do grow
740      the arrays, if necessary, in load_mems_recount_loop_regs_set.  */
741   nregs = max_reg_num () + loop_mems_idx + 16;
742   VARRAY_INT_INIT (n_times_set, nregs, "n_times_set");
743   VARRAY_INT_INIT (n_times_used, nregs, "n_times_used");
744   VARRAY_CHAR_INIT (may_not_optimize, nregs, "may_not_optimize");
745
746   if (loop_has_call)
747     VARRAY_RTX_INIT (reg_single_usage, nregs, "reg_single_usage");
748
749   count_loop_regs_set (loop_top ? loop_top : loop_start, end,
750                        may_not_optimize, reg_single_usage, &insn_count, nregs);
751
752   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
753     {
754       VARRAY_CHAR (may_not_optimize, i) = 1;
755       VARRAY_INT (n_times_set, i) = 1;
756     }
757
758 #ifdef AVOID_CCMODE_COPIES
759   /* Don't try to move insns which set CC registers if we should not
760      create CCmode register copies.  */
761   for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
762     if (GET_MODE_CLASS (GET_MODE (regno_reg_rtx[i])) == MODE_CC)
763       VARRAY_CHAR (may_not_optimize, i) = 1;
764 #endif
765
766   bcopy ((char *) &n_times_set->data, 
767          (char *) &n_times_used->data, nregs * sizeof (int));
768
769   if (loop_dump_stream)
770     {
771       fprintf (loop_dump_stream, "\nLoop from %d to %d: %d real insns.\n",
772                INSN_UID (loop_start), INSN_UID (end), insn_count);
773       if (loop_continue)
774         fprintf (loop_dump_stream, "Continue at insn %d.\n",
775                  INSN_UID (loop_continue));
776     }
777
778   /* Scan through the loop finding insns that are safe to move.
779      Set n_times_set negative for the reg being set, so that
780      this reg will be considered invariant for subsequent insns.
781      We consider whether subsequent insns use the reg
782      in deciding whether it is worth actually moving.
783
784      MAYBE_NEVER is nonzero if we have passed a conditional jump insn
785      and therefore it is possible that the insns we are scanning
786      would never be executed.  At such times, we must make sure
787      that it is safe to execute the insn once instead of zero times.
788      When MAYBE_NEVER is 0, all insns will be executed at least once
789      so that is not a problem.  */
790
791   for (p = next_insn_in_loop (scan_start, scan_start, end, loop_top); 
792        p != NULL_RTX;
793        p = next_insn_in_loop (p, scan_start, end, loop_top))
794     {
795       if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
796           && find_reg_note (p, REG_LIBCALL, NULL_RTX))
797         in_libcall = 1;
798       else if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
799                && find_reg_note (p, REG_RETVAL, NULL_RTX))
800         in_libcall = 0;
801
802       if (GET_CODE (p) == INSN
803           && (set = single_set (p))
804           && GET_CODE (SET_DEST (set)) == REG
805           && ! VARRAY_CHAR (may_not_optimize, REGNO (SET_DEST (set))))
806         {
807           int tem1 = 0;
808           int tem2 = 0;
809           int move_insn = 0;
810           rtx src = SET_SRC (set);
811           rtx dependencies = 0;
812
813           /* Figure out what to use as a source of this insn.  If a REG_EQUIV
814              note is given or if a REG_EQUAL note with a constant operand is
815              specified, use it as the source and mark that we should move
816              this insn by calling emit_move_insn rather that duplicating the
817              insn.
818
819              Otherwise, only use the REG_EQUAL contents if a REG_RETVAL note
820              is present.  */
821           temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
822           if (temp)
823             src = XEXP (temp, 0), move_insn = 1;
824           else 
825             {
826               temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
827               if (temp && CONSTANT_P (XEXP (temp, 0)))
828                 src = XEXP (temp, 0), move_insn = 1;
829               if (temp && find_reg_note (p, REG_RETVAL, NULL_RTX))
830                 {
831                   src = XEXP (temp, 0);
832                   /* A libcall block can use regs that don't appear in
833                      the equivalent expression.  To move the libcall,
834                      we must move those regs too.  */
835                   dependencies = libcall_other_reg (p, src);
836                 }
837             }
838
839           /* Don't try to optimize a register that was made
840              by loop-optimization for an inner loop.
841              We don't know its life-span, so we can't compute the benefit.  */
842           if (REGNO (SET_DEST (set)) >= max_reg_before_loop)
843             ;
844           else if (/* The set is not guaranteed to be executed one
845                       the loop starts, or the value before the set is
846                       needed before the set occurs... */
847                    (maybe_never
848                     || loop_reg_used_before_p (set, p, loop_start,
849                                                scan_start, end))
850                    /* And the register is used in basic blocks other
851                       than the one where it is set (meaning that
852                       something after this point in the loop might
853                       depend on its value before the set).  */
854                    && !reg_in_basic_block_p (p, SET_DEST (set)))
855             /* It is unsafe to move the set.  
856
857                This code used to consider it OK to move a set of a variable
858                which was not created by the user and not used in an exit test.
859                That behavior is incorrect and was removed.  */
860             ;
861           else if ((tem = invariant_p (src))
862                    && (dependencies == 0
863                        || (tem2 = invariant_p (dependencies)) != 0)
864                    && (VARRAY_INT (n_times_set, 
865                                    REGNO (SET_DEST (set))) == 1
866                        || (tem1
867                            = consec_sets_invariant_p 
868                            (SET_DEST (set),
869                             VARRAY_INT (n_times_set, REGNO (SET_DEST (set))),
870                             p)))
871                    /* If the insn can cause a trap (such as divide by zero),
872                       can't move it unless it's guaranteed to be executed
873                       once loop is entered.  Even a function call might
874                       prevent the trap insn from being reached
875                       (since it might exit!)  */
876                    && ! ((maybe_never || call_passed)
877                          && may_trap_p (src)))
878             {
879               register struct movable *m;
880               register int regno = REGNO (SET_DEST (set));
881
882               /* A potential lossage is where we have a case where two insns
883                  can be combined as long as they are both in the loop, but
884                  we move one of them outside the loop.  For large loops,
885                  this can lose.  The most common case of this is the address
886                  of a function being called.  
887
888                  Therefore, if this register is marked as being used exactly
889                  once if we are in a loop with calls (a "large loop"), see if
890                  we can replace the usage of this register with the source
891                  of this SET.  If we can, delete this insn. 
892
893                  Don't do this if P has a REG_RETVAL note or if we have
894                  SMALL_REGISTER_CLASSES and SET_SRC is a hard register.  */
895
896               if (reg_single_usage && VARRAY_RTX (reg_single_usage, regno) != 0
897                   && VARRAY_RTX (reg_single_usage, regno) != const0_rtx
898                   && REGNO_FIRST_UID (regno) == INSN_UID (p)
899                   && (REGNO_LAST_UID (regno)
900                       == INSN_UID (VARRAY_RTX (reg_single_usage, regno)))
901                   && VARRAY_INT (n_times_set, regno) == 1
902                   && ! side_effects_p (SET_SRC (set))
903                   && ! find_reg_note (p, REG_RETVAL, NULL_RTX)
904                   && (! SMALL_REGISTER_CLASSES
905                       || (! (GET_CODE (SET_SRC (set)) == REG
906                              && REGNO (SET_SRC (set)) < FIRST_PSEUDO_REGISTER)))
907                   /* This test is not redundant; SET_SRC (set) might be
908                      a call-clobbered register and the life of REGNO
909                      might span a call.  */
910                   && ! modified_between_p (SET_SRC (set), p,
911                                            VARRAY_RTX
912                                            (reg_single_usage, regno)) 
913                   && no_labels_between_p (p, VARRAY_RTX (reg_single_usage, regno))
914                   && validate_replace_rtx (SET_DEST (set), SET_SRC (set),
915                                            VARRAY_RTX
916                                            (reg_single_usage, regno))) 
917                 {
918                   /* Replace any usage in a REG_EQUAL note.  Must copy the
919                      new source, so that we don't get rtx sharing between the
920                      SET_SOURCE and REG_NOTES of insn p.  */
921                   REG_NOTES (VARRAY_RTX (reg_single_usage, regno))
922                     = replace_rtx (REG_NOTES (VARRAY_RTX
923                                               (reg_single_usage, regno)), 
924                                    SET_DEST (set), copy_rtx (SET_SRC (set)));
925                                    
926                   PUT_CODE (p, NOTE);
927                   NOTE_LINE_NUMBER (p) = NOTE_INSN_DELETED;
928                   NOTE_SOURCE_FILE (p) = 0;
929                   VARRAY_INT (n_times_set, regno) = 0;
930                   continue;
931                 }
932
933               m = (struct movable *) alloca (sizeof (struct movable));
934               m->next = 0;
935               m->insn = p;
936               m->set_src = src;
937               m->dependencies = dependencies;
938               m->set_dest = SET_DEST (set);
939               m->force = 0;
940               m->consec = VARRAY_INT (n_times_set, 
941                                       REGNO (SET_DEST (set))) - 1;
942               m->done = 0;
943               m->forces = 0;
944               m->partial = 0;
945               m->move_insn = move_insn;
946               m->move_insn_first = 0;
947               m->is_equiv = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
948               m->savemode = VOIDmode;
949               m->regno = regno;
950               /* Set M->cond if either invariant_p or consec_sets_invariant_p
951                  returned 2 (only conditionally invariant).  */
952               m->cond = ((tem | tem1 | tem2) > 1);
953               m->global = (uid_luid[REGNO_LAST_UID (regno)] > INSN_LUID (end)
954                            || uid_luid[REGNO_FIRST_UID (regno)] < INSN_LUID (loop_start));
955               m->match = 0;
956               m->lifetime = (uid_luid[REGNO_LAST_UID (regno)]
957                              - uid_luid[REGNO_FIRST_UID (regno)]);
958               m->savings = VARRAY_INT (n_times_used, regno);
959               if (find_reg_note (p, REG_RETVAL, NULL_RTX))
960                 m->savings += libcall_benefit (p);
961               VARRAY_INT (n_times_set, regno) = move_insn ? -2 : -1;
962               /* Add M to the end of the chain MOVABLES.  */
963               if (movables == 0)
964                 movables = m;
965               else
966                 last_movable->next = m;
967               last_movable = m;
968
969               if (m->consec > 0)
970                 {
971                   /* It is possible for the first instruction to have a
972                      REG_EQUAL note but a non-invariant SET_SRC, so we must
973                      remember the status of the first instruction in case
974                      the last instruction doesn't have a REG_EQUAL note.  */
975                   m->move_insn_first = m->move_insn;
976
977                   /* Skip this insn, not checking REG_LIBCALL notes.  */
978                   p = next_nonnote_insn (p);
979                   /* Skip the consecutive insns, if there are any.  */
980                   p = skip_consec_insns (p, m->consec);
981                   /* Back up to the last insn of the consecutive group.  */
982                   p = prev_nonnote_insn (p);
983
984                   /* We must now reset m->move_insn, m->is_equiv, and possibly
985                      m->set_src to correspond to the effects of all the
986                      insns.  */
987                   temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
988                   if (temp)
989                     m->set_src = XEXP (temp, 0), m->move_insn = 1;
990                   else
991                     {
992                       temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
993                       if (temp && CONSTANT_P (XEXP (temp, 0)))
994                         m->set_src = XEXP (temp, 0), m->move_insn = 1;
995                       else
996                         m->move_insn = 0;
997
998                     }
999                   m->is_equiv = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
1000                 }
1001             }
1002           /* If this register is always set within a STRICT_LOW_PART
1003              or set to zero, then its high bytes are constant.
1004              So clear them outside the loop and within the loop
1005              just load the low bytes.
1006              We must check that the machine has an instruction to do so.
1007              Also, if the value loaded into the register
1008              depends on the same register, this cannot be done.  */
1009           else if (SET_SRC (set) == const0_rtx
1010                    && GET_CODE (NEXT_INSN (p)) == INSN
1011                    && (set1 = single_set (NEXT_INSN (p)))
1012                    && GET_CODE (set1) == SET
1013                    && (GET_CODE (SET_DEST (set1)) == STRICT_LOW_PART)
1014                    && (GET_CODE (XEXP (SET_DEST (set1), 0)) == SUBREG)
1015                    && (SUBREG_REG (XEXP (SET_DEST (set1), 0))
1016                        == SET_DEST (set))
1017                    && !reg_mentioned_p (SET_DEST (set), SET_SRC (set1)))
1018             {
1019               register int regno = REGNO (SET_DEST (set));
1020               if (VARRAY_INT (n_times_set, regno) == 2)
1021                 {
1022                   register struct movable *m;
1023                   m = (struct movable *) alloca (sizeof (struct movable));
1024                   m->next = 0;
1025                   m->insn = p;
1026                   m->set_dest = SET_DEST (set);
1027                   m->dependencies = 0;
1028                   m->force = 0;
1029                   m->consec = 0;
1030                   m->done = 0;
1031                   m->forces = 0;
1032                   m->move_insn = 0;
1033                   m->move_insn_first = 0;
1034                   m->partial = 1;
1035                   /* If the insn may not be executed on some cycles,
1036                      we can't clear the whole reg; clear just high part.
1037                      Not even if the reg is used only within this loop.
1038                      Consider this:
1039                      while (1)
1040                        while (s != t) {
1041                          if (foo ()) x = *s;
1042                          use (x);
1043                        }
1044                      Clearing x before the inner loop could clobber a value
1045                      being saved from the last time around the outer loop.
1046                      However, if the reg is not used outside this loop
1047                      and all uses of the register are in the same
1048                      basic block as the store, there is no problem.
1049
1050                      If this insn was made by loop, we don't know its
1051                      INSN_LUID and hence must make a conservative
1052                      assumption.  */
1053                   m->global = (INSN_UID (p) >= max_uid_for_loop
1054                                || (uid_luid[REGNO_LAST_UID (regno)]
1055                                    > INSN_LUID (end))
1056                                || (uid_luid[REGNO_FIRST_UID (regno)]
1057                                    < INSN_LUID (p))
1058                                || (labels_in_range_p
1059                                    (p, uid_luid[REGNO_FIRST_UID (regno)])));
1060                   if (maybe_never && m->global)
1061                     m->savemode = GET_MODE (SET_SRC (set1));
1062                   else
1063                     m->savemode = VOIDmode;
1064                   m->regno = regno;
1065                   m->cond = 0;
1066                   m->match = 0;
1067                   m->lifetime = (uid_luid[REGNO_LAST_UID (regno)]
1068                                  - uid_luid[REGNO_FIRST_UID (regno)]);
1069                   m->savings = 1;
1070                   VARRAY_INT (n_times_set, regno) = -1;
1071                   /* Add M to the end of the chain MOVABLES.  */
1072                   if (movables == 0)
1073                     movables = m;
1074                   else
1075                     last_movable->next = m;
1076                   last_movable = m;
1077                 }
1078             }
1079         }
1080       /* Past a call insn, we get to insns which might not be executed
1081          because the call might exit.  This matters for insns that trap.
1082          Call insns inside a REG_LIBCALL/REG_RETVAL block always return,
1083          so they don't count.  */
1084       else if (GET_CODE (p) == CALL_INSN && ! in_libcall)
1085         call_passed = 1;
1086       /* Past a label or a jump, we get to insns for which we
1087          can't count on whether or how many times they will be
1088          executed during each iteration.  Therefore, we can
1089          only move out sets of trivial variables
1090          (those not used after the loop).  */
1091       /* Similar code appears twice in strength_reduce.  */
1092       else if ((GET_CODE (p) == CODE_LABEL || GET_CODE (p) == JUMP_INSN)
1093                /* If we enter the loop in the middle, and scan around to the
1094                   beginning, don't set maybe_never for that.  This must be an
1095                   unconditional jump, otherwise the code at the top of the
1096                   loop might never be executed.  Unconditional jumps are
1097                   followed a by barrier then loop end.  */
1098                && ! (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p) == loop_top
1099                      && NEXT_INSN (NEXT_INSN (p)) == end
1100                      && simplejump_p (p)))
1101         maybe_never = 1;
1102       else if (GET_CODE (p) == NOTE)
1103         {
1104           /* At the virtual top of a converted loop, insns are again known to
1105              be executed: logically, the loop begins here even though the exit
1106              code has been duplicated.  */
1107           if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_VTOP && loop_depth == 0)
1108             maybe_never = call_passed = 0;
1109           else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
1110             loop_depth++;
1111           else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END)
1112             loop_depth--;
1113         }
1114     }
1115
1116   /* If one movable subsumes another, ignore that other.  */
1117
1118   ignore_some_movables (movables);
1119
1120   /* For each movable insn, see if the reg that it loads
1121      leads when it dies right into another conditionally movable insn.
1122      If so, record that the second insn "forces" the first one,
1123      since the second can be moved only if the first is.  */
1124
1125   force_movables (movables);
1126
1127   /* See if there are multiple movable insns that load the same value.
1128      If there are, make all but the first point at the first one
1129      through the `match' field, and add the priorities of them
1130      all together as the priority of the first.  */
1131
1132   combine_movables (movables, nregs);
1133         
1134   /* Now consider each movable insn to decide whether it is worth moving.
1135      Store 0 in n_times_set for each reg that is moved.
1136
1137      Generally this increases code size, so do not move moveables when
1138      optimizing for code size.  */
1139
1140   if (! optimize_size)
1141     move_movables (movables, threshold,
1142                    insn_count, loop_start, end, nregs);
1143
1144   /* Now candidates that still are negative are those not moved.
1145      Change n_times_set to indicate that those are not actually invariant.  */
1146   for (i = 0; i < nregs; i++)
1147     if (VARRAY_INT (n_times_set, i) < 0)
1148       VARRAY_INT (n_times_set, i) = VARRAY_INT (n_times_used, i);
1149
1150   /* Now that we've moved some things out of the loop, we able to
1151      hoist even more memory references.  There's no need to pass
1152      reg_single_usage this time, since we're done with it.  */
1153   load_mems_and_recount_loop_regs_set (scan_start, end, loop_top,
1154                                        loop_start, 0,
1155                                        &insn_count);
1156
1157   if (flag_strength_reduce)
1158     {
1159       the_movables = movables;
1160       strength_reduce (scan_start, end, loop_top,
1161                        insn_count, loop_start, end, unroll_p, bct_p);
1162     }
1163
1164   VARRAY_FREE (n_times_set);
1165   VARRAY_FREE (n_times_used);
1166   VARRAY_FREE (may_not_optimize);
1167   VARRAY_FREE (reg_single_usage);
1168 }
1169 \f
1170 /* Add elements to *OUTPUT to record all the pseudo-regs
1171    mentioned in IN_THIS but not mentioned in NOT_IN_THIS.  */
1172
1173 void
1174 record_excess_regs (in_this, not_in_this, output)
1175      rtx in_this, not_in_this;
1176      rtx *output;
1177 {
1178   enum rtx_code code;
1179   char *fmt;
1180   int i;
1181
1182   code = GET_CODE (in_this);
1183
1184   switch (code)
1185     {
1186     case PC:
1187     case CC0:
1188     case CONST_INT:
1189     case CONST_DOUBLE:
1190     case CONST:
1191     case SYMBOL_REF:
1192     case LABEL_REF:
1193       return;
1194
1195     case REG:
1196       if (REGNO (in_this) >= FIRST_PSEUDO_REGISTER
1197           && ! reg_mentioned_p (in_this, not_in_this))
1198         *output = gen_rtx_EXPR_LIST (VOIDmode, in_this, *output);
1199       return;
1200       
1201     default:
1202       break;
1203     }
1204
1205   fmt = GET_RTX_FORMAT (code);
1206   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1207     {
1208       int j;
1209
1210       switch (fmt[i])
1211         {
1212         case 'E':
1213           for (j = 0; j < XVECLEN (in_this, i); j++)
1214             record_excess_regs (XVECEXP (in_this, i, j), not_in_this, output);
1215           break;
1216
1217         case 'e':
1218           record_excess_regs (XEXP (in_this, i), not_in_this, output);
1219           break;
1220         }
1221     }
1222 }
1223 \f
1224 /* Check what regs are referred to in the libcall block ending with INSN,
1225    aside from those mentioned in the equivalent value.
1226    If there are none, return 0.
1227    If there are one or more, return an EXPR_LIST containing all of them.  */
1228
1229 static rtx
1230 libcall_other_reg (insn, equiv)
1231      rtx insn, equiv;
1232 {
1233   rtx note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
1234   rtx p = XEXP (note, 0);
1235   rtx output = 0;
1236
1237   /* First, find all the regs used in the libcall block
1238      that are not mentioned as inputs to the result.  */
1239
1240   while (p != insn)
1241     {
1242       if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
1243           || GET_CODE (p) == CALL_INSN)
1244         record_excess_regs (PATTERN (p), equiv, &output);
1245       p = NEXT_INSN (p);
1246     }
1247
1248   return output;
1249 }
1250 \f
1251 /* Return 1 if all uses of REG
1252    are between INSN and the end of the basic block.  */
1253
1254 static int 
1255 reg_in_basic_block_p (insn, reg)
1256      rtx insn, reg;
1257 {
1258   int regno = REGNO (reg);
1259   rtx p;
1260
1261   if (REGNO_FIRST_UID (regno) != INSN_UID (insn))
1262     return 0;
1263
1264   /* Search this basic block for the already recorded last use of the reg.  */
1265   for (p = insn; p; p = NEXT_INSN (p))
1266     {
1267       switch (GET_CODE (p))
1268         {
1269         case NOTE:
1270           break;
1271
1272         case INSN:
1273         case CALL_INSN:
1274           /* Ordinary insn: if this is the last use, we win.  */
1275           if (REGNO_LAST_UID (regno) == INSN_UID (p))
1276             return 1;
1277           break;
1278
1279         case JUMP_INSN:
1280           /* Jump insn: if this is the last use, we win.  */
1281           if (REGNO_LAST_UID (regno) == INSN_UID (p))
1282             return 1;
1283           /* Otherwise, it's the end of the basic block, so we lose.  */
1284           return 0;
1285
1286         case CODE_LABEL:
1287         case BARRIER:
1288           /* It's the end of the basic block, so we lose.  */
1289           return 0;
1290           
1291         default:
1292           break;
1293         }
1294     }
1295
1296   /* The "last use" doesn't follow the "first use"??  */
1297   abort ();
1298 }
1299 \f
1300 /* Compute the benefit of eliminating the insns in the block whose
1301    last insn is LAST.  This may be a group of insns used to compute a
1302    value directly or can contain a library call.  */
1303
1304 static int
1305 libcall_benefit (last)
1306      rtx last;
1307 {
1308   rtx insn;
1309   int benefit = 0;
1310
1311   for (insn = XEXP (find_reg_note (last, REG_RETVAL, NULL_RTX), 0);
1312        insn != last; insn = NEXT_INSN (insn))
1313     {
1314       if (GET_CODE (insn) == CALL_INSN)
1315         benefit += 10;          /* Assume at least this many insns in a library
1316                                    routine.  */
1317       else if (GET_CODE (insn) == INSN
1318                && GET_CODE (PATTERN (insn)) != USE
1319                && GET_CODE (PATTERN (insn)) != CLOBBER)
1320         benefit++;
1321     }
1322
1323   return benefit;
1324 }
1325 \f
1326 /* Skip COUNT insns from INSN, counting library calls as 1 insn.  */
1327
1328 static rtx
1329 skip_consec_insns (insn, count)
1330      rtx insn;
1331      int count;
1332 {
1333   for (; count > 0; count--)
1334     {
1335       rtx temp;
1336
1337       /* If first insn of libcall sequence, skip to end.  */
1338       /* Do this at start of loop, since INSN is guaranteed to 
1339          be an insn here.  */
1340       if (GET_CODE (insn) != NOTE
1341           && (temp = find_reg_note (insn, REG_LIBCALL, NULL_RTX)))
1342         insn = XEXP (temp, 0);
1343
1344       do insn = NEXT_INSN (insn);
1345       while (GET_CODE (insn) == NOTE);
1346     }
1347
1348   return insn;
1349 }
1350
1351 /* Ignore any movable whose insn falls within a libcall
1352    which is part of another movable.
1353    We make use of the fact that the movable for the libcall value
1354    was made later and so appears later on the chain.  */
1355
1356 static void
1357 ignore_some_movables (movables)
1358      struct movable *movables;
1359 {
1360   register struct movable *m, *m1;
1361
1362   for (m = movables; m; m = m->next)
1363     {
1364       /* Is this a movable for the value of a libcall?  */
1365       rtx note = find_reg_note (m->insn, REG_RETVAL, NULL_RTX);
1366       if (note)
1367         {
1368           rtx insn;
1369           /* Check for earlier movables inside that range,
1370              and mark them invalid.  We cannot use LUIDs here because
1371              insns created by loop.c for prior loops don't have LUIDs.
1372              Rather than reject all such insns from movables, we just
1373              explicitly check each insn in the libcall (since invariant
1374              libcalls aren't that common).  */
1375           for (insn = XEXP (note, 0); insn != m->insn; insn = NEXT_INSN (insn))
1376             for (m1 = movables; m1 != m; m1 = m1->next)
1377               if (m1->insn == insn)
1378                 m1->done = 1;
1379         }
1380     }
1381 }         
1382
1383 /* For each movable insn, see if the reg that it loads
1384    leads when it dies right into another conditionally movable insn.
1385    If so, record that the second insn "forces" the first one,
1386    since the second can be moved only if the first is.  */
1387
1388 static void
1389 force_movables (movables)
1390      struct movable *movables;
1391 {
1392   register struct movable *m, *m1;
1393   for (m1 = movables; m1; m1 = m1->next)
1394     /* Omit this if moving just the (SET (REG) 0) of a zero-extend.  */
1395     if (!m1->partial && !m1->done)
1396       {
1397         int regno = m1->regno;
1398         for (m = m1->next; m; m = m->next)
1399           /* ??? Could this be a bug?  What if CSE caused the
1400              register of M1 to be used after this insn?
1401              Since CSE does not update regno_last_uid,
1402              this insn M->insn might not be where it dies.
1403              But very likely this doesn't matter; what matters is
1404              that M's reg is computed from M1's reg.  */
1405           if (INSN_UID (m->insn) == REGNO_LAST_UID (regno)
1406               && !m->done)
1407             break;
1408         if (m != 0 && m->set_src == m1->set_dest
1409             /* If m->consec, m->set_src isn't valid.  */
1410             && m->consec == 0)
1411           m = 0;
1412
1413         /* Increase the priority of the moving the first insn
1414            since it permits the second to be moved as well.  */
1415         if (m != 0)
1416           {
1417             m->forces = m1;
1418             m1->lifetime += m->lifetime;
1419             m1->savings += m->savings;
1420           }
1421       }
1422 }
1423 \f
1424 /* Find invariant expressions that are equal and can be combined into
1425    one register.  */
1426
1427 static void
1428 combine_movables (movables, nregs)
1429      struct movable *movables;
1430      int nregs;
1431 {
1432   register struct movable *m;
1433   char *matched_regs = (char *) alloca (nregs);
1434   enum machine_mode mode;
1435
1436   /* Regs that are set more than once are not allowed to match
1437      or be matched.  I'm no longer sure why not.  */
1438   /* Perhaps testing m->consec_sets would be more appropriate here?  */
1439
1440   for (m = movables; m; m = m->next)
1441     if (m->match == 0 && VARRAY_INT (n_times_used, m->regno) == 1 && !m->partial)
1442       {
1443         register struct movable *m1;
1444         int regno = m->regno;
1445
1446         bzero (matched_regs, nregs);
1447         matched_regs[regno] = 1;
1448
1449         /* We want later insns to match the first one.  Don't make the first
1450            one match any later ones.  So start this loop at m->next.  */
1451         for (m1 = m->next; m1; m1 = m1->next)
1452           if (m != m1 && m1->match == 0 && VARRAY_INT (n_times_used, m1->regno) == 1
1453               /* A reg used outside the loop mustn't be eliminated.  */
1454               && !m1->global
1455               /* A reg used for zero-extending mustn't be eliminated.  */
1456               && !m1->partial
1457               && (matched_regs[m1->regno]
1458                   ||
1459                   (
1460                    /* Can combine regs with different modes loaded from the
1461                       same constant only if the modes are the same or
1462                       if both are integer modes with M wider or the same
1463                       width as M1.  The check for integer is redundant, but
1464                       safe, since the only case of differing destination
1465                       modes with equal sources is when both sources are
1466                       VOIDmode, i.e., CONST_INT.  */
1467                    (GET_MODE (m->set_dest) == GET_MODE (m1->set_dest)
1468                     || (GET_MODE_CLASS (GET_MODE (m->set_dest)) == MODE_INT
1469                         && GET_MODE_CLASS (GET_MODE (m1->set_dest)) == MODE_INT
1470                         && (GET_MODE_BITSIZE (GET_MODE (m->set_dest))
1471                             >= GET_MODE_BITSIZE (GET_MODE (m1->set_dest)))))
1472                    /* See if the source of M1 says it matches M.  */
1473                    && ((GET_CODE (m1->set_src) == REG
1474                         && matched_regs[REGNO (m1->set_src)])
1475                        || rtx_equal_for_loop_p (m->set_src, m1->set_src,
1476                                                 movables))))
1477               && ((m->dependencies == m1->dependencies)
1478                   || rtx_equal_p (m->dependencies, m1->dependencies)))
1479             {
1480               m->lifetime += m1->lifetime;
1481               m->savings += m1->savings;
1482               m1->done = 1;
1483               m1->match = m;
1484               matched_regs[m1->regno] = 1;
1485             }
1486       }
1487
1488   /* Now combine the regs used for zero-extension.
1489      This can be done for those not marked `global'
1490      provided their lives don't overlap.  */
1491
1492   for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
1493        mode = GET_MODE_WIDER_MODE (mode))
1494     {
1495       register struct movable *m0 = 0;
1496
1497       /* Combine all the registers for extension from mode MODE.
1498          Don't combine any that are used outside this loop.  */
1499       for (m = movables; m; m = m->next)
1500         if (m->partial && ! m->global
1501             && mode == GET_MODE (SET_SRC (PATTERN (NEXT_INSN (m->insn)))))
1502           {
1503             register struct movable *m1;
1504             int first = uid_luid[REGNO_FIRST_UID (m->regno)];
1505             int last = uid_luid[REGNO_LAST_UID (m->regno)];
1506
1507             if (m0 == 0)
1508               {
1509                 /* First one: don't check for overlap, just record it.  */
1510                 m0 = m;
1511                   continue;
1512               }
1513
1514             /* Make sure they extend to the same mode.
1515                (Almost always true.)  */
1516             if (GET_MODE (m->set_dest) != GET_MODE (m0->set_dest))
1517                 continue;
1518
1519             /* We already have one: check for overlap with those
1520                already combined together.  */
1521             for (m1 = movables; m1 != m; m1 = m1->next)
1522               if (m1 == m0 || (m1->partial && m1->match == m0))
1523                 if (! (uid_luid[REGNO_FIRST_UID (m1->regno)] > last
1524                        || uid_luid[REGNO_LAST_UID (m1->regno)] < first))
1525                   goto overlap;
1526
1527             /* No overlap: we can combine this with the others.  */
1528             m0->lifetime += m->lifetime;
1529             m0->savings += m->savings;
1530             m->done = 1;
1531             m->match = m0;
1532
1533           overlap: ;
1534           }
1535     }
1536 }
1537 \f
1538 /* Return 1 if regs X and Y will become the same if moved.  */
1539
1540 static int
1541 regs_match_p (x, y, movables)
1542      rtx x, y;
1543      struct movable *movables;
1544 {
1545   int xn = REGNO (x);
1546   int yn = REGNO (y);
1547   struct movable *mx, *my;
1548
1549   for (mx = movables; mx; mx = mx->next)
1550     if (mx->regno == xn)
1551       break;
1552
1553   for (my = movables; my; my = my->next)
1554     if (my->regno == yn)
1555       break;
1556
1557   return (mx && my
1558           && ((mx->match == my->match && mx->match != 0)
1559               || mx->match == my
1560               || mx == my->match));
1561 }
1562
1563 /* Return 1 if X and Y are identical-looking rtx's.
1564    This is the Lisp function EQUAL for rtx arguments.
1565
1566    If two registers are matching movables or a movable register and an
1567    equivalent constant, consider them equal.  */
1568
1569 static int
1570 rtx_equal_for_loop_p (x, y, movables)
1571      rtx x, y;
1572      struct movable *movables;
1573 {
1574   register int i;
1575   register int j;
1576   register struct movable *m;
1577   register enum rtx_code code;
1578   register char *fmt;
1579
1580   if (x == y)
1581     return 1;
1582   if (x == 0 || y == 0)
1583     return 0;
1584
1585   code = GET_CODE (x);
1586
1587   /* If we have a register and a constant, they may sometimes be
1588      equal.  */
1589   if (GET_CODE (x) == REG && VARRAY_INT (n_times_set, REGNO (x)) == -2
1590       && CONSTANT_P (y))
1591     {
1592       for (m = movables; m; m = m->next)
1593         if (m->move_insn && m->regno == REGNO (x)
1594             && rtx_equal_p (m->set_src, y))
1595           return 1;
1596     }
1597   else if (GET_CODE (y) == REG && VARRAY_INT (n_times_set, REGNO (y)) == -2
1598            && CONSTANT_P (x))
1599     {
1600       for (m = movables; m; m = m->next)
1601         if (m->move_insn && m->regno == REGNO (y)
1602             && rtx_equal_p (m->set_src, x))
1603           return 1;
1604     }
1605
1606   /* Otherwise, rtx's of different codes cannot be equal.  */
1607   if (code != GET_CODE (y))
1608     return 0;
1609
1610   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
1611      (REG:SI x) and (REG:HI x) are NOT equivalent.  */
1612
1613   if (GET_MODE (x) != GET_MODE (y))
1614     return 0;
1615
1616   /* These three types of rtx's can be compared nonrecursively.  */
1617   if (code == REG)
1618     return (REGNO (x) == REGNO (y) || regs_match_p (x, y, movables));
1619
1620   if (code == LABEL_REF)
1621     return XEXP (x, 0) == XEXP (y, 0);
1622   if (code == SYMBOL_REF)
1623     return XSTR (x, 0) == XSTR (y, 0);
1624
1625   /* Compare the elements.  If any pair of corresponding elements
1626      fail to match, return 0 for the whole things.  */
1627
1628   fmt = GET_RTX_FORMAT (code);
1629   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1630     {
1631       switch (fmt[i])
1632         {
1633         case 'w':
1634           if (XWINT (x, i) != XWINT (y, i))
1635             return 0;
1636           break;
1637
1638         case 'i':
1639           if (XINT (x, i) != XINT (y, i))
1640             return 0;
1641           break;
1642
1643         case 'E':
1644           /* Two vectors must have the same length.  */
1645           if (XVECLEN (x, i) != XVECLEN (y, i))
1646             return 0;
1647
1648           /* And the corresponding elements must match.  */
1649           for (j = 0; j < XVECLEN (x, i); j++)
1650             if (rtx_equal_for_loop_p (XVECEXP (x, i, j), XVECEXP (y, i, j), movables) == 0)
1651               return 0;
1652           break;
1653
1654         case 'e':
1655           if (rtx_equal_for_loop_p (XEXP (x, i), XEXP (y, i), movables) == 0)
1656             return 0;
1657           break;
1658
1659         case 's':
1660           if (strcmp (XSTR (x, i), XSTR (y, i)))
1661             return 0;
1662           break;
1663
1664         case 'u':
1665           /* These are just backpointers, so they don't matter.  */
1666           break;
1667
1668         case '0':
1669           break;
1670
1671           /* It is believed that rtx's at this level will never
1672              contain anything but integers and other rtx's,
1673              except for within LABEL_REFs and SYMBOL_REFs.  */
1674         default:
1675           abort ();
1676         }
1677     }
1678   return 1;
1679 }
1680 \f
1681 /* If X contains any LABEL_REF's, add REG_LABEL notes for them to all
1682   insns in INSNS which use thet reference.  */
1683
1684 static void
1685 add_label_notes (x, insns)
1686      rtx x;
1687      rtx insns;
1688 {
1689   enum rtx_code code = GET_CODE (x);
1690   int i, j;
1691   char *fmt;
1692   rtx insn;
1693
1694   if (code == LABEL_REF && !LABEL_REF_NONLOCAL_P (x))
1695     {
1696       /* This code used to ignore labels that referred to dispatch tables to
1697          avoid flow generating (slighly) worse code.
1698
1699          We no longer ignore such label references (see LABEL_REF handling in
1700          mark_jump_label for additional information).  */
1701       for (insn = insns; insn; insn = NEXT_INSN (insn))
1702         if (reg_mentioned_p (XEXP (x, 0), insn))
1703           REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_LABEL, XEXP (x, 0),
1704                                                 REG_NOTES (insn));
1705     }
1706
1707   fmt = GET_RTX_FORMAT (code);
1708   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1709     {
1710       if (fmt[i] == 'e')
1711         add_label_notes (XEXP (x, i), insns);
1712       else if (fmt[i] == 'E')
1713         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1714           add_label_notes (XVECEXP (x, i, j), insns);
1715     }
1716 }
1717 \f
1718 /* Scan MOVABLES, and move the insns that deserve to be moved.
1719    If two matching movables are combined, replace one reg with the
1720    other throughout.  */
1721
1722 static void
1723 move_movables (movables, threshold, insn_count, loop_start, end, nregs)
1724      struct movable *movables;
1725      int threshold;
1726      int insn_count;
1727      rtx loop_start;
1728      rtx end;
1729      int nregs;
1730 {
1731   rtx new_start = 0;
1732   register struct movable *m;
1733   register rtx p;
1734   /* Map of pseudo-register replacements to handle combining
1735      when we move several insns that load the same value
1736      into different pseudo-registers.  */
1737   rtx *reg_map = (rtx *) alloca (nregs * sizeof (rtx));
1738   char *already_moved = (char *) alloca (nregs);
1739
1740   bzero (already_moved, nregs);
1741   bzero ((char *) reg_map, nregs * sizeof (rtx));
1742
1743   num_movables = 0;
1744
1745   for (m = movables; m; m = m->next)
1746     {
1747       /* Describe this movable insn.  */
1748
1749       if (loop_dump_stream)
1750         {
1751           fprintf (loop_dump_stream, "Insn %d: regno %d (life %d), ",
1752                    INSN_UID (m->insn), m->regno, m->lifetime);
1753           if (m->consec > 0)
1754             fprintf (loop_dump_stream, "consec %d, ", m->consec);
1755           if (m->cond)
1756             fprintf (loop_dump_stream, "cond ");
1757           if (m->force)
1758             fprintf (loop_dump_stream, "force ");
1759           if (m->global)
1760             fprintf (loop_dump_stream, "global ");
1761           if (m->done)
1762             fprintf (loop_dump_stream, "done ");
1763           if (m->move_insn)
1764             fprintf (loop_dump_stream, "move-insn ");
1765           if (m->match)
1766             fprintf (loop_dump_stream, "matches %d ",
1767                      INSN_UID (m->match->insn));
1768           if (m->forces)
1769             fprintf (loop_dump_stream, "forces %d ",
1770                      INSN_UID (m->forces->insn));
1771         }
1772
1773       /* Count movables.  Value used in heuristics in strength_reduce.  */
1774       num_movables++;
1775
1776       /* Ignore the insn if it's already done (it matched something else).
1777          Otherwise, see if it is now safe to move.  */
1778
1779       if (!m->done
1780           && (! m->cond
1781               || (1 == invariant_p (m->set_src)
1782                   && (m->dependencies == 0
1783                       || 1 == invariant_p (m->dependencies))
1784                   && (m->consec == 0
1785                       || 1 == consec_sets_invariant_p (m->set_dest,
1786                                                        m->consec + 1,
1787                                                        m->insn))))
1788           && (! m->forces || m->forces->done))
1789         {
1790           register int regno;
1791           register rtx p;
1792           int savings = m->savings;
1793
1794           /* We have an insn that is safe to move.
1795              Compute its desirability.  */
1796
1797           p = m->insn;
1798           regno = m->regno;
1799
1800           if (loop_dump_stream)
1801             fprintf (loop_dump_stream, "savings %d ", savings);
1802
1803           if (moved_once[regno] && loop_dump_stream)
1804             fprintf (loop_dump_stream, "halved since already moved ");
1805
1806           /* An insn MUST be moved if we already moved something else
1807              which is safe only if this one is moved too: that is,
1808              if already_moved[REGNO] is nonzero.  */
1809
1810           /* An insn is desirable to move if the new lifetime of the
1811              register is no more than THRESHOLD times the old lifetime.
1812              If it's not desirable, it means the loop is so big
1813              that moving won't speed things up much,
1814              and it is liable to make register usage worse.  */
1815
1816           /* It is also desirable to move if it can be moved at no
1817              extra cost because something else was already moved.  */
1818
1819           if (already_moved[regno]
1820               || flag_move_all_movables
1821               || (threshold * savings * m->lifetime) >=
1822                  (moved_once[regno] ? insn_count * 2 : insn_count)
1823               || (m->forces && m->forces->done
1824                   && VARRAY_INT (n_times_used, m->forces->regno) == 1))
1825             {
1826               int count;
1827               register struct movable *m1;
1828               rtx first;
1829
1830               /* Now move the insns that set the reg.  */
1831
1832               if (m->partial && m->match)
1833                 {
1834                   rtx newpat, i1;
1835                   rtx r1, r2;
1836                   /* Find the end of this chain of matching regs.
1837                      Thus, we load each reg in the chain from that one reg.
1838                      And that reg is loaded with 0 directly,
1839                      since it has ->match == 0.  */
1840                   for (m1 = m; m1->match; m1 = m1->match);
1841                   newpat = gen_move_insn (SET_DEST (PATTERN (m->insn)),
1842                                           SET_DEST (PATTERN (m1->insn)));
1843                   i1 = emit_insn_before (newpat, loop_start);
1844
1845                   /* Mark the moved, invariant reg as being allowed to
1846                      share a hard reg with the other matching invariant.  */
1847                   REG_NOTES (i1) = REG_NOTES (m->insn);
1848                   r1 = SET_DEST (PATTERN (m->insn));
1849                   r2 = SET_DEST (PATTERN (m1->insn));
1850                   regs_may_share
1851                     = gen_rtx_EXPR_LIST (VOIDmode, r1,
1852                                          gen_rtx_EXPR_LIST (VOIDmode, r2,
1853                                                             regs_may_share));
1854                   delete_insn (m->insn);
1855
1856                   if (new_start == 0)
1857                     new_start = i1;
1858
1859                   if (loop_dump_stream)
1860                     fprintf (loop_dump_stream, " moved to %d", INSN_UID (i1));
1861                 }
1862               /* If we are to re-generate the item being moved with a
1863                  new move insn, first delete what we have and then emit
1864                  the move insn before the loop.  */
1865               else if (m->move_insn)
1866                 {
1867                   rtx i1, temp;
1868
1869                   for (count = m->consec; count >= 0; count--)
1870                     {
1871                       /* If this is the first insn of a library call sequence,
1872                          skip to the end.  */
1873                       if (GET_CODE (p) != NOTE
1874                           && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
1875                         p = XEXP (temp, 0);
1876
1877                       /* If this is the last insn of a libcall sequence, then
1878                          delete every insn in the sequence except the last.
1879                          The last insn is handled in the normal manner.  */
1880                       if (GET_CODE (p) != NOTE
1881                           && (temp = find_reg_note (p, REG_RETVAL, NULL_RTX)))
1882                         {
1883                           temp = XEXP (temp, 0);
1884                           while (temp != p)
1885                             temp = delete_insn (temp);
1886                         }
1887
1888                       temp = p;
1889                       p = delete_insn (p);
1890
1891                       /* simplify_giv_expr expects that it can walk the insns
1892                          at m->insn forwards and see this old sequence we are
1893                          tossing here.  delete_insn does preserve the next
1894                          pointers, but when we skip over a NOTE we must fix
1895                          it up.  Otherwise that code walks into the non-deleted
1896                          insn stream.  */
1897                       while (p && GET_CODE (p) == NOTE)
1898                         p = NEXT_INSN (temp) = NEXT_INSN (p);
1899                     }
1900
1901                   start_sequence ();
1902                   emit_move_insn (m->set_dest, m->set_src);
1903                   temp = get_insns ();
1904                   end_sequence ();
1905
1906                   add_label_notes (m->set_src, temp);
1907
1908                   i1 = emit_insns_before (temp, loop_start);
1909                   if (! find_reg_note (i1, REG_EQUAL, NULL_RTX))
1910                     REG_NOTES (i1)
1911                       = gen_rtx_EXPR_LIST (m->is_equiv ? REG_EQUIV : REG_EQUAL,
1912                                            m->set_src, REG_NOTES (i1));
1913
1914                   if (loop_dump_stream)
1915                     fprintf (loop_dump_stream, " moved to %d", INSN_UID (i1));
1916
1917                   /* The more regs we move, the less we like moving them.  */
1918                   threshold -= 3;
1919                 }
1920               else
1921                 {
1922                   for (count = m->consec; count >= 0; count--)
1923                     {
1924                       rtx i1, temp;
1925
1926                       /* If first insn of libcall sequence, skip to end.  */
1927                       /* Do this at start of loop, since p is guaranteed to 
1928                          be an insn here.  */
1929                       if (GET_CODE (p) != NOTE
1930                           && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
1931                         p = XEXP (temp, 0);
1932
1933                       /* If last insn of libcall sequence, move all
1934                          insns except the last before the loop.  The last
1935                          insn is handled in the normal manner.  */
1936                       if (GET_CODE (p) != NOTE
1937                           && (temp = find_reg_note (p, REG_RETVAL, NULL_RTX)))
1938                         {
1939                           rtx fn_address = 0;
1940                           rtx fn_reg = 0;
1941                           rtx fn_address_insn = 0;
1942
1943                           first = 0;
1944                           for (temp = XEXP (temp, 0); temp != p;
1945                                temp = NEXT_INSN (temp))
1946                             {
1947                               rtx body;
1948                               rtx n;
1949                               rtx next;
1950
1951                               if (GET_CODE (temp) == NOTE)
1952                                 continue;
1953
1954                               body = PATTERN (temp);
1955
1956                               /* Find the next insn after TEMP,
1957                                  not counting USE or NOTE insns.  */
1958                               for (next = NEXT_INSN (temp); next != p;
1959                                    next = NEXT_INSN (next))
1960                                 if (! (GET_CODE (next) == INSN
1961                                        && GET_CODE (PATTERN (next)) == USE)
1962                                     && GET_CODE (next) != NOTE)
1963                                   break;
1964                               
1965                               /* If that is the call, this may be the insn
1966                                  that loads the function address.
1967
1968                                  Extract the function address from the insn
1969                                  that loads it into a register.
1970                                  If this insn was cse'd, we get incorrect code.
1971
1972                                  So emit a new move insn that copies the
1973                                  function address into the register that the
1974                                  call insn will use.  flow.c will delete any
1975                                  redundant stores that we have created.  */
1976                               if (GET_CODE (next) == CALL_INSN
1977                                   && GET_CODE (body) == SET
1978                                   && GET_CODE (SET_DEST (body)) == REG
1979                                   && (n = find_reg_note (temp, REG_EQUAL,
1980                                                          NULL_RTX)))
1981                                 {
1982                                   fn_reg = SET_SRC (body);
1983                                   if (GET_CODE (fn_reg) != REG)
1984                                     fn_reg = SET_DEST (body);
1985                                   fn_address = XEXP (n, 0);
1986                                   fn_address_insn = temp;
1987                                 }
1988                               /* We have the call insn.
1989                                  If it uses the register we suspect it might,
1990                                  load it with the correct address directly.  */
1991                               if (GET_CODE (temp) == CALL_INSN
1992                                   && fn_address != 0
1993                                   && reg_referenced_p (fn_reg, body))
1994                                 emit_insn_after (gen_move_insn (fn_reg,
1995                                                                 fn_address),
1996                                                  fn_address_insn);
1997
1998                               if (GET_CODE (temp) == CALL_INSN)
1999                                 {
2000                                   i1 = emit_call_insn_before (body, loop_start);
2001                                   /* Because the USAGE information potentially
2002                                      contains objects other than hard registers
2003                                      we need to copy it.  */
2004                                   if (CALL_INSN_FUNCTION_USAGE (temp))
2005                                     CALL_INSN_FUNCTION_USAGE (i1)
2006                                       = copy_rtx (CALL_INSN_FUNCTION_USAGE (temp));
2007                                 }
2008                               else
2009                                 i1 = emit_insn_before (body, loop_start);
2010                               if (first == 0)
2011                                 first = i1;
2012                               if (temp == fn_address_insn)
2013                                 fn_address_insn = i1;
2014                               REG_NOTES (i1) = REG_NOTES (temp);
2015                               delete_insn (temp);
2016                             }
2017                           if (new_start == 0)
2018                             new_start = first;
2019                         }
2020                       if (m->savemode != VOIDmode)
2021                         {
2022                           /* P sets REG to zero; but we should clear only
2023                              the bits that are not covered by the mode
2024                              m->savemode.  */
2025                           rtx reg = m->set_dest;
2026                           rtx sequence;
2027                           rtx tem;
2028                       
2029                           start_sequence ();
2030                           tem = expand_binop
2031                             (GET_MODE (reg), and_optab, reg,
2032                              GEN_INT ((((HOST_WIDE_INT) 1
2033                                         << GET_MODE_BITSIZE (m->savemode)))
2034                                       - 1),
2035                              reg, 1, OPTAB_LIB_WIDEN);
2036                           if (tem == 0)
2037                             abort ();
2038                           if (tem != reg)
2039                             emit_move_insn (reg, tem);
2040                           sequence = gen_sequence ();
2041                           end_sequence ();
2042                           i1 = emit_insn_before (sequence, loop_start);
2043                         }
2044                       else if (GET_CODE (p) == CALL_INSN)
2045                         {
2046                           i1 = emit_call_insn_before (PATTERN (p), loop_start);
2047                           /* Because the USAGE information potentially
2048                              contains objects other than hard registers
2049                              we need to copy it.  */
2050                           if (CALL_INSN_FUNCTION_USAGE (p))
2051                             CALL_INSN_FUNCTION_USAGE (i1)
2052                               = copy_rtx (CALL_INSN_FUNCTION_USAGE (p));
2053                         }
2054                       else if (count == m->consec && m->move_insn_first)
2055                         {
2056                           /* The SET_SRC might not be invariant, so we must
2057                              use the REG_EQUAL note.  */
2058                           start_sequence ();
2059                           emit_move_insn (m->set_dest, m->set_src);
2060                           temp = get_insns ();
2061                           end_sequence ();
2062
2063                           add_label_notes (m->set_src, temp);
2064
2065                           i1 = emit_insns_before (temp, loop_start);
2066                           if (! find_reg_note (i1, REG_EQUAL, NULL_RTX))
2067                             REG_NOTES (i1)
2068                               = gen_rtx_EXPR_LIST ((m->is_equiv ? REG_EQUIV
2069                                                     : REG_EQUAL),
2070                                                    m->set_src, REG_NOTES (i1));
2071                         }
2072                       else
2073                         i1 = emit_insn_before (PATTERN (p), loop_start);
2074
2075                       if (REG_NOTES (i1) == 0)
2076                         {
2077                           REG_NOTES (i1) = REG_NOTES (p);
2078
2079                           /* If there is a REG_EQUAL note present whose value
2080                              is not loop invariant, then delete it, since it
2081                              may cause problems with later optimization passes.
2082                              It is possible for cse to create such notes
2083                              like this as a result of record_jump_cond.  */
2084                       
2085                           if ((temp = find_reg_note (i1, REG_EQUAL, NULL_RTX))
2086                               && ! invariant_p (XEXP (temp, 0)))
2087                             remove_note (i1, temp);
2088                         }
2089
2090                       if (new_start == 0)
2091                         new_start = i1;
2092
2093                       if (loop_dump_stream)
2094                         fprintf (loop_dump_stream, " moved to %d",
2095                                  INSN_UID (i1));
2096
2097                       /* If library call, now fix the REG_NOTES that contain
2098                          insn pointers, namely REG_LIBCALL on FIRST
2099                          and REG_RETVAL on I1.  */
2100                       if ((temp = find_reg_note (i1, REG_RETVAL, NULL_RTX)))
2101                         {
2102                           XEXP (temp, 0) = first;
2103                           temp = find_reg_note (first, REG_LIBCALL, NULL_RTX);
2104                           XEXP (temp, 0) = i1;
2105                         }
2106
2107                       temp = p;
2108                       delete_insn (p);
2109                       p = NEXT_INSN (p);
2110
2111                       /* simplify_giv_expr expects that it can walk the insns
2112                          at m->insn forwards and see this old sequence we are
2113                          tossing here.  delete_insn does preserve the next
2114                          pointers, but when we skip over a NOTE we must fix
2115                          it up.  Otherwise that code walks into the non-deleted
2116                          insn stream.  */
2117                       while (p && GET_CODE (p) == NOTE)
2118                         p = NEXT_INSN (temp) = NEXT_INSN (p);
2119                     }
2120
2121                   /* The more regs we move, the less we like moving them.  */
2122                   threshold -= 3;
2123                 }
2124
2125               /* Any other movable that loads the same register
2126                  MUST be moved.  */
2127               already_moved[regno] = 1;
2128
2129               /* This reg has been moved out of one loop.  */
2130               moved_once[regno] = 1;
2131
2132               /* The reg set here is now invariant.  */
2133               if (! m->partial)
2134                 VARRAY_INT (n_times_set, regno) = 0;
2135
2136               m->done = 1;
2137
2138               /* Change the length-of-life info for the register
2139                  to say it lives at least the full length of this loop.
2140                  This will help guide optimizations in outer loops.  */
2141
2142               if (uid_luid[REGNO_FIRST_UID (regno)] > INSN_LUID (loop_start))
2143                 /* This is the old insn before all the moved insns.
2144                    We can't use the moved insn because it is out of range
2145                    in uid_luid.  Only the old insns have luids.  */
2146                 REGNO_FIRST_UID (regno) = INSN_UID (loop_start);
2147               if (uid_luid[REGNO_LAST_UID (regno)] < INSN_LUID (end))
2148                 REGNO_LAST_UID (regno) = INSN_UID (end);
2149
2150               /* Combine with this moved insn any other matching movables.  */
2151
2152               if (! m->partial)
2153                 for (m1 = movables; m1; m1 = m1->next)
2154                   if (m1->match == m)
2155                     {
2156                       rtx temp;
2157
2158                       /* Schedule the reg loaded by M1
2159                          for replacement so that shares the reg of M.
2160                          If the modes differ (only possible in restricted
2161                          circumstances, make a SUBREG.  */
2162                       if (GET_MODE (m->set_dest) == GET_MODE (m1->set_dest))
2163                         reg_map[m1->regno] = m->set_dest;
2164                       else
2165                         reg_map[m1->regno]
2166                           = gen_lowpart_common (GET_MODE (m1->set_dest),
2167                                                 m->set_dest);
2168                     
2169                       /* Get rid of the matching insn
2170                          and prevent further processing of it.  */
2171                       m1->done = 1;
2172
2173                       /* if library call, delete all insn except last, which
2174                          is deleted below */
2175                       if ((temp = find_reg_note (m1->insn, REG_RETVAL,
2176                                                  NULL_RTX)))
2177                         {
2178                           for (temp = XEXP (temp, 0); temp != m1->insn;
2179                                temp = NEXT_INSN (temp))
2180                             delete_insn (temp);
2181                         }
2182                       delete_insn (m1->insn);
2183
2184                       /* Any other movable that loads the same register
2185                          MUST be moved.  */
2186                       already_moved[m1->regno] = 1;
2187
2188                       /* The reg merged here is now invariant,
2189                          if the reg it matches is invariant.  */
2190                       if (! m->partial)
2191                         VARRAY_INT (n_times_set, m1->regno) = 0;
2192                     }
2193             }
2194           else if (loop_dump_stream)
2195             fprintf (loop_dump_stream, "not desirable");
2196         }
2197       else if (loop_dump_stream && !m->match)
2198         fprintf (loop_dump_stream, "not safe");
2199
2200       if (loop_dump_stream)
2201         fprintf (loop_dump_stream, "\n");
2202     }
2203
2204   if (new_start == 0)
2205     new_start = loop_start;
2206
2207   /* Go through all the instructions in the loop, making
2208      all the register substitutions scheduled in REG_MAP.  */
2209   for (p = new_start; p != end; p = NEXT_INSN (p))
2210     if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
2211         || GET_CODE (p) == CALL_INSN)
2212       {
2213         replace_regs (PATTERN (p), reg_map, nregs, 0);
2214         replace_regs (REG_NOTES (p), reg_map, nregs, 0);
2215         INSN_CODE (p) = -1;
2216       }
2217 }
2218 \f
2219 #if 0
2220 /* Scan X and replace the address of any MEM in it with ADDR.
2221    REG is the address that MEM should have before the replacement.  */
2222
2223 static void
2224 replace_call_address (x, reg, addr)
2225      rtx x, reg, addr;
2226 {
2227   register enum rtx_code code;
2228   register int i;
2229   register char *fmt;
2230
2231   if (x == 0)
2232     return;
2233   code = GET_CODE (x);
2234   switch (code)
2235     {
2236     case PC:
2237     case CC0:
2238     case CONST_INT:
2239     case CONST_DOUBLE:
2240     case CONST:
2241     case SYMBOL_REF:
2242     case LABEL_REF:
2243     case REG:
2244       return;
2245
2246     case SET:
2247       /* Short cut for very common case.  */
2248       replace_call_address (XEXP (x, 1), reg, addr);
2249       return;
2250
2251     case CALL:
2252       /* Short cut for very common case.  */
2253       replace_call_address (XEXP (x, 0), reg, addr);
2254       return;
2255
2256     case MEM:
2257       /* If this MEM uses a reg other than the one we expected,
2258          something is wrong.  */
2259       if (XEXP (x, 0) != reg)
2260         abort ();
2261       XEXP (x, 0) = addr;
2262       return;
2263       
2264     default:
2265       break;
2266     }
2267
2268   fmt = GET_RTX_FORMAT (code);
2269   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2270     {
2271       if (fmt[i] == 'e')
2272         replace_call_address (XEXP (x, i), reg, addr);
2273       if (fmt[i] == 'E')
2274         {
2275           register int j;
2276           for (j = 0; j < XVECLEN (x, i); j++)
2277             replace_call_address (XVECEXP (x, i, j), reg, addr);
2278         }
2279     }
2280 }
2281 #endif
2282 \f
2283 /* Return the number of memory refs to addresses that vary
2284    in the rtx X.  */
2285
2286 static int
2287 count_nonfixed_reads (x)
2288      rtx x;
2289 {
2290   register enum rtx_code code;
2291   register int i;
2292   register char *fmt;
2293   int value;
2294
2295   if (x == 0)
2296     return 0;
2297
2298   code = GET_CODE (x);
2299   switch (code)
2300     {
2301     case PC:
2302     case CC0:
2303     case CONST_INT:
2304     case CONST_DOUBLE:
2305     case CONST:
2306     case SYMBOL_REF:
2307     case LABEL_REF:
2308     case REG:
2309       return 0;
2310
2311     case MEM:
2312       return ((invariant_p (XEXP (x, 0)) != 1)
2313               + count_nonfixed_reads (XEXP (x, 0)));
2314       
2315     default:
2316       break;
2317     }
2318
2319   value = 0;
2320   fmt = GET_RTX_FORMAT (code);
2321   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2322     {
2323       if (fmt[i] == 'e')
2324         value += count_nonfixed_reads (XEXP (x, i));
2325       if (fmt[i] == 'E')
2326         {
2327           register int j;
2328           for (j = 0; j < XVECLEN (x, i); j++)
2329             value += count_nonfixed_reads (XVECEXP (x, i, j));
2330         }
2331     }
2332   return value;
2333 }
2334
2335 \f
2336 #if 0
2337 /* P is an instruction that sets a register to the result of a ZERO_EXTEND.
2338    Replace it with an instruction to load just the low bytes
2339    if the machine supports such an instruction,
2340    and insert above LOOP_START an instruction to clear the register.  */
2341
2342 static void
2343 constant_high_bytes (p, loop_start)
2344      rtx p, loop_start;
2345 {
2346   register rtx new;
2347   register int insn_code_number;
2348
2349   /* Try to change (SET (REG ...) (ZERO_EXTEND (..:B ...)))
2350      to (SET (STRICT_LOW_PART (SUBREG:B (REG...))) ...).  */
2351
2352   new = gen_rtx_SET (VOIDmode,
2353                      gen_rtx_STRICT_LOW_PART (VOIDmode,
2354                                               gen_rtx_SUBREG (GET_MODE (XEXP (SET_SRC (PATTERN (p)), 0)),
2355                                    SET_DEST (PATTERN (p)),
2356                                    0)),
2357                  XEXP (SET_SRC (PATTERN (p)), 0));
2358   insn_code_number = recog (new, p);
2359
2360   if (insn_code_number)
2361     {
2362       register int i;
2363
2364       /* Clear destination register before the loop.  */
2365       emit_insn_before (gen_rtx_SET (VOIDmode, SET_DEST (PATTERN (p)),
2366                                      const0_rtx),
2367                         loop_start);
2368
2369       /* Inside the loop, just load the low part.  */
2370       PATTERN (p) = new;
2371     }
2372 }
2373 #endif
2374 \f
2375 /* Scan a loop setting the variables `unknown_address_altered',
2376    `num_mem_sets', `loop_continue', `loops_enclosed', `loop_has_call',
2377    `loop_has_volatile', and `loop_has_tablejump'.
2378    Also, fill in the arrays `loop_mems' and `loop_store_mems'.  */
2379
2380 static void
2381 prescan_loop (start, end)
2382      rtx start, end;
2383 {
2384   register int level = 1;
2385   rtx insn;
2386   int loop_has_multiple_exit_targets = 0;
2387   /* The label after END.  Jumping here is just like falling off the
2388      end of the loop.  We use next_nonnote_insn instead of next_label
2389      as a hedge against the (pathological) case where some actual insn
2390      might end up between the two.  */
2391   rtx exit_target = next_nonnote_insn (end);
2392   if (exit_target == NULL_RTX || GET_CODE (exit_target) != CODE_LABEL)
2393     loop_has_multiple_exit_targets = 1;
2394
2395   unknown_address_altered = 0;
2396   loop_has_call = 0;
2397   loop_has_volatile = 0;
2398   loop_has_tablejump = 0;
2399   loop_store_mems_idx = 0;
2400   loop_mems_idx = 0;
2401
2402   num_mem_sets = 0;
2403   loops_enclosed = 1;
2404   loop_continue = 0;
2405
2406   for (insn = NEXT_INSN (start); insn != NEXT_INSN (end);
2407        insn = NEXT_INSN (insn))
2408     {
2409       if (GET_CODE (insn) == NOTE)
2410         {
2411           if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
2412             {
2413               ++level;
2414               /* Count number of loops contained in this one.  */
2415               loops_enclosed++;
2416             }
2417           else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
2418             {
2419               --level;
2420               if (level == 0)
2421                 {
2422                   end = insn;
2423                   break;
2424                 }
2425             }
2426           else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_CONT)
2427             {
2428               if (level == 1)
2429                 loop_continue = insn;
2430             }
2431         }
2432       else if (GET_CODE (insn) == CALL_INSN)
2433         {
2434           if (! CONST_CALL_P (insn))
2435             unknown_address_altered = 1;
2436           loop_has_call = 1;
2437         }
2438       else if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN)
2439         {
2440           rtx label1 = NULL_RTX;
2441           rtx label2 = NULL_RTX;
2442
2443           if (volatile_refs_p (PATTERN (insn)))
2444             loop_has_volatile = 1;
2445
2446           if (GET_CODE (insn) == JUMP_INSN
2447               && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
2448                   || GET_CODE (PATTERN (insn)) == ADDR_VEC))
2449             loop_has_tablejump = 1;
2450           
2451           note_stores (PATTERN (insn), note_addr_stored);
2452
2453           if (! loop_has_multiple_exit_targets
2454               && GET_CODE (insn) == JUMP_INSN
2455               && GET_CODE (PATTERN (insn)) == SET
2456               && SET_DEST (PATTERN (insn)) == pc_rtx)
2457             {
2458               if (GET_CODE (SET_SRC (PATTERN (insn))) == IF_THEN_ELSE)
2459                 {
2460                   label1 = XEXP (SET_SRC (PATTERN (insn)), 1);
2461                   label2 = XEXP (SET_SRC (PATTERN (insn)), 2);
2462                 }
2463               else
2464                 {
2465                   label1 = SET_SRC (PATTERN (insn));
2466                 }
2467
2468               do {
2469                 if (label1 && label1 != pc_rtx)
2470                   {
2471                     if (GET_CODE (label1) != LABEL_REF)
2472                       {
2473                         /* Something tricky.  */
2474                         loop_has_multiple_exit_targets = 1;
2475                         break;
2476                       }
2477                     else if (XEXP (label1, 0) != exit_target
2478                              && LABEL_OUTSIDE_LOOP_P (label1))
2479                       {
2480                         /* A jump outside the current loop.  */
2481                         loop_has_multiple_exit_targets = 1;
2482                         break;
2483                       }
2484                   }
2485
2486                 label1 = label2;
2487                 label2 = NULL_RTX;
2488               } while (label1);
2489             }
2490         }
2491       else if (GET_CODE (insn) == RETURN)
2492         loop_has_multiple_exit_targets = 1;
2493     }
2494
2495   /* Now, rescan the loop, setting up the LOOP_MEMS array.  */
2496   if (/* We can't tell what MEMs are aliased by what.  */
2497       !unknown_address_altered 
2498       /* An exception thrown by a called function might land us
2499          anywhere.  */
2500       && !loop_has_call
2501       /* We don't want loads for MEMs moved to a location before the
2502          one at which their stack memory becomes allocated.  (Note
2503          that this is not a problem for malloc, etc., since those
2504          require actual function calls.  */
2505       && !current_function_calls_alloca
2506       /* There are ways to leave the loop other than falling off the
2507          end.  */
2508       && !loop_has_multiple_exit_targets)
2509     for (insn = NEXT_INSN (start); insn != NEXT_INSN (end);
2510          insn = NEXT_INSN (insn))
2511       for_each_rtx (&insn, insert_loop_mem, 0);
2512 }
2513 \f
2514 /* Scan the function looking for loops.  Record the start and end of each loop.
2515    Also mark as invalid loops any loops that contain a setjmp or are branched
2516    to from outside the loop.  */
2517
2518 static void
2519 find_and_verify_loops (f)
2520      rtx f;
2521 {
2522   rtx insn, label;
2523   int current_loop = -1;
2524   int next_loop = -1;
2525   int loop;
2526
2527   /* If there are jumps to undefined labels,
2528      treat them as jumps out of any/all loops.
2529      This also avoids writing past end of tables when there are no loops.  */
2530   uid_loop_num[0] = -1;
2531
2532   /* Find boundaries of loops, mark which loops are contained within
2533      loops, and invalidate loops that have setjmp.  */
2534
2535   for (insn = f; insn; insn = NEXT_INSN (insn))
2536     {
2537       if (GET_CODE (insn) == NOTE)
2538         switch (NOTE_LINE_NUMBER (insn))
2539           {
2540           case NOTE_INSN_LOOP_BEG:
2541             loop_number_loop_starts[++next_loop] =  insn;
2542             loop_number_loop_ends[next_loop] = 0;
2543             loop_outer_loop[next_loop] = current_loop;
2544             loop_invalid[next_loop] = 0;
2545             loop_number_exit_labels[next_loop] = 0;
2546             loop_number_exit_count[next_loop] = 0;
2547             current_loop = next_loop;
2548             break;
2549
2550           case NOTE_INSN_SETJMP:
2551             /* In this case, we must invalidate our current loop and any
2552                enclosing loop.  */
2553             for (loop = current_loop; loop != -1; loop = loop_outer_loop[loop])
2554               {
2555                 loop_invalid[loop] = 1;
2556                 if (loop_dump_stream)
2557                   fprintf (loop_dump_stream,
2558                            "\nLoop at %d ignored due to setjmp.\n",
2559                            INSN_UID (loop_number_loop_starts[loop]));
2560               }
2561             break;
2562
2563           case NOTE_INSN_LOOP_END:
2564             if (current_loop == -1)
2565               abort ();
2566
2567             loop_number_loop_ends[current_loop] = insn;
2568             current_loop = loop_outer_loop[current_loop];
2569             break;
2570
2571           default:
2572             break;
2573           }
2574
2575       /* Note that this will mark the NOTE_INSN_LOOP_END note as being in the
2576          enclosing loop, but this doesn't matter.  */
2577       uid_loop_num[INSN_UID (insn)] = current_loop;
2578     }
2579
2580   /* Any loop containing a label used in an initializer must be invalidated,
2581      because it can be jumped into from anywhere.  */
2582
2583   for (label = forced_labels; label; label = XEXP (label, 1))
2584     {
2585       int loop_num;
2586
2587       for (loop_num = uid_loop_num[INSN_UID (XEXP (label, 0))];
2588            loop_num != -1;
2589            loop_num = loop_outer_loop[loop_num])
2590         loop_invalid[loop_num] = 1;
2591     }
2592
2593   /* Any loop containing a label used for an exception handler must be
2594      invalidated, because it can be jumped into from anywhere.  */
2595
2596   for (label = exception_handler_labels; label; label = XEXP (label, 1))
2597     {
2598       int loop_num;
2599
2600       for (loop_num = uid_loop_num[INSN_UID (XEXP (label, 0))];
2601            loop_num != -1;
2602            loop_num = loop_outer_loop[loop_num])
2603         loop_invalid[loop_num] = 1;
2604     }
2605
2606   /* Now scan all insn's in the function.  If any JUMP_INSN branches into a
2607      loop that it is not contained within, that loop is marked invalid.
2608      If any INSN or CALL_INSN uses a label's address, then the loop containing
2609      that label is marked invalid, because it could be jumped into from
2610      anywhere.
2611
2612      Also look for blocks of code ending in an unconditional branch that
2613      exits the loop.  If such a block is surrounded by a conditional 
2614      branch around the block, move the block elsewhere (see below) and
2615      invert the jump to point to the code block.  This may eliminate a
2616      label in our loop and will simplify processing by both us and a
2617      possible second cse pass.  */
2618
2619   for (insn = f; insn; insn = NEXT_INSN (insn))
2620     if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
2621       {
2622         int this_loop_num = uid_loop_num[INSN_UID (insn)];
2623
2624         if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
2625           {
2626             rtx note = find_reg_note (insn, REG_LABEL, NULL_RTX);
2627             if (note)
2628               {
2629                 int loop_num;
2630
2631                 for (loop_num = uid_loop_num[INSN_UID (XEXP (note, 0))];
2632                      loop_num != -1;
2633                      loop_num = loop_outer_loop[loop_num])
2634                   loop_invalid[loop_num] = 1;
2635               }
2636           }
2637
2638         if (GET_CODE (insn) != JUMP_INSN)
2639           continue;
2640
2641         mark_loop_jump (PATTERN (insn), this_loop_num);
2642
2643         /* See if this is an unconditional branch outside the loop.  */
2644         if (this_loop_num != -1
2645             && (GET_CODE (PATTERN (insn)) == RETURN
2646                 || (simplejump_p (insn)
2647                     && (uid_loop_num[INSN_UID (JUMP_LABEL (insn))]
2648                         != this_loop_num)))
2649             && get_max_uid () < max_uid_for_loop)
2650           {
2651             rtx p;
2652             rtx our_next = next_real_insn (insn);
2653             int dest_loop;
2654             int outer_loop = -1;
2655
2656             /* Go backwards until we reach the start of the loop, a label,
2657                or a JUMP_INSN.  */
2658             for (p = PREV_INSN (insn);
2659                  GET_CODE (p) != CODE_LABEL
2660                  && ! (GET_CODE (p) == NOTE
2661                        && NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
2662                  && GET_CODE (p) != JUMP_INSN;
2663                  p = PREV_INSN (p))
2664               ;
2665
2666             /* Check for the case where we have a jump to an inner nested
2667                loop, and do not perform the optimization in that case.  */
2668
2669             if (JUMP_LABEL (insn))
2670               {
2671                 dest_loop = uid_loop_num[INSN_UID (JUMP_LABEL (insn))];
2672                 if (dest_loop != -1)
2673                   {
2674                     for (outer_loop = dest_loop; outer_loop != -1;
2675                          outer_loop = loop_outer_loop[outer_loop])
2676                       if (outer_loop == this_loop_num)
2677                         break;
2678                   }
2679               }
2680
2681             /* Make sure that the target of P is within the current loop.  */
2682
2683             if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p)
2684                 && uid_loop_num[INSN_UID (JUMP_LABEL (p))] != this_loop_num)
2685               outer_loop = this_loop_num;
2686
2687             /* If we stopped on a JUMP_INSN to the next insn after INSN,
2688                we have a block of code to try to move.
2689
2690                We look backward and then forward from the target of INSN
2691                to find a BARRIER at the same loop depth as the target.
2692                If we find such a BARRIER, we make a new label for the start
2693                of the block, invert the jump in P and point it to that label,
2694                and move the block of code to the spot we found.  */
2695
2696             if (outer_loop == -1
2697                 && GET_CODE (p) == JUMP_INSN
2698                 && JUMP_LABEL (p) != 0
2699                 /* Just ignore jumps to labels that were never emitted.
2700                    These always indicate compilation errors.  */
2701                 && INSN_UID (JUMP_LABEL (p)) != 0
2702                 && condjump_p (p)
2703                 && ! simplejump_p (p)
2704                 && next_real_insn (JUMP_LABEL (p)) == our_next)
2705               {
2706                 rtx target
2707                   = JUMP_LABEL (insn) ? JUMP_LABEL (insn) : get_last_insn ();
2708                 int target_loop_num = uid_loop_num[INSN_UID (target)];
2709                 rtx loc;
2710
2711                 for (loc = target; loc; loc = PREV_INSN (loc))
2712                   if (GET_CODE (loc) == BARRIER
2713                       && uid_loop_num[INSN_UID (loc)] == target_loop_num)
2714                     break;
2715
2716                 if (loc == 0)
2717                   for (loc = target; loc; loc = NEXT_INSN (loc))
2718                     if (GET_CODE (loc) == BARRIER
2719                         && uid_loop_num[INSN_UID (loc)] == target_loop_num)
2720                       break;
2721
2722                 if (loc)
2723                   {
2724                     rtx cond_label = JUMP_LABEL (p);
2725                     rtx new_label = get_label_after (p);
2726
2727                     /* Ensure our label doesn't go away.  */
2728                     LABEL_NUSES (cond_label)++;
2729
2730                     /* Verify that uid_loop_num is large enough and that
2731                        we can invert P.  */
2732                    if (invert_jump (p, new_label))
2733                      {
2734                        rtx q, r;
2735
2736                        /* If no suitable BARRIER was found, create a suitable
2737                           one before TARGET.  Since TARGET is a fall through
2738                           path, we'll need to insert an jump around our block
2739                           and a add a BARRIER before TARGET.
2740
2741                           This creates an extra unconditional jump outside
2742                           the loop.  However, the benefits of removing rarely
2743                           executed instructions from inside the loop usually
2744                           outweighs the cost of the extra unconditional jump
2745                           outside the loop.  */
2746                        if (loc == 0)
2747                          {
2748                            rtx temp;
2749
2750                            temp = gen_jump (JUMP_LABEL (insn));
2751                            temp = emit_jump_insn_before (temp, target);
2752                            JUMP_LABEL (temp) = JUMP_LABEL (insn);
2753                            LABEL_NUSES (JUMP_LABEL (insn))++;
2754                            loc = emit_barrier_before (target);
2755                          }
2756
2757                        /* Include the BARRIER after INSN and copy the
2758                           block after LOC.  */
2759                        new_label = squeeze_notes (new_label, NEXT_INSN (insn));
2760                        reorder_insns (new_label, NEXT_INSN (insn), loc);
2761
2762                        /* All those insns are now in TARGET_LOOP_NUM.  */
2763                        for (q = new_label; q != NEXT_INSN (NEXT_INSN (insn));
2764                             q = NEXT_INSN (q))
2765                          uid_loop_num[INSN_UID (q)] = target_loop_num;
2766
2767                        /* The label jumped to by INSN is no longer a loop exit.
2768                           Unless INSN does not have a label (e.g., it is a
2769                           RETURN insn), search loop_number_exit_labels to find
2770                           its label_ref, and remove it.  Also turn off
2771                           LABEL_OUTSIDE_LOOP_P bit.  */
2772                        if (JUMP_LABEL (insn))
2773                          {
2774                            int loop_num;
2775
2776                            for (q = 0,
2777                                 r = loop_number_exit_labels[this_loop_num];
2778                                 r; q = r, r = LABEL_NEXTREF (r))
2779                              if (XEXP (r, 0) == JUMP_LABEL (insn))
2780                                {
2781                                  LABEL_OUTSIDE_LOOP_P (r) = 0;
2782                                  if (q)
2783                                    LABEL_NEXTREF (q) = LABEL_NEXTREF (r);
2784                                  else
2785                                    loop_number_exit_labels[this_loop_num]
2786                                      = LABEL_NEXTREF (r);
2787                                  break;
2788                                }
2789
2790                            for (loop_num = this_loop_num;
2791                                 loop_num != -1 && loop_num != target_loop_num;
2792                                 loop_num = loop_outer_loop[loop_num])
2793                              loop_number_exit_count[loop_num]--;
2794
2795                            /* If we didn't find it, then something is wrong.  */
2796                            if (! r)
2797                              abort ();
2798                          }
2799
2800                        /* P is now a jump outside the loop, so it must be put
2801                           in loop_number_exit_labels, and marked as such.
2802                           The easiest way to do this is to just call
2803                           mark_loop_jump again for P.  */
2804                        mark_loop_jump (PATTERN (p), this_loop_num);
2805
2806                        /* If INSN now jumps to the insn after it,
2807                           delete INSN.  */
2808                        if (JUMP_LABEL (insn) != 0
2809                            && (next_real_insn (JUMP_LABEL (insn))
2810                                == next_real_insn (insn)))
2811                          delete_insn (insn);
2812                      }
2813
2814                     /* Continue the loop after where the conditional
2815                        branch used to jump, since the only branch insn
2816                        in the block (if it still remains) is an inter-loop
2817                        branch and hence needs no processing.  */
2818                     insn = NEXT_INSN (cond_label);
2819
2820                     if (--LABEL_NUSES (cond_label) == 0)
2821                       delete_insn (cond_label);
2822
2823                     /* This loop will be continued with NEXT_INSN (insn).  */
2824                     insn = PREV_INSN (insn);
2825                   }
2826               }
2827           }
2828       }
2829 }
2830
2831 /* If any label in X jumps to a loop different from LOOP_NUM and any of the
2832    loops it is contained in, mark the target loop invalid.
2833
2834    For speed, we assume that X is part of a pattern of a JUMP_INSN.  */
2835
2836 static void
2837 mark_loop_jump (x, loop_num)
2838      rtx x;
2839      int loop_num;
2840 {
2841   int dest_loop;
2842   int outer_loop;
2843   int i;
2844
2845   switch (GET_CODE (x))
2846     {
2847     case PC:
2848     case USE:
2849     case CLOBBER:
2850     case REG:
2851     case MEM:
2852     case CONST_INT:
2853     case CONST_DOUBLE:
2854     case RETURN:
2855       return;
2856
2857     case CONST:
2858       /* There could be a label reference in here.  */
2859       mark_loop_jump (XEXP (x, 0), loop_num);
2860       return;
2861
2862     case PLUS:
2863     case MINUS:
2864     case MULT:
2865       mark_loop_jump (XEXP (x, 0), loop_num);
2866       mark_loop_jump (XEXP (x, 1), loop_num);
2867       return;
2868
2869     case SIGN_EXTEND:
2870     case ZERO_EXTEND:
2871       mark_loop_jump (XEXP (x, 0), loop_num);
2872       return;
2873
2874     case LABEL_REF:
2875       dest_loop = uid_loop_num[INSN_UID (XEXP (x, 0))];
2876
2877       /* Link together all labels that branch outside the loop.  This
2878          is used by final_[bg]iv_value and the loop unrolling code.  Also
2879          mark this LABEL_REF so we know that this branch should predict
2880          false.  */
2881
2882       /* A check to make sure the label is not in an inner nested loop,
2883          since this does not count as a loop exit.  */
2884       if (dest_loop != -1)
2885         {
2886           for (outer_loop = dest_loop; outer_loop != -1;
2887                outer_loop = loop_outer_loop[outer_loop])
2888             if (outer_loop == loop_num)
2889               break;
2890         }
2891       else
2892         outer_loop = -1;
2893
2894       if (loop_num != -1 && outer_loop == -1)
2895         {
2896           LABEL_OUTSIDE_LOOP_P (x) = 1;
2897           LABEL_NEXTREF (x) = loop_number_exit_labels[loop_num];
2898           loop_number_exit_labels[loop_num] = x;
2899
2900           for (outer_loop = loop_num;
2901                outer_loop != -1 && outer_loop != dest_loop;
2902                outer_loop = loop_outer_loop[outer_loop])
2903             loop_number_exit_count[outer_loop]++;
2904         }
2905
2906       /* If this is inside a loop, but not in the current loop or one enclosed
2907          by it, it invalidates at least one loop.  */
2908
2909       if (dest_loop == -1)
2910         return;
2911
2912       /* We must invalidate every nested loop containing the target of this
2913          label, except those that also contain the jump insn.  */
2914
2915       for (; dest_loop != -1; dest_loop = loop_outer_loop[dest_loop])
2916         {
2917           /* Stop when we reach a loop that also contains the jump insn.  */
2918           for (outer_loop = loop_num; outer_loop != -1;
2919                outer_loop = loop_outer_loop[outer_loop])
2920             if (dest_loop == outer_loop)
2921               return;
2922
2923           /* If we get here, we know we need to invalidate a loop.  */
2924           if (loop_dump_stream && ! loop_invalid[dest_loop])
2925             fprintf (loop_dump_stream,
2926                      "\nLoop at %d ignored due to multiple entry points.\n",
2927                      INSN_UID (loop_number_loop_starts[dest_loop]));
2928           
2929           loop_invalid[dest_loop] = 1;
2930         }
2931       return;
2932
2933     case SET:
2934       /* If this is not setting pc, ignore.  */
2935       if (SET_DEST (x) == pc_rtx)
2936         mark_loop_jump (SET_SRC (x), loop_num);
2937       return;
2938
2939     case IF_THEN_ELSE:
2940       mark_loop_jump (XEXP (x, 1), loop_num);
2941       mark_loop_jump (XEXP (x, 2), loop_num);
2942       return;
2943
2944     case PARALLEL:
2945     case ADDR_VEC:
2946       for (i = 0; i < XVECLEN (x, 0); i++)
2947         mark_loop_jump (XVECEXP (x, 0, i), loop_num);
2948       return;
2949
2950     case ADDR_DIFF_VEC:
2951       for (i = 0; i < XVECLEN (x, 1); i++)
2952         mark_loop_jump (XVECEXP (x, 1, i), loop_num);
2953       return;
2954
2955     default:
2956       /* Treat anything else (such as a symbol_ref)
2957          as a branch out of this loop, but not into any loop.  */
2958
2959       if (loop_num != -1)
2960         {
2961 #ifdef HAVE_decrement_and_branch_on_count
2962           LABEL_OUTSIDE_LOOP_P (x) = 1;
2963           LABEL_NEXTREF (x) = loop_number_exit_labels[loop_num];
2964 #endif  /* HAVE_decrement_and_branch_on_count */
2965
2966           loop_number_exit_labels[loop_num] = x;
2967
2968           for (outer_loop = loop_num; outer_loop != -1;
2969                outer_loop = loop_outer_loop[outer_loop])
2970             loop_number_exit_count[outer_loop]++;
2971         }
2972       return;
2973     }
2974 }
2975 \f
2976 /* Return nonzero if there is a label in the range from
2977    insn INSN to and including the insn whose luid is END
2978    INSN must have an assigned luid (i.e., it must not have
2979    been previously created by loop.c).  */
2980
2981 static int
2982 labels_in_range_p (insn, end)
2983      rtx insn;
2984      int end;
2985 {
2986   while (insn && INSN_LUID (insn) <= end)
2987     {
2988       if (GET_CODE (insn) == CODE_LABEL)
2989         return 1;
2990       insn = NEXT_INSN (insn);
2991     }
2992
2993   return 0;
2994 }
2995
2996 /* Record that a memory reference X is being set.  */
2997
2998 static void
2999 note_addr_stored (x, y)
3000      rtx x;
3001      rtx y ATTRIBUTE_UNUSED;
3002 {
3003   register int i;
3004
3005   if (x == 0 || GET_CODE (x) != MEM)
3006     return;
3007
3008   /* Count number of memory writes.
3009      This affects heuristics in strength_reduce.  */
3010   num_mem_sets++;
3011
3012   /* BLKmode MEM means all memory is clobbered.  */
3013   if (GET_MODE (x) == BLKmode)
3014     unknown_address_altered = 1;
3015
3016   if (unknown_address_altered)
3017     return;
3018
3019   for (i = 0; i < loop_store_mems_idx; i++)
3020     if (rtx_equal_p (XEXP (loop_store_mems[i], 0), XEXP (x, 0))
3021         && MEM_IN_STRUCT_P (x) == MEM_IN_STRUCT_P (loop_store_mems[i]))
3022       {
3023         /* We are storing at the same address as previously noted.  Save the
3024            wider reference.  */
3025         if (GET_MODE_SIZE (GET_MODE (x))
3026             > GET_MODE_SIZE (GET_MODE (loop_store_mems[i])))
3027           loop_store_mems[i] = x;
3028         break;
3029       }
3030
3031   if (i == NUM_STORES)
3032     unknown_address_altered = 1;
3033
3034   else if (i == loop_store_mems_idx)
3035     loop_store_mems[loop_store_mems_idx++] = x;
3036 }
3037 \f
3038 /* Return nonzero if the rtx X is invariant over the current loop.
3039
3040    The value is 2 if we refer to something only conditionally invariant.
3041
3042    If `unknown_address_altered' is nonzero, no memory ref is invariant.
3043    Otherwise, a memory ref is invariant if it does not conflict with
3044    anything stored in `loop_store_mems'.  */
3045
3046 int
3047 invariant_p (x)
3048      register rtx x;
3049 {
3050   register int i;
3051   register enum rtx_code code;
3052   register char *fmt;
3053   int conditional = 0;
3054
3055   if (x == 0)
3056     return 1;
3057   code = GET_CODE (x);
3058   switch (code)
3059     {
3060     case CONST_INT:
3061     case CONST_DOUBLE:
3062     case SYMBOL_REF:
3063     case CONST:
3064       return 1;
3065
3066     case LABEL_REF:
3067       /* A LABEL_REF is normally invariant, however, if we are unrolling
3068          loops, and this label is inside the loop, then it isn't invariant.
3069          This is because each unrolled copy of the loop body will have
3070          a copy of this label.  If this was invariant, then an insn loading
3071          the address of this label into a register might get moved outside
3072          the loop, and then each loop body would end up using the same label.
3073
3074          We don't know the loop bounds here though, so just fail for all
3075          labels.  */
3076       if (flag_unroll_loops)
3077         return 0;
3078       else
3079         return 1;
3080
3081     case PC:
3082     case CC0:
3083     case UNSPEC_VOLATILE:
3084       return 0;
3085
3086     case REG:
3087       /* We used to check RTX_UNCHANGING_P (x) here, but that is invalid
3088          since the reg might be set by initialization within the loop.  */
3089
3090       if ((x == frame_pointer_rtx || x == hard_frame_pointer_rtx
3091            || x == arg_pointer_rtx)
3092           && ! current_function_has_nonlocal_goto)
3093         return 1;
3094
3095       if (loop_has_call
3096           && REGNO (x) < FIRST_PSEUDO_REGISTER && call_used_regs[REGNO (x)])
3097         return 0;
3098
3099       if (VARRAY_INT (n_times_set, REGNO (x)) < 0)
3100         return 2;
3101
3102       return VARRAY_INT (n_times_set, REGNO (x)) == 0;
3103
3104     case MEM:
3105       /* Volatile memory references must be rejected.  Do this before
3106          checking for read-only items, so that volatile read-only items
3107          will be rejected also.  */
3108       if (MEM_VOLATILE_P (x))
3109         return 0;
3110
3111       /* Read-only items (such as constants in a constant pool) are
3112          invariant if their address is.  */
3113       if (RTX_UNCHANGING_P (x))
3114         break;
3115
3116       /* If we filled the table (or had a subroutine call), any location
3117          in memory could have been clobbered.  */
3118       if (unknown_address_altered)
3119         return 0;
3120
3121       /* See if there is any dependence between a store and this load.  */
3122       for (i = loop_store_mems_idx - 1; i >= 0; i--)
3123         if (true_dependence (loop_store_mems[i], VOIDmode, x, rtx_varies_p))
3124           return 0;
3125
3126       /* It's not invalidated by a store in memory
3127          but we must still verify the address is invariant.  */
3128       break;
3129
3130     case ASM_OPERANDS:
3131       /* Don't mess with insns declared volatile.  */
3132       if (MEM_VOLATILE_P (x))
3133         return 0;
3134       break;
3135       
3136     default:
3137       break;
3138     }
3139
3140   fmt = GET_RTX_FORMAT (code);
3141   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3142     {
3143       if (fmt[i] == 'e')
3144         {
3145           int tem = invariant_p (XEXP (x, i));
3146           if (tem == 0)
3147             return 0;
3148           if (tem == 2)
3149             conditional = 1;
3150         }
3151       else if (fmt[i] == 'E')
3152         {
3153           register int j;
3154           for (j = 0; j < XVECLEN (x, i); j++)
3155             {
3156               int tem = invariant_p (XVECEXP (x, i, j));
3157               if (tem == 0)
3158                 return 0;
3159               if (tem == 2)
3160                 conditional = 1;
3161             }
3162
3163         }
3164     }
3165
3166   return 1 + conditional;
3167 }
3168
3169 \f
3170 /* Return nonzero if all the insns in the loop that set REG
3171    are INSN and the immediately following insns,
3172    and if each of those insns sets REG in an invariant way
3173    (not counting uses of REG in them).
3174
3175    The value is 2 if some of these insns are only conditionally invariant.
3176
3177    We assume that INSN itself is the first set of REG
3178    and that its source is invariant.  */
3179
3180 static int
3181 consec_sets_invariant_p (reg, n_sets, insn)
3182      int n_sets;
3183      rtx reg, insn;
3184 {
3185   register rtx p = insn;
3186   register int regno = REGNO (reg);
3187   rtx temp;
3188   /* Number of sets we have to insist on finding after INSN.  */
3189   int count = n_sets - 1;
3190   int old = VARRAY_INT (n_times_set, regno);
3191   int value = 0;
3192   int this;
3193
3194   /* If N_SETS hit the limit, we can't rely on its value.  */
3195   if (n_sets == 127)
3196     return 0;
3197
3198   VARRAY_INT (n_times_set, regno) = 0;
3199
3200   while (count > 0)
3201     {
3202       register enum rtx_code code;
3203       rtx set;
3204
3205       p = NEXT_INSN (p);
3206       code = GET_CODE (p);
3207
3208       /* If library call, skip to end of it.  */
3209       if (code == INSN && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
3210         p = XEXP (temp, 0);
3211
3212       this = 0;
3213       if (code == INSN
3214           && (set = single_set (p))
3215           && GET_CODE (SET_DEST (set)) == REG
3216           && REGNO (SET_DEST (set)) == regno)
3217         {
3218           this = invariant_p (SET_SRC (set));
3219           if (this != 0)
3220             value |= this;
3221           else if ((temp = find_reg_note (p, REG_EQUAL, NULL_RTX)))
3222             {
3223               /* If this is a libcall, then any invariant REG_EQUAL note is OK.
3224                  If this is an ordinary insn, then only CONSTANT_P REG_EQUAL
3225                  notes are OK.  */
3226               this = (CONSTANT_P (XEXP (temp, 0))
3227                       || (find_reg_note (p, REG_RETVAL, NULL_RTX)
3228                           && invariant_p (XEXP (temp, 0))));
3229               if (this != 0)
3230                 value |= this;
3231             }
3232         }
3233       if (this != 0)
3234         count--;
3235       else if (code != NOTE)
3236         {
3237           VARRAY_INT (n_times_set, regno) = old;
3238           return 0;
3239         }
3240     }
3241
3242   VARRAY_INT (n_times_set, regno) = old;
3243   /* If invariant_p ever returned 2, we return 2.  */
3244   return 1 + (value & 2);
3245 }
3246
3247 #if 0
3248 /* I don't think this condition is sufficient to allow INSN
3249    to be moved, so we no longer test it.  */
3250
3251 /* Return 1 if all insns in the basic block of INSN and following INSN
3252    that set REG are invariant according to TABLE.  */
3253
3254 static int
3255 all_sets_invariant_p (reg, insn, table)
3256      rtx reg, insn;
3257      short *table;
3258 {
3259   register rtx p = insn;
3260   register int regno = REGNO (reg);
3261
3262   while (1)
3263     {
3264       register enum rtx_code code;
3265       p = NEXT_INSN (p);
3266       code = GET_CODE (p);
3267       if (code == CODE_LABEL || code == JUMP_INSN)
3268         return 1;
3269       if (code == INSN && GET_CODE (PATTERN (p)) == SET
3270           && GET_CODE (SET_DEST (PATTERN (p))) == REG
3271           && REGNO (SET_DEST (PATTERN (p))) == regno)
3272         {
3273           if (!invariant_p (SET_SRC (PATTERN (p)), table))
3274             return 0;
3275         }
3276     }
3277 }
3278 #endif /* 0 */
3279 \f
3280 /* Look at all uses (not sets) of registers in X.  For each, if it is
3281    the single use, set USAGE[REGNO] to INSN; if there was a previous use in
3282    a different insn, set USAGE[REGNO] to const0_rtx.  */
3283
3284 static void
3285 find_single_use_in_loop (insn, x, usage)
3286      rtx insn;
3287      rtx x;
3288      varray_type usage;
3289 {
3290   enum rtx_code code = GET_CODE (x);
3291   char *fmt = GET_RTX_FORMAT (code);
3292   int i, j;
3293
3294   if (code == REG)
3295     VARRAY_RTX (usage, REGNO (x))
3296       = (VARRAY_RTX (usage, REGNO (x)) != 0 
3297          && VARRAY_RTX (usage, REGNO (x)) != insn)
3298         ? const0_rtx : insn;
3299
3300   else if (code == SET)
3301     {
3302       /* Don't count SET_DEST if it is a REG; otherwise count things
3303          in SET_DEST because if a register is partially modified, it won't
3304          show up as a potential movable so we don't care how USAGE is set 
3305          for it.  */
3306       if (GET_CODE (SET_DEST (x)) != REG)
3307         find_single_use_in_loop (insn, SET_DEST (x), usage);
3308       find_single_use_in_loop (insn, SET_SRC (x), usage);
3309     }
3310   else
3311     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3312       {
3313         if (fmt[i] == 'e' && XEXP (x, i) != 0)
3314           find_single_use_in_loop (insn, XEXP (x, i), usage);
3315         else if (fmt[i] == 'E')
3316           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
3317             find_single_use_in_loop (insn, XVECEXP (x, i, j), usage);
3318       }
3319 }
3320 \f
3321 /* Count and record any set in X which is contained in INSN.  Update
3322    MAY_NOT_MOVE and LAST_SET for any register set in X.  */
3323
3324 static void
3325 count_one_set (insn, x, may_not_move, last_set)
3326      rtx insn, x;
3327      varray_type may_not_move;
3328      rtx *last_set;
3329 {
3330   if (GET_CODE (x) == CLOBBER && GET_CODE (XEXP (x, 0)) == REG)
3331     /* Don't move a reg that has an explicit clobber.
3332        It's not worth the pain to try to do it correctly.  */
3333     VARRAY_CHAR (may_not_move, REGNO (XEXP (x, 0))) = 1;
3334
3335   if (GET_CODE (x) == SET || GET_CODE (x) == CLOBBER)
3336     {
3337       rtx dest = SET_DEST (x);
3338       while (GET_CODE (dest) == SUBREG
3339              || GET_CODE (dest) == ZERO_EXTRACT
3340              || GET_CODE (dest) == SIGN_EXTRACT
3341              || GET_CODE (dest) == STRICT_LOW_PART)
3342         dest = XEXP (dest, 0);
3343       if (GET_CODE (dest) == REG)
3344         {
3345           register int regno = REGNO (dest);
3346           /* If this is the first setting of this reg
3347              in current basic block, and it was set before,
3348              it must be set in two basic blocks, so it cannot
3349              be moved out of the loop.  */
3350           if (VARRAY_INT (n_times_set, regno) > 0 
3351               && last_set[regno] == 0)
3352             VARRAY_CHAR (may_not_move, regno) = 1;
3353           /* If this is not first setting in current basic block,
3354              see if reg was used in between previous one and this.
3355              If so, neither one can be moved.  */
3356           if (last_set[regno] != 0
3357               && reg_used_between_p (dest, last_set[regno], insn))
3358             VARRAY_CHAR (may_not_move, regno) = 1;
3359           if (VARRAY_INT (n_times_set, regno) < 127)
3360             ++VARRAY_INT (n_times_set, regno);
3361           last_set[regno] = insn;
3362         }
3363     }
3364 }
3365
3366 /* Increment N_TIMES_SET at the index of each register
3367    that is modified by an insn between FROM and TO.
3368    If the value of an element of N_TIMES_SET becomes 127 or more,
3369    stop incrementing it, to avoid overflow.
3370
3371    Store in SINGLE_USAGE[I] the single insn in which register I is
3372    used, if it is only used once.  Otherwise, it is set to 0 (for no
3373    uses) or const0_rtx for more than one use.  This parameter may be zero,
3374    in which case this processing is not done.
3375
3376    Store in *COUNT_PTR the number of actual instruction
3377    in the loop.  We use this to decide what is worth moving out.  */
3378
3379 /* last_set[n] is nonzero iff reg n has been set in the current basic block.
3380    In that case, it is the insn that last set reg n.  */
3381
3382 static void
3383 count_loop_regs_set (from, to, may_not_move, single_usage, count_ptr, nregs)
3384      register rtx from, to;
3385      varray_type may_not_move;
3386      varray_type single_usage;
3387      int *count_ptr;
3388      int nregs;
3389 {
3390   register rtx *last_set = (rtx *) alloca (nregs * sizeof (rtx));
3391   register rtx insn;
3392   register int count = 0;
3393
3394   bzero ((char *) last_set, nregs * sizeof (rtx));
3395   for (insn = from; insn != to; insn = NEXT_INSN (insn))
3396     {
3397       if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
3398         {
3399           ++count;
3400
3401           /* If requested, record registers that have exactly one use.  */
3402           if (single_usage)
3403             {
3404               find_single_use_in_loop (insn, PATTERN (insn), single_usage);
3405
3406               /* Include uses in REG_EQUAL notes.  */
3407               if (REG_NOTES (insn))
3408                 find_single_use_in_loop (insn, REG_NOTES (insn), single_usage);
3409             }
3410
3411           if (GET_CODE (PATTERN (insn)) == SET
3412               || GET_CODE (PATTERN (insn)) == CLOBBER)
3413             count_one_set (insn, PATTERN (insn), may_not_move, last_set);
3414           else if (GET_CODE (PATTERN (insn)) == PARALLEL)
3415             {
3416               register int i;
3417               for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
3418                 count_one_set (insn, XVECEXP (PATTERN (insn), 0, i),
3419                                may_not_move, last_set);
3420             }
3421         }
3422
3423       if (GET_CODE (insn) == CODE_LABEL || GET_CODE (insn) == JUMP_INSN)
3424         bzero ((char *) last_set, nregs * sizeof (rtx));
3425     }
3426   *count_ptr = count;
3427 }
3428 \f
3429 /* Given a loop that is bounded by LOOP_START and LOOP_END
3430    and that is entered at SCAN_START,
3431    return 1 if the register set in SET contained in insn INSN is used by
3432    any insn that precedes INSN in cyclic order starting
3433    from the loop entry point.
3434
3435    We don't want to use INSN_LUID here because if we restrict INSN to those
3436    that have a valid INSN_LUID, it means we cannot move an invariant out
3437    from an inner loop past two loops.  */
3438
3439 static int
3440 loop_reg_used_before_p (set, insn, loop_start, scan_start, loop_end)
3441      rtx set, insn, loop_start, scan_start, loop_end;
3442 {
3443   rtx reg = SET_DEST (set);
3444   rtx p;
3445
3446   /* Scan forward checking for register usage.  If we hit INSN, we
3447      are done.  Otherwise, if we hit LOOP_END, wrap around to LOOP_START.  */
3448   for (p = scan_start; p != insn; p = NEXT_INSN (p))
3449     {
3450       if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
3451           && reg_overlap_mentioned_p (reg, PATTERN (p)))
3452         return 1;
3453
3454       if (p == loop_end)
3455         p = loop_start;
3456     }
3457
3458   return 0;
3459 }
3460 \f
3461 /* A "basic induction variable" or biv is a pseudo reg that is set
3462    (within this loop) only by incrementing or decrementing it.  */
3463 /* A "general induction variable" or giv is a pseudo reg whose
3464    value is a linear function of a biv.  */
3465
3466 /* Bivs are recognized by `basic_induction_var';
3467    Givs by `general_induction_var'.  */
3468
3469 /* Indexed by register number, indicates whether or not register is an
3470    induction variable, and if so what type.  */
3471
3472 enum iv_mode *reg_iv_type;
3473
3474 /* Indexed by register number, contains pointer to `struct induction'
3475    if register is an induction variable.  This holds general info for
3476    all induction variables.  */
3477
3478 struct induction **reg_iv_info;
3479
3480 /* Indexed by register number, contains pointer to `struct iv_class'
3481    if register is a basic induction variable.  This holds info describing
3482    the class (a related group) of induction variables that the biv belongs
3483    to.  */
3484
3485 struct iv_class **reg_biv_class;
3486
3487 /* The head of a list which links together (via the next field)
3488    every iv class for the current loop.  */
3489
3490 struct iv_class *loop_iv_list;
3491
3492 /* Communication with routines called via `note_stores'.  */
3493
3494 static rtx note_insn;
3495
3496 /* Dummy register to have non-zero DEST_REG for DEST_ADDR type givs.  */
3497
3498 static rtx addr_placeholder;
3499
3500 /* ??? Unfinished optimizations, and possible future optimizations,
3501    for the strength reduction code.  */
3502
3503 /* ??? The interaction of biv elimination, and recognition of 'constant'
3504    bivs, may cause problems.  */
3505
3506 /* ??? Add heuristics so that DEST_ADDR strength reduction does not cause
3507    performance problems.
3508
3509    Perhaps don't eliminate things that can be combined with an addressing
3510    mode.  Find all givs that have the same biv, mult_val, and add_val;
3511    then for each giv, check to see if its only use dies in a following
3512    memory address.  If so, generate a new memory address and check to see
3513    if it is valid.   If it is valid, then store the modified memory address,
3514    otherwise, mark the giv as not done so that it will get its own iv.  */
3515
3516 /* ??? Could try to optimize branches when it is known that a biv is always
3517    positive.  */
3518
3519 /* ??? When replace a biv in a compare insn, we should replace with closest
3520    giv so that an optimized branch can still be recognized by the combiner,
3521    e.g. the VAX acb insn.  */
3522
3523 /* ??? Many of the checks involving uid_luid could be simplified if regscan
3524    was rerun in loop_optimize whenever a register was added or moved.
3525    Also, some of the optimizations could be a little less conservative.  */
3526 \f
3527 /* Perform strength reduction and induction variable elimination.  
3528
3529    Pseudo registers created during this function will be beyond the last
3530    valid index in several tables including n_times_set and regno_last_uid.
3531    This does not cause a problem here, because the added registers cannot be
3532    givs outside of their loop, and hence will never be reconsidered.
3533    But scan_loop must check regnos to make sure they are in bounds. 
3534    
3535    SCAN_START is the first instruction in the loop, as the loop would
3536    actually be executed.  END is the NOTE_INSN_LOOP_END.  LOOP_TOP is
3537    the first instruction in the loop, as it is layed out in the
3538    instruction stream.  LOOP_START is the NOTE_INSN_LOOP_BEG.  */
3539
3540 static void
3541 strength_reduce (scan_start, end, loop_top, insn_count,
3542                  loop_start, loop_end, unroll_p, bct_p)
3543      rtx scan_start;
3544      rtx end;
3545      rtx loop_top;
3546      int insn_count;
3547      rtx loop_start;
3548      rtx loop_end;
3549      int unroll_p, bct_p ATTRIBUTE_UNUSED;
3550 {
3551   rtx p;
3552   rtx set;
3553   rtx inc_val;
3554   rtx mult_val;
3555   rtx dest_reg;
3556   /* This is 1 if current insn is not executed at least once for every loop
3557      iteration.  */
3558   int not_every_iteration = 0;
3559   /* This is 1 if current insn may be executed more than once for every
3560      loop iteration.  */
3561   int maybe_multiple = 0;
3562   /* Temporary list pointers for traversing loop_iv_list.  */
3563   struct iv_class *bl, **backbl;
3564   /* Ratio of extra register life span we can justify
3565      for saving an instruction.  More if loop doesn't call subroutines
3566      since in that case saving an insn makes more difference
3567      and more registers are available.  */
3568   /* ??? could set this to last value of threshold in move_movables */
3569   int threshold = (loop_has_call ? 1 : 2) * (3 + n_non_fixed_regs);
3570   /* Map of pseudo-register replacements.  */
3571   rtx *reg_map;
3572   int call_seen;
3573   rtx test;
3574   rtx end_insert_before;
3575   int loop_depth = 0;
3576
3577   reg_iv_type = (enum iv_mode *) alloca (max_reg_before_loop
3578                                          * sizeof (enum iv_mode));
3579   bzero ((char *) reg_iv_type, max_reg_before_loop * sizeof (enum iv_mode));
3580   reg_iv_info = (struct induction **)
3581     alloca (max_reg_before_loop * sizeof (struct induction *));
3582   bzero ((char *) reg_iv_info, (max_reg_before_loop
3583                                 * sizeof (struct induction *)));
3584   reg_biv_class = (struct iv_class **)
3585     alloca (max_reg_before_loop * sizeof (struct iv_class *));
3586   bzero ((char *) reg_biv_class, (max_reg_before_loop
3587                                   * sizeof (struct iv_class *)));
3588
3589   loop_iv_list = 0;
3590   addr_placeholder = gen_reg_rtx (Pmode);
3591
3592   /* Save insn immediately after the loop_end.  Insns inserted after loop_end
3593      must be put before this insn, so that they will appear in the right
3594      order (i.e. loop order). 
3595
3596      If loop_end is the end of the current function, then emit a 
3597      NOTE_INSN_DELETED after loop_end and set end_insert_before to the
3598      dummy note insn.  */
3599   if (NEXT_INSN (loop_end) != 0)
3600     end_insert_before = NEXT_INSN (loop_end);
3601   else
3602     end_insert_before = emit_note_after (NOTE_INSN_DELETED, loop_end);
3603
3604   /* Scan through loop to find all possible bivs.  */
3605
3606   for (p = next_insn_in_loop (scan_start, scan_start, end, loop_top);
3607        p != NULL_RTX;
3608        p = next_insn_in_loop (p, scan_start, end, loop_top))
3609     {
3610       if (GET_CODE (p) == INSN
3611           && (set = single_set (p))
3612           && GET_CODE (SET_DEST (set)) == REG)
3613         {
3614           dest_reg = SET_DEST (set);
3615           if (REGNO (dest_reg) < max_reg_before_loop
3616               && REGNO (dest_reg) >= FIRST_PSEUDO_REGISTER
3617               && reg_iv_type[REGNO (dest_reg)] != NOT_BASIC_INDUCT)
3618             {
3619               if (basic_induction_var (SET_SRC (set), GET_MODE (SET_SRC (set)),
3620                                        dest_reg, p, &inc_val, &mult_val))
3621                 {
3622                   /* It is a possible basic induction variable.
3623                      Create and initialize an induction structure for it.  */
3624
3625                   struct induction *v
3626                     = (struct induction *) alloca (sizeof (struct induction));
3627
3628                   record_biv (v, p, dest_reg, inc_val, mult_val,
3629                               not_every_iteration, maybe_multiple);
3630                   reg_iv_type[REGNO (dest_reg)] = BASIC_INDUCT;
3631                 }
3632               else if (REGNO (dest_reg) < max_reg_before_loop)
3633                 reg_iv_type[REGNO (dest_reg)] = NOT_BASIC_INDUCT;
3634             }
3635         }
3636
3637       /* Past CODE_LABEL, we get to insns that may be executed multiple
3638          times.  The only way we can be sure that they can't is if every
3639          jump insn between here and the end of the loop either
3640          returns, exits the loop, is a forward jump, or is a jump
3641          to the loop start.  */
3642
3643       if (GET_CODE (p) == CODE_LABEL)
3644         {
3645           rtx insn = p;
3646
3647           maybe_multiple = 0;
3648
3649           while (1)
3650             {
3651               insn = NEXT_INSN (insn);
3652               if (insn == scan_start)
3653                 break;
3654               if (insn == end)
3655                 {
3656                   if (loop_top != 0)
3657                     insn = loop_top;
3658                   else
3659                     break;
3660                   if (insn == scan_start)
3661                     break;
3662                 }
3663
3664               if (GET_CODE (insn) == JUMP_INSN
3665                   && GET_CODE (PATTERN (insn)) != RETURN
3666                   && (! condjump_p (insn)
3667                       || (JUMP_LABEL (insn) != 0
3668                           && JUMP_LABEL (insn) != scan_start
3669                           && (INSN_UID (JUMP_LABEL (insn)) >= max_uid_for_loop
3670                               || INSN_UID (insn) >= max_uid_for_loop
3671                               || (INSN_LUID (JUMP_LABEL (insn))
3672                                   < INSN_LUID (insn))))))
3673                 {
3674                   maybe_multiple = 1;
3675                   break;
3676                 }
3677             }
3678         }
3679
3680       /* Past a jump, we get to insns for which we can't count
3681          on whether they will be executed during each iteration.  */
3682       /* This code appears twice in strength_reduce.  There is also similar
3683          code in scan_loop.  */
3684       if (GET_CODE (p) == JUMP_INSN
3685           /* If we enter the loop in the middle, and scan around to the
3686              beginning, don't set not_every_iteration for that.
3687              This can be any kind of jump, since we want to know if insns
3688              will be executed if the loop is executed.  */
3689           && ! (JUMP_LABEL (p) == loop_top
3690                 && ((NEXT_INSN (NEXT_INSN (p)) == loop_end && simplejump_p (p))
3691                     || (NEXT_INSN (p) == loop_end && condjump_p (p)))))
3692         {
3693           rtx label = 0;
3694
3695           /* If this is a jump outside the loop, then it also doesn't
3696              matter.  Check to see if the target of this branch is on the
3697              loop_number_exits_labels list.  */
3698              
3699           for (label = loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]];
3700                label;
3701                label = LABEL_NEXTREF (label))
3702             if (XEXP (label, 0) == JUMP_LABEL (p))
3703               break;
3704
3705           if (! label)
3706             not_every_iteration = 1;
3707         }
3708
3709       else if (GET_CODE (p) == NOTE)
3710         {
3711           /* At the virtual top of a converted loop, insns are again known to
3712              be executed each iteration: logically, the loop begins here
3713              even though the exit code has been duplicated.  */
3714           if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_VTOP && loop_depth == 0)
3715             not_every_iteration = 0;
3716           else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
3717             loop_depth++;
3718           else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END)
3719             loop_depth--;
3720         }
3721
3722       /* Unlike in the code motion pass where MAYBE_NEVER indicates that
3723          an insn may never be executed, NOT_EVERY_ITERATION indicates whether
3724          or not an insn is known to be executed each iteration of the
3725          loop, whether or not any iterations are known to occur.
3726
3727          Therefore, if we have just passed a label and have no more labels
3728          between here and the test insn of the loop, we know these insns
3729          will be executed each iteration.  */
3730
3731       if (not_every_iteration && GET_CODE (p) == CODE_LABEL
3732           && no_labels_between_p (p, loop_end))
3733         not_every_iteration = 0;
3734     }
3735
3736   /* Scan loop_iv_list to remove all regs that proved not to be bivs.
3737      Make a sanity check against n_times_set.  */
3738   for (backbl = &loop_iv_list, bl = *backbl; bl; bl = bl->next)
3739     {
3740       if (reg_iv_type[bl->regno] != BASIC_INDUCT
3741           /* Above happens if register modified by subreg, etc.  */
3742           /* Make sure it is not recognized as a basic induction var: */
3743           || VARRAY_INT (n_times_set, bl->regno) != bl->biv_count
3744           /* If never incremented, it is invariant that we decided not to
3745              move.  So leave it alone.  */
3746           || ! bl->incremented)
3747         {
3748           if (loop_dump_stream)
3749             fprintf (loop_dump_stream, "Reg %d: biv discarded, %s\n",
3750                      bl->regno,
3751                      (reg_iv_type[bl->regno] != BASIC_INDUCT
3752                       ? "not induction variable"
3753                       : (! bl->incremented ? "never incremented"
3754                          : "count error")));
3755           
3756           reg_iv_type[bl->regno] = NOT_BASIC_INDUCT;
3757           *backbl = bl->next;
3758         }
3759       else
3760         {
3761           backbl = &bl->next;
3762
3763           if (loop_dump_stream)
3764             fprintf (loop_dump_stream, "Reg %d: biv verified\n", bl->regno);
3765         }
3766     }
3767
3768   /* Exit if there are no bivs.  */
3769   if (! loop_iv_list)
3770     {
3771       /* Can still unroll the loop anyways, but indicate that there is no
3772          strength reduction info available.  */
3773       if (unroll_p)
3774         unroll_loop (loop_end, insn_count, loop_start, end_insert_before, 0);
3775
3776       return;
3777     }
3778
3779   /* Find initial value for each biv by searching backwards from loop_start,
3780      halting at first label.  Also record any test condition.  */
3781
3782   call_seen = 0;
3783   for (p = loop_start; p && GET_CODE (p) != CODE_LABEL; p = PREV_INSN (p))
3784     {
3785       note_insn = p;
3786
3787       if (GET_CODE (p) == CALL_INSN)
3788         call_seen = 1;
3789
3790       if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
3791           || GET_CODE (p) == CALL_INSN)
3792         note_stores (PATTERN (p), record_initial);
3793
3794       /* Record any test of a biv that branches around the loop if no store
3795          between it and the start of loop.  We only care about tests with
3796          constants and registers and only certain of those.  */
3797       if (GET_CODE (p) == JUMP_INSN
3798           && JUMP_LABEL (p) != 0
3799           && next_real_insn (JUMP_LABEL (p)) == next_real_insn (loop_end)
3800           && (test = get_condition_for_loop (p)) != 0
3801           && GET_CODE (XEXP (test, 0)) == REG
3802           && REGNO (XEXP (test, 0)) < max_reg_before_loop
3803           && (bl = reg_biv_class[REGNO (XEXP (test, 0))]) != 0
3804           && valid_initial_value_p (XEXP (test, 1), p, call_seen, loop_start)
3805           && bl->init_insn == 0)
3806         {
3807           /* If an NE test, we have an initial value!  */
3808           if (GET_CODE (test) == NE)
3809             {
3810               bl->init_insn = p;
3811               bl->init_set = gen_rtx_SET (VOIDmode,
3812                                           XEXP (test, 0), XEXP (test, 1));
3813             }
3814           else
3815             bl->initial_test = test;
3816         }
3817     }
3818
3819   /* Look at the each biv and see if we can say anything better about its
3820      initial value from any initializing insns set up above.  (This is done
3821      in two passes to avoid missing SETs in a PARALLEL.)  */
3822   for (bl = loop_iv_list; bl; bl = bl->next)
3823     {
3824       rtx src;
3825       rtx note;
3826
3827       if (! bl->init_insn)
3828         continue;
3829
3830       /* IF INIT_INSN has a REG_EQUAL or REG_EQUIV note and the value
3831          is a constant, use the value of that.  */
3832       if (((note = find_reg_note (bl->init_insn, REG_EQUAL, 0)) != NULL
3833            && CONSTANT_P (XEXP (note, 0)))
3834           || ((note = find_reg_note (bl->init_insn, REG_EQUIV, 0)) != NULL
3835               && CONSTANT_P (XEXP (note, 0))))
3836         src = XEXP (note, 0);
3837       else
3838         src = SET_SRC (bl->init_set);
3839
3840       if (loop_dump_stream)
3841         fprintf (loop_dump_stream,
3842                  "Biv %d initialized at insn %d: initial value ",
3843                  bl->regno, INSN_UID (bl->init_insn));
3844
3845       if ((GET_MODE (src) == GET_MODE (regno_reg_rtx[bl->regno])
3846            || GET_MODE (src) == VOIDmode)
3847           && valid_initial_value_p (src, bl->init_insn, call_seen, loop_start))
3848         {
3849           bl->initial_value = src;
3850
3851           if (loop_dump_stream)
3852             {
3853               if (GET_CODE (src) == CONST_INT)
3854                 {
3855                   fprintf (loop_dump_stream, HOST_WIDE_INT_PRINT_DEC, INTVAL (src));
3856                   fputc ('\n', loop_dump_stream);
3857                 }
3858               else
3859                 {
3860                   print_rtl (loop_dump_stream, src);
3861                   fprintf (loop_dump_stream, "\n");
3862                 }
3863             }
3864         }
3865       else
3866         {
3867           /* Biv initial value is not simple move,
3868              so let it keep initial value of "itself".  */
3869
3870           if (loop_dump_stream)
3871             fprintf (loop_dump_stream, "is complex\n");
3872         }
3873     }
3874
3875   /* Search the loop for general induction variables.  */
3876
3877   /* A register is a giv if: it is only set once, it is a function of a
3878      biv and a constant (or invariant), and it is not a biv.  */
3879
3880   not_every_iteration = 0;
3881   loop_depth = 0;
3882   p = scan_start;
3883   while (1)
3884     {
3885       p = NEXT_INSN (p);
3886       /* At end of a straight-in loop, we are done.
3887          At end of a loop entered at the bottom, scan the top.  */
3888       if (p == scan_start)
3889         break;
3890       if (p == end)
3891         {
3892           if (loop_top != 0)
3893             p = loop_top;
3894           else
3895             break;
3896           if (p == scan_start)
3897             break;
3898         }
3899
3900       /* Look for a general induction variable in a register.  */
3901       if (GET_CODE (p) == INSN
3902           && (set = single_set (p))
3903           && GET_CODE (SET_DEST (set)) == REG
3904           && ! VARRAY_CHAR (may_not_optimize, REGNO (SET_DEST (set))))
3905         {
3906           rtx src_reg;
3907           rtx add_val;
3908           rtx mult_val;
3909           int benefit;
3910           rtx regnote = 0;
3911
3912           dest_reg = SET_DEST (set);
3913           if (REGNO (dest_reg) < FIRST_PSEUDO_REGISTER)
3914             continue;
3915
3916           if (/* SET_SRC is a giv.  */
3917               (general_induction_var (SET_SRC (set), &src_reg, &add_val,
3918                                       &mult_val, 0, &benefit)
3919                /* Equivalent expression is a giv.  */
3920                || ((regnote = find_reg_note (p, REG_EQUAL, NULL_RTX))
3921                    && general_induction_var (XEXP (regnote, 0), &src_reg,
3922                                              &add_val, &mult_val, 0,
3923                                              &benefit)))
3924               /* Don't try to handle any regs made by loop optimization.
3925                  We have nothing on them in regno_first_uid, etc.  */
3926               && REGNO (dest_reg) < max_reg_before_loop
3927               /* Don't recognize a BASIC_INDUCT_VAR here.  */
3928               && dest_reg != src_reg
3929               /* This must be the only place where the register is set.  */
3930               && (VARRAY_INT (n_times_set, REGNO (dest_reg)) == 1
3931                   /* or all sets must be consecutive and make a giv.  */
3932                   || (benefit = consec_sets_giv (benefit, p,
3933                                                  src_reg, dest_reg,
3934                                                  &add_val, &mult_val))))
3935             {
3936               int count;
3937               struct induction *v
3938                 = (struct induction *) alloca (sizeof (struct induction));
3939               rtx temp;
3940
3941               /* If this is a library call, increase benefit.  */
3942               if (find_reg_note (p, REG_RETVAL, NULL_RTX))
3943                 benefit += libcall_benefit (p);
3944
3945               /* Skip the consecutive insns, if there are any.  */
3946               for (count = VARRAY_INT (n_times_set, REGNO (dest_reg)) - 1;
3947                    count > 0; count--)
3948                 {
3949                   /* If first insn of libcall sequence, skip to end.
3950                      Do this at start of loop, since INSN is guaranteed to
3951                      be an insn here.  */
3952                   if (GET_CODE (p) != NOTE
3953                       && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
3954                     p = XEXP (temp, 0);
3955
3956                   do p = NEXT_INSN (p);
3957                   while (GET_CODE (p) == NOTE);
3958                 }
3959
3960               record_giv (v, p, src_reg, dest_reg, mult_val, add_val, benefit,
3961                           DEST_REG, not_every_iteration, NULL_PTR, loop_start,
3962                           loop_end);
3963
3964             }
3965         }
3966
3967 #ifndef DONT_REDUCE_ADDR
3968       /* Look for givs which are memory addresses.  */
3969       /* This resulted in worse code on a VAX 8600.  I wonder if it
3970          still does.  */
3971       if (GET_CODE (p) == INSN)
3972         find_mem_givs (PATTERN (p), p, not_every_iteration, loop_start,
3973                        loop_end);
3974 #endif
3975
3976       /* Update the status of whether giv can derive other givs.  This can
3977          change when we pass a label or an insn that updates a biv.  */
3978       if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
3979         || GET_CODE (p) == CODE_LABEL)
3980         update_giv_derive (p);
3981
3982       /* Past a jump, we get to insns for which we can't count
3983          on whether they will be executed during each iteration.  */
3984       /* This code appears twice in strength_reduce.  There is also similar
3985          code in scan_loop.  */
3986       if (GET_CODE (p) == JUMP_INSN
3987           /* If we enter the loop in the middle, and scan around to the
3988              beginning, don't set not_every_iteration for that.
3989              This can be any kind of jump, since we want to know if insns
3990              will be executed if the loop is executed.  */
3991           && ! (JUMP_LABEL (p) == loop_top
3992                 && ((NEXT_INSN (NEXT_INSN (p)) == loop_end && simplejump_p (p))
3993                     || (NEXT_INSN (p) == loop_end && condjump_p (p)))))
3994         {
3995           rtx label = 0;
3996
3997           /* If this is a jump outside the loop, then it also doesn't
3998              matter.  Check to see if the target of this branch is on the
3999              loop_number_exits_labels list.  */
4000              
4001           for (label = loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]];
4002                label;
4003                label = LABEL_NEXTREF (label))
4004             if (XEXP (label, 0) == JUMP_LABEL (p))
4005               break;
4006
4007           if (! label)
4008             not_every_iteration = 1;
4009         }
4010
4011       else if (GET_CODE (p) == NOTE)
4012         {
4013           /* At the virtual top of a converted loop, insns are again known to
4014              be executed each iteration: logically, the loop begins here
4015              even though the exit code has been duplicated.  */
4016           if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_VTOP && loop_depth == 0)
4017             not_every_iteration = 0;
4018           else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
4019             loop_depth++;
4020           else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END)
4021             loop_depth--;
4022         }
4023
4024       /* Unlike in the code motion pass where MAYBE_NEVER indicates that
4025          an insn may never be executed, NOT_EVERY_ITERATION indicates whether
4026          or not an insn is known to be executed each iteration of the
4027          loop, whether or not any iterations are known to occur.
4028
4029          Therefore, if we have just passed a label and have no more labels
4030          between here and the test insn of the loop, we know these insns
4031          will be executed each iteration.  */
4032
4033       if (not_every_iteration && GET_CODE (p) == CODE_LABEL
4034           && no_labels_between_p (p, loop_end))
4035         not_every_iteration = 0;
4036     }
4037
4038   /* Try to calculate and save the number of loop iterations.  This is
4039      set to zero if the actual number can not be calculated.  This must
4040      be called after all giv's have been identified, since otherwise it may
4041      fail if the iteration variable is a giv.  */
4042
4043   loop_n_iterations = loop_iterations (loop_start, loop_end);
4044
4045   /* Now for each giv for which we still don't know whether or not it is
4046      replaceable, check to see if it is replaceable because its final value
4047      can be calculated.  This must be done after loop_iterations is called,
4048      so that final_giv_value will work correctly.  */
4049
4050   for (bl = loop_iv_list; bl; bl = bl->next)
4051     {
4052       struct induction *v;
4053
4054       for (v = bl->giv; v; v = v->next_iv)
4055         if (! v->replaceable && ! v->not_replaceable)
4056           check_final_value (v, loop_start, loop_end);
4057     }
4058
4059   /* Try to prove that the loop counter variable (if any) is always
4060      nonnegative; if so, record that fact with a REG_NONNEG note
4061      so that "decrement and branch until zero" insn can be used.  */
4062   check_dbra_loop (loop_end, insn_count, loop_start);
4063
4064   /* Create reg_map to hold substitutions for replaceable giv regs.  */
4065   reg_map = (rtx *) alloca (max_reg_before_loop * sizeof (rtx));
4066   bzero ((char *) reg_map, max_reg_before_loop * sizeof (rtx));
4067
4068   /* Examine each iv class for feasibility of strength reduction/induction
4069      variable elimination.  */
4070
4071   for (bl = loop_iv_list; bl; bl = bl->next)
4072     {
4073       struct induction *v;
4074       int benefit;
4075       int all_reduced;
4076       rtx final_value = 0;
4077
4078       /* Test whether it will be possible to eliminate this biv
4079          provided all givs are reduced.  This is possible if either
4080          the reg is not used outside the loop, or we can compute
4081          what its final value will be.
4082
4083          For architectures with a decrement_and_branch_until_zero insn,
4084          don't do this if we put a REG_NONNEG note on the endtest for
4085          this biv.  */
4086
4087       /* Compare against bl->init_insn rather than loop_start.
4088          We aren't concerned with any uses of the biv between
4089          init_insn and loop_start since these won't be affected
4090          by the value of the biv elsewhere in the function, so
4091          long as init_insn doesn't use the biv itself.
4092          March 14, 1989 -- self@bayes.arc.nasa.gov */
4093
4094       if ((uid_luid[REGNO_LAST_UID (bl->regno)] < INSN_LUID (loop_end)
4095            && bl->init_insn
4096            && INSN_UID (bl->init_insn) < max_uid_for_loop
4097            && uid_luid[REGNO_FIRST_UID (bl->regno)] >= INSN_LUID (bl->init_insn)
4098 #ifdef HAVE_decrement_and_branch_until_zero
4099            && ! bl->nonneg
4100 #endif
4101            && ! reg_mentioned_p (bl->biv->dest_reg, SET_SRC (bl->init_set)))
4102           || ((final_value = final_biv_value (bl, loop_start, loop_end))
4103 #ifdef HAVE_decrement_and_branch_until_zero
4104               && ! bl->nonneg
4105 #endif
4106               ))
4107         bl->eliminable = maybe_eliminate_biv (bl, loop_start, end, 0,
4108                                               threshold, insn_count);
4109       else
4110         {
4111           if (loop_dump_stream)
4112             {
4113               fprintf (loop_dump_stream,
4114                        "Cannot eliminate biv %d.\n",
4115                        bl->regno);
4116               fprintf (loop_dump_stream,
4117                        "First use: insn %d, last use: insn %d.\n",
4118                        REGNO_FIRST_UID (bl->regno),
4119                        REGNO_LAST_UID (bl->regno));
4120             }
4121         }
4122
4123       /* Combine all giv's for this iv_class.  */
4124       combine_givs (bl);
4125
4126       /* This will be true at the end, if all givs which depend on this
4127          biv have been strength reduced.
4128          We can't (currently) eliminate the biv unless this is so.  */
4129       all_reduced = 1;
4130
4131       /* Check each giv in this class to see if we will benefit by reducing
4132          it.  Skip giv's combined with others.  */
4133       for (v = bl->giv; v; v = v->next_iv)
4134         {
4135           struct induction *tv;
4136
4137           if (v->ignore || v->same)
4138             continue;
4139
4140           benefit = v->benefit;
4141
4142           /* Reduce benefit if not replaceable, since we will insert
4143              a move-insn to replace the insn that calculates this giv.
4144              Don't do this unless the giv is a user variable, since it
4145              will often be marked non-replaceable because of the duplication
4146              of the exit code outside the loop.  In such a case, the copies
4147              we insert are dead and will be deleted.  So they don't have
4148              a cost.  Similar situations exist.  */
4149           /* ??? The new final_[bg]iv_value code does a much better job
4150              of finding replaceable giv's, and hence this code may no longer
4151              be necessary.  */
4152           if (! v->replaceable && ! bl->eliminable
4153               && REG_USERVAR_P (v->dest_reg))
4154             benefit -= copy_cost;
4155
4156           /* Decrease the benefit to count the add-insns that we will
4157              insert to increment the reduced reg for the giv.  */
4158           benefit -= add_cost * bl->biv_count;
4159
4160           /* Decide whether to strength-reduce this giv or to leave the code
4161              unchanged (recompute it from the biv each time it is used).
4162              This decision can be made independently for each giv.  */
4163
4164 #ifdef AUTO_INC_DEC
4165           /* Attempt to guess whether autoincrement will handle some of the
4166              new add insns; if so, increase BENEFIT (undo the subtraction of
4167              add_cost that was done above).  */
4168           if (v->giv_type == DEST_ADDR
4169               && GET_CODE (v->mult_val) == CONST_INT)
4170             {
4171               if (HAVE_POST_INCREMENT
4172                   && INTVAL (v->mult_val) == GET_MODE_SIZE (v->mem_mode))
4173                 benefit += add_cost * bl->biv_count;
4174               else if (HAVE_PRE_INCREMENT
4175                        && INTVAL (v->mult_val) == GET_MODE_SIZE (v->mem_mode))
4176                 benefit += add_cost * bl->biv_count;
4177               else if (HAVE_POST_DECREMENT
4178                        && -INTVAL (v->mult_val) == GET_MODE_SIZE (v->mem_mode))
4179                 benefit += add_cost * bl->biv_count;
4180               else if (HAVE_PRE_DECREMENT
4181                        && -INTVAL (v->mult_val) == GET_MODE_SIZE (v->mem_mode))
4182                 benefit += add_cost * bl->biv_count;
4183             }
4184 #endif
4185
4186           /* If an insn is not to be strength reduced, then set its ignore
4187              flag, and clear all_reduced.  */
4188
4189           /* A giv that depends on a reversed biv must be reduced if it is
4190              used after the loop exit, otherwise, it would have the wrong
4191              value after the loop exit.  To make it simple, just reduce all
4192              of such giv's whether or not we know they are used after the loop
4193              exit.  */
4194
4195           if ( ! flag_reduce_all_givs && v->lifetime * threshold * benefit < insn_count
4196               && ! bl->reversed )
4197             {
4198               if (loop_dump_stream)
4199                 fprintf (loop_dump_stream,
4200                          "giv of insn %d not worth while, %d vs %d.\n",
4201                          INSN_UID (v->insn),
4202                          v->lifetime * threshold * benefit, insn_count);
4203               v->ignore = 1;
4204               all_reduced = 0;
4205             }
4206           else
4207             {
4208               /* Check that we can increment the reduced giv without a
4209                  multiply insn.  If not, reject it.  */
4210
4211               for (tv = bl->biv; tv; tv = tv->next_iv)
4212                 if (tv->mult_val == const1_rtx
4213                     && ! product_cheap_p (tv->add_val, v->mult_val))
4214                   {
4215                     if (loop_dump_stream)
4216                       fprintf (loop_dump_stream,
4217                                "giv of insn %d: would need a multiply.\n",
4218                                INSN_UID (v->insn));
4219                     v->ignore = 1;
4220                     all_reduced = 0;
4221                     break;
4222                   }
4223             }
4224         }
4225
4226       /* Reduce each giv that we decided to reduce.  */
4227
4228       for (v = bl->giv; v; v = v->next_iv)
4229         {
4230           struct induction *tv;
4231           if (! v->ignore && v->same == 0)
4232             {
4233               int auto_inc_opt = 0;
4234
4235               v->new_reg = gen_reg_rtx (v->mode);
4236
4237 #ifdef AUTO_INC_DEC
4238               /* If the target has auto-increment addressing modes, and
4239                  this is an address giv, then try to put the increment
4240                  immediately after its use, so that flow can create an
4241                  auto-increment addressing mode.  */
4242               if (v->giv_type == DEST_ADDR && bl->biv_count == 1
4243                   && bl->biv->always_executed && ! bl->biv->maybe_multiple
4244                   /* We don't handle reversed biv's because bl->biv->insn
4245                      does not have a valid INSN_LUID.  */
4246                   && ! bl->reversed
4247                   && v->always_executed && ! v->maybe_multiple
4248                   && INSN_UID (v->insn) < max_uid_for_loop)
4249                 {
4250                   /* If other giv's have been combined with this one, then
4251                      this will work only if all uses of the other giv's occur
4252                      before this giv's insn.  This is difficult to check.
4253
4254                      We simplify this by looking for the common case where
4255                      there is one DEST_REG giv, and this giv's insn is the
4256                      last use of the dest_reg of that DEST_REG giv.  If the
4257                      increment occurs after the address giv, then we can
4258                      perform the optimization.  (Otherwise, the increment
4259                      would have to go before other_giv, and we would not be
4260                      able to combine it with the address giv to get an
4261                      auto-inc address.)  */
4262                   if (v->combined_with)
4263                     {
4264                       struct induction *other_giv = 0;
4265
4266                       for (tv = bl->giv; tv; tv = tv->next_iv)
4267                         if (tv->same == v)
4268                           {
4269                             if (other_giv)
4270                               break;
4271                             else
4272                               other_giv = tv;
4273                           }
4274                       if (! tv && other_giv
4275                           && REGNO (other_giv->dest_reg) < max_reg_before_loop
4276                           && (REGNO_LAST_UID (REGNO (other_giv->dest_reg))
4277                               == INSN_UID (v->insn))
4278                           && INSN_LUID (v->insn) < INSN_LUID (bl->biv->insn))
4279                         auto_inc_opt = 1;
4280                     }
4281                   /* Check for case where increment is before the address
4282                      giv.  Do this test in "loop order".  */
4283                   else if ((INSN_LUID (v->insn) > INSN_LUID (bl->biv->insn)
4284                             && (INSN_LUID (v->insn) < INSN_LUID (scan_start)
4285                                 || (INSN_LUID (bl->biv->insn)
4286                                     > INSN_LUID (scan_start))))
4287                            || (INSN_LUID (v->insn) < INSN_LUID (scan_start)
4288                                && (INSN_LUID (scan_start)
4289                                    < INSN_LUID (bl->biv->insn))))
4290                     auto_inc_opt = -1;
4291                   else
4292                     auto_inc_opt = 1;
4293
4294 #ifdef HAVE_cc0
4295                   {
4296                     rtx prev;
4297
4298                     /* We can't put an insn immediately after one setting
4299                        cc0, or immediately before one using cc0.  */
4300                     if ((auto_inc_opt == 1 && sets_cc0_p (PATTERN (v->insn)))
4301                         || (auto_inc_opt == -1
4302                             && (prev = prev_nonnote_insn (v->insn)) != 0
4303                             && GET_RTX_CLASS (GET_CODE (prev)) == 'i'
4304                             && sets_cc0_p (PATTERN (prev))))
4305                       auto_inc_opt = 0;
4306                   }
4307 #endif
4308
4309                   if (auto_inc_opt)
4310                     v->auto_inc_opt = 1;
4311                 }
4312 #endif
4313
4314               /* For each place where the biv is incremented, add an insn
4315                  to increment the new, reduced reg for the giv.  */
4316               for (tv = bl->biv; tv; tv = tv->next_iv)
4317                 {
4318                   rtx insert_before;
4319
4320                   if (! auto_inc_opt)
4321                     insert_before = tv->insn;
4322                   else if (auto_inc_opt == 1)
4323                     insert_before = NEXT_INSN (v->insn);
4324                   else
4325                     insert_before = v->insn;
4326
4327                   if (tv->mult_val == const1_rtx)
4328                     emit_iv_add_mult (tv->add_val, v->mult_val,
4329                                       v->new_reg, v->new_reg, insert_before);
4330                   else /* tv->mult_val == const0_rtx */
4331                     /* A multiply is acceptable here
4332                        since this is presumed to be seldom executed.  */
4333                     emit_iv_add_mult (tv->add_val, v->mult_val,
4334                                       v->add_val, v->new_reg, insert_before);
4335                 }
4336
4337               /* Add code at loop start to initialize giv's reduced reg.  */
4338
4339               emit_iv_add_mult (bl->initial_value, v->mult_val,
4340                                 v->add_val, v->new_reg, loop_start);
4341             }
4342         }
4343
4344       /* Rescan all givs.  If a giv is the same as a giv not reduced, mark it
4345          as not reduced.
4346          
4347          For each giv register that can be reduced now: if replaceable,
4348          substitute reduced reg wherever the old giv occurs;
4349          else add new move insn "giv_reg = reduced_reg".
4350
4351          Also check for givs whose first use is their definition and whose
4352          last use is the definition of another giv.  If so, it is likely
4353          dead and should not be used to eliminate a biv.  */
4354       for (v = bl->giv; v; v = v->next_iv)
4355         {
4356           if (v->same && v->same->ignore)
4357             v->ignore = 1;
4358
4359           if (v->ignore)
4360             continue;
4361
4362           if (v->giv_type == DEST_REG
4363               && REGNO_FIRST_UID (REGNO (v->dest_reg)) == INSN_UID (v->insn))
4364             {
4365               struct induction *v1;
4366
4367               for (v1 = bl->giv; v1; v1 = v1->next_iv)
4368                 if (REGNO_LAST_UID (REGNO (v->dest_reg)) == INSN_UID (v1->insn))
4369                   v->maybe_dead = 1;
4370             }
4371
4372           /* Update expression if this was combined, in case other giv was
4373              replaced.  */
4374           if (v->same)
4375             v->new_reg = replace_rtx (v->new_reg,
4376                                       v->same->dest_reg, v->same->new_reg);
4377
4378           if (v->giv_type == DEST_ADDR)
4379             /* Store reduced reg as the address in the memref where we found
4380                this giv.  */
4381             validate_change (v->insn, v->location, v->new_reg, 0);
4382           else if (v->replaceable)
4383             {
4384               reg_map[REGNO (v->dest_reg)] = v->new_reg;
4385
4386 #if 0
4387               /* I can no longer duplicate the original problem.  Perhaps
4388                  this is unnecessary now?  */
4389
4390               /* Replaceable; it isn't strictly necessary to delete the old
4391                  insn and emit a new one, because v->dest_reg is now dead.
4392
4393                  However, especially when unrolling loops, the special
4394                  handling for (set REG0 REG1) in the second cse pass may
4395                  make v->dest_reg live again.  To avoid this problem, emit
4396                  an insn to set the original giv reg from the reduced giv.
4397                  We can not delete the original insn, since it may be part
4398                  of a LIBCALL, and the code in flow that eliminates dead
4399                  libcalls will fail if it is deleted.  */
4400               emit_insn_after (gen_move_insn (v->dest_reg, v->new_reg),
4401                                v->insn);
4402 #endif
4403             }
4404           else
4405             {
4406               /* Not replaceable; emit an insn to set the original giv reg from
4407                  the reduced giv, same as above.  */
4408               emit_insn_after (gen_move_insn (v->dest_reg, v->new_reg),
4409                                v->insn);
4410             }
4411
4412           /* When a loop is reversed, givs which depend on the reversed
4413              biv, and which are live outside the loop, must be set to their
4414              correct final value.  This insn is only needed if the giv is
4415              not replaceable.  The correct final value is the same as the
4416              value that the giv starts the reversed loop with.  */
4417           if (bl->reversed && ! v->replaceable)
4418             emit_iv_add_mult (bl->initial_value, v->mult_val,
4419                               v->add_val, v->dest_reg, end_insert_before);
4420           else if (v->final_value)
4421             {
4422               rtx insert_before;
4423
4424               /* If the loop has multiple exits, emit the insn before the
4425                  loop to ensure that it will always be executed no matter
4426                  how the loop exits.  Otherwise, emit the insn after the loop,
4427                  since this is slightly more efficient.  */
4428               if (loop_number_exit_count[uid_loop_num[INSN_UID (loop_start)]])
4429                 insert_before = loop_start;
4430               else
4431                 insert_before = end_insert_before;
4432               emit_insn_before (gen_move_insn (v->dest_reg, v->final_value),
4433                                 insert_before);
4434
4435 #if 0
4436               /* If the insn to set the final value of the giv was emitted
4437                  before the loop, then we must delete the insn inside the loop
4438                  that sets it.  If this is a LIBCALL, then we must delete
4439                  every insn in the libcall.  Note, however, that
4440                  final_giv_value will only succeed when there are multiple
4441                  exits if the giv is dead at each exit, hence it does not
4442                  matter that the original insn remains because it is dead
4443                  anyways.  */
4444               /* Delete the insn inside the loop that sets the giv since
4445                  the giv is now set before (or after) the loop.  */
4446               delete_insn (v->insn);
4447 #endif
4448             }
4449
4450           if (loop_dump_stream)
4451             {
4452               fprintf (loop_dump_stream, "giv at %d reduced to ",
4453                        INSN_UID (v->insn));
4454               print_rtl (loop_dump_stream, v->new_reg);
4455               fprintf (loop_dump_stream, "\n");
4456             }
4457         }
4458
4459       /* All the givs based on the biv bl have been reduced if they
4460          merit it.  */
4461
4462       /* For each giv not marked as maybe dead that has been combined with a
4463          second giv, clear any "maybe dead" mark on that second giv.
4464          v->new_reg will either be or refer to the register of the giv it
4465          combined with.
4466
4467          Doing this clearing avoids problems in biv elimination where a
4468          giv's new_reg is a complex value that can't be put in the insn but
4469          the giv combined with (with a reg as new_reg) is marked maybe_dead.
4470          Since the register will be used in either case, we'd prefer it be
4471          used from the simpler giv.  */
4472
4473       for (v = bl->giv; v; v = v->next_iv)
4474         if (! v->maybe_dead && v->same)
4475           v->same->maybe_dead = 0;
4476
4477       /* Try to eliminate the biv, if it is a candidate.
4478          This won't work if ! all_reduced,
4479          since the givs we planned to use might not have been reduced.
4480
4481          We have to be careful that we didn't initially think we could eliminate
4482          this biv because of a giv that we now think may be dead and shouldn't
4483          be used as a biv replacement.  
4484
4485          Also, there is the possibility that we may have a giv that looks
4486          like it can be used to eliminate a biv, but the resulting insn
4487          isn't valid.  This can happen, for example, on the 88k, where a 
4488          JUMP_INSN can compare a register only with zero.  Attempts to
4489          replace it with a compare with a constant will fail.
4490
4491          Note that in cases where this call fails, we may have replaced some
4492          of the occurrences of the biv with a giv, but no harm was done in
4493          doing so in the rare cases where it can occur.  */
4494
4495       if (all_reduced == 1 && bl->eliminable
4496           && maybe_eliminate_biv (bl, loop_start, end, 1,
4497                                   threshold, insn_count))
4498
4499         {
4500           /* ?? If we created a new test to bypass the loop entirely,
4501              or otherwise drop straight in, based on this test, then
4502              we might want to rewrite it also.  This way some later
4503              pass has more hope of removing the initialization of this
4504              biv entirely.  */
4505
4506           /* If final_value != 0, then the biv may be used after loop end
4507              and we must emit an insn to set it just in case.
4508
4509              Reversed bivs already have an insn after the loop setting their
4510              value, so we don't need another one.  We can't calculate the
4511              proper final value for such a biv here anyways.  */
4512           if (final_value != 0 && ! bl->reversed)
4513             {
4514               rtx insert_before;
4515
4516               /* If the loop has multiple exits, emit the insn before the
4517                  loop to ensure that it will always be executed no matter
4518                  how the loop exits.  Otherwise, emit the insn after the
4519                  loop, since this is slightly more efficient.  */
4520               if (loop_number_exit_count[uid_loop_num[INSN_UID (loop_start)]])
4521                 insert_before = loop_start;
4522               else
4523                 insert_before = end_insert_before;
4524
4525               emit_insn_before (gen_move_insn (bl->biv->dest_reg, final_value),
4526                                 end_insert_before);
4527             }
4528
4529 #if 0
4530           /* Delete all of the instructions inside the loop which set
4531              the biv, as they are all dead.  If is safe to delete them,
4532              because an insn setting a biv will never be part of a libcall.  */
4533           /* However, deleting them will invalidate the regno_last_uid info,
4534              so keeping them around is more convenient.  Final_biv_value
4535              will only succeed when there are multiple exits if the biv
4536              is dead at each exit, hence it does not matter that the original
4537              insn remains, because it is dead anyways.  */
4538           for (v = bl->biv; v; v = v->next_iv)
4539             delete_insn (v->insn);
4540 #endif
4541
4542           if (loop_dump_stream)
4543             fprintf (loop_dump_stream, "Reg %d: biv eliminated\n",
4544                      bl->regno);
4545         }
4546     }
4547
4548   /* Go through all the instructions in the loop, making all the
4549      register substitutions scheduled in REG_MAP.  */
4550
4551   for (p = loop_start; p != end; p = NEXT_INSN (p))
4552     if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
4553         || GET_CODE (p) == CALL_INSN)
4554       {
4555         replace_regs (PATTERN (p), reg_map, max_reg_before_loop, 0);
4556         replace_regs (REG_NOTES (p), reg_map, max_reg_before_loop, 0);
4557         INSN_CODE (p) = -1;
4558       }
4559
4560   /* Unroll loops from within strength reduction so that we can use the
4561      induction variable information that strength_reduce has already
4562      collected.  */
4563   
4564   if (unroll_p)
4565     unroll_loop (loop_end, insn_count, loop_start, end_insert_before, 1);
4566
4567 #ifdef HAVE_decrement_and_branch_on_count
4568   /* Instrument the loop with BCT insn.  */
4569   if (HAVE_decrement_and_branch_on_count && bct_p
4570       && flag_branch_on_count_reg)
4571     insert_bct (loop_start, loop_end);
4572 #endif  /* HAVE_decrement_and_branch_on_count */
4573
4574   if (loop_dump_stream)
4575     fprintf (loop_dump_stream, "\n");
4576 }
4577 \f
4578 /* Return 1 if X is a valid source for an initial value (or as value being
4579    compared against in an initial test).
4580
4581    X must be either a register or constant and must not be clobbered between
4582    the current insn and the start of the loop.
4583
4584    INSN is the insn containing X.  */
4585
4586 static int
4587 valid_initial_value_p (x, insn, call_seen, loop_start)
4588      rtx x;
4589      rtx insn;
4590      int call_seen;
4591      rtx loop_start;
4592 {
4593   if (CONSTANT_P (x))
4594     return 1;
4595
4596   /* Only consider pseudos we know about initialized in insns whose luids
4597      we know.  */
4598   if (GET_CODE (x) != REG
4599       || REGNO (x) >= max_reg_before_loop)
4600     return 0;
4601
4602   /* Don't use call-clobbered registers across a call which clobbers it.  On
4603      some machines, don't use any hard registers at all.  */
4604   if (REGNO (x) < FIRST_PSEUDO_REGISTER
4605       && (SMALL_REGISTER_CLASSES
4606           || (call_used_regs[REGNO (x)] && call_seen)))
4607     return 0;
4608
4609   /* Don't use registers that have been clobbered before the start of the
4610      loop.  */
4611   if (reg_set_between_p (x, insn, loop_start))
4612     return 0;
4613
4614   return 1;
4615 }
4616 \f
4617 /* Scan X for memory refs and check each memory address
4618    as a possible giv.  INSN is the insn whose pattern X comes from.
4619    NOT_EVERY_ITERATION is 1 if the insn might not be executed during
4620    every loop iteration.  */
4621
4622 static void
4623 find_mem_givs (x, insn, not_every_iteration, loop_start, loop_end)
4624      rtx x;
4625      rtx insn;
4626      int not_every_iteration;
4627      rtx loop_start, loop_end;
4628 {
4629   register int i, j;
4630   register enum rtx_code code;
4631   register char *fmt;
4632
4633   if (x == 0)
4634     return;
4635
4636   code = GET_CODE (x);
4637   switch (code)
4638     {
4639     case REG:
4640     case CONST_INT:
4641     case CONST:
4642     case CONST_DOUBLE:
4643     case SYMBOL_REF:
4644     case LABEL_REF:
4645     case PC:
4646     case CC0:
4647     case ADDR_VEC:
4648     case ADDR_DIFF_VEC:
4649     case USE:
4650     case CLOBBER:
4651       return;
4652
4653     case MEM:
4654       {
4655         rtx src_reg;
4656         rtx add_val;
4657         rtx mult_val;
4658         int benefit;
4659
4660         /* This code used to disable creating GIVs with mult_val == 1 and
4661            add_val == 0.  However, this leads to lost optimizations when 
4662            it comes time to combine a set of related DEST_ADDR GIVs, since
4663            this one would not be seen.   */
4664
4665         if (general_induction_var (XEXP (x, 0), &src_reg, &add_val,
4666                                    &mult_val, 1, &benefit))
4667           {
4668             /* Found one; record it.  */
4669             struct induction *v
4670               = (struct induction *) oballoc (sizeof (struct induction));
4671
4672             record_giv (v, insn, src_reg, addr_placeholder, mult_val,
4673                         add_val, benefit, DEST_ADDR, not_every_iteration,
4674                         &XEXP (x, 0), loop_start, loop_end);
4675
4676             v->mem_mode = GET_MODE (x);
4677           }
4678       }
4679       return;
4680
4681     default:
4682       break;
4683     }
4684
4685   /* Recursively scan the subexpressions for other mem refs.  */
4686
4687   fmt = GET_RTX_FORMAT (code);
4688   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
4689     if (fmt[i] == 'e')
4690       find_mem_givs (XEXP (x, i), insn, not_every_iteration, loop_start,
4691                      loop_end);
4692     else if (fmt[i] == 'E')
4693       for (j = 0; j < XVECLEN (x, i); j++)
4694         find_mem_givs (XVECEXP (x, i, j), insn, not_every_iteration,
4695                        loop_start, loop_end);
4696 }
4697 \f
4698 /* Fill in the data about one biv update.
4699    V is the `struct induction' in which we record the biv.  (It is
4700    allocated by the caller, with alloca.)
4701    INSN is the insn that sets it.
4702    DEST_REG is the biv's reg.
4703
4704    MULT_VAL is const1_rtx if the biv is being incremented here, in which case
4705    INC_VAL is the increment.  Otherwise, MULT_VAL is const0_rtx and the biv is
4706    being set to INC_VAL.
4707
4708    NOT_EVERY_ITERATION is nonzero if this biv update is not know to be
4709    executed every iteration; MAYBE_MULTIPLE is nonzero if this biv update
4710    can be executed more than once per iteration.  If MAYBE_MULTIPLE
4711    and NOT_EVERY_ITERATION are both zero, we know that the biv update is
4712    executed exactly once per iteration.  */
4713
4714 static void
4715 record_biv (v, insn, dest_reg, inc_val, mult_val,
4716             not_every_iteration, maybe_multiple)
4717      struct induction *v;
4718      rtx insn;
4719      rtx dest_reg;
4720      rtx inc_val;
4721      rtx mult_val;
4722      int not_every_iteration;
4723      int maybe_multiple;
4724 {
4725   struct iv_class *bl;
4726
4727   v->insn = insn;
4728   v->src_reg = dest_reg;
4729   v->dest_reg = dest_reg;
4730   v->mult_val = mult_val;
4731   v->add_val = inc_val;
4732   v->mode = GET_MODE (dest_reg);
4733   v->always_computable = ! not_every_iteration;
4734   v->always_executed = ! not_every_iteration;
4735   v->maybe_multiple = maybe_multiple;
4736
4737   /* Add this to the reg's iv_class, creating a class
4738      if this is the first incrementation of the reg.  */
4739
4740   bl = reg_biv_class[REGNO (dest_reg)];
4741   if (bl == 0)
4742     {
4743       /* Create and initialize new iv_class.  */
4744
4745       bl = (struct iv_class *) oballoc (sizeof (struct iv_class));
4746
4747       bl->regno = REGNO (dest_reg);
4748       bl->biv = 0;
4749       bl->giv = 0;
4750       bl->biv_count = 0;
4751       bl->giv_count = 0;
4752
4753       /* Set initial value to the reg itself.  */
4754       bl->initial_value = dest_reg;
4755       /* We haven't seen the initializing insn yet */
4756       bl->init_insn = 0;
4757       bl->init_set = 0;
4758       bl->initial_test = 0;
4759       bl->incremented = 0;
4760       bl->eliminable = 0;
4761       bl->nonneg = 0;
4762       bl->reversed = 0;
4763       bl->total_benefit = 0;
4764
4765       /* Add this class to loop_iv_list.  */
4766       bl->next = loop_iv_list;
4767       loop_iv_list = bl;
4768
4769       /* Put it in the array of biv register classes.  */
4770       reg_biv_class[REGNO (dest_reg)] = bl;
4771     }
4772
4773   /* Update IV_CLASS entry for this biv.  */
4774   v->next_iv = bl->biv;
4775   bl->biv = v;
4776   bl->biv_count++;
4777   if (mult_val == const1_rtx)
4778     bl->incremented = 1;
4779
4780   if (loop_dump_stream)
4781     {
4782       fprintf (loop_dump_stream,
4783                "Insn %d: possible biv, reg %d,",
4784                INSN_UID (insn), REGNO (dest_reg));
4785       if (GET_CODE (inc_val) == CONST_INT)
4786         {
4787           fprintf (loop_dump_stream, " const =");
4788           fprintf (loop_dump_stream, HOST_WIDE_INT_PRINT_DEC, INTVAL (inc_val));
4789           fputc ('\n', loop_dump_stream);
4790         }
4791       else
4792         {
4793           fprintf (loop_dump_stream, " const = ");
4794           print_rtl (loop_dump_stream, inc_val);
4795           fprintf (loop_dump_stream, "\n");
4796         }
4797     }
4798 }
4799 \f
4800 /* Fill in the data about one giv.
4801    V is the `struct induction' in which we record the giv.  (It is
4802    allocated by the caller, with alloca.)
4803    INSN is the insn that sets it.
4804    BENEFIT estimates the savings from deleting this insn.
4805    TYPE is DEST_REG or DEST_ADDR; it says whether the giv is computed
4806    into a register or is used as a memory address.
4807
4808    SRC_REG is the biv reg which the giv is computed from.
4809    DEST_REG is the giv's reg (if the giv is stored in a reg).
4810    MULT_VAL and ADD_VAL are the coefficients used to compute the giv.
4811    LOCATION points to the place where this giv's value appears in INSN.  */
4812
4813 static void
4814 record_giv (v, insn, src_reg, dest_reg, mult_val, add_val, benefit,
4815             type, not_every_iteration, location, loop_start, loop_end)
4816      struct induction *v;
4817      rtx insn;
4818      rtx src_reg;
4819      rtx dest_reg;
4820      rtx mult_val, add_val;
4821      int benefit;
4822      enum g_types type;
4823      int not_every_iteration;
4824      rtx *location;
4825      rtx loop_start, loop_end;
4826 {
4827   struct induction *b;
4828   struct iv_class *bl;
4829   rtx set = single_set (insn);
4830
4831   v->insn = insn;
4832   v->src_reg = src_reg;
4833   v->giv_type = type;
4834   v->dest_reg = dest_reg;
4835   v->mult_val = mult_val;
4836   v->add_val = add_val;
4837   v->benefit = benefit;
4838   v->location = location;
4839   v->cant_derive = 0;
4840   v->combined_with = 0;
4841   v->maybe_multiple = 0;
4842   v->maybe_dead = 0;
4843   v->derive_adjustment = 0;
4844   v->same = 0;
4845   v->ignore = 0;
4846   v->new_reg = 0;
4847   v->final_value = 0;
4848   v->same_insn = 0;
4849   v->auto_inc_opt = 0;
4850   v->unrolled = 0;
4851   v->shared = 0;
4852
4853   /* The v->always_computable field is used in update_giv_derive, to
4854      determine whether a giv can be used to derive another giv.  For a
4855      DEST_REG giv, INSN computes a new value for the giv, so its value
4856      isn't computable if INSN insn't executed every iteration.
4857      However, for a DEST_ADDR giv, INSN merely uses the value of the giv;
4858      it does not compute a new value.  Hence the value is always computable
4859      regardless of whether INSN is executed each iteration.  */
4860
4861   if (type == DEST_ADDR)
4862     v->always_computable = 1;
4863   else
4864     v->always_computable = ! not_every_iteration;
4865
4866   v->always_executed = ! not_every_iteration;
4867
4868   if (type == DEST_ADDR)
4869     {
4870       v->mode = GET_MODE (*location);
4871       v->lifetime = 1;
4872       v->times_used = 1;
4873     }
4874   else /* type == DEST_REG */
4875     {
4876       v->mode = GET_MODE (SET_DEST (set));
4877
4878       v->lifetime = (uid_luid[REGNO_LAST_UID (REGNO (dest_reg))]
4879                      - uid_luid[REGNO_FIRST_UID (REGNO (dest_reg))]);
4880
4881       v->times_used = VARRAY_INT (n_times_used, REGNO (dest_reg));
4882
4883       /* If the lifetime is zero, it means that this register is
4884          really a dead store.  So mark this as a giv that can be
4885          ignored.  This will not prevent the biv from being eliminated.  */
4886       if (v->lifetime == 0)
4887         v->ignore = 1;
4888
4889       reg_iv_type[REGNO (dest_reg)] = GENERAL_INDUCT;
4890       reg_iv_info[REGNO (dest_reg)] = v;
4891     }
4892
4893   /* Add the giv to the class of givs computed from one biv.  */
4894
4895   bl = reg_biv_class[REGNO (src_reg)];
4896   if (bl)
4897     {
4898       v->next_iv = bl->giv;
4899       bl->giv = v;
4900       /* Don't count DEST_ADDR.  This is supposed to count the number of
4901          insns that calculate givs.  */
4902       if (type == DEST_REG)
4903         bl->giv_count++;
4904       bl->total_benefit += benefit;
4905     }
4906   else
4907     /* Fatal error, biv missing for this giv?  */
4908     abort ();
4909
4910   if (type == DEST_ADDR)
4911     v->replaceable = 1;
4912   else
4913     {
4914       /* The giv can be replaced outright by the reduced register only if all
4915          of the following conditions are true:
4916          - the insn that sets the giv is always executed on any iteration
4917            on which the giv is used at all
4918            (there are two ways to deduce this:
4919             either the insn is executed on every iteration,
4920             or all uses follow that insn in the same basic block),
4921          - the giv is not used outside the loop
4922          - no assignments to the biv occur during the giv's lifetime.  */
4923
4924       if (REGNO_FIRST_UID (REGNO (dest_reg)) == INSN_UID (insn)
4925           /* Previous line always fails if INSN was moved by loop opt.  */
4926           && uid_luid[REGNO_LAST_UID (REGNO (dest_reg))] < INSN_LUID (loop_end)
4927           && (! not_every_iteration
4928               || last_use_this_basic_block (dest_reg, insn)))
4929         {
4930           /* Now check that there are no assignments to the biv within the
4931              giv's lifetime.  This requires two separate checks.  */
4932
4933           /* Check each biv update, and fail if any are between the first
4934              and last use of the giv.
4935              
4936              If this loop contains an inner loop that was unrolled, then
4937              the insn modifying the biv may have been emitted by the loop
4938              unrolling code, and hence does not have a valid luid.  Just
4939              mark the biv as not replaceable in this case.  It is not very
4940              useful as a biv, because it is used in two different loops.
4941              It is very unlikely that we would be able to optimize the giv
4942              using this biv anyways.  */
4943
4944           v->replaceable = 1;
4945           for (b = bl->biv; b; b = b->next_iv)
4946             {
4947               if (INSN_UID (b->insn) >= max_uid_for_loop
4948                   || ((uid_luid[INSN_UID (b->insn)]
4949                        >= uid_luid[REGNO_FIRST_UID (REGNO (dest_reg))])
4950                       && (uid_luid[INSN_UID (b->insn)]
4951                           <= uid_luid[REGNO_LAST_UID (REGNO (dest_reg))])))
4952                 {
4953                   v->replaceable = 0;
4954                   v->not_replaceable = 1;
4955                   break;
4956                 }
4957             }
4958
4959           /* If there are any backwards branches that go from after the
4960              biv update to before it, then this giv is not replaceable.  */
4961           if (v->replaceable)
4962             for (b = bl->biv; b; b = b->next_iv)
4963               if (back_branch_in_range_p (b->insn, loop_start, loop_end))
4964                 {
4965                   v->replaceable = 0;
4966                   v->not_replaceable = 1;
4967                   break;
4968                 }
4969         }
4970       else
4971         {
4972           /* May still be replaceable, we don't have enough info here to
4973              decide.  */
4974           v->replaceable = 0;
4975           v->not_replaceable = 0;
4976         }
4977     }
4978
4979   /* Record whether the add_val contains a const_int, for later use by
4980      combine_givs.  */
4981   {
4982     rtx tem = add_val;
4983
4984     v->no_const_addval = 1;
4985     if (tem == const0_rtx)
4986       ;
4987     else if (GET_CODE (tem) == CONST_INT)
4988       v->no_const_addval = 0;
4989     else if (GET_CODE (tem) == PLUS)
4990       {
4991         while (1)
4992           {
4993             if (GET_CODE (XEXP (tem, 0)) == PLUS)
4994               tem = XEXP (tem, 0);
4995             else if (GET_CODE (XEXP (tem, 1)) == PLUS)
4996               tem = XEXP (tem, 1);
4997             else
4998               break;
4999           }
5000         if (GET_CODE (XEXP (tem, 1)) == CONST_INT)
5001           v->no_const_addval = 0;
5002       }
5003   }
5004
5005   if (loop_dump_stream)
5006     {
5007       if (type == DEST_REG)
5008         fprintf (loop_dump_stream, "Insn %d: giv reg %d",
5009                  INSN_UID (insn), REGNO (dest_reg));
5010       else
5011         fprintf (loop_dump_stream, "Insn %d: dest address",
5012                  INSN_UID (insn));
5013
5014       fprintf (loop_dump_stream, " src reg %d benefit %d",
5015                REGNO (src_reg), v->benefit);
5016       fprintf (loop_dump_stream, " used %d lifetime %d",
5017                v->times_used, v->lifetime);
5018
5019       if (v->replaceable)
5020         fprintf (loop_dump_stream, " replaceable");
5021
5022       if (v->no_const_addval)
5023         fprintf (loop_dump_stream, " ncav");
5024
5025       if (GET_CODE (mult_val) == CONST_INT)
5026         {
5027           fprintf (loop_dump_stream, " mult ");
5028           fprintf (loop_dump_stream, HOST_WIDE_INT_PRINT_DEC, INTVAL (mult_val));
5029         }
5030       else
5031         {
5032           fprintf (loop_dump_stream, " mult ");
5033           print_rtl (loop_dump_stream, mult_val);
5034         }
5035
5036       if (GET_CODE (add_val) == CONST_INT)
5037         {
5038           fprintf (loop_dump_stream, " add ");
5039           fprintf (loop_dump_stream, HOST_WIDE_INT_PRINT_DEC, INTVAL (add_val));
5040         }
5041       else
5042         {
5043           fprintf (loop_dump_stream, " add ");
5044           print_rtl (loop_dump_stream, add_val);
5045         }
5046     }
5047
5048   if (loop_dump_stream)
5049     fprintf (loop_dump_stream, "\n");
5050
5051 }
5052
5053
5054 /* All this does is determine whether a giv can be made replaceable because
5055    its final value can be calculated.  This code can not be part of record_giv
5056    above, because final_giv_value requires that the number of loop iterations
5057    be known, and that can not be accurately calculated until after all givs
5058    have been identified.  */
5059
5060 static void
5061 check_final_value (v, loop_start, loop_end)
5062      struct induction *v;
5063      rtx loop_start, loop_end;
5064 {
5065   struct iv_class *bl;
5066   rtx final_value = 0;
5067
5068   bl = reg_biv_class[REGNO (v->src_reg)];
5069
5070   /* DEST_ADDR givs will never reach here, because they are always marked
5071      replaceable above in record_giv.  */
5072
5073   /* The giv can be replaced outright by the reduced register only if all
5074      of the following conditions are true:
5075      - the insn that sets the giv is always executed on any iteration
5076        on which the giv is used at all
5077        (there are two ways to deduce this:
5078         either the insn is executed on every iteration,
5079         or all uses follow that insn in the same basic block),
5080      - its final value can be calculated (this condition is different
5081        than the one above in record_giv)
5082      - no assignments to the biv occur during the giv's lifetime.  */
5083
5084 #if 0
5085   /* This is only called now when replaceable is known to be false.  */
5086   /* Clear replaceable, so that it won't confuse final_giv_value.  */
5087   v->replaceable = 0;
5088 #endif
5089
5090   if ((final_value = final_giv_value (v, loop_start, loop_end))
5091       && (v->always_computable || last_use_this_basic_block (v->dest_reg, v->insn)))
5092     {
5093       int biv_increment_seen = 0;
5094       rtx p = v->insn;
5095       rtx last_giv_use;
5096
5097       v->replaceable = 1;
5098
5099       /* When trying to determine whether or not a biv increment occurs
5100          during the lifetime of the giv, we can ignore uses of the variable
5101          outside the loop because final_value is true.  Hence we can not
5102          use regno_last_uid and regno_first_uid as above in record_giv.  */
5103
5104       /* Search the loop to determine whether any assignments to the
5105          biv occur during the giv's lifetime.  Start with the insn
5106          that sets the giv, and search around the loop until we come
5107          back to that insn again.
5108
5109          Also fail if there is a jump within the giv's lifetime that jumps
5110          to somewhere outside the lifetime but still within the loop.  This
5111          catches spaghetti code where the execution order is not linear, and
5112          hence the above test fails.  Here we assume that the giv lifetime
5113          does not extend from one iteration of the loop to the next, so as
5114          to make the test easier.  Since the lifetime isn't known yet,
5115          this requires two loops.  See also record_giv above.  */
5116
5117       last_giv_use = v->insn;
5118
5119       while (1)
5120         {
5121           p = NEXT_INSN (p);
5122           if (p == loop_end)
5123             p = NEXT_INSN (loop_start);
5124           if (p == v->insn)
5125             break;
5126
5127           if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
5128               || GET_CODE (p) == CALL_INSN)
5129             {
5130               if (biv_increment_seen)
5131                 {
5132                   if (reg_mentioned_p (v->dest_reg, PATTERN (p)))
5133                     {
5134                       v->replaceable = 0;
5135                       v->not_replaceable = 1;
5136                       break;
5137                     }
5138                 }
5139               else if (reg_set_p (v->src_reg, PATTERN (p)))
5140                 biv_increment_seen = 1;
5141               else if (reg_mentioned_p (v->dest_reg, PATTERN (p)))
5142                 last_giv_use = p;
5143             }
5144         }
5145       
5146       /* Now that the lifetime of the giv is known, check for branches
5147          from within the lifetime to outside the lifetime if it is still
5148          replaceable.  */
5149
5150       if (v->replaceable)
5151         {
5152           p = v->insn;
5153           while (1)
5154             {
5155               p = NEXT_INSN (p);
5156               if (p == loop_end)
5157                 p = NEXT_INSN (loop_start);
5158               if (p == last_giv_use)
5159                 break;
5160
5161               if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p)
5162                   && LABEL_NAME (JUMP_LABEL (p))
5163                   && ((INSN_UID (JUMP_LABEL (p)) >= max_uid_for_loop)
5164                       || (INSN_UID (v->insn) >= max_uid_for_loop)
5165                       || (INSN_UID (last_giv_use) >= max_uid_for_loop)
5166                       || (INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (v->insn)
5167                           && INSN_LUID (JUMP_LABEL (p)) > INSN_LUID (loop_start))
5168                       || (INSN_LUID (JUMP_LABEL (p)) > INSN_LUID (last_giv_use)
5169                           && INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (loop_end))))
5170                 {
5171                   v->replaceable = 0;
5172                   v->not_replaceable = 1;
5173
5174                   if (loop_dump_stream)
5175                     fprintf (loop_dump_stream,
5176                              "Found branch outside giv lifetime.\n");
5177
5178                   break;
5179                 }
5180             }
5181         }
5182
5183       /* If it is replaceable, then save the final value.  */
5184       if (v->replaceable)
5185         v->final_value = final_value;
5186     }
5187
5188   if (loop_dump_stream && v->replaceable)
5189     fprintf (loop_dump_stream, "Insn %d: giv reg %d final_value replaceable\n",
5190              INSN_UID (v->insn), REGNO (v->dest_reg));
5191 }
5192 \f
5193 /* Update the status of whether a giv can derive other givs.
5194
5195    We need to do something special if there is or may be an update to the biv
5196    between the time the giv is defined and the time it is used to derive
5197    another giv.
5198
5199    In addition, a giv that is only conditionally set is not allowed to
5200    derive another giv once a label has been passed.
5201
5202    The cases we look at are when a label or an update to a biv is passed.  */
5203
5204 static void
5205 update_giv_derive (p)
5206      rtx p;
5207 {
5208   struct iv_class *bl;
5209   struct induction *biv, *giv;
5210   rtx tem;
5211   int dummy;
5212
5213   /* Search all IV classes, then all bivs, and finally all givs.
5214
5215      There are three cases we are concerned with.  First we have the situation
5216      of a giv that is only updated conditionally.  In that case, it may not
5217      derive any givs after a label is passed.
5218
5219      The second case is when a biv update occurs, or may occur, after the
5220      definition of a giv.  For certain biv updates (see below) that are
5221      known to occur between the giv definition and use, we can adjust the
5222      giv definition.  For others, or when the biv update is conditional,
5223      we must prevent the giv from deriving any other givs.  There are two
5224      sub-cases within this case.
5225
5226      If this is a label, we are concerned with any biv update that is done
5227      conditionally, since it may be done after the giv is defined followed by
5228      a branch here (actually, we need to pass both a jump and a label, but
5229      this extra tracking doesn't seem worth it).
5230
5231      If this is a jump, we are concerned about any biv update that may be
5232      executed multiple times.  We are actually only concerned about
5233      backward jumps, but it is probably not worth performing the test
5234      on the jump again here.
5235
5236      If this is a biv update, we must adjust the giv status to show that a
5237      subsequent biv update was performed.  If this adjustment cannot be done,
5238      the giv cannot derive further givs.  */
5239
5240   for (bl = loop_iv_list; bl; bl = bl->next)
5241     for (biv = bl->biv; biv; biv = biv->next_iv)
5242       if (GET_CODE (p) == CODE_LABEL || GET_CODE (p) == JUMP_INSN
5243           || biv->insn == p)
5244         {
5245           for (giv = bl->giv; giv; giv = giv->next_iv)
5246             {
5247               /* If cant_derive is already true, there is no point in
5248                  checking all of these conditions again.  */
5249               if (giv->cant_derive)
5250                 continue;
5251
5252               /* If this giv is conditionally set and we have passed a label,
5253                  it cannot derive anything.  */
5254               if (GET_CODE (p) == CODE_LABEL && ! giv->always_computable)
5255                 giv->cant_derive = 1;
5256
5257               /* Skip givs that have mult_val == 0, since
5258                  they are really invariants.  Also skip those that are
5259                  replaceable, since we know their lifetime doesn't contain
5260                  any biv update.  */
5261               else if (giv->mult_val == const0_rtx || giv->replaceable)
5262                 continue;
5263
5264               /* The only way we can allow this giv to derive another
5265                  is if this is a biv increment and we can form the product
5266                  of biv->add_val and giv->mult_val.  In this case, we will
5267                  be able to compute a compensation.  */
5268               else if (biv->insn == p)
5269                 {
5270                   tem = 0;
5271
5272                   if (biv->mult_val == const1_rtx)
5273                     tem = simplify_giv_expr (gen_rtx_MULT (giv->mode,
5274                                                            biv->add_val,
5275                                                            giv->mult_val),
5276                                              &dummy);
5277
5278                   if (tem && giv->derive_adjustment)
5279                     tem = simplify_giv_expr (gen_rtx_PLUS (giv->mode, tem,
5280                                                            giv->derive_adjustment),
5281                                              &dummy);
5282                   if (tem)
5283                     giv->derive_adjustment = tem;
5284                   else
5285                     giv->cant_derive = 1;
5286                 }
5287               else if ((GET_CODE (p) == CODE_LABEL && ! biv->always_computable)
5288                        || (GET_CODE (p) == JUMP_INSN && biv->maybe_multiple))
5289                 giv->cant_derive = 1;
5290             }
5291         }
5292 }
5293 \f
5294 /* Check whether an insn is an increment legitimate for a basic induction var.
5295    X is the source of insn P, or a part of it.
5296    MODE is the mode in which X should be interpreted.
5297
5298    DEST_REG is the putative biv, also the destination of the insn.
5299    We accept patterns of these forms:
5300      REG = REG + INVARIANT (includes REG = REG - CONSTANT)
5301      REG = INVARIANT + REG
5302
5303    If X is suitable, we return 1, set *MULT_VAL to CONST1_RTX,
5304    and store the additive term into *INC_VAL.
5305
5306    If X is an assignment of an invariant into DEST_REG, we set
5307    *MULT_VAL to CONST0_RTX, and store the invariant into *INC_VAL.
5308
5309    We also want to detect a BIV when it corresponds to a variable
5310    whose mode was promoted via PROMOTED_MODE.  In that case, an increment
5311    of the variable may be a PLUS that adds a SUBREG of that variable to
5312    an invariant and then sign- or zero-extends the result of the PLUS
5313    into the variable.
5314
5315    Most GIVs in such cases will be in the promoted mode, since that is the
5316    probably the natural computation mode (and almost certainly the mode
5317    used for addresses) on the machine.  So we view the pseudo-reg containing
5318    the variable as the BIV, as if it were simply incremented.
5319
5320    Note that treating the entire pseudo as a BIV will result in making
5321    simple increments to any GIVs based on it.  However, if the variable
5322    overflows in its declared mode but not its promoted mode, the result will
5323    be incorrect.  This is acceptable if the variable is signed, since 
5324    overflows in such cases are undefined, but not if it is unsigned, since
5325    those overflows are defined.  So we only check for SIGN_EXTEND and
5326    not ZERO_EXTEND.
5327
5328    If we cannot find a biv, we return 0.  */
5329
5330 static int
5331 basic_induction_var (x, mode, dest_reg, p, inc_val, mult_val)
5332      register rtx x;
5333      enum machine_mode mode;
5334      rtx p;
5335      rtx dest_reg;
5336      rtx *inc_val;
5337      rtx *mult_val;
5338 {
5339   register enum rtx_code code;
5340   rtx arg;
5341   rtx insn, set = 0;
5342
5343   code = GET_CODE (x);
5344   switch (code)
5345     {
5346     case PLUS:
5347       if (rtx_equal_p (XEXP (x, 0), dest_reg)
5348           || (GET_CODE (XEXP (x, 0)) == SUBREG
5349               && SUBREG_PROMOTED_VAR_P (XEXP (x, 0))
5350               && SUBREG_REG (XEXP (x, 0)) == dest_reg))
5351         arg = XEXP (x, 1);
5352       else if (rtx_equal_p (XEXP (x, 1), dest_reg)
5353                || (GET_CODE (XEXP (x, 1)) == SUBREG
5354                    && SUBREG_PROMOTED_VAR_P (XEXP (x, 1))
5355                    && SUBREG_REG (XEXP (x, 1)) == dest_reg))
5356         arg = XEXP (x, 0);
5357       else
5358         return 0;
5359
5360       if (invariant_p (arg) != 1)
5361         return 0;
5362
5363       *inc_val = convert_modes (GET_MODE (dest_reg), GET_MODE (x), arg, 0);
5364       *mult_val = const1_rtx;
5365       return 1;
5366
5367     case SUBREG:
5368       /* If this is a SUBREG for a promoted variable, check the inner
5369          value.  */
5370       if (SUBREG_PROMOTED_VAR_P (x))
5371         return basic_induction_var (SUBREG_REG (x), GET_MODE (SUBREG_REG (x)),
5372                                     dest_reg, p, inc_val, mult_val);
5373       return 0;
5374
5375     case REG:
5376       /* If this register is assigned in a previous insn, look at its
5377          source, but don't go outside the loop or past a label.  */
5378
5379       insn = p;
5380       while (1)
5381         {
5382           do {
5383             insn = PREV_INSN (insn);
5384           } while (insn && GET_CODE (insn) == NOTE
5385                    && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG);
5386
5387           if (!insn)
5388             break;
5389           set = single_set (insn);
5390           if (set == 0)
5391             break;
5392
5393           if ((SET_DEST (set) == x
5394                || (GET_CODE (SET_DEST (set)) == SUBREG
5395                    && (GET_MODE_SIZE (GET_MODE (SET_DEST (set)))
5396                        <= UNITS_PER_WORD)
5397                    && SUBREG_REG (SET_DEST (set)) == x))
5398               && basic_induction_var (SET_SRC (set),
5399                                       (GET_MODE (SET_SRC (set)) == VOIDmode
5400                                        ? GET_MODE (x)
5401                                        : GET_MODE (SET_SRC (set))),
5402                                       dest_reg, insn,
5403                                       inc_val, mult_val))
5404             return 1;
5405         }
5406       /* ... fall through ...  */
5407
5408       /* Can accept constant setting of biv only when inside inner most loop.
5409          Otherwise, a biv of an inner loop may be incorrectly recognized
5410          as a biv of the outer loop,
5411          causing code to be moved INTO the inner loop.  */
5412     case MEM:
5413       if (invariant_p (x) != 1)
5414         return 0;
5415     case CONST_INT:
5416     case SYMBOL_REF:
5417     case CONST:
5418       /* convert_modes aborts if we try to convert to or from CCmode, so just
5419          exclude that case.  It is very unlikely that a condition code value
5420          would be a useful iterator anyways.  */
5421       if (loops_enclosed == 1
5422           && GET_MODE_CLASS (mode) != MODE_CC
5423           && GET_MODE_CLASS (GET_MODE (dest_reg)) != MODE_CC)
5424         {
5425           /* Possible bug here?  Perhaps we don't know the mode of X.  */
5426           *inc_val = convert_modes (GET_MODE (dest_reg), mode, x, 0);
5427           *mult_val = const0_rtx;
5428           return 1;
5429         }
5430       else
5431         return 0;
5432
5433     case SIGN_EXTEND:
5434       return basic_induction_var (XEXP (x, 0), GET_MODE (XEXP (x, 0)),
5435                                   dest_reg, p, inc_val, mult_val);
5436
5437     case ASHIFTRT:
5438       /* Similar, since this can be a sign extension.  */
5439       for (insn = PREV_INSN (p);
5440            (insn && GET_CODE (insn) == NOTE
5441             && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG);
5442            insn = PREV_INSN (insn))
5443         ;
5444
5445       if (insn)
5446         set = single_set (insn);
5447
5448       if (set && SET_DEST (set) == XEXP (x, 0)
5449           && GET_CODE (XEXP (x, 1)) == CONST_INT
5450           && INTVAL (XEXP (x, 1)) >= 0
5451           && GET_CODE (SET_SRC (set)) == ASHIFT
5452           && XEXP (x, 1) == XEXP (SET_SRC (set), 1))
5453         return basic_induction_var (XEXP (SET_SRC (set), 0),
5454                                     GET_MODE (XEXP (x, 0)),
5455                                     dest_reg, insn, inc_val, mult_val);
5456       return 0;
5457
5458     default:
5459       return 0;
5460     }
5461 }
5462 \f
5463 /* A general induction variable (giv) is any quantity that is a linear
5464    function   of a basic induction variable,
5465    i.e. giv = biv * mult_val + add_val.
5466    The coefficients can be any loop invariant quantity.
5467    A giv need not be computed directly from the biv;
5468    it can be computed by way of other givs.  */
5469
5470 /* Determine whether X computes a giv.
5471    If it does, return a nonzero value
5472      which is the benefit from eliminating the computation of X;
5473    set *SRC_REG to the register of the biv that it is computed from;
5474    set *ADD_VAL and *MULT_VAL to the coefficients,
5475      such that the value of X is biv * mult + add;  */
5476
5477 static int
5478 general_induction_var (x, src_reg, add_val, mult_val, is_addr, pbenefit)
5479      rtx x;
5480      rtx *src_reg;
5481      rtx *add_val;
5482      rtx *mult_val;
5483      int is_addr;
5484      int *pbenefit;
5485 {
5486   rtx orig_x = x;
5487   char *storage;
5488
5489   /* If this is an invariant, forget it, it isn't a giv.  */
5490   if (invariant_p (x) == 1)
5491     return 0;
5492
5493   /* See if the expression could be a giv and get its form.
5494      Mark our place on the obstack in case we don't find a giv.  */
5495   storage = (char *) oballoc (0);
5496   *pbenefit = 0;
5497   x = simplify_giv_expr (x, pbenefit);
5498   if (x == 0)
5499     {
5500       obfree (storage);
5501       return 0;
5502     }
5503
5504   switch (GET_CODE (x))
5505     {
5506     case USE:
5507     case CONST_INT:
5508       /* Since this is now an invariant and wasn't before, it must be a giv
5509          with MULT_VAL == 0.  It doesn't matter which BIV we associate this
5510          with.  */
5511       *src_reg = loop_iv_list->biv->dest_reg;
5512       *mult_val = const0_rtx;
5513       *add_val = x;
5514       break;
5515
5516     case REG:
5517       /* This is equivalent to a BIV.  */
5518       *src_reg = x;
5519       *mult_val = const1_rtx;
5520       *add_val = const0_rtx;
5521       break;
5522
5523     case PLUS:
5524       /* Either (plus (biv) (invar)) or
5525          (plus (mult (biv) (invar_1)) (invar_2)).  */
5526       if (GET_CODE (XEXP (x, 0)) == MULT)
5527         {
5528           *src_reg = XEXP (XEXP (x, 0), 0);
5529           *mult_val = XEXP (XEXP (x, 0), 1);
5530         }
5531       else
5532         {
5533           *src_reg = XEXP (x, 0);
5534           *mult_val = const1_rtx;
5535         }
5536       *add_val = XEXP (x, 1);
5537       break;
5538
5539     case MULT:
5540       /* ADD_VAL is zero.  */
5541       *src_reg = XEXP (x, 0);
5542       *mult_val = XEXP (x, 1);
5543       *add_val = const0_rtx;
5544       break;
5545
5546     default:
5547       abort ();
5548     }
5549
5550   /* Remove any enclosing USE from ADD_VAL and MULT_VAL (there will be
5551      unless they are CONST_INT).  */
5552   if (GET_CODE (*add_val) == USE)
5553     *add_val = XEXP (*add_val, 0);
5554   if (GET_CODE (*mult_val) == USE)
5555     *mult_val = XEXP (*mult_val, 0);
5556
5557   if (is_addr)
5558     {
5559 #ifdef ADDRESS_COST
5560       *pbenefit += ADDRESS_COST (orig_x) - reg_address_cost;
5561 #else
5562       *pbenefit += rtx_cost (orig_x, MEM) - reg_address_cost;
5563 #endif
5564     }
5565   else
5566     *pbenefit += rtx_cost (orig_x, SET);
5567
5568   /* Always return true if this is a giv so it will be detected as such,
5569      even if the benefit is zero or negative.  This allows elimination  
5570      of bivs that might otherwise not be eliminated.  */                
5571   return 1;                                                             
5572 }
5573 \f
5574 /* Given an expression, X, try to form it as a linear function of a biv.
5575    We will canonicalize it to be of the form
5576         (plus (mult (BIV) (invar_1))
5577               (invar_2))
5578    with possible degeneracies.
5579
5580    The invariant expressions must each be of a form that can be used as a
5581    machine operand.  We surround then with a USE rtx (a hack, but localized
5582    and certainly unambiguous!) if not a CONST_INT for simplicity in this
5583    routine; it is the caller's responsibility to strip them.
5584
5585    If no such canonicalization is possible (i.e., two biv's are used or an
5586    expression that is neither invariant nor a biv or giv), this routine
5587    returns 0.
5588
5589    For a non-zero return, the result will have a code of CONST_INT, USE,
5590    REG (for a BIV), PLUS, or MULT.  No other codes will occur.  
5591
5592    *BENEFIT will be incremented by the benefit of any sub-giv encountered.  */
5593
5594 static rtx sge_plus PROTO ((enum machine_mode, rtx, rtx));
5595 static rtx sge_plus_constant PROTO ((rtx, rtx));
5596
5597 static rtx
5598 simplify_giv_expr (x, benefit)
5599      rtx x;
5600      int *benefit;
5601 {
5602   enum machine_mode mode = GET_MODE (x);
5603   rtx arg0, arg1;
5604   rtx tem;
5605
5606   /* If this is not an integer mode, or if we cannot do arithmetic in this
5607      mode, this can't be a giv.  */
5608   if (mode != VOIDmode
5609       && (GET_MODE_CLASS (mode) != MODE_INT
5610           || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT))
5611     return NULL_RTX;
5612
5613   switch (GET_CODE (x))
5614     {
5615     case PLUS:
5616       arg0 = simplify_giv_expr (XEXP (x, 0), benefit);
5617       arg1 = simplify_giv_expr (XEXP (x, 1), benefit);
5618       if (arg0 == 0 || arg1 == 0)
5619         return NULL_RTX;
5620
5621       /* Put constant last, CONST_INT last if both constant.  */
5622       if ((GET_CODE (arg0) == USE
5623            || GET_CODE (arg0) == CONST_INT)
5624           && ! ((GET_CODE (arg0) == USE
5625                  && GET_CODE (arg1) == USE)
5626                 || GET_CODE (arg1) == CONST_INT))
5627         tem = arg0, arg0 = arg1, arg1 = tem;
5628
5629       /* Handle addition of zero, then addition of an invariant.  */
5630       if (arg1 == const0_rtx)
5631         return arg0;
5632       else if (GET_CODE (arg1) == CONST_INT || GET_CODE (arg1) == USE)
5633         switch (GET_CODE (arg0))
5634           {
5635           case CONST_INT:
5636           case USE:
5637             /* Adding two invariants must result in an invariant, so enclose
5638                addition operation inside a USE and return it.  */
5639             if (GET_CODE (arg0) == USE)
5640               arg0 = XEXP (arg0, 0);
5641             if (GET_CODE (arg1) == USE)
5642               arg1 = XEXP (arg1, 0);
5643
5644             if (GET_CODE (arg0) == CONST_INT)
5645               tem = arg0, arg0 = arg1, arg1 = tem;
5646             if (GET_CODE (arg1) == CONST_INT)
5647               tem = sge_plus_constant (arg0, arg1);
5648             else
5649               tem = sge_plus (mode, arg0, arg1);
5650
5651             if (GET_CODE (tem) != CONST_INT)
5652               tem = gen_rtx_USE (mode, tem);
5653             return tem;
5654
5655           case REG:
5656           case MULT:
5657             /* biv + invar or mult + invar.  Return sum.  */
5658             return gen_rtx_PLUS (mode, arg0, arg1);
5659
5660           case PLUS:
5661             /* (a + invar_1) + invar_2.  Associate.  */
5662             return simplify_giv_expr (
5663                 gen_rtx_PLUS (mode, XEXP (arg0, 0),
5664                               gen_rtx_PLUS (mode, XEXP (arg0, 1), arg1)),
5665                 benefit);
5666
5667           default:
5668             abort ();
5669           }
5670
5671       /* Each argument must be either REG, PLUS, or MULT.  Convert REG to
5672          MULT to reduce cases.  */
5673       if (GET_CODE (arg0) == REG)
5674         arg0 = gen_rtx_MULT (mode, arg0, const1_rtx);
5675       if (GET_CODE (arg1) == REG)
5676         arg1 = gen_rtx_MULT (mode, arg1, const1_rtx);
5677
5678       /* Now have PLUS + PLUS, PLUS + MULT, MULT + PLUS, or MULT + MULT.
5679          Put a MULT first, leaving PLUS + PLUS, MULT + PLUS, or MULT + MULT.
5680          Recurse to associate the second PLUS.  */
5681       if (GET_CODE (arg1) == MULT)
5682         tem = arg0, arg0 = arg1, arg1 = tem;
5683
5684       if (GET_CODE (arg1) == PLUS)
5685           return simplify_giv_expr (gen_rtx_PLUS (mode,
5686                                                   gen_rtx_PLUS (mode, arg0,
5687                                                                 XEXP (arg1, 0)),
5688                                                   XEXP (arg1, 1)),
5689                                     benefit);
5690
5691       /* Now must have MULT + MULT.  Distribute if same biv, else not giv.  */
5692       if (GET_CODE (arg0) != MULT || GET_CODE (arg1) != MULT)
5693         return NULL_RTX;
5694
5695       if (!rtx_equal_p (arg0, arg1))
5696         return NULL_RTX;
5697
5698       return simplify_giv_expr (gen_rtx_MULT (mode,
5699                                               XEXP (arg0, 0),
5700                                               gen_rtx_PLUS (mode,
5701                                                             XEXP (arg0, 1),
5702                                                             XEXP (arg1, 1))),
5703                                 benefit);
5704
5705     case MINUS:
5706       /* Handle "a - b" as "a + b * (-1)".  */
5707       return simplify_giv_expr (gen_rtx_PLUS (mode,
5708                                               XEXP (x, 0),
5709                                               gen_rtx_MULT (mode, XEXP (x, 1),
5710                                                             constm1_rtx)),
5711                                 benefit);
5712
5713     case MULT:
5714       arg0 = simplify_giv_expr (XEXP (x, 0), benefit);
5715       arg1 = simplify_giv_expr (XEXP (x, 1), benefit);
5716       if (arg0 == 0 || arg1 == 0)
5717         return NULL_RTX;
5718
5719       /* Put constant last, CONST_INT last if both constant.  */
5720       if ((GET_CODE (arg0) == USE || GET_CODE (arg0) == CONST_INT)
5721           && GET_CODE (arg1) != CONST_INT)
5722         tem = arg0, arg0 = arg1, arg1 = tem;
5723
5724       /* If second argument is not now constant, not giv.  */
5725       if (GET_CODE (arg1) != USE && GET_CODE (arg1) != CONST_INT)
5726         return NULL_RTX;
5727
5728       /* Handle multiply by 0 or 1.  */
5729       if (arg1 == const0_rtx)
5730         return const0_rtx;
5731
5732       else if (arg1 == const1_rtx)
5733         return arg0;
5734
5735       switch (GET_CODE (arg0))
5736         {
5737         case REG:
5738           /* biv * invar.  Done.  */
5739           return gen_rtx_MULT (mode, arg0, arg1);
5740
5741         case CONST_INT:
5742           /* Product of two constants.  */
5743           return GEN_INT (INTVAL (arg0) * INTVAL (arg1));
5744
5745         case USE:
5746           /* invar * invar.  It is a giv, but very few of these will 
5747              actually pay off, so limit to simple registers.  */
5748           if (GET_CODE (arg1) != CONST_INT)
5749             return NULL_RTX;
5750
5751           arg0 = XEXP (arg0, 0);
5752           if (GET_CODE (arg0) == REG)
5753             tem = gen_rtx_MULT (mode, arg0, arg1);
5754           else if (GET_CODE (arg0) == MULT
5755                    && GET_CODE (XEXP (arg0, 0)) == REG
5756                    && GET_CODE (XEXP (arg0, 1)) == CONST_INT)
5757             {
5758               tem = gen_rtx_MULT (mode, XEXP (arg0, 0), 
5759                                   GEN_INT (INTVAL (XEXP (arg0, 1))
5760                                            * INTVAL (arg1)));
5761             }
5762           else
5763             return NULL_RTX;
5764           return gen_rtx_USE (mode, tem);
5765
5766         case MULT:
5767           /* (a * invar_1) * invar_2.  Associate.  */
5768           return simplify_giv_expr (gen_rtx_MULT (mode, XEXP (arg0, 0),
5769                                                   gen_rtx_MULT (mode,
5770                                                                 XEXP (arg0, 1),
5771                                                                 arg1)),
5772                                     benefit);
5773
5774         case PLUS:
5775           /* (a + invar_1) * invar_2.  Distribute.  */
5776           return simplify_giv_expr (gen_rtx_PLUS (mode,
5777                                                   gen_rtx_MULT (mode,
5778                                                                 XEXP (arg0, 0),
5779                                                                 arg1),
5780                                                   gen_rtx_MULT (mode,
5781                                                                 XEXP (arg0, 1),
5782                                                                 arg1)),
5783                                     benefit);
5784
5785         default:
5786           abort ();
5787         }
5788
5789     case ASHIFT:
5790       /* Shift by constant is multiply by power of two.  */
5791       if (GET_CODE (XEXP (x, 1)) != CONST_INT)
5792         return 0;
5793
5794       return simplify_giv_expr (gen_rtx_MULT (mode,
5795                                               XEXP (x, 0),
5796                                               GEN_INT ((HOST_WIDE_INT) 1
5797                                                        << INTVAL (XEXP (x, 1)))),
5798                                 benefit);
5799
5800     case NEG:
5801       /* "-a" is "a * (-1)" */
5802       return simplify_giv_expr (gen_rtx_MULT (mode, XEXP (x, 0), constm1_rtx),
5803                                 benefit);
5804
5805     case NOT:
5806       /* "~a" is "-a - 1". Silly, but easy.  */
5807       return simplify_giv_expr (gen_rtx_MINUS (mode,
5808                                                gen_rtx_NEG (mode, XEXP (x, 0)),
5809                                                const1_rtx),
5810                                 benefit);
5811
5812     case USE:
5813       /* Already in proper form for invariant.  */
5814       return x;
5815
5816     case REG:
5817       /* If this is a new register, we can't deal with it.  */
5818       if (REGNO (x) >= max_reg_before_loop)
5819         return 0;
5820
5821       /* Check for biv or giv.  */
5822       switch (reg_iv_type[REGNO (x)])
5823         {
5824         case BASIC_INDUCT:
5825           return x;
5826         case GENERAL_INDUCT:
5827           {
5828             struct induction *v = reg_iv_info[REGNO (x)];
5829
5830             /* Form expression from giv and add benefit.  Ensure this giv
5831                can derive another and subtract any needed adjustment if so.  */
5832             *benefit += v->benefit;
5833             if (v->cant_derive)
5834               return 0;
5835
5836             tem = gen_rtx_PLUS (mode, gen_rtx_MULT (mode, v->src_reg,
5837                                                     v->mult_val),
5838                            v->add_val);
5839             if (v->derive_adjustment)
5840               tem = gen_rtx_MINUS (mode, tem, v->derive_adjustment);
5841             return simplify_giv_expr (tem, benefit);
5842           }
5843
5844         default:
5845           /* If it isn't an induction variable, and it is invariant, we
5846              may be able to simplify things further by looking through
5847              the bits we just moved outside the loop.  */
5848           if (invariant_p (x) == 1)
5849             {
5850               struct movable *m;
5851
5852               for (m = the_movables; m ; m = m->next)
5853                 if (rtx_equal_p (x, m->set_dest))
5854                   {
5855                     /* Ok, we found a match.  Substitute and simplify.  */
5856
5857                     /* If we match another movable, we must use that, as 
5858                        this one is going away.  */
5859                     if (m->match)
5860                       return simplify_giv_expr (m->match->set_dest, benefit);
5861
5862                     /* If consec is non-zero, this is a member of a group of
5863                        instructions that were moved together.  We handle this
5864                        case only to the point of seeking to the last insn and
5865                        looking for a REG_EQUAL.  Fail if we don't find one.  */
5866                     if (m->consec != 0)
5867                       {
5868                         int i = m->consec;
5869                         tem = m->insn;
5870                         do { tem = NEXT_INSN (tem); } while (--i > 0);
5871
5872                         tem = find_reg_note (tem, REG_EQUAL, NULL_RTX);
5873                         if (tem)
5874                           tem = XEXP (tem, 0);
5875                       }
5876                     else
5877                       {
5878                         tem = single_set (m->insn);
5879                         if (tem)
5880                           tem = SET_SRC (tem);
5881                       }
5882
5883                     if (tem)
5884                       {
5885                         /* What we are most interested in is pointer
5886                            arithmetic on invariants -- only take
5887                            patterns we may be able to do something with.  */
5888                         if (GET_CODE (tem) == PLUS
5889                             || GET_CODE (tem) == MULT
5890                             || GET_CODE (tem) == ASHIFT
5891                             || GET_CODE (tem) == CONST_INT
5892                             || GET_CODE (tem) == SYMBOL_REF)
5893                           {
5894                             tem = simplify_giv_expr (tem, benefit);
5895                             if (tem)
5896                               return tem;
5897                           }
5898                         else if (GET_CODE (tem) == CONST
5899                             && GET_CODE (XEXP (tem, 0)) == PLUS
5900                             && GET_CODE (XEXP (XEXP (tem, 0), 0)) == SYMBOL_REF
5901                             && GET_CODE (XEXP (XEXP (tem, 0), 1)) == CONST_INT)
5902                           {
5903                             tem = simplify_giv_expr (XEXP (tem, 0), benefit);
5904                             if (tem)
5905                               return tem;
5906                           }
5907                       }
5908                     break;
5909                   }
5910             }
5911           break;
5912         }
5913
5914       /* Fall through to general case.  */
5915     default:
5916       /* If invariant, return as USE (unless CONST_INT).
5917          Otherwise, not giv.  */
5918       if (GET_CODE (x) == USE)
5919         x = XEXP (x, 0);
5920
5921       if (invariant_p (x) == 1)
5922         {
5923           if (GET_CODE (x) == CONST_INT)
5924             return x;
5925           if (GET_CODE (x) == CONST
5926               && GET_CODE (XEXP (x, 0)) == PLUS
5927               && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
5928               && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)
5929             x = XEXP (x, 0);
5930           return gen_rtx_USE (mode, x);
5931         }
5932       else
5933         return 0;
5934     }
5935 }
5936
5937 /* This routine folds invariants such that there is only ever one
5938    CONST_INT in the summation.  It is only used by simplify_giv_expr.  */
5939
5940 static rtx
5941 sge_plus_constant (x, c)
5942      rtx x, c;
5943 {
5944   if (GET_CODE (x) == CONST_INT)
5945     return GEN_INT (INTVAL (x) + INTVAL (c));
5946   else if (GET_CODE (x) != PLUS)
5947     return gen_rtx_PLUS (GET_MODE (x), x, c);
5948   else if (GET_CODE (XEXP (x, 1)) == CONST_INT)
5949     {
5950       return gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
5951                            GEN_INT (INTVAL (XEXP (x, 1)) + INTVAL (c)));
5952     }
5953   else if (GET_CODE (XEXP (x, 0)) == PLUS
5954            || GET_CODE (XEXP (x, 1)) != PLUS)
5955     {
5956       return gen_rtx_PLUS (GET_MODE (x),
5957                            sge_plus_constant (XEXP (x, 0), c), XEXP (x, 1));
5958     }
5959   else
5960     {
5961       return gen_rtx_PLUS (GET_MODE (x),
5962                            sge_plus_constant (XEXP (x, 1), c), XEXP (x, 0));
5963     }
5964 }
5965
5966 static rtx
5967 sge_plus (mode, x, y)
5968      enum machine_mode mode;
5969      rtx x, y;
5970 {
5971   while (GET_CODE (y) == PLUS)
5972     {
5973       rtx a = XEXP (y, 0);
5974       if (GET_CODE (a) == CONST_INT)
5975         x = sge_plus_constant (x, a);
5976       else
5977         x = gen_rtx_PLUS (mode, x, a);
5978       y = XEXP (y, 1);
5979     }
5980   if (GET_CODE (y) == CONST_INT)
5981     x = sge_plus_constant (x, y);
5982   else
5983     x = gen_rtx_PLUS (mode, x, y);
5984   return x;
5985 }
5986 \f
5987 /* Help detect a giv that is calculated by several consecutive insns;
5988    for example,
5989       giv = biv * M
5990       giv = giv + A
5991    The caller has already identified the first insn P as having a giv as dest;
5992    we check that all other insns that set the same register follow
5993    immediately after P, that they alter nothing else,
5994    and that the result of the last is still a giv.
5995
5996    The value is 0 if the reg set in P is not really a giv.
5997    Otherwise, the value is the amount gained by eliminating
5998    all the consecutive insns that compute the value.
5999
6000    FIRST_BENEFIT is the amount gained by eliminating the first insn, P.
6001    SRC_REG is the reg of the biv; DEST_REG is the reg of the giv.
6002
6003    The coefficients of the ultimate giv value are stored in
6004    *MULT_VAL and *ADD_VAL.  */
6005
6006 static int
6007 consec_sets_giv (first_benefit, p, src_reg, dest_reg,
6008                  add_val, mult_val)
6009      int first_benefit;
6010      rtx p;
6011      rtx src_reg;
6012      rtx dest_reg;
6013      rtx *add_val;
6014      rtx *mult_val;
6015 {
6016   int count;
6017   enum rtx_code code;
6018   int benefit;
6019   rtx temp;
6020   rtx set;
6021
6022   /* Indicate that this is a giv so that we can update the value produced in
6023      each insn of the multi-insn sequence. 
6024
6025      This induction structure will be used only by the call to
6026      general_induction_var below, so we can allocate it on our stack.
6027      If this is a giv, our caller will replace the induct var entry with
6028      a new induction structure.  */
6029   struct induction *v
6030     = (struct induction *) alloca (sizeof (struct induction));
6031   v->src_reg = src_reg;
6032   v->mult_val = *mult_val;
6033   v->add_val = *add_val;
6034   v->benefit = first_benefit;
6035   v->cant_derive = 0;
6036   v->derive_adjustment = 0;
6037
6038   reg_iv_type[REGNO (dest_reg)] = GENERAL_INDUCT;
6039   reg_iv_info[REGNO (dest_reg)] = v;
6040
6041   count = VARRAY_INT (n_times_set, REGNO (dest_reg)) - 1;
6042
6043   while (count > 0)
6044     {
6045       p = NEXT_INSN (p);
6046       code = GET_CODE (p);
6047
6048       /* If libcall, skip to end of call sequence.  */
6049       if (code == INSN && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
6050         p = XEXP (temp, 0);
6051
6052       if (code == INSN
6053           && (set = single_set (p))
6054           && GET_CODE (SET_DEST (set)) == REG
6055           && SET_DEST (set) == dest_reg
6056           && (general_induction_var (SET_SRC (set), &src_reg,
6057                                      add_val, mult_val, 0, &benefit)
6058               /* Giv created by equivalent expression.  */
6059               || ((temp = find_reg_note (p, REG_EQUAL, NULL_RTX))
6060                   && general_induction_var (XEXP (temp, 0), &src_reg,
6061                                             add_val, mult_val, 0, &benefit)))
6062           && src_reg == v->src_reg)
6063         {
6064           if (find_reg_note (p, REG_RETVAL, NULL_RTX))
6065             benefit += libcall_benefit (p);
6066
6067           count--;
6068           v->mult_val = *mult_val;
6069           v->add_val = *add_val;
6070           v->benefit = benefit;
6071         }
6072       else if (code != NOTE)
6073         {
6074           /* Allow insns that set something other than this giv to a
6075              constant.  Such insns are needed on machines which cannot
6076              include long constants and should not disqualify a giv.  */
6077           if (code == INSN
6078               && (set = single_set (p))
6079               && SET_DEST (set) != dest_reg
6080               && CONSTANT_P (SET_SRC (set)))
6081             continue;
6082
6083           reg_iv_type[REGNO (dest_reg)] = UNKNOWN_INDUCT;
6084           return 0;
6085         }
6086     }
6087
6088   return v->benefit;
6089 }
6090 \f
6091 /* Return an rtx, if any, that expresses giv G2 as a function of the register
6092    represented by G1.  If no such expression can be found, or it is clear that
6093    it cannot possibly be a valid address, 0 is returned. 
6094
6095    To perform the computation, we note that
6096         G1 = x * v + a          and
6097         G2 = y * v + b
6098    where `v' is the biv.
6099
6100    So G2 = (y/b) * G1 + (b - a*y/x).
6101
6102    Note that MULT = y/x.
6103
6104    Update: A and B are now allowed to be additive expressions such that
6105    B contains all variables in A.  That is, computing B-A will not require
6106    subtracting variables.  */
6107
6108 static rtx
6109 express_from_1 (a, b, mult)
6110      rtx a, b, mult;
6111 {
6112   /* If MULT is zero, then A*MULT is zero, and our expression is B.  */
6113
6114   if (mult == const0_rtx)
6115     return b;
6116
6117   /* If MULT is not 1, we cannot handle A with non-constants, since we
6118      would then be required to subtract multiples of the registers in A.
6119      This is theoretically possible, and may even apply to some Fortran
6120      constructs, but it is a lot of work and we do not attempt it here.  */
6121
6122   if (mult != const1_rtx && GET_CODE (a) != CONST_INT)
6123     return NULL_RTX;
6124
6125   /* In general these structures are sorted top to bottom (down the PLUS
6126      chain), but not left to right across the PLUS.  If B is a higher
6127      order giv than A, we can strip one level and recurse.  If A is higher
6128      order, we'll eventually bail out, but won't know that until the end.
6129      If they are the same, we'll strip one level around this loop.  */
6130
6131   while (GET_CODE (a) == PLUS && GET_CODE (b) == PLUS)
6132     {
6133       rtx ra, rb, oa, ob, tmp;
6134
6135       ra = XEXP (a, 0), oa = XEXP (a, 1);
6136       if (GET_CODE (ra) == PLUS)
6137         tmp = ra, ra = oa, oa = tmp;
6138
6139       rb = XEXP (b, 0), ob = XEXP (b, 1);
6140       if (GET_CODE (rb) == PLUS)
6141         tmp = rb, rb = ob, ob = tmp;
6142
6143       if (rtx_equal_p (ra, rb))
6144         /* We matched: remove one reg completely.  */
6145         a = oa, b = ob;
6146       else if (GET_CODE (ob) != PLUS && rtx_equal_p (ra, ob))
6147         /* An alternate match.  */
6148         a = oa, b = rb;
6149       else if (GET_CODE (oa) != PLUS && rtx_equal_p (oa, rb))
6150         /* An alternate match.  */
6151         a = ra, b = ob;
6152       else
6153         {
6154           /* Indicates an extra register in B.  Strip one level from B and 
6155              recurse, hoping B was the higher order expression.  */
6156           ob = express_from_1 (a, ob, mult);
6157           if (ob == NULL_RTX)
6158             return NULL_RTX;
6159           return gen_rtx_PLUS (GET_MODE (b), rb, ob);
6160         }
6161     }
6162
6163   /* Here we are at the last level of A, go through the cases hoping to
6164      get rid of everything but a constant.  */
6165
6166   if (GET_CODE (a) == PLUS)
6167     {
6168       rtx ra, oa;
6169
6170       ra = XEXP (a, 0), oa = XEXP (a, 1);
6171       if (rtx_equal_p (oa, b))
6172         oa = ra;
6173       else if (!rtx_equal_p (ra, b))
6174         return NULL_RTX;
6175
6176       if (GET_CODE (oa) != CONST_INT)
6177         return NULL_RTX;
6178
6179       return GEN_INT (-INTVAL (oa) * INTVAL (mult));
6180     }
6181   else if (GET_CODE (a) == CONST_INT)
6182     {
6183       return plus_constant (b, -INTVAL (a) * INTVAL (mult));
6184     }
6185   else if (GET_CODE (b) == PLUS)
6186     {
6187       if (rtx_equal_p (a, XEXP (b, 0)))
6188         return XEXP (b, 1);
6189       else if (rtx_equal_p (a, XEXP (b, 1)))
6190         return XEXP (b, 0);
6191       else
6192         return NULL_RTX;
6193     }
6194   else if (rtx_equal_p (a, b))
6195     return const0_rtx;
6196
6197   return NULL_RTX;
6198 }
6199
6200 static rtx
6201 express_from (g1, g2)
6202      struct induction *g1, *g2;
6203 {
6204   rtx mult, add;
6205
6206   /* The value that G1 will be multiplied by must be a constant integer.  Also,
6207      the only chance we have of getting a valid address is if b*c/a (see above
6208      for notation) is also an integer.  */
6209   if (GET_CODE (g1->mult_val) == CONST_INT
6210       && GET_CODE (g2->mult_val) == CONST_INT)
6211     {
6212       if (g1->mult_val == const0_rtx
6213           || INTVAL (g2->mult_val) % INTVAL (g1->mult_val) != 0)
6214         return NULL_RTX;
6215       mult = GEN_INT (INTVAL (g2->mult_val) / INTVAL (g1->mult_val));
6216     }
6217   else if (rtx_equal_p (g1->mult_val, g2->mult_val))
6218     mult = const1_rtx;
6219   else
6220     {
6221       /* ??? Find out if the one is a multiple of the other?  */
6222       return NULL_RTX;
6223     }
6224
6225   add = express_from_1 (g1->add_val, g2->add_val, mult);
6226   if (add == NULL_RTX)
6227     return NULL_RTX;
6228
6229   /* Form simplified final result.  */
6230   if (mult == const0_rtx)
6231     return add;
6232   else if (mult == const1_rtx)
6233     mult = g1->dest_reg;
6234   else
6235     mult = gen_rtx_MULT (g2->mode, g1->dest_reg, mult);
6236
6237   if (add == const0_rtx)
6238     return mult;
6239   else
6240     {
6241       if (GET_CODE (add) == PLUS
6242           && CONSTANT_P (XEXP (add, 1)))
6243         {
6244           rtx tem = XEXP (add, 1);
6245           mult = gen_rtx_PLUS (g2->mode, mult, XEXP (add, 0));
6246           add = tem;
6247         }
6248       
6249       return gen_rtx_PLUS (g2->mode, mult, add);
6250     }
6251   
6252 }
6253 \f
6254 /* Return an rtx, if any, that expresses giv G2 as a function of the register
6255    represented by G1.  This indicates that G2 should be combined with G1 and
6256    that G2 can use (either directly or via an address expression) a register
6257    used to represent G1.  */
6258
6259 static rtx
6260 combine_givs_p (g1, g2)
6261      struct induction *g1, *g2;
6262 {
6263   rtx tem = express_from (g1, g2);
6264
6265   /* If these givs are identical, they can be combined.  We use the results
6266      of express_from because the addends are not in a canonical form, so
6267      rtx_equal_p is a weaker test.  */
6268   if (tem == g1->dest_reg)
6269     {
6270       return g1->dest_reg;
6271     }
6272
6273   /* If G2 can be expressed as a function of G1 and that function is valid
6274      as an address and no more expensive than using a register for G2,
6275      the expression of G2 in terms of G1 can be used.  */
6276   if (tem != NULL_RTX
6277       && g2->giv_type == DEST_ADDR
6278       && memory_address_p (g2->mem_mode, tem)
6279       /* ??? Looses, especially with -fforce-addr, where *g2->location
6280          will always be a register, and so anything more complicated
6281          gets discarded.  */
6282 #if 0
6283 #ifdef ADDRESS_COST
6284       && ADDRESS_COST (tem) <= ADDRESS_COST (*g2->location)
6285 #else
6286       && rtx_cost (tem, MEM) <= rtx_cost (*g2->location, MEM)
6287 #endif
6288 #endif
6289       )
6290     {
6291       return tem;
6292     }
6293
6294   return NULL_RTX;
6295 }
6296 \f
6297 struct combine_givs_stats
6298 {
6299   int giv_number;
6300   int total_benefit;
6301 };
6302
6303 static int
6304 cmp_combine_givs_stats (x, y)
6305      struct combine_givs_stats *x, *y;
6306 {
6307   int d;
6308   d = y->total_benefit - x->total_benefit;
6309   /* Stabilize the sort.  */
6310   if (!d)
6311     d = x->giv_number - y->giv_number;
6312   return d;
6313 }
6314
6315 /* If one of these givs is a DEST_REG that was only used once, by the
6316    other giv, this is actually a single use.  Return 0 if this is not
6317    the case, -1 if g1 is the DEST_REG involved, and 1 if it was g2.  */
6318
6319 static int
6320 combine_givs_used_once (g1, g2)
6321      struct induction *g1, *g2;
6322 {
6323   if (g1->giv_type == DEST_REG
6324       && VARRAY_INT (n_times_used, REGNO (g1->dest_reg)) == 1
6325       && reg_mentioned_p (g1->dest_reg, PATTERN (g2->insn)))
6326     return -1;
6327
6328   if (g2->giv_type == DEST_REG
6329       && VARRAY_INT (n_times_used, REGNO (g2->dest_reg)) == 1
6330       && reg_mentioned_p (g2->dest_reg, PATTERN (g1->insn)))
6331     return 1;
6332
6333   return 0;
6334 }
6335  
6336 static int
6337 combine_givs_benefit_from (g1, g2)
6338      struct induction *g1, *g2;
6339 {
6340   int tmp = combine_givs_used_once (g1, g2);
6341   if (tmp < 0)
6342     return 0;
6343   else if (tmp > 0)
6344     return g2->benefit - g1->benefit;
6345   else
6346     return g2->benefit;
6347 }
6348
6349 /* Check all pairs of givs for iv_class BL and see if any can be combined with
6350    any other.  If so, point SAME to the giv combined with and set NEW_REG to
6351    be an expression (in terms of the other giv's DEST_REG) equivalent to the
6352    giv.  Also, update BENEFIT and related fields for cost/benefit analysis.  */
6353
6354 static void
6355 combine_givs (bl)
6356      struct iv_class *bl;
6357 {
6358   struct induction *g1, *g2, **giv_array;
6359   int i, j, k, giv_count;
6360   struct combine_givs_stats *stats;
6361   rtx *can_combine;
6362
6363   /* Count givs, because bl->giv_count is incorrect here.  */
6364   giv_count = 0;
6365   for (g1 = bl->giv; g1; g1 = g1->next_iv)
6366     if (!g1->ignore)
6367       giv_count++;
6368
6369   giv_array
6370     = (struct induction **) alloca (giv_count * sizeof (struct induction *));
6371   i = 0;
6372   for (g1 = bl->giv; g1; g1 = g1->next_iv)
6373     if (!g1->ignore)
6374       giv_array[i++] = g1;
6375
6376   stats = (struct combine_givs_stats *) alloca (giv_count * sizeof (*stats));
6377   bzero ((char *) stats, giv_count * sizeof (*stats));
6378
6379   can_combine = (rtx *) alloca (giv_count * giv_count * sizeof(rtx));
6380   bzero ((char *) can_combine, giv_count * giv_count * sizeof(rtx));
6381
6382   for (i = 0; i < giv_count; i++)
6383     {
6384       int this_benefit;
6385
6386       g1 = giv_array[i];
6387
6388       this_benefit = g1->benefit;
6389       /* Add an additional weight for zero addends.  */
6390       if (g1->no_const_addval)
6391         this_benefit += 1;
6392       for (j = 0; j < giv_count; j++)
6393         {
6394           rtx this_combine;
6395
6396           g2 = giv_array[j];
6397           if (g1 != g2
6398               && (this_combine = combine_givs_p (g1, g2)) != NULL_RTX)
6399             {
6400               can_combine[i*giv_count + j] = this_combine;
6401               this_benefit += combine_givs_benefit_from (g1, g2);
6402               /* Add an additional weight for being reused more times.  */
6403               this_benefit += 3;
6404             }
6405         }
6406       stats[i].giv_number = i;
6407       stats[i].total_benefit = this_benefit;
6408     }
6409
6410   /* Iterate, combining until we can't.  */
6411 restart:
6412   qsort (stats, giv_count, sizeof(*stats), cmp_combine_givs_stats);
6413
6414   if (loop_dump_stream)
6415     {
6416       fprintf (loop_dump_stream, "Sorted combine statistics:\n");
6417       for (k = 0; k < giv_count; k++)
6418         {
6419           g1 = giv_array[stats[k].giv_number];
6420           if (!g1->combined_with && !g1->same)
6421             fprintf (loop_dump_stream, " {%d, %d}", 
6422                      INSN_UID (giv_array[stats[k].giv_number]->insn),
6423                      stats[k].total_benefit);
6424         }
6425       putc ('\n', loop_dump_stream);
6426     }
6427
6428   for (k = 0; k < giv_count; k++)
6429     {
6430       int g1_add_benefit = 0;
6431
6432       i = stats[k].giv_number;
6433       g1 = giv_array[i];
6434
6435       /* If it has already been combined, skip.  */
6436       if (g1->combined_with || g1->same)
6437         continue;
6438
6439       for (j = 0; j < giv_count; j++)
6440         {
6441           g2 = giv_array[j];
6442           if (g1 != g2 && can_combine[i*giv_count + j]
6443               /* If it has already been combined, skip.  */
6444               && ! g2->same && ! g2->combined_with)
6445             {
6446               int l;
6447
6448               g2->new_reg = can_combine[i*giv_count + j];
6449               g2->same = g1;
6450               g1->combined_with = 1;
6451               if (!combine_givs_used_once (g1, g2))
6452                 g1->times_used += 1;
6453               g1->lifetime += g2->lifetime;
6454
6455               g1_add_benefit += combine_givs_benefit_from (g1, g2);
6456
6457               /* ??? The new final_[bg]iv_value code does a much better job
6458                  of finding replaceable giv's, and hence this code may no
6459                  longer be necessary.  */
6460               if (! g2->replaceable && REG_USERVAR_P (g2->dest_reg))
6461                 g1_add_benefit -= copy_cost;
6462                 
6463               /* To help optimize the next set of combinations, remove
6464                  this giv from the benefits of other potential mates.  */
6465               for (l = 0; l < giv_count; ++l)
6466                 {
6467                   int m = stats[l].giv_number;
6468                   if (can_combine[m*giv_count + j])
6469                     {
6470                       /* Remove additional weight for being reused.  */
6471                       stats[l].total_benefit -= 3 + 
6472                         combine_givs_benefit_from (giv_array[m], g2);
6473                     }
6474                 }
6475
6476               if (loop_dump_stream)
6477                 fprintf (loop_dump_stream,
6478                          "giv at %d combined with giv at %d\n",
6479                          INSN_UID (g2->insn), INSN_UID (g1->insn));
6480             }
6481         }
6482
6483       /* To help optimize the next set of combinations, remove
6484          this giv from the benefits of other potential mates.  */
6485       if (g1->combined_with)
6486         {
6487           for (j = 0; j < giv_count; ++j)
6488             {
6489               int m = stats[j].giv_number;
6490               if (can_combine[m*giv_count + j])
6491                 {
6492                   /* Remove additional weight for being reused.  */
6493                   stats[j].total_benefit -= 3 + 
6494                     combine_givs_benefit_from (giv_array[m], g1);
6495                 }
6496             }
6497
6498           g1->benefit += g1_add_benefit;
6499
6500           /* We've finished with this giv, and everything it touched.
6501              Restart the combination so that proper weights for the 
6502              rest of the givs are properly taken into account.  */
6503           /* ??? Ideally we would compact the arrays at this point, so
6504              as to not cover old ground.  But sanely compacting
6505              can_combine is tricky.  */
6506           goto restart;
6507         }
6508     }
6509 }
6510 \f
6511 /* EMIT code before INSERT_BEFORE to set REG = B * M + A.  */
6512
6513 void
6514 emit_iv_add_mult (b, m, a, reg, insert_before)
6515      rtx b;          /* initial value of basic induction variable */
6516      rtx m;          /* multiplicative constant */
6517      rtx a;          /* additive constant */
6518      rtx reg;        /* destination register */
6519      rtx insert_before;
6520 {
6521   rtx seq;
6522   rtx result;
6523
6524   /* Prevent unexpected sharing of these rtx.  */
6525   a = copy_rtx (a);
6526   b = copy_rtx (b);
6527
6528   /* Increase the lifetime of any invariants moved further in code.  */
6529   update_reg_last_use (a, insert_before);
6530   update_reg_last_use (b, insert_before);
6531   update_reg_last_use (m, insert_before);
6532
6533   start_sequence ();
6534   result = expand_mult_add (b, reg, m, a, GET_MODE (reg), 0);
6535   if (reg != result)
6536     emit_move_insn (reg, result);
6537   seq = gen_sequence ();
6538   end_sequence ();
6539
6540   emit_insn_before (seq, insert_before);
6541
6542   /* It is entirely possible that the expansion created lots of new 
6543      registers.  Iterate over the sequence we just created and 
6544      record them all.  */
6545
6546   if (GET_CODE (seq) == SEQUENCE)
6547     {
6548       int i;
6549       for (i = 0; i < XVECLEN (seq, 0); ++i)
6550         {
6551           rtx set = single_set (XVECEXP (seq, 0, i));
6552           if (set && GET_CODE (SET_DEST (set)) == REG)
6553             record_base_value (REGNO (SET_DEST (set)), SET_SRC (set), 0);
6554         }
6555     }
6556   else if (GET_CODE (seq) == SET
6557            && GET_CODE (SET_DEST (seq)) == REG)
6558     record_base_value (REGNO (SET_DEST (seq)), SET_SRC (seq), 0);
6559 }
6560 \f
6561 /* Test whether A * B can be computed without
6562    an actual multiply insn.  Value is 1 if so.  */
6563
6564 static int
6565 product_cheap_p (a, b)
6566      rtx a;
6567      rtx b;
6568 {
6569   int i;
6570   rtx tmp;
6571   struct obstack *old_rtl_obstack = rtl_obstack;
6572   char *storage = (char *) obstack_alloc (&temp_obstack, 0);
6573   int win = 1;
6574
6575   /* If only one is constant, make it B.  */
6576   if (GET_CODE (a) == CONST_INT)
6577     tmp = a, a = b, b = tmp;
6578
6579   /* If first constant, both constant, so don't need multiply.  */
6580   if (GET_CODE (a) == CONST_INT)
6581     return 1;
6582
6583   /* If second not constant, neither is constant, so would need multiply.  */
6584   if (GET_CODE (b) != CONST_INT)
6585     return 0;
6586
6587   /* One operand is constant, so might not need multiply insn.  Generate the
6588      code for the multiply and see if a call or multiply, or long sequence
6589      of insns is generated.  */
6590
6591   rtl_obstack = &temp_obstack;
6592   start_sequence ();
6593   expand_mult (GET_MODE (a), a, b, NULL_RTX, 0);
6594   tmp = gen_sequence ();
6595   end_sequence ();
6596
6597   if (GET_CODE (tmp) == SEQUENCE)
6598     {
6599       if (XVEC (tmp, 0) == 0)
6600         win = 1;
6601       else if (XVECLEN (tmp, 0) > 3)
6602         win = 0;
6603       else
6604         for (i = 0; i < XVECLEN (tmp, 0); i++)
6605           {
6606             rtx insn = XVECEXP (tmp, 0, i);
6607
6608             if (GET_CODE (insn) != INSN
6609                 || (GET_CODE (PATTERN (insn)) == SET
6610                     && GET_CODE (SET_SRC (PATTERN (insn))) == MULT)
6611                 || (GET_CODE (PATTERN (insn)) == PARALLEL
6612                     && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET
6613                     && GET_CODE (SET_SRC (XVECEXP (PATTERN (insn), 0, 0))) == MULT))
6614               {
6615                 win = 0;
6616                 break;
6617               }
6618           }
6619     }
6620   else if (GET_CODE (tmp) == SET
6621            && GET_CODE (SET_SRC (tmp)) == MULT)
6622     win = 0;
6623   else if (GET_CODE (tmp) == PARALLEL
6624            && GET_CODE (XVECEXP (tmp, 0, 0)) == SET
6625            && GET_CODE (SET_SRC (XVECEXP (tmp, 0, 0))) == MULT)
6626     win = 0;
6627
6628   /* Free any storage we obtained in generating this multiply and restore rtl
6629      allocation to its normal obstack.  */
6630   obstack_free (&temp_obstack, storage);
6631   rtl_obstack = old_rtl_obstack;
6632
6633   return win;
6634 }
6635 \f
6636 /* Check to see if loop can be terminated by a "decrement and branch until
6637    zero" instruction.  If so, add a REG_NONNEG note to the branch insn if so.
6638    Also try reversing an increment loop to a decrement loop
6639    to see if the optimization can be performed.
6640    Value is nonzero if optimization was performed.  */
6641
6642 /* This is useful even if the architecture doesn't have such an insn,
6643    because it might change a loops which increments from 0 to n to a loop
6644    which decrements from n to 0.  A loop that decrements to zero is usually
6645    faster than one that increments from zero.  */
6646
6647 /* ??? This could be rewritten to use some of the loop unrolling procedures,
6648    such as approx_final_value, biv_total_increment, loop_iterations, and
6649    final_[bg]iv_value.  */
6650
6651 static int
6652 check_dbra_loop (loop_end, insn_count, loop_start)
6653      rtx loop_end;
6654      int insn_count;
6655      rtx loop_start;
6656 {
6657   struct iv_class *bl;
6658   rtx reg;
6659   rtx jump_label;
6660   rtx final_value;
6661   rtx start_value;
6662   rtx new_add_val;
6663   rtx comparison;
6664   rtx before_comparison;
6665   rtx p;
6666   rtx jump;
6667   rtx first_compare;
6668   int compare_and_branch;
6669
6670   /* If last insn is a conditional branch, and the insn before tests a
6671      register value, try to optimize it.  Otherwise, we can't do anything.  */
6672
6673   jump = PREV_INSN (loop_end);
6674   comparison = get_condition_for_loop (jump);
6675   if (comparison == 0)
6676     return 0;
6677
6678   /* Try to compute whether the compare/branch at the loop end is one or
6679      two instructions.  */
6680   get_condition (jump, &first_compare);
6681   if (first_compare == jump)
6682     compare_and_branch = 1;
6683   else if (first_compare == prev_nonnote_insn (jump))
6684     compare_and_branch = 2;
6685   else
6686     return 0;
6687
6688   /* Check all of the bivs to see if the compare uses one of them.
6689      Skip biv's set more than once because we can't guarantee that
6690      it will be zero on the last iteration.  Also skip if the biv is
6691      used between its update and the test insn.  */
6692
6693   for (bl = loop_iv_list; bl; bl = bl->next)
6694     {
6695       if (bl->biv_count == 1
6696           && bl->biv->dest_reg == XEXP (comparison, 0)
6697           && ! reg_used_between_p (regno_reg_rtx[bl->regno], bl->biv->insn,
6698                                    first_compare))
6699         break;
6700     }
6701
6702   if (! bl)
6703     return 0;
6704
6705   /* Look for the case where the basic induction variable is always
6706      nonnegative, and equals zero on the last iteration.
6707      In this case, add a reg_note REG_NONNEG, which allows the
6708      m68k DBRA instruction to be used.  */
6709
6710   if (((GET_CODE (comparison) == GT
6711         && GET_CODE (XEXP (comparison, 1)) == CONST_INT
6712         && INTVAL (XEXP (comparison, 1)) == -1)
6713        || (GET_CODE (comparison) == NE && XEXP (comparison, 1) == const0_rtx))
6714       && GET_CODE (bl->biv->add_val) == CONST_INT
6715       && INTVAL (bl->biv->add_val) < 0)
6716     {
6717       /* Initial value must be greater than 0,
6718          init_val % -dec_value == 0 to ensure that it equals zero on
6719          the last iteration */
6720
6721       if (GET_CODE (bl->initial_value) == CONST_INT
6722           && INTVAL (bl->initial_value) > 0
6723           && (INTVAL (bl->initial_value)
6724               % (-INTVAL (bl->biv->add_val))) == 0)
6725         {
6726           /* register always nonnegative, add REG_NOTE to branch */
6727           REG_NOTES (PREV_INSN (loop_end))
6728             = gen_rtx_EXPR_LIST (REG_NONNEG, NULL_RTX,
6729                                  REG_NOTES (PREV_INSN (loop_end)));
6730           bl->nonneg = 1;
6731
6732           return 1;
6733         }
6734
6735       /* If the decrement is 1 and the value was tested as >= 0 before
6736          the loop, then we can safely optimize.  */
6737       for (p = loop_start; p; p = PREV_INSN (p))
6738         {
6739           if (GET_CODE (p) == CODE_LABEL)
6740             break;
6741           if (GET_CODE (p) != JUMP_INSN)
6742             continue;
6743
6744           before_comparison = get_condition_for_loop (p);
6745           if (before_comparison
6746               && XEXP (before_comparison, 0) == bl->biv->dest_reg
6747               && GET_CODE (before_comparison) == LT
6748               && XEXP (before_comparison, 1) == const0_rtx
6749               && ! reg_set_between_p (bl->biv->dest_reg, p, loop_start)
6750               && INTVAL (bl->biv->add_val) == -1)
6751             {
6752               REG_NOTES (PREV_INSN (loop_end))
6753                 = gen_rtx_EXPR_LIST (REG_NONNEG, NULL_RTX,
6754                                      REG_NOTES (PREV_INSN (loop_end)));
6755               bl->nonneg = 1;
6756
6757               return 1;
6758             }
6759         }
6760     }
6761   else if (INTVAL (bl->biv->add_val) > 0)
6762     {
6763       /* Try to change inc to dec, so can apply above optimization.  */
6764       /* Can do this if:
6765          all registers modified are induction variables or invariant,
6766          all memory references have non-overlapping addresses
6767          (obviously true if only one write)
6768          allow 2 insns for the compare/jump at the end of the loop.  */
6769       /* Also, we must avoid any instructions which use both the reversed
6770          biv and another biv.  Such instructions will fail if the loop is
6771          reversed.  We meet this condition by requiring that either
6772          no_use_except_counting is true, or else that there is only
6773          one biv.  */
6774       int num_nonfixed_reads = 0;
6775       /* 1 if the iteration var is used only to count iterations.  */
6776       int no_use_except_counting = 0;
6777       /* 1 if the loop has no memory store, or it has a single memory store
6778          which is reversible.  */
6779       int reversible_mem_store = 1;
6780
6781       if (bl->giv_count == 0
6782           && ! loop_number_exit_count[uid_loop_num[INSN_UID (loop_start)]])
6783         {
6784           rtx bivreg = regno_reg_rtx[bl->regno];
6785
6786           /* If there are no givs for this biv, and the only exit is the
6787              fall through at the end of the loop, then
6788              see if perhaps there are no uses except to count.  */
6789           no_use_except_counting = 1;
6790           for (p = loop_start; p != loop_end; p = NEXT_INSN (p))
6791             if (GET_RTX_CLASS (GET_CODE (p)) == 'i')
6792               {
6793                 rtx set = single_set (p);
6794
6795                 if (set && GET_CODE (SET_DEST (set)) == REG
6796                     && REGNO (SET_DEST (set)) == bl->regno)
6797                   /* An insn that sets the biv is okay.  */
6798                   ;
6799                 else if (p == prev_nonnote_insn (prev_nonnote_insn (loop_end))
6800                          || p == prev_nonnote_insn (loop_end))
6801                   /* Don't bother about the end test.  */
6802                   ;
6803                 else if (reg_mentioned_p (bivreg, PATTERN (p)))
6804                   {
6805                     no_use_except_counting = 0;
6806                     break;
6807                   }
6808               }
6809         }
6810
6811       if (no_use_except_counting)
6812         ; /* no need to worry about MEMs.  */
6813       else if (num_mem_sets <= 1)
6814         {
6815           for (p = loop_start; p != loop_end; p = NEXT_INSN (p))
6816             if (GET_RTX_CLASS (GET_CODE (p)) == 'i')
6817               num_nonfixed_reads += count_nonfixed_reads (PATTERN (p));
6818
6819           /* If the loop has a single store, and the destination address is
6820              invariant, then we can't reverse the loop, because this address
6821              might then have the wrong value at loop exit.
6822              This would work if the source was invariant also, however, in that
6823              case, the insn should have been moved out of the loop.  */
6824
6825           if (num_mem_sets == 1)
6826             reversible_mem_store
6827               = (! unknown_address_altered
6828                  && ! invariant_p (XEXP (loop_store_mems[0], 0)));
6829         }
6830       else
6831         return 0;
6832
6833       /* This code only acts for innermost loops.  Also it simplifies
6834          the memory address check by only reversing loops with
6835          zero or one memory access.
6836          Two memory accesses could involve parts of the same array,
6837          and that can't be reversed.
6838          If the biv is used only for counting, than we don't need to worry
6839          about all these things.  */
6840
6841       if ((num_nonfixed_reads <= 1
6842            && !loop_has_call
6843            && !loop_has_volatile
6844            && reversible_mem_store
6845            && (bl->giv_count + bl->biv_count + num_mem_sets
6846               + num_movables + compare_and_branch == insn_count)
6847            && (bl == loop_iv_list && bl->next == 0))
6848           || no_use_except_counting)
6849         {
6850           rtx tem;
6851
6852           /* Loop can be reversed.  */
6853           if (loop_dump_stream)
6854             fprintf (loop_dump_stream, "Can reverse loop\n");
6855
6856           /* Now check other conditions:
6857
6858              The increment must be a constant, as must the initial value,
6859              and the comparison code must be LT. 
6860
6861              This test can probably be improved since +/- 1 in the constant
6862              can be obtained by changing LT to LE and vice versa; this is
6863              confusing.  */
6864
6865           if (comparison
6866               /* for constants, LE gets turned into LT */
6867               && (GET_CODE (comparison) == LT
6868                   || (GET_CODE (comparison) == LE
6869                       && no_use_except_counting)))
6870             {
6871               HOST_WIDE_INT add_val, add_adjust, comparison_val;
6872               rtx initial_value, comparison_value;
6873               int nonneg = 0;
6874               enum rtx_code cmp_code;
6875               int comparison_const_width;
6876               unsigned HOST_WIDE_INT comparison_sign_mask;
6877               rtx vtop;
6878
6879               add_val = INTVAL (bl->biv->add_val);
6880               comparison_value = XEXP (comparison, 1);
6881               comparison_const_width
6882                 = GET_MODE_BITSIZE (GET_MODE (XEXP (comparison, 1)));
6883               if (comparison_const_width > HOST_BITS_PER_WIDE_INT)
6884                 comparison_const_width = HOST_BITS_PER_WIDE_INT;
6885               comparison_sign_mask
6886                 = (unsigned HOST_WIDE_INT)1 << (comparison_const_width - 1);
6887
6888               /* If the comparison value is not a loop invariant, then we
6889                  can not reverse this loop.
6890
6891                  ??? If the insns which initialize the comparison value as
6892                  a whole compute an invariant result, then we could move
6893                  them out of the loop and proceed with loop reversal.  */
6894               if (!invariant_p (comparison_value))
6895                 return 0;
6896
6897               if (GET_CODE (comparison_value) == CONST_INT)
6898                 comparison_val = INTVAL (comparison_value);
6899               initial_value = bl->initial_value;
6900                 
6901               /* Normalize the initial value if it is an integer and 
6902                  has no other use except as a counter.  This will allow
6903                  a few more loops to be reversed.  */
6904               if (no_use_except_counting
6905                   && GET_CODE (comparison_value) == CONST_INT
6906                   && GET_CODE (initial_value) == CONST_INT)
6907                 {
6908                   comparison_val = comparison_val - INTVAL (bl->initial_value);
6909                   /* The code below requires comparison_val to be a multiple
6910                      of add_val in order to do the loop reversal, so
6911                      round up comparison_val to a multiple of add_val.
6912                      Since comparison_value is constant, we know that the
6913                      current comparison code is LT.  */
6914                   comparison_val = comparison_val + add_val - 1;
6915                   comparison_val
6916                     -= (unsigned HOST_WIDE_INT) comparison_val % add_val;
6917                   /* We postpone overflow checks for COMPARISON_VAL here;
6918                      even if there is an overflow, we might still be able to
6919                      reverse the loop, if converting the loop exit test to
6920                      NE is possible.  */
6921                   initial_value = const0_rtx;
6922                 }
6923
6924               /* Check if there is a NOTE_INSN_LOOP_VTOP note.  If there is,
6925                  that means that this is a for or while style loop, with
6926                  a loop exit test at the start.  Thus, we can assume that
6927                  the loop condition was true when the loop was entered.
6928                  This allows us to change the loop exit condition to an
6929                  equality test.
6930                  We start at the end and search backwards for the previous
6931                  NOTE.  If there is no NOTE_INSN_LOOP_VTOP for this loop,
6932                  the search will stop at the NOTE_INSN_LOOP_CONT.  */
6933               vtop = loop_end;
6934               do
6935                 vtop = PREV_INSN (vtop);
6936               while (GET_CODE (vtop) != NOTE
6937                      || NOTE_LINE_NUMBER (vtop) > 0
6938                      || NOTE_LINE_NUMBER (vtop) == NOTE_REPEATED_LINE_NUMBER
6939                      || NOTE_LINE_NUMBER (vtop) == NOTE_INSN_DELETED);
6940               if (NOTE_LINE_NUMBER (vtop) != NOTE_INSN_LOOP_VTOP)
6941                 vtop = NULL_RTX;
6942                 
6943               /* First check if we can do a vanilla loop reversal.  */
6944               if (initial_value == const0_rtx
6945                   /* If we have a decrement_and_branch_on_count, prefer
6946                      the NE test, since this will allow that instruction to
6947                      be generated.  Note that we must use a vanilla loop
6948                      reversal if the biv is used to calculate a giv or has
6949                      a non-counting use.  */
6950 #if ! defined (HAVE_decrement_and_branch_until_zero) && defined (HAVE_decrement_and_branch_on_count)
6951                   && (! (add_val == 1 && vtop
6952                          && (bl->biv_count == 0
6953                              || no_use_except_counting)))
6954 #endif
6955                   && GET_CODE (comparison_value) == CONST_INT
6956                      /* Now do postponed overflow checks on COMPARISON_VAL.  */
6957                   && ! (((comparison_val - add_val) ^ INTVAL (comparison_value))
6958                         & comparison_sign_mask))
6959                 {
6960                   /* Register will always be nonnegative, with value
6961                      0 on last iteration */
6962                   add_adjust = add_val;
6963                   nonneg = 1;
6964                   cmp_code = GE;
6965                 }
6966               else if (add_val == 1 && vtop
6967                        && (bl->biv_count == 0
6968                            || no_use_except_counting))
6969                 {
6970                   add_adjust = 0;
6971                   cmp_code = NE;
6972                 }
6973               else
6974                 return 0;
6975
6976               if (GET_CODE (comparison) == LE)
6977                 add_adjust -= add_val;
6978
6979               /* If the initial value is not zero, or if the comparison
6980                  value is not an exact multiple of the increment, then we
6981                  can not reverse this loop.  */
6982               if (initial_value == const0_rtx
6983                   && GET_CODE (comparison_value) == CONST_INT)
6984                 {
6985                   if (((unsigned HOST_WIDE_INT) comparison_val % add_val) != 0)
6986                     return 0;
6987                 }
6988               else
6989                 {
6990                   if (! no_use_except_counting || add_val != 1)
6991                     return 0;
6992                 }
6993
6994               final_value = comparison_value;
6995
6996               /* Reset these in case we normalized the initial value
6997                  and comparison value above.  */
6998               if (GET_CODE (comparison_value) == CONST_INT
6999                   && GET_CODE (initial_value) == CONST_INT)
7000                 {
7001                   comparison_value = GEN_INT (comparison_val);
7002                   final_value
7003                     = GEN_INT (comparison_val + INTVAL (bl->initial_value));
7004                 }
7005               bl->initial_value = initial_value;
7006
7007               /* Save some info needed to produce the new insns.  */
7008               reg = bl->biv->dest_reg;
7009               jump_label = XEXP (SET_SRC (PATTERN (PREV_INSN (loop_end))), 1);
7010               if (jump_label == pc_rtx)
7011                 jump_label = XEXP (SET_SRC (PATTERN (PREV_INSN (loop_end))), 2);
7012               new_add_val = GEN_INT (- INTVAL (bl->biv->add_val));
7013
7014               /* Set start_value; if this is not a CONST_INT, we need
7015                  to generate a SUB.
7016                  Initialize biv to start_value before loop start.
7017                  The old initializing insn will be deleted as a
7018                  dead store by flow.c.  */
7019               if (initial_value == const0_rtx
7020                   && GET_CODE (comparison_value) == CONST_INT)
7021                 {
7022                   start_value = GEN_INT (comparison_val - add_adjust);
7023                   emit_insn_before (gen_move_insn (reg, start_value),
7024                                     loop_start);
7025                 }
7026               else if (GET_CODE (initial_value) == CONST_INT)
7027                 {
7028                   rtx offset = GEN_INT (-INTVAL (initial_value) - add_adjust);
7029                   enum machine_mode mode = GET_MODE (reg);
7030                   enum insn_code icode
7031                     = add_optab->handlers[(int) mode].insn_code;
7032                   if (! (*insn_operand_predicate[icode][0]) (reg, mode)
7033                       || ! ((*insn_operand_predicate[icode][1])
7034                             (comparison_value, mode))
7035                       || ! (*insn_operand_predicate[icode][2]) (offset, mode))
7036                     return 0;
7037                   start_value
7038                     = gen_rtx_PLUS (mode, comparison_value, offset);
7039                   emit_insn_before ((GEN_FCN (icode)
7040                                      (reg, comparison_value, offset)),
7041                                     loop_start);
7042                   if (GET_CODE (comparison) == LE)
7043                     final_value = gen_rtx_PLUS (mode, comparison_value,
7044                                                 GEN_INT (add_val));
7045                 }
7046               else if (! add_adjust)
7047                 {
7048                   enum machine_mode mode = GET_MODE (reg);
7049                   enum insn_code icode
7050                     = sub_optab->handlers[(int) mode].insn_code;
7051                   if (! (*insn_operand_predicate[icode][0]) (reg, mode)
7052                       || ! ((*insn_operand_predicate[icode][1])
7053                             (comparison_value, mode))
7054                       || ! ((*insn_operand_predicate[icode][2])
7055                             (initial_value, mode)))
7056                     return 0;
7057                   start_value
7058                     = gen_rtx_MINUS (mode, comparison_value, initial_value);
7059                   emit_insn_before ((GEN_FCN (icode)
7060                                      (reg, comparison_value, initial_value)),
7061                                     loop_start);
7062                 }
7063               else
7064                 /* We could handle the other cases too, but it'll be
7065                    better to have a testcase first.  */
7066                 return 0;
7067
7068               /* We may not have a single insn which can increment a reg, so
7069                  create a sequence to hold all the insns from expand_inc.  */
7070               start_sequence ();
7071               expand_inc (reg, new_add_val);
7072               tem = gen_sequence ();
7073               end_sequence ();
7074
7075               p = emit_insn_before (tem, bl->biv->insn);
7076               delete_insn (bl->biv->insn);
7077                       
7078               /* Update biv info to reflect its new status.  */
7079               bl->biv->insn = p;
7080               bl->initial_value = start_value;
7081               bl->biv->add_val = new_add_val;
7082
7083               /* Inc LABEL_NUSES so that delete_insn will
7084                  not delete the label.  */
7085               LABEL_NUSES (XEXP (jump_label, 0)) ++;
7086
7087               /* Emit an insn after the end of the loop to set the biv's
7088                  proper exit value if it is used anywhere outside the loop.  */
7089               if ((REGNO_LAST_UID (bl->regno) != INSN_UID (first_compare))
7090                   || ! bl->init_insn
7091                   || REGNO_FIRST_UID (bl->regno) != INSN_UID (bl->init_insn))
7092                 emit_insn_after (gen_move_insn (reg, final_value),
7093                                  loop_end);
7094
7095               /* Delete compare/branch at end of loop.  */
7096               delete_insn (PREV_INSN (loop_end));
7097               if (compare_and_branch == 2)
7098                 delete_insn (first_compare);
7099
7100               /* Add new compare/branch insn at end of loop.  */
7101               start_sequence ();
7102               emit_cmp_insn (reg, const0_rtx, cmp_code, NULL_RTX,
7103                              GET_MODE (reg), 0, 0);
7104               emit_jump_insn ((*bcc_gen_fctn[(int) cmp_code])
7105                               (XEXP (jump_label, 0)));
7106               tem = gen_sequence ();
7107               end_sequence ();
7108               emit_jump_insn_before (tem, loop_end);
7109
7110               if (nonneg)
7111                 {
7112                   for (tem = PREV_INSN (loop_end);
7113                        tem && GET_CODE (tem) != JUMP_INSN;
7114                        tem = PREV_INSN (tem))
7115                     ;
7116                   if (tem)
7117                     {
7118                       JUMP_LABEL (tem) = XEXP (jump_label, 0);
7119
7120                       /* Increment of LABEL_NUSES done above.  */
7121                       /* Register is now always nonnegative,
7122                          so add REG_NONNEG note to the branch.  */
7123                       REG_NOTES (tem) = gen_rtx_EXPR_LIST (REG_NONNEG, NULL_RTX,
7124                                                            REG_NOTES (tem));
7125                     }
7126                   bl->nonneg = 1;
7127                 }
7128
7129               /* Mark that this biv has been reversed.  Each giv which depends
7130                  on this biv, and which is also live past the end of the loop
7131                  will have to be fixed up.  */
7132
7133               bl->reversed = 1;
7134
7135               if (loop_dump_stream)
7136                 fprintf (loop_dump_stream,
7137                          "Reversed loop and added reg_nonneg\n");
7138
7139               return 1;
7140             }
7141         }
7142     }
7143
7144   return 0;
7145 }
7146 \f
7147 /* Verify whether the biv BL appears to be eliminable,
7148    based on the insns in the loop that refer to it.
7149    LOOP_START is the first insn of the loop, and END is the end insn.
7150
7151    If ELIMINATE_P is non-zero, actually do the elimination.
7152
7153    THRESHOLD and INSN_COUNT are from loop_optimize and are used to
7154    determine whether invariant insns should be placed inside or at the
7155    start of the loop.  */
7156
7157 static int
7158 maybe_eliminate_biv (bl, loop_start, end, eliminate_p, threshold, insn_count)
7159      struct iv_class *bl;
7160      rtx loop_start;
7161      rtx end;
7162      int eliminate_p;
7163      int threshold, insn_count;
7164 {
7165   rtx reg = bl->biv->dest_reg;
7166   rtx p;
7167
7168   /* Scan all insns in the loop, stopping if we find one that uses the
7169      biv in a way that we cannot eliminate.  */
7170
7171   for (p = loop_start; p != end; p = NEXT_INSN (p))
7172     {
7173       enum rtx_code code = GET_CODE (p);
7174       rtx where = threshold >= insn_count ? loop_start : p;
7175
7176       if ((code == INSN || code == JUMP_INSN || code == CALL_INSN)
7177           && reg_mentioned_p (reg, PATTERN (p))
7178           && ! maybe_eliminate_biv_1 (PATTERN (p), p, bl, eliminate_p, where))
7179         {
7180           if (loop_dump_stream)
7181             fprintf (loop_dump_stream,
7182                      "Cannot eliminate biv %d: biv used in insn %d.\n",
7183                      bl->regno, INSN_UID (p));
7184           break;
7185         }
7186     }
7187
7188   if (p == end)
7189     {
7190       if (loop_dump_stream)
7191         fprintf (loop_dump_stream, "biv %d %s eliminated.\n",
7192                  bl->regno, eliminate_p ? "was" : "can be");
7193       return 1;
7194     }
7195
7196   return 0;
7197 }
7198 \f
7199 /* If BL appears in X (part of the pattern of INSN), see if we can
7200    eliminate its use.  If so, return 1.  If not, return 0.
7201
7202    If BIV does not appear in X, return 1.
7203
7204    If ELIMINATE_P is non-zero, actually do the elimination.  WHERE indicates
7205    where extra insns should be added.  Depending on how many items have been
7206    moved out of the loop, it will either be before INSN or at the start of
7207    the loop.  */
7208
7209 static int
7210 maybe_eliminate_biv_1 (x, insn, bl, eliminate_p, where)
7211      rtx x, insn;
7212      struct iv_class *bl;
7213      int eliminate_p;
7214      rtx where;
7215 {
7216   enum rtx_code code = GET_CODE (x);
7217   rtx reg = bl->biv->dest_reg;
7218   enum machine_mode mode = GET_MODE (reg);
7219   struct induction *v;
7220   rtx arg, tem;
7221 #ifdef HAVE_cc0
7222   rtx new;
7223 #endif
7224   int arg_operand;
7225   char *fmt;
7226   int i, j;
7227
7228   switch (code)
7229     {
7230     case REG:
7231       /* If we haven't already been able to do something with this BIV,
7232          we can't eliminate it.  */
7233       if (x == reg)
7234         return 0;
7235       return 1;
7236
7237     case SET:
7238       /* If this sets the BIV, it is not a problem.  */
7239       if (SET_DEST (x) == reg)
7240         return 1;
7241
7242       /* If this is an insn that defines a giv, it is also ok because
7243          it will go away when the giv is reduced.  */
7244       for (v = bl->giv; v; v = v->next_iv)
7245         if (v->giv_type == DEST_REG && SET_DEST (x) == v->dest_reg)
7246           return 1;
7247
7248 #ifdef HAVE_cc0
7249       if (SET_DEST (x) == cc0_rtx && SET_SRC (x) == reg)
7250         {
7251           /* Can replace with any giv that was reduced and
7252              that has (MULT_VAL != 0) and (ADD_VAL == 0).
7253              Require a constant for MULT_VAL, so we know it's nonzero.
7254              ??? We disable this optimization to avoid potential
7255              overflows.  */
7256
7257           for (v = bl->giv; v; v = v->next_iv)
7258             if (CONSTANT_P (v->mult_val) && v->mult_val != const0_rtx
7259                 && v->add_val == const0_rtx
7260                 && ! v->ignore && ! v->maybe_dead && v->always_computable
7261                 && v->mode == mode
7262                 && 0)
7263               {
7264                 /* If the giv V had the auto-inc address optimization applied
7265                    to it, and INSN occurs between the giv insn and the biv
7266                    insn, then we must adjust the value used here.
7267                    This is rare, so we don't bother to do so.  */
7268                 if (v->auto_inc_opt
7269                     && ((INSN_LUID (v->insn) < INSN_LUID (insn)
7270                          && INSN_LUID (insn) < INSN_LUID (bl->biv->insn))
7271                         || (INSN_LUID (v->insn) > INSN_LUID (insn)
7272                             && INSN_LUID (insn) > INSN_LUID (bl->biv->insn))))
7273                   continue;
7274
7275                 if (! eliminate_p)
7276                   return 1;
7277
7278                 /* If the giv has the opposite direction of change,
7279                    then reverse the comparison.  */
7280                 if (INTVAL (v->mult_val) < 0)
7281                   new = gen_rtx_COMPARE (GET_MODE (v->new_reg),
7282                                          const0_rtx, v->new_reg);
7283                 else
7284                   new = v->new_reg;
7285
7286                 /* We can probably test that giv's reduced reg.  */
7287                 if (validate_change (insn, &SET_SRC (x), new, 0))
7288                   return 1;
7289               }
7290
7291           /* Look for a giv with (MULT_VAL != 0) and (ADD_VAL != 0);
7292              replace test insn with a compare insn (cmp REDUCED_GIV ADD_VAL).
7293              Require a constant for MULT_VAL, so we know it's nonzero.
7294              ??? Do this only if ADD_VAL is a pointer to avoid a potential
7295              overflow problem.  */
7296
7297           for (v = bl->giv; v; v = v->next_iv)
7298             if (CONSTANT_P (v->mult_val) && v->mult_val != const0_rtx
7299                 && ! v->ignore && ! v->maybe_dead && v->always_computable
7300                 && v->mode == mode
7301                 && (GET_CODE (v->add_val) == SYMBOL_REF
7302                     || GET_CODE (v->add_val) == LABEL_REF
7303                     || GET_CODE (v->add_val) == CONST
7304                     || (GET_CODE (v->add_val) == REG
7305                         && REGNO_POINTER_FLAG (REGNO (v->add_val)))))
7306               {
7307                 /* If the giv V had the auto-inc address optimization applied
7308                    to it, and INSN occurs between the giv insn and the biv
7309                    insn, then we must adjust the value used here.
7310                    This is rare, so we don't bother to do so.  */
7311                 if (v->auto_inc_opt
7312                     && ((INSN_LUID (v->insn) < INSN_LUID (insn)
7313                          && INSN_LUID (insn) < INSN_LUID (bl->biv->insn))
7314                         || (INSN_LUID (v->insn) > INSN_LUID (insn)
7315                             && INSN_LUID (insn) > INSN_LUID (bl->biv->insn))))
7316                   continue;
7317
7318                 if (! eliminate_p)
7319                   return 1;
7320
7321                 /* If the giv has the opposite direction of change,
7322                    then reverse the comparison.  */
7323                 if (INTVAL (v->mult_val) < 0)
7324                   new = gen_rtx_COMPARE (VOIDmode, copy_rtx (v->add_val),
7325                                          v->new_reg);
7326                 else
7327                   new = gen_rtx_COMPARE (VOIDmode, v->new_reg,
7328                                          copy_rtx (v->add_val));
7329
7330                 /* Replace biv with the giv's reduced register.  */
7331                 update_reg_last_use (v->add_val, insn);
7332                 if (validate_change (insn, &SET_SRC (PATTERN (insn)), new, 0))
7333                   return 1;
7334
7335                 /* Insn doesn't support that constant or invariant.  Copy it
7336                    into a register (it will be a loop invariant.)  */
7337                 tem = gen_reg_rtx (GET_MODE (v->new_reg));
7338
7339                 emit_insn_before (gen_move_insn (tem, copy_rtx (v->add_val)),
7340                                   where);
7341
7342                 /* Substitute the new register for its invariant value in
7343                    the compare expression. */
7344                 XEXP (new, (INTVAL (v->mult_val) < 0) ? 0 : 1) = tem;
7345                 if (validate_change (insn, &SET_SRC (PATTERN (insn)), new, 0))
7346                   return 1;
7347               }
7348         }
7349 #endif
7350       break;
7351
7352     case COMPARE:
7353     case EQ:  case NE:
7354     case GT:  case GE:  case GTU:  case GEU:
7355     case LT:  case LE:  case LTU:  case LEU:
7356       /* See if either argument is the biv.  */
7357       if (XEXP (x, 0) == reg)
7358         arg = XEXP (x, 1), arg_operand = 1;
7359       else if (XEXP (x, 1) == reg)
7360         arg = XEXP (x, 0), arg_operand = 0;
7361       else
7362         break;
7363
7364       if (CONSTANT_P (arg))
7365         {
7366           /* First try to replace with any giv that has constant positive
7367              mult_val and constant add_val.  We might be able to support
7368              negative mult_val, but it seems complex to do it in general.  */
7369
7370           for (v = bl->giv; v; v = v->next_iv)
7371             if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
7372                 && (GET_CODE (v->add_val) == SYMBOL_REF
7373                     || GET_CODE (v->add_val) == LABEL_REF
7374                     || GET_CODE (v->add_val) == CONST
7375                     || (GET_CODE (v->add_val) == REG
7376                         && REGNO_POINTER_FLAG (REGNO (v->add_val))))
7377                 && ! v->ignore && ! v->maybe_dead && v->always_computable
7378                 && v->mode == mode)
7379               {
7380                 /* If the giv V had the auto-inc address optimization applied
7381                    to it, and INSN occurs between the giv insn and the biv
7382                    insn, then we must adjust the value used here.
7383                    This is rare, so we don't bother to do so.  */
7384                 if (v->auto_inc_opt
7385                     && ((INSN_LUID (v->insn) < INSN_LUID (insn)
7386                          && INSN_LUID (insn) < INSN_LUID (bl->biv->insn))
7387                         || (INSN_LUID (v->insn) > INSN_LUID (insn)
7388                             && INSN_LUID (insn) > INSN_LUID (bl->biv->insn))))
7389                   continue;
7390
7391                 if (! eliminate_p)
7392                   return 1;
7393
7394                 /* Replace biv with the giv's reduced reg.  */
7395                 XEXP (x, 1-arg_operand) = v->new_reg;
7396
7397                 /* If all constants are actually constant integers and
7398                    the derived constant can be directly placed in the COMPARE,
7399                    do so.  */
7400                 if (GET_CODE (arg) == CONST_INT
7401                     && GET_CODE (v->mult_val) == CONST_INT
7402                     && GET_CODE (v->add_val) == CONST_INT
7403                     && validate_change (insn, &XEXP (x, arg_operand),
7404                                         GEN_INT (INTVAL (arg)
7405                                                  * INTVAL (v->mult_val)
7406                                                  + INTVAL (v->add_val)), 0))
7407                   return 1;
7408
7409                 /* Otherwise, load it into a register.  */
7410                 tem = gen_reg_rtx (mode);
7411                 emit_iv_add_mult (arg, v->mult_val, v->add_val, tem, where);
7412                 if (validate_change (insn, &XEXP (x, arg_operand), tem, 0))
7413                   return 1;
7414
7415                 /* If that failed, put back the change we made above.  */
7416                 XEXP (x, 1-arg_operand) = reg;
7417               }
7418           
7419           /* Look for giv with positive constant mult_val and nonconst add_val.
7420              Insert insns to calculate new compare value.  
7421              ??? Turn this off due to possible overflow.  */
7422
7423           for (v = bl->giv; v; v = v->next_iv)
7424             if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
7425                 && ! v->ignore && ! v->maybe_dead && v->always_computable
7426                 && v->mode == mode
7427                 && 0)
7428               {
7429                 rtx tem;
7430
7431                 /* If the giv V had the auto-inc address optimization applied
7432                    to it, and INSN occurs between the giv insn and the biv
7433                    insn, then we must adjust the value used here.
7434                    This is rare, so we don't bother to do so.  */
7435                 if (v->auto_inc_opt
7436                     && ((INSN_LUID (v->insn) < INSN_LUID (insn)
7437                          && INSN_LUID (insn) < INSN_LUID (bl->biv->insn))
7438                         || (INSN_LUID (v->insn) > INSN_LUID (insn)
7439                             && INSN_LUID (insn) > INSN_LUID (bl->biv->insn))))
7440                   continue;
7441
7442                 if (! eliminate_p)
7443                   return 1;
7444
7445                 tem = gen_reg_rtx (mode);
7446
7447                 /* Replace biv with giv's reduced register.  */
7448                 validate_change (insn, &XEXP (x, 1 - arg_operand),
7449                                  v->new_reg, 1);
7450
7451                 /* Compute value to compare against.  */
7452                 emit_iv_add_mult (arg, v->mult_val, v->add_val, tem, where);
7453                 /* Use it in this insn.  */
7454                 validate_change (insn, &XEXP (x, arg_operand), tem, 1);
7455                 if (apply_change_group ())
7456                   return 1;
7457               }
7458         }
7459       else if (GET_CODE (arg) == REG || GET_CODE (arg) == MEM)
7460         {
7461           if (invariant_p (arg) == 1)
7462             {
7463               /* Look for giv with constant positive mult_val and nonconst
7464                  add_val. Insert insns to compute new compare value. 
7465                  ??? Turn this off due to possible overflow.  */
7466
7467               for (v = bl->giv; v; v = v->next_iv)
7468                 if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
7469                     && ! v->ignore && ! v->maybe_dead && v->always_computable
7470                     && v->mode == mode
7471                     && 0)
7472                   {
7473                     rtx tem;
7474
7475                     /* If the giv V had the auto-inc address optimization applied
7476                        to it, and INSN occurs between the giv insn and the biv
7477                        insn, then we must adjust the value used here.
7478                        This is rare, so we don't bother to do so.  */
7479                     if (v->auto_inc_opt
7480                         && ((INSN_LUID (v->insn) < INSN_LUID (insn)
7481                              && INSN_LUID (insn) < INSN_LUID (bl->biv->insn))
7482                             || (INSN_LUID (v->insn) > INSN_LUID (insn)
7483                                 && INSN_LUID (insn) > INSN_LUID (bl->biv->insn))))
7484                       continue;
7485
7486                     if (! eliminate_p)
7487                       return 1;
7488
7489                     tem = gen_reg_rtx (mode);
7490
7491                     /* Replace biv with giv's reduced register.  */
7492                     validate_change (insn, &XEXP (x, 1 - arg_operand),
7493                                      v->new_reg, 1);
7494
7495                     /* Compute value to compare against.  */
7496                     emit_iv_add_mult (arg, v->mult_val, v->add_val,
7497                                       tem, where);
7498                     validate_change (insn, &XEXP (x, arg_operand), tem, 1);
7499                     if (apply_change_group ())
7500                       return 1;
7501                   }
7502             }
7503
7504           /* This code has problems.  Basically, you can't know when
7505              seeing if we will eliminate BL, whether a particular giv
7506              of ARG will be reduced.  If it isn't going to be reduced,
7507              we can't eliminate BL.  We can try forcing it to be reduced,
7508              but that can generate poor code.
7509
7510              The problem is that the benefit of reducing TV, below should
7511              be increased if BL can actually be eliminated, but this means
7512              we might have to do a topological sort of the order in which
7513              we try to process biv.  It doesn't seem worthwhile to do
7514              this sort of thing now.  */
7515
7516 #if 0
7517           /* Otherwise the reg compared with had better be a biv.  */
7518           if (GET_CODE (arg) != REG
7519               || reg_iv_type[REGNO (arg)] != BASIC_INDUCT)
7520             return 0;
7521
7522           /* Look for a pair of givs, one for each biv,
7523              with identical coefficients.  */
7524           for (v = bl->giv; v; v = v->next_iv)
7525             {
7526               struct induction *tv;
7527
7528               if (v->ignore || v->maybe_dead || v->mode != mode)
7529                 continue;
7530
7531               for (tv = reg_biv_class[REGNO (arg)]->giv; tv; tv = tv->next_iv)
7532                 if (! tv->ignore && ! tv->maybe_dead
7533                     && rtx_equal_p (tv->mult_val, v->mult_val)
7534                     && rtx_equal_p (tv->add_val, v->add_val)
7535                     && tv->mode == mode)
7536                   {
7537                     /* If the giv V had the auto-inc address optimization applied
7538                        to it, and INSN occurs between the giv insn and the biv
7539                        insn, then we must adjust the value used here.
7540                        This is rare, so we don't bother to do so.  */
7541                     if (v->auto_inc_opt
7542                         && ((INSN_LUID (v->insn) < INSN_LUID (insn)
7543                              && INSN_LUID (insn) < INSN_LUID (bl->biv->insn))
7544                             || (INSN_LUID (v->insn) > INSN_LUID (insn)
7545                                 && INSN_LUID (insn) > INSN_LUID (bl->biv->insn))))
7546                       continue;
7547
7548                     if (! eliminate_p)
7549                       return 1;
7550
7551                     /* Replace biv with its giv's reduced reg.  */
7552                     XEXP (x, 1-arg_operand) = v->new_reg;
7553                     /* Replace other operand with the other giv's
7554                        reduced reg.  */
7555                     XEXP (x, arg_operand) = tv->new_reg;
7556                     return 1;
7557                   }
7558             }
7559 #endif
7560         }
7561
7562       /* If we get here, the biv can't be eliminated.  */
7563       return 0;
7564
7565     case MEM:
7566       /* If this address is a DEST_ADDR giv, it doesn't matter if the
7567          biv is used in it, since it will be replaced.  */
7568       for (v = bl->giv; v; v = v->next_iv)
7569         if (v->giv_type == DEST_ADDR && v->location == &XEXP (x, 0))
7570           return 1;
7571       break;
7572
7573     default:
7574       break;
7575     }
7576
7577   /* See if any subexpression fails elimination.  */
7578   fmt = GET_RTX_FORMAT (code);
7579   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
7580     {
7581       switch (fmt[i])
7582         {
7583         case 'e':
7584           if (! maybe_eliminate_biv_1 (XEXP (x, i), insn, bl, 
7585                                        eliminate_p, where))
7586             return 0;
7587           break;
7588
7589         case 'E':
7590           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
7591             if (! maybe_eliminate_biv_1 (XVECEXP (x, i, j), insn, bl,
7592                                          eliminate_p, where))
7593               return 0;
7594           break;
7595         }
7596     }
7597
7598   return 1;
7599 }  
7600 \f
7601 /* Return nonzero if the last use of REG
7602    is in an insn following INSN in the same basic block.  */
7603
7604 static int
7605 last_use_this_basic_block (reg, insn)
7606      rtx reg;
7607      rtx insn;
7608 {
7609   rtx n;
7610   for (n = insn;
7611        n && GET_CODE (n) != CODE_LABEL && GET_CODE (n) != JUMP_INSN;
7612        n = NEXT_INSN (n))
7613     {
7614       if (REGNO_LAST_UID (REGNO (reg)) == INSN_UID (n))
7615         return 1;
7616     }
7617   return 0;
7618 }
7619 \f
7620 /* Called via `note_stores' to record the initial value of a biv.  Here we
7621    just record the location of the set and process it later.  */
7622
7623 static void
7624 record_initial (dest, set)
7625      rtx dest;
7626      rtx set;
7627 {
7628   struct iv_class *bl;
7629
7630   if (GET_CODE (dest) != REG
7631       || REGNO (dest) >= max_reg_before_loop
7632       || reg_iv_type[REGNO (dest)] != BASIC_INDUCT)
7633     return;
7634
7635   bl = reg_biv_class[REGNO (dest)];
7636
7637   /* If this is the first set found, record it.  */
7638   if (bl->init_insn == 0)
7639     {
7640       bl->init_insn = note_insn;
7641       bl->init_set = set;
7642     }
7643 }
7644 \f
7645 /* If any of the registers in X are "old" and currently have a last use earlier
7646    than INSN, update them to have a last use of INSN.  Their actual last use
7647    will be the previous insn but it will not have a valid uid_luid so we can't
7648    use it.  */
7649
7650 static void
7651 update_reg_last_use (x, insn)
7652      rtx x;
7653      rtx insn;
7654 {
7655   /* Check for the case where INSN does not have a valid luid.  In this case,
7656      there is no need to modify the regno_last_uid, as this can only happen
7657      when code is inserted after the loop_end to set a pseudo's final value,
7658      and hence this insn will never be the last use of x.  */
7659   if (GET_CODE (x) == REG && REGNO (x) < max_reg_before_loop
7660       && INSN_UID (insn) < max_uid_for_loop
7661       && uid_luid[REGNO_LAST_UID (REGNO (x))] < uid_luid[INSN_UID (insn)])
7662     REGNO_LAST_UID (REGNO (x)) = INSN_UID (insn);
7663   else
7664     {
7665       register int i, j;
7666       register char *fmt = GET_RTX_FORMAT (GET_CODE (x));
7667       for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
7668         {
7669           if (fmt[i] == 'e')
7670             update_reg_last_use (XEXP (x, i), insn);
7671           else if (fmt[i] == 'E')
7672             for (j = XVECLEN (x, i) - 1; j >= 0; j--)
7673               update_reg_last_use (XVECEXP (x, i, j), insn);
7674         }
7675     }
7676 }
7677 \f
7678 /* Given a jump insn JUMP, return the condition that will cause it to branch
7679    to its JUMP_LABEL.  If the condition cannot be understood, or is an
7680    inequality floating-point comparison which needs to be reversed, 0 will
7681    be returned.
7682
7683    If EARLIEST is non-zero, it is a pointer to a place where the earliest
7684    insn used in locating the condition was found.  If a replacement test
7685    of the condition is desired, it should be placed in front of that
7686    insn and we will be sure that the inputs are still valid.
7687
7688    The condition will be returned in a canonical form to simplify testing by
7689    callers.  Specifically:
7690
7691    (1) The code will always be a comparison operation (EQ, NE, GT, etc.).
7692    (2) Both operands will be machine operands; (cc0) will have been replaced.
7693    (3) If an operand is a constant, it will be the second operand.
7694    (4) (LE x const) will be replaced with (LT x <const+1>) and similarly
7695        for GE, GEU, and LEU.  */
7696
7697 rtx
7698 get_condition (jump, earliest)
7699      rtx jump;
7700      rtx *earliest;
7701 {
7702   enum rtx_code code;
7703   rtx prev = jump;
7704   rtx set;
7705   rtx tem;
7706   rtx op0, op1;
7707   int reverse_code = 0;
7708   int did_reverse_condition = 0;
7709   enum machine_mode mode;
7710
7711   /* If this is not a standard conditional jump, we can't parse it.  */
7712   if (GET_CODE (jump) != JUMP_INSN
7713       || ! condjump_p (jump) || simplejump_p (jump))
7714     return 0;
7715
7716   code = GET_CODE (XEXP (SET_SRC (PATTERN (jump)), 0));
7717   mode = GET_MODE (XEXP (SET_SRC (PATTERN (jump)), 0));
7718   op0 = XEXP (XEXP (SET_SRC (PATTERN (jump)), 0), 0);
7719   op1 = XEXP (XEXP (SET_SRC (PATTERN (jump)), 0), 1);
7720
7721   if (earliest)
7722     *earliest = jump;
7723
7724   /* If this branches to JUMP_LABEL when the condition is false, reverse
7725      the condition.  */
7726   if (GET_CODE (XEXP (SET_SRC (PATTERN (jump)), 2)) == LABEL_REF
7727       && XEXP (XEXP (SET_SRC (PATTERN (jump)), 2), 0) == JUMP_LABEL (jump))
7728     code = reverse_condition (code), did_reverse_condition ^= 1;
7729
7730   /* If we are comparing a register with zero, see if the register is set
7731      in the previous insn to a COMPARE or a comparison operation.  Perform
7732      the same tests as a function of STORE_FLAG_VALUE as find_comparison_args
7733      in cse.c  */
7734
7735   while (GET_RTX_CLASS (code) == '<' && op1 == CONST0_RTX (GET_MODE (op0)))
7736     {
7737       /* Set non-zero when we find something of interest.  */
7738       rtx x = 0;
7739
7740 #ifdef HAVE_cc0
7741       /* If comparison with cc0, import actual comparison from compare
7742          insn.  */
7743       if (op0 == cc0_rtx)
7744         {
7745           if ((prev = prev_nonnote_insn (prev)) == 0
7746               || GET_CODE (prev) != INSN
7747               || (set = single_set (prev)) == 0
7748               || SET_DEST (set) != cc0_rtx)
7749             return 0;
7750
7751           op0 = SET_SRC (set);
7752           op1 = CONST0_RTX (GET_MODE (op0));
7753           if (earliest)
7754             *earliest = prev;
7755         }
7756 #endif
7757
7758       /* If this is a COMPARE, pick up the two things being compared.  */
7759       if (GET_CODE (op0) == COMPARE)
7760         {
7761           op1 = XEXP (op0, 1);
7762           op0 = XEXP (op0, 0);
7763           continue;
7764         }
7765       else if (GET_CODE (op0) != REG)
7766         break;
7767
7768       /* Go back to the previous insn.  Stop if it is not an INSN.  We also
7769          stop if it isn't a single set or if it has a REG_INC note because
7770          we don't want to bother dealing with it.  */
7771
7772       if ((prev = prev_nonnote_insn (prev)) == 0
7773           || GET_CODE (prev) != INSN
7774           || FIND_REG_INC_NOTE (prev, 0)
7775           || (set = single_set (prev)) == 0)
7776         break;
7777
7778       /* If this is setting OP0, get what it sets it to if it looks
7779          relevant.  */
7780       if (rtx_equal_p (SET_DEST (set), op0))
7781         {
7782           enum machine_mode inner_mode = GET_MODE (SET_SRC (set));
7783
7784           /* ??? We may not combine comparisons done in a CCmode with
7785              comparisons not done in a CCmode.  This is to aid targets
7786              like Alpha that have an IEEE compliant EQ instruction, and
7787              a non-IEEE compliant BEQ instruction.  The use of CCmode is
7788              actually artificial, simply to prevent the combination, but
7789              should not affect other platforms.
7790
7791              However, we must allow VOIDmode comparisons to match either
7792              CCmode or non-CCmode comparison, because some ports have
7793              modeless comparisons inside branch patterns.
7794
7795              ??? This mode check should perhaps look more like the mode check
7796              in simplify_comparison in combine.  */
7797
7798           if ((GET_CODE (SET_SRC (set)) == COMPARE
7799                || (((code == NE
7800                      || (code == LT
7801                          && GET_MODE_CLASS (inner_mode) == MODE_INT
7802                          && (GET_MODE_BITSIZE (inner_mode)
7803                              <= HOST_BITS_PER_WIDE_INT)
7804                          && (STORE_FLAG_VALUE
7805                              & ((HOST_WIDE_INT) 1
7806                                 << (GET_MODE_BITSIZE (inner_mode) - 1))))
7807 #ifdef FLOAT_STORE_FLAG_VALUE
7808                      || (code == LT
7809                          && GET_MODE_CLASS (inner_mode) == MODE_FLOAT
7810                          && FLOAT_STORE_FLAG_VALUE < 0)
7811 #endif
7812                      ))
7813                    && GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<'))
7814               && (((GET_MODE_CLASS (mode) == MODE_CC)
7815                    == (GET_MODE_CLASS (inner_mode) == MODE_CC))
7816                   || mode == VOIDmode || inner_mode == VOIDmode))
7817             x = SET_SRC (set);
7818           else if (((code == EQ
7819                      || (code == GE
7820                          && (GET_MODE_BITSIZE (inner_mode)
7821                              <= HOST_BITS_PER_WIDE_INT)
7822                          && GET_MODE_CLASS (inner_mode) == MODE_INT
7823                          && (STORE_FLAG_VALUE
7824                              & ((HOST_WIDE_INT) 1
7825                                 << (GET_MODE_BITSIZE (inner_mode) - 1))))
7826 #ifdef FLOAT_STORE_FLAG_VALUE
7827                      || (code == GE
7828                          && GET_MODE_CLASS (inner_mode) == MODE_FLOAT
7829                          && FLOAT_STORE_FLAG_VALUE < 0)
7830 #endif
7831                      ))
7832                    && GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<'
7833                    && (((GET_MODE_CLASS (mode) == MODE_CC)
7834                         == (GET_MODE_CLASS (inner_mode) == MODE_CC))
7835                        || mode == VOIDmode || inner_mode == VOIDmode))
7836
7837             {
7838               /* We might have reversed a LT to get a GE here.  But this wasn't
7839                  actually the comparison of data, so we don't flag that we
7840                  have had to reverse the condition.  */
7841               did_reverse_condition ^= 1;
7842               reverse_code = 1;
7843               x = SET_SRC (set);
7844             }
7845           else
7846             break;
7847         }
7848
7849       else if (reg_set_p (op0, prev))
7850         /* If this sets OP0, but not directly, we have to give up.  */
7851         break;
7852
7853       if (x)
7854         {
7855           if (GET_RTX_CLASS (GET_CODE (x)) == '<')
7856             code = GET_CODE (x);
7857           if (reverse_code)
7858             {
7859               code = reverse_condition (code);
7860               did_reverse_condition ^= 1;
7861               reverse_code = 0;
7862             }
7863
7864           op0 = XEXP (x, 0), op1 = XEXP (x, 1);
7865           if (earliest)
7866             *earliest = prev;
7867         }
7868     }
7869
7870   /* If constant is first, put it last.  */
7871   if (CONSTANT_P (op0))
7872     code = swap_condition (code), tem = op0, op0 = op1, op1 = tem;
7873
7874   /* If OP0 is the result of a comparison, we weren't able to find what
7875      was really being compared, so fail.  */
7876   if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
7877     return 0;
7878
7879   /* Canonicalize any ordered comparison with integers involving equality
7880      if we can do computations in the relevant mode and we do not
7881      overflow.  */
7882
7883   if (GET_CODE (op1) == CONST_INT
7884       && GET_MODE (op0) != VOIDmode
7885       && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT)
7886     {
7887       HOST_WIDE_INT const_val = INTVAL (op1);
7888       unsigned HOST_WIDE_INT uconst_val = const_val;
7889       unsigned HOST_WIDE_INT max_val
7890         = (unsigned HOST_WIDE_INT) GET_MODE_MASK (GET_MODE (op0));
7891
7892       switch (code)
7893         {
7894         case LE:
7895           if ((unsigned HOST_WIDE_INT) const_val != max_val >> 1)
7896             code = LT,  op1 = GEN_INT (const_val + 1);
7897           break;
7898
7899         /* When cross-compiling, const_val might be sign-extended from
7900            BITS_PER_WORD to HOST_BITS_PER_WIDE_INT */
7901         case GE:
7902           if ((HOST_WIDE_INT) (const_val & max_val)
7903               != (((HOST_WIDE_INT) 1
7904                    << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
7905             code = GT, op1 = GEN_INT (const_val - 1);
7906           break;
7907
7908         case LEU:
7909           if (uconst_val < max_val)
7910             code = LTU, op1 = GEN_INT (uconst_val + 1);
7911           break;
7912
7913         case GEU:
7914           if (uconst_val != 0)
7915             code = GTU, op1 = GEN_INT (uconst_val - 1);
7916           break;
7917
7918         default:
7919           break;
7920         }
7921     }
7922
7923   /* If this was floating-point and we reversed anything other than an
7924      EQ or NE, return zero.  */
7925   if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
7926       && did_reverse_condition && code != NE && code != EQ
7927       && ! flag_fast_math
7928       && GET_MODE_CLASS (GET_MODE (op0)) == MODE_FLOAT)
7929     return 0;
7930
7931 #ifdef HAVE_cc0
7932   /* Never return CC0; return zero instead.  */
7933   if (op0 == cc0_rtx)
7934     return 0;
7935 #endif
7936
7937   return gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
7938 }
7939
7940 /* Similar to above routine, except that we also put an invariant last
7941    unless both operands are invariants.  */
7942
7943 rtx
7944 get_condition_for_loop (x)
7945      rtx x;
7946 {
7947   rtx comparison = get_condition (x, NULL_PTR);
7948
7949   if (comparison == 0
7950       || ! invariant_p (XEXP (comparison, 0))
7951       || invariant_p (XEXP (comparison, 1)))
7952     return comparison;
7953
7954   return gen_rtx_fmt_ee (swap_condition (GET_CODE (comparison)), VOIDmode,
7955                          XEXP (comparison, 1), XEXP (comparison, 0));
7956 }
7957
7958 #ifdef HAVE_decrement_and_branch_on_count
7959 /* Instrument loop for insertion of bct instruction.  We distinguish between
7960    loops with compile-time bounds and those with run-time bounds. 
7961    Information from loop_iterations() is used to compute compile-time bounds.
7962    Run-time bounds should use loop preconditioning, but currently ignored.
7963  */
7964
7965 static void
7966 insert_bct (loop_start, loop_end)
7967      rtx loop_start, loop_end;
7968 {
7969   int i;
7970   unsigned HOST_WIDE_INT n_iterations;
7971
7972   int increment_direction, compare_direction;
7973
7974   /* If the loop condition is <= or >=, the number of iteration
7975       is 1 more than the range of the bounds of the loop.  */
7976   int add_iteration = 0;
7977
7978   enum machine_mode loop_var_mode = word_mode;
7979
7980   int loop_num = uid_loop_num [INSN_UID (loop_start)];
7981
7982   /* It's impossible to instrument a competely unrolled loop.  */
7983   if (loop_unroll_factor [loop_num] == -1)
7984     return;
7985
7986   /* Make sure that the count register is not in use.  */
7987   if (loop_used_count_register [loop_num])
7988     {
7989       if (loop_dump_stream)
7990         fprintf (loop_dump_stream,
7991                  "insert_bct %d: BCT instrumentation failed: count register already in use\n",
7992                  loop_num);
7993       return;
7994     }
7995
7996   /* Make sure that the function has no indirect jumps.  */
7997   if (indirect_jump_in_function)
7998     {
7999       if (loop_dump_stream)
8000         fprintf (loop_dump_stream,
8001                  "insert_bct %d: BCT instrumentation failed: indirect jump in function\n",
8002                  loop_num);
8003       return;
8004     }
8005
8006   /* Make sure that the last loop insn is a conditional jump.  */
8007   if (GET_CODE (PREV_INSN (loop_end)) != JUMP_INSN
8008       || ! condjump_p (PREV_INSN (loop_end))
8009       || simplejump_p (PREV_INSN (loop_end)))
8010     {
8011       if (loop_dump_stream)
8012         fprintf (loop_dump_stream,
8013                  "insert_bct %d: BCT instrumentation failed: invalid jump at loop end\n",
8014                  loop_num);
8015       return;
8016     }
8017
8018   /* Make sure that the loop does not contain a function call
8019      (the count register might be altered by the called function).  */
8020   if (loop_has_call)
8021     {
8022       if (loop_dump_stream)
8023         fprintf (loop_dump_stream,
8024                  "insert_bct %d: BCT instrumentation failed: function call in loop\n",
8025                  loop_num);
8026       return;
8027     }
8028
8029   /* Make sure that the loop does not jump via a table.
8030      (the count register might be used to perform the branch on table).  */
8031   if (loop_has_tablejump)
8032     {
8033       if (loop_dump_stream)
8034         fprintf (loop_dump_stream,
8035                  "insert_bct %d: BCT instrumentation failed: computed branch in the loop\n",
8036                  loop_num);
8037       return;
8038     }
8039
8040   /* Account for loop unrolling in instrumented iteration count.  */
8041   if (loop_unroll_factor [loop_num] > 1)
8042     n_iterations = loop_n_iterations / loop_unroll_factor [loop_num];
8043   else
8044     n_iterations = loop_n_iterations;
8045
8046   if (n_iterations != 0 && n_iterations < 3)
8047     {
8048       /* Allow an enclosing outer loop to benefit if possible.  */
8049       if (loop_dump_stream)
8050         fprintf (loop_dump_stream,
8051                  "insert_bct %d: Too few iterations to benefit from BCT optimization\n",
8052                  loop_num);
8053       return;
8054     }
8055
8056   /* Try to instrument the loop.  */
8057
8058   /* Handle the simpler case, where the bounds are known at compile time.  */
8059   if (n_iterations > 0)
8060     {
8061       /* Mark all enclosing loops that they cannot use count register.  */
8062       for (i = loop_num; i != -1; i = loop_outer_loop[i])
8063         loop_used_count_register[i] = 1;
8064       instrument_loop_bct (loop_start, loop_end, GEN_INT (n_iterations));
8065       return;
8066     }
8067
8068   /* Handle the more complex case, that the bounds are NOT known
8069      at compile time.  In this case we generate run_time calculation
8070      of the number of iterations.  */
8071
8072   if (loop_iteration_var == 0)
8073     {
8074       if (loop_dump_stream)
8075         fprintf (loop_dump_stream,
8076                  "insert_bct %d: BCT Runtime Instrumentation failed: no loop iteration variable found\n",
8077                  loop_num);
8078       return;
8079     }
8080
8081   if (GET_MODE_CLASS (GET_MODE (loop_iteration_var)) != MODE_INT
8082       || GET_MODE_SIZE (GET_MODE (loop_iteration_var)) != UNITS_PER_WORD)
8083     {
8084       if (loop_dump_stream)
8085         fprintf (loop_dump_stream,
8086                  "insert_bct %d: BCT Runtime Instrumentation failed: loop variable not integer\n",
8087                  loop_num);
8088       return;
8089     }
8090
8091   /* With runtime bounds, if the compare is of the form '!=' we give up */
8092   if (loop_comparison_code == NE)
8093     {
8094       if (loop_dump_stream)
8095         fprintf (loop_dump_stream,
8096                  "insert_bct %d: BCT Runtime Instrumentation failed: runtime bounds with != comparison\n",
8097                  loop_num);
8098       return;
8099     }
8100 /* Use common loop preconditioning code instead.  */
8101 #if 0
8102   else
8103     {
8104       /* We rely on the existence of run-time guard to ensure that the
8105          loop executes at least once.  */
8106       rtx sequence;
8107       rtx iterations_num_reg;
8108
8109       unsigned HOST_WIDE_INT increment_value_abs
8110         = INTVAL (increment) * increment_direction;
8111
8112       /* make sure that the increment is a power of two, otherwise (an
8113          expensive) divide is needed.  */
8114       if (exact_log2 (increment_value_abs) == -1)
8115         {
8116           if (loop_dump_stream)
8117             fprintf (loop_dump_stream,
8118                      "insert_bct: not instrumenting BCT because the increment is not power of 2\n");
8119           return;
8120         }
8121
8122       /* compute the number of iterations */
8123       start_sequence ();
8124       {
8125         rtx temp_reg;
8126
8127         /* Again, the number of iterations is calculated by:
8128            ;
8129            ;                  compare-val - initial-val + (increment -1) + additional-iteration
8130            ; num_iterations = -----------------------------------------------------------------
8131            ;                                           increment
8132          */
8133         /* ??? Do we have to call copy_rtx here before passing rtx to
8134            expand_binop?  */
8135         if (compare_direction > 0)
8136           {
8137             /* <, <= :the loop variable is increasing */
8138             temp_reg = expand_binop (loop_var_mode, sub_optab,
8139                                      comparison_value, initial_value,
8140                                      NULL_RTX, 0, OPTAB_LIB_WIDEN);
8141           }
8142         else
8143           {
8144             temp_reg = expand_binop (loop_var_mode, sub_optab,
8145                                      initial_value, comparison_value,
8146                                      NULL_RTX, 0, OPTAB_LIB_WIDEN);
8147           }
8148
8149         if (increment_value_abs - 1 + add_iteration != 0)
8150           temp_reg = expand_binop (loop_var_mode, add_optab, temp_reg,
8151                                    GEN_INT (increment_value_abs - 1
8152                                             + add_iteration),
8153                                    NULL_RTX, 0, OPTAB_LIB_WIDEN);
8154
8155         if (increment_value_abs != 1)
8156           {
8157             /* ??? This will generate an expensive divide instruction for
8158                most targets.  The original authors apparently expected this
8159                to be a shift, since they test for power-of-2 divisors above,
8160                but just naively generating a divide instruction will not give 
8161                a shift.  It happens to work for the PowerPC target because
8162                the rs6000.md file has a divide pattern that emits shifts.
8163                It will probably not work for any other target.  */
8164             iterations_num_reg = expand_binop (loop_var_mode, sdiv_optab,
8165                                                temp_reg,
8166                                                GEN_INT (increment_value_abs),
8167                                                NULL_RTX, 0, OPTAB_LIB_WIDEN);
8168           }
8169         else
8170           iterations_num_reg = temp_reg;
8171       }
8172       sequence = gen_sequence ();
8173       end_sequence ();
8174       emit_insn_before (sequence, loop_start);
8175       instrument_loop_bct (loop_start, loop_end, iterations_num_reg);
8176     }
8177
8178   return;
8179 #endif /* Complex case */
8180 }
8181
8182 /* Instrument loop by inserting a bct in it as follows:
8183    1. A new counter register is created.
8184    2. In the head of the loop the new variable is initialized to the value
8185    passed in the loop_num_iterations parameter.
8186    3. At the end of the loop, comparison of the register with 0 is generated.
8187    The created comparison follows the pattern defined for the
8188    decrement_and_branch_on_count insn, so this insn will be generated.
8189    4. The branch on the old variable are deleted.  The compare must remain
8190    because it might be used elsewhere.  If the loop-variable or condition
8191    register are used elsewhere, they will be eliminated by flow.  */
8192
8193 static void
8194 instrument_loop_bct (loop_start, loop_end, loop_num_iterations)
8195      rtx loop_start, loop_end;
8196      rtx loop_num_iterations;
8197 {
8198   rtx counter_reg;
8199   rtx start_label;
8200   rtx sequence;
8201
8202   if (HAVE_decrement_and_branch_on_count)
8203     {
8204       if (loop_dump_stream)
8205         {
8206           fputs ("instrument_bct: Inserting BCT (", loop_dump_stream);
8207           if (GET_CODE (loop_num_iterations) == CONST_INT)
8208             fprintf (loop_dump_stream, HOST_WIDE_INT_PRINT_DEC,
8209                      INTVAL (loop_num_iterations));
8210           else
8211             fputs ("runtime", loop_dump_stream);
8212           fputs (" iterations)", loop_dump_stream);
8213         }
8214
8215       /* Discard original jump to continue loop.  Original compare result
8216          may still be live, so it cannot be discarded explicitly.  */
8217       delete_insn (PREV_INSN (loop_end));
8218
8219       /* Insert the label which will delimit the start of the loop.  */
8220       start_label = gen_label_rtx ();
8221       emit_label_after (start_label, loop_start);
8222
8223       /* Insert initialization of the count register into the loop header.  */
8224       start_sequence ();
8225       counter_reg = gen_reg_rtx (word_mode);
8226       emit_insn (gen_move_insn (counter_reg, loop_num_iterations));
8227       sequence = gen_sequence ();
8228       end_sequence ();
8229       emit_insn_before (sequence, loop_start);
8230
8231       /* Insert new comparison on the count register instead of the
8232          old one, generating the needed BCT pattern (that will be
8233          later recognized by assembly generation phase).  */
8234       emit_jump_insn_before (gen_decrement_and_branch_on_count (counter_reg,
8235                                                                 start_label),
8236                              loop_end);
8237       LABEL_NUSES (start_label)++;
8238     }
8239
8240 }
8241 #endif /* HAVE_decrement_and_branch_on_count */
8242
8243 /* Scan the function and determine whether it has indirect (computed) jumps.
8244
8245    This is taken mostly from flow.c; similar code exists elsewhere
8246    in the compiler.  It may be useful to put this into rtlanal.c.  */
8247 static int
8248 indirect_jump_in_function_p (start)
8249      rtx start;
8250 {
8251   rtx insn;
8252
8253   for (insn = start; insn; insn = NEXT_INSN (insn))
8254     if (computed_jump_p (insn))
8255       return 1;
8256
8257   return 0;
8258 }
8259
8260 /* Add MEM to the LOOP_MEMS array, if appropriate.  See the
8261    documentation for LOOP_MEMS for the definition of `appropriate'.
8262    This function is called from prescan_loop via for_each_rtx.  */
8263
8264 static int
8265 insert_loop_mem (mem, data)
8266      rtx *mem;
8267      void *data ATTRIBUTE_UNUSED;
8268 {
8269   int i;
8270   rtx m = *mem;
8271
8272   if (m == NULL_RTX)
8273     return 0;
8274
8275   switch (GET_CODE (m))
8276     {
8277     case MEM:
8278       break;
8279
8280     case CONST_DOUBLE:
8281       /* We're not interested in the MEM associated with a
8282          CONST_DOUBLE, so there's no need to traverse into this.  */
8283       return -1;
8284
8285     default:
8286       /* This is not a MEM.  */
8287       return 0;
8288     }
8289
8290   /* See if we've already seen this MEM.  */
8291   for (i = 0; i < loop_mems_idx; ++i)
8292     if (rtx_equal_p (m, loop_mems[i].mem)) 
8293       {
8294         if (GET_MODE (m) != GET_MODE (loop_mems[i].mem))
8295           /* The modes of the two memory accesses are different.  If
8296              this happens, something tricky is going on, and we just
8297              don't optimize accesses to this MEM.  */
8298           loop_mems[i].optimize = 0;
8299
8300         return 0;
8301       }
8302
8303   /* Resize the array, if necessary.  */
8304   if (loop_mems_idx == loop_mems_allocated) 
8305     {
8306       if (loop_mems_allocated != 0)
8307         loop_mems_allocated *= 2;
8308       else
8309         loop_mems_allocated = 32;
8310
8311       loop_mems = (loop_mem_info*) 
8312         xrealloc (loop_mems,
8313                   loop_mems_allocated * sizeof (loop_mem_info)); 
8314     }
8315
8316   /* Actually insert the MEM.  */
8317   loop_mems[loop_mems_idx].mem = m;
8318   /* We can't hoist this MEM out of the loop if it's a BLKmode MEM
8319      because we can't put it in a register.  We still store it in the
8320      table, though, so that if we see the same address later, but in a
8321      non-BLK mode, we'll not think we can optimize it at that point.  */
8322   loop_mems[loop_mems_idx].optimize = (GET_MODE (m) != BLKmode);
8323   loop_mems[loop_mems_idx].reg = NULL_RTX;
8324   ++loop_mems_idx;
8325
8326   return 0;
8327 }
8328
8329 /* Like load_mems, but also ensures that N_TIMES_SET,
8330    MAY_NOT_OPTIMIZE, REG_SINGLE_USAGE, and INSN_COUNT have the correct
8331    values after load_mems.  */
8332
8333 static void
8334 load_mems_and_recount_loop_regs_set (scan_start, end, loop_top, start,
8335                                      reg_single_usage, insn_count)
8336      rtx scan_start;
8337      rtx end;
8338      rtx loop_top;
8339      rtx start;
8340      varray_type reg_single_usage;
8341      int *insn_count;
8342 {
8343   int nregs = max_reg_num ();
8344
8345   load_mems (scan_start, end, loop_top, start);
8346   
8347   /* Recalculate n_times_set and friends since load_mems may have
8348      created new registers.  */
8349   if (max_reg_num () > nregs)
8350     {
8351       int i;
8352       int old_nregs;
8353
8354       old_nregs = nregs;
8355       nregs = max_reg_num ();
8356
8357       if ((unsigned) nregs > n_times_set->num_elements)
8358         {
8359           /* Grow all the arrays.  */
8360           VARRAY_GROW (n_times_set, nregs);
8361           VARRAY_GROW (n_times_used, nregs);
8362           VARRAY_GROW (may_not_optimize, nregs);
8363           if (reg_single_usage)
8364             VARRAY_GROW (reg_single_usage, nregs);
8365         }
8366       /* Clear the arrays */
8367       bzero ((char *) &n_times_set->data, nregs * sizeof (int));
8368       bzero ((char *) &may_not_optimize->data, nregs * sizeof (char));
8369       if (reg_single_usage)
8370         bzero ((char *) &reg_single_usage->data, nregs * sizeof (rtx));
8371
8372       count_loop_regs_set (loop_top ? loop_top : start, end,
8373                            may_not_optimize, reg_single_usage,
8374                            insn_count, nregs); 
8375
8376       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
8377         {
8378           VARRAY_CHAR (may_not_optimize, i) = 1;
8379           VARRAY_INT (n_times_set, i) = 1;
8380         }
8381       
8382 #ifdef AVOID_CCMODE_COPIES
8383       /* Don't try to move insns which set CC registers if we should not
8384          create CCmode register copies.  */
8385       for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
8386         if (GET_MODE_CLASS (GET_MODE (regno_reg_rtx[i])) == MODE_CC)
8387           VARRAY_CHAR (may_not_optimize, i) = 1;
8388 #endif
8389
8390       /* Set n_times_used for the new registers.  */
8391       bcopy ((char *) (&n_times_set->data.i[0] + old_nregs),
8392              (char *) (&n_times_used->data.i[0] + old_nregs),
8393              (nregs - old_nregs) * sizeof (int));
8394     }
8395 }
8396
8397 /* Move MEMs into registers for the duration of the loop.  SCAN_START
8398    is the first instruction in the loop (as it is executed).  The
8399    other parameters are as for next_insn_in_loop.  */
8400
8401 static void
8402 load_mems (scan_start, end, loop_top, start)
8403      rtx scan_start;
8404      rtx end;
8405      rtx loop_top;
8406      rtx start;
8407 {
8408   int maybe_never = 0;
8409   int i;
8410   rtx p;
8411   rtx label = NULL_RTX;
8412   rtx end_label;
8413
8414   if (loop_mems_idx > 0) 
8415     {
8416       /* Nonzero if the next instruction may never be executed.  */
8417       int next_maybe_never = 0;
8418
8419       /* Check to see if it's possible that some instructions in the
8420          loop are never executed.  */
8421       for (p = next_insn_in_loop (scan_start, scan_start, end, loop_top); 
8422            p != NULL_RTX && !maybe_never; 
8423            p = next_insn_in_loop (p, scan_start, end, loop_top))
8424         {
8425           if (GET_CODE (p) == CODE_LABEL)
8426             maybe_never = 1;
8427           else if (GET_CODE (p) == JUMP_INSN
8428                    /* If we enter the loop in the middle, and scan
8429                       around to the beginning, don't set maybe_never
8430                       for that.  This must be an unconditional jump,
8431                       otherwise the code at the top of the loop might
8432                       never be executed.  Unconditional jumps are
8433                       followed a by barrier then loop end.  */
8434                    && ! (GET_CODE (p) == JUMP_INSN 
8435                          && JUMP_LABEL (p) == loop_top
8436                          && NEXT_INSN (NEXT_INSN (p)) == end
8437                          && simplejump_p (p)))
8438             {
8439               if (!condjump_p (p))
8440                 /* Something complicated.  */
8441                 maybe_never = 1;
8442               else
8443                 /* If there are any more instructions in the loop, they
8444                    might not be reached.  */
8445                 next_maybe_never = 1; 
8446             } 
8447           else if (next_maybe_never)
8448             maybe_never = 1;
8449         }
8450
8451       /* Actually move the MEMs.  */
8452       for (i = 0; i < loop_mems_idx; ++i) 
8453         {
8454           int j;
8455           int written = 0;
8456           rtx reg;
8457           rtx mem = loop_mems[i].mem;
8458
8459           if (MEM_VOLATILE_P (mem) 
8460               || invariant_p (XEXP (mem, 0)) != 1)
8461             /* There's no telling whether or not MEM is modified.  */
8462             loop_mems[i].optimize = 0;
8463
8464           /* Go through the MEMs written to in the loop to see if this
8465              one is aliased by one of them.  */
8466           for (j = 0; j < loop_store_mems_idx; ++j) 
8467             {
8468               if (rtx_equal_p (mem, loop_store_mems[j]))
8469                 written = 1;
8470               else if (true_dependence (loop_store_mems[j], VOIDmode,
8471                                         mem, rtx_varies_p))
8472                 {
8473                   /* MEM is indeed aliased by this store.  */
8474                   loop_mems[i].optimize = 0;
8475                   break;
8476                 }
8477             }
8478           
8479           /* If this MEM is written to, we must be sure that there
8480              are no reads from another MEM that aliases this one.  */ 
8481           if (loop_mems[i].optimize && written)
8482             {
8483               int j;
8484
8485               for (j = 0; j < loop_mems_idx; ++j)
8486                 {
8487                   if (j == i)
8488                     continue;
8489                   else if (true_dependence (mem,
8490                                             VOIDmode,
8491                                             loop_mems[j].mem,
8492                                             rtx_varies_p))
8493                     {
8494                       /* It's not safe to hoist loop_mems[i] out of
8495                          the loop because writes to it might not be
8496                          seen by reads from loop_mems[j].  */
8497                       loop_mems[i].optimize = 0;
8498                       break;
8499                     }
8500                 }
8501             }
8502
8503           if (maybe_never && may_trap_p (mem))
8504             /* We can't access the MEM outside the loop; it might
8505                cause a trap that wouldn't have happened otherwise.  */
8506             loop_mems[i].optimize = 0;
8507           
8508           if (!loop_mems[i].optimize)
8509             /* We thought we were going to lift this MEM out of the
8510                loop, but later discovered that we could not.  */
8511             continue;
8512
8513           /* Allocate a pseudo for this MEM.  We set REG_USERVAR_P in
8514              order to keep scan_loop from moving stores to this MEM
8515              out of the loop just because this REG is neither a
8516              user-variable nor used in the loop test.  */
8517           reg = gen_reg_rtx (GET_MODE (mem));
8518           REG_USERVAR_P (reg) = 1;
8519           loop_mems[i].reg = reg;
8520
8521           /* Now, replace all references to the MEM with the
8522              corresponding pesudos.  */
8523           for (p = next_insn_in_loop (scan_start, scan_start, end, loop_top);
8524                p != NULL_RTX;
8525                p = next_insn_in_loop (p, scan_start, end, loop_top))
8526             {
8527               rtx_and_int ri;
8528               ri.r = p;
8529               ri.i = i;
8530               for_each_rtx (&p, replace_loop_mem, &ri);
8531             }
8532
8533           if (!apply_change_group ())
8534             /* We couldn't replace all occurrences of the MEM.  */
8535             loop_mems[i].optimize = 0;
8536           else
8537             {
8538               rtx set;
8539
8540               /* Load the memory immediately before START, which is
8541                  the NOTE_LOOP_BEG.  */
8542               set = gen_rtx_SET (GET_MODE (reg), reg, mem);
8543               emit_insn_before (set, start);
8544
8545               if (written)
8546                 {
8547                   if (label == NULL_RTX)
8548                     {
8549                       /* We must compute the former
8550                          right-after-the-end label before we insert
8551                          the new one.  */
8552                       end_label = next_label (end);
8553                       label = gen_label_rtx ();
8554                       emit_label_after (label, end);
8555                     }
8556
8557                   /* Store the memory immediately after END, which is
8558                    the NOTE_LOOP_END.  */
8559                   set = gen_rtx_SET (GET_MODE (reg), copy_rtx (mem), reg); 
8560                   emit_insn_after (set, label);
8561                 }
8562
8563               if (loop_dump_stream)
8564                 {
8565                   fprintf (loop_dump_stream, "Hoisted regno %d %s from ",
8566                            REGNO (reg), (written ? "r/w" : "r/o"));
8567                   print_rtl (loop_dump_stream, mem);
8568                   fputc ('\n', loop_dump_stream);
8569                 }
8570             }
8571         }
8572     }
8573
8574   if (label != NULL_RTX)
8575     {
8576       /* Now, we need to replace all references to the previous exit
8577          label with the new one.  */
8578       rtx_pair rr; 
8579       rr.r1 = end_label;
8580       rr.r2 = label;
8581
8582       for (p = start; p != end; p = NEXT_INSN (p))
8583         {
8584           for_each_rtx (&p, replace_label, &rr);
8585
8586           /* If this is a JUMP_INSN, then we also need to fix the JUMP_LABEL
8587              field.  This is not handled by for_each_rtx because it doesn't
8588              handle unprinted ('0') fields.  We need to update JUMP_LABEL
8589              because the immediately following unroll pass will use it.
8590              replace_label would not work anyways, because that only handles
8591              LABEL_REFs.  */
8592           if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p) == end_label)
8593             JUMP_LABEL (p) = label;
8594         }
8595     }
8596 }
8597
8598 /* Replace MEM with its associated pseudo register.  This function is
8599    called from load_mems via for_each_rtx.  DATA is actually an
8600    rtx_and_int * describing the instruction currently being scanned
8601    and the MEM we are currently replacing.  */
8602
8603 static int
8604 replace_loop_mem (mem, data)
8605      rtx *mem;
8606      void *data;
8607 {
8608   rtx_and_int *ri; 
8609   rtx insn;
8610   int i;
8611   rtx m = *mem;
8612
8613   if (m == NULL_RTX)
8614     return 0;
8615
8616   switch (GET_CODE (m))
8617     {
8618     case MEM:
8619       break;
8620
8621     case CONST_DOUBLE:
8622       /* We're not interested in the MEM associated with a
8623          CONST_DOUBLE, so there's no need to traverse into one.  */
8624       return -1;
8625
8626     default:
8627       /* This is not a MEM.  */
8628       return 0;
8629     }
8630
8631   ri = (rtx_and_int*) data;
8632   i = ri->i;
8633
8634   if (!rtx_equal_p (loop_mems[i].mem, m))
8635     /* This is not the MEM we are currently replacing.  */
8636     return 0;
8637
8638   insn = ri->r;
8639
8640   /* Actually replace the MEM.  */
8641   validate_change (insn, mem, loop_mems[i].reg, 1);
8642
8643   return 0;
8644 }
8645
8646 /* Replace occurrences of the old exit label for the loop with the new
8647    one.  DATA is an rtx_pair containing the old and new labels,
8648    respectively.  */
8649
8650 static int
8651 replace_label (x, data)
8652      rtx *x;
8653      void *data;
8654 {
8655   rtx l = *x;
8656   rtx old_label = ((rtx_pair*) data)->r1;
8657   rtx new_label = ((rtx_pair*) data)->r2;
8658
8659   if (l == NULL_RTX)
8660     return 0;
8661
8662   if (GET_CODE (l) != LABEL_REF)
8663     return 0;
8664
8665   if (XEXP (l, 0) != old_label)
8666     return 0;
8667   
8668   XEXP (l, 0) = new_label;
8669   ++LABEL_NUSES (new_label);
8670   --LABEL_NUSES (old_label);
8671
8672   return 0;
8673 }
8674