OSDN Git Service

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