OSDN Git Service

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