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