OSDN Git Service

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