OSDN Git Service

* combine.c (expand_compound_operation) <ZERO_EXTRACT>: Add
[pf3gnuchains/gcc-fork.git] / gcc / loop.c
1 /* Perform various loop optimizations, including strength reduction.
2    Copyright (C) 1987, 1988, 1989, 1991, 1992, 1993, 1994, 1995,
3    1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING.  If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA.  */
22
23 /* This is the loop optimization pass of the compiler.
24    It finds invariant computations within loops and moves them
25    to the beginning of the loop.  Then it identifies basic and
26    general induction variables.
27
28    Basic induction variables (BIVs) are a pseudo registers which are set within
29    a loop only by incrementing or decrementing its value.  General induction
30    variables (GIVs) are pseudo registers with a value which is a linear function
31    of a basic induction variable.  BIVs are recognized by `basic_induction_var';
32    GIVs by `general_induction_var'.
33
34    Once induction variables are identified, strength reduction is applied to the
35    general induction variables, and induction variable elimination is applied to
36    the basic induction variables.
37
38    It also finds cases where
39    a register is set within the loop by zero-extending a narrower value
40    and changes these to zero the entire register once before the loop
41    and merely copy the low part within the loop.
42
43    Most of the complexity is in heuristics to decide when it is worth
44    while to do these things.  */
45
46 #include "config.h"
47 #include "system.h"
48 #include "coretypes.h"
49 #include "tm.h"
50 #include "rtl.h"
51 #include "tm_p.h"
52 #include "function.h"
53 #include "expr.h"
54 #include "hard-reg-set.h"
55 #include "basic-block.h"
56 #include "insn-config.h"
57 #include "regs.h"
58 #include "recog.h"
59 #include "flags.h"
60 #include "real.h"
61 #include "cselib.h"
62 #include "except.h"
63 #include "toplev.h"
64 #include "predict.h"
65 #include "insn-flags.h"
66 #include "optabs.h"
67 #include "cfgloop.h"
68 #include "ggc.h"
69
70 /* Get the loop info pointer of a loop.  */
71 #define LOOP_INFO(LOOP) ((struct loop_info *) (LOOP)->aux)
72
73 /* Get a pointer to the loop movables structure.  */
74 #define LOOP_MOVABLES(LOOP) (&LOOP_INFO (LOOP)->movables)
75
76 /* Get a pointer to the loop registers structure.  */
77 #define LOOP_REGS(LOOP) (&LOOP_INFO (LOOP)->regs)
78
79 /* Get a pointer to the loop induction variables structure.  */
80 #define LOOP_IVS(LOOP) (&LOOP_INFO (LOOP)->ivs)
81
82 /* Get the luid of an insn.  Catch the error of trying to reference the LUID
83    of an insn added during loop, since these don't have LUIDs.  */
84
85 #define INSN_LUID(INSN)                 \
86   (INSN_UID (INSN) < max_uid_for_loop ? uid_luid[INSN_UID (INSN)] \
87    : (abort (), -1))
88
89 #define REGNO_FIRST_LUID(REGNO)                 \
90   (REGNO_FIRST_UID (REGNO) < max_uid_for_loop   \
91         ? uid_luid[REGNO_FIRST_UID (REGNO)]     \
92         : 0)
93 #define REGNO_LAST_LUID(REGNO)                  \
94   (REGNO_LAST_UID (REGNO) < max_uid_for_loop    \
95         ? uid_luid[REGNO_LAST_UID (REGNO)]      \
96         : INT_MAX)
97
98 /* A "basic induction variable" or biv is a pseudo reg that is set
99    (within this loop) only by incrementing or decrementing it.  */
100 /* A "general induction variable" or giv is a pseudo reg whose
101    value is a linear function of a biv.  */
102
103 /* Bivs are recognized by `basic_induction_var';
104    Givs by `general_induction_var'.  */
105
106 /* An enum for the two different types of givs, those that are used
107    as memory addresses and those that are calculated into registers.  */
108 enum g_types
109 {
110   DEST_ADDR,
111   DEST_REG
112 };
113
114
115 /* A `struct induction' is created for every instruction that sets
116    an induction variable (either a biv or a giv).  */
117
118 struct induction
119 {
120   rtx insn;                     /* The insn that sets a biv or giv */
121   rtx new_reg;                  /* New register, containing strength reduced
122                                    version of this giv.  */
123   rtx src_reg;                  /* Biv from which this giv is computed.
124                                    (If this is a biv, then this is the biv.) */
125   enum g_types giv_type;        /* Indicate whether DEST_ADDR or DEST_REG */
126   rtx dest_reg;                 /* Destination register for insn: this is the
127                                    register which was the biv or giv.
128                                    For a biv, this equals src_reg.
129                                    For a DEST_ADDR type giv, this is 0.  */
130   rtx *location;                /* Place in the insn where this giv occurs.
131                                    If GIV_TYPE is DEST_REG, this is 0.  */
132                                 /* For a biv, this is the place where add_val
133                                    was found.  */
134   enum machine_mode mode;       /* The mode of this biv or giv */
135   rtx mem;                      /* For DEST_ADDR, the memory object.  */
136   rtx mult_val;                 /* Multiplicative factor for src_reg.  */
137   rtx add_val;                  /* Additive constant for that product.  */
138   int benefit;                  /* Gain from eliminating this insn.  */
139   rtx final_value;              /* If the giv is used outside the loop, and its
140                                    final value could be calculated, it is put
141                                    here, and the giv is made replaceable.  Set
142                                    the giv to this value before the loop.  */
143   unsigned combined_with;       /* The number of givs this giv has been
144                                    combined with.  If nonzero, this giv
145                                    cannot combine with any other giv.  */
146   unsigned replaceable : 1;     /* 1 if we can substitute the strength-reduced
147                                    variable for the original variable.
148                                    0 means they must be kept separate and the
149                                    new one must be copied into the old pseudo
150                                    reg each time the old one is set.  */
151   unsigned not_replaceable : 1; /* Used to prevent duplicating work.  This is
152                                    1 if we know that the giv definitely can
153                                    not be made replaceable, in which case we
154                                    don't bother checking the variable again
155                                    even if further info is available.
156                                    Both this and the above can be zero.  */
157   unsigned ignore : 1;          /* 1 prohibits further processing of giv */
158   unsigned always_computable : 1;/* 1 if this value is computable every
159                                     iteration.  */
160   unsigned always_executed : 1; /* 1 if this set occurs each iteration.  */
161   unsigned maybe_multiple : 1;  /* Only used for a biv and  1 if this biv
162                                    update may be done multiple times per
163                                    iteration.  */
164   unsigned cant_derive : 1;     /* For giv's, 1 if this giv cannot derive
165                                    another giv.  This occurs in many cases
166                                    where a giv's lifetime spans an update to
167                                    a biv.  */
168   unsigned maybe_dead : 1;      /* 1 if this giv might be dead.  In that case,
169                                    we won't use it to eliminate a biv, it
170                                    would probably lose.  */
171   unsigned auto_inc_opt : 1;    /* 1 if this giv had its increment output next
172                                    to it to try to form an auto-inc address.  */
173   unsigned shared : 1;
174   unsigned no_const_addval : 1; /* 1 if add_val does not contain a const.  */
175   int lifetime;                 /* Length of life of this giv */
176   rtx derive_adjustment;        /* If nonzero, is an adjustment to be
177                                    subtracted from add_val when this giv
178                                    derives another.  This occurs when the
179                                    giv spans a biv update by incrementation.  */
180   rtx ext_dependent;            /* If nonzero, is a sign or zero extension
181                                    if a biv on which this giv is dependent.  */
182   struct induction *next_iv;    /* For givs, links together all givs that are
183                                    based on the same biv.  For bivs, links
184                                    together all biv entries that refer to the
185                                    same biv register.  */
186   struct induction *same;       /* For givs, if the giv has been combined with
187                                    another giv, this points to the base giv.
188                                    The base giv will have COMBINED_WITH nonzero.
189                                    For bivs, if the biv has the same LOCATION
190                                    than another biv, this points to the base
191                                    biv.  */
192   struct induction *same_insn;  /* If there are multiple identical givs in
193                                    the same insn, then all but one have this
194                                    field set, and they all point to the giv
195                                    that doesn't have this field set.  */
196   rtx last_use;                 /* For a giv made from a biv increment, this is
197                                    a substitute for the lifetime information.  */
198 };
199
200
201 /* A `struct iv_class' is created for each biv.  */
202
203 struct iv_class
204 {
205   unsigned int regno;           /* Pseudo reg which is the biv.  */
206   int biv_count;                /* Number of insns setting this reg.  */
207   struct induction *biv;        /* List of all insns that set this reg.  */
208   int giv_count;                /* Number of DEST_REG givs computed from this
209                                    biv.  The resulting count is only used in
210                                    check_dbra_loop.  */
211   struct induction *giv;        /* List of all insns that compute a giv
212                                    from this reg.  */
213   int total_benefit;            /* Sum of BENEFITs of all those givs.  */
214   rtx initial_value;            /* Value of reg at loop start.  */
215   rtx initial_test;             /* Test performed on BIV before loop.  */
216   rtx final_value;              /* Value of reg at loop end, if known.  */
217   struct iv_class *next;        /* Links all class structures together.  */
218   rtx init_insn;                /* insn which initializes biv, 0 if none.  */
219   rtx init_set;                 /* SET of INIT_INSN, if any.  */
220   unsigned incremented : 1;     /* 1 if somewhere incremented/decremented */
221   unsigned eliminable : 1;      /* 1 if plausible candidate for
222                                    elimination.  */
223   unsigned nonneg : 1;          /* 1 if we added a REG_NONNEG note for
224                                    this.  */
225   unsigned reversed : 1;        /* 1 if we reversed the loop that this
226                                    biv controls.  */
227   unsigned all_reduced : 1;     /* 1 if all givs using this biv have
228                                    been reduced.  */
229 };
230
231
232 /* Definitions used by the basic induction variable discovery code.  */
233 enum iv_mode
234 {
235   UNKNOWN_INDUCT,
236   BASIC_INDUCT,
237   NOT_BASIC_INDUCT,
238   GENERAL_INDUCT
239 };
240
241
242 /* A `struct iv' is created for every register.  */
243
244 struct iv
245 {
246   enum iv_mode type;
247   union
248   {
249     struct iv_class *class;
250     struct induction *info;
251   } iv;
252 };
253
254
255 #define REG_IV_TYPE(ivs, n) ivs->regs[n].type
256 #define REG_IV_INFO(ivs, n) ivs->regs[n].iv.info
257 #define REG_IV_CLASS(ivs, n) ivs->regs[n].iv.class
258
259
260 struct loop_ivs
261 {
262   /* Indexed by register number, contains pointer to `struct
263      iv' if register is an induction variable.  */
264   struct iv *regs;
265
266   /* Size of regs array.  */
267   unsigned int n_regs;
268
269   /* The head of a list which links together (via the next field)
270      every iv class for the current loop.  */
271   struct iv_class *list;
272 };
273
274
275 typedef struct loop_mem_info
276 {
277   rtx mem;      /* The MEM itself.  */
278   rtx reg;      /* Corresponding pseudo, if any.  */
279   int optimize; /* Nonzero if we can optimize access to this MEM.  */
280 } loop_mem_info;
281
282
283
284 struct loop_reg
285 {
286   /* Number of times the reg is set during the loop being scanned.
287      During code motion, a negative value indicates a reg that has
288      been made a candidate; in particular -2 means that it is an
289      candidate that we know is equal to a constant and -1 means that
290      it is a candidate not known equal to a constant.  After code
291      motion, regs moved have 0 (which is accurate now) while the
292      failed candidates have the original number of times set.
293
294      Therefore, at all times, == 0 indicates an invariant register;
295      < 0 a conditionally invariant one.  */
296   int set_in_loop;
297
298   /* Original value of set_in_loop; same except that this value
299      is not set negative for a reg whose sets have been made candidates
300      and not set to 0 for a reg that is moved.  */
301   int n_times_set;
302
303   /* Contains the insn in which a register was used if it was used
304      exactly once; contains const0_rtx if it was used more than once.  */
305   rtx single_usage;
306
307   /* Nonzero indicates that the register cannot be moved or strength
308      reduced.  */
309   char may_not_optimize;
310
311   /* Nonzero means reg N has already been moved out of one loop.
312      This reduces the desire to move it out of another.  */
313   char moved_once;
314 };
315
316
317 struct loop_regs
318 {
319   int num;                      /* Number of regs used in table.  */
320   int size;                     /* Size of table.  */
321   struct loop_reg *array;       /* Register usage info. array.  */
322   int multiple_uses;            /* Nonzero if a reg has multiple uses.  */
323 };
324
325
326
327 struct loop_movables
328 {
329   /* Head of movable chain.  */
330   struct movable *head;
331   /* Last movable in chain.  */
332   struct movable *last;
333 };
334
335
336 /* Information pertaining to a loop.  */
337
338 struct loop_info
339 {
340   /* Nonzero if there is a subroutine call in the current loop.  */
341   int has_call;
342   /* Nonzero if there is a libcall in the current loop.  */
343   int has_libcall;
344   /* Nonzero if there is a non constant call in the current loop.  */
345   int has_nonconst_call;
346   /* Nonzero if there is a prefetch instruction in the current loop.  */
347   int has_prefetch;
348   /* Nonzero if there is a volatile memory reference in the current
349      loop.  */
350   int has_volatile;
351   /* Nonzero if there is a tablejump in the current loop.  */
352   int has_tablejump;
353   /* Nonzero if there are ways to leave the loop other than falling
354      off the end.  */
355   int has_multiple_exit_targets;
356   /* Nonzero if there is an indirect jump in the current function.  */
357   int has_indirect_jump;
358   /* Register or constant initial loop value.  */
359   rtx initial_value;
360   /* Register or constant value used for comparison test.  */
361   rtx comparison_value;
362   /* Register or constant approximate final value.  */
363   rtx final_value;
364   /* Register or constant initial loop value with term common to
365      final_value removed.  */
366   rtx initial_equiv_value;
367   /* Register or constant final loop value with term common to
368      initial_value removed.  */
369   rtx final_equiv_value;
370   /* Register corresponding to iteration variable.  */
371   rtx iteration_var;
372   /* Constant loop increment.  */
373   rtx increment;
374   enum rtx_code comparison_code;
375   /* Holds the number of loop iterations.  It is zero if the number
376      could not be calculated.  Must be unsigned since the number of
377      iterations can be as high as 2^wordsize - 1.  For loops with a
378      wider iterator, this number will be zero if the number of loop
379      iterations is too large for an unsigned integer to hold.  */
380   unsigned HOST_WIDE_INT n_iterations;
381   int used_count_register;
382   /* The loop iterator induction variable.  */
383   struct iv_class *iv;
384   /* List of MEMs that are stored in this loop.  */
385   rtx store_mems;
386   /* Array of MEMs that are used (read or written) in this loop, but
387      cannot be aliased by anything in this loop, except perhaps
388      themselves.  In other words, if mems[i] is altered during
389      the loop, it is altered by an expression that is rtx_equal_p to
390      it.  */
391   loop_mem_info *mems;
392   /* The index of the next available slot in MEMS.  */
393   int mems_idx;
394   /* The number of elements allocated in MEMS.  */
395   int mems_allocated;
396   /* Nonzero if we don't know what MEMs were changed in the current
397      loop.  This happens if the loop contains a call (in which case
398      `has_call' will also be set) or if we store into more than
399      NUM_STORES MEMs.  */
400   int unknown_address_altered;
401   /* The above doesn't count any readonly memory locations that are
402      stored.  This does.  */
403   int unknown_constant_address_altered;
404   /* Count of memory write instructions discovered in the loop.  */
405   int num_mem_sets;
406   /* The insn where the first of these was found.  */
407   rtx first_loop_store_insn;
408   /* The chain of movable insns in loop.  */
409   struct loop_movables movables;
410   /* The registers used the in loop.  */
411   struct loop_regs regs;
412   /* The induction variable information in loop.  */
413   struct loop_ivs ivs;
414   /* Nonzero if call is in pre_header extended basic block.  */
415   int pre_header_has_call;
416 };
417
418 /* Not really meaningful values, but at least something.  */
419 #ifndef SIMULTANEOUS_PREFETCHES
420 #define SIMULTANEOUS_PREFETCHES 3
421 #endif
422 #ifndef PREFETCH_BLOCK
423 #define PREFETCH_BLOCK 32
424 #endif
425 #ifndef HAVE_prefetch
426 #define HAVE_prefetch 0
427 #define CODE_FOR_prefetch 0
428 #define gen_prefetch(a,b,c) (abort(), NULL_RTX)
429 #endif
430
431 /* Give up the prefetch optimizations once we exceed a given threshold.
432    It is unlikely that we would be able to optimize something in a loop
433    with so many detected prefetches.  */
434 #define MAX_PREFETCHES 100
435 /* The number of prefetch blocks that are beneficial to fetch at once before
436    a loop with a known (and low) iteration count.  */
437 #define PREFETCH_BLOCKS_BEFORE_LOOP_MAX  6
438 /* For very tiny loops it is not worthwhile to prefetch even before the loop,
439    since it is likely that the data are already in the cache.  */
440 #define PREFETCH_BLOCKS_BEFORE_LOOP_MIN  2
441
442 /* Parameterize some prefetch heuristics so they can be turned on and off
443    easily for performance testing on new architectures.  These can be
444    defined in target-dependent files.  */
445
446 /* Prefetch is worthwhile only when loads/stores are dense.  */
447 #ifndef PREFETCH_ONLY_DENSE_MEM
448 #define PREFETCH_ONLY_DENSE_MEM 1
449 #endif
450
451 /* Define what we mean by "dense" loads and stores; This value divided by 256
452    is the minimum percentage of memory references that worth prefetching.  */
453 #ifndef PREFETCH_DENSE_MEM
454 #define PREFETCH_DENSE_MEM 220
455 #endif
456
457 /* Do not prefetch for a loop whose iteration count is known to be low.  */
458 #ifndef PREFETCH_NO_LOW_LOOPCNT
459 #define PREFETCH_NO_LOW_LOOPCNT 1
460 #endif
461
462 /* Define what we mean by a "low" iteration count.  */
463 #ifndef PREFETCH_LOW_LOOPCNT
464 #define PREFETCH_LOW_LOOPCNT 32
465 #endif
466
467 /* Do not prefetch for a loop that contains a function call; such a loop is
468    probably not an internal loop.  */
469 #ifndef PREFETCH_NO_CALL
470 #define PREFETCH_NO_CALL 1
471 #endif
472
473 /* Do not prefetch accesses with an extreme stride.  */
474 #ifndef PREFETCH_NO_EXTREME_STRIDE
475 #define PREFETCH_NO_EXTREME_STRIDE 1
476 #endif
477
478 /* Define what we mean by an "extreme" stride.  */
479 #ifndef PREFETCH_EXTREME_STRIDE
480 #define PREFETCH_EXTREME_STRIDE 4096
481 #endif
482
483 /* Define a limit to how far apart indices can be and still be merged
484    into a single prefetch.  */
485 #ifndef PREFETCH_EXTREME_DIFFERENCE
486 #define PREFETCH_EXTREME_DIFFERENCE 4096
487 #endif
488
489 /* Issue prefetch instructions before the loop to fetch data to be used
490    in the first few loop iterations.  */
491 #ifndef PREFETCH_BEFORE_LOOP
492 #define PREFETCH_BEFORE_LOOP 1
493 #endif
494
495 /* Do not handle reversed order prefetches (negative stride).  */
496 #ifndef PREFETCH_NO_REVERSE_ORDER
497 #define PREFETCH_NO_REVERSE_ORDER 1
498 #endif
499
500 /* Prefetch even if the GIV is in conditional code.  */
501 #ifndef PREFETCH_CONDITIONAL
502 #define PREFETCH_CONDITIONAL 1
503 #endif
504
505 #define LOOP_REG_LIFETIME(LOOP, REGNO) \
506 ((REGNO_LAST_LUID (REGNO) - REGNO_FIRST_LUID (REGNO)))
507
508 #define LOOP_REG_GLOBAL_P(LOOP, REGNO) \
509 ((REGNO_LAST_LUID (REGNO) > INSN_LUID ((LOOP)->end) \
510  || REGNO_FIRST_LUID (REGNO) < INSN_LUID ((LOOP)->start)))
511
512 #define LOOP_REGNO_NREGS(REGNO, SET_DEST) \
513 ((REGNO) < FIRST_PSEUDO_REGISTER \
514  ? (int) hard_regno_nregs[(REGNO)][GET_MODE (SET_DEST)] : 1)
515
516
517 /* Vector mapping INSN_UIDs to luids.
518    The luids are like uids but increase monotonically always.
519    We use them to see whether a jump comes from outside a given loop.  */
520
521 static int *uid_luid;
522
523 /* Indexed by INSN_UID, contains the ordinal giving the (innermost) loop
524    number the insn is contained in.  */
525
526 static struct loop **uid_loop;
527
528 /* 1 + largest uid of any insn.  */
529
530 static int max_uid_for_loop;
531
532 /* Number of loops detected in current function.  Used as index to the
533    next few tables.  */
534
535 static int max_loop_num;
536
537 /* Bound on pseudo register number before loop optimization.
538    A pseudo has valid regscan info if its number is < max_reg_before_loop.  */
539 static unsigned int max_reg_before_loop;
540
541 /* The value to pass to the next call of reg_scan_update.  */
542 static int loop_max_reg;
543 \f
544 /* During the analysis of a loop, a chain of `struct movable's
545    is made to record all the movable insns found.
546    Then the entire chain can be scanned to decide which to move.  */
547
548 struct movable
549 {
550   rtx insn;                     /* A movable insn */
551   rtx set_src;                  /* The expression this reg is set from.  */
552   rtx set_dest;                 /* The destination of this SET.  */
553   rtx dependencies;             /* When INSN is libcall, this is an EXPR_LIST
554                                    of any registers used within the LIBCALL.  */
555   int consec;                   /* Number of consecutive following insns
556                                    that must be moved with this one.  */
557   unsigned int regno;           /* The register it sets */
558   short lifetime;               /* lifetime of that register;
559                                    may be adjusted when matching movables
560                                    that load the same value are found.  */
561   short savings;                /* Number of insns we can move for this reg,
562                                    including other movables that force this
563                                    or match this one.  */
564   ENUM_BITFIELD(machine_mode) savemode : 8;   /* Nonzero means it is a mode for
565                                    a low part that we should avoid changing when
566                                    clearing the rest of the reg.  */
567   unsigned int cond : 1;        /* 1 if only conditionally movable */
568   unsigned int force : 1;       /* 1 means MUST move this insn */
569   unsigned int global : 1;      /* 1 means reg is live outside this loop */
570                 /* If PARTIAL is 1, GLOBAL means something different:
571                    that the reg is live outside the range from where it is set
572                    to the following label.  */
573   unsigned int done : 1;        /* 1 inhibits further processing of this */
574
575   unsigned int partial : 1;     /* 1 means this reg is used for zero-extending.
576                                    In particular, moving it does not make it
577                                    invariant.  */
578   unsigned int move_insn : 1;   /* 1 means that we call emit_move_insn to
579                                    load SRC, rather than copying INSN.  */
580   unsigned int move_insn_first:1;/* Same as above, if this is necessary for the
581                                     first insn of a consecutive sets group.  */
582   unsigned int is_equiv : 1;    /* 1 means a REG_EQUIV is present on INSN.  */
583   unsigned int insert_temp : 1;  /* 1 means we copy to a new pseudo and replace
584                                     the original insn with a copy from that
585                                     pseudo, rather than deleting it.  */
586   struct movable *match;        /* First entry for same value */
587   struct movable *forces;       /* An insn that must be moved if this is */
588   struct movable *next;
589 };
590
591
592 static FILE *loop_dump_stream;
593
594 /* Forward declarations.  */
595
596 static void invalidate_loops_containing_label (rtx);
597 static void find_and_verify_loops (rtx, struct loops *);
598 static void mark_loop_jump (rtx, struct loop *);
599 static void prescan_loop (struct loop *);
600 static int reg_in_basic_block_p (rtx, rtx);
601 static int consec_sets_invariant_p (const struct loop *, rtx, int, rtx);
602 static int labels_in_range_p (rtx, int);
603 static void count_one_set (struct loop_regs *, rtx, rtx, rtx *);
604 static void note_addr_stored (rtx, rtx, void *);
605 static void note_set_pseudo_multiple_uses (rtx, rtx, void *);
606 static int loop_reg_used_before_p (const struct loop *, rtx, rtx);
607 static rtx find_regs_nested (rtx, rtx);
608 static void scan_loop (struct loop*, int);
609 #if 0
610 static void replace_call_address (rtx, rtx, rtx);
611 #endif
612 static rtx skip_consec_insns (rtx, int);
613 static int libcall_benefit (rtx);
614 static rtx libcall_other_reg (rtx, rtx);
615 static void record_excess_regs (rtx, rtx, rtx *);
616 static void ignore_some_movables (struct loop_movables *);
617 static void force_movables (struct loop_movables *);
618 static void combine_movables (struct loop_movables *, struct loop_regs *);
619 static int num_unmoved_movables (const struct loop *);
620 static int regs_match_p (rtx, rtx, struct loop_movables *);
621 static int rtx_equal_for_loop_p (rtx, rtx, struct loop_movables *,
622                                  struct loop_regs *);
623 static void add_label_notes (rtx, rtx);
624 static void move_movables (struct loop *loop, struct loop_movables *, int,
625                            int);
626 static void loop_movables_add (struct loop_movables *, struct movable *);
627 static void loop_movables_free (struct loop_movables *);
628 static int count_nonfixed_reads (const struct loop *, rtx);
629 static void loop_bivs_find (struct loop *);
630 static void loop_bivs_init_find (struct loop *);
631 static void loop_bivs_check (struct loop *);
632 static void loop_givs_find (struct loop *);
633 static void loop_givs_check (struct loop *);
634 static int loop_biv_eliminable_p (struct loop *, struct iv_class *, int, int);
635 static int loop_giv_reduce_benefit (struct loop *, struct iv_class *,
636                                     struct induction *, rtx);
637 static void loop_givs_dead_check (struct loop *, struct iv_class *);
638 static void loop_givs_reduce (struct loop *, struct iv_class *);
639 static void loop_givs_rescan (struct loop *, struct iv_class *, rtx *);
640 static void loop_ivs_free (struct loop *);
641 static void strength_reduce (struct loop *, int);
642 static void find_single_use_in_loop (struct loop_regs *, rtx, rtx);
643 static int valid_initial_value_p (rtx, rtx, int, rtx);
644 static void find_mem_givs (const struct loop *, rtx, rtx, int, int);
645 static void record_biv (struct loop *, struct induction *, rtx, rtx, rtx,
646                         rtx, rtx *, int, int);
647 static void check_final_value (const struct loop *, struct induction *);
648 static void loop_ivs_dump (const struct loop *, FILE *, int);
649 static void loop_iv_class_dump (const struct iv_class *, FILE *, int);
650 static void loop_biv_dump (const struct induction *, FILE *, int);
651 static void loop_giv_dump (const struct induction *, FILE *, int);
652 static void record_giv (const struct loop *, struct induction *, rtx, rtx,
653                         rtx, rtx, rtx, rtx, int, enum g_types, int, int,
654                         rtx *);
655 static void update_giv_derive (const struct loop *, rtx);
656 static void check_ext_dependent_givs (const struct loop *, struct iv_class *);
657 static int basic_induction_var (const struct loop *, rtx, enum machine_mode,
658                                 rtx, rtx, rtx *, rtx *, rtx **);
659 static rtx simplify_giv_expr (const struct loop *, rtx, rtx *, int *);
660 static int general_induction_var (const struct loop *loop, rtx, rtx *, rtx *,
661                                   rtx *, rtx *, int, int *, enum machine_mode);
662 static int consec_sets_giv (const struct loop *, int, rtx, rtx, rtx, rtx *,
663                             rtx *, rtx *, rtx *);
664 static int check_dbra_loop (struct loop *, int);
665 static rtx express_from_1 (rtx, rtx, rtx);
666 static rtx combine_givs_p (struct induction *, struct induction *);
667 static int cmp_combine_givs_stats (const void *, const void *);
668 static void combine_givs (struct loop_regs *, struct iv_class *);
669 static int product_cheap_p (rtx, rtx);
670 static int maybe_eliminate_biv (const struct loop *, struct iv_class *, int,
671                                 int, int);
672 static int maybe_eliminate_biv_1 (const struct loop *, rtx, rtx,
673                                   struct iv_class *, int, basic_block, rtx);
674 static int last_use_this_basic_block (rtx, rtx);
675 static void record_initial (rtx, rtx, void *);
676 static void update_reg_last_use (rtx, rtx);
677 static rtx next_insn_in_loop (const struct loop *, rtx);
678 static void loop_regs_scan (const struct loop *, int);
679 static int count_insns_in_loop (const struct loop *);
680 static int find_mem_in_note_1 (rtx *, void *);
681 static rtx find_mem_in_note (rtx);
682 static void load_mems (const struct loop *);
683 static int insert_loop_mem (rtx *, void *);
684 static int replace_loop_mem (rtx *, void *);
685 static void replace_loop_mems (rtx, rtx, rtx, int);
686 static int replace_loop_reg (rtx *, void *);
687 static void replace_loop_regs (rtx insn, rtx, rtx);
688 static void note_reg_stored (rtx, rtx, void *);
689 static void try_copy_prop (const struct loop *, rtx, unsigned int);
690 static void try_swap_copy_prop (const struct loop *, rtx, unsigned int);
691 static rtx check_insn_for_givs (struct loop *, rtx, int, int);
692 static rtx check_insn_for_bivs (struct loop *, rtx, int, int);
693 static rtx gen_add_mult (rtx, rtx, rtx, rtx);
694 static void loop_regs_update (const struct loop *, rtx);
695 static int iv_add_mult_cost (rtx, rtx, rtx, rtx);
696 static int loop_invariant_p (const struct loop *, rtx);
697 static rtx loop_insn_hoist (const struct loop *, rtx);
698 static void loop_iv_add_mult_emit_before (const struct loop *, rtx, rtx, rtx,
699                                           rtx, basic_block, rtx);
700 static rtx loop_insn_emit_before (const struct loop *, basic_block,
701                                   rtx, rtx);
702 static int loop_insn_first_p (rtx, rtx);
703 static rtx get_condition_for_loop (const struct loop *, rtx);
704 static void loop_iv_add_mult_sink (const struct loop *, rtx, rtx, rtx, rtx);
705 static void loop_iv_add_mult_hoist (const struct loop *, rtx, rtx, rtx, rtx);
706 static rtx extend_value_for_giv (struct induction *, rtx);
707 static rtx loop_insn_sink (const struct loop *, rtx);
708
709 static rtx loop_insn_emit_after (const struct loop *, basic_block, rtx, rtx);
710 static rtx loop_call_insn_emit_before (const struct loop *, basic_block,
711                                        rtx, rtx);
712 static rtx loop_call_insn_hoist (const struct loop *, rtx);
713 static rtx loop_insn_sink_or_swim (const struct loop *, rtx);
714
715 static void loop_dump_aux (const struct loop *, FILE *, int);
716 static void loop_delete_insns (rtx, rtx);
717 static HOST_WIDE_INT remove_constant_addition (rtx *);
718 static rtx gen_load_of_final_value (rtx, rtx);
719 void debug_ivs (const struct loop *);
720 void debug_iv_class (const struct iv_class *);
721 void debug_biv (const struct induction *);
722 void debug_giv (const struct induction *);
723 void debug_loop (const struct loop *);
724 void debug_loops (const struct loops *);
725
726 typedef struct loop_replace_args
727 {
728   rtx match;
729   rtx replacement;
730   rtx insn;
731 } loop_replace_args;
732
733 /* Nonzero iff INSN is between START and END, inclusive.  */
734 #define INSN_IN_RANGE_P(INSN, START, END)       \
735   (INSN_UID (INSN) < max_uid_for_loop           \
736    && INSN_LUID (INSN) >= INSN_LUID (START)     \
737    && INSN_LUID (INSN) <= INSN_LUID (END))
738
739 /* Indirect_jump_in_function is computed once per function.  */
740 static int indirect_jump_in_function;
741 static int indirect_jump_in_function_p (rtx);
742
743 static int compute_luids (rtx, rtx, int);
744
745 static int biv_elimination_giv_has_0_offset (struct induction *,
746                                              struct induction *, rtx);
747 \f
748 /* Benefit penalty, if a giv is not replaceable, i.e. must emit an insn to
749    copy the value of the strength reduced giv to its original register.  */
750 static int copy_cost;
751
752 /* Cost of using a register, to normalize the benefits of a giv.  */
753 static int reg_address_cost;
754
755 void
756 init_loop (void)
757 {
758   rtx reg = gen_rtx_REG (word_mode, LAST_VIRTUAL_REGISTER + 1);
759
760   reg_address_cost = address_cost (reg, SImode);
761
762   copy_cost = COSTS_N_INSNS (1);
763 }
764 \f
765 /* Compute the mapping from uids to luids.
766    LUIDs are numbers assigned to insns, like uids,
767    except that luids increase monotonically through the code.
768    Start at insn START and stop just before END.  Assign LUIDs
769    starting with PREV_LUID + 1.  Return the last assigned LUID + 1.  */
770 static int
771 compute_luids (rtx start, rtx end, int prev_luid)
772 {
773   int i;
774   rtx insn;
775
776   for (insn = start, i = prev_luid; insn != end; insn = NEXT_INSN (insn))
777     {
778       if (INSN_UID (insn) >= max_uid_for_loop)
779         continue;
780       /* Don't assign luids to line-number NOTEs, so that the distance in
781          luids between two insns is not affected by -g.  */
782       if (!NOTE_P (insn)
783           || NOTE_LINE_NUMBER (insn) <= 0)
784         uid_luid[INSN_UID (insn)] = ++i;
785       else
786         /* Give a line number note the same luid as preceding insn.  */
787         uid_luid[INSN_UID (insn)] = i;
788     }
789   return i + 1;
790 }
791 \f
792 /* Entry point of this file.  Perform loop optimization
793    on the current function.  F is the first insn of the function
794    and DUMPFILE is a stream for output of a trace of actions taken
795    (or 0 if none should be output).  */
796
797 void
798 loop_optimize (rtx f, FILE *dumpfile, int flags)
799 {
800   rtx insn;
801   int i;
802   struct loops loops_data;
803   struct loops *loops = &loops_data;
804   struct loop_info *loops_info;
805
806   loop_dump_stream = dumpfile;
807
808   init_recog_no_volatile ();
809
810   max_reg_before_loop = max_reg_num ();
811   loop_max_reg = max_reg_before_loop;
812
813   regs_may_share = 0;
814
815   /* Count the number of loops.  */
816
817   max_loop_num = 0;
818   for (insn = f; insn; insn = NEXT_INSN (insn))
819     {
820       if (NOTE_P (insn)
821           && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
822         max_loop_num++;
823     }
824
825   /* Don't waste time if no loops.  */
826   if (max_loop_num == 0)
827     return;
828
829   loops->num = max_loop_num;
830
831   /* Get size to use for tables indexed by uids.
832      Leave some space for labels allocated by find_and_verify_loops.  */
833   max_uid_for_loop = get_max_uid () + 1 + max_loop_num * 32;
834
835   uid_luid = xcalloc (max_uid_for_loop, sizeof (int));
836   uid_loop = xcalloc (max_uid_for_loop, sizeof (struct loop *));
837
838   /* Allocate storage for array of loops.  */
839   loops->array = xcalloc (loops->num, sizeof (struct loop));
840
841   /* Find and process each loop.
842      First, find them, and record them in order of their beginnings.  */
843   find_and_verify_loops (f, loops);
844
845   /* Allocate and initialize auxiliary loop information.  */
846   loops_info = xcalloc (loops->num, sizeof (struct loop_info));
847   for (i = 0; i < (int) loops->num; i++)
848     loops->array[i].aux = loops_info + i;
849
850   /* Now find all register lifetimes.  This must be done after
851      find_and_verify_loops, because it might reorder the insns in the
852      function.  */
853   reg_scan (f, max_reg_before_loop, 1);
854
855   /* This must occur after reg_scan so that registers created by gcse
856      will have entries in the register tables.
857
858      We could have added a call to reg_scan after gcse_main in toplev.c,
859      but moving this call to init_alias_analysis is more efficient.  */
860   init_alias_analysis ();
861
862   /* See if we went too far.  Note that get_max_uid already returns
863      one more that the maximum uid of all insn.  */
864   if (get_max_uid () > max_uid_for_loop)
865     abort ();
866   /* Now reset it to the actual size we need.  See above.  */
867   max_uid_for_loop = get_max_uid ();
868
869   /* find_and_verify_loops has already called compute_luids, but it
870      might have rearranged code afterwards, so we need to recompute
871      the luids now.  */
872   compute_luids (f, NULL_RTX, 0);
873
874   /* Don't leave gaps in uid_luid for insns that have been
875      deleted.  It is possible that the first or last insn
876      using some register has been deleted by cross-jumping.
877      Make sure that uid_luid for that former insn's uid
878      points to the general area where that insn used to be.  */
879   for (i = 0; i < max_uid_for_loop; i++)
880     {
881       uid_luid[0] = uid_luid[i];
882       if (uid_luid[0] != 0)
883         break;
884     }
885   for (i = 0; i < max_uid_for_loop; i++)
886     if (uid_luid[i] == 0)
887       uid_luid[i] = uid_luid[i - 1];
888
889   /* Determine if the function has indirect jump.  On some systems
890      this prevents low overhead loop instructions from being used.  */
891   indirect_jump_in_function = indirect_jump_in_function_p (f);
892
893   /* Now scan the loops, last ones first, since this means inner ones are done
894      before outer ones.  */
895   for (i = max_loop_num - 1; i >= 0; i--)
896     {
897       struct loop *loop = &loops->array[i];
898
899       if (! loop->invalid && loop->end)
900         {
901           scan_loop (loop, flags);
902           ggc_collect ();
903         }
904     }
905
906   end_alias_analysis ();
907
908   /* Clean up.  */
909   for (i = 0; i < (int) loops->num; i++)
910     free (loops_info[i].mems);
911   
912   free (uid_luid);
913   free (uid_loop);
914   free (loops_info);
915   free (loops->array);
916 }
917 \f
918 /* Returns the next insn, in execution order, after INSN.  START and
919    END are the NOTE_INSN_LOOP_BEG and NOTE_INSN_LOOP_END for the loop,
920    respectively.  LOOP->TOP, if non-NULL, is the top of the loop in the
921    insn-stream; it is used with loops that are entered near the
922    bottom.  */
923
924 static rtx
925 next_insn_in_loop (const struct loop *loop, rtx insn)
926 {
927   insn = NEXT_INSN (insn);
928
929   if (insn == loop->end)
930     {
931       if (loop->top)
932         /* Go to the top of the loop, and continue there.  */
933         insn = loop->top;
934       else
935         /* We're done.  */
936         insn = NULL_RTX;
937     }
938
939   if (insn == loop->scan_start)
940     /* We're done.  */
941     insn = NULL_RTX;
942
943   return insn;
944 }
945
946 /* Find any register references hidden inside X and add them to
947    the dependency list DEPS.  This is used to look inside CLOBBER (MEM
948    when checking whether a PARALLEL can be pulled out of a loop.  */
949
950 static rtx
951 find_regs_nested (rtx deps, rtx x)
952 {
953   enum rtx_code code = GET_CODE (x);
954   if (code == REG)
955     deps = gen_rtx_EXPR_LIST (VOIDmode, x, deps);
956   else
957     {
958       const char *fmt = GET_RTX_FORMAT (code);
959       int i, j;
960       for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
961         {
962           if (fmt[i] == 'e')
963             deps = find_regs_nested (deps, XEXP (x, i));
964           else if (fmt[i] == 'E')
965             for (j = 0; j < XVECLEN (x, i); j++)
966               deps = find_regs_nested (deps, XVECEXP (x, i, j));
967         }
968     }
969   return deps;
970 }
971
972 /* Optimize one loop described by LOOP.  */
973
974 /* ??? Could also move memory writes out of loops if the destination address
975    is invariant, the source is invariant, the memory write is not volatile,
976    and if we can prove that no read inside the loop can read this address
977    before the write occurs.  If there is a read of this address after the
978    write, then we can also mark the memory read as invariant.  */
979
980 static void
981 scan_loop (struct loop *loop, int flags)
982 {
983   struct loop_info *loop_info = LOOP_INFO (loop);
984   struct loop_regs *regs = LOOP_REGS (loop);
985   int i;
986   rtx loop_start = loop->start;
987   rtx loop_end = loop->end;
988   rtx p;
989   /* 1 if we are scanning insns that could be executed zero times.  */
990   int maybe_never = 0;
991   /* 1 if we are scanning insns that might never be executed
992      due to a subroutine call which might exit before they are reached.  */
993   int call_passed = 0;
994   /* Number of insns in the loop.  */
995   int insn_count;
996   int tem;
997   rtx temp, update_start, update_end;
998   /* The SET from an insn, if it is the only SET in the insn.  */
999   rtx set, set1;
1000   /* Chain describing insns movable in current loop.  */
1001   struct loop_movables *movables = LOOP_MOVABLES (loop);
1002   /* Ratio of extra register life span we can justify
1003      for saving an instruction.  More if loop doesn't call subroutines
1004      since in that case saving an insn makes more difference
1005      and more registers are available.  */
1006   int threshold;
1007   int in_libcall;
1008
1009   loop->top = 0;
1010
1011   movables->head = 0;
1012   movables->last = 0;
1013
1014   /* Determine whether this loop starts with a jump down to a test at
1015      the end.  This will occur for a small number of loops with a test
1016      that is too complex to duplicate in front of the loop.
1017
1018      We search for the first insn or label in the loop, skipping NOTEs.
1019      However, we must be careful not to skip past a NOTE_INSN_LOOP_BEG
1020      (because we might have a loop executed only once that contains a
1021      loop which starts with a jump to its exit test) or a NOTE_INSN_LOOP_END
1022      (in case we have a degenerate loop).
1023
1024      Note that if we mistakenly think that a loop is entered at the top
1025      when, in fact, it is entered at the exit test, the only effect will be
1026      slightly poorer optimization.  Making the opposite error can generate
1027      incorrect code.  Since very few loops now start with a jump to the
1028      exit test, the code here to detect that case is very conservative.  */
1029
1030   for (p = NEXT_INSN (loop_start);
1031        p != loop_end
1032          && !LABEL_P (p) && ! INSN_P (p)
1033          && (!NOTE_P (p)
1034              || (NOTE_LINE_NUMBER (p) != NOTE_INSN_LOOP_BEG
1035                  && NOTE_LINE_NUMBER (p) != NOTE_INSN_LOOP_END));
1036        p = NEXT_INSN (p))
1037     ;
1038
1039   loop->scan_start = p;
1040
1041   /* If loop end is the end of the current function, then emit a
1042      NOTE_INSN_DELETED after loop_end and set loop->sink to the dummy
1043      note insn.  This is the position we use when sinking insns out of
1044      the loop.  */
1045   if (NEXT_INSN (loop->end) != 0)
1046     loop->sink = NEXT_INSN (loop->end);
1047   else
1048     loop->sink = emit_note_after (NOTE_INSN_DELETED, loop->end);
1049
1050   /* Set up variables describing this loop.  */
1051   prescan_loop (loop);
1052   threshold = (loop_info->has_call ? 1 : 2) * (1 + n_non_fixed_regs);
1053
1054   /* If loop has a jump before the first label,
1055      the true entry is the target of that jump.
1056      Start scan from there.
1057      But record in LOOP->TOP the place where the end-test jumps
1058      back to so we can scan that after the end of the loop.  */
1059   if (JUMP_P (p)
1060       /* Loop entry must be unconditional jump (and not a RETURN)  */
1061       && any_uncondjump_p (p)
1062       && JUMP_LABEL (p) != 0
1063       /* Check to see whether the jump actually
1064          jumps out of the loop (meaning it's no loop).
1065          This case can happen for things like
1066          do {..} while (0).  If this label was generated previously
1067          by loop, we can't tell anything about it and have to reject
1068          the loop.  */
1069       && INSN_IN_RANGE_P (JUMP_LABEL (p), loop_start, loop_end))
1070     {
1071       loop->top = next_label (loop->scan_start);
1072       loop->scan_start = JUMP_LABEL (p);
1073     }
1074
1075   /* If LOOP->SCAN_START was an insn created by loop, we don't know its luid
1076      as required by loop_reg_used_before_p.  So skip such loops.  (This
1077      test may never be true, but it's best to play it safe.)
1078
1079      Also, skip loops where we do not start scanning at a label.  This
1080      test also rejects loops starting with a JUMP_INSN that failed the
1081      test above.  */
1082
1083   if (INSN_UID (loop->scan_start) >= max_uid_for_loop
1084       || !LABEL_P (loop->scan_start))
1085     {
1086       if (loop_dump_stream)
1087         fprintf (loop_dump_stream, "\nLoop from %d to %d is phony.\n\n",
1088                  INSN_UID (loop_start), INSN_UID (loop_end));
1089       return;
1090     }
1091
1092   /* Allocate extra space for REGs that might be created by load_mems.
1093      We allocate a little extra slop as well, in the hopes that we
1094      won't have to reallocate the regs array.  */
1095   loop_regs_scan (loop, loop_info->mems_idx + 16);
1096   insn_count = count_insns_in_loop (loop);
1097
1098   if (loop_dump_stream)
1099     fprintf (loop_dump_stream, "\nLoop from %d to %d: %d real insns.\n",
1100              INSN_UID (loop_start), INSN_UID (loop_end), insn_count);
1101
1102   /* Scan through the loop finding insns that are safe to move.
1103      Set REGS->ARRAY[I].SET_IN_LOOP negative for the reg I being set, so that
1104      this reg will be considered invariant for subsequent insns.
1105      We consider whether subsequent insns use the reg
1106      in deciding whether it is worth actually moving.
1107
1108      MAYBE_NEVER is nonzero if we have passed a conditional jump insn
1109      and therefore it is possible that the insns we are scanning
1110      would never be executed.  At such times, we must make sure
1111      that it is safe to execute the insn once instead of zero times.
1112      When MAYBE_NEVER is 0, all insns will be executed at least once
1113      so that is not a problem.  */
1114
1115   for (in_libcall = 0, p = next_insn_in_loop (loop, loop->scan_start);
1116        p != NULL_RTX;
1117        p = next_insn_in_loop (loop, p))
1118     {
1119       if (in_libcall && INSN_P (p) && find_reg_note (p, REG_RETVAL, NULL_RTX))
1120         in_libcall--;
1121       if (NONJUMP_INSN_P (p))
1122         {
1123           /* Do not scan past an optimization barrier.  */
1124           if (GET_CODE (PATTERN (p)) == ASM_INPUT)
1125             break;
1126           temp = find_reg_note (p, REG_LIBCALL, NULL_RTX);
1127           if (temp)
1128             in_libcall++;
1129           if (! in_libcall
1130               && (set = single_set (p))
1131               && REG_P (SET_DEST (set))
1132 #ifdef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
1133               && SET_DEST (set) != pic_offset_table_rtx
1134 #endif
1135               && ! regs->array[REGNO (SET_DEST (set))].may_not_optimize)
1136             {
1137               int tem1 = 0;
1138               int tem2 = 0;
1139               int move_insn = 0;
1140               int insert_temp = 0;
1141               rtx src = SET_SRC (set);
1142               rtx dependencies = 0;
1143
1144               /* Figure out what to use as a source of this insn.  If a
1145                  REG_EQUIV note is given or if a REG_EQUAL note with a
1146                  constant operand is specified, use it as the source and
1147                  mark that we should move this insn by calling
1148                  emit_move_insn rather that duplicating the insn.
1149
1150                  Otherwise, only use the REG_EQUAL contents if a REG_RETVAL
1151                  note is present.  */
1152               temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
1153               if (temp)
1154                 src = XEXP (temp, 0), move_insn = 1;
1155               else
1156                 {
1157                   temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
1158                   if (temp && CONSTANT_P (XEXP (temp, 0)))
1159                     src = XEXP (temp, 0), move_insn = 1;
1160                   if (temp && find_reg_note (p, REG_RETVAL, NULL_RTX))
1161                     {
1162                       src = XEXP (temp, 0);
1163                       /* A libcall block can use regs that don't appear in
1164                          the equivalent expression.  To move the libcall,
1165                          we must move those regs too.  */
1166                       dependencies = libcall_other_reg (p, src);
1167                     }
1168                 }
1169
1170               /* For parallels, add any possible uses to the dependencies, as
1171                  we can't move the insn without resolving them first.
1172                  MEMs inside CLOBBERs may also reference registers; these
1173                  count as implicit uses.  */
1174               if (GET_CODE (PATTERN (p)) == PARALLEL)
1175                 {
1176                   for (i = 0; i < XVECLEN (PATTERN (p), 0); i++)
1177                     {
1178                       rtx x = XVECEXP (PATTERN (p), 0, i);
1179                       if (GET_CODE (x) == USE)
1180                         dependencies
1181                           = gen_rtx_EXPR_LIST (VOIDmode, XEXP (x, 0),
1182                                                dependencies);
1183                       else if (GET_CODE (x) == CLOBBER 
1184                                && MEM_P (XEXP (x, 0)))
1185                         dependencies = find_regs_nested (dependencies, 
1186                                                   XEXP (XEXP (x, 0), 0));
1187                     }
1188                 }
1189
1190               if (/* The register is used in basic blocks other
1191                       than the one where it is set (meaning that
1192                       something after this point in the loop might
1193                       depend on its value before the set).  */
1194                    ! reg_in_basic_block_p (p, SET_DEST (set))
1195                    /* And the set is not guaranteed to be executed once
1196                       the loop starts, or the value before the set is
1197                       needed before the set occurs...
1198
1199                       ??? Note we have quadratic behavior here, mitigated
1200                       by the fact that the previous test will often fail for
1201                       large loops.  Rather than re-scanning the entire loop
1202                       each time for register usage, we should build tables
1203                       of the register usage and use them here instead.  */
1204                    && (maybe_never
1205                        || loop_reg_used_before_p (loop, set, p)))
1206                 /* It is unsafe to move the set.  However, it may be OK to
1207                    move the source into a new pseudo, and substitute a
1208                    reg-to-reg copy for the original insn.
1209
1210                    This code used to consider it OK to move a set of a variable
1211                    which was not created by the user and not used in an exit
1212                    test.
1213                    That behavior is incorrect and was removed.  */
1214                 insert_temp = 1;
1215
1216               /* Don't try to optimize a MODE_CC set with a constant
1217                  source.  It probably will be combined with a conditional
1218                  jump.  */
1219               if (GET_MODE_CLASS (GET_MODE (SET_DEST (set))) == MODE_CC
1220                   && CONSTANT_P (src))
1221                 ;
1222               /* Don't try to optimize a register that was made
1223                  by loop-optimization for an inner loop.
1224                  We don't know its life-span, so we can't compute
1225                  the benefit.  */
1226               else if (REGNO (SET_DEST (set)) >= max_reg_before_loop)
1227                 ;
1228               /* Don't move the source and add a reg-to-reg copy:
1229                  - with -Os (this certainly increases size),
1230                  - if the mode doesn't support copy operations (obviously),
1231                  - if the source is already a reg (the motion will gain nothing),
1232                  - if the source is a legitimate constant (likewise).  */
1233               else if (insert_temp
1234                        && (optimize_size
1235                            || ! can_copy_p (GET_MODE (SET_SRC (set)))
1236                            || REG_P (SET_SRC (set))
1237                            || (CONSTANT_P (SET_SRC (set))
1238                                && LEGITIMATE_CONSTANT_P (SET_SRC (set)))))
1239                 ;
1240               else if ((tem = loop_invariant_p (loop, src))
1241                        && (dependencies == 0
1242                            || (tem2
1243                                = loop_invariant_p (loop, dependencies)) != 0)
1244                        && (regs->array[REGNO (SET_DEST (set))].set_in_loop == 1
1245                            || (tem1
1246                                = consec_sets_invariant_p
1247                                (loop, SET_DEST (set),
1248                                 regs->array[REGNO (SET_DEST (set))].set_in_loop,
1249                                 p)))
1250                        /* If the insn can cause a trap (such as divide by zero),
1251                           can't move it unless it's guaranteed to be executed
1252                           once loop is entered.  Even a function call might
1253                           prevent the trap insn from being reached
1254                           (since it might exit!)  */
1255                        && ! ((maybe_never || call_passed)
1256                              && may_trap_p (src)))
1257                 {
1258                   struct movable *m;
1259                   int regno = REGNO (SET_DEST (set));
1260
1261                   /* A potential lossage is where we have a case where two insns
1262                      can be combined as long as they are both in the loop, but
1263                      we move one of them outside the loop.  For large loops,
1264                      this can lose.  The most common case of this is the address
1265                      of a function being called.
1266
1267                      Therefore, if this register is marked as being used
1268                      exactly once if we are in a loop with calls
1269                      (a "large loop"), see if we can replace the usage of
1270                      this register with the source of this SET.  If we can,
1271                      delete this insn.
1272
1273                      Don't do this if P has a REG_RETVAL note or if we have
1274                      SMALL_REGISTER_CLASSES and SET_SRC is a hard register.  */
1275
1276                   if (loop_info->has_call
1277                       && regs->array[regno].single_usage != 0
1278                       && regs->array[regno].single_usage != const0_rtx
1279                       && REGNO_FIRST_UID (regno) == INSN_UID (p)
1280                       && (REGNO_LAST_UID (regno)
1281                           == INSN_UID (regs->array[regno].single_usage))
1282                       && regs->array[regno].set_in_loop == 1
1283                       && GET_CODE (SET_SRC (set)) != ASM_OPERANDS
1284                       && ! side_effects_p (SET_SRC (set))
1285                       && ! find_reg_note (p, REG_RETVAL, NULL_RTX)
1286                       && (! SMALL_REGISTER_CLASSES
1287                           || (! (REG_P (SET_SRC (set))
1288                                  && (REGNO (SET_SRC (set))
1289                                      < FIRST_PSEUDO_REGISTER))))
1290                       && regno >= FIRST_PSEUDO_REGISTER 
1291                       /* This test is not redundant; SET_SRC (set) might be
1292                          a call-clobbered register and the life of REGNO
1293                          might span a call.  */
1294                       && ! modified_between_p (SET_SRC (set), p,
1295                                                regs->array[regno].single_usage)
1296                       && no_labels_between_p (p,
1297                                               regs->array[regno].single_usage)
1298                       && validate_replace_rtx (SET_DEST (set), SET_SRC (set),
1299                                                regs->array[regno].single_usage))
1300                     {
1301                       /* Replace any usage in a REG_EQUAL note.  Must copy
1302                          the new source, so that we don't get rtx sharing
1303                          between the SET_SOURCE and REG_NOTES of insn p.  */
1304                       REG_NOTES (regs->array[regno].single_usage)
1305                         = (replace_rtx
1306                            (REG_NOTES (regs->array[regno].single_usage),
1307                             SET_DEST (set), copy_rtx (SET_SRC (set))));
1308
1309                       delete_insn (p);
1310                       for (i = 0; i < LOOP_REGNO_NREGS (regno, SET_DEST (set));
1311                            i++)
1312                         regs->array[regno+i].set_in_loop = 0;
1313                       continue;
1314                     }
1315
1316                   m = xmalloc (sizeof (struct movable));
1317                   m->next = 0;
1318                   m->insn = p;
1319                   m->set_src = src;
1320                   m->dependencies = dependencies;
1321                   m->set_dest = SET_DEST (set);
1322                   m->force = 0;
1323                   m->consec
1324                     = regs->array[REGNO (SET_DEST (set))].set_in_loop - 1;
1325                   m->done = 0;
1326                   m->forces = 0;
1327                   m->partial = 0;
1328                   m->move_insn = move_insn;
1329                   m->move_insn_first = 0;
1330                   m->insert_temp = insert_temp;
1331                   m->is_equiv = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
1332                   m->savemode = VOIDmode;
1333                   m->regno = regno;
1334                   /* Set M->cond if either loop_invariant_p
1335                      or consec_sets_invariant_p returned 2
1336                      (only conditionally invariant).  */
1337                   m->cond = ((tem | tem1 | tem2) > 1);
1338                   m->global =  LOOP_REG_GLOBAL_P (loop, regno);
1339                   m->match = 0;
1340                   m->lifetime = LOOP_REG_LIFETIME (loop, regno);
1341                   m->savings = regs->array[regno].n_times_set;
1342                   if (find_reg_note (p, REG_RETVAL, NULL_RTX))
1343                     m->savings += libcall_benefit (p);
1344                   for (i = 0; i < LOOP_REGNO_NREGS (regno, SET_DEST (set)); i++)
1345                     regs->array[regno+i].set_in_loop = move_insn ? -2 : -1;
1346                   /* Add M to the end of the chain MOVABLES.  */
1347                   loop_movables_add (movables, m);
1348
1349                   if (m->consec > 0)
1350                     {
1351                       /* It is possible for the first instruction to have a
1352                          REG_EQUAL note but a non-invariant SET_SRC, so we must
1353                          remember the status of the first instruction in case
1354                          the last instruction doesn't have a REG_EQUAL note.  */
1355                       m->move_insn_first = m->move_insn;
1356
1357                       /* Skip this insn, not checking REG_LIBCALL notes.  */
1358                       p = next_nonnote_insn (p);
1359                       /* Skip the consecutive insns, if there are any.  */
1360                       p = skip_consec_insns (p, m->consec);
1361                       /* Back up to the last insn of the consecutive group.  */
1362                       p = prev_nonnote_insn (p);
1363
1364                       /* We must now reset m->move_insn, m->is_equiv, and
1365                          possibly m->set_src to correspond to the effects of
1366                          all the insns.  */
1367                       temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
1368                       if (temp)
1369                         m->set_src = XEXP (temp, 0), m->move_insn = 1;
1370                       else
1371                         {
1372                           temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
1373                           if (temp && CONSTANT_P (XEXP (temp, 0)))
1374                             m->set_src = XEXP (temp, 0), m->move_insn = 1;
1375                           else
1376                             m->move_insn = 0;
1377
1378                         }
1379                       m->is_equiv
1380                         = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
1381                     }
1382                 }
1383               /* If this register is always set within a STRICT_LOW_PART
1384                  or set to zero, then its high bytes are constant.
1385                  So clear them outside the loop and within the loop
1386                  just load the low bytes.
1387                  We must check that the machine has an instruction to do so.
1388                  Also, if the value loaded into the register
1389                  depends on the same register, this cannot be done.  */
1390               else if (SET_SRC (set) == const0_rtx
1391                        && NONJUMP_INSN_P (NEXT_INSN (p))
1392                        && (set1 = single_set (NEXT_INSN (p)))
1393                        && GET_CODE (set1) == SET
1394                        && (GET_CODE (SET_DEST (set1)) == STRICT_LOW_PART)
1395                        && (GET_CODE (XEXP (SET_DEST (set1), 0)) == SUBREG)
1396                        && (SUBREG_REG (XEXP (SET_DEST (set1), 0))
1397                            == SET_DEST (set))
1398                        && !reg_mentioned_p (SET_DEST (set), SET_SRC (set1)))
1399                 {
1400                   int regno = REGNO (SET_DEST (set));
1401                   if (regs->array[regno].set_in_loop == 2)
1402                     {
1403                       struct movable *m;
1404                       m = xmalloc (sizeof (struct movable));
1405                       m->next = 0;
1406                       m->insn = p;
1407                       m->set_dest = SET_DEST (set);
1408                       m->dependencies = 0;
1409                       m->force = 0;
1410                       m->consec = 0;
1411                       m->done = 0;
1412                       m->forces = 0;
1413                       m->move_insn = 0;
1414                       m->move_insn_first = 0;
1415                       m->insert_temp = insert_temp;
1416                       m->partial = 1;
1417                       /* If the insn may not be executed on some cycles,
1418                          we can't clear the whole reg; clear just high part.
1419                          Not even if the reg is used only within this loop.
1420                          Consider this:
1421                          while (1)
1422                            while (s != t) {
1423                              if (foo ()) x = *s;
1424                              use (x);
1425                            }
1426                          Clearing x before the inner loop could clobber a value
1427                          being saved from the last time around the outer loop.
1428                          However, if the reg is not used outside this loop
1429                          and all uses of the register are in the same
1430                          basic block as the store, there is no problem.
1431
1432                          If this insn was made by loop, we don't know its
1433                          INSN_LUID and hence must make a conservative
1434                          assumption.  */
1435                       m->global = (INSN_UID (p) >= max_uid_for_loop
1436                                    || LOOP_REG_GLOBAL_P (loop, regno)
1437                                    || (labels_in_range_p
1438                                        (p, REGNO_FIRST_LUID (regno))));
1439                       if (maybe_never && m->global)
1440                         m->savemode = GET_MODE (SET_SRC (set1));
1441                       else
1442                         m->savemode = VOIDmode;
1443                       m->regno = regno;
1444                       m->cond = 0;
1445                       m->match = 0;
1446                       m->lifetime = LOOP_REG_LIFETIME (loop, regno);
1447                       m->savings = 1;
1448                       for (i = 0;
1449                            i < LOOP_REGNO_NREGS (regno, SET_DEST (set));
1450                            i++)
1451                         regs->array[regno+i].set_in_loop = -1;
1452                       /* Add M to the end of the chain MOVABLES.  */
1453                       loop_movables_add (movables, m);
1454                     }
1455                 }
1456             }
1457         }
1458       /* Past a call insn, we get to insns which might not be executed
1459          because the call might exit.  This matters for insns that trap.
1460          Constant and pure call insns always return, so they don't count.  */
1461       else if (CALL_P (p) && ! CONST_OR_PURE_CALL_P (p))
1462         call_passed = 1;
1463       /* Past a label or a jump, we get to insns for which we
1464          can't count on whether or how many times they will be
1465          executed during each iteration.  Therefore, we can
1466          only move out sets of trivial variables
1467          (those not used after the loop).  */
1468       /* Similar code appears twice in strength_reduce.  */
1469       else if ((LABEL_P (p) || JUMP_P (p))
1470                /* If we enter the loop in the middle, and scan around to the
1471                   beginning, don't set maybe_never for that.  This must be an
1472                   unconditional jump, otherwise the code at the top of the
1473                   loop might never be executed.  Unconditional jumps are
1474                   followed by a barrier then the loop_end.  */
1475                && ! (JUMP_P (p) && JUMP_LABEL (p) == loop->top
1476                      && NEXT_INSN (NEXT_INSN (p)) == loop_end
1477                      && any_uncondjump_p (p)))
1478         maybe_never = 1;
1479     }
1480
1481   /* If one movable subsumes another, ignore that other.  */
1482
1483   ignore_some_movables (movables);
1484
1485   /* For each movable insn, see if the reg that it loads
1486      leads when it dies right into another conditionally movable insn.
1487      If so, record that the second insn "forces" the first one,
1488      since the second can be moved only if the first is.  */
1489
1490   force_movables (movables);
1491
1492   /* See if there are multiple movable insns that load the same value.
1493      If there are, make all but the first point at the first one
1494      through the `match' field, and add the priorities of them
1495      all together as the priority of the first.  */
1496
1497   combine_movables (movables, regs);
1498
1499   /* Now consider each movable insn to decide whether it is worth moving.
1500      Store 0 in regs->array[I].set_in_loop for each reg I that is moved.
1501
1502      For machines with few registers this increases code size, so do not
1503      move moveables when optimizing for code size on such machines.
1504      (The 18 below is the value for i386.)  */
1505
1506   if (!optimize_size
1507       || (reg_class_size[GENERAL_REGS] > 18 && !loop_info->has_call))
1508     {
1509       move_movables (loop, movables, threshold, insn_count);
1510
1511       /* Recalculate regs->array if move_movables has created new
1512          registers.  */
1513       if (max_reg_num () > regs->num)
1514         {
1515           loop_regs_scan (loop, 0);
1516           for (update_start = loop_start;
1517                PREV_INSN (update_start)
1518                && !LABEL_P (PREV_INSN (update_start));
1519                update_start = PREV_INSN (update_start))
1520             ;
1521           update_end = NEXT_INSN (loop_end);
1522
1523           reg_scan_update (update_start, update_end, loop_max_reg);
1524           loop_max_reg = max_reg_num ();
1525         }
1526     }
1527
1528   /* Now candidates that still are negative are those not moved.
1529      Change regs->array[I].set_in_loop to indicate that those are not actually
1530      invariant.  */
1531   for (i = 0; i < regs->num; i++)
1532     if (regs->array[i].set_in_loop < 0)
1533       regs->array[i].set_in_loop = regs->array[i].n_times_set;
1534
1535   /* Now that we've moved some things out of the loop, we might be able to
1536      hoist even more memory references.  */
1537   load_mems (loop);
1538
1539   /* Recalculate regs->array if load_mems has created new registers.  */
1540   if (max_reg_num () > regs->num)
1541     loop_regs_scan (loop, 0);
1542
1543   for (update_start = loop_start;
1544        PREV_INSN (update_start)
1545          && !LABEL_P (PREV_INSN (update_start));
1546        update_start = PREV_INSN (update_start))
1547     ;
1548   update_end = NEXT_INSN (loop_end);
1549
1550   reg_scan_update (update_start, update_end, loop_max_reg);
1551   loop_max_reg = max_reg_num ();
1552
1553   if (flag_strength_reduce)
1554     {
1555       if (update_end && LABEL_P (update_end))
1556         /* Ensure our label doesn't go away.  */
1557         LABEL_NUSES (update_end)++;
1558
1559       strength_reduce (loop, flags);
1560
1561       reg_scan_update (update_start, update_end, loop_max_reg);
1562       loop_max_reg = max_reg_num ();
1563
1564       if (update_end && LABEL_P (update_end)
1565           && --LABEL_NUSES (update_end) == 0)
1566         delete_related_insns (update_end);
1567     }
1568
1569
1570   /* The movable information is required for strength reduction.  */
1571   loop_movables_free (movables);
1572
1573   free (regs->array);
1574   regs->array = 0;
1575   regs->num = 0;
1576 }
1577 \f
1578 /* Add elements to *OUTPUT to record all the pseudo-regs
1579    mentioned in IN_THIS but not mentioned in NOT_IN_THIS.  */
1580
1581 static void
1582 record_excess_regs (rtx in_this, rtx not_in_this, rtx *output)
1583 {
1584   enum rtx_code code;
1585   const char *fmt;
1586   int i;
1587
1588   code = GET_CODE (in_this);
1589
1590   switch (code)
1591     {
1592     case PC:
1593     case CC0:
1594     case CONST_INT:
1595     case CONST_DOUBLE:
1596     case CONST:
1597     case SYMBOL_REF:
1598     case LABEL_REF:
1599       return;
1600
1601     case REG:
1602       if (REGNO (in_this) >= FIRST_PSEUDO_REGISTER
1603           && ! reg_mentioned_p (in_this, not_in_this))
1604         *output = gen_rtx_EXPR_LIST (VOIDmode, in_this, *output);
1605       return;
1606
1607     default:
1608       break;
1609     }
1610
1611   fmt = GET_RTX_FORMAT (code);
1612   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1613     {
1614       int j;
1615
1616       switch (fmt[i])
1617         {
1618         case 'E':
1619           for (j = 0; j < XVECLEN (in_this, i); j++)
1620             record_excess_regs (XVECEXP (in_this, i, j), not_in_this, output);
1621           break;
1622
1623         case 'e':
1624           record_excess_regs (XEXP (in_this, i), not_in_this, output);
1625           break;
1626         }
1627     }
1628 }
1629 \f
1630 /* Check what regs are referred to in the libcall block ending with INSN,
1631    aside from those mentioned in the equivalent value.
1632    If there are none, return 0.
1633    If there are one or more, return an EXPR_LIST containing all of them.  */
1634
1635 static rtx
1636 libcall_other_reg (rtx insn, rtx equiv)
1637 {
1638   rtx note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
1639   rtx p = XEXP (note, 0);
1640   rtx output = 0;
1641
1642   /* First, find all the regs used in the libcall block
1643      that are not mentioned as inputs to the result.  */
1644
1645   while (p != insn)
1646     {
1647       if (INSN_P (p))
1648         record_excess_regs (PATTERN (p), equiv, &output);
1649       p = NEXT_INSN (p);
1650     }
1651
1652   return output;
1653 }
1654 \f
1655 /* Return 1 if all uses of REG
1656    are between INSN and the end of the basic block.  */
1657
1658 static int
1659 reg_in_basic_block_p (rtx insn, rtx reg)
1660 {
1661   int regno = REGNO (reg);
1662   rtx p;
1663
1664   if (REGNO_FIRST_UID (regno) != INSN_UID (insn))
1665     return 0;
1666
1667   /* Search this basic block for the already recorded last use of the reg.  */
1668   for (p = insn; p; p = NEXT_INSN (p))
1669     {
1670       switch (GET_CODE (p))
1671         {
1672         case NOTE:
1673           break;
1674
1675         case INSN:
1676         case CALL_INSN:
1677           /* Ordinary insn: if this is the last use, we win.  */
1678           if (REGNO_LAST_UID (regno) == INSN_UID (p))
1679             return 1;
1680           break;
1681
1682         case JUMP_INSN:
1683           /* Jump insn: if this is the last use, we win.  */
1684           if (REGNO_LAST_UID (regno) == INSN_UID (p))
1685             return 1;
1686           /* Otherwise, it's the end of the basic block, so we lose.  */
1687           return 0;
1688
1689         case CODE_LABEL:
1690         case BARRIER:
1691           /* It's the end of the basic block, so we lose.  */
1692           return 0;
1693
1694         default:
1695           break;
1696         }
1697     }
1698
1699   /* The "last use" that was recorded can't be found after the first
1700      use.  This can happen when the last use was deleted while
1701      processing an inner loop, this inner loop was then completely
1702      unrolled, and the outer loop is always exited after the inner loop,
1703      so that everything after the first use becomes a single basic block.  */
1704   return 1;
1705 }
1706 \f
1707 /* Compute the benefit of eliminating the insns in the block whose
1708    last insn is LAST.  This may be a group of insns used to compute a
1709    value directly or can contain a library call.  */
1710
1711 static int
1712 libcall_benefit (rtx last)
1713 {
1714   rtx insn;
1715   int benefit = 0;
1716
1717   for (insn = XEXP (find_reg_note (last, REG_RETVAL, NULL_RTX), 0);
1718        insn != last; insn = NEXT_INSN (insn))
1719     {
1720       if (CALL_P (insn))
1721         benefit += 10;          /* Assume at least this many insns in a library
1722                                    routine.  */
1723       else if (NONJUMP_INSN_P (insn)
1724                && GET_CODE (PATTERN (insn)) != USE
1725                && GET_CODE (PATTERN (insn)) != CLOBBER)
1726         benefit++;
1727     }
1728
1729   return benefit;
1730 }
1731 \f
1732 /* Skip COUNT insns from INSN, counting library calls as 1 insn.  */
1733
1734 static rtx
1735 skip_consec_insns (rtx insn, int count)
1736 {
1737   for (; count > 0; count--)
1738     {
1739       rtx temp;
1740
1741       /* If first insn of libcall sequence, skip to end.  */
1742       /* Do this at start of loop, since INSN is guaranteed to
1743          be an insn here.  */
1744       if (!NOTE_P (insn)
1745           && (temp = find_reg_note (insn, REG_LIBCALL, NULL_RTX)))
1746         insn = XEXP (temp, 0);
1747
1748       do
1749         insn = NEXT_INSN (insn);
1750       while (NOTE_P (insn));
1751     }
1752
1753   return insn;
1754 }
1755
1756 /* Ignore any movable whose insn falls within a libcall
1757    which is part of another movable.
1758    We make use of the fact that the movable for the libcall value
1759    was made later and so appears later on the chain.  */
1760
1761 static void
1762 ignore_some_movables (struct loop_movables *movables)
1763 {
1764   struct movable *m, *m1;
1765
1766   for (m = movables->head; m; m = m->next)
1767     {
1768       /* Is this a movable for the value of a libcall?  */
1769       rtx note = find_reg_note (m->insn, REG_RETVAL, NULL_RTX);
1770       if (note)
1771         {
1772           rtx insn;
1773           /* Check for earlier movables inside that range,
1774              and mark them invalid.  We cannot use LUIDs here because
1775              insns created by loop.c for prior loops don't have LUIDs.
1776              Rather than reject all such insns from movables, we just
1777              explicitly check each insn in the libcall (since invariant
1778              libcalls aren't that common).  */
1779           for (insn = XEXP (note, 0); insn != m->insn; insn = NEXT_INSN (insn))
1780             for (m1 = movables->head; m1 != m; m1 = m1->next)
1781               if (m1->insn == insn)
1782                 m1->done = 1;
1783         }
1784     }
1785 }
1786
1787 /* For each movable insn, see if the reg that it loads
1788    leads when it dies right into another conditionally movable insn.
1789    If so, record that the second insn "forces" the first one,
1790    since the second can be moved only if the first is.  */
1791
1792 static void
1793 force_movables (struct loop_movables *movables)
1794 {
1795   struct movable *m, *m1;
1796
1797   for (m1 = movables->head; m1; m1 = m1->next)
1798     /* Omit this if moving just the (SET (REG) 0) of a zero-extend.  */
1799     if (!m1->partial && !m1->done)
1800       {
1801         int regno = m1->regno;
1802         for (m = m1->next; m; m = m->next)
1803           /* ??? Could this be a bug?  What if CSE caused the
1804              register of M1 to be used after this insn?
1805              Since CSE does not update regno_last_uid,
1806              this insn M->insn might not be where it dies.
1807              But very likely this doesn't matter; what matters is
1808              that M's reg is computed from M1's reg.  */
1809           if (INSN_UID (m->insn) == REGNO_LAST_UID (regno)
1810               && !m->done)
1811             break;
1812         if (m != 0 && m->set_src == m1->set_dest
1813             /* If m->consec, m->set_src isn't valid.  */
1814             && m->consec == 0)
1815           m = 0;
1816
1817         /* Increase the priority of the moving the first insn
1818            since it permits the second to be moved as well.
1819            Likewise for insns already forced by the first insn.  */
1820         if (m != 0)
1821           {
1822             struct movable *m2;
1823
1824             m->forces = m1;
1825             for (m2 = m1; m2; m2 = m2->forces)
1826               {
1827                 m2->lifetime += m->lifetime;
1828                 m2->savings += m->savings;
1829               }
1830           }
1831       }
1832 }
1833 \f
1834 /* Find invariant expressions that are equal and can be combined into
1835    one register.  */
1836
1837 static void
1838 combine_movables (struct loop_movables *movables, struct loop_regs *regs)
1839 {
1840   struct movable *m;
1841   char *matched_regs = xmalloc (regs->num);
1842   enum machine_mode mode;
1843
1844   /* Regs that are set more than once are not allowed to match
1845      or be matched.  I'm no longer sure why not.  */
1846   /* Only pseudo registers are allowed to match or be matched,
1847      since move_movables does not validate the change.  */
1848   /* Perhaps testing m->consec_sets would be more appropriate here?  */
1849
1850   for (m = movables->head; m; m = m->next)
1851     if (m->match == 0 && regs->array[m->regno].n_times_set == 1
1852         && m->regno >= FIRST_PSEUDO_REGISTER
1853         && !m->insert_temp
1854         && !m->partial)
1855       {
1856         struct movable *m1;
1857         int regno = m->regno;
1858
1859         memset (matched_regs, 0, regs->num);
1860         matched_regs[regno] = 1;
1861
1862         /* We want later insns to match the first one.  Don't make the first
1863            one match any later ones.  So start this loop at m->next.  */
1864         for (m1 = m->next; m1; m1 = m1->next)
1865           if (m != m1 && m1->match == 0
1866               && !m1->insert_temp
1867               && regs->array[m1->regno].n_times_set == 1
1868               && m1->regno >= FIRST_PSEUDO_REGISTER
1869               /* A reg used outside the loop mustn't be eliminated.  */
1870               && !m1->global
1871               /* A reg used for zero-extending mustn't be eliminated.  */
1872               && !m1->partial
1873               && (matched_regs[m1->regno]
1874                   ||
1875                   (
1876                    /* Can combine regs with different modes loaded from the
1877                       same constant only if the modes are the same or
1878                       if both are integer modes with M wider or the same
1879                       width as M1.  The check for integer is redundant, but
1880                       safe, since the only case of differing destination
1881                       modes with equal sources is when both sources are
1882                       VOIDmode, i.e., CONST_INT.  */
1883                    (GET_MODE (m->set_dest) == GET_MODE (m1->set_dest)
1884                     || (GET_MODE_CLASS (GET_MODE (m->set_dest)) == MODE_INT
1885                         && GET_MODE_CLASS (GET_MODE (m1->set_dest)) == MODE_INT
1886                         && (GET_MODE_BITSIZE (GET_MODE (m->set_dest))
1887                             >= GET_MODE_BITSIZE (GET_MODE (m1->set_dest)))))
1888                    /* See if the source of M1 says it matches M.  */
1889                    && ((REG_P (m1->set_src)
1890                         && matched_regs[REGNO (m1->set_src)])
1891                        || rtx_equal_for_loop_p (m->set_src, m1->set_src,
1892                                                 movables, regs))))
1893               && ((m->dependencies == m1->dependencies)
1894                   || rtx_equal_p (m->dependencies, m1->dependencies)))
1895             {
1896               m->lifetime += m1->lifetime;
1897               m->savings += m1->savings;
1898               m1->done = 1;
1899               m1->match = m;
1900               matched_regs[m1->regno] = 1;
1901             }
1902       }
1903
1904   /* Now combine the regs used for zero-extension.
1905      This can be done for those not marked `global'
1906      provided their lives don't overlap.  */
1907
1908   for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
1909        mode = GET_MODE_WIDER_MODE (mode))
1910     {
1911       struct movable *m0 = 0;
1912
1913       /* Combine all the registers for extension from mode MODE.
1914          Don't combine any that are used outside this loop.  */
1915       for (m = movables->head; m; m = m->next)
1916         if (m->partial && ! m->global
1917             && mode == GET_MODE (SET_SRC (PATTERN (NEXT_INSN (m->insn)))))
1918           {
1919             struct movable *m1;
1920
1921             int first = REGNO_FIRST_LUID (m->regno);
1922             int last = REGNO_LAST_LUID (m->regno);
1923
1924             if (m0 == 0)
1925               {
1926                 /* First one: don't check for overlap, just record it.  */
1927                 m0 = m;
1928                 continue;
1929               }
1930
1931             /* Make sure they extend to the same mode.
1932                (Almost always true.)  */
1933             if (GET_MODE (m->set_dest) != GET_MODE (m0->set_dest))
1934               continue;
1935
1936             /* We already have one: check for overlap with those
1937                already combined together.  */
1938             for (m1 = movables->head; m1 != m; m1 = m1->next)
1939               if (m1 == m0 || (m1->partial && m1->match == m0))
1940                 if (! (REGNO_FIRST_LUID (m1->regno) > last
1941                        || REGNO_LAST_LUID (m1->regno) < first))
1942                   goto overlap;
1943
1944             /* No overlap: we can combine this with the others.  */
1945             m0->lifetime += m->lifetime;
1946             m0->savings += m->savings;
1947             m->done = 1;
1948             m->match = m0;
1949
1950           overlap:
1951             ;
1952           }
1953     }
1954
1955   /* Clean up.  */
1956   free (matched_regs);
1957 }
1958
1959 /* Returns the number of movable instructions in LOOP that were not
1960    moved outside the loop.  */
1961
1962 static int
1963 num_unmoved_movables (const struct loop *loop)
1964 {
1965   int num = 0;
1966   struct movable *m;
1967
1968   for (m = LOOP_MOVABLES (loop)->head; m; m = m->next)
1969     if (!m->done)
1970       ++num;
1971
1972   return num;
1973 }
1974
1975 \f
1976 /* Return 1 if regs X and Y will become the same if moved.  */
1977
1978 static int
1979 regs_match_p (rtx x, rtx y, struct loop_movables *movables)
1980 {
1981   unsigned int xn = REGNO (x);
1982   unsigned int yn = REGNO (y);
1983   struct movable *mx, *my;
1984
1985   for (mx = movables->head; mx; mx = mx->next)
1986     if (mx->regno == xn)
1987       break;
1988
1989   for (my = movables->head; my; my = my->next)
1990     if (my->regno == yn)
1991       break;
1992
1993   return (mx && my
1994           && ((mx->match == my->match && mx->match != 0)
1995               || mx->match == my
1996               || mx == my->match));
1997 }
1998
1999 /* Return 1 if X and Y are identical-looking rtx's.
2000    This is the Lisp function EQUAL for rtx arguments.
2001
2002    If two registers are matching movables or a movable register and an
2003    equivalent constant, consider them equal.  */
2004
2005 static int
2006 rtx_equal_for_loop_p (rtx x, rtx y, struct loop_movables *movables,
2007                       struct loop_regs *regs)
2008 {
2009   int i;
2010   int j;
2011   struct movable *m;
2012   enum rtx_code code;
2013   const char *fmt;
2014
2015   if (x == y)
2016     return 1;
2017   if (x == 0 || y == 0)
2018     return 0;
2019
2020   code = GET_CODE (x);
2021
2022   /* If we have a register and a constant, they may sometimes be
2023      equal.  */
2024   if (REG_P (x) && regs->array[REGNO (x)].set_in_loop == -2
2025       && CONSTANT_P (y))
2026     {
2027       for (m = movables->head; m; m = m->next)
2028         if (m->move_insn && m->regno == REGNO (x)
2029             && rtx_equal_p (m->set_src, y))
2030           return 1;
2031     }
2032   else if (REG_P (y) && regs->array[REGNO (y)].set_in_loop == -2
2033            && CONSTANT_P (x))
2034     {
2035       for (m = movables->head; m; m = m->next)
2036         if (m->move_insn && m->regno == REGNO (y)
2037             && rtx_equal_p (m->set_src, x))
2038           return 1;
2039     }
2040
2041   /* Otherwise, rtx's of different codes cannot be equal.  */
2042   if (code != GET_CODE (y))
2043     return 0;
2044
2045   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
2046      (REG:SI x) and (REG:HI x) are NOT equivalent.  */
2047
2048   if (GET_MODE (x) != GET_MODE (y))
2049     return 0;
2050
2051   /* These three types of rtx's can be compared nonrecursively.  */
2052   if (code == REG)
2053     return (REGNO (x) == REGNO (y) || regs_match_p (x, y, movables));
2054
2055   if (code == LABEL_REF)
2056     return XEXP (x, 0) == XEXP (y, 0);
2057   if (code == SYMBOL_REF)
2058     return XSTR (x, 0) == XSTR (y, 0);
2059
2060   /* Compare the elements.  If any pair of corresponding elements
2061      fail to match, return 0 for the whole things.  */
2062
2063   fmt = GET_RTX_FORMAT (code);
2064   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2065     {
2066       switch (fmt[i])
2067         {
2068         case 'w':
2069           if (XWINT (x, i) != XWINT (y, i))
2070             return 0;
2071           break;
2072
2073         case 'i':
2074           if (XINT (x, i) != XINT (y, i))
2075             return 0;
2076           break;
2077
2078         case 'E':
2079           /* Two vectors must have the same length.  */
2080           if (XVECLEN (x, i) != XVECLEN (y, i))
2081             return 0;
2082
2083           /* And the corresponding elements must match.  */
2084           for (j = 0; j < XVECLEN (x, i); j++)
2085             if (rtx_equal_for_loop_p (XVECEXP (x, i, j), XVECEXP (y, i, j),
2086                                       movables, regs) == 0)
2087               return 0;
2088           break;
2089
2090         case 'e':
2091           if (rtx_equal_for_loop_p (XEXP (x, i), XEXP (y, i), movables, regs)
2092               == 0)
2093             return 0;
2094           break;
2095
2096         case 's':
2097           if (strcmp (XSTR (x, i), XSTR (y, i)))
2098             return 0;
2099           break;
2100
2101         case 'u':
2102           /* These are just backpointers, so they don't matter.  */
2103           break;
2104
2105         case '0':
2106           break;
2107
2108           /* It is believed that rtx's at this level will never
2109              contain anything but integers and other rtx's,
2110              except for within LABEL_REFs and SYMBOL_REFs.  */
2111         default:
2112           abort ();
2113         }
2114     }
2115   return 1;
2116 }
2117 \f
2118 /* If X contains any LABEL_REF's, add REG_LABEL notes for them to all
2119    insns in INSNS which use the reference.  LABEL_NUSES for CODE_LABEL
2120    references is incremented once for each added note.  */
2121
2122 static void
2123 add_label_notes (rtx x, rtx insns)
2124 {
2125   enum rtx_code code = GET_CODE (x);
2126   int i, j;
2127   const char *fmt;
2128   rtx insn;
2129
2130   if (code == LABEL_REF && !LABEL_REF_NONLOCAL_P (x))
2131     {
2132       /* This code used to ignore labels that referred to dispatch tables to
2133          avoid flow generating (slightly) worse code.
2134
2135          We no longer ignore such label references (see LABEL_REF handling in
2136          mark_jump_label for additional information).  */
2137       for (insn = insns; insn; insn = NEXT_INSN (insn))
2138         if (reg_mentioned_p (XEXP (x, 0), insn))
2139           {
2140             REG_NOTES (insn) = gen_rtx_INSN_LIST (REG_LABEL, XEXP (x, 0),
2141                                                   REG_NOTES (insn));
2142             if (LABEL_P (XEXP (x, 0)))
2143               LABEL_NUSES (XEXP (x, 0))++;
2144           }
2145     }
2146
2147   fmt = GET_RTX_FORMAT (code);
2148   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2149     {
2150       if (fmt[i] == 'e')
2151         add_label_notes (XEXP (x, i), insns);
2152       else if (fmt[i] == 'E')
2153         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2154           add_label_notes (XVECEXP (x, i, j), insns);
2155     }
2156 }
2157 \f
2158 /* Scan MOVABLES, and move the insns that deserve to be moved.
2159    If two matching movables are combined, replace one reg with the
2160    other throughout.  */
2161
2162 static void
2163 move_movables (struct loop *loop, struct loop_movables *movables,
2164                int threshold, int insn_count)
2165 {
2166   struct loop_regs *regs = LOOP_REGS (loop);
2167   int nregs = regs->num;
2168   rtx new_start = 0;
2169   struct movable *m;
2170   rtx p;
2171   rtx loop_start = loop->start;
2172   rtx loop_end = loop->end;
2173   /* Map of pseudo-register replacements to handle combining
2174      when we move several insns that load the same value
2175      into different pseudo-registers.  */
2176   rtx *reg_map = xcalloc (nregs, sizeof (rtx));
2177   char *already_moved = xcalloc (nregs, sizeof (char));
2178
2179   for (m = movables->head; m; m = m->next)
2180     {
2181       /* Describe this movable insn.  */
2182
2183       if (loop_dump_stream)
2184         {
2185           fprintf (loop_dump_stream, "Insn %d: regno %d (life %d), ",
2186                    INSN_UID (m->insn), m->regno, m->lifetime);
2187           if (m->consec > 0)
2188             fprintf (loop_dump_stream, "consec %d, ", m->consec);
2189           if (m->cond)
2190             fprintf (loop_dump_stream, "cond ");
2191           if (m->force)
2192             fprintf (loop_dump_stream, "force ");
2193           if (m->global)
2194             fprintf (loop_dump_stream, "global ");
2195           if (m->done)
2196             fprintf (loop_dump_stream, "done ");
2197           if (m->move_insn)
2198             fprintf (loop_dump_stream, "move-insn ");
2199           if (m->match)
2200             fprintf (loop_dump_stream, "matches %d ",
2201                      INSN_UID (m->match->insn));
2202           if (m->forces)
2203             fprintf (loop_dump_stream, "forces %d ",
2204                      INSN_UID (m->forces->insn));
2205         }
2206
2207       /* Ignore the insn if it's already done (it matched something else).
2208          Otherwise, see if it is now safe to move.  */
2209
2210       if (!m->done
2211           && (! m->cond
2212               || (1 == loop_invariant_p (loop, m->set_src)
2213                   && (m->dependencies == 0
2214                       || 1 == loop_invariant_p (loop, m->dependencies))
2215                   && (m->consec == 0
2216                       || 1 == consec_sets_invariant_p (loop, m->set_dest,
2217                                                        m->consec + 1,
2218                                                        m->insn))))
2219           && (! m->forces || m->forces->done))
2220         {
2221           int regno;
2222           rtx p;
2223           int savings = m->savings;
2224
2225           /* We have an insn that is safe to move.
2226              Compute its desirability.  */
2227
2228           p = m->insn;
2229           regno = m->regno;
2230
2231           if (loop_dump_stream)
2232             fprintf (loop_dump_stream, "savings %d ", savings);
2233
2234           if (regs->array[regno].moved_once && loop_dump_stream)
2235             fprintf (loop_dump_stream, "halved since already moved ");
2236
2237           /* An insn MUST be moved if we already moved something else
2238              which is safe only if this one is moved too: that is,
2239              if already_moved[REGNO] is nonzero.  */
2240
2241           /* An insn is desirable to move if the new lifetime of the
2242              register is no more than THRESHOLD times the old lifetime.
2243              If it's not desirable, it means the loop is so big
2244              that moving won't speed things up much,
2245              and it is liable to make register usage worse.  */
2246
2247           /* It is also desirable to move if it can be moved at no
2248              extra cost because something else was already moved.  */
2249
2250           if (already_moved[regno]
2251               || (threshold * savings * m->lifetime) >=
2252                  (regs->array[regno].moved_once ? insn_count * 2 : insn_count)
2253               || (m->forces && m->forces->done
2254                   && regs->array[m->forces->regno].n_times_set == 1))
2255             {
2256               int count;
2257               struct movable *m1;
2258               rtx first = NULL_RTX;
2259               rtx newreg = NULL_RTX;
2260
2261               if (m->insert_temp)
2262                 newreg = gen_reg_rtx (GET_MODE (m->set_dest));
2263
2264               /* Now move the insns that set the reg.  */
2265
2266               if (m->partial && m->match)
2267                 {
2268                   rtx newpat, i1;
2269                   rtx r1, r2;
2270                   /* Find the end of this chain of matching regs.
2271                      Thus, we load each reg in the chain from that one reg.
2272                      And that reg is loaded with 0 directly,
2273                      since it has ->match == 0.  */
2274                   for (m1 = m; m1->match; m1 = m1->match);
2275                   newpat = gen_move_insn (SET_DEST (PATTERN (m->insn)),
2276                                           SET_DEST (PATTERN (m1->insn)));
2277                   i1 = loop_insn_hoist (loop, newpat);
2278
2279                   /* Mark the moved, invariant reg as being allowed to
2280                      share a hard reg with the other matching invariant.  */
2281                   REG_NOTES (i1) = REG_NOTES (m->insn);
2282                   r1 = SET_DEST (PATTERN (m->insn));
2283                   r2 = SET_DEST (PATTERN (m1->insn));
2284                   regs_may_share
2285                     = gen_rtx_EXPR_LIST (VOIDmode, r1,
2286                                          gen_rtx_EXPR_LIST (VOIDmode, r2,
2287                                                             regs_may_share));
2288                   delete_insn (m->insn);
2289
2290                   if (new_start == 0)
2291                     new_start = i1;
2292
2293                   if (loop_dump_stream)
2294                     fprintf (loop_dump_stream, " moved to %d", INSN_UID (i1));
2295                 }
2296               /* If we are to re-generate the item being moved with a
2297                  new move insn, first delete what we have and then emit
2298                  the move insn before the loop.  */
2299               else if (m->move_insn)
2300                 {
2301                   rtx i1, temp, seq;
2302
2303                   for (count = m->consec; count >= 0; count--)
2304                     {
2305                       /* If this is the first insn of a library call sequence,
2306                          something is very wrong.  */
2307                       if (!NOTE_P (p)
2308                           && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
2309                         abort ();
2310
2311                       /* If this is the last insn of a libcall sequence, then
2312                          delete every insn in the sequence except the last.
2313                          The last insn is handled in the normal manner.  */
2314                       if (!NOTE_P (p)
2315                           && (temp = find_reg_note (p, REG_RETVAL, NULL_RTX)))
2316                         {
2317                           temp = XEXP (temp, 0);
2318                           while (temp != p)
2319                             temp = delete_insn (temp);
2320                         }
2321
2322                       temp = p;
2323                       p = delete_insn (p);
2324
2325                       /* simplify_giv_expr expects that it can walk the insns
2326                          at m->insn forwards and see this old sequence we are
2327                          tossing here.  delete_insn does preserve the next
2328                          pointers, but when we skip over a NOTE we must fix
2329                          it up.  Otherwise that code walks into the non-deleted
2330                          insn stream.  */
2331                       while (p && NOTE_P (p))
2332                         p = NEXT_INSN (temp) = NEXT_INSN (p);
2333
2334                       if (m->insert_temp)
2335                         {
2336                           /* Replace the original insn with a move from
2337                              our newly created temp.  */
2338                           start_sequence ();
2339                           emit_move_insn (m->set_dest, newreg);
2340                           seq = get_insns ();
2341                           end_sequence ();
2342                           emit_insn_before (seq, p);
2343                         }
2344                     }
2345
2346                   start_sequence ();
2347                   emit_move_insn (m->insert_temp ? newreg : m->set_dest,
2348                                   m->set_src);
2349                   seq = get_insns ();
2350                   end_sequence ();
2351
2352                   add_label_notes (m->set_src, seq);
2353
2354                   i1 = loop_insn_hoist (loop, seq);
2355                   if (! find_reg_note (i1, REG_EQUAL, NULL_RTX))
2356                     set_unique_reg_note (i1,
2357                                          m->is_equiv ? REG_EQUIV : REG_EQUAL,
2358                                          m->set_src);
2359
2360                   if (loop_dump_stream)
2361                     fprintf (loop_dump_stream, " moved to %d", INSN_UID (i1));
2362
2363                   /* The more regs we move, the less we like moving them.  */
2364                   threshold -= 3;
2365                 }
2366               else
2367                 {
2368                   for (count = m->consec; count >= 0; count--)
2369                     {
2370                       rtx i1, temp;
2371
2372                       /* If first insn of libcall sequence, skip to end.  */
2373                       /* Do this at start of loop, since p is guaranteed to
2374                          be an insn here.  */
2375                       if (!NOTE_P (p)
2376                           && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
2377                         p = XEXP (temp, 0);
2378
2379                       /* If last insn of libcall sequence, move all
2380                          insns except the last before the loop.  The last
2381                          insn is handled in the normal manner.  */
2382                       if (!NOTE_P (p)
2383                           && (temp = find_reg_note (p, REG_RETVAL, NULL_RTX)))
2384                         {
2385                           rtx fn_address = 0;
2386                           rtx fn_reg = 0;
2387                           rtx fn_address_insn = 0;
2388
2389                           first = 0;
2390                           for (temp = XEXP (temp, 0); temp != p;
2391                                temp = NEXT_INSN (temp))
2392                             {
2393                               rtx body;
2394                               rtx n;
2395                               rtx next;
2396
2397                               if (NOTE_P (temp))
2398                                 continue;
2399
2400                               body = PATTERN (temp);
2401
2402                               /* Find the next insn after TEMP,
2403                                  not counting USE or NOTE insns.  */
2404                               for (next = NEXT_INSN (temp); next != p;
2405                                    next = NEXT_INSN (next))
2406                                 if (! (NONJUMP_INSN_P (next)
2407                                        && GET_CODE (PATTERN (next)) == USE)
2408                                     && !NOTE_P (next))
2409                                   break;
2410
2411                               /* If that is the call, this may be the insn
2412                                  that loads the function address.
2413
2414                                  Extract the function address from the insn
2415                                  that loads it into a register.
2416                                  If this insn was cse'd, we get incorrect code.
2417
2418                                  So emit a new move insn that copies the
2419                                  function address into the register that the
2420                                  call insn will use.  flow.c will delete any
2421                                  redundant stores that we have created.  */
2422                               if (CALL_P (next)
2423                                   && GET_CODE (body) == SET
2424                                   && REG_P (SET_DEST (body))
2425                                   && (n = find_reg_note (temp, REG_EQUAL,
2426                                                          NULL_RTX)))
2427                                 {
2428                                   fn_reg = SET_SRC (body);
2429                                   if (!REG_P (fn_reg))
2430                                     fn_reg = SET_DEST (body);
2431                                   fn_address = XEXP (n, 0);
2432                                   fn_address_insn = temp;
2433                                 }
2434                               /* We have the call insn.
2435                                  If it uses the register we suspect it might,
2436                                  load it with the correct address directly.  */
2437                               if (CALL_P (temp)
2438                                   && fn_address != 0
2439                                   && reg_referenced_p (fn_reg, body))
2440                                 loop_insn_emit_after (loop, 0, fn_address_insn,
2441                                                       gen_move_insn
2442                                                       (fn_reg, fn_address));
2443
2444                               if (CALL_P (temp))
2445                                 {
2446                                   i1 = loop_call_insn_hoist (loop, body);
2447                                   /* Because the USAGE information potentially
2448                                      contains objects other than hard registers
2449                                      we need to copy it.  */
2450                                   if (CALL_INSN_FUNCTION_USAGE (temp))
2451                                     CALL_INSN_FUNCTION_USAGE (i1)
2452                                       = copy_rtx (CALL_INSN_FUNCTION_USAGE (temp));
2453                                 }
2454                               else
2455                                 i1 = loop_insn_hoist (loop, body);
2456                               if (first == 0)
2457                                 first = i1;
2458                               if (temp == fn_address_insn)
2459                                 fn_address_insn = i1;
2460                               REG_NOTES (i1) = REG_NOTES (temp);
2461                               REG_NOTES (temp) = NULL;
2462                               delete_insn (temp);
2463                             }
2464                           if (new_start == 0)
2465                             new_start = first;
2466                         }
2467                       if (m->savemode != VOIDmode)
2468                         {
2469                           /* P sets REG to zero; but we should clear only
2470                              the bits that are not covered by the mode
2471                              m->savemode.  */
2472                           rtx reg = m->set_dest;
2473                           rtx sequence;
2474                           rtx tem;
2475
2476                           start_sequence ();
2477                           tem = expand_simple_binop
2478                             (GET_MODE (reg), AND, reg,
2479                              GEN_INT ((((HOST_WIDE_INT) 1
2480                                         << GET_MODE_BITSIZE (m->savemode)))
2481                                       - 1),
2482                              reg, 1, OPTAB_LIB_WIDEN);
2483                           if (tem == 0)
2484                             abort ();
2485                           if (tem != reg)
2486                             emit_move_insn (reg, tem);
2487                           sequence = get_insns ();
2488                           end_sequence ();
2489                           i1 = loop_insn_hoist (loop, sequence);
2490                         }
2491                       else if (CALL_P (p))
2492                         {
2493                           i1 = loop_call_insn_hoist (loop, PATTERN (p));
2494                           /* Because the USAGE information potentially
2495                              contains objects other than hard registers
2496                              we need to copy it.  */
2497                           if (CALL_INSN_FUNCTION_USAGE (p))
2498                             CALL_INSN_FUNCTION_USAGE (i1)
2499                               = copy_rtx (CALL_INSN_FUNCTION_USAGE (p));
2500                         }
2501                       else if (count == m->consec && m->move_insn_first)
2502                         {
2503                           rtx seq;
2504                           /* The SET_SRC might not be invariant, so we must
2505                              use the REG_EQUAL note.  */
2506                           start_sequence ();
2507                           emit_move_insn (m->insert_temp ? newreg : m->set_dest,
2508                                           m->set_src);
2509                           seq = get_insns ();
2510                           end_sequence ();
2511
2512                           add_label_notes (m->set_src, seq);
2513
2514                           i1 = loop_insn_hoist (loop, seq);
2515                           if (! find_reg_note (i1, REG_EQUAL, NULL_RTX))
2516                             set_unique_reg_note (i1, m->is_equiv ? REG_EQUIV
2517                                                      : REG_EQUAL, m->set_src);
2518                         }
2519                       else if (m->insert_temp)
2520                         {
2521                           rtx *reg_map2 = xcalloc (REGNO (newreg),
2522                                                    sizeof(rtx));
2523                           reg_map2 [m->regno] = newreg;
2524
2525                           i1 = loop_insn_hoist (loop, copy_rtx (PATTERN (p)));
2526                           replace_regs (i1, reg_map2, REGNO (newreg), 1);
2527                           free (reg_map2);
2528                         }
2529                       else
2530                         i1 = loop_insn_hoist (loop, PATTERN (p));
2531
2532                       if (REG_NOTES (i1) == 0)
2533                         {
2534                           REG_NOTES (i1) = REG_NOTES (p);
2535                           REG_NOTES (p) = NULL;
2536
2537                           /* If there is a REG_EQUAL note present whose value
2538                              is not loop invariant, then delete it, since it
2539                              may cause problems with later optimization passes.
2540                              It is possible for cse to create such notes
2541                              like this as a result of record_jump_cond.  */
2542
2543                           if ((temp = find_reg_note (i1, REG_EQUAL, NULL_RTX))
2544                               && ! loop_invariant_p (loop, XEXP (temp, 0)))
2545                             remove_note (i1, temp);
2546                         }
2547
2548                       if (new_start == 0)
2549                         new_start = i1;
2550
2551                       if (loop_dump_stream)
2552                         fprintf (loop_dump_stream, " moved to %d",
2553                                  INSN_UID (i1));
2554
2555                       /* If library call, now fix the REG_NOTES that contain
2556                          insn pointers, namely REG_LIBCALL on FIRST
2557                          and REG_RETVAL on I1.  */
2558                       if ((temp = find_reg_note (i1, REG_RETVAL, NULL_RTX)))
2559                         {
2560                           XEXP (temp, 0) = first;
2561                           temp = find_reg_note (first, REG_LIBCALL, NULL_RTX);
2562                           XEXP (temp, 0) = i1;
2563                         }
2564
2565                       temp = p;
2566                       delete_insn (p);
2567                       p = NEXT_INSN (p);
2568
2569                       /* simplify_giv_expr expects that it can walk the insns
2570                          at m->insn forwards and see this old sequence we are
2571                          tossing here.  delete_insn does preserve the next
2572                          pointers, but when we skip over a NOTE we must fix
2573                          it up.  Otherwise that code walks into the non-deleted
2574                          insn stream.  */
2575                       while (p && NOTE_P (p))
2576                         p = NEXT_INSN (temp) = NEXT_INSN (p);
2577
2578                       if (m->insert_temp)
2579                         {
2580                           rtx seq;
2581                           /* Replace the original insn with a move from
2582                              our newly created temp.  */
2583                           start_sequence ();
2584                           emit_move_insn (m->set_dest, newreg);
2585                           seq = get_insns ();
2586                           end_sequence ();
2587                           emit_insn_before (seq, p);
2588                         }
2589                     }
2590
2591                   /* The more regs we move, the less we like moving them.  */
2592                   threshold -= 3;
2593                 }
2594
2595               m->done = 1;
2596
2597               if (!m->insert_temp)
2598                 {
2599                   /* Any other movable that loads the same register
2600                      MUST be moved.  */
2601                   already_moved[regno] = 1;
2602
2603                   /* This reg has been moved out of one loop.  */
2604                   regs->array[regno].moved_once = 1;
2605
2606                   /* The reg set here is now invariant.  */
2607                   if (! m->partial)
2608                     {
2609                       int i;
2610                       for (i = 0; i < LOOP_REGNO_NREGS (regno, m->set_dest); i++)
2611                         regs->array[regno+i].set_in_loop = 0;
2612                     }
2613
2614                   /* Change the length-of-life info for the register
2615                      to say it lives at least the full length of this loop.
2616                      This will help guide optimizations in outer loops.  */
2617
2618                   if (REGNO_FIRST_LUID (regno) > INSN_LUID (loop_start))
2619                     /* This is the old insn before all the moved insns.
2620                        We can't use the moved insn because it is out of range
2621                        in uid_luid.  Only the old insns have luids.  */
2622                     REGNO_FIRST_UID (regno) = INSN_UID (loop_start);
2623                   if (REGNO_LAST_LUID (regno) < INSN_LUID (loop_end))
2624                     REGNO_LAST_UID (regno) = INSN_UID (loop_end);
2625                 }
2626
2627               /* Combine with this moved insn any other matching movables.  */
2628
2629               if (! m->partial)
2630                 for (m1 = movables->head; m1; m1 = m1->next)
2631                   if (m1->match == m)
2632                     {
2633                       rtx temp;
2634
2635                       /* Schedule the reg loaded by M1
2636                          for replacement so that shares the reg of M.
2637                          If the modes differ (only possible in restricted
2638                          circumstances, make a SUBREG.
2639
2640                          Note this assumes that the target dependent files
2641                          treat REG and SUBREG equally, including within
2642                          GO_IF_LEGITIMATE_ADDRESS and in all the
2643                          predicates since we never verify that replacing the
2644                          original register with a SUBREG results in a
2645                          recognizable insn.  */
2646                       if (GET_MODE (m->set_dest) == GET_MODE (m1->set_dest))
2647                         reg_map[m1->regno] = m->set_dest;
2648                       else
2649                         reg_map[m1->regno]
2650                           = gen_lowpart_common (GET_MODE (m1->set_dest),
2651                                                 m->set_dest);
2652
2653                       /* Get rid of the matching insn
2654                          and prevent further processing of it.  */
2655                       m1->done = 1;
2656
2657                       /* If library call, delete all insns.  */
2658                       if ((temp = find_reg_note (m1->insn, REG_RETVAL,
2659                                                  NULL_RTX)))
2660                         delete_insn_chain (XEXP (temp, 0), m1->insn);
2661                       else
2662                         delete_insn (m1->insn);
2663
2664                       /* Any other movable that loads the same register
2665                          MUST be moved.  */
2666                       already_moved[m1->regno] = 1;
2667
2668                       /* The reg merged here is now invariant,
2669                          if the reg it matches is invariant.  */
2670                       if (! m->partial)
2671                         {
2672                           int i;
2673                           for (i = 0;
2674                                i < LOOP_REGNO_NREGS (regno, m1->set_dest);
2675                                i++)
2676                             regs->array[m1->regno+i].set_in_loop = 0;
2677                         }
2678                     }
2679             }
2680           else if (loop_dump_stream)
2681             fprintf (loop_dump_stream, "not desirable");
2682         }
2683       else if (loop_dump_stream && !m->match)
2684         fprintf (loop_dump_stream, "not safe");
2685
2686       if (loop_dump_stream)
2687         fprintf (loop_dump_stream, "\n");
2688     }
2689
2690   if (new_start == 0)
2691     new_start = loop_start;
2692
2693   /* Go through all the instructions in the loop, making
2694      all the register substitutions scheduled in REG_MAP.  */
2695   for (p = new_start; p != loop_end; p = NEXT_INSN (p))
2696     if (INSN_P (p))
2697       {
2698         replace_regs (PATTERN (p), reg_map, nregs, 0);
2699         replace_regs (REG_NOTES (p), reg_map, nregs, 0);
2700         INSN_CODE (p) = -1;
2701       }
2702
2703   /* Clean up.  */
2704   free (reg_map);
2705   free (already_moved);
2706 }
2707
2708
2709 static void
2710 loop_movables_add (struct loop_movables *movables, struct movable *m)
2711 {
2712   if (movables->head == 0)
2713     movables->head = m;
2714   else
2715     movables->last->next = m;
2716   movables->last = m;
2717 }
2718
2719
2720 static void
2721 loop_movables_free (struct loop_movables *movables)
2722 {
2723   struct movable *m;
2724   struct movable *m_next;
2725
2726   for (m = movables->head; m; m = m_next)
2727     {
2728       m_next = m->next;
2729       free (m);
2730     }
2731 }
2732 \f
2733 #if 0
2734 /* Scan X and replace the address of any MEM in it with ADDR.
2735    REG is the address that MEM should have before the replacement.  */
2736
2737 static void
2738 replace_call_address (rtx x, rtx reg, rtx addr)
2739 {
2740   enum rtx_code code;
2741   int i;
2742   const char *fmt;
2743
2744   if (x == 0)
2745     return;
2746   code = GET_CODE (x);
2747   switch (code)
2748     {
2749     case PC:
2750     case CC0:
2751     case CONST_INT:
2752     case CONST_DOUBLE:
2753     case CONST:
2754     case SYMBOL_REF:
2755     case LABEL_REF:
2756     case REG:
2757       return;
2758
2759     case SET:
2760       /* Short cut for very common case.  */
2761       replace_call_address (XEXP (x, 1), reg, addr);
2762       return;
2763
2764     case CALL:
2765       /* Short cut for very common case.  */
2766       replace_call_address (XEXP (x, 0), reg, addr);
2767       return;
2768
2769     case MEM:
2770       /* If this MEM uses a reg other than the one we expected,
2771          something is wrong.  */
2772       if (XEXP (x, 0) != reg)
2773         abort ();
2774       XEXP (x, 0) = addr;
2775       return;
2776
2777     default:
2778       break;
2779     }
2780
2781   fmt = GET_RTX_FORMAT (code);
2782   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2783     {
2784       if (fmt[i] == 'e')
2785         replace_call_address (XEXP (x, i), reg, addr);
2786       else if (fmt[i] == 'E')
2787         {
2788           int j;
2789           for (j = 0; j < XVECLEN (x, i); j++)
2790             replace_call_address (XVECEXP (x, i, j), reg, addr);
2791         }
2792     }
2793 }
2794 #endif
2795 \f
2796 /* Return the number of memory refs to addresses that vary
2797    in the rtx X.  */
2798
2799 static int
2800 count_nonfixed_reads (const struct loop *loop, rtx x)
2801 {
2802   enum rtx_code code;
2803   int i;
2804   const char *fmt;
2805   int value;
2806
2807   if (x == 0)
2808     return 0;
2809
2810   code = GET_CODE (x);
2811   switch (code)
2812     {
2813     case PC:
2814     case CC0:
2815     case CONST_INT:
2816     case CONST_DOUBLE:
2817     case CONST:
2818     case SYMBOL_REF:
2819     case LABEL_REF:
2820     case REG:
2821       return 0;
2822
2823     case MEM:
2824       return ((loop_invariant_p (loop, XEXP (x, 0)) != 1)
2825               + count_nonfixed_reads (loop, XEXP (x, 0)));
2826
2827     default:
2828       break;
2829     }
2830
2831   value = 0;
2832   fmt = GET_RTX_FORMAT (code);
2833   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2834     {
2835       if (fmt[i] == 'e')
2836         value += count_nonfixed_reads (loop, XEXP (x, i));
2837       if (fmt[i] == 'E')
2838         {
2839           int j;
2840           for (j = 0; j < XVECLEN (x, i); j++)
2841             value += count_nonfixed_reads (loop, XVECEXP (x, i, j));
2842         }
2843     }
2844   return value;
2845 }
2846 \f
2847 /* Scan a loop setting the elements `loops_enclosed',
2848    `has_call', `has_nonconst_call', `has_volatile', `has_tablejump',
2849    `unknown_address_altered', `unknown_constant_address_altered', and
2850    `num_mem_sets' in LOOP.  Also, fill in the array `mems' and the
2851    list `store_mems' in LOOP.  */
2852
2853 static void
2854 prescan_loop (struct loop *loop)
2855 {
2856   int level = 1;
2857   rtx insn;
2858   struct loop_info *loop_info = LOOP_INFO (loop);
2859   rtx start = loop->start;
2860   rtx end = loop->end;
2861   /* The label after END.  Jumping here is just like falling off the
2862      end of the loop.  We use next_nonnote_insn instead of next_label
2863      as a hedge against the (pathological) case where some actual insn
2864      might end up between the two.  */
2865   rtx exit_target = next_nonnote_insn (end);
2866
2867   loop_info->has_indirect_jump = indirect_jump_in_function;
2868   loop_info->pre_header_has_call = 0;
2869   loop_info->has_call = 0;
2870   loop_info->has_nonconst_call = 0;
2871   loop_info->has_prefetch = 0;
2872   loop_info->has_volatile = 0;
2873   loop_info->has_tablejump = 0;
2874   loop_info->has_multiple_exit_targets = 0;
2875   loop->level = 1;
2876
2877   loop_info->unknown_address_altered = 0;
2878   loop_info->unknown_constant_address_altered = 0;
2879   loop_info->store_mems = NULL_RTX;
2880   loop_info->first_loop_store_insn = NULL_RTX;
2881   loop_info->mems_idx = 0;
2882   loop_info->num_mem_sets = 0;
2883
2884   for (insn = start; insn && !LABEL_P (insn);
2885        insn = PREV_INSN (insn))
2886     {
2887       if (CALL_P (insn))
2888         {
2889           loop_info->pre_header_has_call = 1;
2890           break;
2891         }
2892     }
2893
2894   for (insn = NEXT_INSN (start); insn != NEXT_INSN (end);
2895        insn = NEXT_INSN (insn))
2896     {
2897       switch (GET_CODE (insn))
2898         {
2899         case NOTE:
2900           if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
2901             {
2902               ++level;
2903               /* Count number of loops contained in this one.  */
2904               loop->level++;
2905             }
2906           else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
2907             --level;
2908           break;
2909
2910         case CALL_INSN:
2911           if (! CONST_OR_PURE_CALL_P (insn))
2912             {
2913               loop_info->unknown_address_altered = 1;
2914               loop_info->has_nonconst_call = 1;
2915             }
2916           else if (pure_call_p (insn))
2917             loop_info->has_nonconst_call = 1;
2918           loop_info->has_call = 1;
2919           if (can_throw_internal (insn))
2920             loop_info->has_multiple_exit_targets = 1;
2921           break;
2922
2923         case JUMP_INSN:
2924           if (! loop_info->has_multiple_exit_targets)
2925             {
2926               rtx set = pc_set (insn);
2927
2928               if (set)
2929                 {
2930                   rtx src = SET_SRC (set);
2931                   rtx label1, label2;
2932
2933                   if (GET_CODE (src) == IF_THEN_ELSE)
2934                     {
2935                       label1 = XEXP (src, 1);
2936                       label2 = XEXP (src, 2);
2937                     }
2938                   else
2939                     {
2940                       label1 = src;
2941                       label2 = NULL_RTX;
2942                     }
2943
2944                   do
2945                     {
2946                       if (label1 && label1 != pc_rtx)
2947                         {
2948                           if (GET_CODE (label1) != LABEL_REF)
2949                             {
2950                               /* Something tricky.  */
2951                               loop_info->has_multiple_exit_targets = 1;
2952                               break;
2953                             }
2954                           else if (XEXP (label1, 0) != exit_target
2955                                    && LABEL_OUTSIDE_LOOP_P (label1))
2956                             {
2957                               /* A jump outside the current loop.  */
2958                               loop_info->has_multiple_exit_targets = 1;
2959                               break;
2960                             }
2961                         }
2962
2963                       label1 = label2;
2964                       label2 = NULL_RTX;
2965                     }
2966                   while (label1);
2967                 }
2968               else
2969                 {
2970                   /* A return, or something tricky.  */
2971                   loop_info->has_multiple_exit_targets = 1;
2972                 }
2973             }
2974           /* Fall through.  */
2975
2976         case INSN:
2977           if (volatile_refs_p (PATTERN (insn)))
2978             loop_info->has_volatile = 1;
2979
2980           if (JUMP_P (insn)
2981               && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
2982                   || GET_CODE (PATTERN (insn)) == ADDR_VEC))
2983             loop_info->has_tablejump = 1;
2984
2985           note_stores (PATTERN (insn), note_addr_stored, loop_info);
2986           if (! loop_info->first_loop_store_insn && loop_info->store_mems)
2987             loop_info->first_loop_store_insn = insn;
2988
2989           if (flag_non_call_exceptions && can_throw_internal (insn))
2990             loop_info->has_multiple_exit_targets = 1;
2991           break;
2992
2993         default:
2994           break;
2995         }
2996     }
2997
2998   /* Now, rescan the loop, setting up the LOOP_MEMS array.  */
2999   if (/* An exception thrown by a called function might land us
3000          anywhere.  */
3001       ! loop_info->has_nonconst_call
3002       /* We don't want loads for MEMs moved to a location before the
3003          one at which their stack memory becomes allocated.  (Note
3004          that this is not a problem for malloc, etc., since those
3005          require actual function calls.  */
3006       && ! current_function_calls_alloca
3007       /* There are ways to leave the loop other than falling off the
3008          end.  */
3009       && ! loop_info->has_multiple_exit_targets)
3010     for (insn = NEXT_INSN (start); insn != NEXT_INSN (end);
3011          insn = NEXT_INSN (insn))
3012       for_each_rtx (&insn, insert_loop_mem, loop_info);
3013
3014   /* BLKmode MEMs are added to LOOP_STORE_MEM as necessary so
3015      that loop_invariant_p and load_mems can use true_dependence
3016      to determine what is really clobbered.  */
3017   if (loop_info->unknown_address_altered)
3018     {
3019       rtx mem = gen_rtx_MEM (BLKmode, const0_rtx);
3020
3021       loop_info->store_mems
3022         = gen_rtx_EXPR_LIST (VOIDmode, mem, loop_info->store_mems);
3023     }
3024   if (loop_info->unknown_constant_address_altered)
3025     {
3026       rtx mem = gen_rtx_MEM (BLKmode, const0_rtx);
3027       MEM_READONLY_P (mem) = 1;
3028       loop_info->store_mems
3029         = gen_rtx_EXPR_LIST (VOIDmode, mem, loop_info->store_mems);
3030     }
3031 }
3032 \f
3033 /* Invalidate all loops containing LABEL.  */
3034
3035 static void
3036 invalidate_loops_containing_label (rtx label)
3037 {
3038   struct loop *loop;
3039   for (loop = uid_loop[INSN_UID (label)]; loop; loop = loop->outer)
3040     loop->invalid = 1;
3041 }
3042
3043 /* Scan the function looking for loops.  Record the start and end of each loop.
3044    Also mark as invalid loops any loops that contain a setjmp or are branched
3045    to from outside the loop.  */
3046
3047 static void
3048 find_and_verify_loops (rtx f, struct loops *loops)
3049 {
3050   rtx insn;
3051   rtx label;
3052   int num_loops;
3053   struct loop *current_loop;
3054   struct loop *next_loop;
3055   struct loop *loop;
3056
3057   num_loops = loops->num;
3058
3059   compute_luids (f, NULL_RTX, 0);
3060
3061   /* If there are jumps to undefined labels,
3062      treat them as jumps out of any/all loops.
3063      This also avoids writing past end of tables when there are no loops.  */
3064   uid_loop[0] = NULL;
3065
3066   /* Find boundaries of loops, mark which loops are contained within
3067      loops, and invalidate loops that have setjmp.  */
3068
3069   num_loops = 0;
3070   current_loop = NULL;
3071   for (insn = f; insn; insn = NEXT_INSN (insn))
3072     {
3073       if (NOTE_P (insn))
3074         switch (NOTE_LINE_NUMBER (insn))
3075           {
3076           case NOTE_INSN_LOOP_BEG:
3077             next_loop = loops->array + num_loops;
3078             next_loop->num = num_loops;
3079             num_loops++;
3080             next_loop->start = insn;
3081             next_loop->outer = current_loop;
3082             current_loop = next_loop;
3083             break;
3084
3085           case NOTE_INSN_LOOP_END:
3086             if (! current_loop)
3087               abort ();
3088
3089             current_loop->end = insn;
3090             current_loop = current_loop->outer;
3091             break;
3092
3093           default:
3094             break;
3095           }
3096
3097       if (CALL_P (insn)
3098           && find_reg_note (insn, REG_SETJMP, NULL))
3099         {
3100           /* In this case, we must invalidate our current loop and any
3101              enclosing loop.  */
3102           for (loop = current_loop; loop; loop = loop->outer)
3103             {
3104               loop->invalid = 1;
3105               if (loop_dump_stream)
3106                 fprintf (loop_dump_stream,
3107                          "\nLoop at %d ignored due to setjmp.\n",
3108                          INSN_UID (loop->start));
3109             }
3110         }
3111
3112       /* Note that this will mark the NOTE_INSN_LOOP_END note as being in the
3113          enclosing loop, but this doesn't matter.  */
3114       uid_loop[INSN_UID (insn)] = current_loop;
3115     }
3116
3117   /* Any loop containing a label used in an initializer must be invalidated,
3118      because it can be jumped into from anywhere.  */
3119   for (label = forced_labels; label; label = XEXP (label, 1))
3120     invalidate_loops_containing_label (XEXP (label, 0));
3121
3122   /* Any loop containing a label used for an exception handler must be
3123      invalidated, because it can be jumped into from anywhere.  */
3124   for_each_eh_label (invalidate_loops_containing_label);
3125
3126   /* Now scan all insn's in the function.  If any JUMP_INSN branches into a
3127      loop that it is not contained within, that loop is marked invalid.
3128      If any INSN or CALL_INSN uses a label's address, then the loop containing
3129      that label is marked invalid, because it could be jumped into from
3130      anywhere.
3131
3132      Also look for blocks of code ending in an unconditional branch that
3133      exits the loop.  If such a block is surrounded by a conditional
3134      branch around the block, move the block elsewhere (see below) and
3135      invert the jump to point to the code block.  This may eliminate a
3136      label in our loop and will simplify processing by both us and a
3137      possible second cse pass.  */
3138
3139   for (insn = f; insn; insn = NEXT_INSN (insn))
3140     if (INSN_P (insn))
3141       {
3142         struct loop *this_loop = uid_loop[INSN_UID (insn)];
3143
3144         if (NONJUMP_INSN_P (insn) || CALL_P (insn))
3145           {
3146             rtx note = find_reg_note (insn, REG_LABEL, NULL_RTX);
3147             if (note)
3148               invalidate_loops_containing_label (XEXP (note, 0));
3149           }
3150
3151         if (!JUMP_P (insn))
3152           continue;
3153
3154         mark_loop_jump (PATTERN (insn), this_loop);
3155
3156         /* See if this is an unconditional branch outside the loop.  */
3157         if (this_loop
3158             && (GET_CODE (PATTERN (insn)) == RETURN
3159                 || (any_uncondjump_p (insn)
3160                     && onlyjump_p (insn)
3161                     && (uid_loop[INSN_UID (JUMP_LABEL (insn))]
3162                         != this_loop)))
3163             && get_max_uid () < max_uid_for_loop)
3164           {
3165             rtx p;
3166             rtx our_next = next_real_insn (insn);
3167             rtx last_insn_to_move = NEXT_INSN (insn);
3168             struct loop *dest_loop;
3169             struct loop *outer_loop = NULL;
3170
3171             /* Go backwards until we reach the start of the loop, a label,
3172                or a JUMP_INSN.  */
3173             for (p = PREV_INSN (insn);
3174                  !LABEL_P (p)
3175                  && ! (NOTE_P (p)
3176                        && NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
3177                  && !JUMP_P (p);
3178                  p = PREV_INSN (p))
3179               ;
3180
3181             /* Check for the case where we have a jump to an inner nested
3182                loop, and do not perform the optimization in that case.  */
3183
3184             if (JUMP_LABEL (insn))
3185               {
3186                 dest_loop = uid_loop[INSN_UID (JUMP_LABEL (insn))];
3187                 if (dest_loop)
3188                   {
3189                     for (outer_loop = dest_loop; outer_loop;
3190                          outer_loop = outer_loop->outer)
3191                       if (outer_loop == this_loop)
3192                         break;
3193                   }
3194               }
3195
3196             /* Make sure that the target of P is within the current loop.  */
3197
3198             if (JUMP_P (p) && JUMP_LABEL (p)
3199                 && uid_loop[INSN_UID (JUMP_LABEL (p))] != this_loop)
3200               outer_loop = this_loop;
3201
3202             /* If we stopped on a JUMP_INSN to the next insn after INSN,
3203                we have a block of code to try to move.
3204
3205                We look backward and then forward from the target of INSN
3206                to find a BARRIER at the same loop depth as the target.
3207                If we find such a BARRIER, we make a new label for the start
3208                of the block, invert the jump in P and point it to that label,
3209                and move the block of code to the spot we found.  */
3210
3211             if (! outer_loop
3212                 && JUMP_P (p)
3213                 && JUMP_LABEL (p) != 0
3214                 /* Just ignore jumps to labels that were never emitted.
3215                    These always indicate compilation errors.  */
3216                 && INSN_UID (JUMP_LABEL (p)) != 0
3217                 && any_condjump_p (p) && onlyjump_p (p)
3218                 && next_real_insn (JUMP_LABEL (p)) == our_next
3219                 /* If it's not safe to move the sequence, then we
3220                    mustn't try.  */
3221                 && insns_safe_to_move_p (p, NEXT_INSN (insn),
3222                                          &last_insn_to_move))
3223               {
3224                 rtx target
3225                   = JUMP_LABEL (insn) ? JUMP_LABEL (insn) : get_last_insn ();
3226                 struct loop *target_loop = uid_loop[INSN_UID (target)];
3227                 rtx loc, loc2;
3228                 rtx tmp;
3229
3230                 /* Search for possible garbage past the conditional jumps
3231                    and look for the last barrier.  */
3232                 for (tmp = last_insn_to_move;
3233                      tmp && !LABEL_P (tmp); tmp = NEXT_INSN (tmp))
3234                   if (BARRIER_P (tmp))
3235                     last_insn_to_move = tmp;
3236
3237                 for (loc = target; loc; loc = PREV_INSN (loc))
3238                   if (BARRIER_P (loc)
3239                       /* Don't move things inside a tablejump.  */
3240                       && ((loc2 = next_nonnote_insn (loc)) == 0
3241                           || !LABEL_P (loc2)
3242                           || (loc2 = next_nonnote_insn (loc2)) == 0
3243                           || !JUMP_P (loc2)
3244                           || (GET_CODE (PATTERN (loc2)) != ADDR_VEC
3245                               && GET_CODE (PATTERN (loc2)) != ADDR_DIFF_VEC))
3246                       && uid_loop[INSN_UID (loc)] == target_loop)
3247                     break;
3248
3249                 if (loc == 0)
3250                   for (loc = target; loc; loc = NEXT_INSN (loc))
3251                     if (BARRIER_P (loc)
3252                         /* Don't move things inside a tablejump.  */
3253                         && ((loc2 = next_nonnote_insn (loc)) == 0
3254                             || !LABEL_P (loc2)
3255                             || (loc2 = next_nonnote_insn (loc2)) == 0
3256                             || !JUMP_P (loc2)
3257                             || (GET_CODE (PATTERN (loc2)) != ADDR_VEC
3258                                 && GET_CODE (PATTERN (loc2)) != ADDR_DIFF_VEC))
3259                         && uid_loop[INSN_UID (loc)] == target_loop)
3260                       break;
3261
3262                 if (loc)
3263                   {
3264                     rtx cond_label = JUMP_LABEL (p);
3265                     rtx new_label = get_label_after (p);
3266
3267                     /* Ensure our label doesn't go away.  */
3268                     LABEL_NUSES (cond_label)++;
3269
3270                     /* Verify that uid_loop is large enough and that
3271                        we can invert P.  */
3272                     if (invert_jump (p, new_label, 1))
3273                       {
3274                         rtx q, r;
3275
3276                         /* If no suitable BARRIER was found, create a suitable
3277                            one before TARGET.  Since TARGET is a fall through
3278                            path, we'll need to insert a jump around our block
3279                            and add a BARRIER before TARGET.
3280
3281                            This creates an extra unconditional jump outside
3282                            the loop.  However, the benefits of removing rarely
3283                            executed instructions from inside the loop usually
3284                            outweighs the cost of the extra unconditional jump
3285                            outside the loop.  */
3286                         if (loc == 0)
3287                           {
3288                             rtx temp;
3289
3290                             temp = gen_jump (JUMP_LABEL (insn));
3291                             temp = emit_jump_insn_before (temp, target);
3292                             JUMP_LABEL (temp) = JUMP_LABEL (insn);
3293                             LABEL_NUSES (JUMP_LABEL (insn))++;
3294                             loc = emit_barrier_before (target);
3295                           }
3296
3297                         /* Include the BARRIER after INSN and copy the
3298                            block after LOC.  */
3299                         if (squeeze_notes (&new_label, &last_insn_to_move))
3300                           abort ();
3301                         reorder_insns (new_label, last_insn_to_move, loc);
3302
3303                         /* All those insns are now in TARGET_LOOP.  */
3304                         for (q = new_label;
3305                              q != NEXT_INSN (last_insn_to_move);
3306                              q = NEXT_INSN (q))
3307                           uid_loop[INSN_UID (q)] = target_loop;
3308
3309                         /* The label jumped to by INSN is no longer a loop
3310                            exit.  Unless INSN does not have a label (e.g.,
3311                            it is a RETURN insn), search loop->exit_labels
3312                            to find its label_ref, and remove it.  Also turn
3313                            off LABEL_OUTSIDE_LOOP_P bit.  */
3314                         if (JUMP_LABEL (insn))
3315                           {
3316                             for (q = 0, r = this_loop->exit_labels;
3317                                  r;
3318                                  q = r, r = LABEL_NEXTREF (r))
3319                               if (XEXP (r, 0) == JUMP_LABEL (insn))
3320                                 {
3321                                   LABEL_OUTSIDE_LOOP_P (r) = 0;
3322                                   if (q)
3323                                     LABEL_NEXTREF (q) = LABEL_NEXTREF (r);
3324                                   else
3325                                     this_loop->exit_labels = LABEL_NEXTREF (r);
3326                                   break;
3327                                 }
3328
3329                             for (loop = this_loop; loop && loop != target_loop;
3330                                  loop = loop->outer)
3331                               loop->exit_count--;
3332
3333                             /* If we didn't find it, then something is
3334                                wrong.  */
3335                             if (! r)
3336                               abort ();
3337                           }
3338
3339                         /* P is now a jump outside the loop, so it must be put
3340                            in loop->exit_labels, and marked as such.
3341                            The easiest way to do this is to just call
3342                            mark_loop_jump again for P.  */
3343                         mark_loop_jump (PATTERN (p), this_loop);
3344
3345                         /* If INSN now jumps to the insn after it,
3346                            delete INSN.  */
3347                         if (JUMP_LABEL (insn) != 0
3348                             && (next_real_insn (JUMP_LABEL (insn))
3349                                 == next_real_insn (insn)))
3350                           delete_related_insns (insn);
3351                       }
3352
3353                     /* Continue the loop after where the conditional
3354                        branch used to jump, since the only branch insn
3355                        in the block (if it still remains) is an inter-loop
3356                        branch and hence needs no processing.  */
3357                     insn = NEXT_INSN (cond_label);
3358
3359                     if (--LABEL_NUSES (cond_label) == 0)
3360                       delete_related_insns (cond_label);
3361
3362                     /* This loop will be continued with NEXT_INSN (insn).  */
3363                     insn = PREV_INSN (insn);
3364                   }
3365               }
3366           }
3367       }
3368 }
3369
3370 /* If any label in X jumps to a loop different from LOOP_NUM and any of the
3371    loops it is contained in, mark the target loop invalid.
3372
3373    For speed, we assume that X is part of a pattern of a JUMP_INSN.  */
3374
3375 static void
3376 mark_loop_jump (rtx x, struct loop *loop)
3377 {
3378   struct loop *dest_loop;
3379   struct loop *outer_loop;
3380   int i;
3381
3382   switch (GET_CODE (x))
3383     {
3384     case PC:
3385     case USE:
3386     case CLOBBER:
3387     case REG:
3388     case MEM:
3389     case CONST_INT:
3390     case CONST_DOUBLE:
3391     case RETURN:
3392       return;
3393
3394     case CONST:
3395       /* There could be a label reference in here.  */
3396       mark_loop_jump (XEXP (x, 0), loop);
3397       return;
3398
3399     case PLUS:
3400     case MINUS:
3401     case MULT:
3402       mark_loop_jump (XEXP (x, 0), loop);
3403       mark_loop_jump (XEXP (x, 1), loop);
3404       return;
3405
3406     case LO_SUM:
3407       /* This may refer to a LABEL_REF or SYMBOL_REF.  */
3408       mark_loop_jump (XEXP (x, 1), loop);
3409       return;
3410
3411     case SIGN_EXTEND:
3412     case ZERO_EXTEND:
3413       mark_loop_jump (XEXP (x, 0), loop);
3414       return;
3415
3416     case LABEL_REF:
3417       dest_loop = uid_loop[INSN_UID (XEXP (x, 0))];
3418
3419       /* Link together all labels that branch outside the loop.  This
3420          is used by final_[bg]iv_value and the loop unrolling code.  Also
3421          mark this LABEL_REF so we know that this branch should predict
3422          false.  */
3423
3424       /* A check to make sure the label is not in an inner nested loop,
3425          since this does not count as a loop exit.  */
3426       if (dest_loop)
3427         {
3428           for (outer_loop = dest_loop; outer_loop;
3429                outer_loop = outer_loop->outer)
3430             if (outer_loop == loop)
3431               break;
3432         }
3433       else
3434         outer_loop = NULL;
3435
3436       if (loop && ! outer_loop)
3437         {
3438           LABEL_OUTSIDE_LOOP_P (x) = 1;
3439           LABEL_NEXTREF (x) = loop->exit_labels;
3440           loop->exit_labels = x;
3441
3442           for (outer_loop = loop;
3443                outer_loop && outer_loop != dest_loop;
3444                outer_loop = outer_loop->outer)
3445             outer_loop->exit_count++;
3446         }
3447
3448       /* If this is inside a loop, but not in the current loop or one enclosed
3449          by it, it invalidates at least one loop.  */
3450
3451       if (! dest_loop)
3452         return;
3453
3454       /* We must invalidate every nested loop containing the target of this
3455          label, except those that also contain the jump insn.  */
3456
3457       for (; dest_loop; dest_loop = dest_loop->outer)
3458         {
3459           /* Stop when we reach a loop that also contains the jump insn.  */
3460           for (outer_loop = loop; outer_loop; outer_loop = outer_loop->outer)
3461             if (dest_loop == outer_loop)
3462               return;
3463
3464           /* If we get here, we know we need to invalidate a loop.  */
3465           if (loop_dump_stream && ! dest_loop->invalid)
3466             fprintf (loop_dump_stream,
3467                      "\nLoop at %d ignored due to multiple entry points.\n",
3468                      INSN_UID (dest_loop->start));
3469
3470           dest_loop->invalid = 1;
3471         }
3472       return;
3473
3474     case SET:
3475       /* If this is not setting pc, ignore.  */
3476       if (SET_DEST (x) == pc_rtx)
3477         mark_loop_jump (SET_SRC (x), loop);
3478       return;
3479
3480     case IF_THEN_ELSE:
3481       mark_loop_jump (XEXP (x, 1), loop);
3482       mark_loop_jump (XEXP (x, 2), loop);
3483       return;
3484
3485     case PARALLEL:
3486     case ADDR_VEC:
3487       for (i = 0; i < XVECLEN (x, 0); i++)
3488         mark_loop_jump (XVECEXP (x, 0, i), loop);
3489       return;
3490
3491     case ADDR_DIFF_VEC:
3492       for (i = 0; i < XVECLEN (x, 1); i++)
3493         mark_loop_jump (XVECEXP (x, 1, i), loop);
3494       return;
3495
3496     default:
3497       /* Strictly speaking this is not a jump into the loop, only a possible
3498          jump out of the loop.  However, we have no way to link the destination
3499          of this jump onto the list of exit labels.  To be safe we mark this
3500          loop and any containing loops as invalid.  */
3501       if (loop)
3502         {
3503           for (outer_loop = loop; outer_loop; outer_loop = outer_loop->outer)
3504             {
3505               if (loop_dump_stream && ! outer_loop->invalid)
3506                 fprintf (loop_dump_stream,
3507                          "\nLoop at %d ignored due to unknown exit jump.\n",
3508                          INSN_UID (outer_loop->start));
3509               outer_loop->invalid = 1;
3510             }
3511         }
3512       return;
3513     }
3514 }
3515 \f
3516 /* Return nonzero if there is a label in the range from
3517    insn INSN to and including the insn whose luid is END
3518    INSN must have an assigned luid (i.e., it must not have
3519    been previously created by loop.c).  */
3520
3521 static int
3522 labels_in_range_p (rtx insn, int end)
3523 {
3524   while (insn && INSN_LUID (insn) <= end)
3525     {
3526       if (LABEL_P (insn))
3527         return 1;
3528       insn = NEXT_INSN (insn);
3529     }
3530
3531   return 0;
3532 }
3533
3534 /* Record that a memory reference X is being set.  */
3535
3536 static void
3537 note_addr_stored (rtx x, rtx y ATTRIBUTE_UNUSED,
3538                   void *data ATTRIBUTE_UNUSED)
3539 {
3540   struct loop_info *loop_info = data;
3541
3542   if (x == 0 || !MEM_P (x))
3543     return;
3544
3545   /* Count number of memory writes.
3546      This affects heuristics in strength_reduce.  */
3547   loop_info->num_mem_sets++;
3548
3549   /* BLKmode MEM means all memory is clobbered.  */
3550   if (GET_MODE (x) == BLKmode)
3551     {
3552       if (MEM_READONLY_P (x))
3553         loop_info->unknown_constant_address_altered = 1;
3554       else
3555         loop_info->unknown_address_altered = 1;
3556
3557       return;
3558     }
3559
3560   loop_info->store_mems = gen_rtx_EXPR_LIST (VOIDmode, x,
3561                                              loop_info->store_mems);
3562 }
3563
3564 /* X is a value modified by an INSN that references a biv inside a loop
3565    exit test (i.e., X is somehow related to the value of the biv).  If X
3566    is a pseudo that is used more than once, then the biv is (effectively)
3567    used more than once.  DATA is a pointer to a loop_regs structure.  */
3568
3569 static void
3570 note_set_pseudo_multiple_uses (rtx x, rtx y ATTRIBUTE_UNUSED, void *data)
3571 {
3572   struct loop_regs *regs = (struct loop_regs *) data;
3573
3574   if (x == 0)
3575     return;
3576
3577   while (GET_CODE (x) == STRICT_LOW_PART
3578          || GET_CODE (x) == SIGN_EXTRACT
3579          || GET_CODE (x) == ZERO_EXTRACT
3580          || GET_CODE (x) == SUBREG)
3581     x = XEXP (x, 0);
3582
3583   if (!REG_P (x) || REGNO (x) < FIRST_PSEUDO_REGISTER)
3584     return;
3585
3586   /* If we do not have usage information, or if we know the register
3587      is used more than once, note that fact for check_dbra_loop.  */
3588   if (REGNO (x) >= max_reg_before_loop
3589       || ! regs->array[REGNO (x)].single_usage
3590       || regs->array[REGNO (x)].single_usage == const0_rtx)
3591     regs->multiple_uses = 1;
3592 }
3593 \f
3594 /* Return nonzero if the rtx X is invariant over the current loop.
3595
3596    The value is 2 if we refer to something only conditionally invariant.
3597
3598    A memory ref is invariant if it is not volatile and does not conflict
3599    with anything stored in `loop_info->store_mems'.  */
3600
3601 static int
3602 loop_invariant_p (const struct loop *loop, rtx x)
3603 {
3604   struct loop_info *loop_info = LOOP_INFO (loop);
3605   struct loop_regs *regs = LOOP_REGS (loop);
3606   int i;
3607   enum rtx_code code;
3608   const char *fmt;
3609   int conditional = 0;
3610   rtx mem_list_entry;
3611
3612   if (x == 0)
3613     return 1;
3614   code = GET_CODE (x);
3615   switch (code)
3616     {
3617     case CONST_INT:
3618     case CONST_DOUBLE:
3619     case SYMBOL_REF:
3620     case CONST:
3621       return 1;
3622
3623     case LABEL_REF:
3624       return 1;
3625
3626     case PC:
3627     case CC0:
3628     case UNSPEC_VOLATILE:
3629       return 0;
3630
3631     case REG:
3632       if ((x == frame_pointer_rtx || x == hard_frame_pointer_rtx
3633            || x == arg_pointer_rtx || x == pic_offset_table_rtx)
3634           && ! current_function_has_nonlocal_goto)
3635         return 1;
3636
3637       if (LOOP_INFO (loop)->has_call
3638           && REGNO (x) < FIRST_PSEUDO_REGISTER && call_used_regs[REGNO (x)])
3639         return 0;
3640
3641       /* Out-of-range regs can occur when we are called from unrolling.
3642          These registers created by the unroller are set in the loop,
3643          hence are never invariant.
3644          Other out-of-range regs can be generated by load_mems; those that
3645          are written to in the loop are not invariant, while those that are
3646          not written to are invariant.  It would be easy for load_mems
3647          to set n_times_set correctly for these registers, however, there
3648          is no easy way to distinguish them from registers created by the
3649          unroller.  */
3650
3651       if (REGNO (x) >= (unsigned) regs->num)
3652         return 0;
3653
3654       if (regs->array[REGNO (x)].set_in_loop < 0)
3655         return 2;
3656
3657       return regs->array[REGNO (x)].set_in_loop == 0;
3658
3659     case MEM:
3660       /* Volatile memory references must be rejected.  Do this before
3661          checking for read-only items, so that volatile read-only items
3662          will be rejected also.  */
3663       if (MEM_VOLATILE_P (x))
3664         return 0;
3665
3666       /* See if there is any dependence between a store and this load.  */
3667       mem_list_entry = loop_info->store_mems;
3668       while (mem_list_entry)
3669         {
3670           if (true_dependence (XEXP (mem_list_entry, 0), VOIDmode,
3671                                x, rtx_varies_p))
3672             return 0;
3673
3674           mem_list_entry = XEXP (mem_list_entry, 1);
3675         }
3676
3677       /* It's not invalidated by a store in memory
3678          but we must still verify the address is invariant.  */
3679       break;
3680
3681     case ASM_OPERANDS:
3682       /* Don't mess with insns declared volatile.  */
3683       if (MEM_VOLATILE_P (x))
3684         return 0;
3685       break;
3686
3687     default:
3688       break;
3689     }
3690
3691   fmt = GET_RTX_FORMAT (code);
3692   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3693     {
3694       if (fmt[i] == 'e')
3695         {
3696           int tem = loop_invariant_p (loop, XEXP (x, i));
3697           if (tem == 0)
3698             return 0;
3699           if (tem == 2)
3700             conditional = 1;
3701         }
3702       else if (fmt[i] == 'E')
3703         {
3704           int j;
3705           for (j = 0; j < XVECLEN (x, i); j++)
3706             {
3707               int tem = loop_invariant_p (loop, XVECEXP (x, i, j));
3708               if (tem == 0)
3709                 return 0;
3710               if (tem == 2)
3711                 conditional = 1;
3712             }
3713
3714         }
3715     }
3716
3717   return 1 + conditional;
3718 }
3719 \f
3720 /* Return nonzero if all the insns in the loop that set REG
3721    are INSN and the immediately following insns,
3722    and if each of those insns sets REG in an invariant way
3723    (not counting uses of REG in them).
3724
3725    The value is 2 if some of these insns are only conditionally invariant.
3726
3727    We assume that INSN itself is the first set of REG
3728    and that its source is invariant.  */
3729
3730 static int
3731 consec_sets_invariant_p (const struct loop *loop, rtx reg, int n_sets,
3732                          rtx insn)
3733 {
3734   struct loop_regs *regs = LOOP_REGS (loop);
3735   rtx p = insn;
3736   unsigned int regno = REGNO (reg);
3737   rtx temp;
3738   /* Number of sets we have to insist on finding after INSN.  */
3739   int count = n_sets - 1;
3740   int old = regs->array[regno].set_in_loop;
3741   int value = 0;
3742   int this;
3743
3744   /* If N_SETS hit the limit, we can't rely on its value.  */
3745   if (n_sets == 127)
3746     return 0;
3747
3748   regs->array[regno].set_in_loop = 0;
3749
3750   while (count > 0)
3751     {
3752       enum rtx_code code;
3753       rtx set;
3754
3755       p = NEXT_INSN (p);
3756       code = GET_CODE (p);
3757
3758       /* If library call, skip to end of it.  */
3759       if (code == INSN && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
3760         p = XEXP (temp, 0);
3761
3762       this = 0;
3763       if (code == INSN
3764           && (set = single_set (p))
3765           && REG_P (SET_DEST (set))
3766           && REGNO (SET_DEST (set)) == regno)
3767         {
3768           this = loop_invariant_p (loop, SET_SRC (set));
3769           if (this != 0)
3770             value |= this;
3771           else if ((temp = find_reg_note (p, REG_EQUAL, NULL_RTX)))
3772             {
3773               /* If this is a libcall, then any invariant REG_EQUAL note is OK.
3774                  If this is an ordinary insn, then only CONSTANT_P REG_EQUAL
3775                  notes are OK.  */
3776               this = (CONSTANT_P (XEXP (temp, 0))
3777                       || (find_reg_note (p, REG_RETVAL, NULL_RTX)
3778                           && loop_invariant_p (loop, XEXP (temp, 0))));
3779               if (this != 0)
3780                 value |= this;
3781             }
3782         }
3783       if (this != 0)
3784         count--;
3785       else if (code != NOTE)
3786         {
3787           regs->array[regno].set_in_loop = old;
3788           return 0;
3789         }
3790     }
3791
3792   regs->array[regno].set_in_loop = old;
3793   /* If loop_invariant_p ever returned 2, we return 2.  */
3794   return 1 + (value & 2);
3795 }
3796 \f
3797 /* Look at all uses (not sets) of registers in X.  For each, if it is
3798    the single use, set USAGE[REGNO] to INSN; if there was a previous use in
3799    a different insn, set USAGE[REGNO] to const0_rtx.  */
3800
3801 static void
3802 find_single_use_in_loop (struct loop_regs *regs, rtx insn, rtx x)
3803 {
3804   enum rtx_code code = GET_CODE (x);
3805   const char *fmt = GET_RTX_FORMAT (code);
3806   int i, j;
3807
3808   if (code == REG)
3809     regs->array[REGNO (x)].single_usage
3810       = (regs->array[REGNO (x)].single_usage != 0
3811          && regs->array[REGNO (x)].single_usage != insn)
3812         ? const0_rtx : insn;
3813
3814   else if (code == SET)
3815     {
3816       /* Don't count SET_DEST if it is a REG; otherwise count things
3817          in SET_DEST because if a register is partially modified, it won't
3818          show up as a potential movable so we don't care how USAGE is set
3819          for it.  */
3820       if (!REG_P (SET_DEST (x)))
3821         find_single_use_in_loop (regs, insn, SET_DEST (x));
3822       find_single_use_in_loop (regs, insn, SET_SRC (x));
3823     }
3824   else
3825     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3826       {
3827         if (fmt[i] == 'e' && XEXP (x, i) != 0)
3828           find_single_use_in_loop (regs, insn, XEXP (x, i));
3829         else if (fmt[i] == 'E')
3830           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
3831             find_single_use_in_loop (regs, insn, XVECEXP (x, i, j));
3832       }
3833 }
3834 \f
3835 /* Count and record any set in X which is contained in INSN.  Update
3836    REGS->array[I].MAY_NOT_OPTIMIZE and LAST_SET for any register I set
3837    in X.  */
3838
3839 static void
3840 count_one_set (struct loop_regs *regs, rtx insn, rtx x, rtx *last_set)
3841 {
3842   if (GET_CODE (x) == CLOBBER && REG_P (XEXP (x, 0)))
3843     /* Don't move a reg that has an explicit clobber.
3844        It's not worth the pain to try to do it correctly.  */
3845     regs->array[REGNO (XEXP (x, 0))].may_not_optimize = 1;
3846
3847   if (GET_CODE (x) == SET || GET_CODE (x) == CLOBBER)
3848     {
3849       rtx dest = SET_DEST (x);
3850       while (GET_CODE (dest) == SUBREG
3851              || GET_CODE (dest) == ZERO_EXTRACT
3852              || GET_CODE (dest) == STRICT_LOW_PART)
3853         dest = XEXP (dest, 0);
3854       if (REG_P (dest))
3855         {
3856           int i;
3857           int regno = REGNO (dest);
3858           for (i = 0; i < LOOP_REGNO_NREGS (regno, dest); i++)
3859             {
3860               /* If this is the first setting of this reg
3861                  in current basic block, and it was set before,
3862                  it must be set in two basic blocks, so it cannot
3863                  be moved out of the loop.  */
3864               if (regs->array[regno].set_in_loop > 0
3865                   && last_set[regno] == 0)
3866                 regs->array[regno+i].may_not_optimize = 1;
3867               /* If this is not first setting in current basic block,
3868                  see if reg was used in between previous one and this.
3869                  If so, neither one can be moved.  */
3870               if (last_set[regno] != 0
3871                   && reg_used_between_p (dest, last_set[regno], insn))
3872                 regs->array[regno+i].may_not_optimize = 1;
3873               if (regs->array[regno+i].set_in_loop < 127)
3874                 ++regs->array[regno+i].set_in_loop;
3875               last_set[regno+i] = insn;
3876             }
3877         }
3878     }
3879 }
3880 \f
3881 /* Given a loop that is bounded by LOOP->START and LOOP->END and that
3882    is entered at LOOP->SCAN_START, return 1 if the register set in SET
3883    contained in insn INSN is used by any insn that precedes INSN in
3884    cyclic order starting from the loop entry point.
3885
3886    We don't want to use INSN_LUID here because if we restrict INSN to those
3887    that have a valid INSN_LUID, it means we cannot move an invariant out
3888    from an inner loop past two loops.  */
3889
3890 static int
3891 loop_reg_used_before_p (const struct loop *loop, rtx set, rtx insn)
3892 {
3893   rtx reg = SET_DEST (set);
3894   rtx p;
3895
3896   /* Scan forward checking for register usage.  If we hit INSN, we
3897      are done.  Otherwise, if we hit LOOP->END, wrap around to LOOP->START.  */
3898   for (p = loop->scan_start; p != insn; p = NEXT_INSN (p))
3899     {
3900       if (INSN_P (p) && reg_overlap_mentioned_p (reg, PATTERN (p)))
3901         return 1;
3902
3903       if (p == loop->end)
3904         p = loop->start;
3905     }
3906
3907   return 0;
3908 }
3909 \f
3910
3911 /* Information we collect about arrays that we might want to prefetch.  */
3912 struct prefetch_info
3913 {
3914   struct iv_class *class;       /* Class this prefetch is based on.  */
3915   struct induction *giv;        /* GIV this prefetch is based on.  */
3916   rtx base_address;             /* Start prefetching from this address plus
3917                                    index.  */
3918   HOST_WIDE_INT index;
3919   HOST_WIDE_INT stride;         /* Prefetch stride in bytes in each
3920                                    iteration.  */
3921   unsigned int bytes_accessed;  /* Sum of sizes of all accesses to this
3922                                    prefetch area in one iteration.  */
3923   unsigned int total_bytes;     /* Total bytes loop will access in this block.
3924                                    This is set only for loops with known
3925                                    iteration counts and is 0xffffffff
3926                                    otherwise.  */
3927   int prefetch_in_loop;         /* Number of prefetch insns in loop.  */
3928   int prefetch_before_loop;     /* Number of prefetch insns before loop.  */
3929   unsigned int write : 1;       /* 1 for read/write prefetches.  */
3930 };
3931
3932 /* Data used by check_store function.  */
3933 struct check_store_data
3934 {
3935   rtx mem_address;
3936   int mem_write;
3937 };
3938
3939 static void check_store (rtx, rtx, void *);
3940 static void emit_prefetch_instructions (struct loop *);
3941 static int rtx_equal_for_prefetch_p (rtx, rtx);
3942
3943 /* Set mem_write when mem_address is found.  Used as callback to
3944    note_stores.  */
3945 static void
3946 check_store (rtx x, rtx pat ATTRIBUTE_UNUSED, void *data)
3947 {
3948   struct check_store_data *d = (struct check_store_data *) data;
3949
3950   if ((MEM_P (x)) && rtx_equal_p (d->mem_address, XEXP (x, 0)))
3951     d->mem_write = 1;
3952 }
3953 \f
3954 /* Like rtx_equal_p, but attempts to swap commutative operands.  This is
3955    important to get some addresses combined.  Later more sophisticated
3956    transformations can be added when necessary.
3957
3958    ??? Same trick with swapping operand is done at several other places.
3959    It can be nice to develop some common way to handle this.  */
3960
3961 static int
3962 rtx_equal_for_prefetch_p (rtx x, rtx y)
3963 {
3964   int i;
3965   int j;
3966   enum rtx_code code = GET_CODE (x);
3967   const char *fmt;
3968
3969   if (x == y)
3970     return 1;
3971   if (code != GET_CODE (y))
3972     return 0;
3973
3974   if (COMMUTATIVE_ARITH_P (x))
3975     {
3976       return ((rtx_equal_for_prefetch_p (XEXP (x, 0), XEXP (y, 0))
3977                && rtx_equal_for_prefetch_p (XEXP (x, 1), XEXP (y, 1)))
3978               || (rtx_equal_for_prefetch_p (XEXP (x, 0), XEXP (y, 1))
3979                   && rtx_equal_for_prefetch_p (XEXP (x, 1), XEXP (y, 0))));
3980     }
3981
3982   /* Compare the elements.  If any pair of corresponding elements fails to
3983      match, return 0 for the whole thing.  */
3984
3985   fmt = GET_RTX_FORMAT (code);
3986   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3987     {
3988       switch (fmt[i])
3989         {
3990         case 'w':
3991           if (XWINT (x, i) != XWINT (y, i))
3992             return 0;
3993           break;
3994
3995         case 'i':
3996           if (XINT (x, i) != XINT (y, i))
3997             return 0;
3998           break;
3999
4000         case 'E':
4001           /* Two vectors must have the same length.  */
4002           if (XVECLEN (x, i) != XVECLEN (y, i))
4003             return 0;
4004
4005           /* And the corresponding elements must match.  */
4006           for (j = 0; j < XVECLEN (x, i); j++)
4007             if (rtx_equal_for_prefetch_p (XVECEXP (x, i, j),
4008                                           XVECEXP (y, i, j)) == 0)
4009               return 0;
4010           break;
4011
4012         case 'e':
4013           if (rtx_equal_for_prefetch_p (XEXP (x, i), XEXP (y, i)) == 0)
4014             return 0;
4015           break;
4016
4017         case 's':
4018           if (strcmp (XSTR (x, i), XSTR (y, i)))
4019             return 0;
4020           break;
4021
4022         case 'u':
4023           /* These are just backpointers, so they don't matter.  */
4024           break;
4025
4026         case '0':
4027           break;
4028
4029           /* It is believed that rtx's at this level will never
4030              contain anything but integers and other rtx's,
4031              except for within LABEL_REFs and SYMBOL_REFs.  */
4032         default:
4033           abort ();
4034         }
4035     }
4036   return 1;
4037 }
4038 \f
4039 /* Remove constant addition value from the expression X (when present)
4040    and return it.  */
4041
4042 static HOST_WIDE_INT
4043 remove_constant_addition (rtx *x)
4044 {
4045   HOST_WIDE_INT addval = 0;
4046   rtx exp = *x;
4047
4048   /* Avoid clobbering a shared CONST expression.  */
4049   if (GET_CODE (exp) == CONST)
4050     {
4051       if (GET_CODE (XEXP (exp, 0)) == PLUS
4052           && GET_CODE (XEXP (XEXP (exp, 0), 0)) == SYMBOL_REF
4053           && GET_CODE (XEXP (XEXP (exp, 0), 1)) == CONST_INT)
4054         {
4055           *x = XEXP (XEXP (exp, 0), 0);
4056           return INTVAL (XEXP (XEXP (exp, 0), 1));
4057         }
4058       return 0;
4059     }
4060
4061   if (GET_CODE (exp) == CONST_INT)
4062     {
4063       addval = INTVAL (exp);
4064       *x = const0_rtx;
4065     }
4066
4067   /* For plus expression recurse on ourself.  */
4068   else if (GET_CODE (exp) == PLUS)
4069     {
4070       addval += remove_constant_addition (&XEXP (exp, 0));
4071       addval += remove_constant_addition (&XEXP (exp, 1));
4072
4073       /* In case our parameter was constant, remove extra zero from the
4074          expression.  */
4075       if (XEXP (exp, 0) == const0_rtx)
4076         *x = XEXP (exp, 1);
4077       else if (XEXP (exp, 1) == const0_rtx)
4078         *x = XEXP (exp, 0);
4079     }
4080
4081   return addval;
4082 }
4083
4084 /* Attempt to identify accesses to arrays that are most likely to cause cache
4085    misses, and emit prefetch instructions a few prefetch blocks forward.
4086
4087    To detect the arrays we use the GIV information that was collected by the
4088    strength reduction pass.
4089
4090    The prefetch instructions are generated after the GIV information is done
4091    and before the strength reduction process. The new GIVs are injected into
4092    the strength reduction tables, so the prefetch addresses are optimized as
4093    well.
4094
4095    GIVs are split into base address, stride, and constant addition values.
4096    GIVs with the same address, stride and close addition values are combined
4097    into a single prefetch.  Also writes to GIVs are detected, so that prefetch
4098    for write instructions can be used for the block we write to, on machines
4099    that support write prefetches.
4100
4101    Several heuristics are used to determine when to prefetch.  They are
4102    controlled by defined symbols that can be overridden for each target.  */
4103
4104 static void
4105 emit_prefetch_instructions (struct loop *loop)
4106 {
4107   int num_prefetches = 0;
4108   int num_real_prefetches = 0;
4109   int num_real_write_prefetches = 0;
4110   int num_prefetches_before = 0;
4111   int num_write_prefetches_before = 0;
4112   int ahead = 0;
4113   int i;
4114   struct iv_class *bl;
4115   struct induction *iv;
4116   struct prefetch_info info[MAX_PREFETCHES];
4117   struct loop_ivs *ivs = LOOP_IVS (loop);
4118
4119   if (!HAVE_prefetch || PREFETCH_BLOCK == 0)
4120     return;
4121
4122   /* Consider only loops w/o calls.  When a call is done, the loop is probably
4123      slow enough to read the memory.  */
4124   if (PREFETCH_NO_CALL && LOOP_INFO (loop)->has_call)
4125     {
4126       if (loop_dump_stream)
4127         fprintf (loop_dump_stream, "Prefetch: ignoring loop: has call.\n");
4128
4129       return;
4130     }
4131
4132   /* Don't prefetch in loops known to have few iterations.  */
4133   if (PREFETCH_NO_LOW_LOOPCNT
4134       && LOOP_INFO (loop)->n_iterations
4135       && LOOP_INFO (loop)->n_iterations <= PREFETCH_LOW_LOOPCNT)
4136     {
4137       if (loop_dump_stream)
4138         fprintf (loop_dump_stream,
4139                  "Prefetch: ignoring loop: not enough iterations.\n");
4140       return;
4141     }
4142
4143   /* Search all induction variables and pick those interesting for the prefetch
4144      machinery.  */
4145   for (bl = ivs->list; bl; bl = bl->next)
4146     {
4147       struct induction *biv = bl->biv, *biv1;
4148       int basestride = 0;
4149
4150       biv1 = biv;
4151
4152       /* Expect all BIVs to be executed in each iteration.  This makes our
4153          analysis more conservative.  */
4154       while (biv1)
4155         {
4156           /* Discard non-constant additions that we can't handle well yet, and
4157              BIVs that are executed multiple times; such BIVs ought to be
4158              handled in the nested loop.  We accept not_every_iteration BIVs,
4159              since these only result in larger strides and make our
4160              heuristics more conservative.  */
4161           if (GET_CODE (biv->add_val) != CONST_INT)
4162             {
4163               if (loop_dump_stream)
4164                 {
4165                   fprintf (loop_dump_stream,
4166                     "Prefetch: ignoring biv %d: non-constant addition at insn %d:",
4167                            REGNO (biv->src_reg), INSN_UID (biv->insn));
4168                   print_rtl (loop_dump_stream, biv->add_val);
4169                   fprintf (loop_dump_stream, "\n");
4170                 }
4171               break;
4172             }
4173
4174           if (biv->maybe_multiple)
4175             {
4176               if (loop_dump_stream)
4177                 {
4178                   fprintf (loop_dump_stream,
4179                            "Prefetch: ignoring biv %d: maybe_multiple at insn %i:",
4180                            REGNO (biv->src_reg), INSN_UID (biv->insn));
4181                   print_rtl (loop_dump_stream, biv->add_val);
4182                   fprintf (loop_dump_stream, "\n");
4183                 }
4184               break;
4185             }
4186
4187           basestride += INTVAL (biv1->add_val);
4188           biv1 = biv1->next_iv;
4189         }
4190
4191       if (biv1 || !basestride)
4192         continue;
4193
4194       for (iv = bl->giv; iv; iv = iv->next_iv)
4195         {
4196           rtx address;
4197           rtx temp;
4198           HOST_WIDE_INT index = 0;
4199           int add = 1;
4200           HOST_WIDE_INT stride = 0;
4201           int stride_sign = 1;
4202           struct check_store_data d;
4203           const char *ignore_reason = NULL;
4204           int size = GET_MODE_SIZE (GET_MODE (iv));
4205
4206           /* See whether an induction variable is interesting to us and if
4207              not, report the reason.  */
4208           if (iv->giv_type != DEST_ADDR)
4209             ignore_reason = "giv is not a destination address";
4210
4211           /* We are interested only in constant stride memory references
4212              in order to be able to compute density easily.  */
4213           else if (GET_CODE (iv->mult_val) != CONST_INT)
4214             ignore_reason = "stride is not constant";
4215
4216           else
4217             {
4218               stride = INTVAL (iv->mult_val) * basestride;
4219               if (stride < 0)
4220                 {
4221                   stride = -stride;
4222                   stride_sign = -1;
4223                 }
4224
4225               /* On some targets, reversed order prefetches are not
4226                  worthwhile.  */
4227               if (PREFETCH_NO_REVERSE_ORDER && stride_sign < 0)
4228                 ignore_reason = "reversed order stride";
4229
4230               /* Prefetch of accesses with an extreme stride might not be
4231                  worthwhile, either.  */
4232               else if (PREFETCH_NO_EXTREME_STRIDE
4233                        && stride > PREFETCH_EXTREME_STRIDE)
4234                 ignore_reason = "extreme stride";
4235
4236               /* Ignore GIVs with varying add values; we can't predict the
4237                  value for the next iteration.  */
4238               else if (!loop_invariant_p (loop, iv->add_val))
4239                 ignore_reason = "giv has varying add value";
4240
4241               /* Ignore GIVs in the nested loops; they ought to have been
4242                  handled already.  */
4243               else if (iv->maybe_multiple)
4244                 ignore_reason = "giv is in nested loop";
4245             }
4246
4247           if (ignore_reason != NULL)
4248             {
4249               if (loop_dump_stream)
4250                 fprintf (loop_dump_stream,
4251                          "Prefetch: ignoring giv at %d: %s.\n",
4252                          INSN_UID (iv->insn), ignore_reason);
4253               continue;
4254             }
4255
4256           /* Determine the pointer to the basic array we are examining.  It is
4257              the sum of the BIV's initial value and the GIV's add_val.  */
4258           address = copy_rtx (iv->add_val);
4259           temp = copy_rtx (bl->initial_value);
4260
4261           address = simplify_gen_binary (PLUS, Pmode, temp, address);
4262           index = remove_constant_addition (&address);
4263
4264           d.mem_write = 0;
4265           d.mem_address = *iv->location;
4266
4267           /* When the GIV is not always executed, we might be better off by
4268              not dirtying the cache pages.  */
4269           if (PREFETCH_CONDITIONAL || iv->always_executed)
4270             note_stores (PATTERN (iv->insn), check_store, &d);
4271           else
4272             {
4273               if (loop_dump_stream)
4274                 fprintf (loop_dump_stream, "Prefetch: Ignoring giv at %d: %s\n",
4275                          INSN_UID (iv->insn), "in conditional code.");
4276               continue;
4277             }
4278
4279           /* Attempt to find another prefetch to the same array and see if we
4280              can merge this one.  */
4281           for (i = 0; i < num_prefetches; i++)
4282             if (rtx_equal_for_prefetch_p (address, info[i].base_address)
4283                 && stride == info[i].stride)
4284               {
4285                 /* In case both access same array (same location
4286                    just with small difference in constant indexes), merge
4287                    the prefetches.  Just do the later and the earlier will
4288                    get prefetched from previous iteration.
4289                    The artificial threshold should not be too small,
4290                    but also not bigger than small portion of memory usually
4291                    traversed by single loop.  */
4292                 if (index >= info[i].index
4293                     && index - info[i].index < PREFETCH_EXTREME_DIFFERENCE)
4294                   {
4295                     info[i].write |= d.mem_write;
4296                     info[i].bytes_accessed += size;
4297                     info[i].index = index;
4298                     info[i].giv = iv;
4299                     info[i].class = bl;
4300                     info[num_prefetches].base_address = address;
4301                     add = 0;
4302                     break;
4303                   }
4304
4305                 if (index < info[i].index
4306                     && info[i].index - index < PREFETCH_EXTREME_DIFFERENCE)
4307                   {
4308                     info[i].write |= d.mem_write;
4309                     info[i].bytes_accessed += size;
4310                     add = 0;
4311                     break;
4312                   }
4313               }
4314
4315           /* Merging failed.  */
4316           if (add)
4317             {
4318               info[num_prefetches].giv = iv;
4319               info[num_prefetches].class = bl;
4320               info[num_prefetches].index = index;
4321               info[num_prefetches].stride = stride;
4322               info[num_prefetches].base_address = address;
4323               info[num_prefetches].write = d.mem_write;
4324               info[num_prefetches].bytes_accessed = size;
4325               num_prefetches++;
4326               if (num_prefetches >= MAX_PREFETCHES)
4327                 {
4328                   if (loop_dump_stream)
4329                     fprintf (loop_dump_stream,
4330                              "Maximal number of prefetches exceeded.\n");
4331                   return;
4332                 }
4333             }
4334         }
4335     }
4336
4337   for (i = 0; i < num_prefetches; i++)
4338     {
4339       int density;
4340
4341       /* Attempt to calculate the total number of bytes fetched by all
4342          iterations of the loop.  Avoid overflow.  */
4343       if (LOOP_INFO (loop)->n_iterations
4344           && ((unsigned HOST_WIDE_INT) (0xffffffff / info[i].stride)
4345               >= LOOP_INFO (loop)->n_iterations))
4346         info[i].total_bytes = info[i].stride * LOOP_INFO (loop)->n_iterations;
4347       else
4348         info[i].total_bytes = 0xffffffff;
4349
4350       density = info[i].bytes_accessed * 100 / info[i].stride;
4351
4352       /* Prefetch might be worthwhile only when the loads/stores are dense.  */
4353       if (PREFETCH_ONLY_DENSE_MEM)
4354         if (density * 256 > PREFETCH_DENSE_MEM * 100
4355             && (info[i].total_bytes / PREFETCH_BLOCK
4356                 >= PREFETCH_BLOCKS_BEFORE_LOOP_MIN))
4357           {
4358             info[i].prefetch_before_loop = 1;
4359             info[i].prefetch_in_loop
4360               = (info[i].total_bytes / PREFETCH_BLOCK
4361                  > PREFETCH_BLOCKS_BEFORE_LOOP_MAX);
4362           }
4363         else
4364           {
4365             info[i].prefetch_in_loop = 0, info[i].prefetch_before_loop = 0;
4366             if (loop_dump_stream)
4367               fprintf (loop_dump_stream,
4368                   "Prefetch: ignoring giv at %d: %d%% density is too low.\n",
4369                        INSN_UID (info[i].giv->insn), density);
4370           }
4371       else
4372         info[i].prefetch_in_loop = 1, info[i].prefetch_before_loop = 1;
4373
4374       /* Find how many prefetch instructions we'll use within the loop.  */
4375       if (info[i].prefetch_in_loop != 0)
4376         {
4377           info[i].prefetch_in_loop = ((info[i].stride + PREFETCH_BLOCK - 1)
4378                                   / PREFETCH_BLOCK);
4379           num_real_prefetches += info[i].prefetch_in_loop;
4380           if (info[i].write)
4381             num_real_write_prefetches += info[i].prefetch_in_loop;
4382         }
4383     }
4384
4385   /* Determine how many iterations ahead to prefetch within the loop, based
4386      on how many prefetches we currently expect to do within the loop.  */
4387   if (num_real_prefetches != 0)
4388     {
4389       if ((ahead = SIMULTANEOUS_PREFETCHES / num_real_prefetches) == 0)
4390         {
4391           if (loop_dump_stream)
4392             fprintf (loop_dump_stream,
4393                      "Prefetch: ignoring prefetches within loop: ahead is zero; %d < %d\n",
4394                      SIMULTANEOUS_PREFETCHES, num_real_prefetches);
4395           num_real_prefetches = 0, num_real_write_prefetches = 0;
4396         }
4397     }
4398   /* We'll also use AHEAD to determine how many prefetch instructions to
4399      emit before a loop, so don't leave it zero.  */
4400   if (ahead == 0)
4401     ahead = PREFETCH_BLOCKS_BEFORE_LOOP_MAX;
4402
4403   for (i = 0; i < num_prefetches; i++)
4404     {
4405       /* Update if we've decided not to prefetch anything within the loop.  */
4406       if (num_real_prefetches == 0)
4407         info[i].prefetch_in_loop = 0;
4408
4409       /* Find how many prefetch instructions we'll use before the loop.  */
4410       if (info[i].prefetch_before_loop != 0)
4411         {
4412           int n = info[i].total_bytes / PREFETCH_BLOCK;
4413           if (n > ahead)
4414             n = ahead;
4415           info[i].prefetch_before_loop = n;
4416           num_prefetches_before += n;
4417           if (info[i].write)
4418             num_write_prefetches_before += n;
4419         }
4420
4421       if (loop_dump_stream)
4422         {
4423           if (info[i].prefetch_in_loop == 0
4424               && info[i].prefetch_before_loop == 0)
4425             continue;
4426           fprintf (loop_dump_stream, "Prefetch insn: %d",
4427                    INSN_UID (info[i].giv->insn));
4428           fprintf (loop_dump_stream,
4429                    "; in loop: %d; before: %d; %s\n",
4430                    info[i].prefetch_in_loop,
4431                    info[i].prefetch_before_loop,
4432                    info[i].write ? "read/write" : "read only");
4433           fprintf (loop_dump_stream,
4434                    " density: %d%%; bytes_accessed: %u; total_bytes: %u\n",
4435                    (int) (info[i].bytes_accessed * 100 / info[i].stride),
4436                    info[i].bytes_accessed, info[i].total_bytes);
4437           fprintf (loop_dump_stream, " index: " HOST_WIDE_INT_PRINT_DEC
4438                    "; stride: " HOST_WIDE_INT_PRINT_DEC "; address: ",
4439                    info[i].index, info[i].stride);
4440           print_rtl (loop_dump_stream, info[i].base_address);
4441           fprintf (loop_dump_stream, "\n");
4442         }
4443     }
4444
4445   if (num_real_prefetches + num_prefetches_before > 0)
4446     {
4447       /* Record that this loop uses prefetch instructions.  */
4448       LOOP_INFO (loop)->has_prefetch = 1;
4449
4450       if (loop_dump_stream)
4451         {
4452           fprintf (loop_dump_stream, "Real prefetches needed within loop: %d (write: %d)\n",
4453                    num_real_prefetches, num_real_write_prefetches);
4454           fprintf (loop_dump_stream, "Real prefetches needed before loop: %d (write: %d)\n",
4455                    num_prefetches_before, num_write_prefetches_before);
4456         }
4457     }
4458
4459   for (i = 0; i < num_prefetches; i++)
4460     {
4461       int y;
4462
4463       for (y = 0; y < info[i].prefetch_in_loop; y++)
4464         {
4465           rtx loc = copy_rtx (*info[i].giv->location);
4466           rtx insn;
4467           int bytes_ahead = PREFETCH_BLOCK * (ahead + y);
4468           rtx before_insn = info[i].giv->insn;
4469           rtx prev_insn = PREV_INSN (info[i].giv->insn);
4470           rtx seq;
4471
4472           /* We can save some effort by offsetting the address on
4473              architectures with offsettable memory references.  */
4474           if (offsettable_address_p (0, VOIDmode, loc))
4475             loc = plus_constant (loc, bytes_ahead);
4476           else
4477             {
4478               rtx reg = gen_reg_rtx (Pmode);
4479               loop_iv_add_mult_emit_before (loop, loc, const1_rtx,
4480                                             GEN_INT (bytes_ahead), reg,
4481                                             0, before_insn);
4482               loc = reg;
4483             }
4484
4485           start_sequence ();
4486           /* Make sure the address operand is valid for prefetch.  */
4487           if (! (*insn_data[(int)CODE_FOR_prefetch].operand[0].predicate)
4488                   (loc, insn_data[(int)CODE_FOR_prefetch].operand[0].mode))
4489             loc = force_reg (Pmode, loc);
4490           emit_insn (gen_prefetch (loc, GEN_INT (info[i].write),
4491                                    GEN_INT (3)));
4492           seq = get_insns ();
4493           end_sequence ();
4494           emit_insn_before (seq, before_insn);
4495
4496           /* Check all insns emitted and record the new GIV
4497              information.  */
4498           insn = NEXT_INSN (prev_insn);
4499           while (insn != before_insn)
4500             {
4501               insn = check_insn_for_givs (loop, insn,
4502                                           info[i].giv->always_executed,
4503                                           info[i].giv->maybe_multiple);
4504               insn = NEXT_INSN (insn);
4505             }
4506         }
4507
4508       if (PREFETCH_BEFORE_LOOP)
4509         {
4510           /* Emit insns before the loop to fetch the first cache lines or,
4511              if we're not prefetching within the loop, everything we expect
4512              to need.  */
4513           for (y = 0; y < info[i].prefetch_before_loop; y++)
4514             {
4515               rtx reg = gen_reg_rtx (Pmode);
4516               rtx loop_start = loop->start;
4517               rtx init_val = info[i].class->initial_value;
4518               rtx add_val = simplify_gen_binary (PLUS, Pmode,
4519                                                  info[i].giv->add_val,
4520                                                  GEN_INT (y * PREFETCH_BLOCK));
4521
4522               /* Functions called by LOOP_IV_ADD_EMIT_BEFORE expect a
4523                  non-constant INIT_VAL to have the same mode as REG, which
4524                  in this case we know to be Pmode.  */
4525               if (GET_MODE (init_val) != Pmode && !CONSTANT_P (init_val))
4526                 {
4527                   rtx seq;
4528
4529                   start_sequence ();
4530                   init_val = convert_to_mode (Pmode, init_val, 0);
4531                   seq = get_insns ();
4532                   end_sequence ();
4533                   loop_insn_emit_before (loop, 0, loop_start, seq);
4534                 }
4535               loop_iv_add_mult_emit_before (loop, init_val,
4536                                             info[i].giv->mult_val,
4537                                             add_val, reg, 0, loop_start);
4538               emit_insn_before (gen_prefetch (reg, GEN_INT (info[i].write),
4539                                               GEN_INT (3)),
4540                                 loop_start);
4541             }
4542         }
4543     }
4544
4545   return;
4546 }
4547 \f
4548 /* Communication with routines called via `note_stores'.  */
4549
4550 static rtx note_insn;
4551
4552 /* Dummy register to have nonzero DEST_REG for DEST_ADDR type givs.  */
4553
4554 static rtx addr_placeholder;
4555
4556 /* ??? Unfinished optimizations, and possible future optimizations,
4557    for the strength reduction code.  */
4558
4559 /* ??? The interaction of biv elimination, and recognition of 'constant'
4560    bivs, may cause problems.  */
4561
4562 /* ??? Add heuristics so that DEST_ADDR strength reduction does not cause
4563    performance problems.
4564
4565    Perhaps don't eliminate things that can be combined with an addressing
4566    mode.  Find all givs that have the same biv, mult_val, and add_val;
4567    then for each giv, check to see if its only use dies in a following
4568    memory address.  If so, generate a new memory address and check to see
4569    if it is valid.   If it is valid, then store the modified memory address,
4570    otherwise, mark the giv as not done so that it will get its own iv.  */
4571
4572 /* ??? Could try to optimize branches when it is known that a biv is always
4573    positive.  */
4574
4575 /* ??? When replace a biv in a compare insn, we should replace with closest
4576    giv so that an optimized branch can still be recognized by the combiner,
4577    e.g. the VAX acb insn.  */
4578
4579 /* ??? Many of the checks involving uid_luid could be simplified if regscan
4580    was rerun in loop_optimize whenever a register was added or moved.
4581    Also, some of the optimizations could be a little less conservative.  */
4582 \f
4583 /* Searches the insns between INSN and LOOP->END.  Returns 1 if there
4584    is a backward branch in that range that branches to somewhere between
4585    LOOP->START and INSN.  Returns 0 otherwise.  */
4586
4587 /* ??? This is quadratic algorithm.  Could be rewritten to be linear.
4588    In practice, this is not a problem, because this function is seldom called,
4589    and uses a negligible amount of CPU time on average.  */
4590
4591 static int
4592 back_branch_in_range_p (const struct loop *loop, rtx insn)
4593 {
4594   rtx p, q, target_insn;
4595   rtx loop_start = loop->start;
4596   rtx loop_end = loop->end;
4597   rtx orig_loop_end = loop->end;
4598
4599   /* Stop before we get to the backward branch at the end of the loop.  */
4600   loop_end = prev_nonnote_insn (loop_end);
4601   if (BARRIER_P (loop_end))
4602     loop_end = PREV_INSN (loop_end);
4603
4604   /* Check in case insn has been deleted, search forward for first non
4605      deleted insn following it.  */
4606   while (INSN_DELETED_P (insn))
4607     insn = NEXT_INSN (insn);
4608
4609   /* Check for the case where insn is the last insn in the loop.  Deal
4610      with the case where INSN was a deleted loop test insn, in which case
4611      it will now be the NOTE_LOOP_END.  */
4612   if (insn == loop_end || insn == orig_loop_end)
4613     return 0;
4614
4615   for (p = NEXT_INSN (insn); p != loop_end; p = NEXT_INSN (p))
4616     {
4617       if (JUMP_P (p))
4618         {
4619           target_insn = JUMP_LABEL (p);
4620
4621           /* Search from loop_start to insn, to see if one of them is
4622              the target_insn.  We can't use INSN_LUID comparisons here,
4623              since insn may not have an LUID entry.  */
4624           for (q = loop_start; q != insn; q = NEXT_INSN (q))
4625             if (q == target_insn)
4626               return 1;
4627         }
4628     }
4629
4630   return 0;
4631 }
4632
4633 /* Scan the loop body and call FNCALL for each insn.  In the addition to the
4634    LOOP and INSN parameters pass MAYBE_MULTIPLE and NOT_EVERY_ITERATION to the
4635    callback.
4636
4637    NOT_EVERY_ITERATION is 1 if current insn is not known to be executed at
4638    least once for every loop iteration except for the last one.
4639
4640    MAYBE_MULTIPLE is 1 if current insn may be executed more than once for every
4641    loop iteration.
4642  */
4643 typedef rtx (*loop_insn_callback) (struct loop *, rtx, int, int);
4644 static void
4645 for_each_insn_in_loop (struct loop *loop, loop_insn_callback fncall)
4646 {
4647   int not_every_iteration = 0;
4648   int maybe_multiple = 0;
4649   int past_loop_latch = 0;
4650   rtx p;
4651
4652   /* If loop_scan_start points to the loop exit test, we have to be wary of
4653      subversive use of gotos inside expression statements.  */
4654   if (prev_nonnote_insn (loop->scan_start) != prev_nonnote_insn (loop->start))
4655     maybe_multiple = back_branch_in_range_p (loop, loop->scan_start);
4656
4657   /* Scan through loop and update NOT_EVERY_ITERATION and MAYBE_MULTIPLE.  */
4658   for (p = next_insn_in_loop (loop, loop->scan_start);
4659        p != NULL_RTX;
4660        p = next_insn_in_loop (loop, p))
4661     {
4662       p = fncall (loop, p, not_every_iteration, maybe_multiple);
4663
4664       /* Past CODE_LABEL, we get to insns that may be executed multiple
4665          times.  The only way we can be sure that they can't is if every
4666          jump insn between here and the end of the loop either
4667          returns, exits the loop, is a jump to a location that is still
4668          behind the label, or is a jump to the loop start.  */
4669
4670       if (LABEL_P (p))
4671         {
4672           rtx insn = p;
4673
4674           maybe_multiple = 0;
4675
4676           while (1)
4677             {
4678               insn = NEXT_INSN (insn);
4679               if (insn == loop->scan_start)
4680                 break;
4681               if (insn == loop->end)
4682                 {
4683                   if (loop->top != 0)
4684                     insn = loop->top;
4685                   else
4686                     break;
4687                   if (insn == loop->scan_start)
4688                     break;
4689                 }
4690
4691               if (JUMP_P (insn)
4692                   && GET_CODE (PATTERN (insn)) != RETURN
4693                   && (!any_condjump_p (insn)
4694                       || (JUMP_LABEL (insn) != 0
4695                           && JUMP_LABEL (insn) != loop->scan_start
4696                           && !loop_insn_first_p (p, JUMP_LABEL (insn)))))
4697                 {
4698                   maybe_multiple = 1;
4699                   break;
4700                 }
4701             }
4702         }
4703
4704       /* Past a jump, we get to insns for which we can't count
4705          on whether they will be executed during each iteration.  */
4706       /* This code appears twice in strength_reduce.  There is also similar
4707          code in scan_loop.  */
4708       if (JUMP_P (p)
4709       /* If we enter the loop in the middle, and scan around to the
4710          beginning, don't set not_every_iteration for that.
4711          This can be any kind of jump, since we want to know if insns
4712          will be executed if the loop is executed.  */
4713           && !(JUMP_LABEL (p) == loop->top
4714                && ((NEXT_INSN (NEXT_INSN (p)) == loop->end
4715                     && any_uncondjump_p (p))
4716                    || (NEXT_INSN (p) == loop->end && any_condjump_p (p)))))
4717         {
4718           rtx label = 0;
4719
4720           /* If this is a jump outside the loop, then it also doesn't
4721              matter.  Check to see if the target of this branch is on the
4722              loop->exits_labels list.  */
4723
4724           for (label = loop->exit_labels; label; label = LABEL_NEXTREF (label))
4725             if (XEXP (label, 0) == JUMP_LABEL (p))
4726               break;
4727
4728           if (!label)
4729             not_every_iteration = 1;
4730         }
4731
4732       /* Note if we pass a loop latch.  If we do, then we can not clear
4733          NOT_EVERY_ITERATION below when we pass the last CODE_LABEL in
4734          a loop since a jump before the last CODE_LABEL may have started
4735          a new loop iteration.
4736
4737          Note that LOOP_TOP is only set for rotated loops and we need
4738          this check for all loops, so compare against the CODE_LABEL
4739          which immediately follows LOOP_START.  */
4740       if (JUMP_P (p)
4741           && JUMP_LABEL (p) == NEXT_INSN (loop->start))
4742         past_loop_latch = 1;
4743
4744       /* Unlike in the code motion pass where MAYBE_NEVER indicates that
4745          an insn may never be executed, NOT_EVERY_ITERATION indicates whether
4746          or not an insn is known to be executed each iteration of the
4747          loop, whether or not any iterations are known to occur.
4748
4749          Therefore, if we have just passed a label and have no more labels
4750          between here and the test insn of the loop, and we have not passed
4751          a jump to the top of the loop, then we know these insns will be
4752          executed each iteration.  */
4753
4754       if (not_every_iteration
4755           && !past_loop_latch
4756           && LABEL_P (p)
4757           && no_labels_between_p (p, loop->end))
4758         not_every_iteration = 0;
4759     }
4760 }
4761 \f
4762 static void
4763 loop_bivs_find (struct loop *loop)
4764 {
4765   struct loop_regs *regs = LOOP_REGS (loop);
4766   struct loop_ivs *ivs = LOOP_IVS (loop);
4767   /* Temporary list pointers for traversing ivs->list.  */
4768   struct iv_class *bl, **backbl;
4769
4770   ivs->list = 0;
4771
4772   for_each_insn_in_loop (loop, check_insn_for_bivs);
4773
4774   /* Scan ivs->list to remove all regs that proved not to be bivs.
4775      Make a sanity check against regs->n_times_set.  */
4776   for (backbl = &ivs->list, bl = *backbl; bl; bl = bl->next)
4777     {
4778       if (REG_IV_TYPE (ivs, bl->regno) != BASIC_INDUCT
4779           /* Above happens if register modified by subreg, etc.  */
4780           /* Make sure it is not recognized as a basic induction var: */
4781           || regs->array[bl->regno].n_times_set != bl->biv_count
4782           /* If never incremented, it is invariant that we decided not to
4783              move.  So leave it alone.  */
4784           || ! bl->incremented)
4785         {
4786           if (loop_dump_stream)
4787             fprintf (loop_dump_stream, "Biv %d: discarded, %s\n",
4788                      bl->regno,
4789                      (REG_IV_TYPE (ivs, bl->regno) != BASIC_INDUCT
4790                       ? "not induction variable"
4791                       : (! bl->incremented ? "never incremented"
4792                          : "count error")));
4793
4794           REG_IV_TYPE (ivs, bl->regno) = NOT_BASIC_INDUCT;
4795           *backbl = bl->next;
4796         }
4797       else
4798         {
4799           backbl = &bl->next;
4800
4801           if (loop_dump_stream)
4802             fprintf (loop_dump_stream, "Biv %d: verified\n", bl->regno);
4803         }
4804     }
4805 }
4806
4807
4808 /* Determine how BIVS are initialized by looking through pre-header
4809    extended basic block.  */
4810 static void
4811 loop_bivs_init_find (struct loop *loop)
4812 {
4813   struct loop_ivs *ivs = LOOP_IVS (loop);
4814   /* Temporary list pointers for traversing ivs->list.  */
4815   struct iv_class *bl;
4816   int call_seen;
4817   rtx p;
4818
4819   /* Find initial value for each biv by searching backwards from loop_start,
4820      halting at first label.  Also record any test condition.  */
4821
4822   call_seen = 0;
4823   for (p = loop->start; p && !LABEL_P (p); p = PREV_INSN (p))
4824     {
4825       rtx test;
4826
4827       note_insn = p;
4828
4829       if (CALL_P (p))
4830         call_seen = 1;
4831
4832       if (INSN_P (p))
4833         note_stores (PATTERN (p), record_initial, ivs);
4834
4835       /* Record any test of a biv that branches around the loop if no store
4836          between it and the start of loop.  We only care about tests with
4837          constants and registers and only certain of those.  */
4838       if (JUMP_P (p)
4839           && JUMP_LABEL (p) != 0
4840           && next_real_insn (JUMP_LABEL (p)) == next_real_insn (loop->end)
4841           && (test = get_condition_for_loop (loop, p)) != 0
4842           && REG_P (XEXP (test, 0))
4843           && REGNO (XEXP (test, 0)) < max_reg_before_loop
4844           && (bl = REG_IV_CLASS (ivs, REGNO (XEXP (test, 0)))) != 0
4845           && valid_initial_value_p (XEXP (test, 1), p, call_seen, loop->start)
4846           && bl->init_insn == 0)
4847         {
4848           /* If an NE test, we have an initial value!  */
4849           if (GET_CODE (test) == NE)
4850             {
4851               bl->init_insn = p;
4852               bl->init_set = gen_rtx_SET (VOIDmode,
4853                                           XEXP (test, 0), XEXP (test, 1));
4854             }
4855           else
4856             bl->initial_test = test;
4857         }
4858     }
4859 }
4860
4861
4862 /* Look at the each biv and see if we can say anything better about its
4863    initial value from any initializing insns set up above.  (This is done
4864    in two passes to avoid missing SETs in a PARALLEL.)  */
4865 static void
4866 loop_bivs_check (struct loop *loop)
4867 {
4868   struct loop_ivs *ivs = LOOP_IVS (loop);
4869   /* Temporary list pointers for traversing ivs->list.  */
4870   struct iv_class *bl;
4871   struct iv_class **backbl;
4872
4873   for (backbl = &ivs->list; (bl = *backbl); backbl = &bl->next)
4874     {
4875       rtx src;
4876       rtx note;
4877
4878       if (! bl->init_insn)
4879         continue;
4880
4881       /* IF INIT_INSN has a REG_EQUAL or REG_EQUIV note and the value
4882          is a constant, use the value of that.  */
4883       if (((note = find_reg_note (bl->init_insn, REG_EQUAL, 0)) != NULL
4884            && CONSTANT_P (XEXP (note, 0)))
4885           || ((note = find_reg_note (bl->init_insn, REG_EQUIV, 0)) != NULL
4886               && CONSTANT_P (XEXP (note, 0))))
4887         src = XEXP (note, 0);
4888       else
4889         src = SET_SRC (bl->init_set);
4890
4891       if (loop_dump_stream)
4892         fprintf (loop_dump_stream,
4893                  "Biv %d: initialized at insn %d: initial value ",
4894                  bl->regno, INSN_UID (bl->init_insn));
4895
4896       if ((GET_MODE (src) == GET_MODE (regno_reg_rtx[bl->regno])
4897            || GET_MODE (src) == VOIDmode)
4898           && valid_initial_value_p (src, bl->init_insn,
4899                                     LOOP_INFO (loop)->pre_header_has_call,
4900                                     loop->start))
4901         {
4902           bl->initial_value = src;
4903
4904           if (loop_dump_stream)
4905             {
4906               print_simple_rtl (loop_dump_stream, src);
4907               fputc ('\n', loop_dump_stream);
4908             }
4909         }
4910       /* If we can't make it a giv,
4911          let biv keep initial value of "itself".  */
4912       else if (loop_dump_stream)
4913         fprintf (loop_dump_stream, "is complex\n");
4914     }
4915 }
4916
4917
4918 /* Search the loop for general induction variables.  */
4919
4920 static void
4921 loop_givs_find (struct loop* loop)
4922 {
4923   for_each_insn_in_loop (loop, check_insn_for_givs);
4924 }
4925
4926
4927 /* For each giv for which we still don't know whether or not it is
4928    replaceable, check to see if it is replaceable because its final value
4929    can be calculated.  */
4930
4931 static void
4932 loop_givs_check (struct loop *loop)
4933 {
4934   struct loop_ivs *ivs = LOOP_IVS (loop);
4935   struct iv_class *bl;
4936
4937   for (bl = ivs->list; bl; bl = bl->next)
4938     {
4939       struct induction *v;
4940
4941       for (v = bl->giv; v; v = v->next_iv)
4942         if (! v->replaceable && ! v->not_replaceable)
4943           check_final_value (loop, v);
4944     }
4945 }
4946
4947 /* Try to generate the simplest rtx for the expression
4948    (PLUS (MULT mult1 mult2) add1).  This is used to calculate the initial
4949    value of giv's.  */
4950
4951 static rtx
4952 fold_rtx_mult_add (rtx mult1, rtx mult2, rtx add1, enum machine_mode mode)
4953 {
4954   rtx temp, mult_res;
4955   rtx result;
4956
4957   /* The modes must all be the same.  This should always be true.  For now,
4958      check to make sure.  */
4959   if ((GET_MODE (mult1) != mode && GET_MODE (mult1) != VOIDmode)
4960       || (GET_MODE (mult2) != mode && GET_MODE (mult2) != VOIDmode)
4961       || (GET_MODE (add1) != mode && GET_MODE (add1) != VOIDmode))
4962     abort ();
4963
4964   /* Ensure that if at least one of mult1/mult2 are constant, then mult2
4965      will be a constant.  */
4966   if (GET_CODE (mult1) == CONST_INT)
4967     {
4968       temp = mult2;
4969       mult2 = mult1;
4970       mult1 = temp;
4971     }
4972
4973   mult_res = simplify_binary_operation (MULT, mode, mult1, mult2);
4974   if (! mult_res)
4975     mult_res = gen_rtx_MULT (mode, mult1, mult2);
4976
4977   /* Again, put the constant second.  */
4978   if (GET_CODE (add1) == CONST_INT)
4979     {
4980       temp = add1;
4981       add1 = mult_res;
4982       mult_res = temp;
4983     }
4984
4985   result = simplify_binary_operation (PLUS, mode, add1, mult_res);
4986   if (! result)
4987     result = gen_rtx_PLUS (mode, add1, mult_res);
4988
4989   return result;
4990 }
4991
4992 /* Searches the list of induction struct's for the biv BL, to try to calculate
4993    the total increment value for one iteration of the loop as a constant.
4994
4995    Returns the increment value as an rtx, simplified as much as possible,
4996    if it can be calculated.  Otherwise, returns 0.  */
4997
4998 static rtx
4999 biv_total_increment (const struct iv_class *bl)
5000 {
5001   struct induction *v;
5002   rtx result;
5003
5004   /* For increment, must check every instruction that sets it.  Each
5005      instruction must be executed only once each time through the loop.
5006      To verify this, we check that the insn is always executed, and that
5007      there are no backward branches after the insn that branch to before it.
5008      Also, the insn must have a mult_val of one (to make sure it really is
5009      an increment).  */
5010
5011   result = const0_rtx;
5012   for (v = bl->biv; v; v = v->next_iv)
5013     {
5014       if (v->always_computable && v->mult_val == const1_rtx
5015           && ! v->maybe_multiple
5016           && SCALAR_INT_MODE_P (v->mode))
5017         {
5018           /* If we have already counted it, skip it.  */
5019           if (v->same)
5020             continue;
5021
5022           result = fold_rtx_mult_add (result, const1_rtx, v->add_val, v->mode);
5023         }
5024       else
5025         return 0;
5026     }
5027
5028   return result;
5029 }
5030
5031 /* Try to prove that the register is dead after the loop exits.  Trace every
5032    loop exit looking for an insn that will always be executed, which sets
5033    the register to some value, and appears before the first use of the register
5034    is found.  If successful, then return 1, otherwise return 0.  */
5035
5036 /* ?? Could be made more intelligent in the handling of jumps, so that
5037    it can search past if statements and other similar structures.  */
5038
5039 static int
5040 reg_dead_after_loop (const struct loop *loop, rtx reg)
5041 {
5042   rtx insn, label;
5043   int jump_count = 0;
5044   int label_count = 0;
5045
5046   /* In addition to checking all exits of this loop, we must also check
5047      all exits of inner nested loops that would exit this loop.  We don't
5048      have any way to identify those, so we just give up if there are any
5049      such inner loop exits.  */
5050
5051   for (label = loop->exit_labels; label; label = LABEL_NEXTREF (label))
5052     label_count++;
5053
5054   if (label_count != loop->exit_count)
5055     return 0;
5056
5057   /* HACK: Must also search the loop fall through exit, create a label_ref
5058      here which points to the loop->end, and append the loop_number_exit_labels
5059      list to it.  */
5060   label = gen_rtx_LABEL_REF (VOIDmode, loop->end);
5061   LABEL_NEXTREF (label) = loop->exit_labels;
5062
5063   for (; label; label = LABEL_NEXTREF (label))
5064     {
5065       /* Succeed if find an insn which sets the biv or if reach end of
5066          function.  Fail if find an insn that uses the biv, or if come to
5067          a conditional jump.  */
5068
5069       insn = NEXT_INSN (XEXP (label, 0));
5070       while (insn)
5071         {
5072           if (INSN_P (insn))
5073             {
5074               rtx set, note;
5075
5076               if (reg_referenced_p (reg, PATTERN (insn)))
5077                 return 0;
5078
5079               note = find_reg_equal_equiv_note (insn);
5080               if (note && reg_overlap_mentioned_p (reg, XEXP (note, 0)))
5081                 return 0;
5082
5083               set = single_set (insn);
5084               if (set && rtx_equal_p (SET_DEST (set), reg))
5085                 break;
5086
5087               if (JUMP_P (insn))
5088                 {
5089                   if (GET_CODE (PATTERN (insn)) == RETURN)
5090                     break;
5091                   else if (!any_uncondjump_p (insn)
5092                            /* Prevent infinite loop following infinite loops.  */
5093                            || jump_count++ > 20)
5094                     return 0;
5095                   else
5096                     insn = JUMP_LABEL (insn);
5097                 }
5098             }
5099
5100           insn = NEXT_INSN (insn);
5101         }
5102     }
5103
5104   /* Success, the register is dead on all loop exits.  */
5105   return 1;
5106 }
5107
5108 /* Try to calculate the final value of the biv, the value it will have at
5109    the end of the loop.  If we can do it, return that value.  */
5110
5111 static rtx
5112 final_biv_value (const struct loop *loop, struct iv_class *bl)
5113 {
5114   unsigned HOST_WIDE_INT n_iterations = LOOP_INFO (loop)->n_iterations;
5115   rtx increment, tem;
5116
5117   /* ??? This only works for MODE_INT biv's.  Reject all others for now.  */
5118
5119   if (GET_MODE_CLASS (bl->biv->mode) != MODE_INT)
5120     return 0;
5121
5122   /* The final value for reversed bivs must be calculated differently than
5123      for ordinary bivs.  In this case, there is already an insn after the
5124      loop which sets this biv's final value (if necessary), and there are
5125      no other loop exits, so we can return any value.  */
5126   if (bl->reversed)
5127     {
5128       if (loop_dump_stream)
5129         fprintf (loop_dump_stream,
5130                  "Final biv value for %d, reversed biv.\n", bl->regno);
5131
5132       return const0_rtx;
5133     }
5134
5135   /* Try to calculate the final value as initial value + (number of iterations
5136      * increment).  For this to work, increment must be invariant, the only
5137      exit from the loop must be the fall through at the bottom (otherwise
5138      it may not have its final value when the loop exits), and the initial
5139      value of the biv must be invariant.  */
5140
5141   if (n_iterations != 0
5142       && ! loop->exit_count
5143       && loop_invariant_p (loop, bl->initial_value))
5144     {
5145       increment = biv_total_increment (bl);
5146
5147       if (increment && loop_invariant_p (loop, increment))
5148         {
5149           /* Can calculate the loop exit value, emit insns after loop
5150              end to calculate this value into a temporary register in
5151              case it is needed later.  */
5152
5153           tem = gen_reg_rtx (bl->biv->mode);
5154           record_base_value (REGNO (tem), bl->biv->add_val, 0);
5155           loop_iv_add_mult_sink (loop, increment, GEN_INT (n_iterations),
5156                                  bl->initial_value, tem);
5157
5158           if (loop_dump_stream)
5159             fprintf (loop_dump_stream,
5160                      "Final biv value for %d, calculated.\n", bl->regno);
5161
5162           return tem;
5163         }
5164     }
5165
5166   /* Check to see if the biv is dead at all loop exits.  */
5167   if (reg_dead_after_loop (loop, bl->biv->src_reg))
5168     {
5169       if (loop_dump_stream)
5170         fprintf (loop_dump_stream,
5171                  "Final biv value for %d, biv dead after loop exit.\n",
5172                  bl->regno);
5173
5174       return const0_rtx;
5175     }
5176
5177   return 0;
5178 }
5179
5180 /* Return nonzero if it is possible to eliminate the biv BL provided
5181    all givs are reduced.  This is possible if either the reg is not
5182    used outside the loop, or we can compute what its final value will
5183    be.  */
5184
5185 static int
5186 loop_biv_eliminable_p (struct loop *loop, struct iv_class *bl,
5187                        int threshold, int insn_count)
5188 {
5189   /* For architectures with a decrement_and_branch_until_zero insn,
5190      don't do this if we put a REG_NONNEG note on the endtest for this
5191      biv.  */
5192
5193 #ifdef HAVE_decrement_and_branch_until_zero
5194   if (bl->nonneg)
5195     {
5196       if (loop_dump_stream)
5197         fprintf (loop_dump_stream,
5198                  "Cannot eliminate nonneg biv %d.\n", bl->regno);
5199       return 0;
5200     }
5201 #endif
5202
5203   /* Check that biv is used outside loop or if it has a final value.
5204      Compare against bl->init_insn rather than loop->start.  We aren't
5205      concerned with any uses of the biv between init_insn and
5206      loop->start since these won't be affected by the value of the biv
5207      elsewhere in the function, so long as init_insn doesn't use the
5208      biv itself.  */
5209
5210   if ((REGNO_LAST_LUID (bl->regno) < INSN_LUID (loop->end)
5211        && bl->init_insn
5212        && INSN_UID (bl->init_insn) < max_uid_for_loop
5213        && REGNO_FIRST_LUID (bl->regno) >= INSN_LUID (bl->init_insn)
5214        && ! reg_mentioned_p (bl->biv->dest_reg, SET_SRC (bl->init_set)))
5215       || (bl->final_value = final_biv_value (loop, bl)))
5216     return maybe_eliminate_biv (loop, bl, 0, threshold, insn_count);
5217
5218   if (loop_dump_stream)
5219     {
5220       fprintf (loop_dump_stream,
5221                "Cannot eliminate biv %d.\n",
5222                bl->regno);
5223       fprintf (loop_dump_stream,
5224                "First use: insn %d, last use: insn %d.\n",
5225                REGNO_FIRST_UID (bl->regno),
5226                REGNO_LAST_UID (bl->regno));
5227     }
5228   return 0;
5229 }
5230
5231
5232 /* Reduce each giv of BL that we have decided to reduce.  */
5233
5234 static void
5235 loop_givs_reduce (struct loop *loop, struct iv_class *bl)
5236 {
5237   struct induction *v;
5238
5239   for (v = bl->giv; v; v = v->next_iv)
5240     {
5241       struct induction *tv;
5242       if (! v->ignore && v->same == 0)
5243         {
5244           int auto_inc_opt = 0;
5245
5246           /* If the code for derived givs immediately below has already
5247              allocated a new_reg, we must keep it.  */
5248           if (! v->new_reg)
5249             v->new_reg = gen_reg_rtx (v->mode);
5250
5251 #ifdef AUTO_INC_DEC
5252           /* If the target has auto-increment addressing modes, and
5253              this is an address giv, then try to put the increment
5254              immediately after its use, so that flow can create an
5255              auto-increment addressing mode.  */
5256           /* Don't do this for loops entered at the bottom, to avoid
5257              this invalid transformation:
5258                 jmp L;          ->          jmp L;
5259              TOP:                       TOP:
5260                 use giv                     use giv
5261              L:                             inc giv
5262                 inc biv                 L:
5263                 test biv                    test giv
5264                 cbr TOP                     cbr TOP
5265           */
5266           if (v->giv_type == DEST_ADDR && bl->biv_count == 1
5267               && bl->biv->always_executed && ! bl->biv->maybe_multiple
5268               /* We don't handle reversed biv's because bl->biv->insn
5269                  does not have a valid INSN_LUID.  */
5270               && ! bl->reversed
5271               && v->always_executed && ! v->maybe_multiple
5272               && INSN_UID (v->insn) < max_uid_for_loop
5273               && !loop->top)    
5274             {
5275               /* If other giv's have been combined with this one, then
5276                  this will work only if all uses of the other giv's occur
5277                  before this giv's insn.  This is difficult to check.
5278
5279                  We simplify this by looking for the common case where
5280                  there is one DEST_REG giv, and this giv's insn is the
5281                  last use of the dest_reg of that DEST_REG giv.  If the
5282                  increment occurs after the address giv, then we can
5283                  perform the optimization.  (Otherwise, the increment
5284                  would have to go before other_giv, and we would not be
5285                  able to combine it with the address giv to get an
5286                  auto-inc address.)  */
5287               if (v->combined_with)
5288                 {
5289                   struct induction *other_giv = 0;
5290
5291                   for (tv = bl->giv; tv; tv = tv->next_iv)
5292                     if (tv->same == v)
5293                       {
5294                         if (other_giv)
5295                           break;
5296                         else
5297                           other_giv = tv;
5298                       }
5299                   if (! tv && other_giv
5300                       && REGNO (other_giv->dest_reg) < max_reg_before_loop
5301                       && (REGNO_LAST_UID (REGNO (other_giv->dest_reg))
5302                           == INSN_UID (v->insn))
5303                       && INSN_LUID (v->insn) < INSN_LUID (bl->biv->insn))
5304                     auto_inc_opt = 1;
5305                 }
5306               /* Check for case where increment is before the address
5307                  giv.  Do this test in "loop order".  */
5308               else if ((INSN_LUID (v->insn) > INSN_LUID (bl->biv->insn)
5309                         && (INSN_LUID (v->insn) < INSN_LUID (loop->scan_start)
5310                             || (INSN_LUID (bl->biv->insn)
5311                                 > INSN_LUID (loop->scan_start))))
5312                        || (INSN_LUID (v->insn) < INSN_LUID (loop->scan_start)
5313                            && (INSN_LUID (loop->scan_start)
5314                                < INSN_LUID (bl->biv->insn))))
5315                 auto_inc_opt = -1;
5316               else
5317                 auto_inc_opt = 1;
5318
5319 #ifdef HAVE_cc0
5320               {
5321                 rtx prev;
5322
5323                 /* We can't put an insn immediately after one setting
5324                    cc0, or immediately before one using cc0.  */
5325                 if ((auto_inc_opt == 1 && sets_cc0_p (PATTERN (v->insn)))
5326                     || (auto_inc_opt == -1
5327                         && (prev = prev_nonnote_insn (v->insn)) != 0
5328                         && INSN_P (prev)
5329                         && sets_cc0_p (PATTERN (prev))))
5330                   auto_inc_opt = 0;
5331               }
5332 #endif
5333
5334               if (auto_inc_opt)
5335                 v->auto_inc_opt = 1;
5336             }
5337 #endif
5338
5339           /* For each place where the biv is incremented, add an insn
5340              to increment the new, reduced reg for the giv.  */
5341           for (tv = bl->biv; tv; tv = tv->next_iv)
5342             {
5343               rtx insert_before;
5344
5345               /* Skip if location is the same as a previous one.  */
5346               if (tv->same)
5347                 continue;
5348               if (! auto_inc_opt)
5349                 insert_before = NEXT_INSN (tv->insn);
5350               else if (auto_inc_opt == 1)
5351                 insert_before = NEXT_INSN (v->insn);
5352               else
5353                 insert_before = v->insn;
5354
5355               if (tv->mult_val == const1_rtx)
5356                 loop_iv_add_mult_emit_before (loop, tv->add_val, v->mult_val,
5357                                               v->new_reg, v->new_reg,
5358                                               0, insert_before);
5359               else /* tv->mult_val == const0_rtx */
5360                 /* A multiply is acceptable here
5361                    since this is presumed to be seldom executed.  */
5362                 loop_iv_add_mult_emit_before (loop, tv->add_val, v->mult_val,
5363                                               v->add_val, v->new_reg,
5364                                               0, insert_before);
5365             }
5366
5367           /* Add code at loop start to initialize giv's reduced reg.  */
5368
5369           loop_iv_add_mult_hoist (loop,
5370                                   extend_value_for_giv (v, bl->initial_value),
5371                                   v->mult_val, v->add_val, v->new_reg);
5372         }
5373     }
5374 }
5375
5376
5377 /* Check for givs whose first use is their definition and whose
5378    last use is the definition of another giv.  If so, it is likely
5379    dead and should not be used to derive another giv nor to
5380    eliminate a biv.  */
5381
5382 static void
5383 loop_givs_dead_check (struct loop *loop ATTRIBUTE_UNUSED, struct iv_class *bl)
5384 {
5385   struct induction *v;
5386
5387   for (v = bl->giv; v; v = v->next_iv)
5388     {
5389       if (v->ignore
5390           || (v->same && v->same->ignore))
5391         continue;
5392
5393       if (v->giv_type == DEST_REG
5394           && REGNO_FIRST_UID (REGNO (v->dest_reg)) == INSN_UID (v->insn))
5395         {
5396           struct induction *v1;
5397
5398           for (v1 = bl->giv; v1; v1 = v1->next_iv)
5399             if (REGNO_LAST_UID (REGNO (v->dest_reg)) == INSN_UID (v1->insn))
5400               v->maybe_dead = 1;
5401         }
5402     }
5403 }
5404
5405
5406 static void
5407 loop_givs_rescan (struct loop *loop, struct iv_class *bl, rtx *reg_map)
5408 {
5409   struct induction *v;
5410
5411   for (v = bl->giv; v; v = v->next_iv)
5412     {
5413       if (v->same && v->same->ignore)
5414         v->ignore = 1;
5415
5416       if (v->ignore)
5417         continue;
5418
5419       /* Update expression if this was combined, in case other giv was
5420          replaced.  */
5421       if (v->same)
5422         v->new_reg = replace_rtx (v->new_reg,
5423                                   v->same->dest_reg, v->same->new_reg);
5424
5425       /* See if this register is known to be a pointer to something.  If
5426          so, see if we can find the alignment.  First see if there is a
5427          destination register that is a pointer.  If so, this shares the
5428          alignment too.  Next see if we can deduce anything from the
5429          computational information.  If not, and this is a DEST_ADDR
5430          giv, at least we know that it's a pointer, though we don't know
5431          the alignment.  */
5432       if (REG_P (v->new_reg)
5433           && v->giv_type == DEST_REG
5434           && REG_POINTER (v->dest_reg))
5435         mark_reg_pointer (v->new_reg,
5436                           REGNO_POINTER_ALIGN (REGNO (v->dest_reg)));
5437       else if (REG_P (v->new_reg)
5438                && REG_POINTER (v->src_reg))
5439         {
5440           unsigned int align = REGNO_POINTER_ALIGN (REGNO (v->src_reg));
5441
5442           if (align == 0
5443               || GET_CODE (v->add_val) != CONST_INT
5444               || INTVAL (v->add_val) % (align / BITS_PER_UNIT) != 0)
5445             align = 0;
5446
5447           mark_reg_pointer (v->new_reg, align);
5448         }
5449       else if (REG_P (v->new_reg)
5450                && REG_P (v->add_val)
5451                && REG_POINTER (v->add_val))
5452         {
5453           unsigned int align = REGNO_POINTER_ALIGN (REGNO (v->add_val));
5454
5455           if (align == 0 || GET_CODE (v->mult_val) != CONST_INT
5456               || INTVAL (v->mult_val) % (align / BITS_PER_UNIT) != 0)
5457             align = 0;
5458
5459           mark_reg_pointer (v->new_reg, align);
5460         }
5461       else if (REG_P (v->new_reg) && v->giv_type == DEST_ADDR)
5462         mark_reg_pointer (v->new_reg, 0);
5463
5464       if (v->giv_type == DEST_ADDR)
5465         /* Store reduced reg as the address in the memref where we found
5466            this giv.  */
5467         validate_change (v->insn, v->location, v->new_reg, 0);
5468       else if (v->replaceable)
5469         {
5470           reg_map[REGNO (v->dest_reg)] = v->new_reg;
5471         }
5472       else
5473         {
5474           rtx original_insn = v->insn;
5475           rtx note;
5476
5477           /* Not replaceable; emit an insn to set the original giv reg from
5478              the reduced giv, same as above.  */
5479           v->insn = loop_insn_emit_after (loop, 0, original_insn,
5480                                           gen_move_insn (v->dest_reg,
5481                                                          v->new_reg));
5482
5483           /* The original insn may have a REG_EQUAL note.  This note is
5484              now incorrect and may result in invalid substitutions later.
5485              The original insn is dead, but may be part of a libcall
5486              sequence, which doesn't seem worth the bother of handling.  */
5487           note = find_reg_note (original_insn, REG_EQUAL, NULL_RTX);
5488           if (note)
5489             remove_note (original_insn, note);
5490         }
5491
5492       /* When a loop is reversed, givs which depend on the reversed
5493          biv, and which are live outside the loop, must be set to their
5494          correct final value.  This insn is only needed if the giv is
5495          not replaceable.  The correct final value is the same as the
5496          value that the giv starts the reversed loop with.  */
5497       if (bl->reversed && ! v->replaceable)
5498         loop_iv_add_mult_sink (loop,
5499                                extend_value_for_giv (v, bl->initial_value),
5500                                v->mult_val, v->add_val, v->dest_reg);
5501       else if (v->final_value)
5502         loop_insn_sink_or_swim (loop,
5503                                 gen_load_of_final_value (v->dest_reg,
5504                                                          v->final_value));
5505
5506       if (loop_dump_stream)
5507         {
5508           fprintf (loop_dump_stream, "giv at %d reduced to ",
5509                    INSN_UID (v->insn));
5510           print_simple_rtl (loop_dump_stream, v->new_reg);
5511           fprintf (loop_dump_stream, "\n");
5512         }
5513     }
5514 }
5515
5516
5517 static int
5518 loop_giv_reduce_benefit (struct loop *loop ATTRIBUTE_UNUSED,
5519                          struct iv_class *bl, struct induction *v,
5520                          rtx test_reg)
5521 {
5522   int add_cost;
5523   int benefit;
5524
5525   benefit = v->benefit;
5526   PUT_MODE (test_reg, v->mode);
5527   add_cost = iv_add_mult_cost (bl->biv->add_val, v->mult_val,
5528                                test_reg, test_reg);
5529
5530   /* Reduce benefit if not replaceable, since we will insert a
5531      move-insn to replace the insn that calculates this giv.  Don't do
5532      this unless the giv is a user variable, since it will often be
5533      marked non-replaceable because of the duplication of the exit
5534      code outside the loop.  In such a case, the copies we insert are
5535      dead and will be deleted.  So they don't have a cost.  Similar
5536      situations exist.  */
5537   /* ??? The new final_[bg]iv_value code does a much better job of
5538      finding replaceable giv's, and hence this code may no longer be
5539      necessary.  */
5540   if (! v->replaceable && ! bl->eliminable
5541       && REG_USERVAR_P (v->dest_reg))
5542     benefit -= copy_cost;
5543
5544   /* Decrease the benefit to count the add-insns that we will insert
5545      to increment the reduced reg for the giv.  ??? This can
5546      overestimate the run-time cost of the additional insns, e.g. if
5547      there are multiple basic blocks that increment the biv, but only
5548      one of these blocks is executed during each iteration.  There is
5549      no good way to detect cases like this with the current structure
5550      of the loop optimizer.  This code is more accurate for
5551      determining code size than run-time benefits.  */
5552   benefit -= add_cost * bl->biv_count;
5553
5554   /* Decide whether to strength-reduce this giv or to leave the code
5555      unchanged (recompute it from the biv each time it is used).  This
5556      decision can be made independently for each giv.  */
5557
5558 #ifdef AUTO_INC_DEC
5559   /* Attempt to guess whether autoincrement will handle some of the
5560      new add insns; if so, increase BENEFIT (undo the subtraction of
5561      add_cost that was done above).  */
5562   if (v->giv_type == DEST_ADDR
5563       /* Increasing the benefit is risky, since this is only a guess.
5564          Avoid increasing register pressure in cases where there would
5565          be no other benefit from reducing this giv.  */
5566       && benefit > 0
5567       && GET_CODE (v->mult_val) == CONST_INT)
5568     {
5569       int size = GET_MODE_SIZE (GET_MODE (v->mem));
5570
5571       if (HAVE_POST_INCREMENT
5572           && INTVAL (v->mult_val) == size)
5573         benefit += add_cost * bl->biv_count;
5574       else if (HAVE_PRE_INCREMENT
5575                && INTVAL (v->mult_val) == size)
5576         benefit += add_cost * bl->biv_count;
5577       else if (HAVE_POST_DECREMENT
5578                && -INTVAL (v->mult_val) == size)
5579         benefit += add_cost * bl->biv_count;
5580       else if (HAVE_PRE_DECREMENT
5581                && -INTVAL (v->mult_val) == size)
5582         benefit += add_cost * bl->biv_count;
5583     }
5584 #endif
5585
5586   return benefit;
5587 }
5588
5589
5590 /* Free IV structures for LOOP.  */
5591
5592 static void
5593 loop_ivs_free (struct loop *loop)
5594 {
5595   struct loop_ivs *ivs = LOOP_IVS (loop);
5596   struct iv_class *iv = ivs->list;
5597
5598   free (ivs->regs);
5599
5600   while (iv)
5601     {
5602       struct iv_class *next = iv->next;
5603       struct induction *induction;
5604       struct induction *next_induction;
5605
5606       for (induction = iv->biv; induction; induction = next_induction)
5607         {
5608           next_induction = induction->next_iv;
5609           free (induction);
5610         }
5611       for (induction = iv->giv; induction; induction = next_induction)
5612         {
5613           next_induction = induction->next_iv;
5614           free (induction);
5615         }
5616
5617       free (iv);
5618       iv = next;
5619     }
5620 }
5621
5622 /* Look back before LOOP->START for the insn that sets REG and return
5623    the equivalent constant if there is a REG_EQUAL note otherwise just
5624    the SET_SRC of REG.  */
5625
5626 static rtx
5627 loop_find_equiv_value (const struct loop *loop, rtx reg)
5628 {
5629   rtx loop_start = loop->start;
5630   rtx insn, set;
5631   rtx ret;
5632
5633   ret = reg;
5634   for (insn = PREV_INSN (loop_start); insn; insn = PREV_INSN (insn))
5635     {
5636       if (LABEL_P (insn))
5637         break;
5638
5639       else if (INSN_P (insn) && reg_set_p (reg, insn))
5640         {
5641           /* We found the last insn before the loop that sets the register.
5642              If it sets the entire register, and has a REG_EQUAL note,
5643              then use the value of the REG_EQUAL note.  */
5644           if ((set = single_set (insn))
5645               && (SET_DEST (set) == reg))
5646             {
5647               rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
5648
5649               /* Only use the REG_EQUAL note if it is a constant.
5650                  Other things, divide in particular, will cause
5651                  problems later if we use them.  */
5652               if (note && GET_CODE (XEXP (note, 0)) != EXPR_LIST
5653                   && CONSTANT_P (XEXP (note, 0)))
5654                 ret = XEXP (note, 0);
5655               else
5656                 ret = SET_SRC (set);
5657
5658               /* We cannot do this if it changes between the
5659                  assignment and loop start though.  */
5660               if (modified_between_p (ret, insn, loop_start))
5661                 ret = reg;
5662             }
5663           break;
5664         }
5665     }
5666   return ret;
5667 }
5668
5669 /* Find and return register term common to both expressions OP0 and
5670    OP1 or NULL_RTX if no such term exists.  Each expression must be a
5671    REG or a PLUS of a REG.  */
5672
5673 static rtx
5674 find_common_reg_term (rtx op0, rtx op1)
5675 {
5676   if ((REG_P (op0) || GET_CODE (op0) == PLUS)
5677       && (REG_P (op1) || GET_CODE (op1) == PLUS))
5678     {
5679       rtx op00;
5680       rtx op01;
5681       rtx op10;
5682       rtx op11;
5683
5684       if (GET_CODE (op0) == PLUS)
5685         op01 = XEXP (op0, 1), op00 = XEXP (op0, 0);
5686       else
5687         op01 = const0_rtx, op00 = op0;
5688
5689       if (GET_CODE (op1) == PLUS)
5690         op11 = XEXP (op1, 1), op10 = XEXP (op1, 0);
5691       else
5692         op11 = const0_rtx, op10 = op1;
5693
5694       /* Find and return common register term if present.  */
5695       if (REG_P (op00) && (op00 == op10 || op00 == op11))
5696         return op00;
5697       else if (REG_P (op01) && (op01 == op10 || op01 == op11))
5698         return op01;
5699     }
5700
5701   /* No common register term found.  */
5702   return NULL_RTX;
5703 }
5704
5705 /* Determine the loop iterator and calculate the number of loop
5706    iterations.  Returns the exact number of loop iterations if it can
5707    be calculated, otherwise returns zero.  */
5708
5709 static unsigned HOST_WIDE_INT
5710 loop_iterations (struct loop *loop)
5711 {
5712   struct loop_info *loop_info = LOOP_INFO (loop);
5713   struct loop_ivs *ivs = LOOP_IVS (loop);
5714   rtx comparison, comparison_value;
5715   rtx iteration_var, initial_value, increment, final_value;
5716   enum rtx_code comparison_code;
5717   HOST_WIDE_INT inc;
5718   unsigned HOST_WIDE_INT abs_inc;
5719   unsigned HOST_WIDE_INT abs_diff;
5720   int off_by_one;
5721   int increment_dir;
5722   int unsigned_p, compare_dir, final_larger;
5723   rtx last_loop_insn;
5724   struct iv_class *bl;
5725
5726   loop_info->n_iterations = 0;
5727   loop_info->initial_value = 0;
5728   loop_info->initial_equiv_value = 0;
5729   loop_info->comparison_value = 0;
5730   loop_info->final_value = 0;
5731   loop_info->final_equiv_value = 0;
5732   loop_info->increment = 0;
5733   loop_info->iteration_var = 0;
5734   loop_info->iv = 0;
5735
5736   /* We used to use prev_nonnote_insn here, but that fails because it might
5737      accidentally get the branch for a contained loop if the branch for this
5738      loop was deleted.  We can only trust branches immediately before the
5739      loop_end.  */
5740   last_loop_insn = PREV_INSN (loop->end);
5741
5742   /* ??? We should probably try harder to find the jump insn
5743      at the end of the loop.  The following code assumes that
5744      the last loop insn is a jump to the top of the loop.  */
5745   if (!JUMP_P (last_loop_insn))
5746     {
5747       if (loop_dump_stream)
5748         fprintf (loop_dump_stream,
5749                  "Loop iterations: No final conditional branch found.\n");
5750       return 0;
5751     }
5752
5753   /* If there is a more than a single jump to the top of the loop
5754      we cannot (easily) determine the iteration count.  */
5755   if (LABEL_NUSES (JUMP_LABEL (last_loop_insn)) > 1)
5756     {
5757       if (loop_dump_stream)
5758         fprintf (loop_dump_stream,
5759                  "Loop iterations: Loop has multiple back edges.\n");
5760       return 0;
5761     }
5762
5763   /* Find the iteration variable.  If the last insn is a conditional
5764      branch, and the insn before tests a register value, make that the
5765      iteration variable.  */
5766
5767   comparison = get_condition_for_loop (loop, last_loop_insn);
5768   if (comparison == 0)
5769     {
5770       if (loop_dump_stream)
5771         fprintf (loop_dump_stream,
5772                  "Loop iterations: No final comparison found.\n");
5773       return 0;
5774     }
5775
5776   /* ??? Get_condition may switch position of induction variable and
5777      invariant register when it canonicalizes the comparison.  */
5778
5779   comparison_code = GET_CODE (comparison);
5780   iteration_var = XEXP (comparison, 0);
5781   comparison_value = XEXP (comparison, 1);
5782
5783   if (!REG_P (iteration_var))
5784     {
5785       if (loop_dump_stream)
5786         fprintf (loop_dump_stream,
5787                  "Loop iterations: Comparison not against register.\n");
5788       return 0;
5789     }
5790
5791   /* The only new registers that are created before loop iterations
5792      are givs made from biv increments or registers created by
5793      load_mems.  In the latter case, it is possible that try_copy_prop
5794      will propagate a new pseudo into the old iteration register but
5795      this will be marked by having the REG_USERVAR_P bit set.  */
5796
5797   if ((unsigned) REGNO (iteration_var) >= ivs->n_regs
5798       && ! REG_USERVAR_P (iteration_var))
5799     abort ();
5800
5801   /* Determine the initial value of the iteration variable, and the amount
5802      that it is incremented each loop.  Use the tables constructed by
5803      the strength reduction pass to calculate these values.  */
5804
5805   /* Clear the result values, in case no answer can be found.  */
5806   initial_value = 0;
5807   increment = 0;
5808
5809   /* The iteration variable can be either a giv or a biv.  Check to see
5810      which it is, and compute the variable's initial value, and increment
5811      value if possible.  */
5812
5813   /* If this is a new register, can't handle it since we don't have any
5814      reg_iv_type entry for it.  */
5815   if ((unsigned) REGNO (iteration_var) >= ivs->n_regs)
5816     {
5817       if (loop_dump_stream)
5818         fprintf (loop_dump_stream,
5819                  "Loop iterations: No reg_iv_type entry for iteration var.\n");
5820       return 0;
5821     }
5822
5823   /* Reject iteration variables larger than the host wide int size, since they
5824      could result in a number of iterations greater than the range of our
5825      `unsigned HOST_WIDE_INT' variable loop_info->n_iterations.  */
5826   else if ((GET_MODE_BITSIZE (GET_MODE (iteration_var))
5827             > HOST_BITS_PER_WIDE_INT))
5828     {
5829       if (loop_dump_stream)
5830         fprintf (loop_dump_stream,
5831                  "Loop iterations: Iteration var rejected because mode too large.\n");
5832       return 0;
5833     }
5834   else if (GET_MODE_CLASS (GET_MODE (iteration_var)) != MODE_INT)
5835     {
5836       if (loop_dump_stream)
5837         fprintf (loop_dump_stream,
5838                  "Loop iterations: Iteration var not an integer.\n");
5839       return 0;
5840     }
5841
5842   /* Try swapping the comparison to identify a suitable iv.  */
5843   if (REG_IV_TYPE (ivs, REGNO (iteration_var)) != BASIC_INDUCT
5844       && REG_IV_TYPE (ivs, REGNO (iteration_var)) != GENERAL_INDUCT
5845       && REG_P (comparison_value)
5846       && REGNO (comparison_value) < ivs->n_regs)
5847     {
5848       rtx temp = comparison_value;
5849       comparison_code = swap_condition (comparison_code);
5850       comparison_value = iteration_var;
5851       iteration_var = temp;
5852     }
5853
5854   if (REG_IV_TYPE (ivs, REGNO (iteration_var)) == BASIC_INDUCT)
5855     {
5856       if (REGNO (iteration_var) >= ivs->n_regs)
5857         abort ();
5858
5859       /* Grab initial value, only useful if it is a constant.  */
5860       bl = REG_IV_CLASS (ivs, REGNO (iteration_var));
5861       initial_value = bl->initial_value;
5862       if (!bl->biv->always_executed || bl->biv->maybe_multiple)
5863         {
5864           if (loop_dump_stream)
5865             fprintf (loop_dump_stream,
5866                      "Loop iterations: Basic induction var not set once in each iteration.\n");
5867           return 0;
5868         }
5869
5870       increment = biv_total_increment (bl);
5871     }
5872   else if (REG_IV_TYPE (ivs, REGNO (iteration_var)) == GENERAL_INDUCT)
5873     {
5874       HOST_WIDE_INT offset = 0;
5875       struct induction *v = REG_IV_INFO (ivs, REGNO (iteration_var));
5876       rtx biv_initial_value;
5877
5878       if (REGNO (v->src_reg) >= ivs->n_regs)
5879         abort ();
5880
5881       if (!v->always_executed || v->maybe_multiple)
5882         {
5883           if (loop_dump_stream)
5884             fprintf (loop_dump_stream,
5885                      "Loop iterations: General induction var not set once in each iteration.\n");
5886           return 0;
5887         }
5888
5889       bl = REG_IV_CLASS (ivs, REGNO (v->src_reg));
5890
5891       /* Increment value is mult_val times the increment value of the biv.  */
5892
5893       increment = biv_total_increment (bl);
5894       if (increment)
5895         {
5896           struct induction *biv_inc;
5897
5898           increment = fold_rtx_mult_add (v->mult_val,
5899                                          extend_value_for_giv (v, increment),
5900                                          const0_rtx, v->mode);
5901           /* The caller assumes that one full increment has occurred at the
5902              first loop test.  But that's not true when the biv is incremented
5903              after the giv is set (which is the usual case), e.g.:
5904              i = 6; do {;} while (i++ < 9) .
5905              Therefore, we bias the initial value by subtracting the amount of
5906              the increment that occurs between the giv set and the giv test.  */
5907           for (biv_inc = bl->biv; biv_inc; biv_inc = biv_inc->next_iv)
5908             {
5909               if (loop_insn_first_p (v->insn, biv_inc->insn))
5910                 {
5911                   if (REG_P (biv_inc->add_val))
5912                     {
5913                       if (loop_dump_stream)
5914                         fprintf (loop_dump_stream,
5915                                  "Loop iterations: Basic induction var add_val is REG %d.\n",
5916                                  REGNO (biv_inc->add_val));
5917                         return 0;
5918                     }
5919
5920                   /* If we have already counted it, skip it.  */
5921                   if (biv_inc->same)
5922                     continue;
5923
5924                   offset -= INTVAL (biv_inc->add_val);
5925                 }
5926             }
5927         }
5928       if (loop_dump_stream)
5929         fprintf (loop_dump_stream,
5930                  "Loop iterations: Giv iterator, initial value bias %ld.\n",
5931                  (long) offset);
5932
5933       /* Initial value is mult_val times the biv's initial value plus
5934          add_val.  Only useful if it is a constant.  */
5935       biv_initial_value = extend_value_for_giv (v, bl->initial_value);
5936       initial_value
5937         = fold_rtx_mult_add (v->mult_val,
5938                              plus_constant (biv_initial_value, offset),
5939                              v->add_val, v->mode);
5940     }
5941   else
5942     {
5943       if (loop_dump_stream)
5944         fprintf (loop_dump_stream,
5945                  "Loop iterations: Not basic or general induction var.\n");
5946       return 0;
5947     }
5948
5949   if (initial_value == 0)
5950     return 0;
5951
5952   unsigned_p = 0;
5953   off_by_one = 0;
5954   switch (comparison_code)
5955     {
5956     case LEU:
5957       unsigned_p = 1;
5958     case LE:
5959       compare_dir = 1;
5960       off_by_one = 1;
5961       break;
5962     case GEU:
5963       unsigned_p = 1;
5964     case GE:
5965       compare_dir = -1;
5966       off_by_one = -1;
5967       break;
5968     case EQ:
5969       /* Cannot determine loop iterations with this case.  */
5970       compare_dir = 0;
5971       break;
5972     case LTU:
5973       unsigned_p = 1;
5974     case LT:
5975       compare_dir = 1;
5976       break;
5977     case GTU:
5978       unsigned_p = 1;
5979     case GT:
5980       compare_dir = -1;
5981       break;
5982     case NE:
5983       compare_dir = 0;
5984       break;
5985     default:
5986       abort ();
5987     }
5988
5989   /* If the comparison value is an invariant register, then try to find
5990      its value from the insns before the start of the loop.  */
5991
5992   final_value = comparison_value;
5993   if (REG_P (comparison_value)
5994       && loop_invariant_p (loop, comparison_value))
5995     {
5996       final_value = loop_find_equiv_value (loop, comparison_value);
5997
5998       /* If we don't get an invariant final value, we are better
5999          off with the original register.  */
6000       if (! loop_invariant_p (loop, final_value))
6001         final_value = comparison_value;
6002     }
6003
6004   /* Calculate the approximate final value of the induction variable
6005      (on the last successful iteration).  The exact final value
6006      depends on the branch operator, and increment sign.  It will be
6007      wrong if the iteration variable is not incremented by one each
6008      time through the loop and (comparison_value + off_by_one -
6009      initial_value) % increment != 0.
6010      ??? Note that the final_value may overflow and thus final_larger
6011      will be bogus.  A potentially infinite loop will be classified
6012      as immediate, e.g. for (i = 0x7ffffff0; i <= 0x7fffffff; i++)  */
6013   if (off_by_one)
6014     final_value = plus_constant (final_value, off_by_one);
6015
6016   /* Save the calculated values describing this loop's bounds, in case
6017      precondition_loop_p will need them later.  These values can not be
6018      recalculated inside precondition_loop_p because strength reduction
6019      optimizations may obscure the loop's structure.
6020
6021      These values are only required by precondition_loop_p and insert_bct
6022      whenever the number of iterations cannot be computed at compile time.
6023      Only the difference between final_value and initial_value is
6024      important.  Note that final_value is only approximate.  */
6025   loop_info->initial_value = initial_value;
6026   loop_info->comparison_value = comparison_value;
6027   loop_info->final_value = plus_constant (comparison_value, off_by_one);
6028   loop_info->increment = increment;
6029   loop_info->iteration_var = iteration_var;
6030   loop_info->comparison_code = comparison_code;
6031   loop_info->iv = bl;
6032
6033   /* Try to determine the iteration count for loops such
6034      as (for i = init; i < init + const; i++).  When running the
6035      loop optimization twice, the first pass often converts simple
6036      loops into this form.  */
6037
6038   if (REG_P (initial_value))
6039     {
6040       rtx reg1;
6041       rtx reg2;
6042       rtx const2;
6043
6044       reg1 = initial_value;
6045       if (GET_CODE (final_value) == PLUS)
6046         reg2 = XEXP (final_value, 0), const2 = XEXP (final_value, 1);
6047       else
6048         reg2 = final_value, const2 = const0_rtx;
6049
6050       /* Check for initial_value = reg1, final_value = reg2 + const2,
6051          where reg1 != reg2.  */
6052       if (REG_P (reg2) && reg2 != reg1)
6053         {
6054           rtx temp;
6055
6056           /* Find what reg1 is equivalent to.  Hopefully it will
6057              either be reg2 or reg2 plus a constant.  */
6058           temp = loop_find_equiv_value (loop, reg1);
6059
6060           if (find_common_reg_term (temp, reg2))
6061             initial_value = temp;
6062           else if (loop_invariant_p (loop, reg2))
6063             {
6064               /* Find what reg2 is equivalent to.  Hopefully it will
6065                  either be reg1 or reg1 plus a constant.  Let's ignore
6066                  the latter case for now since it is not so common.  */
6067               temp = loop_find_equiv_value (loop, reg2);
6068
6069               if (temp == loop_info->iteration_var)
6070                 temp = initial_value;
6071               if (temp == reg1)
6072                 final_value = (const2 == const0_rtx)
6073                   ? reg1 : gen_rtx_PLUS (GET_MODE (reg1), reg1, const2);
6074             }
6075         }
6076     }
6077
6078   loop_info->initial_equiv_value = initial_value;
6079   loop_info->final_equiv_value = final_value;
6080
6081   /* For EQ comparison loops, we don't have a valid final value.
6082      Check this now so that we won't leave an invalid value if we
6083      return early for any other reason.  */
6084   if (comparison_code == EQ)
6085     loop_info->final_equiv_value = loop_info->final_value = 0;
6086
6087   if (increment == 0)
6088     {
6089       if (loop_dump_stream)
6090         fprintf (loop_dump_stream,
6091                  "Loop iterations: Increment value can't be calculated.\n");
6092       return 0;
6093     }
6094
6095   if (GET_CODE (increment) != CONST_INT)
6096     {
6097       /* If we have a REG, check to see if REG holds a constant value.  */
6098       /* ??? Other RTL, such as (neg (reg)) is possible here, but it isn't
6099          clear if it is worthwhile to try to handle such RTL.  */
6100       if (REG_P (increment) || GET_CODE (increment) == SUBREG)
6101         increment = loop_find_equiv_value (loop, increment);
6102
6103       if (GET_CODE (increment) != CONST_INT)
6104         {
6105           if (loop_dump_stream)
6106             {
6107               fprintf (loop_dump_stream,
6108                        "Loop iterations: Increment value not constant ");
6109               print_simple_rtl (loop_dump_stream, increment);
6110               fprintf (loop_dump_stream, ".\n");
6111             }
6112           return 0;
6113         }
6114       loop_info->increment = increment;
6115     }
6116
6117   if (GET_CODE (initial_value) != CONST_INT)
6118     {
6119       if (loop_dump_stream)
6120         {
6121           fprintf (loop_dump_stream,
6122                    "Loop iterations: Initial value not constant ");
6123           print_simple_rtl (loop_dump_stream, initial_value);
6124           fprintf (loop_dump_stream, ".\n");
6125         }
6126       return 0;
6127     }
6128   else if (GET_CODE (final_value) != CONST_INT)
6129     {
6130       if (loop_dump_stream)
6131         {
6132           fprintf (loop_dump_stream,
6133                    "Loop iterations: Final value not constant ");
6134           print_simple_rtl (loop_dump_stream, final_value);
6135           fprintf (loop_dump_stream, ".\n");
6136         }
6137       return 0;
6138     }
6139   else if (comparison_code == EQ)
6140     {
6141       rtx inc_once;
6142
6143       if (loop_dump_stream)
6144         fprintf (loop_dump_stream, "Loop iterations: EQ comparison loop.\n");
6145
6146       inc_once = gen_int_mode (INTVAL (initial_value) + INTVAL (increment),
6147                                GET_MODE (iteration_var));
6148
6149       if (inc_once == final_value)
6150         {
6151           /* The iterator value once through the loop is equal to the
6152              comparison value.  Either we have an infinite loop, or
6153              we'll loop twice.  */
6154           if (increment == const0_rtx)
6155             return 0;
6156           loop_info->n_iterations = 2;
6157         }
6158       else
6159         loop_info->n_iterations = 1;
6160
6161       if (GET_CODE (loop_info->initial_value) == CONST_INT)
6162         loop_info->final_value
6163           = gen_int_mode ((INTVAL (loop_info->initial_value)
6164                            + loop_info->n_iterations * INTVAL (increment)),
6165                           GET_MODE (iteration_var));
6166       else
6167         loop_info->final_value
6168           = plus_constant (loop_info->initial_value,
6169                            loop_info->n_iterations * INTVAL (increment));
6170       loop_info->final_equiv_value
6171         = gen_int_mode ((INTVAL (initial_value)
6172                          + loop_info->n_iterations * INTVAL (increment)),
6173                         GET_MODE (iteration_var));
6174       return loop_info->n_iterations;
6175     }
6176
6177   /* Final_larger is 1 if final larger, 0 if they are equal, otherwise -1.  */
6178   if (unsigned_p)
6179     final_larger
6180       = ((unsigned HOST_WIDE_INT) INTVAL (final_value)
6181          > (unsigned HOST_WIDE_INT) INTVAL (initial_value))
6182         - ((unsigned HOST_WIDE_INT) INTVAL (final_value)
6183            < (unsigned HOST_WIDE_INT) INTVAL (initial_value));
6184   else
6185     final_larger = (INTVAL (final_value) > INTVAL (initial_value))
6186       - (INTVAL (final_value) < INTVAL (initial_value));
6187
6188   if (INTVAL (increment) > 0)
6189     increment_dir = 1;
6190   else if (INTVAL (increment) == 0)
6191     increment_dir = 0;
6192   else
6193     increment_dir = -1;
6194
6195   /* There are 27 different cases: compare_dir = -1, 0, 1;
6196      final_larger = -1, 0, 1; increment_dir = -1, 0, 1.
6197      There are 4 normal cases, 4 reverse cases (where the iteration variable
6198      will overflow before the loop exits), 4 infinite loop cases, and 15
6199      immediate exit (0 or 1 iteration depending on loop type) cases.
6200      Only try to optimize the normal cases.  */
6201
6202   /* (compare_dir/final_larger/increment_dir)
6203      Normal cases: (0/-1/-1), (0/1/1), (-1/-1/-1), (1/1/1)
6204      Reverse cases: (0/-1/1), (0/1/-1), (-1/-1/1), (1/1/-1)
6205      Infinite loops: (0/-1/0), (0/1/0), (-1/-1/0), (1/1/0)
6206      Immediate exit: (0/0/X), (-1/0/X), (-1/1/X), (1/0/X), (1/-1/X) */
6207
6208   /* ?? If the meaning of reverse loops (where the iteration variable
6209      will overflow before the loop exits) is undefined, then could
6210      eliminate all of these special checks, and just always assume
6211      the loops are normal/immediate/infinite.  Note that this means
6212      the sign of increment_dir does not have to be known.  Also,
6213      since it does not really hurt if immediate exit loops or infinite loops
6214      are optimized, then that case could be ignored also, and hence all
6215      loops can be optimized.
6216
6217      According to ANSI Spec, the reverse loop case result is undefined,
6218      because the action on overflow is undefined.
6219
6220      See also the special test for NE loops below.  */
6221
6222   if (final_larger == increment_dir && final_larger != 0
6223       && (final_larger == compare_dir || compare_dir == 0))
6224     /* Normal case.  */
6225     ;
6226   else
6227     {
6228       if (loop_dump_stream)
6229         fprintf (loop_dump_stream, "Loop iterations: Not normal loop.\n");
6230       return 0;
6231     }
6232
6233   /* Calculate the number of iterations, final_value is only an approximation,
6234      so correct for that.  Note that abs_diff and n_iterations are
6235      unsigned, because they can be as large as 2^n - 1.  */
6236
6237   inc = INTVAL (increment);
6238   if (inc > 0)
6239     {
6240       abs_diff = INTVAL (final_value) - INTVAL (initial_value);
6241       abs_inc = inc;
6242     }
6243   else if (inc < 0)
6244     {
6245       abs_diff = INTVAL (initial_value) - INTVAL (final_value);
6246       abs_inc = -inc;
6247     }
6248   else
6249     abort ();
6250
6251   /* Given that iteration_var is going to iterate over its own mode,
6252      not HOST_WIDE_INT, disregard higher bits that might have come
6253      into the picture due to sign extension of initial and final
6254      values.  */
6255   abs_diff &= ((unsigned HOST_WIDE_INT) 1
6256                << (GET_MODE_BITSIZE (GET_MODE (iteration_var)) - 1)
6257                << 1) - 1;
6258
6259   /* For NE tests, make sure that the iteration variable won't miss
6260      the final value.  If abs_diff mod abs_incr is not zero, then the
6261      iteration variable will overflow before the loop exits, and we
6262      can not calculate the number of iterations.  */
6263   if (compare_dir == 0 && (abs_diff % abs_inc) != 0)
6264     return 0;
6265
6266   /* Note that the number of iterations could be calculated using
6267      (abs_diff + abs_inc - 1) / abs_inc, provided care was taken to
6268      handle potential overflow of the summation.  */
6269   loop_info->n_iterations = abs_diff / abs_inc + ((abs_diff % abs_inc) != 0);
6270   return loop_info->n_iterations;
6271 }
6272
6273 /* Perform strength reduction and induction variable elimination.
6274
6275    Pseudo registers created during this function will be beyond the
6276    last valid index in several tables including
6277    REGS->ARRAY[I].N_TIMES_SET and REGNO_LAST_UID.  This does not cause a
6278    problem here, because the added registers cannot be givs outside of
6279    their loop, and hence will never be reconsidered.  But scan_loop
6280    must check regnos to make sure they are in bounds.  */
6281
6282 static void
6283 strength_reduce (struct loop *loop, int flags)
6284 {
6285   struct loop_info *loop_info = LOOP_INFO (loop);
6286   struct loop_regs *regs = LOOP_REGS (loop);
6287   struct loop_ivs *ivs = LOOP_IVS (loop);
6288   rtx p;
6289   /* Temporary list pointer for traversing ivs->list.  */
6290   struct iv_class *bl;
6291   /* Ratio of extra register life span we can justify
6292      for saving an instruction.  More if loop doesn't call subroutines
6293      since in that case saving an insn makes more difference
6294      and more registers are available.  */
6295   /* ??? could set this to last value of threshold in move_movables */
6296   int threshold = (loop_info->has_call ? 1 : 2) * (3 + n_non_fixed_regs);
6297   /* Map of pseudo-register replacements.  */
6298   rtx *reg_map = NULL;
6299   int reg_map_size;
6300   rtx test_reg = gen_rtx_REG (word_mode, LAST_VIRTUAL_REGISTER + 1);
6301   int insn_count = count_insns_in_loop (loop);
6302
6303   addr_placeholder = gen_reg_rtx (Pmode);
6304
6305   ivs->n_regs = max_reg_before_loop;
6306   ivs->regs = xcalloc (ivs->n_regs, sizeof (struct iv));
6307
6308   /* Find all BIVs in loop.  */
6309   loop_bivs_find (loop);
6310
6311   /* Exit if there are no bivs.  */
6312   if (! ivs->list)
6313     {
6314       loop_ivs_free (loop);
6315       return;
6316     }
6317
6318   /* Determine how BIVS are initialized by looking through pre-header
6319      extended basic block.  */
6320   loop_bivs_init_find (loop);
6321
6322   /* Look at the each biv and see if we can say anything better about its
6323      initial value from any initializing insns set up above.  */
6324   loop_bivs_check (loop);
6325
6326   /* Search the loop for general induction variables.  */
6327   loop_givs_find (loop);
6328
6329   /* Try to calculate and save the number of loop iterations.  This is
6330      set to zero if the actual number can not be calculated.  This must
6331      be called after all giv's have been identified, since otherwise it may
6332      fail if the iteration variable is a giv.  */
6333   loop_iterations (loop);
6334
6335 #ifdef HAVE_prefetch
6336   if (flags & LOOP_PREFETCH)
6337     emit_prefetch_instructions (loop);
6338 #endif
6339
6340   /* Now for each giv for which we still don't know whether or not it is
6341      replaceable, check to see if it is replaceable because its final value
6342      can be calculated.  This must be done after loop_iterations is called,
6343      so that final_giv_value will work correctly.  */
6344   loop_givs_check (loop);
6345
6346   /* Try to prove that the loop counter variable (if any) is always
6347      nonnegative; if so, record that fact with a REG_NONNEG note
6348      so that "decrement and branch until zero" insn can be used.  */
6349   check_dbra_loop (loop, insn_count);
6350
6351   /* Create reg_map to hold substitutions for replaceable giv regs.
6352      Some givs might have been made from biv increments, so look at
6353      ivs->reg_iv_type for a suitable size.  */
6354   reg_map_size = ivs->n_regs;
6355   reg_map = xcalloc (reg_map_size, sizeof (rtx));
6356
6357   /* Examine each iv class for feasibility of strength reduction/induction
6358      variable elimination.  */
6359
6360   for (bl = ivs->list; bl; bl = bl->next)
6361     {
6362       struct induction *v;
6363       int benefit;
6364
6365       /* Test whether it will be possible to eliminate this biv
6366          provided all givs are reduced.  */
6367       bl->eliminable = loop_biv_eliminable_p (loop, bl, threshold, insn_count);
6368
6369       /* This will be true at the end, if all givs which depend on this
6370          biv have been strength reduced.
6371          We can't (currently) eliminate the biv unless this is so.  */
6372       bl->all_reduced = 1;
6373
6374       /* Check each extension dependent giv in this class to see if its
6375          root biv is safe from wrapping in the interior mode.  */
6376       check_ext_dependent_givs (loop, bl);
6377
6378       /* Combine all giv's for this iv_class.  */
6379       combine_givs (regs, bl);
6380
6381       for (v = bl->giv; v; v = v->next_iv)
6382         {
6383           struct induction *tv;
6384
6385           if (v->ignore || v->same)
6386             continue;
6387
6388           benefit = loop_giv_reduce_benefit (loop, bl, v, test_reg);
6389
6390           /* If an insn is not to be strength reduced, then set its ignore
6391              flag, and clear bl->all_reduced.  */
6392
6393           /* A giv that depends on a reversed biv must be reduced if it is
6394              used after the loop exit, otherwise, it would have the wrong
6395              value after the loop exit.  To make it simple, just reduce all
6396              of such giv's whether or not we know they are used after the loop
6397              exit.  */
6398
6399           if (v->lifetime * threshold * benefit < insn_count
6400               && ! bl->reversed)
6401             {
6402               if (loop_dump_stream)
6403                 fprintf (loop_dump_stream,
6404                          "giv of insn %d not worth while, %d vs %d.\n",
6405                          INSN_UID (v->insn),
6406                          v->lifetime * threshold * benefit, insn_count);
6407               v->ignore = 1;
6408               bl->all_reduced = 0;
6409             }
6410           else
6411             {
6412               /* Check that we can increment the reduced giv without a
6413                  multiply insn.  If not, reject it.  */
6414
6415               for (tv = bl->biv; tv; tv = tv->next_iv)
6416                 if (tv->mult_val == const1_rtx
6417                     && ! product_cheap_p (tv->add_val, v->mult_val))
6418                   {
6419                     if (loop_dump_stream)
6420                       fprintf (loop_dump_stream,
6421                                "giv of insn %d: would need a multiply.\n",
6422                                INSN_UID (v->insn));
6423                     v->ignore = 1;
6424                     bl->all_reduced = 0;
6425                     break;
6426                   }
6427             }
6428         }
6429
6430       /* Check for givs whose first use is their definition and whose
6431          last use is the definition of another giv.  If so, it is likely
6432          dead and should not be used to derive another giv nor to
6433          eliminate a biv.  */
6434       loop_givs_dead_check (loop, bl);
6435
6436       /* Reduce each giv that we decided to reduce.  */
6437       loop_givs_reduce (loop, bl);
6438
6439       /* Rescan all givs.  If a giv is the same as a giv not reduced, mark it
6440          as not reduced.
6441
6442          For each giv register that can be reduced now: if replaceable,
6443          substitute reduced reg wherever the old giv occurs;
6444          else add new move insn "giv_reg = reduced_reg".  */
6445       loop_givs_rescan (loop, bl, reg_map);
6446
6447       /* All the givs based on the biv bl have been reduced if they
6448          merit it.  */
6449
6450       /* For each giv not marked as maybe dead that has been combined with a
6451          second giv, clear any "maybe dead" mark on that second giv.
6452          v->new_reg will either be or refer to the register of the giv it
6453          combined with.
6454
6455          Doing this clearing avoids problems in biv elimination where
6456          a giv's new_reg is a complex value that can't be put in the
6457          insn but the giv combined with (with a reg as new_reg) is
6458          marked maybe_dead.  Since the register will be used in either
6459          case, we'd prefer it be used from the simpler giv.  */
6460
6461       for (v = bl->giv; v; v = v->next_iv)
6462         if (! v->maybe_dead && v->same)
6463           v->same->maybe_dead = 0;
6464
6465       /* Try to eliminate the biv, if it is a candidate.
6466          This won't work if ! bl->all_reduced,
6467          since the givs we planned to use might not have been reduced.
6468
6469          We have to be careful that we didn't initially think we could
6470          eliminate this biv because of a giv that we now think may be
6471          dead and shouldn't be used as a biv replacement.
6472
6473          Also, there is the possibility that we may have a giv that looks
6474          like it can be used to eliminate a biv, but the resulting insn
6475          isn't valid.  This can happen, for example, on the 88k, where a
6476          JUMP_INSN can compare a register only with zero.  Attempts to
6477          replace it with a compare with a constant will fail.
6478
6479          Note that in cases where this call fails, we may have replaced some
6480          of the occurrences of the biv with a giv, but no harm was done in
6481          doing so in the rare cases where it can occur.  */
6482
6483       if (bl->all_reduced == 1 && bl->eliminable
6484           && maybe_eliminate_biv (loop, bl, 1, threshold, insn_count))
6485         {
6486           /* ?? If we created a new test to bypass the loop entirely,
6487              or otherwise drop straight in, based on this test, then
6488              we might want to rewrite it also.  This way some later
6489              pass has more hope of removing the initialization of this
6490              biv entirely.  */
6491
6492           /* If final_value != 0, then the biv may be used after loop end
6493              and we must emit an insn to set it just in case.
6494
6495              Reversed bivs already have an insn after the loop setting their
6496              value, so we don't need another one.  We can't calculate the
6497              proper final value for such a biv here anyways.  */
6498           if (bl->final_value && ! bl->reversed)
6499               loop_insn_sink_or_swim (loop,
6500                                       gen_load_of_final_value (bl->biv->dest_reg,
6501                                                                bl->final_value));
6502
6503           if (loop_dump_stream)
6504             fprintf (loop_dump_stream, "Reg %d: biv eliminated\n",
6505                      bl->regno);
6506         }
6507       /* See above note wrt final_value.  But since we couldn't eliminate
6508          the biv, we must set the value after the loop instead of before.  */
6509       else if (bl->final_value && ! bl->reversed)
6510         loop_insn_sink (loop, gen_load_of_final_value (bl->biv->dest_reg,
6511                                                        bl->final_value));
6512     }
6513
6514   /* Go through all the instructions in the loop, making all the
6515      register substitutions scheduled in REG_MAP.  */
6516
6517   for (p = loop->start; p != loop->end; p = NEXT_INSN (p))
6518     if (INSN_P (p))
6519       {
6520         replace_regs (PATTERN (p), reg_map, reg_map_size, 0);
6521         replace_regs (REG_NOTES (p), reg_map, reg_map_size, 0);
6522         INSN_CODE (p) = -1;
6523       }
6524
6525   if (loop_dump_stream)
6526     fprintf (loop_dump_stream, "\n");
6527
6528   loop_ivs_free (loop);
6529   if (reg_map)
6530     free (reg_map);
6531 }
6532 \f
6533 /*Record all basic induction variables calculated in the insn.  */
6534 static rtx
6535 check_insn_for_bivs (struct loop *loop, rtx p, int not_every_iteration,
6536                      int maybe_multiple)
6537 {
6538   struct loop_ivs *ivs = LOOP_IVS (loop);
6539   rtx set;
6540   rtx dest_reg;
6541   rtx inc_val;
6542   rtx mult_val;
6543   rtx *location;
6544
6545   if (NONJUMP_INSN_P (p)
6546       && (set = single_set (p))
6547       && REG_P (SET_DEST (set)))
6548     {
6549       dest_reg = SET_DEST (set);
6550       if (REGNO (dest_reg) < max_reg_before_loop
6551           && REGNO (dest_reg) >= FIRST_PSEUDO_REGISTER
6552           && REG_IV_TYPE (ivs, REGNO (dest_reg)) != NOT_BASIC_INDUCT)
6553         {
6554           if (basic_induction_var (loop, SET_SRC (set),
6555                                    GET_MODE (SET_SRC (set)),
6556                                    dest_reg, p, &inc_val, &mult_val,
6557                                    &location))
6558             {
6559               /* It is a possible basic induction variable.
6560                  Create and initialize an induction structure for it.  */
6561
6562               struct induction *v = xmalloc (sizeof (struct induction));
6563
6564               record_biv (loop, v, p, dest_reg, inc_val, mult_val, location,
6565                           not_every_iteration, maybe_multiple);
6566               REG_IV_TYPE (ivs, REGNO (dest_reg)) = BASIC_INDUCT;
6567             }
6568           else if (REGNO (dest_reg) < ivs->n_regs)
6569             REG_IV_TYPE (ivs, REGNO (dest_reg)) = NOT_BASIC_INDUCT;
6570         }
6571     }
6572   return p;
6573 }
6574 \f
6575 /* Record all givs calculated in the insn.
6576    A register is a giv if: it is only set once, it is a function of a
6577    biv and a constant (or invariant), and it is not a biv.  */
6578 static rtx
6579 check_insn_for_givs (struct loop *loop, rtx p, int not_every_iteration,
6580                      int maybe_multiple)
6581 {
6582   struct loop_regs *regs = LOOP_REGS (loop);
6583
6584   rtx set;
6585   /* Look for a general induction variable in a register.  */
6586   if (NONJUMP_INSN_P (p)
6587       && (set = single_set (p))
6588       && REG_P (SET_DEST (set))
6589       && ! regs->array[REGNO (SET_DEST (set))].may_not_optimize)
6590     {
6591       rtx src_reg;
6592       rtx dest_reg;
6593       rtx add_val;
6594       rtx mult_val;
6595       rtx ext_val;
6596       int benefit;
6597       rtx regnote = 0;
6598       rtx last_consec_insn;
6599
6600       dest_reg = SET_DEST (set);
6601       if (REGNO (dest_reg) < FIRST_PSEUDO_REGISTER)
6602         return p;
6603
6604       if (/* SET_SRC is a giv.  */
6605           (general_induction_var (loop, SET_SRC (set), &src_reg, &add_val,
6606                                   &mult_val, &ext_val, 0, &benefit, VOIDmode)
6607            /* Equivalent expression is a giv.  */
6608            || ((regnote = find_reg_note (p, REG_EQUAL, NULL_RTX))
6609                && general_induction_var (loop, XEXP (regnote, 0), &src_reg,
6610                                          &add_val, &mult_val, &ext_val, 0,
6611                                          &benefit, VOIDmode)))
6612           /* Don't try to handle any regs made by loop optimization.
6613              We have nothing on them in regno_first_uid, etc.  */
6614           && REGNO (dest_reg) < max_reg_before_loop
6615           /* Don't recognize a BASIC_INDUCT_VAR here.  */
6616           && dest_reg != src_reg
6617           /* This must be the only place where the register is set.  */
6618           && (regs->array[REGNO (dest_reg)].n_times_set == 1
6619               /* or all sets must be consecutive and make a giv.  */
6620               || (benefit = consec_sets_giv (loop, benefit, p,
6621                                              src_reg, dest_reg,
6622                                              &add_val, &mult_val, &ext_val,
6623                                              &last_consec_insn))))
6624         {
6625           struct induction *v = xmalloc (sizeof (struct induction));
6626
6627           /* If this is a library call, increase benefit.  */
6628           if (find_reg_note (p, REG_RETVAL, NULL_RTX))
6629             benefit += libcall_benefit (p);
6630
6631           /* Skip the consecutive insns, if there are any.  */
6632           if (regs->array[REGNO (dest_reg)].n_times_set != 1)
6633             p = last_consec_insn;
6634
6635           record_giv (loop, v, p, src_reg, dest_reg, mult_val, add_val,
6636                       ext_val, benefit, DEST_REG, not_every_iteration,
6637                       maybe_multiple, (rtx*) 0);
6638
6639         }
6640     }
6641
6642   /* Look for givs which are memory addresses.  */
6643   if (NONJUMP_INSN_P (p))
6644     find_mem_givs (loop, PATTERN (p), p, not_every_iteration,
6645                    maybe_multiple);
6646
6647   /* Update the status of whether giv can derive other givs.  This can
6648      change when we pass a label or an insn that updates a biv.  */
6649   if (INSN_P (p) || LABEL_P (p))
6650     update_giv_derive (loop, p);
6651   return p;
6652 }
6653 \f
6654 /* Return 1 if X is a valid source for an initial value (or as value being
6655    compared against in an initial test).
6656
6657    X must be either a register or constant and must not be clobbered between
6658    the current insn and the start of the loop.
6659
6660    INSN is the insn containing X.  */
6661
6662 static int
6663 valid_initial_value_p (rtx x, rtx insn, int call_seen, rtx loop_start)
6664 {
6665   if (CONSTANT_P (x))
6666     return 1;
6667
6668   /* Only consider pseudos we know about initialized in insns whose luids
6669      we know.  */
6670   if (!REG_P (x)
6671       || REGNO (x) >= max_reg_before_loop)
6672     return 0;
6673
6674   /* Don't use call-clobbered registers across a call which clobbers it.  On
6675      some machines, don't use any hard registers at all.  */
6676   if (REGNO (x) < FIRST_PSEUDO_REGISTER
6677       && (SMALL_REGISTER_CLASSES
6678           || (call_used_regs[REGNO (x)] && call_seen)))
6679     return 0;
6680
6681   /* Don't use registers that have been clobbered before the start of the
6682      loop.  */
6683   if (reg_set_between_p (x, insn, loop_start))
6684     return 0;
6685
6686   return 1;
6687 }
6688 \f
6689 /* Scan X for memory refs and check each memory address
6690    as a possible giv.  INSN is the insn whose pattern X comes from.
6691    NOT_EVERY_ITERATION is 1 if the insn might not be executed during
6692    every loop iteration.  MAYBE_MULTIPLE is 1 if the insn might be executed
6693    more than once in each loop iteration.  */
6694
6695 static void
6696 find_mem_givs (const struct loop *loop, rtx x, rtx insn,
6697                int not_every_iteration, int maybe_multiple)
6698 {
6699   int i, j;
6700   enum rtx_code code;
6701   const char *fmt;
6702
6703   if (x == 0)
6704     return;
6705
6706   code = GET_CODE (x);
6707   switch (code)
6708     {
6709     case REG:
6710     case CONST_INT:
6711     case CONST:
6712     case CONST_DOUBLE:
6713     case SYMBOL_REF:
6714     case LABEL_REF:
6715     case PC:
6716     case CC0:
6717     case ADDR_VEC:
6718     case ADDR_DIFF_VEC:
6719     case USE:
6720     case CLOBBER:
6721       return;
6722
6723     case MEM:
6724       {
6725         rtx src_reg;
6726         rtx add_val;
6727         rtx mult_val;
6728         rtx ext_val;
6729         int benefit;
6730
6731         /* This code used to disable creating GIVs with mult_val == 1 and
6732            add_val == 0.  However, this leads to lost optimizations when
6733            it comes time to combine a set of related DEST_ADDR GIVs, since
6734            this one would not be seen.  */
6735
6736         if (general_induction_var (loop, XEXP (x, 0), &src_reg, &add_val,
6737                                    &mult_val, &ext_val, 1, &benefit,
6738                                    GET_MODE (x)))
6739           {
6740             /* Found one; record it.  */
6741             struct induction *v = xmalloc (sizeof (struct induction));
6742
6743             record_giv (loop, v, insn, src_reg, addr_placeholder, mult_val,
6744                         add_val, ext_val, benefit, DEST_ADDR,
6745                         not_every_iteration, maybe_multiple, &XEXP (x, 0));
6746
6747             v->mem = x;
6748           }
6749       }
6750       return;
6751
6752     default:
6753       break;
6754     }
6755
6756   /* Recursively scan the subexpressions for other mem refs.  */
6757
6758   fmt = GET_RTX_FORMAT (code);
6759   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
6760     if (fmt[i] == 'e')
6761       find_mem_givs (loop, XEXP (x, i), insn, not_every_iteration,
6762                      maybe_multiple);
6763     else if (fmt[i] == 'E')
6764       for (j = 0; j < XVECLEN (x, i); j++)
6765         find_mem_givs (loop, XVECEXP (x, i, j), insn, not_every_iteration,
6766                        maybe_multiple);
6767 }
6768 \f
6769 /* Fill in the data about one biv update.
6770    V is the `struct induction' in which we record the biv.  (It is
6771    allocated by the caller, with alloca.)
6772    INSN is the insn that sets it.
6773    DEST_REG is the biv's reg.
6774
6775    MULT_VAL is const1_rtx if the biv is being incremented here, in which case
6776    INC_VAL is the increment.  Otherwise, MULT_VAL is const0_rtx and the biv is
6777    being set to INC_VAL.
6778
6779    NOT_EVERY_ITERATION is nonzero if this biv update is not know to be
6780    executed every iteration; MAYBE_MULTIPLE is nonzero if this biv update
6781    can be executed more than once per iteration.  If MAYBE_MULTIPLE
6782    and NOT_EVERY_ITERATION are both zero, we know that the biv update is
6783    executed exactly once per iteration.  */
6784
6785 static void
6786 record_biv (struct loop *loop, struct induction *v, rtx insn, rtx dest_reg,
6787             rtx inc_val, rtx mult_val, rtx *location,
6788             int not_every_iteration, int maybe_multiple)
6789 {
6790   struct loop_ivs *ivs = LOOP_IVS (loop);
6791   struct iv_class *bl;
6792
6793   v->insn = insn;
6794   v->src_reg = dest_reg;
6795   v->dest_reg = dest_reg;
6796   v->mult_val = mult_val;
6797   v->add_val = inc_val;
6798   v->ext_dependent = NULL_RTX;
6799   v->location = location;
6800   v->mode = GET_MODE (dest_reg);
6801   v->always_computable = ! not_every_iteration;
6802   v->always_executed = ! not_every_iteration;
6803   v->maybe_multiple = maybe_multiple;
6804   v->same = 0;
6805
6806   /* Add this to the reg's iv_class, creating a class
6807      if this is the first incrementation of the reg.  */
6808
6809   bl = REG_IV_CLASS (ivs, REGNO (dest_reg));
6810   if (bl == 0)
6811     {
6812       /* Create and initialize new iv_class.  */
6813
6814       bl = xmalloc (sizeof (struct iv_class));
6815
6816       bl->regno = REGNO (dest_reg);
6817       bl->biv = 0;
6818       bl->giv = 0;
6819       bl->biv_count = 0;
6820       bl->giv_count = 0;
6821
6822       /* Set initial value to the reg itself.  */
6823       bl->initial_value = dest_reg;
6824       bl->final_value = 0;
6825       /* We haven't seen the initializing insn yet.  */
6826       bl->init_insn = 0;
6827       bl->init_set = 0;
6828       bl->initial_test = 0;
6829       bl->incremented = 0;
6830       bl->eliminable = 0;
6831       bl->nonneg = 0;
6832       bl->reversed = 0;
6833       bl->total_benefit = 0;
6834
6835       /* Add this class to ivs->list.  */
6836       bl->next = ivs->list;
6837       ivs->list = bl;
6838
6839       /* Put it in the array of biv register classes.  */
6840       REG_IV_CLASS (ivs, REGNO (dest_reg)) = bl;
6841     }
6842   else
6843     {
6844       /* Check if location is the same as a previous one.  */
6845       struct induction *induction;
6846       for (induction = bl->biv; induction; induction = induction->next_iv)
6847         if (location == induction->location)
6848           {
6849             v->same = induction;
6850             break;
6851           }
6852     }
6853
6854   /* Update IV_CLASS entry for this biv.  */
6855   v->next_iv = bl->biv;
6856   bl->biv = v;
6857   bl->biv_count++;
6858   if (mult_val == const1_rtx)
6859     bl->incremented = 1;
6860
6861   if (loop_dump_stream)
6862     loop_biv_dump (v, loop_dump_stream, 0);
6863 }
6864 \f
6865 /* Fill in the data about one giv.
6866    V is the `struct induction' in which we record the giv.  (It is
6867    allocated by the caller, with alloca.)
6868    INSN is the insn that sets it.
6869    BENEFIT estimates the savings from deleting this insn.
6870    TYPE is DEST_REG or DEST_ADDR; it says whether the giv is computed
6871    into a register or is used as a memory address.
6872
6873    SRC_REG is the biv reg which the giv is computed from.
6874    DEST_REG is the giv's reg (if the giv is stored in a reg).
6875    MULT_VAL and ADD_VAL are the coefficients used to compute the giv.
6876    LOCATION points to the place where this giv's value appears in INSN.  */
6877
6878 static void
6879 record_giv (const struct loop *loop, struct induction *v, rtx insn,
6880             rtx src_reg, rtx dest_reg, rtx mult_val, rtx add_val,
6881             rtx ext_val, int benefit, enum g_types type,
6882             int not_every_iteration, int maybe_multiple, rtx *location)
6883 {
6884   struct loop_ivs *ivs = LOOP_IVS (loop);
6885   struct induction *b;
6886   struct iv_class *bl;
6887   rtx set = single_set (insn);
6888   rtx temp;
6889
6890   /* Attempt to prove constantness of the values.  Don't let simplify_rtx
6891      undo the MULT canonicalization that we performed earlier.  */
6892   temp = simplify_rtx (add_val);
6893   if (temp
6894       && ! (GET_CODE (add_val) == MULT
6895             && GET_CODE (temp) == ASHIFT))
6896     add_val = temp;
6897
6898   v->insn = insn;
6899   v->src_reg = src_reg;
6900   v->giv_type = type;
6901   v->dest_reg = dest_reg;
6902   v->mult_val = mult_val;
6903   v->add_val = add_val;
6904   v->ext_dependent = ext_val;
6905   v->benefit = benefit;
6906   v->location = location;
6907   v->cant_derive = 0;
6908   v->combined_with = 0;
6909   v->maybe_multiple = maybe_multiple;
6910   v->maybe_dead = 0;
6911   v->derive_adjustment = 0;
6912   v->same = 0;
6913   v->ignore = 0;
6914   v->new_reg = 0;
6915   v->final_value = 0;
6916   v->same_insn = 0;
6917   v->auto_inc_opt = 0;
6918   v->shared = 0;
6919
6920   /* The v->always_computable field is used in update_giv_derive, to
6921      determine whether a giv can be used to derive another giv.  For a
6922      DEST_REG giv, INSN computes a new value for the giv, so its value
6923      isn't computable if INSN insn't executed every iteration.
6924      However, for a DEST_ADDR giv, INSN merely uses the value of the giv;
6925      it does not compute a new value.  Hence the value is always computable
6926      regardless of whether INSN is executed each iteration.  */
6927
6928   if (type == DEST_ADDR)
6929     v->always_computable = 1;
6930   else
6931     v->always_computable = ! not_every_iteration;
6932
6933   v->always_executed = ! not_every_iteration;
6934
6935   if (type == DEST_ADDR)
6936     {
6937       v->mode = GET_MODE (*location);
6938       v->lifetime = 1;
6939     }
6940   else /* type == DEST_REG */
6941     {
6942       v->mode = GET_MODE (SET_DEST (set));
6943
6944       v->lifetime = LOOP_REG_LIFETIME (loop, REGNO (dest_reg));
6945
6946       /* If the lifetime is zero, it means that this register is
6947          really a dead store.  So mark this as a giv that can be
6948          ignored.  This will not prevent the biv from being eliminated.  */
6949       if (v->lifetime == 0)
6950         v->ignore = 1;
6951
6952       REG_IV_TYPE (ivs, REGNO (dest_reg)) = GENERAL_INDUCT;
6953       REG_IV_INFO (ivs, REGNO (dest_reg)) = v;
6954     }
6955
6956   /* Add the giv to the class of givs computed from one biv.  */
6957
6958   bl = REG_IV_CLASS (ivs, REGNO (src_reg));
6959   if (bl)
6960     {
6961       v->next_iv = bl->giv;
6962       bl->giv = v;
6963       /* Don't count DEST_ADDR.  This is supposed to count the number of
6964          insns that calculate givs.  */
6965       if (type == DEST_REG)
6966         bl->giv_count++;
6967       bl->total_benefit += benefit;
6968     }
6969   else
6970     /* Fatal error, biv missing for this giv?  */
6971     abort ();
6972
6973   if (type == DEST_ADDR)
6974     {
6975       v->replaceable = 1;
6976       v->not_replaceable = 0;
6977     }
6978   else
6979     {
6980       /* The giv can be replaced outright by the reduced register only if all
6981          of the following conditions are true:
6982          - the insn that sets the giv is always executed on any iteration
6983            on which the giv is used at all
6984            (there are two ways to deduce this:
6985             either the insn is executed on every iteration,
6986             or all uses follow that insn in the same basic block),
6987          - the giv is not used outside the loop
6988          - no assignments to the biv occur during the giv's lifetime.  */
6989
6990       if (REGNO_FIRST_UID (REGNO (dest_reg)) == INSN_UID (insn)
6991           /* Previous line always fails if INSN was moved by loop opt.  */
6992           && REGNO_LAST_LUID (REGNO (dest_reg))
6993           < INSN_LUID (loop->end)
6994           && (! not_every_iteration
6995               || last_use_this_basic_block (dest_reg, insn)))
6996         {
6997           /* Now check that there are no assignments to the biv within the
6998              giv's lifetime.  This requires two separate checks.  */
6999
7000           /* Check each biv update, and fail if any are between the first
7001              and last use of the giv.
7002
7003              If this loop contains an inner loop that was unrolled, then
7004              the insn modifying the biv may have been emitted by the loop
7005              unrolling code, and hence does not have a valid luid.  Just
7006              mark the biv as not replaceable in this case.  It is not very
7007              useful as a biv, because it is used in two different loops.
7008              It is very unlikely that we would be able to optimize the giv
7009              using this biv anyways.  */
7010
7011           v->replaceable = 1;
7012           v->not_replaceable = 0;
7013           for (b = bl->biv; b; b = b->next_iv)
7014             {
7015               if (INSN_UID (b->insn) >= max_uid_for_loop
7016                   || ((INSN_LUID (b->insn)
7017                        >= REGNO_FIRST_LUID (REGNO (dest_reg)))
7018                       && (INSN_LUID (b->insn)
7019                           <= REGNO_LAST_LUID (REGNO (dest_reg)))))
7020                 {
7021                   v->replaceable = 0;
7022                   v->not_replaceable = 1;
7023                   break;
7024                 }
7025             }
7026
7027           /* If there are any backwards branches that go from after the
7028              biv update to before it, then this giv is not replaceable.  */
7029           if (v->replaceable)
7030             for (b = bl->biv; b; b = b->next_iv)
7031               if (back_branch_in_range_p (loop, b->insn))
7032                 {
7033                   v->replaceable = 0;
7034                   v->not_replaceable = 1;
7035                   break;
7036                 }
7037         }
7038       else
7039         {
7040           /* May still be replaceable, we don't have enough info here to
7041              decide.  */
7042           v->replaceable = 0;
7043           v->not_replaceable = 0;
7044         }
7045     }
7046
7047   /* Record whether the add_val contains a const_int, for later use by
7048      combine_givs.  */
7049   {
7050     rtx tem = add_val;
7051
7052     v->no_const_addval = 1;
7053     if (tem == const0_rtx)
7054       ;
7055     else if (CONSTANT_P (add_val))
7056       v->no_const_addval = 0;
7057     if (GET_CODE (tem) == PLUS)
7058       {
7059         while (1)
7060           {
7061             if (GET_CODE (XEXP (tem, 0)) == PLUS)
7062               tem = XEXP (tem, 0);
7063             else if (GET_CODE (XEXP (tem, 1)) == PLUS)
7064               tem = XEXP (tem, 1);
7065             else
7066               break;
7067           }
7068         if (CONSTANT_P (XEXP (tem, 1)))
7069           v->no_const_addval = 0;
7070       }
7071   }
7072
7073   if (loop_dump_stream)
7074     loop_giv_dump (v, loop_dump_stream, 0);
7075 }
7076
7077 /* Try to calculate the final value of the giv, the value it will have at
7078    the end of the loop.  If we can do it, return that value.  */
7079
7080 static rtx
7081 final_giv_value (const struct loop *loop, struct induction *v)
7082 {
7083   struct loop_ivs *ivs = LOOP_IVS (loop);
7084   struct iv_class *bl;
7085   rtx insn;
7086   rtx increment, tem;
7087   rtx seq;
7088   rtx loop_end = loop->end;
7089   unsigned HOST_WIDE_INT n_iterations = LOOP_INFO (loop)->n_iterations;
7090
7091   bl = REG_IV_CLASS (ivs, REGNO (v->src_reg));
7092
7093   /* The final value for givs which depend on reversed bivs must be calculated
7094      differently than for ordinary givs.  In this case, there is already an
7095      insn after the loop which sets this giv's final value (if necessary),
7096      and there are no other loop exits, so we can return any value.  */
7097   if (bl->reversed)
7098     {
7099       if (loop_dump_stream)
7100         fprintf (loop_dump_stream,
7101                  "Final giv value for %d, depends on reversed biv\n",
7102                  REGNO (v->dest_reg));
7103       return const0_rtx;
7104     }
7105
7106   /* Try to calculate the final value as a function of the biv it depends
7107      upon.  The only exit from the loop must be the fall through at the bottom
7108      and the insn that sets the giv must be executed on every iteration
7109      (otherwise the giv may not have its final value when the loop exits).  */
7110
7111   /* ??? Can calculate the final giv value by subtracting off the
7112      extra biv increments times the giv's mult_val.  The loop must have
7113      only one exit for this to work, but the loop iterations does not need
7114      to be known.  */
7115
7116   if (n_iterations != 0
7117       && ! loop->exit_count
7118       && v->always_executed)
7119     {
7120       /* ?? It is tempting to use the biv's value here since these insns will
7121          be put after the loop, and hence the biv will have its final value
7122          then.  However, this fails if the biv is subsequently eliminated.
7123          Perhaps determine whether biv's are eliminable before trying to
7124          determine whether giv's are replaceable so that we can use the
7125          biv value here if it is not eliminable.  */
7126
7127       /* We are emitting code after the end of the loop, so we must make
7128          sure that bl->initial_value is still valid then.  It will still
7129          be valid if it is invariant.  */
7130
7131       increment = biv_total_increment (bl);
7132
7133       if (increment && loop_invariant_p (loop, increment)
7134           && loop_invariant_p (loop, bl->initial_value))
7135         {
7136           /* Can calculate the loop exit value of its biv as
7137              (n_iterations * increment) + initial_value */
7138
7139           /* The loop exit value of the giv is then
7140              (final_biv_value - extra increments) * mult_val + add_val.
7141              The extra increments are any increments to the biv which
7142              occur in the loop after the giv's value is calculated.
7143              We must search from the insn that sets the giv to the end
7144              of the loop to calculate this value.  */
7145
7146           /* Put the final biv value in tem.  */
7147           tem = gen_reg_rtx (v->mode);
7148           record_base_value (REGNO (tem), bl->biv->add_val, 0);
7149           loop_iv_add_mult_sink (loop, extend_value_for_giv (v, increment),
7150                                  GEN_INT (n_iterations),
7151                                  extend_value_for_giv (v, bl->initial_value),
7152                                  tem);
7153
7154           /* Subtract off extra increments as we find them.  */
7155           for (insn = NEXT_INSN (v->insn); insn != loop_end;
7156                insn = NEXT_INSN (insn))
7157             {
7158               struct induction *biv;
7159
7160               for (biv = bl->biv; biv; biv = biv->next_iv)
7161                 if (biv->insn == insn)
7162                   {
7163                     start_sequence ();
7164                     tem = expand_simple_binop (GET_MODE (tem), MINUS, tem,
7165                                                biv->add_val, NULL_RTX, 0,
7166                                                OPTAB_LIB_WIDEN);
7167                     seq = get_insns ();
7168                     end_sequence ();
7169                     loop_insn_sink (loop, seq);
7170                   }
7171             }
7172
7173           /* Now calculate the giv's final value.  */
7174           loop_iv_add_mult_sink (loop, tem, v->mult_val, v->add_val, tem);
7175
7176           if (loop_dump_stream)
7177             fprintf (loop_dump_stream,
7178                      "Final giv value for %d, calc from biv's value.\n",
7179                      REGNO (v->dest_reg));
7180
7181           return tem;
7182         }
7183     }
7184
7185   /* Replaceable giv's should never reach here.  */
7186   if (v->replaceable)
7187     abort ();
7188
7189   /* Check to see if the biv is dead at all loop exits.  */
7190   if (reg_dead_after_loop (loop, v->dest_reg))
7191     {
7192       if (loop_dump_stream)
7193         fprintf (loop_dump_stream,
7194                  "Final giv value for %d, giv dead after loop exit.\n",
7195                  REGNO (v->dest_reg));
7196
7197       return const0_rtx;
7198     }
7199
7200   return 0;
7201 }
7202
7203 /* All this does is determine whether a giv can be made replaceable because
7204    its final value can be calculated.  This code can not be part of record_giv
7205    above, because final_giv_value requires that the number of loop iterations
7206    be known, and that can not be accurately calculated until after all givs
7207    have been identified.  */
7208
7209 static void
7210 check_final_value (const struct loop *loop, struct induction *v)
7211 {
7212   rtx final_value = 0;
7213
7214   /* DEST_ADDR givs will never reach here, because they are always marked
7215      replaceable above in record_giv.  */
7216
7217   /* The giv can be replaced outright by the reduced register only if all
7218      of the following conditions are true:
7219      - the insn that sets the giv is always executed on any iteration
7220        on which the giv is used at all
7221        (there are two ways to deduce this:
7222         either the insn is executed on every iteration,
7223         or all uses follow that insn in the same basic block),
7224      - its final value can be calculated (this condition is different
7225        than the one above in record_giv)
7226      - it's not used before the it's set
7227      - no assignments to the biv occur during the giv's lifetime.  */
7228
7229 #if 0
7230   /* This is only called now when replaceable is known to be false.  */
7231   /* Clear replaceable, so that it won't confuse final_giv_value.  */
7232   v->replaceable = 0;
7233 #endif
7234
7235   if ((final_value = final_giv_value (loop, v))
7236       && (v->always_executed
7237           || last_use_this_basic_block (v->dest_reg, v->insn)))
7238     {
7239       int biv_increment_seen = 0, before_giv_insn = 0;
7240       rtx p = v->insn;
7241       rtx last_giv_use;
7242
7243       v->replaceable = 1;
7244       v->not_replaceable = 0;
7245
7246       /* When trying to determine whether or not a biv increment occurs
7247          during the lifetime of the giv, we can ignore uses of the variable
7248          outside the loop because final_value is true.  Hence we can not
7249          use regno_last_uid and regno_first_uid as above in record_giv.  */
7250
7251       /* Search the loop to determine whether any assignments to the
7252          biv occur during the giv's lifetime.  Start with the insn
7253          that sets the giv, and search around the loop until we come
7254          back to that insn again.
7255
7256          Also fail if there is a jump within the giv's lifetime that jumps
7257          to somewhere outside the lifetime but still within the loop.  This
7258          catches spaghetti code where the execution order is not linear, and
7259          hence the above test fails.  Here we assume that the giv lifetime
7260          does not extend from one iteration of the loop to the next, so as
7261          to make the test easier.  Since the lifetime isn't known yet,
7262          this requires two loops.  See also record_giv above.  */
7263
7264       last_giv_use = v->insn;
7265
7266       while (1)
7267         {
7268           p = NEXT_INSN (p);
7269           if (p == loop->end)
7270             {
7271               before_giv_insn = 1;
7272               p = NEXT_INSN (loop->start);
7273             }
7274           if (p == v->insn)
7275             break;
7276
7277           if (INSN_P (p))
7278             {
7279               /* It is possible for the BIV increment to use the GIV if we
7280                  have a cycle.  Thus we must be sure to check each insn for
7281                  both BIV and GIV uses, and we must check for BIV uses
7282                  first.  */
7283
7284               if (! biv_increment_seen
7285                   && reg_set_p (v->src_reg, PATTERN (p)))
7286                 biv_increment_seen = 1;
7287
7288               if (reg_mentioned_p (v->dest_reg, PATTERN (p)))
7289                 {
7290                   if (biv_increment_seen || before_giv_insn)
7291                     {
7292                       v->replaceable = 0;
7293                       v->not_replaceable = 1;
7294                       break;
7295                     }
7296                   last_giv_use = p;
7297                 }
7298             }
7299         }
7300
7301       /* Now that the lifetime of the giv is known, check for branches
7302          from within the lifetime to outside the lifetime if it is still
7303          replaceable.  */
7304
7305       if (v->replaceable)
7306         {
7307           p = v->insn;
7308           while (1)
7309             {
7310               p = NEXT_INSN (p);
7311               if (p == loop->end)
7312                 p = NEXT_INSN (loop->start);
7313               if (p == last_giv_use)
7314                 break;
7315
7316               if (JUMP_P (p) && JUMP_LABEL (p)
7317                   && LABEL_NAME (JUMP_LABEL (p))
7318                   && ((loop_insn_first_p (JUMP_LABEL (p), v->insn)
7319                        && loop_insn_first_p (loop->start, JUMP_LABEL (p)))
7320                       || (loop_insn_first_p (last_giv_use, JUMP_LABEL (p))
7321                           && loop_insn_first_p (JUMP_LABEL (p), loop->end))))
7322                 {
7323                   v->replaceable = 0;
7324                   v->not_replaceable = 1;
7325
7326                   if (loop_dump_stream)
7327                     fprintf (loop_dump_stream,
7328                              "Found branch outside giv lifetime.\n");
7329
7330                   break;
7331                 }
7332             }
7333         }
7334
7335       /* If it is replaceable, then save the final value.  */
7336       if (v->replaceable)
7337         v->final_value = final_value;
7338     }
7339
7340   if (loop_dump_stream && v->replaceable)
7341     fprintf (loop_dump_stream, "Insn %d: giv reg %d final_value replaceable\n",
7342              INSN_UID (v->insn), REGNO (v->dest_reg));
7343 }
7344 \f
7345 /* Update the status of whether a giv can derive other givs.
7346
7347    We need to do something special if there is or may be an update to the biv
7348    between the time the giv is defined and the time it is used to derive
7349    another giv.
7350
7351    In addition, a giv that is only conditionally set is not allowed to
7352    derive another giv once a label has been passed.
7353
7354    The cases we look at are when a label or an update to a biv is passed.  */
7355
7356 static void
7357 update_giv_derive (const struct loop *loop, rtx p)
7358 {
7359   struct loop_ivs *ivs = LOOP_IVS (loop);
7360   struct iv_class *bl;
7361   struct induction *biv, *giv;
7362   rtx tem;
7363   int dummy;
7364
7365   /* Search all IV classes, then all bivs, and finally all givs.
7366
7367      There are three cases we are concerned with.  First we have the situation
7368      of a giv that is only updated conditionally.  In that case, it may not
7369      derive any givs after a label is passed.
7370
7371      The second case is when a biv update occurs, or may occur, after the
7372      definition of a giv.  For certain biv updates (see below) that are
7373      known to occur between the giv definition and use, we can adjust the
7374      giv definition.  For others, or when the biv update is conditional,
7375      we must prevent the giv from deriving any other givs.  There are two
7376      sub-cases within this case.
7377
7378      If this is a label, we are concerned with any biv update that is done
7379      conditionally, since it may be done after the giv is defined followed by
7380      a branch here (actually, we need to pass both a jump and a label, but
7381      this extra tracking doesn't seem worth it).
7382
7383      If this is a jump, we are concerned about any biv update that may be
7384      executed multiple times.  We are actually only concerned about
7385      backward jumps, but it is probably not worth performing the test
7386      on the jump again here.
7387
7388      If this is a biv update, we must adjust the giv status to show that a
7389      subsequent biv update was performed.  If this adjustment cannot be done,
7390      the giv cannot derive further givs.  */
7391
7392   for (bl = ivs->list; bl; bl = bl->next)
7393     for (biv = bl->biv; biv; biv = biv->next_iv)
7394       if (LABEL_P (p) || JUMP_P (p)
7395           || biv->insn == p)
7396         {
7397           /* Skip if location is the same as a previous one.  */
7398           if (biv->same)
7399             continue;
7400
7401           for (giv = bl->giv; giv; giv = giv->next_iv)
7402             {
7403               /* If cant_derive is already true, there is no point in
7404                  checking all of these conditions again.  */
7405               if (giv->cant_derive)
7406                 continue;
7407
7408               /* If this giv is conditionally set and we have passed a label,
7409                  it cannot derive anything.  */
7410               if (LABEL_P (p) && ! giv->always_computable)
7411                 giv->cant_derive = 1;
7412
7413               /* Skip givs that have mult_val == 0, since
7414                  they are really invariants.  Also skip those that are
7415                  replaceable, since we know their lifetime doesn't contain
7416                  any biv update.  */
7417               else if (giv->mult_val == const0_rtx || giv->replaceable)
7418                 continue;
7419
7420               /* The only way we can allow this giv to derive another
7421                  is if this is a biv increment and we can form the product
7422                  of biv->add_val and giv->mult_val.  In this case, we will
7423                  be able to compute a compensation.  */
7424               else if (biv->insn == p)
7425                 {
7426                   rtx ext_val_dummy;
7427
7428                   tem = 0;
7429                   if (biv->mult_val == const1_rtx)
7430                     tem = simplify_giv_expr (loop,
7431                                              gen_rtx_MULT (giv->mode,
7432                                                            biv->add_val,
7433                                                            giv->mult_val),
7434                                              &ext_val_dummy, &dummy);
7435
7436                   if (tem && giv->derive_adjustment)
7437                     tem = simplify_giv_expr
7438                       (loop,
7439                        gen_rtx_PLUS (giv->mode, tem, giv->derive_adjustment),
7440                        &ext_val_dummy, &dummy);
7441
7442                   if (tem)
7443                     giv->derive_adjustment = tem;
7444                   else
7445                     giv->cant_derive = 1;
7446                 }
7447               else if ((LABEL_P (p) && ! biv->always_computable)
7448                        || (JUMP_P (p) && biv->maybe_multiple))
7449                 giv->cant_derive = 1;
7450             }
7451         }
7452 }
7453 \f
7454 /* Check whether an insn is an increment legitimate for a basic induction var.
7455    X is the source of insn P, or a part of it.
7456    MODE is the mode in which X should be interpreted.
7457
7458    DEST_REG is the putative biv, also the destination of the insn.
7459    We accept patterns of these forms:
7460      REG = REG + INVARIANT (includes REG = REG - CONSTANT)
7461      REG = INVARIANT + REG
7462
7463    If X is suitable, we return 1, set *MULT_VAL to CONST1_RTX,
7464    store the additive term into *INC_VAL, and store the place where
7465    we found the additive term into *LOCATION.
7466
7467    If X is an assignment of an invariant into DEST_REG, we set
7468    *MULT_VAL to CONST0_RTX, and store the invariant into *INC_VAL.
7469
7470    We also want to detect a BIV when it corresponds to a variable
7471    whose mode was promoted.  In that case, an increment
7472    of the variable may be a PLUS that adds a SUBREG of that variable to
7473    an invariant and then sign- or zero-extends the result of the PLUS
7474    into the variable.
7475
7476    Most GIVs in such cases will be in the promoted mode, since that is the
7477    probably the natural computation mode (and almost certainly the mode
7478    used for addresses) on the machine.  So we view the pseudo-reg containing
7479    the variable as the BIV, as if it were simply incremented.
7480
7481    Note that treating the entire pseudo as a BIV will result in making
7482    simple increments to any GIVs based on it.  However, if the variable
7483    overflows in its declared mode but not its promoted mode, the result will
7484    be incorrect.  This is acceptable if the variable is signed, since
7485    overflows in such cases are undefined, but not if it is unsigned, since
7486    those overflows are defined.  So we only check for SIGN_EXTEND and
7487    not ZERO_EXTEND.
7488
7489    If we cannot find a biv, we return 0.  */
7490
7491 static int
7492 basic_induction_var (const struct loop *loop, rtx x, enum machine_mode mode,
7493                      rtx dest_reg, rtx p, rtx *inc_val, rtx *mult_val,
7494                      rtx **location)
7495 {
7496   enum rtx_code code;
7497   rtx *argp, arg;
7498   rtx insn, set = 0, last, inc;
7499
7500   code = GET_CODE (x);
7501   *location = NULL;
7502   switch (code)
7503     {
7504     case PLUS:
7505       if (rtx_equal_p (XEXP (x, 0), dest_reg)
7506           || (GET_CODE (XEXP (x, 0)) == SUBREG
7507               && SUBREG_PROMOTED_VAR_P (XEXP (x, 0))
7508               && SUBREG_REG (XEXP (x, 0)) == dest_reg))
7509         {
7510           argp = &XEXP (x, 1);
7511         }
7512       else if (rtx_equal_p (XEXP (x, 1), dest_reg)
7513                || (GET_CODE (XEXP (x, 1)) == SUBREG
7514                    && SUBREG_PROMOTED_VAR_P (XEXP (x, 1))
7515                    && SUBREG_REG (XEXP (x, 1)) == dest_reg))
7516         {
7517           argp = &XEXP (x, 0);
7518         }
7519       else
7520         return 0;
7521
7522       arg = *argp;
7523       if (loop_invariant_p (loop, arg) != 1)
7524         return 0;
7525
7526       /* convert_modes can emit new instructions, e.g. when arg is a loop
7527          invariant MEM and dest_reg has a different mode.
7528          These instructions would be emitted after the end of the function
7529          and then *inc_val would be an uninitialized pseudo.
7530          Detect this and bail in this case.
7531          Other alternatives to solve this can be introducing a convert_modes
7532          variant which is allowed to fail but not allowed to emit new
7533          instructions, emit these instructions before loop start and let
7534          it be garbage collected if *inc_val is never used or saving the
7535          *inc_val initialization sequence generated here and when *inc_val
7536          is going to be actually used, emit it at some suitable place.  */
7537       last = get_last_insn ();
7538       inc = convert_modes (GET_MODE (dest_reg), GET_MODE (x), arg, 0);
7539       if (get_last_insn () != last)
7540         {
7541           delete_insns_since (last);
7542           return 0;
7543         }
7544
7545       *inc_val = inc;
7546       *mult_val = const1_rtx;
7547       *location = argp;
7548       return 1;
7549
7550     case SUBREG:
7551       /* If what's inside the SUBREG is a BIV, then the SUBREG.  This will
7552          handle addition of promoted variables.
7553          ??? The comment at the start of this function is wrong: promoted
7554          variable increments don't look like it says they do.  */
7555       return basic_induction_var (loop, SUBREG_REG (x),
7556                                   GET_MODE (SUBREG_REG (x)),
7557                                   dest_reg, p, inc_val, mult_val, location);
7558
7559     case REG:
7560       /* If this register is assigned in a previous insn, look at its
7561          source, but don't go outside the loop or past a label.  */
7562
7563       /* If this sets a register to itself, we would repeat any previous
7564          biv increment if we applied this strategy blindly.  */
7565       if (rtx_equal_p (dest_reg, x))
7566         return 0;
7567
7568       insn = p;
7569       while (1)
7570         {
7571           rtx dest;
7572           do
7573             {
7574               insn = PREV_INSN (insn);
7575             }
7576           while (insn && NOTE_P (insn)
7577                  && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG);
7578
7579           if (!insn)
7580             break;
7581           set = single_set (insn);
7582           if (set == 0)
7583             break;
7584           dest = SET_DEST (set);
7585           if (dest == x
7586               || (GET_CODE (dest) == SUBREG
7587                   && (GET_MODE_SIZE (GET_MODE (dest)) <= UNITS_PER_WORD)
7588                   && (GET_MODE_CLASS (GET_MODE (dest)) == MODE_INT)
7589                   && SUBREG_REG (dest) == x))
7590             return basic_induction_var (loop, SET_SRC (set),
7591                                         (GET_MODE (SET_SRC (set)) == VOIDmode
7592                                          ? GET_MODE (x)
7593                                          : GET_MODE (SET_SRC (set))),
7594                                         dest_reg, insn,
7595                                         inc_val, mult_val, location);
7596
7597           while (GET_CODE (dest) == SUBREG
7598                  || GET_CODE (dest) == ZERO_EXTRACT
7599                  || GET_CODE (dest) == STRICT_LOW_PART)
7600             dest = XEXP (dest, 0);
7601           if (dest == x)
7602             break;
7603         }
7604       /* Fall through.  */
7605
7606       /* Can accept constant setting of biv only when inside inner most loop.
7607          Otherwise, a biv of an inner loop may be incorrectly recognized
7608          as a biv of the outer loop,
7609          causing code to be moved INTO the inner loop.  */
7610     case MEM:
7611       if (loop_invariant_p (loop, x) != 1)
7612         return 0;
7613     case CONST_INT:
7614     case SYMBOL_REF:
7615     case CONST:
7616       /* convert_modes aborts if we try to convert to or from CCmode, so just
7617          exclude that case.  It is very unlikely that a condition code value
7618          would be a useful iterator anyways.  convert_modes aborts if we try to
7619          convert a float mode to non-float or vice versa too.  */
7620       if (loop->level == 1
7621           && GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (dest_reg))
7622           && GET_MODE_CLASS (mode) != MODE_CC)
7623         {
7624           /* Possible bug here?  Perhaps we don't know the mode of X.  */
7625           last = get_last_insn ();
7626           inc = convert_modes (GET_MODE (dest_reg), mode, x, 0);
7627           if (get_last_insn () != last)
7628             {
7629               delete_insns_since (last);
7630               return 0;
7631             }
7632
7633           *inc_val = inc;
7634           *mult_val = const0_rtx;
7635           return 1;
7636         }
7637       else
7638         return 0;
7639
7640     case SIGN_EXTEND:
7641       /* Ignore this BIV if signed arithmetic overflow is defined.  */
7642       if (flag_wrapv)
7643         return 0;
7644       return basic_induction_var (loop, XEXP (x, 0), GET_MODE (XEXP (x, 0)),
7645                                   dest_reg, p, inc_val, mult_val, location);
7646
7647     case ASHIFTRT:
7648       /* Similar, since this can be a sign extension.  */
7649       for (insn = PREV_INSN (p);
7650            (insn && NOTE_P (insn)
7651             && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG);
7652            insn = PREV_INSN (insn))
7653         ;
7654
7655       if (insn)
7656         set = single_set (insn);
7657
7658       if (! rtx_equal_p (dest_reg, XEXP (x, 0))
7659           && set && SET_DEST (set) == XEXP (x, 0)
7660           && GET_CODE (XEXP (x, 1)) == CONST_INT
7661           && INTVAL (XEXP (x, 1)) >= 0
7662           && GET_CODE (SET_SRC (set)) == ASHIFT
7663           && XEXP (x, 1) == XEXP (SET_SRC (set), 1))
7664         return basic_induction_var (loop, XEXP (SET_SRC (set), 0),
7665                                     GET_MODE (XEXP (x, 0)),
7666                                     dest_reg, insn, inc_val, mult_val,
7667                                     location);
7668       return 0;
7669
7670     default:
7671       return 0;
7672     }
7673 }
7674 \f
7675 /* A general induction variable (giv) is any quantity that is a linear
7676    function   of a basic induction variable,
7677    i.e. giv = biv * mult_val + add_val.
7678    The coefficients can be any loop invariant quantity.
7679    A giv need not be computed directly from the biv;
7680    it can be computed by way of other givs.  */
7681
7682 /* Determine whether X computes a giv.
7683    If it does, return a nonzero value
7684      which is the benefit from eliminating the computation of X;
7685    set *SRC_REG to the register of the biv that it is computed from;
7686    set *ADD_VAL and *MULT_VAL to the coefficients,
7687      such that the value of X is biv * mult + add;  */
7688
7689 static int
7690 general_induction_var (const struct loop *loop, rtx x, rtx *src_reg,
7691                        rtx *add_val, rtx *mult_val, rtx *ext_val,
7692                        int is_addr, int *pbenefit,
7693                        enum machine_mode addr_mode)
7694 {
7695   struct loop_ivs *ivs = LOOP_IVS (loop);
7696   rtx orig_x = x;
7697
7698   /* If this is an invariant, forget it, it isn't a giv.  */
7699   if (loop_invariant_p (loop, x) == 1)
7700     return 0;
7701
7702   *pbenefit = 0;
7703   *ext_val = NULL_RTX;
7704   x = simplify_giv_expr (loop, x, ext_val, pbenefit);
7705   if (x == 0)
7706     return 0;
7707
7708   switch (GET_CODE (x))
7709     {
7710     case USE:
7711     case CONST_INT:
7712       /* Since this is now an invariant and wasn't before, it must be a giv
7713          with MULT_VAL == 0.  It doesn't matter which BIV we associate this
7714          with.  */
7715       *src_reg = ivs->list->biv->dest_reg;
7716       *mult_val = const0_rtx;
7717       *add_val = x;
7718       break;
7719
7720     case REG:
7721       /* This is equivalent to a BIV.  */
7722       *src_reg = x;
7723       *mult_val = const1_rtx;
7724       *add_val = const0_rtx;
7725       break;
7726
7727     case PLUS:
7728       /* Either (plus (biv) (invar)) or
7729          (plus (mult (biv) (invar_1)) (invar_2)).  */
7730       if (GET_CODE (XEXP (x, 0)) == MULT)
7731         {
7732           *src_reg = XEXP (XEXP (x, 0), 0);
7733           *mult_val = XEXP (XEXP (x, 0), 1);
7734         }
7735       else
7736         {
7737           *src_reg = XEXP (x, 0);
7738           *mult_val = const1_rtx;
7739         }
7740       *add_val = XEXP (x, 1);
7741       break;
7742
7743     case MULT:
7744       /* ADD_VAL is zero.  */
7745       *src_reg = XEXP (x, 0);
7746       *mult_val = XEXP (x, 1);
7747       *add_val = const0_rtx;
7748       break;
7749
7750     default:
7751       abort ();
7752     }
7753
7754   /* Remove any enclosing USE from ADD_VAL and MULT_VAL (there will be
7755      unless they are CONST_INT).  */
7756   if (GET_CODE (*add_val) == USE)
7757     *add_val = XEXP (*add_val, 0);
7758   if (GET_CODE (*mult_val) == USE)
7759     *mult_val = XEXP (*mult_val, 0);
7760
7761   if (is_addr)
7762     *pbenefit += address_cost (orig_x, addr_mode) - reg_address_cost;
7763   else
7764     *pbenefit += rtx_cost (orig_x, SET);
7765
7766   /* Always return true if this is a giv so it will be detected as such,
7767      even if the benefit is zero or negative.  This allows elimination
7768      of bivs that might otherwise not be eliminated.  */
7769   return 1;
7770 }
7771 \f
7772 /* Given an expression, X, try to form it as a linear function of a biv.
7773    We will canonicalize it to be of the form
7774         (plus (mult (BIV) (invar_1))
7775               (invar_2))
7776    with possible degeneracies.
7777
7778    The invariant expressions must each be of a form that can be used as a
7779    machine operand.  We surround then with a USE rtx (a hack, but localized
7780    and certainly unambiguous!) if not a CONST_INT for simplicity in this
7781    routine; it is the caller's responsibility to strip them.
7782
7783    If no such canonicalization is possible (i.e., two biv's are used or an
7784    expression that is neither invariant nor a biv or giv), this routine
7785    returns 0.
7786
7787    For a nonzero return, the result will have a code of CONST_INT, USE,
7788    REG (for a BIV), PLUS, or MULT.  No other codes will occur.
7789
7790    *BENEFIT will be incremented by the benefit of any sub-giv encountered.  */
7791
7792 static rtx sge_plus (enum machine_mode, rtx, rtx);
7793 static rtx sge_plus_constant (rtx, rtx);
7794
7795 static rtx
7796 simplify_giv_expr (const struct loop *loop, rtx x, rtx *ext_val, int *benefit)
7797 {
7798   struct loop_ivs *ivs = LOOP_IVS (loop);
7799   struct loop_regs *regs = LOOP_REGS (loop);
7800   enum machine_mode mode = GET_MODE (x);
7801   rtx arg0, arg1;
7802   rtx tem;
7803
7804   /* If this is not an integer mode, or if we cannot do arithmetic in this
7805      mode, this can't be a giv.  */
7806   if (mode != VOIDmode
7807       && (GET_MODE_CLASS (mode) != MODE_INT
7808           || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT))
7809     return NULL_RTX;
7810
7811   switch (GET_CODE (x))
7812     {
7813     case PLUS:
7814       arg0 = simplify_giv_expr (loop, XEXP (x, 0), ext_val, benefit);
7815       arg1 = simplify_giv_expr (loop, XEXP (x, 1), ext_val, benefit);
7816       if (arg0 == 0 || arg1 == 0)
7817         return NULL_RTX;
7818
7819       /* Put constant last, CONST_INT last if both constant.  */
7820       if ((GET_CODE (arg0) == USE
7821            || GET_CODE (arg0) == CONST_INT)
7822           && ! ((GET_CODE (arg0) == USE
7823                  && GET_CODE (arg1) == USE)
7824                 || GET_CODE (arg1) == CONST_INT))
7825         tem = arg0, arg0 = arg1, arg1 = tem;
7826
7827       /* Handle addition of zero, then addition of an invariant.  */
7828       if (arg1 == const0_rtx)
7829         return arg0;
7830       else if (GET_CODE (arg1) == CONST_INT || GET_CODE (arg1) == USE)
7831         switch (GET_CODE (arg0))
7832           {
7833           case CONST_INT:
7834           case USE:
7835             /* Adding two invariants must result in an invariant, so enclose
7836                addition operation inside a USE and return it.  */
7837             if (GET_CODE (arg0) == USE)
7838               arg0 = XEXP (arg0, 0);
7839             if (GET_CODE (arg1) == USE)
7840               arg1 = XEXP (arg1, 0);
7841
7842             if (GET_CODE (arg0) == CONST_INT)
7843               tem = arg0, arg0 = arg1, arg1 = tem;
7844             if (GET_CODE (arg1) == CONST_INT)
7845               tem = sge_plus_constant (arg0, arg1);
7846             else
7847               tem = sge_plus (mode, arg0, arg1);
7848
7849             if (GET_CODE (tem) != CONST_INT)
7850               tem = gen_rtx_USE (mode, tem);
7851             return tem;
7852
7853           case REG:
7854           case MULT:
7855             /* biv + invar or mult + invar.  Return sum.  */
7856             return gen_rtx_PLUS (mode, arg0, arg1);
7857
7858           case PLUS:
7859             /* (a + invar_1) + invar_2.  Associate.  */
7860             return
7861               simplify_giv_expr (loop,
7862                                  gen_rtx_PLUS (mode,
7863                                                XEXP (arg0, 0),
7864                                                gen_rtx_PLUS (mode,
7865                                                              XEXP (arg0, 1),
7866                                                              arg1)),
7867                                  ext_val, benefit);
7868
7869           default:
7870             abort ();
7871           }
7872
7873       /* Each argument must be either REG, PLUS, or MULT.  Convert REG to
7874          MULT to reduce cases.  */
7875       if (REG_P (arg0))
7876         arg0 = gen_rtx_MULT (mode, arg0, const1_rtx);
7877       if (REG_P (arg1))
7878         arg1 = gen_rtx_MULT (mode, arg1, const1_rtx);
7879
7880       /* Now have PLUS + PLUS, PLUS + MULT, MULT + PLUS, or MULT + MULT.
7881          Put a MULT first, leaving PLUS + PLUS, MULT + PLUS, or MULT + MULT.
7882          Recurse to associate the second PLUS.  */
7883       if (GET_CODE (arg1) == MULT)
7884         tem = arg0, arg0 = arg1, arg1 = tem;
7885
7886       if (GET_CODE (arg1) == PLUS)
7887         return
7888           simplify_giv_expr (loop,
7889                              gen_rtx_PLUS (mode,
7890                                            gen_rtx_PLUS (mode, arg0,
7891                                                          XEXP (arg1, 0)),
7892                                            XEXP (arg1, 1)),
7893                              ext_val, benefit);
7894
7895       /* Now must have MULT + MULT.  Distribute if same biv, else not giv.  */
7896       if (GET_CODE (arg0) != MULT || GET_CODE (arg1) != MULT)
7897         return NULL_RTX;
7898
7899       if (!rtx_equal_p (arg0, arg1))
7900         return NULL_RTX;
7901
7902       return simplify_giv_expr (loop,
7903                                 gen_rtx_MULT (mode,
7904                                               XEXP (arg0, 0),
7905                                               gen_rtx_PLUS (mode,
7906                                                             XEXP (arg0, 1),
7907                                                             XEXP (arg1, 1))),
7908                                 ext_val, benefit);
7909
7910     case MINUS:
7911       /* Handle "a - b" as "a + b * (-1)".  */
7912       return simplify_giv_expr (loop,
7913                                 gen_rtx_PLUS (mode,
7914                                               XEXP (x, 0),
7915                                               gen_rtx_MULT (mode,
7916                                                             XEXP (x, 1),
7917                                                             constm1_rtx)),
7918                                 ext_val, benefit);
7919
7920     case MULT:
7921       arg0 = simplify_giv_expr (loop, XEXP (x, 0), ext_val, benefit);
7922       arg1 = simplify_giv_expr (loop, XEXP (x, 1), ext_val, benefit);
7923       if (arg0 == 0 || arg1 == 0)
7924         return NULL_RTX;
7925
7926       /* Put constant last, CONST_INT last if both constant.  */
7927       if ((GET_CODE (arg0) == USE || GET_CODE (arg0) == CONST_INT)
7928           && GET_CODE (arg1) != CONST_INT)
7929         tem = arg0, arg0 = arg1, arg1 = tem;
7930
7931       /* If second argument is not now constant, not giv.  */
7932       if (GET_CODE (arg1) != USE && GET_CODE (arg1) != CONST_INT)
7933         return NULL_RTX;
7934
7935       /* Handle multiply by 0 or 1.  */
7936       if (arg1 == const0_rtx)
7937         return const0_rtx;
7938
7939       else if (arg1 == const1_rtx)
7940         return arg0;
7941
7942       switch (GET_CODE (arg0))
7943         {
7944         case REG:
7945           /* biv * invar.  Done.  */
7946           return gen_rtx_MULT (mode, arg0, arg1);
7947
7948         case CONST_INT:
7949           /* Product of two constants.  */
7950           return GEN_INT (INTVAL (arg0) * INTVAL (arg1));
7951
7952         case USE:
7953           /* invar * invar is a giv, but attempt to simplify it somehow.  */
7954           if (GET_CODE (arg1) != CONST_INT)
7955             return NULL_RTX;
7956
7957           arg0 = XEXP (arg0, 0);
7958           if (GET_CODE (arg0) == MULT)
7959             {
7960               /* (invar_0 * invar_1) * invar_2.  Associate.  */
7961               return simplify_giv_expr (loop,
7962                                         gen_rtx_MULT (mode,
7963                                                       XEXP (arg0, 0),
7964                                                       gen_rtx_MULT (mode,
7965                                                                     XEXP (arg0,
7966                                                                           1),
7967                                                                     arg1)),
7968                                         ext_val, benefit);
7969             }
7970           /* Propagate the MULT expressions to the innermost nodes.  */
7971           else if (GET_CODE (arg0) == PLUS)
7972             {
7973               /* (invar_0 + invar_1) * invar_2.  Distribute.  */
7974               return simplify_giv_expr (loop,
7975                                         gen_rtx_PLUS (mode,
7976                                                       gen_rtx_MULT (mode,
7977                                                                     XEXP (arg0,
7978                                                                           0),
7979                                                                     arg1),
7980                                                       gen_rtx_MULT (mode,
7981                                                                     XEXP (arg0,
7982                                                                           1),
7983                                                                     arg1)),
7984                                         ext_val, benefit);
7985             }
7986           return gen_rtx_USE (mode, gen_rtx_MULT (mode, arg0, arg1));
7987
7988         case MULT:
7989           /* (a * invar_1) * invar_2.  Associate.  */
7990           return simplify_giv_expr (loop,
7991                                     gen_rtx_MULT (mode,
7992                                                   XEXP (arg0, 0),
7993                                                   gen_rtx_MULT (mode,
7994                                                                 XEXP (arg0, 1),
7995                                                                 arg1)),
7996                                     ext_val, benefit);
7997
7998         case PLUS:
7999           /* (a + invar_1) * invar_2.  Distribute.  */
8000           return simplify_giv_expr (loop,
8001                                     gen_rtx_PLUS (mode,
8002                                                   gen_rtx_MULT (mode,
8003                                                                 XEXP (arg0, 0),
8004                                                                 arg1),
8005                                                   gen_rtx_MULT (mode,
8006                                                                 XEXP (arg0, 1),
8007                                                                 arg1)),
8008                                     ext_val, benefit);
8009
8010         default:
8011           abort ();
8012         }
8013
8014     case ASHIFT:
8015       /* Shift by constant is multiply by power of two.  */
8016       if (GET_CODE (XEXP (x, 1)) != CONST_INT)
8017         return 0;
8018
8019       return
8020         simplify_giv_expr (loop,
8021                            gen_rtx_MULT (mode,
8022                                          XEXP (x, 0),
8023                                          GEN_INT ((HOST_WIDE_INT) 1
8024                                                   << INTVAL (XEXP (x, 1)))),
8025                            ext_val, benefit);
8026
8027     case NEG:
8028       /* "-a" is "a * (-1)" */
8029       return simplify_giv_expr (loop,
8030                                 gen_rtx_MULT (mode, XEXP (x, 0), constm1_rtx),
8031                                 ext_val, benefit);
8032
8033     case NOT:
8034       /* "~a" is "-a - 1". Silly, but easy.  */
8035       return simplify_giv_expr (loop,
8036                                 gen_rtx_MINUS (mode,
8037                                                gen_rtx_NEG (mode, XEXP (x, 0)),
8038                                                const1_rtx),
8039                                 ext_val, benefit);
8040
8041     case USE:
8042       /* Already in proper form for invariant.  */
8043       return x;
8044
8045     case SIGN_EXTEND:
8046     case ZERO_EXTEND:
8047     case TRUNCATE:
8048       /* Conditionally recognize extensions of simple IVs.  After we've
8049          computed loop traversal counts and verified the range of the
8050          source IV, we'll reevaluate this as a GIV.  */
8051       if (*ext_val == NULL_RTX)
8052         {
8053           arg0 = simplify_giv_expr (loop, XEXP (x, 0), ext_val, benefit);
8054           if (arg0 && *ext_val == NULL_RTX && REG_P (arg0))
8055             {
8056               *ext_val = gen_rtx_fmt_e (GET_CODE (x), mode, arg0);
8057               return arg0;
8058             }
8059         }
8060       goto do_default;
8061
8062     case REG:
8063       /* If this is a new register, we can't deal with it.  */
8064       if (REGNO (x) >= max_reg_before_loop)
8065         return 0;
8066
8067       /* Check for biv or giv.  */
8068       switch (REG_IV_TYPE (ivs, REGNO (x)))
8069         {
8070         case BASIC_INDUCT:
8071           return x;
8072         case GENERAL_INDUCT:
8073           {
8074             struct induction *v = REG_IV_INFO (ivs, REGNO (x));
8075
8076             /* Form expression from giv and add benefit.  Ensure this giv
8077                can derive another and subtract any needed adjustment if so.  */
8078
8079             /* Increasing the benefit here is risky.  The only case in which it
8080                is arguably correct is if this is the only use of V.  In other
8081                cases, this will artificially inflate the benefit of the current
8082                giv, and lead to suboptimal code.  Thus, it is disabled, since
8083                potentially not reducing an only marginally beneficial giv is
8084                less harmful than reducing many givs that are not really
8085                beneficial.  */
8086             {
8087               rtx single_use = regs->array[REGNO (x)].single_usage;
8088               if (single_use && single_use != const0_rtx)
8089                 *benefit += v->benefit;
8090             }
8091
8092             if (v->cant_derive)
8093               return 0;
8094
8095             tem = gen_rtx_PLUS (mode, gen_rtx_MULT (mode,
8096                                                     v->src_reg, v->mult_val),
8097                                 v->add_val);
8098
8099             if (v->derive_adjustment)
8100               tem = gen_rtx_MINUS (mode, tem, v->derive_adjustment);
8101             arg0 = simplify_giv_expr (loop, tem, ext_val, benefit);
8102             if (*ext_val)
8103               {
8104                 if (!v->ext_dependent)
8105                   return arg0;
8106               }
8107             else
8108               {
8109                 *ext_val = v->ext_dependent;
8110                 return arg0;
8111               }
8112             return 0;
8113           }
8114
8115         default:
8116         do_default:
8117           /* If it isn't an induction variable, and it is invariant, we
8118              may be able to simplify things further by looking through
8119              the bits we just moved outside the loop.  */
8120           if (loop_invariant_p (loop, x) == 1)
8121             {
8122               struct movable *m;
8123               struct loop_movables *movables = LOOP_MOVABLES (loop);
8124
8125               for (m = movables->head; m; m = m->next)
8126                 if (rtx_equal_p (x, m->set_dest))
8127                   {
8128                     /* Ok, we found a match.  Substitute and simplify.  */
8129
8130                     /* If we match another movable, we must use that, as
8131                        this one is going away.  */
8132                     if (m->match)
8133                       return simplify_giv_expr (loop, m->match->set_dest,
8134                                                 ext_val, benefit);
8135
8136                     /* If consec is nonzero, this is a member of a group of
8137                        instructions that were moved together.  We handle this
8138                        case only to the point of seeking to the last insn and
8139                        looking for a REG_EQUAL.  Fail if we don't find one.  */
8140                     if (m->consec != 0)
8141                       {
8142                         int i = m->consec;
8143                         tem = m->insn;
8144                         do
8145                           {
8146                             tem = NEXT_INSN (tem);
8147                           }
8148                         while (--i > 0);
8149
8150                         tem = find_reg_note (tem, REG_EQUAL, NULL_RTX);
8151                         if (tem)
8152                           tem = XEXP (tem, 0);
8153                       }
8154                     else
8155                       {
8156                         tem = single_set (m->insn);
8157                         if (tem)
8158                           tem = SET_SRC (tem);
8159                       }
8160
8161                     if (tem)
8162                       {
8163                         /* What we are most interested in is pointer
8164                            arithmetic on invariants -- only take
8165                            patterns we may be able to do something with.  */
8166                         if (GET_CODE (tem) == PLUS
8167                             || GET_CODE (tem) == MULT
8168                             || GET_CODE (tem) == ASHIFT
8169                             || GET_CODE (tem) == CONST_INT
8170                             || GET_CODE (tem) == SYMBOL_REF)
8171                           {
8172                             tem = simplify_giv_expr (loop, tem, ext_val,
8173                                                      benefit);
8174                             if (tem)
8175                               return tem;
8176                           }
8177                         else if (GET_CODE (tem) == CONST
8178                                  && GET_CODE (XEXP (tem, 0)) == PLUS
8179                                  && GET_CODE (XEXP (XEXP (tem, 0), 0)) == SYMBOL_REF
8180                                  && GET_CODE (XEXP (XEXP (tem, 0), 1)) == CONST_INT)
8181                           {
8182                             tem = simplify_giv_expr (loop, XEXP (tem, 0),
8183                                                      ext_val, benefit);
8184                             if (tem)
8185                               return tem;
8186                           }
8187                       }
8188                     break;
8189                   }
8190             }
8191           break;
8192         }
8193
8194       /* Fall through to general case.  */
8195     default:
8196       /* If invariant, return as USE (unless CONST_INT).
8197          Otherwise, not giv.  */
8198       if (GET_CODE (x) == USE)
8199         x = XEXP (x, 0);
8200
8201       if (loop_invariant_p (loop, x) == 1)
8202         {
8203           if (GET_CODE (x) == CONST_INT)
8204             return x;
8205           if (GET_CODE (x) == CONST
8206               && GET_CODE (XEXP (x, 0)) == PLUS
8207               && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
8208               && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)
8209             x = XEXP (x, 0);
8210           return gen_rtx_USE (mode, x);
8211         }
8212       else
8213         return 0;
8214     }
8215 }
8216
8217 /* This routine folds invariants such that there is only ever one
8218    CONST_INT in the summation.  It is only used by simplify_giv_expr.  */
8219
8220 static rtx
8221 sge_plus_constant (rtx x, rtx c)
8222 {
8223   if (GET_CODE (x) == CONST_INT)
8224     return GEN_INT (INTVAL (x) + INTVAL (c));
8225   else if (GET_CODE (x) != PLUS)
8226     return gen_rtx_PLUS (GET_MODE (x), x, c);
8227   else if (GET_CODE (XEXP (x, 1)) == CONST_INT)
8228     {
8229       return gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
8230                            GEN_INT (INTVAL (XEXP (x, 1)) + INTVAL (c)));
8231     }
8232   else if (GET_CODE (XEXP (x, 0)) == PLUS
8233            || GET_CODE (XEXP (x, 1)) != PLUS)
8234     {
8235       return gen_rtx_PLUS (GET_MODE (x),
8236                            sge_plus_constant (XEXP (x, 0), c), XEXP (x, 1));
8237     }
8238   else
8239     {
8240       return gen_rtx_PLUS (GET_MODE (x),
8241                            sge_plus_constant (XEXP (x, 1), c), XEXP (x, 0));
8242     }
8243 }
8244
8245 static rtx
8246 sge_plus (enum machine_mode mode, rtx x, rtx y)
8247 {
8248   while (GET_CODE (y) == PLUS)
8249     {
8250       rtx a = XEXP (y, 0);
8251       if (GET_CODE (a) == CONST_INT)
8252         x = sge_plus_constant (x, a);
8253       else
8254         x = gen_rtx_PLUS (mode, x, a);
8255       y = XEXP (y, 1);
8256     }
8257   if (GET_CODE (y) == CONST_INT)
8258     x = sge_plus_constant (x, y);
8259   else
8260     x = gen_rtx_PLUS (mode, x, y);
8261   return x;
8262 }
8263 \f
8264 /* Help detect a giv that is calculated by several consecutive insns;
8265    for example,
8266       giv = biv * M
8267       giv = giv + A
8268    The caller has already identified the first insn P as having a giv as dest;
8269    we check that all other insns that set the same register follow
8270    immediately after P, that they alter nothing else,
8271    and that the result of the last is still a giv.
8272
8273    The value is 0 if the reg set in P is not really a giv.
8274    Otherwise, the value is the amount gained by eliminating
8275    all the consecutive insns that compute the value.
8276
8277    FIRST_BENEFIT is the amount gained by eliminating the first insn, P.
8278    SRC_REG is the reg of the biv; DEST_REG is the reg of the giv.
8279
8280    The coefficients of the ultimate giv value are stored in
8281    *MULT_VAL and *ADD_VAL.  */
8282
8283 static int
8284 consec_sets_giv (const struct loop *loop, int first_benefit, rtx p,
8285                  rtx src_reg, rtx dest_reg, rtx *add_val, rtx *mult_val,
8286                  rtx *ext_val, rtx *last_consec_insn)
8287 {
8288   struct loop_ivs *ivs = LOOP_IVS (loop);
8289   struct loop_regs *regs = LOOP_REGS (loop);
8290   int count;
8291   enum rtx_code code;
8292   int benefit;
8293   rtx temp;
8294   rtx set;
8295
8296   /* Indicate that this is a giv so that we can update the value produced in
8297      each insn of the multi-insn sequence.
8298
8299      This induction structure will be used only by the call to
8300      general_induction_var below, so we can allocate it on our stack.
8301      If this is a giv, our caller will replace the induct var entry with
8302      a new induction structure.  */
8303   struct induction *v;
8304
8305   if (REG_IV_TYPE (ivs, REGNO (dest_reg)) != UNKNOWN_INDUCT)
8306     return 0;
8307
8308   v = alloca (sizeof (struct induction));
8309   v->src_reg = src_reg;
8310   v->mult_val = *mult_val;
8311   v->add_val = *add_val;
8312   v->benefit = first_benefit;
8313   v->cant_derive = 0;
8314   v->derive_adjustment = 0;
8315   v->ext_dependent = NULL_RTX;
8316
8317   REG_IV_TYPE (ivs, REGNO (dest_reg)) = GENERAL_INDUCT;
8318   REG_IV_INFO (ivs, REGNO (dest_reg)) = v;
8319
8320   count = regs->array[REGNO (dest_reg)].n_times_set - 1;
8321
8322   while (count > 0)
8323     {
8324       p = NEXT_INSN (p);
8325       code = GET_CODE (p);
8326
8327       /* If libcall, skip to end of call sequence.  */
8328       if (code == INSN && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
8329         p = XEXP (temp, 0);
8330
8331       if (code == INSN
8332           && (set = single_set (p))
8333           && REG_P (SET_DEST (set))
8334           && SET_DEST (set) == dest_reg
8335           && (general_induction_var (loop, SET_SRC (set), &src_reg,
8336                                      add_val, mult_val, ext_val, 0,
8337                                      &benefit, VOIDmode)
8338               /* Giv created by equivalent expression.  */
8339               || ((temp = find_reg_note (p, REG_EQUAL, NULL_RTX))
8340                   && general_induction_var (loop, XEXP (temp, 0), &src_reg,
8341                                             add_val, mult_val, ext_val, 0,
8342                                             &benefit, VOIDmode)))
8343           && src_reg == v->src_reg)
8344         {
8345           if (find_reg_note (p, REG_RETVAL, NULL_RTX))
8346             benefit += libcall_benefit (p);
8347
8348           count--;
8349           v->mult_val = *mult_val;
8350           v->add_val = *add_val;
8351           v->benefit += benefit;
8352         }
8353       else if (code != NOTE)
8354         {
8355           /* Allow insns that set something other than this giv to a
8356              constant.  Such insns are needed on machines which cannot
8357              include long constants and should not disqualify a giv.  */
8358           if (code == INSN
8359               && (set = single_set (p))
8360               && SET_DEST (set) != dest_reg
8361               && CONSTANT_P (SET_SRC (set)))
8362             continue;
8363
8364           REG_IV_TYPE (ivs, REGNO (dest_reg)) = UNKNOWN_INDUCT;
8365           return 0;
8366         }
8367     }
8368
8369   REG_IV_TYPE (ivs, REGNO (dest_reg)) = UNKNOWN_INDUCT;
8370   *last_consec_insn = p;
8371   return v->benefit;
8372 }
8373 \f
8374 /* Return an rtx, if any, that expresses giv G2 as a function of the register
8375    represented by G1.  If no such expression can be found, or it is clear that
8376    it cannot possibly be a valid address, 0 is returned.
8377
8378    To perform the computation, we note that
8379         G1 = x * v + a          and
8380         G2 = y * v + b
8381    where `v' is the biv.
8382
8383    So G2 = (y/b) * G1 + (b - a*y/x).
8384
8385    Note that MULT = y/x.
8386
8387    Update: A and B are now allowed to be additive expressions such that
8388    B contains all variables in A.  That is, computing B-A will not require
8389    subtracting variables.  */
8390
8391 static rtx
8392 express_from_1 (rtx a, rtx b, rtx mult)
8393 {
8394   /* If MULT is zero, then A*MULT is zero, and our expression is B.  */
8395
8396   if (mult == const0_rtx)
8397     return b;
8398
8399   /* If MULT is not 1, we cannot handle A with non-constants, since we
8400      would then be required to subtract multiples of the registers in A.
8401      This is theoretically possible, and may even apply to some Fortran
8402      constructs, but it is a lot of work and we do not attempt it here.  */
8403
8404   if (mult != const1_rtx && GET_CODE (a) != CONST_INT)
8405     return NULL_RTX;
8406
8407   /* In general these structures are sorted top to bottom (down the PLUS
8408      chain), but not left to right across the PLUS.  If B is a higher
8409      order giv than A, we can strip one level and recurse.  If A is higher
8410      order, we'll eventually bail out, but won't know that until the end.
8411      If they are the same, we'll strip one level around this loop.  */
8412
8413   while (GET_CODE (a) == PLUS && GET_CODE (b) == PLUS)
8414     {
8415       rtx ra, rb, oa, ob, tmp;
8416
8417       ra = XEXP (a, 0), oa = XEXP (a, 1);
8418       if (GET_CODE (ra) == PLUS)
8419         tmp = ra, ra = oa, oa = tmp;
8420
8421       rb = XEXP (b, 0), ob = XEXP (b, 1);
8422       if (GET_CODE (rb) == PLUS)
8423         tmp = rb, rb = ob, ob = tmp;
8424
8425       if (rtx_equal_p (ra, rb))
8426         /* We matched: remove one reg completely.  */
8427         a = oa, b = ob;
8428       else if (GET_CODE (ob) != PLUS && rtx_equal_p (ra, ob))
8429         /* An alternate match.  */
8430         a = oa, b = rb;
8431       else if (GET_CODE (oa) != PLUS && rtx_equal_p (oa, rb))
8432         /* An alternate match.  */
8433         a = ra, b = ob;
8434       else
8435         {
8436           /* Indicates an extra register in B.  Strip one level from B and
8437              recurse, hoping B was the higher order expression.  */
8438           ob = express_from_1 (a, ob, mult);
8439           if (ob == NULL_RTX)
8440             return NULL_RTX;
8441           return gen_rtx_PLUS (GET_MODE (b), rb, ob);
8442         }
8443     }
8444
8445   /* Here we are at the last level of A, go through the cases hoping to
8446      get rid of everything but a constant.  */
8447
8448   if (GET_CODE (a) == PLUS)
8449     {
8450       rtx ra, oa;
8451
8452       ra = XEXP (a, 0), oa = XEXP (a, 1);
8453       if (rtx_equal_p (oa, b))
8454         oa = ra;
8455       else if (!rtx_equal_p (ra, b))
8456         return NULL_RTX;
8457
8458       if (GET_CODE (oa) != CONST_INT)
8459         return NULL_RTX;
8460
8461       return GEN_INT (-INTVAL (oa) * INTVAL (mult));
8462     }
8463   else if (GET_CODE (a) == CONST_INT)
8464     {
8465       return plus_constant (b, -INTVAL (a) * INTVAL (mult));
8466     }
8467   else if (CONSTANT_P (a))
8468     {
8469       enum machine_mode mode_a = GET_MODE (a);
8470       enum machine_mode mode_b = GET_MODE (b);
8471       enum machine_mode mode = mode_b == VOIDmode ? mode_a : mode_b;
8472       return simplify_gen_binary (MINUS, mode, b, a);
8473     }
8474   else if (GET_CODE (b) == PLUS)
8475     {
8476       if (rtx_equal_p (a, XEXP (b, 0)))
8477         return XEXP (b, 1);
8478       else if (rtx_equal_p (a, XEXP (b, 1)))
8479         return XEXP (b, 0);
8480       else
8481         return NULL_RTX;
8482     }
8483   else if (rtx_equal_p (a, b))
8484     return const0_rtx;
8485
8486   return NULL_RTX;
8487 }
8488
8489 static rtx
8490 express_from (struct induction *g1, struct induction *g2)
8491 {
8492   rtx mult, add;
8493
8494   /* The value that G1 will be multiplied by must be a constant integer.  Also,
8495      the only chance we have of getting a valid address is if b*c/a (see above
8496      for notation) is also an integer.  */
8497   if (GET_CODE (g1->mult_val) == CONST_INT
8498       && GET_CODE (g2->mult_val) == CONST_INT)
8499     {
8500       if (g1->mult_val == const0_rtx
8501           || (g1->mult_val == constm1_rtx
8502               && INTVAL (g2->mult_val)
8503                  == (HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1))
8504           || INTVAL (g2->mult_val) % INTVAL (g1->mult_val) != 0)
8505         return NULL_RTX;
8506       mult = GEN_INT (INTVAL (g2->mult_val) / INTVAL (g1->mult_val));
8507     }
8508   else if (rtx_equal_p (g1->mult_val, g2->mult_val))
8509     mult = const1_rtx;
8510   else
8511     {
8512       /* ??? Find out if the one is a multiple of the other?  */
8513       return NULL_RTX;
8514     }
8515
8516   add = express_from_1 (g1->add_val, g2->add_val, mult);
8517   if (add == NULL_RTX)
8518     {
8519       /* Failed.  If we've got a multiplication factor between G1 and G2,
8520          scale G1's addend and try again.  */
8521       if (INTVAL (mult) > 1)
8522         {
8523           rtx g1_add_val = g1->add_val;
8524           if (GET_CODE (g1_add_val) == MULT
8525               && GET_CODE (XEXP (g1_add_val, 1)) == CONST_INT)
8526             {
8527               HOST_WIDE_INT m;
8528               m = INTVAL (mult) * INTVAL (XEXP (g1_add_val, 1));
8529               g1_add_val = gen_rtx_MULT (GET_MODE (g1_add_val),
8530                                          XEXP (g1_add_val, 0), GEN_INT (m));
8531             }
8532           else
8533             {
8534               g1_add_val = gen_rtx_MULT (GET_MODE (g1_add_val), g1_add_val,
8535                                          mult);
8536             }
8537
8538           add = express_from_1 (g1_add_val, g2->add_val, const1_rtx);
8539         }
8540     }
8541   if (add == NULL_RTX)
8542     return NULL_RTX;
8543
8544   /* Form simplified final result.  */
8545   if (mult == const0_rtx)
8546     return add;
8547   else if (mult == const1_rtx)
8548     mult = g1->dest_reg;
8549   else
8550     mult = gen_rtx_MULT (g2->mode, g1->dest_reg, mult);
8551
8552   if (add == const0_rtx)
8553     return mult;
8554   else
8555     {
8556       if (GET_CODE (add) == PLUS
8557           && CONSTANT_P (XEXP (add, 1)))
8558         {
8559           rtx tem = XEXP (add, 1);
8560           mult = gen_rtx_PLUS (g2->mode, mult, XEXP (add, 0));
8561           add = tem;
8562         }
8563
8564       return gen_rtx_PLUS (g2->mode, mult, add);
8565     }
8566 }
8567 \f
8568 /* Return an rtx, if any, that expresses giv G2 as a function of the register
8569    represented by G1.  This indicates that G2 should be combined with G1 and
8570    that G2 can use (either directly or via an address expression) a register
8571    used to represent G1.  */
8572
8573 static rtx
8574 combine_givs_p (struct induction *g1, struct induction *g2)
8575 {
8576   rtx comb, ret;
8577
8578   /* With the introduction of ext dependent givs, we must care for modes.
8579      G2 must not use a wider mode than G1.  */
8580   if (GET_MODE_SIZE (g1->mode) < GET_MODE_SIZE (g2->mode))
8581     return NULL_RTX;
8582
8583   ret = comb = express_from (g1, g2);
8584   if (comb == NULL_RTX)
8585     return NULL_RTX;
8586   if (g1->mode != g2->mode)
8587     ret = gen_lowpart (g2->mode, comb);
8588
8589   /* If these givs are identical, they can be combined.  We use the results
8590      of express_from because the addends are not in a canonical form, so
8591      rtx_equal_p is a weaker test.  */
8592   /* But don't combine a DEST_REG giv with a DEST_ADDR giv; we want the
8593      combination to be the other way round.  */
8594   if (comb == g1->dest_reg
8595       && (g1->giv_type == DEST_REG || g2->giv_type == DEST_ADDR))
8596     {
8597       return ret;
8598     }
8599
8600   /* If G2 can be expressed as a function of G1 and that function is valid
8601      as an address and no more expensive than using a register for G2,
8602      the expression of G2 in terms of G1 can be used.  */
8603   if (ret != NULL_RTX
8604       && g2->giv_type == DEST_ADDR
8605       && memory_address_p (GET_MODE (g2->mem), ret))
8606     return ret;
8607
8608   return NULL_RTX;
8609 }
8610 \f
8611 /* Check each extension dependent giv in this class to see if its
8612    root biv is safe from wrapping in the interior mode, which would
8613    make the giv illegal.  */
8614
8615 static void
8616 check_ext_dependent_givs (const struct loop *loop, struct iv_class *bl)
8617 {
8618   struct loop_info *loop_info = LOOP_INFO (loop);
8619   int ze_ok = 0, se_ok = 0, info_ok = 0;
8620   enum machine_mode biv_mode = GET_MODE (bl->biv->src_reg);
8621   HOST_WIDE_INT start_val;
8622   unsigned HOST_WIDE_INT u_end_val = 0;
8623   unsigned HOST_WIDE_INT u_start_val = 0;
8624   rtx incr = pc_rtx;
8625   struct induction *v;
8626
8627   /* Make sure the iteration data is available.  We must have
8628      constants in order to be certain of no overflow.  */
8629   if (loop_info->n_iterations > 0
8630       && bl->initial_value
8631       && GET_CODE (bl->initial_value) == CONST_INT
8632       && (incr = biv_total_increment (bl))
8633       && GET_CODE (incr) == CONST_INT
8634       /* Make sure the host can represent the arithmetic.  */
8635       && HOST_BITS_PER_WIDE_INT >= GET_MODE_BITSIZE (biv_mode))
8636     {
8637       unsigned HOST_WIDE_INT abs_incr, total_incr;
8638       HOST_WIDE_INT s_end_val;
8639       int neg_incr;
8640
8641       info_ok = 1;
8642       start_val = INTVAL (bl->initial_value);
8643       u_start_val = start_val;
8644
8645       neg_incr = 0, abs_incr = INTVAL (incr);
8646       if (INTVAL (incr) < 0)
8647         neg_incr = 1, abs_incr = -abs_incr;
8648       total_incr = abs_incr * loop_info->n_iterations;
8649
8650       /* Check for host arithmetic overflow.  */
8651       if (total_incr / loop_info->n_iterations == abs_incr)
8652         {
8653           unsigned HOST_WIDE_INT u_max;
8654           HOST_WIDE_INT s_max;
8655
8656           u_end_val = start_val + (neg_incr ? -total_incr : total_incr);
8657           s_end_val = u_end_val;
8658           u_max = GET_MODE_MASK (biv_mode);
8659           s_max = u_max >> 1;
8660
8661           /* Check zero extension of biv ok.  */
8662           if (start_val >= 0
8663               /* Check for host arithmetic overflow.  */
8664               && (neg_incr
8665                   ? u_end_val < u_start_val
8666                   : u_end_val > u_start_val)
8667               /* Check for target arithmetic overflow.  */
8668               && (neg_incr
8669                   ? 1 /* taken care of with host overflow */
8670                   : u_end_val <= u_max))
8671             {
8672               ze_ok = 1;
8673             }
8674
8675           /* Check sign extension of biv ok.  */
8676           /* ??? While it is true that overflow with signed and pointer
8677              arithmetic is undefined, I fear too many programmers don't
8678              keep this fact in mind -- myself included on occasion.
8679              So leave alone with the signed overflow optimizations.  */
8680           if (start_val >= -s_max - 1
8681               /* Check for host arithmetic overflow.  */
8682               && (neg_incr
8683                   ? s_end_val < start_val
8684                   : s_end_val > start_val)
8685               /* Check for target arithmetic overflow.  */
8686               && (neg_incr
8687                   ? s_end_val >= -s_max - 1
8688                   : s_end_val <= s_max))
8689             {
8690               se_ok = 1;
8691             }
8692         }
8693     }
8694
8695   /* If we know the BIV is compared at run-time against an 
8696      invariant value, and the increment is +/- 1, we may also 
8697      be able to prove that the BIV cannot overflow.  */
8698   else if (bl->biv->src_reg == loop_info->iteration_var
8699            && loop_info->comparison_value
8700            && loop_invariant_p (loop, loop_info->comparison_value)
8701            && (incr = biv_total_increment (bl))
8702            && GET_CODE (incr) == CONST_INT)
8703     {
8704       /* If the increment is +1, and the exit test is a <,
8705          the BIV cannot overflow.  (For <=, we have the 
8706          problematic case that the comparison value might
8707          be the maximum value of the range.)  */
8708        if (INTVAL (incr) == 1)
8709          {
8710            if (loop_info->comparison_code == LT)
8711              se_ok = ze_ok = 1;
8712            else if (loop_info->comparison_code == LTU)
8713              ze_ok = 1;
8714          }
8715
8716        /* Likewise for increment -1 and exit test >.  */
8717        if (INTVAL (incr) == -1)
8718          {
8719            if (loop_info->comparison_code == GT)
8720              se_ok = ze_ok = 1;
8721            else if (loop_info->comparison_code == GTU)
8722              ze_ok = 1;
8723          }
8724     }
8725
8726   /* Invalidate givs that fail the tests.  */
8727   for (v = bl->giv; v; v = v->next_iv)
8728     if (v->ext_dependent)
8729       {
8730         enum rtx_code code = GET_CODE (v->ext_dependent);
8731         int ok = 0;
8732
8733         switch (code)
8734           {
8735           case SIGN_EXTEND:
8736             ok = se_ok;
8737             break;
8738           case ZERO_EXTEND:
8739             ok = ze_ok;
8740             break;
8741
8742           case TRUNCATE:
8743             /* We don't know whether this value is being used as either
8744                signed or unsigned, so to safely truncate we must satisfy
8745                both.  The initial check here verifies the BIV itself;
8746                once that is successful we may check its range wrt the
8747                derived GIV.  This works only if we were able to determine
8748                constant start and end values above.  */
8749             if (se_ok && ze_ok && info_ok)
8750               {
8751                 enum machine_mode outer_mode = GET_MODE (v->ext_dependent);
8752                 unsigned HOST_WIDE_INT max = GET_MODE_MASK (outer_mode) >> 1;
8753
8754                 /* We know from the above that both endpoints are nonnegative,
8755                    and that there is no wrapping.  Verify that both endpoints
8756                    are within the (signed) range of the outer mode.  */
8757                 if (u_start_val <= max && u_end_val <= max)
8758                   ok = 1;
8759               }
8760             break;
8761
8762           default:
8763             abort ();
8764           }
8765
8766         if (ok)
8767           {
8768             if (loop_dump_stream)
8769               {
8770                 fprintf (loop_dump_stream,
8771                          "Verified ext dependent giv at %d of reg %d\n",
8772                          INSN_UID (v->insn), bl->regno);
8773               }
8774           }
8775         else
8776           {
8777             if (loop_dump_stream)
8778               {
8779                 const char *why;
8780
8781                 if (info_ok)
8782                   why = "biv iteration values overflowed";
8783                 else
8784                   {
8785                     if (incr == pc_rtx)
8786                       incr = biv_total_increment (bl);
8787                     if (incr == const1_rtx)
8788                       why = "biv iteration info incomplete; incr by 1";
8789                     else
8790                       why = "biv iteration info incomplete";
8791                   }
8792
8793                 fprintf (loop_dump_stream,
8794                          "Failed ext dependent giv at %d, %s\n",
8795                          INSN_UID (v->insn), why);
8796               }
8797             v->ignore = 1;
8798             bl->all_reduced = 0;
8799           }
8800       }
8801 }
8802
8803 /* Generate a version of VALUE in a mode appropriate for initializing V.  */
8804
8805 static rtx
8806 extend_value_for_giv (struct induction *v, rtx value)
8807 {
8808   rtx ext_dep = v->ext_dependent;
8809
8810   if (! ext_dep)
8811     return value;
8812
8813   /* Recall that check_ext_dependent_givs verified that the known bounds
8814      of a biv did not overflow or wrap with respect to the extension for
8815      the giv.  Therefore, constants need no additional adjustment.  */
8816   if (CONSTANT_P (value) && GET_MODE (value) == VOIDmode)
8817     return value;
8818
8819   /* Otherwise, we must adjust the value to compensate for the
8820      differing modes of the biv and the giv.  */
8821   return gen_rtx_fmt_e (GET_CODE (ext_dep), GET_MODE (ext_dep), value);
8822 }
8823 \f
8824 struct combine_givs_stats
8825 {
8826   int giv_number;
8827   int total_benefit;
8828 };
8829
8830 static int
8831 cmp_combine_givs_stats (const void *xp, const void *yp)
8832 {
8833   const struct combine_givs_stats * const x =
8834     (const struct combine_givs_stats *) xp;
8835   const struct combine_givs_stats * const y =
8836     (const struct combine_givs_stats *) yp;
8837   int d;
8838   d = y->total_benefit - x->total_benefit;
8839   /* Stabilize the sort.  */
8840   if (!d)
8841     d = x->giv_number - y->giv_number;
8842   return d;
8843 }
8844
8845 /* Check all pairs of givs for iv_class BL and see if any can be combined with
8846    any other.  If so, point SAME to the giv combined with and set NEW_REG to
8847    be an expression (in terms of the other giv's DEST_REG) equivalent to the
8848    giv.  Also, update BENEFIT and related fields for cost/benefit analysis.  */
8849
8850 static void
8851 combine_givs (struct loop_regs *regs, struct iv_class *bl)
8852 {
8853   /* Additional benefit to add for being combined multiple times.  */
8854   const int extra_benefit = 3;
8855
8856   struct induction *g1, *g2, **giv_array;
8857   int i, j, k, giv_count;
8858   struct combine_givs_stats *stats;
8859   rtx *can_combine;
8860
8861   /* Count givs, because bl->giv_count is incorrect here.  */
8862   giv_count = 0;
8863   for (g1 = bl->giv; g1; g1 = g1->next_iv)
8864     if (!g1->ignore)
8865       giv_count++;
8866
8867   giv_array = alloca (giv_count * sizeof (struct induction *));
8868   i = 0;
8869   for (g1 = bl->giv; g1; g1 = g1->next_iv)
8870     if (!g1->ignore)
8871       giv_array[i++] = g1;
8872
8873   stats = xcalloc (giv_count, sizeof (*stats));
8874   can_combine = xcalloc (giv_count, giv_count * sizeof (rtx));
8875
8876   for (i = 0; i < giv_count; i++)
8877     {
8878       int this_benefit;
8879       rtx single_use;
8880
8881       g1 = giv_array[i];
8882       stats[i].giv_number = i;
8883
8884       /* If a DEST_REG GIV is used only once, do not allow it to combine
8885          with anything, for in doing so we will gain nothing that cannot
8886          be had by simply letting the GIV with which we would have combined
8887          to be reduced on its own.  The losage shows up in particular with
8888          DEST_ADDR targets on hosts with reg+reg addressing, though it can
8889          be seen elsewhere as well.  */
8890       if (g1->giv_type == DEST_REG
8891           && (single_use = regs->array[REGNO (g1->dest_reg)].single_usage)
8892           && single_use != const0_rtx)
8893         continue;
8894
8895       this_benefit = g1->benefit;
8896       /* Add an additional weight for zero addends.  */
8897       if (g1->no_const_addval)
8898         this_benefit += 1;
8899
8900       for (j = 0; j < giv_count; j++)
8901         {
8902           rtx this_combine;
8903
8904           g2 = giv_array[j];
8905           if (g1 != g2
8906               && (this_combine = combine_givs_p (g1, g2)) != NULL_RTX)
8907             {
8908               can_combine[i * giv_count + j] = this_combine;
8909               this_benefit += g2->benefit + extra_benefit;
8910             }
8911         }
8912       stats[i].total_benefit = this_benefit;
8913     }
8914
8915   /* Iterate, combining until we can't.  */
8916 restart:
8917   qsort (stats, giv_count, sizeof (*stats), cmp_combine_givs_stats);
8918
8919   if (loop_dump_stream)
8920     {
8921       fprintf (loop_dump_stream, "Sorted combine statistics:\n");
8922       for (k = 0; k < giv_count; k++)
8923         {
8924           g1 = giv_array[stats[k].giv_number];
8925           if (!g1->combined_with && !g1->same)
8926             fprintf (loop_dump_stream, " {%d, %d}",
8927                      INSN_UID (giv_array[stats[k].giv_number]->insn),
8928                      stats[k].total_benefit);
8929         }
8930       putc ('\n', loop_dump_stream);
8931     }
8932
8933   for (k = 0; k < giv_count; k++)
8934     {
8935       int g1_add_benefit = 0;
8936
8937       i = stats[k].giv_number;
8938       g1 = giv_array[i];
8939
8940       /* If it has already been combined, skip.  */
8941       if (g1->combined_with || g1->same)
8942         continue;
8943
8944       for (j = 0; j < giv_count; j++)
8945         {
8946           g2 = giv_array[j];
8947           if (g1 != g2 && can_combine[i * giv_count + j]
8948               /* If it has already been combined, skip.  */
8949               && ! g2->same && ! g2->combined_with)
8950             {
8951               int l;
8952
8953               g2->new_reg = can_combine[i * giv_count + j];
8954               g2->same = g1;
8955               /* For destination, we now may replace by mem expression instead
8956                  of register.  This changes the costs considerably, so add the
8957                  compensation.  */
8958               if (g2->giv_type == DEST_ADDR)
8959                 g2->benefit = (g2->benefit + reg_address_cost
8960                                - address_cost (g2->new_reg,
8961                                GET_MODE (g2->mem)));
8962               g1->combined_with++;
8963               g1->lifetime += g2->lifetime;
8964
8965               g1_add_benefit += g2->benefit;
8966
8967               /* ??? The new final_[bg]iv_value code does a much better job
8968                  of finding replaceable giv's, and hence this code may no
8969                  longer be necessary.  */
8970               if (! g2->replaceable && REG_USERVAR_P (g2->dest_reg))
8971                 g1_add_benefit -= copy_cost;
8972
8973               /* To help optimize the next set of combinations, remove
8974                  this giv from the benefits of other potential mates.  */
8975               for (l = 0; l < giv_count; ++l)
8976                 {
8977                   int m = stats[l].giv_number;
8978                   if (can_combine[m * giv_count + j])
8979                     stats[l].total_benefit -= g2->benefit + extra_benefit;
8980                 }
8981
8982               if (loop_dump_stream)
8983                 fprintf (loop_dump_stream,
8984                          "giv at %d combined with giv at %d; new benefit %d + %d, lifetime %d\n",
8985                          INSN_UID (g2->insn), INSN_UID (g1->insn),
8986                          g1->benefit, g1_add_benefit, g1->lifetime);
8987             }
8988         }
8989
8990       /* To help optimize the next set of combinations, remove
8991          this giv from the benefits of other potential mates.  */
8992       if (g1->combined_with)
8993         {
8994           for (j = 0; j < giv_count; ++j)
8995             {
8996               int m = stats[j].giv_number;
8997               if (can_combine[m * giv_count + i])
8998                 stats[j].total_benefit -= g1->benefit + extra_benefit;
8999             }
9000
9001           g1->benefit += g1_add_benefit;
9002
9003           /* We've finished with this giv, and everything it touched.
9004              Restart the combination so that proper weights for the
9005              rest of the givs are properly taken into account.  */
9006           /* ??? Ideally we would compact the arrays at this point, so
9007              as to not cover old ground.  But sanely compacting
9008              can_combine is tricky.  */
9009           goto restart;
9010         }
9011     }
9012
9013   /* Clean up.  */
9014   free (stats);
9015   free (can_combine);
9016 }
9017 \f
9018 /* Generate sequence for REG = B * M + A.  B is the initial value of
9019    the basic induction variable, M a multiplicative constant, A an
9020    additive constant and REG the destination register.  */
9021
9022 static rtx
9023 gen_add_mult (rtx b,  rtx m, rtx a, rtx reg)
9024 {
9025   rtx seq;
9026   rtx result;
9027
9028   start_sequence ();
9029   /* Use unsigned arithmetic.  */
9030   result = expand_mult_add (b, reg, m, a, GET_MODE (reg), 1);
9031   if (reg != result)
9032     emit_move_insn (reg, result);
9033   seq = get_insns ();
9034   end_sequence ();
9035
9036   return seq;
9037 }
9038
9039
9040 /* Update registers created in insn sequence SEQ.  */
9041
9042 static void
9043 loop_regs_update (const struct loop *loop ATTRIBUTE_UNUSED, rtx seq)
9044 {
9045   rtx insn;
9046
9047   /* Update register info for alias analysis.  */
9048
9049   insn = seq;
9050   while (insn != NULL_RTX)
9051     {
9052       rtx set = single_set (insn);
9053
9054       if (set && REG_P (SET_DEST (set)))
9055         record_base_value (REGNO (SET_DEST (set)), SET_SRC (set), 0);
9056
9057       insn = NEXT_INSN (insn);
9058     }
9059 }
9060
9061
9062 /* EMIT code before BEFORE_BB/BEFORE_INSN to set REG = B * M + A.  B
9063    is the initial value of the basic induction variable, M a
9064    multiplicative constant, A an additive constant and REG the
9065    destination register.  */
9066
9067 static void
9068 loop_iv_add_mult_emit_before (const struct loop *loop, rtx b, rtx m, rtx a,
9069                               rtx reg, basic_block before_bb, rtx before_insn)
9070 {
9071   rtx seq;
9072
9073   if (! before_insn)
9074     {
9075       loop_iv_add_mult_hoist (loop, b, m, a, reg);
9076       return;
9077     }
9078
9079   /* Use copy_rtx to prevent unexpected sharing of these rtx.  */
9080   seq = gen_add_mult (copy_rtx (b), copy_rtx (m), copy_rtx (a), reg);
9081
9082   /* Increase the lifetime of any invariants moved further in code.  */
9083   update_reg_last_use (a, before_insn);
9084   update_reg_last_use (b, before_insn);
9085   update_reg_last_use (m, before_insn);
9086
9087   /* It is possible that the expansion created lots of new registers.
9088      Iterate over the sequence we just created and record them all.  We
9089      must do this before inserting the sequence.  */
9090   loop_regs_update (loop, seq);
9091
9092   loop_insn_emit_before (loop, before_bb, before_insn, seq);
9093 }
9094
9095
9096 /* Emit insns in loop pre-header to set REG = B * M + A.  B is the
9097    initial value of the basic induction variable, M a multiplicative
9098    constant, A an additive constant and REG the destination
9099    register.  */
9100
9101 static void
9102 loop_iv_add_mult_sink (const struct loop *loop, rtx b, rtx m, rtx a, rtx reg)
9103 {
9104   rtx seq;
9105
9106   /* Use copy_rtx to prevent unexpected sharing of these rtx.  */
9107   seq = gen_add_mult (copy_rtx (b), copy_rtx (m), copy_rtx (a), reg);
9108
9109   /* Increase the lifetime of any invariants moved further in code.
9110      ???? Is this really necessary?  */
9111   update_reg_last_use (a, loop->sink);
9112   update_reg_last_use (b, loop->sink);
9113   update_reg_last_use (m, loop->sink);
9114
9115   /* It is possible that the expansion created lots of new registers.
9116      Iterate over the sequence we just created and record them all.  We
9117      must do this before inserting the sequence.  */
9118   loop_regs_update (loop, seq);
9119
9120   loop_insn_sink (loop, seq);
9121 }
9122
9123
9124 /* Emit insns after loop to set REG = B * M + A.  B is the initial
9125    value of the basic induction variable, M a multiplicative constant,
9126    A an additive constant and REG the destination register.  */
9127
9128 static void
9129 loop_iv_add_mult_hoist (const struct loop *loop, rtx b, rtx m, rtx a, rtx reg)
9130 {
9131   rtx seq;
9132
9133   /* Use copy_rtx to prevent unexpected sharing of these rtx.  */
9134   seq = gen_add_mult (copy_rtx (b), copy_rtx (m), copy_rtx (a), reg);
9135
9136   /* It is possible that the expansion created lots of new registers.
9137      Iterate over the sequence we just created and record them all.  We
9138      must do this before inserting the sequence.  */
9139   loop_regs_update (loop, seq);
9140
9141   loop_insn_hoist (loop, seq);
9142 }
9143
9144
9145
9146 /* Similar to gen_add_mult, but compute cost rather than generating
9147    sequence.  */
9148
9149 static int
9150 iv_add_mult_cost (rtx b, rtx m, rtx a, rtx reg)
9151 {
9152   int cost = 0;
9153   rtx last, result;
9154
9155   start_sequence ();
9156   result = expand_mult_add (b, reg, m, a, GET_MODE (reg), 1);
9157   if (reg != result)
9158     emit_move_insn (reg, result);
9159   last = get_last_insn ();
9160   while (last)
9161     {
9162       rtx t = single_set (last);
9163       if (t)
9164         cost += rtx_cost (SET_SRC (t), SET);
9165       last = PREV_INSN (last);
9166     }
9167   end_sequence ();
9168   return cost;
9169 }
9170 \f
9171 /* Test whether A * B can be computed without
9172    an actual multiply insn.  Value is 1 if so.
9173
9174   ??? This function stinks because it generates a ton of wasted RTL
9175   ??? and as a result fragments GC memory to no end.  There are other
9176   ??? places in the compiler which are invoked a lot and do the same
9177   ??? thing, generate wasted RTL just to see if something is possible.  */
9178
9179 static int
9180 product_cheap_p (rtx a, rtx b)
9181 {
9182   rtx tmp;
9183   int win, n_insns;
9184
9185   /* If only one is constant, make it B.  */
9186   if (GET_CODE (a) == CONST_INT)
9187     tmp = a, a = b, b = tmp;
9188
9189   /* If first constant, both constant, so don't need multiply.  */
9190   if (GET_CODE (a) == CONST_INT)
9191     return 1;
9192
9193   /* If second not constant, neither is constant, so would need multiply.  */
9194   if (GET_CODE (b) != CONST_INT)
9195     return 0;
9196
9197   /* One operand is constant, so might not need multiply insn.  Generate the
9198      code for the multiply and see if a call or multiply, or long sequence
9199      of insns is generated.  */
9200
9201   start_sequence ();
9202   expand_mult (GET_MODE (a), a, b, NULL_RTX, 1);
9203   tmp = get_insns ();
9204   end_sequence ();
9205
9206   win = 1;
9207   if (tmp == NULL_RTX)
9208     ;
9209   else if (INSN_P (tmp))
9210     {
9211       n_insns = 0;
9212       while (tmp != NULL_RTX)
9213         {
9214           rtx next = NEXT_INSN (tmp);
9215
9216           if (++n_insns > 3
9217               || !NONJUMP_INSN_P (tmp)
9218               || (GET_CODE (PATTERN (tmp)) == SET
9219                   && GET_CODE (SET_SRC (PATTERN (tmp))) == MULT)
9220               || (GET_CODE (PATTERN (tmp)) == PARALLEL
9221                   && GET_CODE (XVECEXP (PATTERN (tmp), 0, 0)) == SET
9222                   && GET_CODE (SET_SRC (XVECEXP (PATTERN (tmp), 0, 0))) == MULT))
9223             {
9224               win = 0;
9225               break;
9226             }
9227
9228           tmp = next;
9229         }
9230     }
9231   else if (GET_CODE (tmp) == SET
9232            && GET_CODE (SET_SRC (tmp)) == MULT)
9233     win = 0;
9234   else if (GET_CODE (tmp) == PARALLEL
9235            && GET_CODE (XVECEXP (tmp, 0, 0)) == SET
9236            && GET_CODE (SET_SRC (XVECEXP (tmp, 0, 0))) == MULT)
9237     win = 0;
9238
9239   return win;
9240 }
9241 \f
9242 /* Check to see if loop can be terminated by a "decrement and branch until
9243    zero" instruction.  If so, add a REG_NONNEG note to the branch insn if so.
9244    Also try reversing an increment loop to a decrement loop
9245    to see if the optimization can be performed.
9246    Value is nonzero if optimization was performed.  */
9247
9248 /* This is useful even if the architecture doesn't have such an insn,
9249    because it might change a loops which increments from 0 to n to a loop
9250    which decrements from n to 0.  A loop that decrements to zero is usually
9251    faster than one that increments from zero.  */
9252
9253 /* ??? This could be rewritten to use some of the loop unrolling procedures,
9254    such as approx_final_value, biv_total_increment, loop_iterations, and
9255    final_[bg]iv_value.  */
9256
9257 static int
9258 check_dbra_loop (struct loop *loop, int insn_count)
9259 {
9260   struct loop_info *loop_info = LOOP_INFO (loop);
9261   struct loop_regs *regs = LOOP_REGS (loop);
9262   struct loop_ivs *ivs = LOOP_IVS (loop);
9263   struct iv_class *bl;
9264   rtx reg;
9265   enum machine_mode mode;
9266   rtx jump_label;
9267   rtx final_value;
9268   rtx start_value;
9269   rtx new_add_val;
9270   rtx comparison;
9271   rtx before_comparison;
9272   rtx p;
9273   rtx jump;
9274   rtx first_compare;
9275   int compare_and_branch;
9276   rtx loop_start = loop->start;
9277   rtx loop_end = loop->end;
9278
9279   /* If last insn is a conditional branch, and the insn before tests a
9280      register value, try to optimize it.  Otherwise, we can't do anything.  */
9281
9282   jump = PREV_INSN (loop_end);
9283   comparison = get_condition_for_loop (loop, jump);
9284   if (comparison == 0)
9285     return 0;
9286   if (!onlyjump_p (jump))
9287     return 0;
9288
9289   /* Try to compute whether the compare/branch at the loop end is one or
9290      two instructions.  */
9291   get_condition (jump, &first_compare, false, true);
9292   if (first_compare == jump)
9293     compare_and_branch = 1;
9294   else if (first_compare == prev_nonnote_insn (jump))
9295     compare_and_branch = 2;
9296   else
9297     return 0;
9298
9299   {
9300     /* If more than one condition is present to control the loop, then
9301        do not proceed, as this function does not know how to rewrite
9302        loop tests with more than one condition.
9303
9304        Look backwards from the first insn in the last comparison
9305        sequence and see if we've got another comparison sequence.  */
9306
9307     rtx jump1;
9308     if ((jump1 = prev_nonnote_insn (first_compare))
9309         && JUMP_P (jump1))
9310         return 0;
9311   }
9312
9313   /* Check all of the bivs to see if the compare uses one of them.
9314      Skip biv's set more than once because we can't guarantee that
9315      it will be zero on the last iteration.  Also skip if the biv is
9316      used between its update and the test insn.  */
9317
9318   for (bl = ivs->list; bl; bl = bl->next)
9319     {
9320       if (bl->biv_count == 1
9321           && ! bl->biv->maybe_multiple
9322           && bl->biv->dest_reg == XEXP (comparison, 0)
9323           && ! reg_used_between_p (regno_reg_rtx[bl->regno], bl->biv->insn,
9324                                    first_compare))
9325         break;
9326     }
9327
9328   /* Try swapping the comparison to identify a suitable biv.  */
9329   if (!bl)
9330     for (bl = ivs->list; bl; bl = bl->next)
9331       if (bl->biv_count == 1
9332           && ! bl->biv->maybe_multiple
9333           && bl->biv->dest_reg == XEXP (comparison, 1)
9334           && ! reg_used_between_p (regno_reg_rtx[bl->regno], bl->biv->insn,
9335                                    first_compare))
9336         {
9337           comparison = gen_rtx_fmt_ee (swap_condition (GET_CODE (comparison)),
9338                                        VOIDmode,
9339                                        XEXP (comparison, 1),
9340                                        XEXP (comparison, 0));
9341           break;
9342         }
9343
9344   if (! bl)
9345     return 0;
9346
9347   /* Look for the case where the basic induction variable is always
9348      nonnegative, and equals zero on the last iteration.
9349      In this case, add a reg_note REG_NONNEG, which allows the
9350      m68k DBRA instruction to be used.  */
9351
9352   if (((GET_CODE (comparison) == GT && XEXP (comparison, 1) == constm1_rtx)
9353        || (GET_CODE (comparison) == NE && XEXP (comparison, 1) == const0_rtx))
9354       && GET_CODE (bl->biv->add_val) == CONST_INT
9355       && INTVAL (bl->biv->add_val) < 0)
9356     {
9357       /* Initial value must be greater than 0,
9358          init_val % -dec_value == 0 to ensure that it equals zero on
9359          the last iteration */
9360
9361       if (GET_CODE (bl->initial_value) == CONST_INT
9362           && INTVAL (bl->initial_value) > 0
9363           && (INTVAL (bl->initial_value)
9364               % (-INTVAL (bl->biv->add_val))) == 0)
9365         {
9366           /* Register always nonnegative, add REG_NOTE to branch.  */
9367           if (! find_reg_note (jump, REG_NONNEG, NULL_RTX))
9368             REG_NOTES (jump)
9369               = gen_rtx_EXPR_LIST (REG_NONNEG, bl->biv->dest_reg,
9370                                    REG_NOTES (jump));
9371           bl->nonneg = 1;
9372
9373           return 1;
9374         }
9375
9376       /* If the decrement is 1 and the value was tested as >= 0 before
9377          the loop, then we can safely optimize.  */
9378       for (p = loop_start; p; p = PREV_INSN (p))
9379         {
9380           if (LABEL_P (p))
9381             break;
9382           if (!JUMP_P (p))
9383             continue;
9384
9385           before_comparison = get_condition_for_loop (loop, p);
9386           if (before_comparison
9387               && XEXP (before_comparison, 0) == bl->biv->dest_reg
9388               && (GET_CODE (before_comparison) == LT
9389                   || GET_CODE (before_comparison) == LTU)
9390               && XEXP (before_comparison, 1) == const0_rtx
9391               && ! reg_set_between_p (bl->biv->dest_reg, p, loop_start)
9392               && INTVAL (bl->biv->add_val) == -1)
9393             {
9394               if (! find_reg_note (jump, REG_NONNEG, NULL_RTX))
9395                 REG_NOTES (jump)
9396                   = gen_rtx_EXPR_LIST (REG_NONNEG, bl->biv->dest_reg,
9397                                        REG_NOTES (jump));
9398               bl->nonneg = 1;
9399
9400               return 1;
9401             }
9402         }
9403     }
9404   else if (GET_CODE (bl->biv->add_val) == CONST_INT
9405            && INTVAL (bl->biv->add_val) > 0)
9406     {
9407       /* Try to change inc to dec, so can apply above optimization.  */
9408       /* Can do this if:
9409          all registers modified are induction variables or invariant,
9410          all memory references have non-overlapping addresses
9411          (obviously true if only one write)
9412          allow 2 insns for the compare/jump at the end of the loop.  */
9413       /* Also, we must avoid any instructions which use both the reversed
9414          biv and another biv.  Such instructions will fail if the loop is
9415          reversed.  We meet this condition by requiring that either
9416          no_use_except_counting is true, or else that there is only
9417          one biv.  */
9418       int num_nonfixed_reads = 0;
9419       /* 1 if the iteration var is used only to count iterations.  */
9420       int no_use_except_counting = 0;
9421       /* 1 if the loop has no memory store, or it has a single memory store
9422          which is reversible.  */
9423       int reversible_mem_store = 1;
9424
9425       if (bl->giv_count == 0
9426           && !loop->exit_count
9427           && !loop_info->has_multiple_exit_targets)
9428         {
9429           rtx bivreg = regno_reg_rtx[bl->regno];
9430           struct iv_class *blt;
9431
9432           /* If there are no givs for this biv, and the only exit is the
9433              fall through at the end of the loop, then
9434              see if perhaps there are no uses except to count.  */
9435           no_use_except_counting = 1;
9436           for (p = loop_start; p != loop_end; p = NEXT_INSN (p))
9437             if (INSN_P (p))
9438               {
9439                 rtx set = single_set (p);
9440
9441                 if (set && REG_P (SET_DEST (set))
9442                     && REGNO (SET_DEST (set)) == bl->regno)
9443                   /* An insn that sets the biv is okay.  */
9444                   ;
9445                 else if (!reg_mentioned_p (bivreg, PATTERN (p)))
9446                   /* An insn that doesn't mention the biv is okay.  */
9447                   ;
9448                 else if (p == prev_nonnote_insn (prev_nonnote_insn (loop_end))
9449                          || p == prev_nonnote_insn (loop_end))
9450                   {
9451                     /* If either of these insns uses the biv and sets a pseudo
9452                        that has more than one usage, then the biv has uses
9453                        other than counting since it's used to derive a value
9454                        that is used more than one time.  */
9455                     note_stores (PATTERN (p), note_set_pseudo_multiple_uses,
9456                                  regs);
9457                     if (regs->multiple_uses)
9458                       {
9459                         no_use_except_counting = 0;
9460                         break;
9461                       }
9462                   }
9463                 else
9464                   {
9465                     no_use_except_counting = 0;
9466                     break;
9467                   }
9468               }
9469
9470           /* A biv has uses besides counting if it is used to set
9471              another biv.  */
9472           for (blt = ivs->list; blt; blt = blt->next)
9473             if (blt->init_set
9474                 && reg_mentioned_p (bivreg, SET_SRC (blt->init_set)))
9475               {
9476                 no_use_except_counting = 0;
9477                 break;
9478               }
9479         }
9480
9481       if (no_use_except_counting)
9482         /* No need to worry about MEMs.  */
9483         ;
9484       else if (loop_info->num_mem_sets <= 1)
9485         {
9486           for (p = loop_start; p != loop_end; p = NEXT_INSN (p))
9487             if (INSN_P (p))
9488               num_nonfixed_reads += count_nonfixed_reads (loop, PATTERN (p));
9489
9490           /* If the loop has a single store, and the destination address is
9491              invariant, then we can't reverse the loop, because this address
9492              might then have the wrong value at loop exit.
9493              This would work if the source was invariant also, however, in that
9494              case, the insn should have been moved out of the loop.  */
9495
9496           if (loop_info->num_mem_sets == 1)
9497             {
9498               struct induction *v;
9499
9500               /* If we could prove that each of the memory locations
9501                  written to was different, then we could reverse the
9502                  store -- but we don't presently have any way of
9503                  knowing that.  */
9504               reversible_mem_store = 0;
9505
9506               /* If the store depends on a register that is set after the
9507                  store, it depends on the initial value, and is thus not
9508                  reversible.  */
9509               for (v = bl->giv; reversible_mem_store && v; v = v->next_iv)
9510                 {
9511                   if (v->giv_type == DEST_REG
9512                       && reg_mentioned_p (v->dest_reg,
9513                                           PATTERN (loop_info->first_loop_store_insn))
9514                       && loop_insn_first_p (loop_info->first_loop_store_insn,
9515                                             v->insn))
9516                     reversible_mem_store = 0;
9517                 }
9518             }
9519         }
9520       else
9521         return 0;
9522
9523       /* This code only acts for innermost loops.  Also it simplifies
9524          the memory address check by only reversing loops with
9525          zero or one memory access.
9526          Two memory accesses could involve parts of the same array,
9527          and that can't be reversed.
9528          If the biv is used only for counting, than we don't need to worry
9529          about all these things.  */
9530
9531       if ((num_nonfixed_reads <= 1
9532            && ! loop_info->has_nonconst_call
9533            && ! loop_info->has_prefetch
9534            && ! loop_info->has_volatile
9535            && reversible_mem_store
9536            && (bl->giv_count + bl->biv_count + loop_info->num_mem_sets
9537                + num_unmoved_movables (loop) + compare_and_branch == insn_count)
9538            && (bl == ivs->list && bl->next == 0))
9539           || (no_use_except_counting && ! loop_info->has_prefetch))
9540         {
9541           rtx tem;
9542
9543           /* Loop can be reversed.  */
9544           if (loop_dump_stream)
9545             fprintf (loop_dump_stream, "Can reverse loop\n");
9546
9547           /* Now check other conditions:
9548
9549              The increment must be a constant, as must the initial value,
9550              and the comparison code must be LT.
9551
9552              This test can probably be improved since +/- 1 in the constant
9553              can be obtained by changing LT to LE and vice versa; this is
9554              confusing.  */
9555
9556           if (comparison
9557               /* for constants, LE gets turned into LT */
9558               && (GET_CODE (comparison) == LT
9559                   || (GET_CODE (comparison) == LE
9560                       && no_use_except_counting) 
9561                   || GET_CODE (comparison) == LTU))
9562             {
9563               HOST_WIDE_INT add_val, add_adjust, comparison_val = 0;
9564               rtx initial_value, comparison_value;
9565               int nonneg = 0;
9566               enum rtx_code cmp_code;
9567               int comparison_const_width;
9568               unsigned HOST_WIDE_INT comparison_sign_mask;
9569               bool keep_first_compare;
9570
9571               add_val = INTVAL (bl->biv->add_val);
9572               comparison_value = XEXP (comparison, 1);
9573               if (GET_MODE (comparison_value) == VOIDmode)
9574                 comparison_const_width
9575                   = GET_MODE_BITSIZE (GET_MODE (XEXP (comparison, 0)));
9576               else
9577                 comparison_const_width
9578                   = GET_MODE_BITSIZE (GET_MODE (comparison_value));
9579               if (comparison_const_width > HOST_BITS_PER_WIDE_INT)
9580                 comparison_const_width = HOST_BITS_PER_WIDE_INT;
9581               comparison_sign_mask
9582                 = (unsigned HOST_WIDE_INT) 1 << (comparison_const_width - 1);
9583
9584               /* If the comparison value is not a loop invariant, then we
9585                  can not reverse this loop.
9586
9587                  ??? If the insns which initialize the comparison value as
9588                  a whole compute an invariant result, then we could move
9589                  them out of the loop and proceed with loop reversal.  */
9590               if (! loop_invariant_p (loop, comparison_value))
9591                 return 0;
9592
9593               if (GET_CODE (comparison_value) == CONST_INT)
9594                 comparison_val = INTVAL (comparison_value);
9595               initial_value = bl->initial_value;
9596
9597               /* Normalize the initial value if it is an integer and
9598                  has no other use except as a counter.  This will allow
9599                  a few more loops to be reversed.  */
9600               if (no_use_except_counting
9601                   && GET_CODE (comparison_value) == CONST_INT
9602                   && GET_CODE (initial_value) == CONST_INT)
9603                 {
9604                   comparison_val = comparison_val - INTVAL (bl->initial_value);
9605                   /* The code below requires comparison_val to be a multiple
9606                      of add_val in order to do the loop reversal, so
9607                      round up comparison_val to a multiple of add_val.
9608                      Since comparison_value is constant, we know that the
9609                      current comparison code is LT.  */
9610                   comparison_val = comparison_val + add_val - 1;
9611                   comparison_val
9612                     -= (unsigned HOST_WIDE_INT) comparison_val % add_val;
9613                   /* We postpone overflow checks for COMPARISON_VAL here;
9614                      even if there is an overflow, we might still be able to
9615                      reverse the loop, if converting the loop exit test to
9616                      NE is possible.  */
9617                   initial_value = const0_rtx;
9618                 }
9619
9620               /* First check if we can do a vanilla loop reversal.  */
9621               if (initial_value == const0_rtx
9622                   && GET_CODE (comparison_value) == CONST_INT
9623                      /* Now do postponed overflow checks on COMPARISON_VAL.  */
9624                   && ! (((comparison_val - add_val) ^ INTVAL (comparison_value))
9625                         & comparison_sign_mask))
9626                 {
9627                   /* Register will always be nonnegative, with value
9628                      0 on last iteration */
9629                   add_adjust = add_val;
9630                   nonneg = 1;
9631                   cmp_code = GE;
9632                 }
9633               else
9634                 return 0;
9635
9636               if (GET_CODE (comparison) == LE)
9637                 add_adjust -= add_val;
9638
9639               /* If the initial value is not zero, or if the comparison
9640                  value is not an exact multiple of the increment, then we
9641                  can not reverse this loop.  */
9642               if (initial_value == const0_rtx
9643                   && GET_CODE (comparison_value) == CONST_INT)
9644                 {
9645                   if (((unsigned HOST_WIDE_INT) comparison_val % add_val) != 0)
9646                     return 0;
9647                 }
9648               else
9649                 {
9650                   if (! no_use_except_counting || add_val != 1)
9651                     return 0;
9652                 }
9653
9654               final_value = comparison_value;
9655
9656               /* Reset these in case we normalized the initial value
9657                  and comparison value above.  */
9658               if (GET_CODE (comparison_value) == CONST_INT
9659                   && GET_CODE (initial_value) == CONST_INT)
9660                 {
9661                   comparison_value = GEN_INT (comparison_val);
9662                   final_value
9663                     = GEN_INT (comparison_val + INTVAL (bl->initial_value));
9664                 }
9665               bl->initial_value = initial_value;
9666
9667               /* Save some info needed to produce the new insns.  */
9668               reg = bl->biv->dest_reg;
9669               mode = GET_MODE (reg);
9670               jump_label = condjump_label (PREV_INSN (loop_end));
9671               new_add_val = GEN_INT (-INTVAL (bl->biv->add_val));
9672
9673               /* Set start_value; if this is not a CONST_INT, we need
9674                  to generate a SUB.
9675                  Initialize biv to start_value before loop start.
9676                  The old initializing insn will be deleted as a
9677                  dead store by flow.c.  */
9678               if (initial_value == const0_rtx
9679                   && GET_CODE (comparison_value) == CONST_INT)
9680                 {
9681                   start_value
9682                     = gen_int_mode (comparison_val - add_adjust, mode);
9683                   loop_insn_hoist (loop, gen_move_insn (reg, start_value));
9684                 }
9685               else if (GET_CODE (initial_value) == CONST_INT)
9686                 {
9687                   rtx offset = GEN_INT (-INTVAL (initial_value) - add_adjust);
9688                   rtx add_insn = gen_add3_insn (reg, comparison_value, offset);
9689
9690                   if (add_insn == 0)
9691                     return 0;
9692
9693                   start_value
9694                     = gen_rtx_PLUS (mode, comparison_value, offset);
9695                   loop_insn_hoist (loop, add_insn);
9696                   if (GET_CODE (comparison) == LE)
9697                     final_value = gen_rtx_PLUS (mode, comparison_value,
9698                                                 GEN_INT (add_val));
9699                 }
9700               else if (! add_adjust)
9701                 {
9702                   rtx sub_insn = gen_sub3_insn (reg, comparison_value,
9703                                                 initial_value);
9704
9705                   if (sub_insn == 0)
9706                     return 0;
9707                   start_value
9708                     = gen_rtx_MINUS (mode, comparison_value, initial_value);
9709                   loop_insn_hoist (loop, sub_insn);
9710                 }
9711               else
9712                 /* We could handle the other cases too, but it'll be
9713                    better to have a testcase first.  */
9714                 return 0;
9715
9716               /* We may not have a single insn which can increment a reg, so
9717                  create a sequence to hold all the insns from expand_inc.  */
9718               start_sequence ();
9719               expand_inc (reg, new_add_val);
9720               tem = get_insns ();
9721               end_sequence ();
9722
9723               p = loop_insn_emit_before (loop, 0, bl->biv->insn, tem);
9724               delete_insn (bl->biv->insn);
9725
9726               /* Update biv info to reflect its new status.  */
9727               bl->biv->insn = p;
9728               bl->initial_value = start_value;
9729               bl->biv->add_val = new_add_val;
9730
9731               /* Update loop info.  */
9732               loop_info->initial_value = reg;
9733               loop_info->initial_equiv_value = reg;
9734               loop_info->final_value = const0_rtx;
9735               loop_info->final_equiv_value = const0_rtx;
9736               loop_info->comparison_value = const0_rtx;
9737               loop_info->comparison_code = cmp_code;
9738               loop_info->increment = new_add_val;
9739
9740               /* Inc LABEL_NUSES so that delete_insn will
9741                  not delete the label.  */
9742               LABEL_NUSES (XEXP (jump_label, 0))++;
9743
9744               /* If we have a separate comparison insn that does more
9745                  than just set cc0, the result of the comparison might
9746                  be used outside the loop.  */
9747               keep_first_compare = (compare_and_branch == 2
9748 #ifdef HAVE_CC0
9749                                     && sets_cc0_p (first_compare) <= 0
9750 #endif
9751                                     );
9752
9753               /* Emit an insn after the end of the loop to set the biv's
9754                  proper exit value if it is used anywhere outside the loop.  */
9755               if (keep_first_compare
9756                   || (REGNO_LAST_UID (bl->regno) != INSN_UID (first_compare))
9757                   || ! bl->init_insn
9758                   || REGNO_FIRST_UID (bl->regno) != INSN_UID (bl->init_insn))
9759                 loop_insn_sink (loop, gen_load_of_final_value (reg, final_value));
9760
9761               if (keep_first_compare)
9762                 loop_insn_sink (loop, PATTERN (first_compare));
9763
9764               /* Delete compare/branch at end of loop.  */
9765               delete_related_insns (PREV_INSN (loop_end));
9766               if (compare_and_branch == 2)
9767                 delete_related_insns (first_compare);
9768
9769               /* Add new compare/branch insn at end of loop.  */
9770               start_sequence ();
9771               emit_cmp_and_jump_insns (reg, const0_rtx, cmp_code, NULL_RTX,
9772                                        mode, 0,
9773                                        XEXP (jump_label, 0));
9774               tem = get_insns ();
9775               end_sequence ();
9776               emit_jump_insn_before (tem, loop_end);
9777
9778               for (tem = PREV_INSN (loop_end);
9779                    tem && !JUMP_P (tem);
9780                    tem = PREV_INSN (tem))
9781                 ;
9782
9783               if (tem)
9784                 JUMP_LABEL (tem) = XEXP (jump_label, 0);
9785
9786               if (nonneg)
9787                 {
9788                   if (tem)
9789                     {
9790                       /* Increment of LABEL_NUSES done above.  */
9791                       /* Register is now always nonnegative,
9792                          so add REG_NONNEG note to the branch.  */
9793                       REG_NOTES (tem) = gen_rtx_EXPR_LIST (REG_NONNEG, reg,
9794                                                            REG_NOTES (tem));
9795                     }
9796                   bl->nonneg = 1;
9797                 }
9798
9799               /* No insn may reference both the reversed and another biv or it
9800                  will fail (see comment near the top of the loop reversal
9801                  code).
9802                  Earlier on, we have verified that the biv has no use except
9803                  counting, or it is the only biv in this function.
9804                  However, the code that computes no_use_except_counting does
9805                  not verify reg notes.  It's possible to have an insn that
9806                  references another biv, and has a REG_EQUAL note with an
9807                  expression based on the reversed biv.  To avoid this case,
9808                  remove all REG_EQUAL notes based on the reversed biv
9809                  here.  */
9810               for (p = loop_start; p != loop_end; p = NEXT_INSN (p))
9811                 if (INSN_P (p))
9812                   {
9813                     rtx *pnote;
9814                     rtx set = single_set (p);
9815                     /* If this is a set of a GIV based on the reversed biv, any
9816                        REG_EQUAL notes should still be correct.  */
9817                     if (! set
9818                         || !REG_P (SET_DEST (set))
9819                         || (size_t) REGNO (SET_DEST (set)) >= ivs->n_regs
9820                         || REG_IV_TYPE (ivs, REGNO (SET_DEST (set))) != GENERAL_INDUCT
9821                         || REG_IV_INFO (ivs, REGNO (SET_DEST (set)))->src_reg != bl->biv->src_reg)
9822                       for (pnote = &REG_NOTES (p); *pnote;)
9823                         {
9824                           if (REG_NOTE_KIND (*pnote) == REG_EQUAL
9825                               && reg_mentioned_p (regno_reg_rtx[bl->regno],
9826                                                   XEXP (*pnote, 0)))
9827                             *pnote = XEXP (*pnote, 1);
9828                           else
9829                             pnote = &XEXP (*pnote, 1);
9830                         }
9831                   }
9832
9833               /* Mark that this biv has been reversed.  Each giv which depends
9834                  on this biv, and which is also live past the end of the loop
9835                  will have to be fixed up.  */
9836
9837               bl->reversed = 1;
9838
9839               if (loop_dump_stream)
9840                 {
9841                   fprintf (loop_dump_stream, "Reversed loop");
9842                   if (bl->nonneg)
9843                     fprintf (loop_dump_stream, " and added reg_nonneg\n");
9844                   else
9845                     fprintf (loop_dump_stream, "\n");
9846                 }
9847
9848               return 1;
9849             }
9850         }
9851     }
9852
9853   return 0;
9854 }
9855 \f
9856 /* Verify whether the biv BL appears to be eliminable,
9857    based on the insns in the loop that refer to it.
9858
9859    If ELIMINATE_P is nonzero, actually do the elimination.
9860
9861    THRESHOLD and INSN_COUNT are from loop_optimize and are used to
9862    determine whether invariant insns should be placed inside or at the
9863    start of the loop.  */
9864
9865 static int
9866 maybe_eliminate_biv (const struct loop *loop, struct iv_class *bl,
9867                      int eliminate_p, int threshold, int insn_count)
9868 {
9869   struct loop_ivs *ivs = LOOP_IVS (loop);
9870   rtx reg = bl->biv->dest_reg;
9871   rtx p;
9872
9873   /* Scan all insns in the loop, stopping if we find one that uses the
9874      biv in a way that we cannot eliminate.  */
9875
9876   for (p = loop->start; p != loop->end; p = NEXT_INSN (p))
9877     {
9878       enum rtx_code code = GET_CODE (p);
9879       basic_block where_bb = 0;
9880       rtx where_insn = threshold >= insn_count ? 0 : p;
9881       rtx note;
9882
9883       /* If this is a libcall that sets a giv, skip ahead to its end.  */
9884       if (INSN_P (p))
9885         {
9886           note = find_reg_note (p, REG_LIBCALL, NULL_RTX);
9887
9888           if (note)
9889             {
9890               rtx last = XEXP (note, 0);
9891               rtx set = single_set (last);
9892
9893               if (set && REG_P (SET_DEST (set)))
9894                 {
9895                   unsigned int regno = REGNO (SET_DEST (set));
9896
9897                   if (regno < ivs->n_regs
9898                       && REG_IV_TYPE (ivs, regno) == GENERAL_INDUCT
9899                       && REG_IV_INFO (ivs, regno)->src_reg == bl->biv->src_reg)
9900                     p = last;
9901                 }
9902             }
9903         }
9904
9905       /* Closely examine the insn if the biv is mentioned.  */
9906       if ((code == INSN || code == JUMP_INSN || code == CALL_INSN)
9907           && reg_mentioned_p (reg, PATTERN (p))
9908           && ! maybe_eliminate_biv_1 (loop, PATTERN (p), p, bl,
9909                                       eliminate_p, where_bb, where_insn))
9910         {
9911           if (loop_dump_stream)
9912             fprintf (loop_dump_stream,
9913                      "Cannot eliminate biv %d: biv used in insn %d.\n",
9914                      bl->regno, INSN_UID (p));
9915           break;
9916         }
9917
9918       /* If we are eliminating, kill REG_EQUAL notes mentioning the biv.  */
9919       if (eliminate_p
9920           && (note = find_reg_note (p, REG_EQUAL, NULL_RTX)) != NULL_RTX
9921           && reg_mentioned_p (reg, XEXP (note, 0)))
9922         remove_note (p, note);
9923     }
9924
9925   if (p == loop->end)
9926     {
9927       if (loop_dump_stream)
9928         fprintf (loop_dump_stream, "biv %d %s eliminated.\n",
9929                  bl->regno, eliminate_p ? "was" : "can be");
9930       return 1;
9931     }
9932
9933   return 0;
9934 }
9935 \f
9936 /* INSN and REFERENCE are instructions in the same insn chain.
9937    Return nonzero if INSN is first.  */
9938
9939 static int
9940 loop_insn_first_p (rtx insn, rtx reference)
9941 {
9942   rtx p, q;
9943
9944   for (p = insn, q = reference;;)
9945     {
9946       /* Start with test for not first so that INSN == REFERENCE yields not
9947          first.  */
9948       if (q == insn || ! p)
9949         return 0;
9950       if (p == reference || ! q)
9951         return 1;
9952
9953       /* Either of P or Q might be a NOTE.  Notes have the same LUID as the
9954          previous insn, hence the <= comparison below does not work if
9955          P is a note.  */
9956       if (INSN_UID (p) < max_uid_for_loop
9957           && INSN_UID (q) < max_uid_for_loop
9958           && !NOTE_P (p))
9959         return INSN_LUID (p) <= INSN_LUID (q);
9960
9961       if (INSN_UID (p) >= max_uid_for_loop
9962           || NOTE_P (p))
9963         p = NEXT_INSN (p);
9964       if (INSN_UID (q) >= max_uid_for_loop)
9965         q = NEXT_INSN (q);
9966     }
9967 }
9968
9969 /* We are trying to eliminate BIV in INSN using GIV.  Return nonzero if
9970    the offset that we have to take into account due to auto-increment /
9971    div derivation is zero.  */
9972 static int
9973 biv_elimination_giv_has_0_offset (struct induction *biv,
9974                                   struct induction *giv, rtx insn)
9975 {
9976   /* If the giv V had the auto-inc address optimization applied
9977      to it, and INSN occurs between the giv insn and the biv
9978      insn, then we'd have to adjust the value used here.
9979      This is rare, so we don't bother to make this possible.  */
9980   if (giv->auto_inc_opt
9981       && ((loop_insn_first_p (giv->insn, insn)
9982            && loop_insn_first_p (insn, biv->insn))
9983           || (loop_insn_first_p (biv->insn, insn)
9984               && loop_insn_first_p (insn, giv->insn))))
9985     return 0;
9986
9987   return 1;
9988 }
9989
9990 /* If BL appears in X (part of the pattern of INSN), see if we can
9991    eliminate its use.  If so, return 1.  If not, return 0.
9992
9993    If BIV does not appear in X, return 1.
9994
9995    If ELIMINATE_P is nonzero, actually do the elimination.
9996    WHERE_INSN/WHERE_BB indicate where extra insns should be added.
9997    Depending on how many items have been moved out of the loop, it
9998    will either be before INSN (when WHERE_INSN is nonzero) or at the
9999    start of the loop (when WHERE_INSN is zero).  */
10000
10001 static int
10002 maybe_eliminate_biv_1 (const struct loop *loop, rtx x, rtx insn,
10003                        struct iv_class *bl, int eliminate_p,
10004                        basic_block where_bb, rtx where_insn)
10005 {
10006   enum rtx_code code = GET_CODE (x);
10007   rtx reg = bl->biv->dest_reg;
10008   enum machine_mode mode = GET_MODE (reg);
10009   struct induction *v;
10010   rtx arg, tem;
10011 #ifdef HAVE_cc0
10012   rtx new;
10013 #endif
10014   int arg_operand;
10015   const char *fmt;
10016   int i, j;
10017
10018   switch (code)
10019     {
10020     case REG:
10021       /* If we haven't already been able to do something with this BIV,
10022          we can't eliminate it.  */
10023       if (x == reg)
10024         return 0;
10025       return 1;
10026
10027     case SET:
10028       /* If this sets the BIV, it is not a problem.  */
10029       if (SET_DEST (x) == reg)
10030         return 1;
10031
10032       /* If this is an insn that defines a giv, it is also ok because
10033          it will go away when the giv is reduced.  */
10034       for (v = bl->giv; v; v = v->next_iv)
10035         if (v->giv_type == DEST_REG && SET_DEST (x) == v->dest_reg)
10036           return 1;
10037
10038 #ifdef HAVE_cc0
10039       if (SET_DEST (x) == cc0_rtx && SET_SRC (x) == reg)
10040         {
10041           /* Can replace with any giv that was reduced and
10042              that has (MULT_VAL != 0) and (ADD_VAL == 0).
10043              Require a constant for MULT_VAL, so we know it's nonzero.
10044              ??? We disable this optimization to avoid potential
10045              overflows.  */
10046
10047           for (v = bl->giv; v; v = v->next_iv)
10048             if (GET_CODE (v->mult_val) == CONST_INT && v->mult_val != const0_rtx
10049                 && v->add_val == const0_rtx
10050                 && ! v->ignore && ! v->maybe_dead && v->always_computable
10051                 && v->mode == mode
10052                 && 0)
10053               {
10054                 if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
10055                   continue;
10056
10057                 if (! eliminate_p)
10058                   return 1;
10059
10060                 /* If the giv has the opposite direction of change,
10061                    then reverse the comparison.  */
10062                 if (INTVAL (v->mult_val) < 0)
10063                   new = gen_rtx_COMPARE (GET_MODE (v->new_reg),
10064                                          const0_rtx, v->new_reg);
10065                 else
10066                   new = v->new_reg;
10067
10068                 /* We can probably test that giv's reduced reg.  */
10069                 if (validate_change (insn, &SET_SRC (x), new, 0))
10070                   return 1;
10071               }
10072
10073           /* Look for a giv with (MULT_VAL != 0) and (ADD_VAL != 0);
10074              replace test insn with a compare insn (cmp REDUCED_GIV ADD_VAL).
10075              Require a constant for MULT_VAL, so we know it's nonzero.
10076              ??? Do this only if ADD_VAL is a pointer to avoid a potential
10077              overflow problem.  */
10078
10079           for (v = bl->giv; v; v = v->next_iv)
10080             if (GET_CODE (v->mult_val) == CONST_INT
10081                 && v->mult_val != const0_rtx
10082                 && ! v->ignore && ! v->maybe_dead && v->always_computable
10083                 && v->mode == mode
10084                 && (GET_CODE (v->add_val) == SYMBOL_REF
10085                     || GET_CODE (v->add_val) == LABEL_REF
10086                     || GET_CODE (v->add_val) == CONST
10087                     || (REG_P (v->add_val)
10088                         && REG_POINTER (v->add_val))))
10089               {
10090                 if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
10091                   continue;
10092
10093                 if (! eliminate_p)
10094                   return 1;
10095
10096                 /* If the giv has the opposite direction of change,
10097                    then reverse the comparison.  */
10098                 if (INTVAL (v->mult_val) < 0)
10099                   new = gen_rtx_COMPARE (VOIDmode, copy_rtx (v->add_val),
10100                                          v->new_reg);
10101                 else
10102                   new = gen_rtx_COMPARE (VOIDmode, v->new_reg,
10103                                          copy_rtx (v->add_val));
10104
10105                 /* Replace biv with the giv's reduced register.  */
10106                 update_reg_last_use (v->add_val, insn);
10107                 if (validate_change (insn, &SET_SRC (PATTERN (insn)), new, 0))
10108                   return 1;
10109
10110                 /* Insn doesn't support that constant or invariant.  Copy it
10111                    into a register (it will be a loop invariant.)  */
10112                 tem = gen_reg_rtx (GET_MODE (v->new_reg));
10113
10114                 loop_insn_emit_before (loop, 0, where_insn,
10115                                        gen_move_insn (tem,
10116                                                       copy_rtx (v->add_val)));
10117
10118                 /* Substitute the new register for its invariant value in
10119                    the compare expression.  */
10120                 XEXP (new, (INTVAL (v->mult_val) < 0) ? 0 : 1) = tem;
10121                 if (validate_change (insn, &SET_SRC (PATTERN (insn)), new, 0))
10122                   return 1;
10123               }
10124         }
10125 #endif
10126       break;
10127
10128     case COMPARE:
10129     case EQ:  case NE:
10130     case GT:  case GE:  case GTU:  case GEU:
10131     case LT:  case LE:  case LTU:  case LEU:
10132       /* See if either argument is the biv.  */
10133       if (XEXP (x, 0) == reg)
10134         arg = XEXP (x, 1), arg_operand = 1;
10135       else if (XEXP (x, 1) == reg)
10136         arg = XEXP (x, 0), arg_operand = 0;
10137       else
10138         break;
10139
10140       if (CONSTANT_P (arg))
10141         {
10142           /* First try to replace with any giv that has constant positive
10143              mult_val and constant add_val.  We might be able to support
10144              negative mult_val, but it seems complex to do it in general.  */
10145
10146           for (v = bl->giv; v; v = v->next_iv)
10147             if (GET_CODE (v->mult_val) == CONST_INT
10148                 && INTVAL (v->mult_val) > 0
10149                 && (GET_CODE (v->add_val) == SYMBOL_REF
10150                     || GET_CODE (v->add_val) == LABEL_REF
10151                     || GET_CODE (v->add_val) == CONST
10152                     || (REG_P (v->add_val)
10153                         && REG_POINTER (v->add_val)))
10154                 && ! v->ignore && ! v->maybe_dead && v->always_computable
10155                 && v->mode == mode)
10156               {
10157                 if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
10158                   continue;
10159
10160                 /* Don't eliminate if the linear combination that makes up
10161                    the giv overflows when it is applied to ARG.  */
10162                 if (GET_CODE (arg) == CONST_INT)
10163                   {
10164                     rtx add_val;
10165
10166                     if (GET_CODE (v->add_val) == CONST_INT)
10167                       add_val = v->add_val;
10168                     else
10169                       add_val = const0_rtx;
10170
10171                     if (const_mult_add_overflow_p (arg, v->mult_val,
10172                                                    add_val, mode, 1))
10173                       continue;
10174                   }
10175
10176                 if (! eliminate_p)
10177                   return 1;
10178
10179                 /* Replace biv with the giv's reduced reg.  */
10180                 validate_change (insn, &XEXP (x, 1 - arg_operand), v->new_reg, 1);
10181
10182                 /* If all constants are actually constant integers and
10183                    the derived constant can be directly placed in the COMPARE,
10184                    do so.  */
10185                 if (GET_CODE (arg) == CONST_INT
10186                     && GET_CODE (v->add_val) == CONST_INT)
10187                   {
10188                     tem = expand_mult_add (arg, NULL_RTX, v->mult_val,
10189                                            v->add_val, mode, 1);
10190                   }
10191                 else
10192                   {
10193                     /* Otherwise, load it into a register.  */
10194                     tem = gen_reg_rtx (mode);
10195                     loop_iv_add_mult_emit_before (loop, arg,
10196                                                   v->mult_val, v->add_val,
10197                                                   tem, where_bb, where_insn);
10198                   }
10199
10200                 validate_change (insn, &XEXP (x, arg_operand), tem, 1);
10201
10202                 if (apply_change_group ())
10203                   return 1;
10204               }
10205
10206           /* Look for giv with positive constant mult_val and nonconst add_val.
10207              Insert insns to calculate new compare value.
10208              ??? Turn this off due to possible overflow.  */
10209
10210           for (v = bl->giv; v; v = v->next_iv)
10211             if (GET_CODE (v->mult_val) == CONST_INT
10212                 && INTVAL (v->mult_val) > 0
10213                 && ! v->ignore && ! v->maybe_dead && v->always_computable
10214                 && v->mode == mode
10215                 && 0)
10216               {
10217                 rtx tem;
10218
10219                 if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
10220                   continue;
10221
10222                 if (! eliminate_p)
10223                   return 1;
10224
10225                 tem = gen_reg_rtx (mode);
10226
10227                 /* Replace biv with giv's reduced register.  */
10228                 validate_change (insn, &XEXP (x, 1 - arg_operand),
10229                                  v->new_reg, 1);
10230
10231                 /* Compute value to compare against.  */
10232                 loop_iv_add_mult_emit_before (loop, arg,
10233                                               v->mult_val, v->add_val,
10234                                               tem, where_bb, where_insn);
10235                 /* Use it in this insn.  */
10236                 validate_change (insn, &XEXP (x, arg_operand), tem, 1);
10237                 if (apply_change_group ())
10238                   return 1;
10239               }
10240         }
10241       else if (REG_P (arg) || MEM_P (arg))
10242         {
10243           if (loop_invariant_p (loop, arg) == 1)
10244             {
10245               /* Look for giv with constant positive mult_val and nonconst
10246                  add_val. Insert insns to compute new compare value.
10247                  ??? Turn this off due to possible overflow.  */
10248
10249               for (v = bl->giv; v; v = v->next_iv)
10250                 if (GET_CODE (v->mult_val) == CONST_INT && INTVAL (v->mult_val) > 0
10251                     && ! v->ignore && ! v->maybe_dead && v->always_computable
10252                     && v->mode == mode
10253                     && 0)
10254                   {
10255                     rtx tem;
10256
10257                     if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
10258                       continue;
10259
10260                     if (! eliminate_p)
10261                       return 1;
10262
10263                     tem = gen_reg_rtx (mode);
10264
10265                     /* Replace biv with giv's reduced register.  */
10266                     validate_change (insn, &XEXP (x, 1 - arg_operand),
10267                                      v->new_reg, 1);
10268
10269                     /* Compute value to compare against.  */
10270                     loop_iv_add_mult_emit_before (loop, arg,
10271                                                   v->mult_val, v->add_val,
10272                                                   tem, where_bb, where_insn);
10273                     validate_change (insn, &XEXP (x, arg_operand), tem, 1);
10274                     if (apply_change_group ())
10275                       return 1;
10276                   }
10277             }
10278
10279           /* This code has problems.  Basically, you can't know when
10280              seeing if we will eliminate BL, whether a particular giv
10281              of ARG will be reduced.  If it isn't going to be reduced,
10282              we can't eliminate BL.  We can try forcing it to be reduced,
10283              but that can generate poor code.
10284
10285              The problem is that the benefit of reducing TV, below should
10286              be increased if BL can actually be eliminated, but this means
10287              we might have to do a topological sort of the order in which
10288              we try to process biv.  It doesn't seem worthwhile to do
10289              this sort of thing now.  */
10290
10291 #if 0
10292           /* Otherwise the reg compared with had better be a biv.  */
10293           if (!REG_P (arg)
10294               || REG_IV_TYPE (ivs, REGNO (arg)) != BASIC_INDUCT)
10295             return 0;
10296
10297           /* Look for a pair of givs, one for each biv,
10298              with identical coefficients.  */
10299           for (v = bl->giv; v; v = v->next_iv)
10300             {
10301               struct induction *tv;
10302
10303               if (v->ignore || v->maybe_dead || v->mode != mode)
10304                 continue;
10305
10306               for (tv = REG_IV_CLASS (ivs, REGNO (arg))->giv; tv;
10307                    tv = tv->next_iv)
10308                 if (! tv->ignore && ! tv->maybe_dead
10309                     && rtx_equal_p (tv->mult_val, v->mult_val)
10310                     && rtx_equal_p (tv->add_val, v->add_val)
10311                     && tv->mode == mode)
10312                   {
10313                     if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
10314                       continue;
10315
10316                     if (! eliminate_p)
10317                       return 1;
10318
10319                     /* Replace biv with its giv's reduced reg.  */
10320                     XEXP (x, 1 - arg_operand) = v->new_reg;
10321                     /* Replace other operand with the other giv's
10322                        reduced reg.  */
10323                     XEXP (x, arg_operand) = tv->new_reg;
10324                     return 1;
10325                   }
10326             }
10327 #endif
10328         }
10329
10330       /* If we get here, the biv can't be eliminated.  */
10331       return 0;
10332
10333     case MEM:
10334       /* If this address is a DEST_ADDR giv, it doesn't matter if the
10335          biv is used in it, since it will be replaced.  */
10336       for (v = bl->giv; v; v = v->next_iv)
10337         if (v->giv_type == DEST_ADDR && v->location == &XEXP (x, 0))
10338           return 1;
10339       break;
10340
10341     default:
10342       break;
10343     }
10344
10345   /* See if any subexpression fails elimination.  */
10346   fmt = GET_RTX_FORMAT (code);
10347   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
10348     {
10349       switch (fmt[i])
10350         {
10351         case 'e':
10352           if (! maybe_eliminate_biv_1 (loop, XEXP (x, i), insn, bl,
10353                                        eliminate_p, where_bb, where_insn))
10354             return 0;
10355           break;
10356
10357         case 'E':
10358           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
10359             if (! maybe_eliminate_biv_1 (loop, XVECEXP (x, i, j), insn, bl,
10360                                          eliminate_p, where_bb, where_insn))
10361               return 0;
10362           break;
10363         }
10364     }
10365
10366   return 1;
10367 }
10368 \f
10369 /* Return nonzero if the last use of REG
10370    is in an insn following INSN in the same basic block.  */
10371
10372 static int
10373 last_use_this_basic_block (rtx reg, rtx insn)
10374 {
10375   rtx n;
10376   for (n = insn;
10377        n && !LABEL_P (n) && !JUMP_P (n);
10378        n = NEXT_INSN (n))
10379     {
10380       if (REGNO_LAST_UID (REGNO (reg)) == INSN_UID (n))
10381         return 1;
10382     }
10383   return 0;
10384 }
10385 \f
10386 /* Called via `note_stores' to record the initial value of a biv.  Here we
10387    just record the location of the set and process it later.  */
10388
10389 static void
10390 record_initial (rtx dest, rtx set, void *data ATTRIBUTE_UNUSED)
10391 {
10392   struct loop_ivs *ivs = (struct loop_ivs *) data;
10393   struct iv_class *bl;
10394
10395   if (!REG_P (dest)
10396       || REGNO (dest) >= ivs->n_regs
10397       || REG_IV_TYPE (ivs, REGNO (dest)) != BASIC_INDUCT)
10398     return;
10399
10400   bl = REG_IV_CLASS (ivs, REGNO (dest));
10401
10402   /* If this is the first set found, record it.  */
10403   if (bl->init_insn == 0)
10404     {
10405       bl->init_insn = note_insn;
10406       bl->init_set = set;
10407     }
10408 }
10409 \f
10410 /* If any of the registers in X are "old" and currently have a last use earlier
10411    than INSN, update them to have a last use of INSN.  Their actual last use
10412    will be the previous insn but it will not have a valid uid_luid so we can't
10413    use it.  X must be a source expression only.  */
10414
10415 static void
10416 update_reg_last_use (rtx x, rtx insn)
10417 {
10418   /* Check for the case where INSN does not have a valid luid.  In this case,
10419      there is no need to modify the regno_last_uid, as this can only happen
10420      when code is inserted after the loop_end to set a pseudo's final value,
10421      and hence this insn will never be the last use of x.
10422      ???? This comment is not correct.  See for example loop_givs_reduce.
10423      This may insert an insn before another new insn.  */
10424   if (REG_P (x) && REGNO (x) < max_reg_before_loop
10425       && INSN_UID (insn) < max_uid_for_loop
10426       && REGNO_LAST_LUID (REGNO (x)) < INSN_LUID (insn))
10427     {
10428       REGNO_LAST_UID (REGNO (x)) = INSN_UID (insn);
10429     }
10430   else
10431     {
10432       int i, j;
10433       const char *fmt = GET_RTX_FORMAT (GET_CODE (x));
10434       for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
10435         {
10436           if (fmt[i] == 'e')
10437             update_reg_last_use (XEXP (x, i), insn);
10438           else if (fmt[i] == 'E')
10439             for (j = XVECLEN (x, i) - 1; j >= 0; j--)
10440               update_reg_last_use (XVECEXP (x, i, j), insn);
10441         }
10442     }
10443 }
10444 \f
10445 /* Similar to rtlanal.c:get_condition, except that we also put an
10446    invariant last unless both operands are invariants.  */
10447
10448 static rtx
10449 get_condition_for_loop (const struct loop *loop, rtx x)
10450 {
10451   rtx comparison = get_condition (x, (rtx*) 0, false, true);
10452
10453   if (comparison == 0
10454       || ! loop_invariant_p (loop, XEXP (comparison, 0))
10455       || loop_invariant_p (loop, XEXP (comparison, 1)))
10456     return comparison;
10457
10458   return gen_rtx_fmt_ee (swap_condition (GET_CODE (comparison)), VOIDmode,
10459                          XEXP (comparison, 1), XEXP (comparison, 0));
10460 }
10461
10462 /* Scan the function and determine whether it has indirect (computed) jumps.
10463
10464    This is taken mostly from flow.c; similar code exists elsewhere
10465    in the compiler.  It may be useful to put this into rtlanal.c.  */
10466 static int
10467 indirect_jump_in_function_p (rtx start)
10468 {
10469   rtx insn;
10470
10471   for (insn = start; insn; insn = NEXT_INSN (insn))
10472     if (computed_jump_p (insn))
10473       return 1;
10474
10475   return 0;
10476 }
10477
10478 /* Add MEM to the LOOP_MEMS array, if appropriate.  See the
10479    documentation for LOOP_MEMS for the definition of `appropriate'.
10480    This function is called from prescan_loop via for_each_rtx.  */
10481
10482 static int
10483 insert_loop_mem (rtx *mem, void *data ATTRIBUTE_UNUSED)
10484 {
10485   struct loop_info *loop_info = data;
10486   int i;
10487   rtx m = *mem;
10488
10489   if (m == NULL_RTX)
10490     return 0;
10491
10492   switch (GET_CODE (m))
10493     {
10494     case MEM:
10495       break;
10496
10497     case CLOBBER:
10498       /* We're not interested in MEMs that are only clobbered.  */
10499       return -1;
10500
10501     case CONST_DOUBLE:
10502       /* We're not interested in the MEM associated with a
10503          CONST_DOUBLE, so there's no need to traverse into this.  */
10504       return -1;
10505
10506     case EXPR_LIST:
10507       /* We're not interested in any MEMs that only appear in notes.  */
10508       return -1;
10509
10510     default:
10511       /* This is not a MEM.  */
10512       return 0;
10513     }
10514
10515   /* See if we've already seen this MEM.  */
10516   for (i = 0; i < loop_info->mems_idx; ++i)
10517     if (rtx_equal_p (m, loop_info->mems[i].mem))
10518       {
10519         if (MEM_VOLATILE_P (m) && !MEM_VOLATILE_P (loop_info->mems[i].mem))
10520           loop_info->mems[i].mem = m;
10521         if (GET_MODE (m) != GET_MODE (loop_info->mems[i].mem))
10522           /* The modes of the two memory accesses are different.  If
10523              this happens, something tricky is going on, and we just
10524              don't optimize accesses to this MEM.  */
10525           loop_info->mems[i].optimize = 0;
10526
10527         return 0;
10528       }
10529
10530   /* Resize the array, if necessary.  */
10531   if (loop_info->mems_idx == loop_info->mems_allocated)
10532     {
10533       if (loop_info->mems_allocated != 0)
10534         loop_info->mems_allocated *= 2;
10535       else
10536         loop_info->mems_allocated = 32;
10537
10538       loop_info->mems = xrealloc (loop_info->mems,
10539                                   loop_info->mems_allocated * sizeof (loop_mem_info));
10540     }
10541
10542   /* Actually insert the MEM.  */
10543   loop_info->mems[loop_info->mems_idx].mem = m;
10544   /* We can't hoist this MEM out of the loop if it's a BLKmode MEM
10545      because we can't put it in a register.  We still store it in the
10546      table, though, so that if we see the same address later, but in a
10547      non-BLK mode, we'll not think we can optimize it at that point.  */
10548   loop_info->mems[loop_info->mems_idx].optimize = (GET_MODE (m) != BLKmode);
10549   loop_info->mems[loop_info->mems_idx].reg = NULL_RTX;
10550   ++loop_info->mems_idx;
10551
10552   return 0;
10553 }
10554
10555
10556 /* Allocate REGS->ARRAY or reallocate it if it is too small.
10557
10558    Increment REGS->ARRAY[I].SET_IN_LOOP at the index I of each
10559    register that is modified by an insn between FROM and TO.  If the
10560    value of an element of REGS->array[I].SET_IN_LOOP becomes 127 or
10561    more, stop incrementing it, to avoid overflow.
10562
10563    Store in REGS->ARRAY[I].SINGLE_USAGE the single insn in which
10564    register I is used, if it is only used once.  Otherwise, it is set
10565    to 0 (for no uses) or const0_rtx for more than one use.  This
10566    parameter may be zero, in which case this processing is not done.
10567
10568    Set REGS->ARRAY[I].MAY_NOT_OPTIMIZE nonzero if we should not
10569    optimize register I.  */
10570
10571 static void
10572 loop_regs_scan (const struct loop *loop, int extra_size)
10573 {
10574   struct loop_regs *regs = LOOP_REGS (loop);
10575   int old_nregs;
10576   /* last_set[n] is nonzero iff reg n has been set in the current
10577    basic block.  In that case, it is the insn that last set reg n.  */
10578   rtx *last_set;
10579   rtx insn;
10580   int i;
10581
10582   old_nregs = regs->num;
10583   regs->num = max_reg_num ();
10584
10585   /* Grow the regs array if not allocated or too small.  */
10586   if (regs->num >= regs->size)
10587     {
10588       regs->size = regs->num + extra_size;
10589
10590       regs->array = xrealloc (regs->array, regs->size * sizeof (*regs->array));
10591
10592       /* Zero the new elements.  */
10593       memset (regs->array + old_nregs, 0,
10594               (regs->size - old_nregs) * sizeof (*regs->array));
10595     }
10596
10597   /* Clear previously scanned fields but do not clear n_times_set.  */
10598   for (i = 0; i < old_nregs; i++)
10599     {
10600       regs->array[i].set_in_loop = 0;
10601       regs->array[i].may_not_optimize = 0;
10602       regs->array[i].single_usage = NULL_RTX;
10603     }
10604
10605   last_set = xcalloc (regs->num, sizeof (rtx));
10606
10607   /* Scan the loop, recording register usage.  */
10608   for (insn = loop->top ? loop->top : loop->start; insn != loop->end;
10609        insn = NEXT_INSN (insn))
10610     {
10611       if (INSN_P (insn))
10612         {
10613           /* Record registers that have exactly one use.  */
10614           find_single_use_in_loop (regs, insn, PATTERN (insn));
10615
10616           /* Include uses in REG_EQUAL notes.  */
10617           if (REG_NOTES (insn))
10618             find_single_use_in_loop (regs, insn, REG_NOTES (insn));
10619
10620           if (GET_CODE (PATTERN (insn)) == SET
10621               || GET_CODE (PATTERN (insn)) == CLOBBER)
10622             count_one_set (regs, insn, PATTERN (insn), last_set);
10623           else if (GET_CODE (PATTERN (insn)) == PARALLEL)
10624             {
10625               int i;
10626               for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
10627                 count_one_set (regs, insn, XVECEXP (PATTERN (insn), 0, i),
10628                                last_set);
10629             }
10630         }
10631
10632       if (LABEL_P (insn) || JUMP_P (insn))
10633         memset (last_set, 0, regs->num * sizeof (rtx));
10634
10635       /* Invalidate all registers used for function argument passing.
10636          We check rtx_varies_p for the same reason as below, to allow
10637          optimizing PIC calculations.  */
10638       if (CALL_P (insn))
10639         {
10640           rtx link;
10641           for (link = CALL_INSN_FUNCTION_USAGE (insn);
10642                link;
10643                link = XEXP (link, 1))
10644             {
10645               rtx op, reg;
10646
10647               if (GET_CODE (op = XEXP (link, 0)) == USE
10648                   && REG_P (reg = XEXP (op, 0))
10649                   && rtx_varies_p (reg, 1))
10650                 regs->array[REGNO (reg)].may_not_optimize = 1;
10651             }
10652         }
10653     }
10654
10655   /* Invalidate all hard registers clobbered by calls.  With one exception:
10656      a call-clobbered PIC register is still function-invariant for our
10657      purposes, since we can hoist any PIC calculations out of the loop.
10658      Thus the call to rtx_varies_p.  */
10659   if (LOOP_INFO (loop)->has_call)
10660     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
10661       if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i)
10662           && rtx_varies_p (regno_reg_rtx[i], 1))
10663         {
10664           regs->array[i].may_not_optimize = 1;
10665           regs->array[i].set_in_loop = 1;
10666         }
10667
10668 #ifdef AVOID_CCMODE_COPIES
10669   /* Don't try to move insns which set CC registers if we should not
10670      create CCmode register copies.  */
10671   for (i = regs->num - 1; i >= FIRST_PSEUDO_REGISTER; i--)
10672     if (GET_MODE_CLASS (GET_MODE (regno_reg_rtx[i])) == MODE_CC)
10673       regs->array[i].may_not_optimize = 1;
10674 #endif
10675
10676   /* Set regs->array[I].n_times_set for the new registers.  */
10677   for (i = old_nregs; i < regs->num; i++)
10678     regs->array[i].n_times_set = regs->array[i].set_in_loop;
10679
10680   free (last_set);
10681 }
10682
10683 /* Returns the number of real INSNs in the LOOP.  */
10684
10685 static int
10686 count_insns_in_loop (const struct loop *loop)
10687 {
10688   int count = 0;
10689   rtx insn;
10690
10691   for (insn = loop->top ? loop->top : loop->start; insn != loop->end;
10692        insn = NEXT_INSN (insn))
10693     if (INSN_P (insn))
10694       ++count;
10695
10696   return count;
10697 }
10698
10699 /* Move MEMs into registers for the duration of the loop.  */
10700
10701 static void
10702 load_mems (const struct loop *loop)
10703 {
10704   struct loop_info *loop_info = LOOP_INFO (loop);
10705   struct loop_regs *regs = LOOP_REGS (loop);
10706   int maybe_never = 0;
10707   int i;
10708   rtx p, prev_ebb_head;
10709   rtx label = NULL_RTX;
10710   rtx end_label;
10711   /* Nonzero if the next instruction may never be executed.  */
10712   int next_maybe_never = 0;
10713   unsigned int last_max_reg = max_reg_num ();
10714
10715   if (loop_info->mems_idx == 0)
10716     return;
10717
10718   /* We cannot use next_label here because it skips over normal insns.  */
10719   end_label = next_nonnote_insn (loop->end);
10720   if (end_label && !LABEL_P (end_label))
10721     end_label = NULL_RTX;
10722
10723   /* Check to see if it's possible that some instructions in the loop are
10724      never executed.  Also check if there is a goto out of the loop other
10725      than right after the end of the loop.  */
10726   for (p = next_insn_in_loop (loop, loop->scan_start);
10727        p != NULL_RTX;
10728        p = next_insn_in_loop (loop, p))
10729     {
10730       if (LABEL_P (p))
10731         maybe_never = 1;
10732       else if (JUMP_P (p)
10733                /* If we enter the loop in the middle, and scan
10734                   around to the beginning, don't set maybe_never
10735                   for that.  This must be an unconditional jump,
10736                   otherwise the code at the top of the loop might
10737                   never be executed.  Unconditional jumps are
10738                   followed a by barrier then loop end.  */
10739                && ! (JUMP_P (p)
10740                      && JUMP_LABEL (p) == loop->top
10741                      && NEXT_INSN (NEXT_INSN (p)) == loop->end
10742                      && any_uncondjump_p (p)))
10743         {
10744           /* If this is a jump outside of the loop but not right
10745              after the end of the loop, we would have to emit new fixup
10746              sequences for each such label.  */
10747           if (/* If we can't tell where control might go when this
10748                  JUMP_INSN is executed, we must be conservative.  */
10749               !JUMP_LABEL (p)
10750               || (JUMP_LABEL (p) != end_label
10751                   && (INSN_UID (JUMP_LABEL (p)) >= max_uid_for_loop
10752                       || INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (loop->start)
10753                       || INSN_LUID (JUMP_LABEL (p)) > INSN_LUID (loop->end))))
10754             return;
10755
10756           if (!any_condjump_p (p))
10757             /* Something complicated.  */
10758             maybe_never = 1;
10759           else
10760             /* If there are any more instructions in the loop, they
10761                might not be reached.  */
10762             next_maybe_never = 1;
10763         }
10764       else if (next_maybe_never)
10765         maybe_never = 1;
10766     }
10767
10768   /* Find start of the extended basic block that enters the loop.  */
10769   for (p = loop->start;
10770        PREV_INSN (p) && !LABEL_P (p);
10771        p = PREV_INSN (p))
10772     ;
10773   prev_ebb_head = p;
10774
10775   cselib_init (true);
10776
10777   /* Build table of mems that get set to constant values before the
10778      loop.  */
10779   for (; p != loop->start; p = NEXT_INSN (p))
10780     cselib_process_insn (p);
10781
10782   /* Actually move the MEMs.  */
10783   for (i = 0; i < loop_info->mems_idx; ++i)
10784     {
10785       regset_head load_copies;
10786       regset_head store_copies;
10787       int written = 0;
10788       rtx reg;
10789       rtx mem = loop_info->mems[i].mem;
10790       rtx mem_list_entry;
10791
10792       if (MEM_VOLATILE_P (mem)
10793           || loop_invariant_p (loop, XEXP (mem, 0)) != 1)
10794         /* There's no telling whether or not MEM is modified.  */
10795         loop_info->mems[i].optimize = 0;
10796
10797       /* Go through the MEMs written to in the loop to see if this
10798          one is aliased by one of them.  */
10799       mem_list_entry = loop_info->store_mems;
10800       while (mem_list_entry)
10801         {
10802           if (rtx_equal_p (mem, XEXP (mem_list_entry, 0)))
10803             written = 1;
10804           else if (true_dependence (XEXP (mem_list_entry, 0), VOIDmode,
10805                                     mem, rtx_varies_p))
10806             {
10807               /* MEM is indeed aliased by this store.  */
10808               loop_info->mems[i].optimize = 0;
10809               break;
10810             }
10811           mem_list_entry = XEXP (mem_list_entry, 1);
10812         }
10813
10814       if (flag_float_store && written
10815           && GET_MODE_CLASS (GET_MODE (mem)) == MODE_FLOAT)
10816         loop_info->mems[i].optimize = 0;
10817
10818       /* If this MEM is written to, we must be sure that there
10819          are no reads from another MEM that aliases this one.  */
10820       if (loop_info->mems[i].optimize && written)
10821         {
10822           int j;
10823
10824           for (j = 0; j < loop_info->mems_idx; ++j)
10825             {
10826               if (j == i)
10827                 continue;
10828               else if (true_dependence (mem,
10829                                         VOIDmode,
10830                                         loop_info->mems[j].mem,
10831                                         rtx_varies_p))
10832                 {
10833                   /* It's not safe to hoist loop_info->mems[i] out of
10834                      the loop because writes to it might not be
10835                      seen by reads from loop_info->mems[j].  */
10836                   loop_info->mems[i].optimize = 0;
10837                   break;
10838                 }
10839             }
10840         }
10841
10842       if (maybe_never && may_trap_p (mem))
10843         /* We can't access the MEM outside the loop; it might
10844            cause a trap that wouldn't have happened otherwise.  */
10845         loop_info->mems[i].optimize = 0;
10846
10847       if (!loop_info->mems[i].optimize)
10848         /* We thought we were going to lift this MEM out of the
10849            loop, but later discovered that we could not.  */
10850         continue;
10851
10852       INIT_REG_SET (&load_copies);
10853       INIT_REG_SET (&store_copies);
10854
10855       /* Allocate a pseudo for this MEM.  We set REG_USERVAR_P in
10856          order to keep scan_loop from moving stores to this MEM
10857          out of the loop just because this REG is neither a
10858          user-variable nor used in the loop test.  */
10859       reg = gen_reg_rtx (GET_MODE (mem));
10860       REG_USERVAR_P (reg) = 1;
10861       loop_info->mems[i].reg = reg;
10862
10863       /* Now, replace all references to the MEM with the
10864          corresponding pseudos.  */
10865       maybe_never = 0;
10866       for (p = next_insn_in_loop (loop, loop->scan_start);
10867            p != NULL_RTX;
10868            p = next_insn_in_loop (loop, p))
10869         {
10870           if (INSN_P (p))
10871             {
10872               rtx set;
10873
10874               set = single_set (p);
10875
10876               /* See if this copies the mem into a register that isn't
10877                  modified afterwards.  We'll try to do copy propagation
10878                  a little further on.  */
10879               if (set
10880                   /* @@@ This test is _way_ too conservative.  */
10881                   && ! maybe_never
10882                   && REG_P (SET_DEST (set))
10883                   && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER
10884                   && REGNO (SET_DEST (set)) < last_max_reg
10885                   && regs->array[REGNO (SET_DEST (set))].n_times_set == 1
10886                   && rtx_equal_p (SET_SRC (set), mem))
10887                 SET_REGNO_REG_SET (&load_copies, REGNO (SET_DEST (set)));
10888
10889               /* See if this copies the mem from a register that isn't
10890                  modified afterwards.  We'll try to remove the
10891                  redundant copy later on by doing a little register
10892                  renaming and copy propagation.   This will help
10893                  to untangle things for the BIV detection code.  */
10894               if (set
10895                   && ! maybe_never
10896                   && REG_P (SET_SRC (set))
10897                   && REGNO (SET_SRC (set)) >= FIRST_PSEUDO_REGISTER
10898                   && REGNO (SET_SRC (set)) < last_max_reg
10899                   && regs->array[REGNO (SET_SRC (set))].n_times_set == 1
10900                   && rtx_equal_p (SET_DEST (set), mem))
10901                 SET_REGNO_REG_SET (&store_copies, REGNO (SET_SRC (set)));
10902
10903               /* If this is a call which uses / clobbers this memory
10904                  location, we must not change the interface here.  */
10905               if (CALL_P (p)
10906                   && reg_mentioned_p (loop_info->mems[i].mem,
10907                                       CALL_INSN_FUNCTION_USAGE (p)))
10908                 {
10909                   cancel_changes (0);
10910                   loop_info->mems[i].optimize = 0;
10911                   break;
10912                 }
10913               else
10914                 /* Replace the memory reference with the shadow register.  */
10915                 replace_loop_mems (p, loop_info->mems[i].mem,
10916                                    loop_info->mems[i].reg, written);
10917             }
10918
10919           if (LABEL_P (p)
10920               || JUMP_P (p))
10921             maybe_never = 1;
10922         }
10923
10924       if (! loop_info->mems[i].optimize)
10925         ; /* We found we couldn't do the replacement, so do nothing.  */
10926       else if (! apply_change_group ())
10927         /* We couldn't replace all occurrences of the MEM.  */
10928         loop_info->mems[i].optimize = 0;
10929       else
10930         {
10931           /* Load the memory immediately before LOOP->START, which is
10932              the NOTE_LOOP_BEG.  */
10933           cselib_val *e = cselib_lookup (mem, VOIDmode, 0);
10934           rtx set;
10935           rtx best = mem;
10936           unsigned j;
10937           struct elt_loc_list *const_equiv = 0;
10938           reg_set_iterator rsi;
10939
10940           if (e)
10941             {
10942               struct elt_loc_list *equiv;
10943               struct elt_loc_list *best_equiv = 0;
10944               for (equiv = e->locs; equiv; equiv = equiv->next)
10945                 {
10946                   if (CONSTANT_P (equiv->loc))
10947                     const_equiv = equiv;
10948                   else if (REG_P (equiv->loc)
10949                            /* Extending hard register lifetimes causes crash
10950                               on SRC targets.  Doing so on non-SRC is
10951                               probably also not good idea, since we most
10952                               probably have pseudoregister equivalence as
10953                               well.  */
10954                            && REGNO (equiv->loc) >= FIRST_PSEUDO_REGISTER)
10955                     best_equiv = equiv;
10956                 }
10957               /* Use the constant equivalence if that is cheap enough.  */
10958               if (! best_equiv)
10959                 best_equiv = const_equiv;
10960               else if (const_equiv
10961                        && (rtx_cost (const_equiv->loc, SET)
10962                            <= rtx_cost (best_equiv->loc, SET)))
10963                 {
10964                   best_equiv = const_equiv;
10965                   const_equiv = 0;
10966                 }
10967
10968               /* If best_equiv is nonzero, we know that MEM is set to a
10969                  constant or register before the loop.  We will use this
10970                  knowledge to initialize the shadow register with that
10971                  constant or reg rather than by loading from MEM.  */
10972               if (best_equiv)
10973                 best = copy_rtx (best_equiv->loc);
10974             }
10975
10976           set = gen_move_insn (reg, best);
10977           set = loop_insn_hoist (loop, set);
10978           if (REG_P (best))
10979             {
10980               for (p = prev_ebb_head; p != loop->start; p = NEXT_INSN (p))
10981                 if (REGNO_LAST_UID (REGNO (best)) == INSN_UID (p))
10982                   {
10983                     REGNO_LAST_UID (REGNO (best)) = INSN_UID (set);
10984                     break;
10985                   }
10986             }
10987
10988           if (const_equiv)
10989             set_unique_reg_note (set, REG_EQUAL, copy_rtx (const_equiv->loc));
10990
10991           if (written)
10992             {
10993               if (label == NULL_RTX)
10994                 {
10995                   label = gen_label_rtx ();
10996                   emit_label_after (label, loop->end);
10997                 }
10998
10999               /* Store the memory immediately after END, which is
11000                  the NOTE_LOOP_END.  */
11001               set = gen_move_insn (copy_rtx (mem), reg);
11002               loop_insn_emit_after (loop, 0, label, set);
11003             }
11004
11005           if (loop_dump_stream)
11006             {
11007               fprintf (loop_dump_stream, "Hoisted regno %d %s from ",
11008                        REGNO (reg), (written ? "r/w" : "r/o"));
11009               print_rtl (loop_dump_stream, mem);
11010               fputc ('\n', loop_dump_stream);
11011             }
11012
11013           /* Attempt a bit of copy propagation.  This helps untangle the
11014              data flow, and enables {basic,general}_induction_var to find
11015              more bivs/givs.  */
11016           EXECUTE_IF_SET_IN_REG_SET
11017             (&load_copies, FIRST_PSEUDO_REGISTER, j, rsi)
11018             {
11019               try_copy_prop (loop, reg, j);
11020             }
11021           CLEAR_REG_SET (&load_copies);
11022
11023           EXECUTE_IF_SET_IN_REG_SET
11024             (&store_copies, FIRST_PSEUDO_REGISTER, j, rsi)
11025             {
11026               try_swap_copy_prop (loop, reg, j);
11027             }
11028           CLEAR_REG_SET (&store_copies);
11029         }
11030     }
11031
11032   /* Now, we need to replace all references to the previous exit
11033      label with the new one.  */
11034   if (label != NULL_RTX && end_label != NULL_RTX)
11035     for (p = loop->start; p != loop->end; p = NEXT_INSN (p))
11036       if (JUMP_P (p) && JUMP_LABEL (p) == end_label)
11037         redirect_jump (p, label, false);
11038
11039   cselib_finish ();
11040 }
11041
11042 /* For communication between note_reg_stored and its caller.  */
11043 struct note_reg_stored_arg
11044 {
11045   int set_seen;
11046   rtx reg;
11047 };
11048
11049 /* Called via note_stores, record in SET_SEEN whether X, which is written,
11050    is equal to ARG.  */
11051 static void
11052 note_reg_stored (rtx x, rtx setter ATTRIBUTE_UNUSED, void *arg)
11053 {
11054   struct note_reg_stored_arg *t = (struct note_reg_stored_arg *) arg;
11055   if (t->reg == x)
11056     t->set_seen = 1;
11057 }
11058
11059 /* Try to replace every occurrence of pseudo REGNO with REPLACEMENT.
11060    There must be exactly one insn that sets this pseudo; it will be
11061    deleted if all replacements succeed and we can prove that the register
11062    is not used after the loop.  */
11063
11064 static void
11065 try_copy_prop (const struct loop *loop, rtx replacement, unsigned int regno)
11066 {
11067   /* This is the reg that we are copying from.  */
11068   rtx reg_rtx = regno_reg_rtx[regno];
11069   rtx init_insn = 0;
11070   rtx insn;
11071   /* These help keep track of whether we replaced all uses of the reg.  */
11072   int replaced_last = 0;
11073   int store_is_first = 0;
11074
11075   for (insn = next_insn_in_loop (loop, loop->scan_start);
11076        insn != NULL_RTX;
11077        insn = next_insn_in_loop (loop, insn))
11078     {
11079       rtx set;
11080
11081       /* Only substitute within one extended basic block from the initializing
11082          insn.  */
11083       if (LABEL_P (insn) && init_insn)
11084         break;
11085
11086       if (! INSN_P (insn))
11087         continue;
11088
11089       /* Is this the initializing insn?  */
11090       set = single_set (insn);
11091       if (set
11092           && REG_P (SET_DEST (set))
11093           && REGNO (SET_DEST (set)) == regno)
11094         {
11095           if (init_insn)
11096             abort ();
11097
11098           init_insn = insn;
11099           if (REGNO_FIRST_UID (regno) == INSN_UID (insn))
11100             store_is_first = 1;
11101         }
11102
11103       /* Only substitute after seeing the initializing insn.  */
11104       if (init_insn && insn != init_insn)
11105         {
11106           struct note_reg_stored_arg arg;
11107
11108           replace_loop_regs (insn, reg_rtx, replacement);
11109           if (REGNO_LAST_UID (regno) == INSN_UID (insn))
11110             replaced_last = 1;
11111
11112           /* Stop replacing when REPLACEMENT is modified.  */
11113           arg.reg = replacement;
11114           arg.set_seen = 0;
11115           note_stores (PATTERN (insn), note_reg_stored, &arg);
11116           if (arg.set_seen)
11117             {
11118               rtx note = find_reg_note (insn, REG_EQUAL, NULL);
11119
11120               /* It is possible that we've turned previously valid REG_EQUAL to
11121                  invalid, as we change the REGNO to REPLACEMENT and unlike REGNO,
11122                  REPLACEMENT is modified, we get different meaning.  */
11123               if (note && reg_mentioned_p (replacement, XEXP (note, 0)))
11124                 remove_note (insn, note);
11125               break;
11126             }
11127         }
11128     }
11129   if (! init_insn)
11130     abort ();
11131   if (apply_change_group ())
11132     {
11133       if (loop_dump_stream)
11134         fprintf (loop_dump_stream, "  Replaced reg %d", regno);
11135       if (store_is_first && replaced_last)
11136         {
11137           rtx first;
11138           rtx retval_note;
11139
11140           /* Assume we're just deleting INIT_INSN.  */
11141           first = init_insn;
11142           /* Look for REG_RETVAL note.  If we're deleting the end of
11143              the libcall sequence, the whole sequence can go.  */
11144           retval_note = find_reg_note (init_insn, REG_RETVAL, NULL_RTX);
11145           /* If we found a REG_RETVAL note, find the first instruction
11146              in the sequence.  */
11147           if (retval_note)
11148             first = XEXP (retval_note, 0);
11149
11150           /* Delete the instructions.  */
11151           loop_delete_insns (first, init_insn);
11152         }
11153       if (loop_dump_stream)
11154         fprintf (loop_dump_stream, ".\n");
11155     }
11156 }
11157
11158 /* Replace all the instructions from FIRST up to and including LAST
11159    with NOTE_INSN_DELETED notes.  */
11160
11161 static void
11162 loop_delete_insns (rtx first, rtx last)
11163 {
11164   while (1)
11165     {
11166       if (loop_dump_stream)
11167         fprintf (loop_dump_stream, ", deleting init_insn (%d)",
11168                  INSN_UID (first));
11169       delete_insn (first);
11170
11171       /* If this was the LAST instructions we're supposed to delete,
11172          we're done.  */
11173       if (first == last)
11174         break;
11175
11176       first = NEXT_INSN (first);
11177     }
11178 }
11179
11180 /* Try to replace occurrences of pseudo REGNO with REPLACEMENT within
11181    loop LOOP if the order of the sets of these registers can be
11182    swapped.  There must be exactly one insn within the loop that sets
11183    this pseudo followed immediately by a move insn that sets
11184    REPLACEMENT with REGNO.  */
11185 static void
11186 try_swap_copy_prop (const struct loop *loop, rtx replacement,
11187                     unsigned int regno)
11188 {
11189   rtx insn;
11190   rtx set = NULL_RTX;
11191   unsigned int new_regno;
11192
11193   new_regno = REGNO (replacement);
11194
11195   for (insn = next_insn_in_loop (loop, loop->scan_start);
11196        insn != NULL_RTX;
11197        insn = next_insn_in_loop (loop, insn))
11198     {
11199       /* Search for the insn that copies REGNO to NEW_REGNO?  */
11200       if (INSN_P (insn)
11201           && (set = single_set (insn))
11202           && REG_P (SET_DEST (set))
11203           && REGNO (SET_DEST (set)) == new_regno
11204           && REG_P (SET_SRC (set))
11205           && REGNO (SET_SRC (set)) == regno)
11206         break;
11207     }
11208
11209   if (insn != NULL_RTX)
11210     {
11211       rtx prev_insn;
11212       rtx prev_set;
11213
11214       /* Some DEF-USE info would come in handy here to make this
11215          function more general.  For now, just check the previous insn
11216          which is the most likely candidate for setting REGNO.  */
11217
11218       prev_insn = PREV_INSN (insn);
11219
11220       if (INSN_P (insn)
11221           && (prev_set = single_set (prev_insn))
11222           && REG_P (SET_DEST (prev_set))
11223           && REGNO (SET_DEST (prev_set)) == regno)
11224         {
11225           /* We have:
11226              (set (reg regno) (expr))
11227              (set (reg new_regno) (reg regno))
11228
11229              so try converting this to:
11230              (set (reg new_regno) (expr))
11231              (set (reg regno) (reg new_regno))
11232
11233              The former construct is often generated when a global
11234              variable used for an induction variable is shadowed by a
11235              register (NEW_REGNO).  The latter construct improves the
11236              chances of GIV replacement and BIV elimination.  */
11237
11238           validate_change (prev_insn, &SET_DEST (prev_set),
11239                            replacement, 1);
11240           validate_change (insn, &SET_DEST (set),
11241                            SET_SRC (set), 1);
11242           validate_change (insn, &SET_SRC (set),
11243                            replacement, 1);
11244
11245           if (apply_change_group ())
11246             {
11247               if (loop_dump_stream)
11248                 fprintf (loop_dump_stream,
11249                          "  Swapped set of reg %d at %d with reg %d at %d.\n",
11250                          regno, INSN_UID (insn),
11251                          new_regno, INSN_UID (prev_insn));
11252
11253               /* Update first use of REGNO.  */
11254               if (REGNO_FIRST_UID (regno) == INSN_UID (prev_insn))
11255                 REGNO_FIRST_UID (regno) = INSN_UID (insn);
11256
11257               /* Now perform copy propagation to hopefully
11258                  remove all uses of REGNO within the loop.  */
11259               try_copy_prop (loop, replacement, regno);
11260             }
11261         }
11262     }
11263 }
11264
11265 /* Worker function for find_mem_in_note, called via for_each_rtx.  */
11266
11267 static int
11268 find_mem_in_note_1 (rtx *x, void *data)
11269 {
11270   if (*x != NULL_RTX && MEM_P (*x))
11271     {
11272       rtx *res = (rtx *) data;
11273       *res = *x;
11274       return 1;
11275     }
11276   return 0;
11277 }
11278
11279 /* Returns the first MEM found in NOTE by depth-first search.  */
11280
11281 static rtx
11282 find_mem_in_note (rtx note)
11283 {
11284   if (note && for_each_rtx (&note, find_mem_in_note_1, &note))
11285     return note;
11286   return NULL_RTX;
11287 }
11288
11289 /* Replace MEM with its associated pseudo register.  This function is
11290    called from load_mems via for_each_rtx.  DATA is actually a pointer
11291    to a structure describing the instruction currently being scanned
11292    and the MEM we are currently replacing.  */
11293
11294 static int
11295 replace_loop_mem (rtx *mem, void *data)
11296 {
11297   loop_replace_args *args = (loop_replace_args *) data;
11298   rtx m = *mem;
11299
11300   if (m == NULL_RTX)
11301     return 0;
11302
11303   switch (GET_CODE (m))
11304     {
11305     case MEM:
11306       break;
11307
11308     case CONST_DOUBLE:
11309       /* We're not interested in the MEM associated with a
11310          CONST_DOUBLE, so there's no need to traverse into one.  */
11311       return -1;
11312
11313     default:
11314       /* This is not a MEM.  */
11315       return 0;
11316     }
11317
11318   if (!rtx_equal_p (args->match, m))
11319     /* This is not the MEM we are currently replacing.  */
11320     return 0;
11321
11322   /* Actually replace the MEM.  */
11323   validate_change (args->insn, mem, args->replacement, 1);
11324
11325   return 0;
11326 }
11327
11328 static void
11329 replace_loop_mems (rtx insn, rtx mem, rtx reg, int written)
11330 {
11331   loop_replace_args args;
11332
11333   args.insn = insn;
11334   args.match = mem;
11335   args.replacement = reg;
11336
11337   for_each_rtx (&insn, replace_loop_mem, &args);
11338
11339   /* If we hoist a mem write out of the loop, then REG_EQUAL
11340      notes referring to the mem are no longer valid.  */
11341   if (written)
11342     {
11343       rtx note, sub;
11344       rtx *link;
11345
11346       for (link = &REG_NOTES (insn); (note = *link); link = &XEXP (note, 1))
11347         {
11348           if (REG_NOTE_KIND (note) == REG_EQUAL
11349               && (sub = find_mem_in_note (note))
11350               && true_dependence (mem, VOIDmode, sub, rtx_varies_p))
11351             {
11352               /* Remove the note.  */
11353               validate_change (NULL_RTX, link, XEXP (note, 1), 1);
11354               break;
11355             }
11356         }
11357     }
11358 }
11359
11360 /* Replace one register with another.  Called through for_each_rtx; PX points
11361    to the rtx being scanned.  DATA is actually a pointer to
11362    a structure of arguments.  */
11363
11364 static int
11365 replace_loop_reg (rtx *px, void *data)
11366 {
11367   rtx x = *px;
11368   loop_replace_args *args = (loop_replace_args *) data;
11369
11370   if (x == NULL_RTX)
11371     return 0;
11372
11373   if (x == args->match)
11374     validate_change (args->insn, px, args->replacement, 1);
11375
11376   return 0;
11377 }
11378
11379 static void
11380 replace_loop_regs (rtx insn, rtx reg, rtx replacement)
11381 {
11382   loop_replace_args args;
11383
11384   args.insn = insn;
11385   args.match = reg;
11386   args.replacement = replacement;
11387
11388   for_each_rtx (&insn, replace_loop_reg, &args);
11389 }
11390 \f
11391 /* Emit insn for PATTERN after WHERE_INSN in basic block WHERE_BB
11392    (ignored in the interim).  */
11393
11394 static rtx
11395 loop_insn_emit_after (const struct loop *loop ATTRIBUTE_UNUSED,
11396                       basic_block where_bb ATTRIBUTE_UNUSED, rtx where_insn,
11397                       rtx pattern)
11398 {
11399   return emit_insn_after (pattern, where_insn);
11400 }
11401
11402
11403 /* If WHERE_INSN is nonzero emit insn for PATTERN before WHERE_INSN
11404    in basic block WHERE_BB (ignored in the interim) within the loop
11405    otherwise hoist PATTERN into the loop pre-header.  */
11406
11407 static rtx
11408 loop_insn_emit_before (const struct loop *loop,
11409                        basic_block where_bb ATTRIBUTE_UNUSED,
11410                        rtx where_insn, rtx pattern)
11411 {
11412   if (! where_insn)
11413     return loop_insn_hoist (loop, pattern);
11414   return emit_insn_before (pattern, where_insn);
11415 }
11416
11417
11418 /* Emit call insn for PATTERN before WHERE_INSN in basic block
11419    WHERE_BB (ignored in the interim) within the loop.  */
11420
11421 static rtx
11422 loop_call_insn_emit_before (const struct loop *loop ATTRIBUTE_UNUSED,
11423                             basic_block where_bb ATTRIBUTE_UNUSED,
11424                             rtx where_insn, rtx pattern)
11425 {
11426   return emit_call_insn_before (pattern, where_insn);
11427 }
11428
11429
11430 /* Hoist insn for PATTERN into the loop pre-header.  */
11431
11432 static rtx
11433 loop_insn_hoist (const struct loop *loop, rtx pattern)
11434 {
11435   return loop_insn_emit_before (loop, 0, loop->start, pattern);
11436 }
11437
11438
11439 /* Hoist call insn for PATTERN into the loop pre-header.  */
11440
11441 static rtx
11442 loop_call_insn_hoist (const struct loop *loop, rtx pattern)
11443 {
11444   return loop_call_insn_emit_before (loop, 0, loop->start, pattern);
11445 }
11446
11447
11448 /* Sink insn for PATTERN after the loop end.  */
11449
11450 static rtx
11451 loop_insn_sink (const struct loop *loop, rtx pattern)
11452 {
11453   return loop_insn_emit_before (loop, 0, loop->sink, pattern);
11454 }
11455
11456 /* bl->final_value can be either general_operand or PLUS of general_operand
11457    and constant.  Emit sequence of instructions to load it into REG.  */
11458 static rtx
11459 gen_load_of_final_value (rtx reg, rtx final_value)
11460 {
11461   rtx seq;
11462   start_sequence ();
11463   final_value = force_operand (final_value, reg);
11464   if (final_value != reg)
11465     emit_move_insn (reg, final_value);
11466   seq = get_insns ();
11467   end_sequence ();
11468   return seq;
11469 }
11470
11471 /* If the loop has multiple exits, emit insn for PATTERN before the
11472    loop to ensure that it will always be executed no matter how the
11473    loop exits.  Otherwise, emit the insn for PATTERN after the loop,
11474    since this is slightly more efficient.  */
11475
11476 static rtx
11477 loop_insn_sink_or_swim (const struct loop *loop, rtx pattern)
11478 {
11479   if (loop->exit_count)
11480     return loop_insn_hoist (loop, pattern);
11481   else
11482     return loop_insn_sink (loop, pattern);
11483 }
11484 \f
11485 static void
11486 loop_ivs_dump (const struct loop *loop, FILE *file, int verbose)
11487 {
11488   struct iv_class *bl;
11489   int iv_num = 0;
11490
11491   if (! loop || ! file)
11492     return;
11493
11494   for (bl = LOOP_IVS (loop)->list; bl; bl = bl->next)
11495     iv_num++;
11496
11497   fprintf (file, "Loop %d: %d IV classes\n", loop->num, iv_num);
11498
11499   for (bl = LOOP_IVS (loop)->list; bl; bl = bl->next)
11500     {
11501       loop_iv_class_dump (bl, file, verbose);
11502       fputc ('\n', file);
11503     }
11504 }
11505
11506
11507 static void
11508 loop_iv_class_dump (const struct iv_class *bl, FILE *file,
11509                     int verbose ATTRIBUTE_UNUSED)
11510 {
11511   struct induction *v;
11512   rtx incr;
11513   int i;
11514
11515   if (! bl || ! file)
11516     return;
11517
11518   fprintf (file, "IV class for reg %d, benefit %d\n",
11519            bl->regno, bl->total_benefit);
11520
11521   fprintf (file, " Init insn %d", INSN_UID (bl->init_insn));
11522   if (bl->initial_value)
11523     {
11524       fprintf (file, ", init val: ");
11525       print_simple_rtl (file, bl->initial_value);
11526     }
11527   if (bl->initial_test)
11528     {
11529       fprintf (file, ", init test: ");
11530       print_simple_rtl (file, bl->initial_test);
11531     }
11532   fputc ('\n', file);
11533
11534   if (bl->final_value)
11535     {
11536       fprintf (file, " Final val: ");
11537       print_simple_rtl (file, bl->final_value);
11538       fputc ('\n', file);
11539     }
11540
11541   if ((incr = biv_total_increment (bl)))
11542     {
11543       fprintf (file, " Total increment: ");
11544       print_simple_rtl (file, incr);
11545       fputc ('\n', file);
11546     }
11547
11548   /* List the increments.  */
11549   for (i = 0, v = bl->biv; v; v = v->next_iv, i++)
11550     {
11551       fprintf (file, " Inc%d: insn %d, incr: ", i, INSN_UID (v->insn));
11552       print_simple_rtl (file, v->add_val);
11553       fputc ('\n', file);
11554     }
11555
11556   /* List the givs.  */
11557   for (i = 0, v = bl->giv; v; v = v->next_iv, i++)
11558     {
11559       fprintf (file, " Giv%d: insn %d, benefit %d, ",
11560                i, INSN_UID (v->insn), v->benefit);
11561       if (v->giv_type == DEST_ADDR)
11562         print_simple_rtl (file, v->mem);
11563       else
11564         print_simple_rtl (file, single_set (v->insn));
11565       fputc ('\n', file);
11566     }
11567 }
11568
11569
11570 static void
11571 loop_biv_dump (const struct induction *v, FILE *file, int verbose)
11572 {
11573   if (! v || ! file)
11574     return;
11575
11576   fprintf (file,
11577            "Biv %d: insn %d",
11578            REGNO (v->dest_reg), INSN_UID (v->insn));
11579   fprintf (file, " const ");
11580   print_simple_rtl (file, v->add_val);
11581
11582   if (verbose && v->final_value)
11583     {
11584       fputc ('\n', file);
11585       fprintf (file, " final ");
11586       print_simple_rtl (file, v->final_value);
11587     }
11588
11589   fputc ('\n', file);
11590 }
11591
11592
11593 static void
11594 loop_giv_dump (const struct induction *v, FILE *file, int verbose)
11595 {
11596   if (! v || ! file)
11597     return;
11598
11599   if (v->giv_type == DEST_REG)
11600     fprintf (file, "Giv %d: insn %d",
11601              REGNO (v->dest_reg), INSN_UID (v->insn));
11602   else
11603     fprintf (file, "Dest address: insn %d",
11604              INSN_UID (v->insn));
11605
11606   fprintf (file, " src reg %d benefit %d",
11607            REGNO (v->src_reg), v->benefit);
11608   fprintf (file, " lifetime %d",
11609            v->lifetime);
11610
11611   if (v->replaceable)
11612     fprintf (file, " replaceable");
11613
11614   if (v->no_const_addval)
11615     fprintf (file, " ncav");
11616
11617   if (v->ext_dependent)
11618     {
11619       switch (GET_CODE (v->ext_dependent))
11620         {
11621         case SIGN_EXTEND:
11622           fprintf (file, " ext se");
11623           break;
11624         case ZERO_EXTEND:
11625           fprintf (file, " ext ze");
11626           break;
11627         case TRUNCATE:
11628           fprintf (file, " ext tr");
11629           break;
11630         default:
11631           abort ();
11632         }
11633     }
11634
11635   fputc ('\n', file);
11636   fprintf (file, " mult ");
11637   print_simple_rtl (file, v->mult_val);
11638
11639   fputc ('\n', file);
11640   fprintf (file, " add  ");
11641   print_simple_rtl (file, v->add_val);
11642
11643   if (verbose && v->final_value)
11644     {
11645       fputc ('\n', file);
11646       fprintf (file, " final ");
11647       print_simple_rtl (file, v->final_value);
11648     }
11649
11650   fputc ('\n', file);
11651 }
11652
11653
11654 void
11655 debug_ivs (const struct loop *loop)
11656 {
11657   loop_ivs_dump (loop, stderr, 1);
11658 }
11659
11660
11661 void
11662 debug_iv_class (const struct iv_class *bl)
11663 {
11664   loop_iv_class_dump (bl, stderr, 1);
11665 }
11666
11667
11668 void
11669 debug_biv (const struct induction *v)
11670 {
11671   loop_biv_dump (v, stderr, 1);
11672 }
11673
11674
11675 void
11676 debug_giv (const struct induction *v)
11677 {
11678   loop_giv_dump (v, stderr, 1);
11679 }
11680
11681
11682 #define LOOP_BLOCK_NUM_1(INSN) \
11683 ((INSN) ? (BLOCK_FOR_INSN (INSN) ? BLOCK_NUM (INSN) : - 1) : -1)
11684
11685 /* The notes do not have an assigned block, so look at the next insn.  */
11686 #define LOOP_BLOCK_NUM(INSN) \
11687 ((INSN) ? (NOTE_P (INSN) \
11688             ? LOOP_BLOCK_NUM_1 (next_nonnote_insn (INSN)) \
11689             : LOOP_BLOCK_NUM_1 (INSN)) \
11690         : -1)
11691
11692 #define LOOP_INSN_UID(INSN) ((INSN) ? INSN_UID (INSN) : -1)
11693
11694 static void
11695 loop_dump_aux (const struct loop *loop, FILE *file,
11696                int verbose ATTRIBUTE_UNUSED)
11697 {
11698   rtx label;
11699
11700   if (! loop || ! file || !BB_HEAD (loop->first))
11701     return;
11702
11703   /* Print diagnostics to compare our concept of a loop with
11704      what the loop notes say.  */
11705   if (! PREV_INSN (BB_HEAD (loop->first))
11706       || !NOTE_P (PREV_INSN (BB_HEAD (loop->first)))
11707       || NOTE_LINE_NUMBER (PREV_INSN (BB_HEAD (loop->first)))
11708       != NOTE_INSN_LOOP_BEG)
11709     fprintf (file, ";;  No NOTE_INSN_LOOP_BEG at %d\n",
11710              INSN_UID (PREV_INSN (BB_HEAD (loop->first))));
11711   if (! NEXT_INSN (BB_END (loop->last))
11712       || !NOTE_P (NEXT_INSN (BB_END (loop->last)))
11713       || NOTE_LINE_NUMBER (NEXT_INSN (BB_END (loop->last)))
11714       != NOTE_INSN_LOOP_END)
11715     fprintf (file, ";;  No NOTE_INSN_LOOP_END at %d\n",
11716              INSN_UID (NEXT_INSN (BB_END (loop->last))));
11717
11718   if (loop->start)
11719     {
11720       fprintf (file,
11721                ";;  start %d (%d), end %d (%d)\n",
11722                LOOP_BLOCK_NUM (loop->start),
11723                LOOP_INSN_UID (loop->start),
11724                LOOP_BLOCK_NUM (loop->end),
11725                LOOP_INSN_UID (loop->end));
11726       fprintf (file, ";;  top %d (%d), scan start %d (%d)\n",
11727                LOOP_BLOCK_NUM (loop->top),
11728                LOOP_INSN_UID (loop->top),
11729                LOOP_BLOCK_NUM (loop->scan_start),
11730                LOOP_INSN_UID (loop->scan_start));
11731       fprintf (file, ";;  exit_count %d", loop->exit_count);
11732       if (loop->exit_count)
11733         {
11734           fputs (", labels:", file);
11735           for (label = loop->exit_labels; label; label = LABEL_NEXTREF (label))
11736             {
11737               fprintf (file, " %d ",
11738                        LOOP_INSN_UID (XEXP (label, 0)));
11739             }
11740         }
11741       fputs ("\n", file);
11742     }
11743 }
11744
11745 /* Call this function from the debugger to dump LOOP.  */
11746
11747 void
11748 debug_loop (const struct loop *loop)
11749 {
11750   flow_loop_dump (loop, stderr, loop_dump_aux, 1);
11751 }
11752
11753 /* Call this function from the debugger to dump LOOPS.  */
11754
11755 void
11756 debug_loops (const struct loops *loops)
11757 {
11758   flow_loops_dump (loops, stderr, loop_dump_aux, 1);
11759 }