* config/h8300/h8300-protos.h: Update the prototype for
[official-gcc.git] / gcc / loop.c
blob2bd19445ae0b0c4e3eba7358c3a1515c318f7e99
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 Free Software Foundation, Inc.
5 This file is part of GCC.
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.
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.
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. */
22 /* This is the loop optimization pass of the compiler.
23 It finds invariant computations within loops and moves them
24 to the beginning of the loop. Then it identifies basic and
25 general induction variables. Strength reduction is applied to the general
26 induction variables, and induction variable elimination is applied to
27 the basic induction variables.
29 It also finds cases where
30 a register is set within the loop by zero-extending a narrower value
31 and changes these to zero the entire register once before the loop
32 and merely copy the low part within the loop.
34 Most of the complexity is in heuristics to decide when it is worth
35 while to do these things. */
37 #include "config.h"
38 #include "system.h"
39 #include "rtl.h"
40 #include "tm_p.h"
41 #include "obstack.h"
42 #include "function.h"
43 #include "expr.h"
44 #include "hard-reg-set.h"
45 #include "basic-block.h"
46 #include "insn-config.h"
47 #include "regs.h"
48 #include "recog.h"
49 #include "flags.h"
50 #include "real.h"
51 #include "loop.h"
52 #include "cselib.h"
53 #include "except.h"
54 #include "toplev.h"
55 #include "predict.h"
56 #include "insn-flags.h"
57 #include "optabs.h"
59 /* Not really meaningful values, but at least something. */
60 #ifndef SIMULTANEOUS_PREFETCHES
61 #define SIMULTANEOUS_PREFETCHES 3
62 #endif
63 #ifndef PREFETCH_BLOCK
64 #define PREFETCH_BLOCK 32
65 #endif
66 #ifndef HAVE_prefetch
67 #define HAVE_prefetch 0
68 #define CODE_FOR_prefetch 0
69 #define gen_prefetch(a,b,c) (abort(), NULL_RTX)
70 #endif
72 /* Give up the prefetch optimizations once we exceed a given threshhold.
73 It is unlikely that we would be able to optimize something in a loop
74 with so many detected prefetches. */
75 #define MAX_PREFETCHES 100
76 /* The number of prefetch blocks that are beneficial to fetch at once before
77 a loop with a known (and low) iteration count. */
78 #define PREFETCH_BLOCKS_BEFORE_LOOP_MAX 6
79 /* For very tiny loops it is not worthwhile to prefetch even before the loop,
80 since it is likely that the data are already in the cache. */
81 #define PREFETCH_BLOCKS_BEFORE_LOOP_MIN 2
82 /* The minimal number of prefetch blocks that a loop must consume to make
83 the emitting of prefetch instruction in the body of loop worthwhile. */
84 #define PREFETCH_BLOCKS_IN_LOOP_MIN 6
86 /* Parameterize some prefetch heuristics so they can be turned on and off
87 easily for performance testing on new architecures. These can be
88 defined in target-dependent files. */
90 /* Prefetch is worthwhile only when loads/stores are dense. */
91 #ifndef PREFETCH_ONLY_DENSE_MEM
92 #define PREFETCH_ONLY_DENSE_MEM 1
93 #endif
95 /* Define what we mean by "dense" loads and stores; This value divided by 256
96 is the minimum percentage of memory references that worth prefetching. */
97 #ifndef PREFETCH_DENSE_MEM
98 #define PREFETCH_DENSE_MEM 220
99 #endif
101 /* Do not prefetch for a loop whose iteration count is known to be low. */
102 #ifndef PREFETCH_NO_LOW_LOOPCNT
103 #define PREFETCH_NO_LOW_LOOPCNT 1
104 #endif
106 /* Define what we mean by a "low" iteration count. */
107 #ifndef PREFETCH_LOW_LOOPCNT
108 #define PREFETCH_LOW_LOOPCNT 32
109 #endif
111 /* Do not prefetch for a loop that contains a function call; such a loop is
112 probably not an internal loop. */
113 #ifndef PREFETCH_NO_CALL
114 #define PREFETCH_NO_CALL 1
115 #endif
117 /* Do not prefetch accesses with an extreme stride. */
118 #ifndef PREFETCH_NO_EXTREME_STRIDE
119 #define PREFETCH_NO_EXTREME_STRIDE 1
120 #endif
122 /* Define what we mean by an "extreme" stride. */
123 #ifndef PREFETCH_EXTREME_STRIDE
124 #define PREFETCH_EXTREME_STRIDE 4096
125 #endif
127 /* Do not handle reversed order prefetches (negative stride). */
128 #ifndef PREFETCH_NO_REVERSE_ORDER
129 #define PREFETCH_NO_REVERSE_ORDER 1
130 #endif
132 /* Prefetch even if the GIV is not always executed. */
133 #ifndef PREFETCH_NOT_ALWAYS
134 #define PREFETCH_NOT_ALWAYS 0
135 #endif
137 /* If the loop requires more prefetches than the target can process in
138 parallel then don't prefetch anything in that loop. */
139 #ifndef PREFETCH_LIMIT_TO_SIMULTANEOUS
140 #define PREFETCH_LIMIT_TO_SIMULTANEOUS 1
141 #endif
143 #define LOOP_REG_LIFETIME(LOOP, REGNO) \
144 ((REGNO_LAST_LUID (REGNO) - REGNO_FIRST_LUID (REGNO)))
146 #define LOOP_REG_GLOBAL_P(LOOP, REGNO) \
147 ((REGNO_LAST_LUID (REGNO) > INSN_LUID ((LOOP)->end) \
148 || REGNO_FIRST_LUID (REGNO) < INSN_LUID ((LOOP)->start)))
150 #define LOOP_REGNO_NREGS(REGNO, SET_DEST) \
151 ((REGNO) < FIRST_PSEUDO_REGISTER \
152 ? HARD_REGNO_NREGS ((REGNO), GET_MODE (SET_DEST)) : 1)
155 /* Vector mapping INSN_UIDs to luids.
156 The luids are like uids but increase monotonically always.
157 We use them to see whether a jump comes from outside a given loop. */
159 int *uid_luid;
161 /* Indexed by INSN_UID, contains the ordinal giving the (innermost) loop
162 number the insn is contained in. */
164 struct loop **uid_loop;
166 /* 1 + largest uid of any insn. */
168 int max_uid_for_loop;
170 /* 1 + luid of last insn. */
172 static int max_luid;
174 /* Number of loops detected in current function. Used as index to the
175 next few tables. */
177 static int max_loop_num;
179 /* Bound on pseudo register number before loop optimization.
180 A pseudo has valid regscan info if its number is < max_reg_before_loop. */
181 unsigned int max_reg_before_loop;
183 /* The value to pass to the next call of reg_scan_update. */
184 static int loop_max_reg;
186 #define obstack_chunk_alloc xmalloc
187 #define obstack_chunk_free free
189 /* During the analysis of a loop, a chain of `struct movable's
190 is made to record all the movable insns found.
191 Then the entire chain can be scanned to decide which to move. */
193 struct movable
195 rtx insn; /* A movable insn */
196 rtx set_src; /* The expression this reg is set from. */
197 rtx set_dest; /* The destination of this SET. */
198 rtx dependencies; /* When INSN is libcall, this is an EXPR_LIST
199 of any registers used within the LIBCALL. */
200 int consec; /* Number of consecutive following insns
201 that must be moved with this one. */
202 unsigned int regno; /* The register it sets */
203 short lifetime; /* lifetime of that register;
204 may be adjusted when matching movables
205 that load the same value are found. */
206 short savings; /* Number of insns we can move for this reg,
207 including other movables that force this
208 or match this one. */
209 unsigned int cond : 1; /* 1 if only conditionally movable */
210 unsigned int force : 1; /* 1 means MUST move this insn */
211 unsigned int global : 1; /* 1 means reg is live outside this loop */
212 /* If PARTIAL is 1, GLOBAL means something different:
213 that the reg is live outside the range from where it is set
214 to the following label. */
215 unsigned int done : 1; /* 1 inhibits further processing of this */
217 unsigned int partial : 1; /* 1 means this reg is used for zero-extending.
218 In particular, moving it does not make it
219 invariant. */
220 unsigned int move_insn : 1; /* 1 means that we call emit_move_insn to
221 load SRC, rather than copying INSN. */
222 unsigned int move_insn_first:1;/* Same as above, if this is necessary for the
223 first insn of a consecutive sets group. */
224 unsigned int is_equiv : 1; /* 1 means a REG_EQUIV is present on INSN. */
225 enum machine_mode savemode; /* Nonzero means it is a mode for a low part
226 that we should avoid changing when clearing
227 the rest of the reg. */
228 struct movable *match; /* First entry for same value */
229 struct movable *forces; /* An insn that must be moved if this is */
230 struct movable *next;
234 FILE *loop_dump_stream;
236 /* Forward declarations. */
238 static void find_and_verify_loops PARAMS ((rtx, struct loops *));
239 static void mark_loop_jump PARAMS ((rtx, struct loop *));
240 static void prescan_loop PARAMS ((struct loop *));
241 static int reg_in_basic_block_p PARAMS ((rtx, rtx));
242 static int consec_sets_invariant_p PARAMS ((const struct loop *,
243 rtx, int, rtx));
244 static int labels_in_range_p PARAMS ((rtx, int));
245 static void count_one_set PARAMS ((struct loop_regs *, rtx, rtx, rtx *));
246 static void note_addr_stored PARAMS ((rtx, rtx, void *));
247 static void note_set_pseudo_multiple_uses PARAMS ((rtx, rtx, void *));
248 static int loop_reg_used_before_p PARAMS ((const struct loop *, rtx, rtx));
249 static void scan_loop PARAMS ((struct loop*, int));
250 #if 0
251 static void replace_call_address PARAMS ((rtx, rtx, rtx));
252 #endif
253 static rtx skip_consec_insns PARAMS ((rtx, int));
254 static int libcall_benefit PARAMS ((rtx));
255 static void ignore_some_movables PARAMS ((struct loop_movables *));
256 static void force_movables PARAMS ((struct loop_movables *));
257 static void combine_movables PARAMS ((struct loop_movables *,
258 struct loop_regs *));
259 static int num_unmoved_movables PARAMS ((const struct loop *));
260 static int regs_match_p PARAMS ((rtx, rtx, struct loop_movables *));
261 static int rtx_equal_for_loop_p PARAMS ((rtx, rtx, struct loop_movables *,
262 struct loop_regs *));
263 static void add_label_notes PARAMS ((rtx, rtx));
264 static void move_movables PARAMS ((struct loop *loop, struct loop_movables *,
265 int, int));
266 static void loop_movables_add PARAMS((struct loop_movables *,
267 struct movable *));
268 static void loop_movables_free PARAMS((struct loop_movables *));
269 static int count_nonfixed_reads PARAMS ((const struct loop *, rtx));
270 static void loop_bivs_find PARAMS((struct loop *));
271 static void loop_bivs_init_find PARAMS((struct loop *));
272 static void loop_bivs_check PARAMS((struct loop *));
273 static void loop_givs_find PARAMS((struct loop *));
274 static void loop_givs_check PARAMS((struct loop *));
275 static int loop_biv_eliminable_p PARAMS((struct loop *, struct iv_class *,
276 int, int));
277 static int loop_giv_reduce_benefit PARAMS((struct loop *, struct iv_class *,
278 struct induction *, rtx));
279 static void loop_givs_dead_check PARAMS((struct loop *, struct iv_class *));
280 static void loop_givs_reduce PARAMS((struct loop *, struct iv_class *));
281 static void loop_givs_rescan PARAMS((struct loop *, struct iv_class *,
282 rtx *));
283 static void loop_ivs_free PARAMS((struct loop *));
284 static void strength_reduce PARAMS ((struct loop *, int));
285 static void find_single_use_in_loop PARAMS ((struct loop_regs *, rtx, rtx));
286 static int valid_initial_value_p PARAMS ((rtx, rtx, int, rtx));
287 static void find_mem_givs PARAMS ((const struct loop *, rtx, rtx, int, int));
288 static void record_biv PARAMS ((struct loop *, struct induction *,
289 rtx, rtx, rtx, rtx, rtx *,
290 int, int));
291 static void check_final_value PARAMS ((const struct loop *,
292 struct induction *));
293 static void loop_ivs_dump PARAMS((const struct loop *, FILE *, int));
294 static void loop_iv_class_dump PARAMS((const struct iv_class *, FILE *, int));
295 static void loop_biv_dump PARAMS((const struct induction *, FILE *, int));
296 static void loop_giv_dump PARAMS((const struct induction *, FILE *, int));
297 static void record_giv PARAMS ((const struct loop *, struct induction *,
298 rtx, rtx, rtx, rtx, rtx, rtx, int,
299 enum g_types, int, int, rtx *));
300 static void update_giv_derive PARAMS ((const struct loop *, rtx));
301 static void check_ext_dependent_givs PARAMS ((struct iv_class *,
302 struct loop_info *));
303 static int basic_induction_var PARAMS ((const struct loop *, rtx,
304 enum machine_mode, rtx, rtx,
305 rtx *, rtx *, rtx **));
306 static rtx simplify_giv_expr PARAMS ((const struct loop *, rtx, rtx *, int *));
307 static int general_induction_var PARAMS ((const struct loop *loop, rtx, rtx *,
308 rtx *, rtx *, rtx *, int, int *,
309 enum machine_mode));
310 static int consec_sets_giv PARAMS ((const struct loop *, int, rtx,
311 rtx, rtx, rtx *, rtx *, rtx *, rtx *));
312 static int check_dbra_loop PARAMS ((struct loop *, int));
313 static rtx express_from_1 PARAMS ((rtx, rtx, rtx));
314 static rtx combine_givs_p PARAMS ((struct induction *, struct induction *));
315 static int cmp_combine_givs_stats PARAMS ((const PTR, const PTR));
316 static void combine_givs PARAMS ((struct loop_regs *, struct iv_class *));
317 static int product_cheap_p PARAMS ((rtx, rtx));
318 static int maybe_eliminate_biv PARAMS ((const struct loop *, struct iv_class *,
319 int, int, int));
320 static int maybe_eliminate_biv_1 PARAMS ((const struct loop *, rtx, rtx,
321 struct iv_class *, int,
322 basic_block, rtx));
323 static int last_use_this_basic_block PARAMS ((rtx, rtx));
324 static void record_initial PARAMS ((rtx, rtx, void *));
325 static void update_reg_last_use PARAMS ((rtx, rtx));
326 static rtx next_insn_in_loop PARAMS ((const struct loop *, rtx));
327 static void loop_regs_scan PARAMS ((const struct loop *, int));
328 static int count_insns_in_loop PARAMS ((const struct loop *));
329 static void load_mems PARAMS ((const struct loop *));
330 static int insert_loop_mem PARAMS ((rtx *, void *));
331 static int replace_loop_mem PARAMS ((rtx *, void *));
332 static void replace_loop_mems PARAMS ((rtx, rtx, rtx));
333 static int replace_loop_reg PARAMS ((rtx *, void *));
334 static void replace_loop_regs PARAMS ((rtx insn, rtx, rtx));
335 static void note_reg_stored PARAMS ((rtx, rtx, void *));
336 static void try_copy_prop PARAMS ((const struct loop *, rtx, unsigned int));
337 static void try_swap_copy_prop PARAMS ((const struct loop *, rtx,
338 unsigned int));
339 static int replace_label PARAMS ((rtx *, void *));
340 static rtx check_insn_for_givs PARAMS((struct loop *, rtx, int, int));
341 static rtx check_insn_for_bivs PARAMS((struct loop *, rtx, int, int));
342 static rtx gen_add_mult PARAMS ((rtx, rtx, rtx, rtx));
343 static void loop_regs_update PARAMS ((const struct loop *, rtx));
344 static int iv_add_mult_cost PARAMS ((rtx, rtx, rtx, rtx));
346 static rtx loop_insn_emit_after PARAMS((const struct loop *, basic_block,
347 rtx, rtx));
348 static rtx loop_call_insn_emit_before PARAMS((const struct loop *,
349 basic_block, rtx, rtx));
350 static rtx loop_call_insn_hoist PARAMS((const struct loop *, rtx));
351 static rtx loop_insn_sink_or_swim PARAMS((const struct loop *, rtx));
353 static void loop_dump_aux PARAMS ((const struct loop *, FILE *, int));
354 static void loop_delete_insns PARAMS ((rtx, rtx));
355 static HOST_WIDE_INT remove_constant_addition PARAMS ((rtx *));
356 void debug_ivs PARAMS ((const struct loop *));
357 void debug_iv_class PARAMS ((const struct iv_class *));
358 void debug_biv PARAMS ((const struct induction *));
359 void debug_giv PARAMS ((const struct induction *));
360 void debug_loop PARAMS ((const struct loop *));
361 void debug_loops PARAMS ((const struct loops *));
363 typedef struct rtx_pair
365 rtx r1;
366 rtx r2;
367 } rtx_pair;
369 typedef struct loop_replace_args
371 rtx match;
372 rtx replacement;
373 rtx insn;
374 } loop_replace_args;
376 /* Nonzero iff INSN is between START and END, inclusive. */
377 #define INSN_IN_RANGE_P(INSN, START, END) \
378 (INSN_UID (INSN) < max_uid_for_loop \
379 && INSN_LUID (INSN) >= INSN_LUID (START) \
380 && INSN_LUID (INSN) <= INSN_LUID (END))
382 /* Indirect_jump_in_function is computed once per function. */
383 static int indirect_jump_in_function;
384 static int indirect_jump_in_function_p PARAMS ((rtx));
386 static int compute_luids PARAMS ((rtx, rtx, int));
388 static int biv_elimination_giv_has_0_offset PARAMS ((struct induction *,
389 struct induction *,
390 rtx));
392 /* Benefit penalty, if a giv is not replaceable, i.e. must emit an insn to
393 copy the value of the strength reduced giv to its original register. */
394 static int copy_cost;
396 /* Cost of using a register, to normalize the benefits of a giv. */
397 static int reg_address_cost;
399 void
400 init_loop ()
402 rtx reg = gen_rtx_REG (word_mode, LAST_VIRTUAL_REGISTER + 1);
404 reg_address_cost = address_cost (reg, SImode);
406 copy_cost = COSTS_N_INSNS (1);
409 /* Compute the mapping from uids to luids.
410 LUIDs are numbers assigned to insns, like uids,
411 except that luids increase monotonically through the code.
412 Start at insn START and stop just before END. Assign LUIDs
413 starting with PREV_LUID + 1. Return the last assigned LUID + 1. */
414 static int
415 compute_luids (start, end, prev_luid)
416 rtx start, end;
417 int prev_luid;
419 int i;
420 rtx insn;
422 for (insn = start, i = prev_luid; insn != end; insn = NEXT_INSN (insn))
424 if (INSN_UID (insn) >= max_uid_for_loop)
425 continue;
426 /* Don't assign luids to line-number NOTEs, so that the distance in
427 luids between two insns is not affected by -g. */
428 if (GET_CODE (insn) != NOTE
429 || NOTE_LINE_NUMBER (insn) <= 0)
430 uid_luid[INSN_UID (insn)] = ++i;
431 else
432 /* Give a line number note the same luid as preceding insn. */
433 uid_luid[INSN_UID (insn)] = i;
435 return i + 1;
438 /* Entry point of this file. Perform loop optimization
439 on the current function. F is the first insn of the function
440 and DUMPFILE is a stream for output of a trace of actions taken
441 (or 0 if none should be output). */
443 void
444 loop_optimize (f, dumpfile, flags)
445 /* f is the first instruction of a chain of insns for one function */
446 rtx f;
447 FILE *dumpfile;
448 int flags;
450 rtx insn;
451 int i;
452 struct loops loops_data;
453 struct loops *loops = &loops_data;
454 struct loop_info *loops_info;
456 loop_dump_stream = dumpfile;
458 init_recog_no_volatile ();
460 max_reg_before_loop = max_reg_num ();
461 loop_max_reg = max_reg_before_loop;
463 regs_may_share = 0;
465 /* Count the number of loops. */
467 max_loop_num = 0;
468 for (insn = f; insn; insn = NEXT_INSN (insn))
470 if (GET_CODE (insn) == NOTE
471 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
472 max_loop_num++;
475 /* Don't waste time if no loops. */
476 if (max_loop_num == 0)
477 return;
479 loops->num = max_loop_num;
481 /* Get size to use for tables indexed by uids.
482 Leave some space for labels allocated by find_and_verify_loops. */
483 max_uid_for_loop = get_max_uid () + 1 + max_loop_num * 32;
485 uid_luid = (int *) xcalloc (max_uid_for_loop, sizeof (int));
486 uid_loop = (struct loop **) xcalloc (max_uid_for_loop,
487 sizeof (struct loop *));
489 /* Allocate storage for array of loops. */
490 loops->array = (struct loop *)
491 xcalloc (loops->num, sizeof (struct loop));
493 /* Find and process each loop.
494 First, find them, and record them in order of their beginnings. */
495 find_and_verify_loops (f, loops);
497 /* Allocate and initialize auxiliary loop information. */
498 loops_info = xcalloc (loops->num, sizeof (struct loop_info));
499 for (i = 0; i < loops->num; i++)
500 loops->array[i].aux = loops_info + i;
502 /* Now find all register lifetimes. This must be done after
503 find_and_verify_loops, because it might reorder the insns in the
504 function. */
505 reg_scan (f, max_reg_before_loop, 1);
507 /* This must occur after reg_scan so that registers created by gcse
508 will have entries in the register tables.
510 We could have added a call to reg_scan after gcse_main in toplev.c,
511 but moving this call to init_alias_analysis is more efficient. */
512 init_alias_analysis ();
514 /* See if we went too far. Note that get_max_uid already returns
515 one more that the maximum uid of all insn. */
516 if (get_max_uid () > max_uid_for_loop)
517 abort ();
518 /* Now reset it to the actual size we need. See above. */
519 max_uid_for_loop = get_max_uid ();
521 /* find_and_verify_loops has already called compute_luids, but it
522 might have rearranged code afterwards, so we need to recompute
523 the luids now. */
524 max_luid = compute_luids (f, NULL_RTX, 0);
526 /* Don't leave gaps in uid_luid for insns that have been
527 deleted. It is possible that the first or last insn
528 using some register has been deleted by cross-jumping.
529 Make sure that uid_luid for that former insn's uid
530 points to the general area where that insn used to be. */
531 for (i = 0; i < max_uid_for_loop; i++)
533 uid_luid[0] = uid_luid[i];
534 if (uid_luid[0] != 0)
535 break;
537 for (i = 0; i < max_uid_for_loop; i++)
538 if (uid_luid[i] == 0)
539 uid_luid[i] = uid_luid[i - 1];
541 /* Determine if the function has indirect jump. On some systems
542 this prevents low overhead loop instructions from being used. */
543 indirect_jump_in_function = indirect_jump_in_function_p (f);
545 /* Now scan the loops, last ones first, since this means inner ones are done
546 before outer ones. */
547 for (i = max_loop_num - 1; i >= 0; i--)
549 struct loop *loop = &loops->array[i];
551 if (! loop->invalid && loop->end)
552 scan_loop (loop, flags);
555 /* If there were lexical blocks inside the loop, they have been
556 replicated. We will now have more than one NOTE_INSN_BLOCK_BEG
557 and NOTE_INSN_BLOCK_END for each such block. We must duplicate
558 the BLOCKs as well. */
559 if (write_symbols != NO_DEBUG)
560 reorder_blocks ();
562 end_alias_analysis ();
564 /* Clean up. */
565 free (uid_luid);
566 free (uid_loop);
567 free (loops_info);
568 free (loops->array);
571 /* Returns the next insn, in execution order, after INSN. START and
572 END are the NOTE_INSN_LOOP_BEG and NOTE_INSN_LOOP_END for the loop,
573 respectively. LOOP->TOP, if non-NULL, is the top of the loop in the
574 insn-stream; it is used with loops that are entered near the
575 bottom. */
577 static rtx
578 next_insn_in_loop (loop, insn)
579 const struct loop *loop;
580 rtx insn;
582 insn = NEXT_INSN (insn);
584 if (insn == loop->end)
586 if (loop->top)
587 /* Go to the top of the loop, and continue there. */
588 insn = loop->top;
589 else
590 /* We're done. */
591 insn = NULL_RTX;
594 if (insn == loop->scan_start)
595 /* We're done. */
596 insn = NULL_RTX;
598 return insn;
601 /* Optimize one loop described by LOOP. */
603 /* ??? Could also move memory writes out of loops if the destination address
604 is invariant, the source is invariant, the memory write is not volatile,
605 and if we can prove that no read inside the loop can read this address
606 before the write occurs. If there is a read of this address after the
607 write, then we can also mark the memory read as invariant. */
609 static void
610 scan_loop (loop, flags)
611 struct loop *loop;
612 int flags;
614 struct loop_info *loop_info = LOOP_INFO (loop);
615 struct loop_regs *regs = LOOP_REGS (loop);
616 int i;
617 rtx loop_start = loop->start;
618 rtx loop_end = loop->end;
619 rtx p;
620 /* 1 if we are scanning insns that could be executed zero times. */
621 int maybe_never = 0;
622 /* 1 if we are scanning insns that might never be executed
623 due to a subroutine call which might exit before they are reached. */
624 int call_passed = 0;
625 /* Jump insn that enters the loop, or 0 if control drops in. */
626 rtx loop_entry_jump = 0;
627 /* Number of insns in the loop. */
628 int insn_count;
629 int tem;
630 rtx temp, update_start, update_end;
631 /* The SET from an insn, if it is the only SET in the insn. */
632 rtx set, set1;
633 /* Chain describing insns movable in current loop. */
634 struct loop_movables *movables = LOOP_MOVABLES (loop);
635 /* Ratio of extra register life span we can justify
636 for saving an instruction. More if loop doesn't call subroutines
637 since in that case saving an insn makes more difference
638 and more registers are available. */
639 int threshold;
640 /* Nonzero if we are scanning instructions in a sub-loop. */
641 int loop_depth = 0;
643 loop->top = 0;
645 movables->head = 0;
646 movables->last = 0;
648 /* Determine whether this loop starts with a jump down to a test at
649 the end. This will occur for a small number of loops with a test
650 that is too complex to duplicate in front of the loop.
652 We search for the first insn or label in the loop, skipping NOTEs.
653 However, we must be careful not to skip past a NOTE_INSN_LOOP_BEG
654 (because we might have a loop executed only once that contains a
655 loop which starts with a jump to its exit test) or a NOTE_INSN_LOOP_END
656 (in case we have a degenerate loop).
658 Note that if we mistakenly think that a loop is entered at the top
659 when, in fact, it is entered at the exit test, the only effect will be
660 slightly poorer optimization. Making the opposite error can generate
661 incorrect code. Since very few loops now start with a jump to the
662 exit test, the code here to detect that case is very conservative. */
664 for (p = NEXT_INSN (loop_start);
665 p != loop_end
666 && GET_CODE (p) != CODE_LABEL && ! INSN_P (p)
667 && (GET_CODE (p) != NOTE
668 || (NOTE_LINE_NUMBER (p) != NOTE_INSN_LOOP_BEG
669 && NOTE_LINE_NUMBER (p) != NOTE_INSN_LOOP_END));
670 p = NEXT_INSN (p))
673 loop->scan_start = p;
675 /* If loop end is the end of the current function, then emit a
676 NOTE_INSN_DELETED after loop_end and set loop->sink to the dummy
677 note insn. This is the position we use when sinking insns out of
678 the loop. */
679 if (NEXT_INSN (loop->end) != 0)
680 loop->sink = NEXT_INSN (loop->end);
681 else
682 loop->sink = emit_note_after (NOTE_INSN_DELETED, loop->end);
684 /* Set up variables describing this loop. */
685 prescan_loop (loop);
686 threshold = (loop_info->has_call ? 1 : 2) * (1 + n_non_fixed_regs);
688 /* If loop has a jump before the first label,
689 the true entry is the target of that jump.
690 Start scan from there.
691 But record in LOOP->TOP the place where the end-test jumps
692 back to so we can scan that after the end of the loop. */
693 if (GET_CODE (p) == JUMP_INSN)
695 loop_entry_jump = p;
697 /* Loop entry must be unconditional jump (and not a RETURN) */
698 if (any_uncondjump_p (p)
699 && JUMP_LABEL (p) != 0
700 /* Check to see whether the jump actually
701 jumps out of the loop (meaning it's no loop).
702 This case can happen for things like
703 do {..} while (0). If this label was generated previously
704 by loop, we can't tell anything about it and have to reject
705 the loop. */
706 && INSN_IN_RANGE_P (JUMP_LABEL (p), loop_start, loop_end))
708 loop->top = next_label (loop->scan_start);
709 loop->scan_start = JUMP_LABEL (p);
713 /* If LOOP->SCAN_START was an insn created by loop, we don't know its luid
714 as required by loop_reg_used_before_p. So skip such loops. (This
715 test may never be true, but it's best to play it safe.)
717 Also, skip loops where we do not start scanning at a label. This
718 test also rejects loops starting with a JUMP_INSN that failed the
719 test above. */
721 if (INSN_UID (loop->scan_start) >= max_uid_for_loop
722 || GET_CODE (loop->scan_start) != CODE_LABEL)
724 if (loop_dump_stream)
725 fprintf (loop_dump_stream, "\nLoop from %d to %d is phony.\n\n",
726 INSN_UID (loop_start), INSN_UID (loop_end));
727 return;
730 /* Allocate extra space for REGs that might be created by load_mems.
731 We allocate a little extra slop as well, in the hopes that we
732 won't have to reallocate the regs array. */
733 loop_regs_scan (loop, loop_info->mems_idx + 16);
734 insn_count = count_insns_in_loop (loop);
736 if (loop_dump_stream)
738 fprintf (loop_dump_stream, "\nLoop from %d to %d: %d real insns.\n",
739 INSN_UID (loop_start), INSN_UID (loop_end), insn_count);
740 if (loop->cont)
741 fprintf (loop_dump_stream, "Continue at insn %d.\n",
742 INSN_UID (loop->cont));
745 /* Scan through the loop finding insns that are safe to move.
746 Set REGS->ARRAY[I].SET_IN_LOOP negative for the reg I being set, so that
747 this reg will be considered invariant for subsequent insns.
748 We consider whether subsequent insns use the reg
749 in deciding whether it is worth actually moving.
751 MAYBE_NEVER is nonzero if we have passed a conditional jump insn
752 and therefore it is possible that the insns we are scanning
753 would never be executed. At such times, we must make sure
754 that it is safe to execute the insn once instead of zero times.
755 When MAYBE_NEVER is 0, all insns will be executed at least once
756 so that is not a problem. */
758 for (p = next_insn_in_loop (loop, loop->scan_start);
759 p != NULL_RTX;
760 p = next_insn_in_loop (loop, p))
762 if (GET_CODE (p) == INSN
763 && (set = single_set (p))
764 && GET_CODE (SET_DEST (set)) == REG
765 #ifdef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
766 && SET_DEST (set) != pic_offset_table_rtx
767 #endif
768 && ! regs->array[REGNO (SET_DEST (set))].may_not_optimize)
770 int tem1 = 0;
771 int tem2 = 0;
772 int move_insn = 0;
773 rtx src = SET_SRC (set);
774 rtx dependencies = 0;
776 /* Figure out what to use as a source of this insn. If a REG_EQUIV
777 note is given or if a REG_EQUAL note with a constant operand is
778 specified, use it as the source and mark that we should move
779 this insn by calling emit_move_insn rather that duplicating the
780 insn.
782 Otherwise, only use the REG_EQUAL contents if a REG_RETVAL note
783 is present. */
784 temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
785 if (temp)
786 src = XEXP (temp, 0), move_insn = 1;
787 else
789 temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
790 if (temp && CONSTANT_P (XEXP (temp, 0)))
791 src = XEXP (temp, 0), move_insn = 1;
792 if (temp && find_reg_note (p, REG_RETVAL, NULL_RTX))
794 src = XEXP (temp, 0);
795 /* A libcall block can use regs that don't appear in
796 the equivalent expression. To move the libcall,
797 we must move those regs too. */
798 dependencies = libcall_other_reg (p, src);
802 /* For parallels, add any possible uses to the depencies, as we can't move
803 the insn without resolving them first. */
804 if (GET_CODE (PATTERN (p)) == PARALLEL)
806 for (i = 0; i < XVECLEN (PATTERN (p), 0); i++)
808 rtx x = XVECEXP (PATTERN (p), 0, i);
809 if (GET_CODE (x) == USE)
810 dependencies = gen_rtx_EXPR_LIST (VOIDmode, XEXP (x, 0), dependencies);
814 /* Don't try to optimize a register that was made
815 by loop-optimization for an inner loop.
816 We don't know its life-span, so we can't compute the benefit. */
817 if (REGNO (SET_DEST (set)) >= max_reg_before_loop)
819 else if (/* The register is used in basic blocks other
820 than the one where it is set (meaning that
821 something after this point in the loop might
822 depend on its value before the set). */
823 ! reg_in_basic_block_p (p, SET_DEST (set))
824 /* And the set is not guaranteed to be executed once
825 the loop starts, or the value before the set is
826 needed before the set occurs...
828 ??? Note we have quadratic behaviour here, mitigated
829 by the fact that the previous test will often fail for
830 large loops. Rather than re-scanning the entire loop
831 each time for register usage, we should build tables
832 of the register usage and use them here instead. */
833 && (maybe_never
834 || loop_reg_used_before_p (loop, set, p)))
835 /* It is unsafe to move the set.
837 This code used to consider it OK to move a set of a variable
838 which was not created by the user and not used in an exit test.
839 That behavior is incorrect and was removed. */
841 else if ((tem = loop_invariant_p (loop, src))
842 && (dependencies == 0
843 || (tem2 = loop_invariant_p (loop, dependencies)) != 0)
844 && (regs->array[REGNO (SET_DEST (set))].set_in_loop == 1
845 || (tem1
846 = consec_sets_invariant_p
847 (loop, SET_DEST (set),
848 regs->array[REGNO (SET_DEST (set))].set_in_loop,
849 p)))
850 /* If the insn can cause a trap (such as divide by zero),
851 can't move it unless it's guaranteed to be executed
852 once loop is entered. Even a function call might
853 prevent the trap insn from being reached
854 (since it might exit!) */
855 && ! ((maybe_never || call_passed)
856 && may_trap_p (src)))
858 struct movable *m;
859 int regno = REGNO (SET_DEST (set));
861 /* A potential lossage is where we have a case where two insns
862 can be combined as long as they are both in the loop, but
863 we move one of them outside the loop. For large loops,
864 this can lose. The most common case of this is the address
865 of a function being called.
867 Therefore, if this register is marked as being used exactly
868 once if we are in a loop with calls (a "large loop"), see if
869 we can replace the usage of this register with the source
870 of this SET. If we can, delete this insn.
872 Don't do this if P has a REG_RETVAL note or if we have
873 SMALL_REGISTER_CLASSES and SET_SRC is a hard register. */
875 if (loop_info->has_call
876 && regs->array[regno].single_usage != 0
877 && regs->array[regno].single_usage != const0_rtx
878 && REGNO_FIRST_UID (regno) == INSN_UID (p)
879 && (REGNO_LAST_UID (regno)
880 == INSN_UID (regs->array[regno].single_usage))
881 && regs->array[regno].set_in_loop == 1
882 && GET_CODE (SET_SRC (set)) != ASM_OPERANDS
883 && ! side_effects_p (SET_SRC (set))
884 && ! find_reg_note (p, REG_RETVAL, NULL_RTX)
885 && (! SMALL_REGISTER_CLASSES
886 || (! (GET_CODE (SET_SRC (set)) == REG
887 && REGNO (SET_SRC (set)) < FIRST_PSEUDO_REGISTER)))
888 /* This test is not redundant; SET_SRC (set) might be
889 a call-clobbered register and the life of REGNO
890 might span a call. */
891 && ! modified_between_p (SET_SRC (set), p,
892 regs->array[regno].single_usage)
893 && no_labels_between_p (p, regs->array[regno].single_usage)
894 && validate_replace_rtx (SET_DEST (set), SET_SRC (set),
895 regs->array[regno].single_usage))
897 /* Replace any usage in a REG_EQUAL note. Must copy the
898 new source, so that we don't get rtx sharing between the
899 SET_SOURCE and REG_NOTES of insn p. */
900 REG_NOTES (regs->array[regno].single_usage)
901 = replace_rtx (REG_NOTES (regs->array[regno].single_usage),
902 SET_DEST (set), copy_rtx (SET_SRC (set)));
904 delete_insn (p);
905 for (i = 0; i < LOOP_REGNO_NREGS (regno, SET_DEST (set)); i++)
906 regs->array[regno+i].set_in_loop = 0;
907 continue;
910 m = (struct movable *) xmalloc (sizeof (struct movable));
911 m->next = 0;
912 m->insn = p;
913 m->set_src = src;
914 m->dependencies = dependencies;
915 m->set_dest = SET_DEST (set);
916 m->force = 0;
917 m->consec = regs->array[REGNO (SET_DEST (set))].set_in_loop - 1;
918 m->done = 0;
919 m->forces = 0;
920 m->partial = 0;
921 m->move_insn = move_insn;
922 m->move_insn_first = 0;
923 m->is_equiv = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
924 m->savemode = VOIDmode;
925 m->regno = regno;
926 /* Set M->cond if either loop_invariant_p
927 or consec_sets_invariant_p returned 2
928 (only conditionally invariant). */
929 m->cond = ((tem | tem1 | tem2) > 1);
930 m->global = LOOP_REG_GLOBAL_P (loop, regno);
931 m->match = 0;
932 m->lifetime = LOOP_REG_LIFETIME (loop, regno);
933 m->savings = regs->array[regno].n_times_set;
934 if (find_reg_note (p, REG_RETVAL, NULL_RTX))
935 m->savings += libcall_benefit (p);
936 for (i = 0; i < LOOP_REGNO_NREGS (regno, SET_DEST (set)); i++)
937 regs->array[regno+i].set_in_loop = move_insn ? -2 : -1;
938 /* Add M to the end of the chain MOVABLES. */
939 loop_movables_add (movables, m);
941 if (m->consec > 0)
943 /* It is possible for the first instruction to have a
944 REG_EQUAL note but a non-invariant SET_SRC, so we must
945 remember the status of the first instruction in case
946 the last instruction doesn't have a REG_EQUAL note. */
947 m->move_insn_first = m->move_insn;
949 /* Skip this insn, not checking REG_LIBCALL notes. */
950 p = next_nonnote_insn (p);
951 /* Skip the consecutive insns, if there are any. */
952 p = skip_consec_insns (p, m->consec);
953 /* Back up to the last insn of the consecutive group. */
954 p = prev_nonnote_insn (p);
956 /* We must now reset m->move_insn, m->is_equiv, and possibly
957 m->set_src to correspond to the effects of all the
958 insns. */
959 temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
960 if (temp)
961 m->set_src = XEXP (temp, 0), m->move_insn = 1;
962 else
964 temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
965 if (temp && CONSTANT_P (XEXP (temp, 0)))
966 m->set_src = XEXP (temp, 0), m->move_insn = 1;
967 else
968 m->move_insn = 0;
971 m->is_equiv = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
974 /* If this register is always set within a STRICT_LOW_PART
975 or set to zero, then its high bytes are constant.
976 So clear them outside the loop and within the loop
977 just load the low bytes.
978 We must check that the machine has an instruction to do so.
979 Also, if the value loaded into the register
980 depends on the same register, this cannot be done. */
981 else if (SET_SRC (set) == const0_rtx
982 && GET_CODE (NEXT_INSN (p)) == INSN
983 && (set1 = single_set (NEXT_INSN (p)))
984 && GET_CODE (set1) == SET
985 && (GET_CODE (SET_DEST (set1)) == STRICT_LOW_PART)
986 && (GET_CODE (XEXP (SET_DEST (set1), 0)) == SUBREG)
987 && (SUBREG_REG (XEXP (SET_DEST (set1), 0))
988 == SET_DEST (set))
989 && !reg_mentioned_p (SET_DEST (set), SET_SRC (set1)))
991 int regno = REGNO (SET_DEST (set));
992 if (regs->array[regno].set_in_loop == 2)
994 struct movable *m;
995 m = (struct movable *) xmalloc (sizeof (struct movable));
996 m->next = 0;
997 m->insn = p;
998 m->set_dest = SET_DEST (set);
999 m->dependencies = 0;
1000 m->force = 0;
1001 m->consec = 0;
1002 m->done = 0;
1003 m->forces = 0;
1004 m->move_insn = 0;
1005 m->move_insn_first = 0;
1006 m->partial = 1;
1007 /* If the insn may not be executed on some cycles,
1008 we can't clear the whole reg; clear just high part.
1009 Not even if the reg is used only within this loop.
1010 Consider this:
1011 while (1)
1012 while (s != t) {
1013 if (foo ()) x = *s;
1014 use (x);
1016 Clearing x before the inner loop could clobber a value
1017 being saved from the last time around the outer loop.
1018 However, if the reg is not used outside this loop
1019 and all uses of the register are in the same
1020 basic block as the store, there is no problem.
1022 If this insn was made by loop, we don't know its
1023 INSN_LUID and hence must make a conservative
1024 assumption. */
1025 m->global = (INSN_UID (p) >= max_uid_for_loop
1026 || LOOP_REG_GLOBAL_P (loop, regno)
1027 || (labels_in_range_p
1028 (p, REGNO_FIRST_LUID (regno))));
1029 if (maybe_never && m->global)
1030 m->savemode = GET_MODE (SET_SRC (set1));
1031 else
1032 m->savemode = VOIDmode;
1033 m->regno = regno;
1034 m->cond = 0;
1035 m->match = 0;
1036 m->lifetime = LOOP_REG_LIFETIME (loop, regno);
1037 m->savings = 1;
1038 for (i = 0; i < LOOP_REGNO_NREGS (regno, SET_DEST (set)); i++)
1039 regs->array[regno+i].set_in_loop = -1;
1040 /* Add M to the end of the chain MOVABLES. */
1041 loop_movables_add (movables, m);
1045 /* Past a call insn, we get to insns which might not be executed
1046 because the call might exit. This matters for insns that trap.
1047 Constant and pure call insns always return, so they don't count. */
1048 else if (GET_CODE (p) == CALL_INSN && ! CONST_OR_PURE_CALL_P (p))
1049 call_passed = 1;
1050 /* Past a label or a jump, we get to insns for which we
1051 can't count on whether or how many times they will be
1052 executed during each iteration. Therefore, we can
1053 only move out sets of trivial variables
1054 (those not used after the loop). */
1055 /* Similar code appears twice in strength_reduce. */
1056 else if ((GET_CODE (p) == CODE_LABEL || GET_CODE (p) == JUMP_INSN)
1057 /* If we enter the loop in the middle, and scan around to the
1058 beginning, don't set maybe_never for that. This must be an
1059 unconditional jump, otherwise the code at the top of the
1060 loop might never be executed. Unconditional jumps are
1061 followed by a barrier then the loop_end. */
1062 && ! (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p) == loop->top
1063 && NEXT_INSN (NEXT_INSN (p)) == loop_end
1064 && any_uncondjump_p (p)))
1065 maybe_never = 1;
1066 else if (GET_CODE (p) == NOTE)
1068 /* At the virtual top of a converted loop, insns are again known to
1069 be executed: logically, the loop begins here even though the exit
1070 code has been duplicated. */
1071 if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_VTOP && loop_depth == 0)
1072 maybe_never = call_passed = 0;
1073 else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
1074 loop_depth++;
1075 else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END)
1076 loop_depth--;
1080 /* If one movable subsumes another, ignore that other. */
1082 ignore_some_movables (movables);
1084 /* For each movable insn, see if the reg that it loads
1085 leads when it dies right into another conditionally movable insn.
1086 If so, record that the second insn "forces" the first one,
1087 since the second can be moved only if the first is. */
1089 force_movables (movables);
1091 /* See if there are multiple movable insns that load the same value.
1092 If there are, make all but the first point at the first one
1093 through the `match' field, and add the priorities of them
1094 all together as the priority of the first. */
1096 combine_movables (movables, regs);
1098 /* Now consider each movable insn to decide whether it is worth moving.
1099 Store 0 in regs->array[I].set_in_loop for each reg I that is moved.
1101 Generally this increases code size, so do not move moveables when
1102 optimizing for code size. */
1104 if (! optimize_size)
1106 move_movables (loop, movables, threshold, insn_count);
1108 /* Recalculate regs->array if move_movables has created new
1109 registers. */
1110 if (max_reg_num () > regs->num)
1112 loop_regs_scan (loop, 0);
1113 for (update_start = loop_start;
1114 PREV_INSN (update_start)
1115 && GET_CODE (PREV_INSN (update_start)) != CODE_LABEL;
1116 update_start = PREV_INSN (update_start))
1118 update_end = NEXT_INSN (loop_end);
1120 reg_scan_update (update_start, update_end, loop_max_reg);
1121 loop_max_reg = max_reg_num ();
1125 /* Now candidates that still are negative are those not moved.
1126 Change regs->array[I].set_in_loop to indicate that those are not actually
1127 invariant. */
1128 for (i = 0; i < regs->num; i++)
1129 if (regs->array[i].set_in_loop < 0)
1130 regs->array[i].set_in_loop = regs->array[i].n_times_set;
1132 /* Now that we've moved some things out of the loop, we might be able to
1133 hoist even more memory references. */
1134 load_mems (loop);
1136 /* Recalculate regs->array if load_mems has created new registers. */
1137 if (max_reg_num () > regs->num)
1138 loop_regs_scan (loop, 0);
1140 for (update_start = loop_start;
1141 PREV_INSN (update_start)
1142 && GET_CODE (PREV_INSN (update_start)) != CODE_LABEL;
1143 update_start = PREV_INSN (update_start))
1145 update_end = NEXT_INSN (loop_end);
1147 reg_scan_update (update_start, update_end, loop_max_reg);
1148 loop_max_reg = max_reg_num ();
1150 if (flag_strength_reduce)
1152 if (update_end && GET_CODE (update_end) == CODE_LABEL)
1153 /* Ensure our label doesn't go away. */
1154 LABEL_NUSES (update_end)++;
1156 strength_reduce (loop, flags);
1158 reg_scan_update (update_start, update_end, loop_max_reg);
1159 loop_max_reg = max_reg_num ();
1161 if (update_end && GET_CODE (update_end) == CODE_LABEL
1162 && --LABEL_NUSES (update_end) == 0)
1163 delete_related_insns (update_end);
1167 /* The movable information is required for strength reduction. */
1168 loop_movables_free (movables);
1170 free (regs->array);
1171 regs->array = 0;
1172 regs->num = 0;
1175 /* Add elements to *OUTPUT to record all the pseudo-regs
1176 mentioned in IN_THIS but not mentioned in NOT_IN_THIS. */
1178 void
1179 record_excess_regs (in_this, not_in_this, output)
1180 rtx in_this, not_in_this;
1181 rtx *output;
1183 enum rtx_code code;
1184 const char *fmt;
1185 int i;
1187 code = GET_CODE (in_this);
1189 switch (code)
1191 case PC:
1192 case CC0:
1193 case CONST_INT:
1194 case CONST_DOUBLE:
1195 case CONST:
1196 case SYMBOL_REF:
1197 case LABEL_REF:
1198 return;
1200 case REG:
1201 if (REGNO (in_this) >= FIRST_PSEUDO_REGISTER
1202 && ! reg_mentioned_p (in_this, not_in_this))
1203 *output = gen_rtx_EXPR_LIST (VOIDmode, in_this, *output);
1204 return;
1206 default:
1207 break;
1210 fmt = GET_RTX_FORMAT (code);
1211 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1213 int j;
1215 switch (fmt[i])
1217 case 'E':
1218 for (j = 0; j < XVECLEN (in_this, i); j++)
1219 record_excess_regs (XVECEXP (in_this, i, j), not_in_this, output);
1220 break;
1222 case 'e':
1223 record_excess_regs (XEXP (in_this, i), not_in_this, output);
1224 break;
1229 /* Check what regs are referred to in the libcall block ending with INSN,
1230 aside from those mentioned in the equivalent value.
1231 If there are none, return 0.
1232 If there are one or more, return an EXPR_LIST containing all of them. */
1235 libcall_other_reg (insn, equiv)
1236 rtx insn, equiv;
1238 rtx note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
1239 rtx p = XEXP (note, 0);
1240 rtx output = 0;
1242 /* First, find all the regs used in the libcall block
1243 that are not mentioned as inputs to the result. */
1245 while (p != insn)
1247 if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
1248 || GET_CODE (p) == CALL_INSN)
1249 record_excess_regs (PATTERN (p), equiv, &output);
1250 p = NEXT_INSN (p);
1253 return output;
1256 /* Return 1 if all uses of REG
1257 are between INSN and the end of the basic block. */
1259 static int
1260 reg_in_basic_block_p (insn, reg)
1261 rtx insn, reg;
1263 int regno = REGNO (reg);
1264 rtx p;
1266 if (REGNO_FIRST_UID (regno) != INSN_UID (insn))
1267 return 0;
1269 /* Search this basic block for the already recorded last use of the reg. */
1270 for (p = insn; p; p = NEXT_INSN (p))
1272 switch (GET_CODE (p))
1274 case NOTE:
1275 break;
1277 case INSN:
1278 case CALL_INSN:
1279 /* Ordinary insn: if this is the last use, we win. */
1280 if (REGNO_LAST_UID (regno) == INSN_UID (p))
1281 return 1;
1282 break;
1284 case JUMP_INSN:
1285 /* Jump insn: if this is the last use, we win. */
1286 if (REGNO_LAST_UID (regno) == INSN_UID (p))
1287 return 1;
1288 /* Otherwise, it's the end of the basic block, so we lose. */
1289 return 0;
1291 case CODE_LABEL:
1292 case BARRIER:
1293 /* It's the end of the basic block, so we lose. */
1294 return 0;
1296 default:
1297 break;
1301 /* The "last use" that was recorded can't be found after the first
1302 use. This can happen when the last use was deleted while
1303 processing an inner loop, this inner loop was then completely
1304 unrolled, and the outer loop is always exited after the inner loop,
1305 so that everything after the first use becomes a single basic block. */
1306 return 1;
1309 /* Compute the benefit of eliminating the insns in the block whose
1310 last insn is LAST. This may be a group of insns used to compute a
1311 value directly or can contain a library call. */
1313 static int
1314 libcall_benefit (last)
1315 rtx last;
1317 rtx insn;
1318 int benefit = 0;
1320 for (insn = XEXP (find_reg_note (last, REG_RETVAL, NULL_RTX), 0);
1321 insn != last; insn = NEXT_INSN (insn))
1323 if (GET_CODE (insn) == CALL_INSN)
1324 benefit += 10; /* Assume at least this many insns in a library
1325 routine. */
1326 else if (GET_CODE (insn) == INSN
1327 && GET_CODE (PATTERN (insn)) != USE
1328 && GET_CODE (PATTERN (insn)) != CLOBBER)
1329 benefit++;
1332 return benefit;
1335 /* Skip COUNT insns from INSN, counting library calls as 1 insn. */
1337 static rtx
1338 skip_consec_insns (insn, count)
1339 rtx insn;
1340 int count;
1342 for (; count > 0; count--)
1344 rtx temp;
1346 /* If first insn of libcall sequence, skip to end. */
1347 /* Do this at start of loop, since INSN is guaranteed to
1348 be an insn here. */
1349 if (GET_CODE (insn) != NOTE
1350 && (temp = find_reg_note (insn, REG_LIBCALL, NULL_RTX)))
1351 insn = XEXP (temp, 0);
1354 insn = NEXT_INSN (insn);
1355 while (GET_CODE (insn) == NOTE);
1358 return insn;
1361 /* Ignore any movable whose insn falls within a libcall
1362 which is part of another movable.
1363 We make use of the fact that the movable for the libcall value
1364 was made later and so appears later on the chain. */
1366 static void
1367 ignore_some_movables (movables)
1368 struct loop_movables *movables;
1370 struct movable *m, *m1;
1372 for (m = movables->head; m; m = m->next)
1374 /* Is this a movable for the value of a libcall? */
1375 rtx note = find_reg_note (m->insn, REG_RETVAL, NULL_RTX);
1376 if (note)
1378 rtx insn;
1379 /* Check for earlier movables inside that range,
1380 and mark them invalid. We cannot use LUIDs here because
1381 insns created by loop.c for prior loops don't have LUIDs.
1382 Rather than reject all such insns from movables, we just
1383 explicitly check each insn in the libcall (since invariant
1384 libcalls aren't that common). */
1385 for (insn = XEXP (note, 0); insn != m->insn; insn = NEXT_INSN (insn))
1386 for (m1 = movables->head; m1 != m; m1 = m1->next)
1387 if (m1->insn == insn)
1388 m1->done = 1;
1393 /* For each movable insn, see if the reg that it loads
1394 leads when it dies right into another conditionally movable insn.
1395 If so, record that the second insn "forces" the first one,
1396 since the second can be moved only if the first is. */
1398 static void
1399 force_movables (movables)
1400 struct loop_movables *movables;
1402 struct movable *m, *m1;
1404 for (m1 = movables->head; m1; m1 = m1->next)
1405 /* Omit this if moving just the (SET (REG) 0) of a zero-extend. */
1406 if (!m1->partial && !m1->done)
1408 int regno = m1->regno;
1409 for (m = m1->next; m; m = m->next)
1410 /* ??? Could this be a bug? What if CSE caused the
1411 register of M1 to be used after this insn?
1412 Since CSE does not update regno_last_uid,
1413 this insn M->insn might not be where it dies.
1414 But very likely this doesn't matter; what matters is
1415 that M's reg is computed from M1's reg. */
1416 if (INSN_UID (m->insn) == REGNO_LAST_UID (regno)
1417 && !m->done)
1418 break;
1419 if (m != 0 && m->set_src == m1->set_dest
1420 /* If m->consec, m->set_src isn't valid. */
1421 && m->consec == 0)
1422 m = 0;
1424 /* Increase the priority of the moving the first insn
1425 since it permits the second to be moved as well. */
1426 if (m != 0)
1428 m->forces = m1;
1429 m1->lifetime += m->lifetime;
1430 m1->savings += m->savings;
1435 /* Find invariant expressions that are equal and can be combined into
1436 one register. */
1438 static void
1439 combine_movables (movables, regs)
1440 struct loop_movables *movables;
1441 struct loop_regs *regs;
1443 struct movable *m;
1444 char *matched_regs = (char *) xmalloc (regs->num);
1445 enum machine_mode mode;
1447 /* Regs that are set more than once are not allowed to match
1448 or be matched. I'm no longer sure why not. */
1449 /* Perhaps testing m->consec_sets would be more appropriate here? */
1451 for (m = movables->head; m; m = m->next)
1452 if (m->match == 0 && regs->array[m->regno].n_times_set == 1
1453 && !m->partial)
1455 struct movable *m1;
1456 int regno = m->regno;
1458 memset (matched_regs, 0, regs->num);
1459 matched_regs[regno] = 1;
1461 /* We want later insns to match the first one. Don't make the first
1462 one match any later ones. So start this loop at m->next. */
1463 for (m1 = m->next; m1; m1 = m1->next)
1464 /* ??? HACK! move_movables does not verify that the replacement
1465 is valid, which can have disasterous effects with hard regs
1466 and match_dup. Turn combination off for now. */
1467 if (0 && m != m1 && m1->match == 0
1468 && regs->array[m1->regno].n_times_set == 1
1469 /* A reg used outside the loop mustn't be eliminated. */
1470 && !m1->global
1471 /* A reg used for zero-extending mustn't be eliminated. */
1472 && !m1->partial
1473 && (matched_regs[m1->regno]
1476 /* Can combine regs with different modes loaded from the
1477 same constant only if the modes are the same or
1478 if both are integer modes with M wider or the same
1479 width as M1. The check for integer is redundant, but
1480 safe, since the only case of differing destination
1481 modes with equal sources is when both sources are
1482 VOIDmode, i.e., CONST_INT. */
1483 (GET_MODE (m->set_dest) == GET_MODE (m1->set_dest)
1484 || (GET_MODE_CLASS (GET_MODE (m->set_dest)) == MODE_INT
1485 && GET_MODE_CLASS (GET_MODE (m1->set_dest)) == MODE_INT
1486 && (GET_MODE_BITSIZE (GET_MODE (m->set_dest))
1487 >= GET_MODE_BITSIZE (GET_MODE (m1->set_dest)))))
1488 /* See if the source of M1 says it matches M. */
1489 && ((GET_CODE (m1->set_src) == REG
1490 && matched_regs[REGNO (m1->set_src)])
1491 || rtx_equal_for_loop_p (m->set_src, m1->set_src,
1492 movables, regs))))
1493 && ((m->dependencies == m1->dependencies)
1494 || rtx_equal_p (m->dependencies, m1->dependencies)))
1496 m->lifetime += m1->lifetime;
1497 m->savings += m1->savings;
1498 m1->done = 1;
1499 m1->match = m;
1500 matched_regs[m1->regno] = 1;
1504 /* Now combine the regs used for zero-extension.
1505 This can be done for those not marked `global'
1506 provided their lives don't overlap. */
1508 for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
1509 mode = GET_MODE_WIDER_MODE (mode))
1511 struct movable *m0 = 0;
1513 /* Combine all the registers for extension from mode MODE.
1514 Don't combine any that are used outside this loop. */
1515 for (m = movables->head; m; m = m->next)
1516 if (m->partial && ! m->global
1517 && mode == GET_MODE (SET_SRC (PATTERN (NEXT_INSN (m->insn)))))
1519 struct movable *m1;
1521 int first = REGNO_FIRST_LUID (m->regno);
1522 int last = REGNO_LAST_LUID (m->regno);
1524 if (m0 == 0)
1526 /* First one: don't check for overlap, just record it. */
1527 m0 = m;
1528 continue;
1531 /* Make sure they extend to the same mode.
1532 (Almost always true.) */
1533 if (GET_MODE (m->set_dest) != GET_MODE (m0->set_dest))
1534 continue;
1536 /* We already have one: check for overlap with those
1537 already combined together. */
1538 for (m1 = movables->head; m1 != m; m1 = m1->next)
1539 if (m1 == m0 || (m1->partial && m1->match == m0))
1540 if (! (REGNO_FIRST_LUID (m1->regno) > last
1541 || REGNO_LAST_LUID (m1->regno) < first))
1542 goto overlap;
1544 /* No overlap: we can combine this with the others. */
1545 m0->lifetime += m->lifetime;
1546 m0->savings += m->savings;
1547 m->done = 1;
1548 m->match = m0;
1550 overlap:
1555 /* Clean up. */
1556 free (matched_regs);
1559 /* Returns the number of movable instructions in LOOP that were not
1560 moved outside the loop. */
1562 static int
1563 num_unmoved_movables (loop)
1564 const struct loop *loop;
1566 int num = 0;
1567 struct movable *m;
1569 for (m = LOOP_MOVABLES (loop)->head; m; m = m->next)
1570 if (!m->done)
1571 ++num;
1573 return num;
1577 /* Return 1 if regs X and Y will become the same if moved. */
1579 static int
1580 regs_match_p (x, y, movables)
1581 rtx x, y;
1582 struct loop_movables *movables;
1584 unsigned int xn = REGNO (x);
1585 unsigned int yn = REGNO (y);
1586 struct movable *mx, *my;
1588 for (mx = movables->head; mx; mx = mx->next)
1589 if (mx->regno == xn)
1590 break;
1592 for (my = movables->head; my; my = my->next)
1593 if (my->regno == yn)
1594 break;
1596 return (mx && my
1597 && ((mx->match == my->match && mx->match != 0)
1598 || mx->match == my
1599 || mx == my->match));
1602 /* Return 1 if X and Y are identical-looking rtx's.
1603 This is the Lisp function EQUAL for rtx arguments.
1605 If two registers are matching movables or a movable register and an
1606 equivalent constant, consider them equal. */
1608 static int
1609 rtx_equal_for_loop_p (x, y, movables, regs)
1610 rtx x, y;
1611 struct loop_movables *movables;
1612 struct loop_regs *regs;
1614 int i;
1615 int j;
1616 struct movable *m;
1617 enum rtx_code code;
1618 const char *fmt;
1620 if (x == y)
1621 return 1;
1622 if (x == 0 || y == 0)
1623 return 0;
1625 code = GET_CODE (x);
1627 /* If we have a register and a constant, they may sometimes be
1628 equal. */
1629 if (GET_CODE (x) == REG && regs->array[REGNO (x)].set_in_loop == -2
1630 && CONSTANT_P (y))
1632 for (m = movables->head; m; m = m->next)
1633 if (m->move_insn && m->regno == REGNO (x)
1634 && rtx_equal_p (m->set_src, y))
1635 return 1;
1637 else if (GET_CODE (y) == REG && regs->array[REGNO (y)].set_in_loop == -2
1638 && CONSTANT_P (x))
1640 for (m = movables->head; m; m = m->next)
1641 if (m->move_insn && m->regno == REGNO (y)
1642 && rtx_equal_p (m->set_src, x))
1643 return 1;
1646 /* Otherwise, rtx's of different codes cannot be equal. */
1647 if (code != GET_CODE (y))
1648 return 0;
1650 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
1651 (REG:SI x) and (REG:HI x) are NOT equivalent. */
1653 if (GET_MODE (x) != GET_MODE (y))
1654 return 0;
1656 /* These three types of rtx's can be compared nonrecursively. */
1657 if (code == REG)
1658 return (REGNO (x) == REGNO (y) || regs_match_p (x, y, movables));
1660 if (code == LABEL_REF)
1661 return XEXP (x, 0) == XEXP (y, 0);
1662 if (code == SYMBOL_REF)
1663 return XSTR (x, 0) == XSTR (y, 0);
1665 /* Compare the elements. If any pair of corresponding elements
1666 fail to match, return 0 for the whole things. */
1668 fmt = GET_RTX_FORMAT (code);
1669 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1671 switch (fmt[i])
1673 case 'w':
1674 if (XWINT (x, i) != XWINT (y, i))
1675 return 0;
1676 break;
1678 case 'i':
1679 if (XINT (x, i) != XINT (y, i))
1680 return 0;
1681 break;
1683 case 'E':
1684 /* Two vectors must have the same length. */
1685 if (XVECLEN (x, i) != XVECLEN (y, i))
1686 return 0;
1688 /* And the corresponding elements must match. */
1689 for (j = 0; j < XVECLEN (x, i); j++)
1690 if (rtx_equal_for_loop_p (XVECEXP (x, i, j), XVECEXP (y, i, j),
1691 movables, regs) == 0)
1692 return 0;
1693 break;
1695 case 'e':
1696 if (rtx_equal_for_loop_p (XEXP (x, i), XEXP (y, i), movables, regs)
1697 == 0)
1698 return 0;
1699 break;
1701 case 's':
1702 if (strcmp (XSTR (x, i), XSTR (y, i)))
1703 return 0;
1704 break;
1706 case 'u':
1707 /* These are just backpointers, so they don't matter. */
1708 break;
1710 case '0':
1711 break;
1713 /* It is believed that rtx's at this level will never
1714 contain anything but integers and other rtx's,
1715 except for within LABEL_REFs and SYMBOL_REFs. */
1716 default:
1717 abort ();
1720 return 1;
1723 /* If X contains any LABEL_REF's, add REG_LABEL notes for them to all
1724 insns in INSNS which use the reference. LABEL_NUSES for CODE_LABEL
1725 references is incremented once for each added note. */
1727 static void
1728 add_label_notes (x, insns)
1729 rtx x;
1730 rtx insns;
1732 enum rtx_code code = GET_CODE (x);
1733 int i, j;
1734 const char *fmt;
1735 rtx insn;
1737 if (code == LABEL_REF && !LABEL_REF_NONLOCAL_P (x))
1739 /* This code used to ignore labels that referred to dispatch tables to
1740 avoid flow generating (slighly) worse code.
1742 We no longer ignore such label references (see LABEL_REF handling in
1743 mark_jump_label for additional information). */
1744 for (insn = insns; insn; insn = NEXT_INSN (insn))
1745 if (reg_mentioned_p (XEXP (x, 0), insn))
1747 REG_NOTES (insn) = gen_rtx_INSN_LIST (REG_LABEL, XEXP (x, 0),
1748 REG_NOTES (insn));
1749 if (LABEL_P (XEXP (x, 0)))
1750 LABEL_NUSES (XEXP (x, 0))++;
1754 fmt = GET_RTX_FORMAT (code);
1755 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1757 if (fmt[i] == 'e')
1758 add_label_notes (XEXP (x, i), insns);
1759 else if (fmt[i] == 'E')
1760 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1761 add_label_notes (XVECEXP (x, i, j), insns);
1765 /* Scan MOVABLES, and move the insns that deserve to be moved.
1766 If two matching movables are combined, replace one reg with the
1767 other throughout. */
1769 static void
1770 move_movables (loop, movables, threshold, insn_count)
1771 struct loop *loop;
1772 struct loop_movables *movables;
1773 int threshold;
1774 int insn_count;
1776 struct loop_regs *regs = LOOP_REGS (loop);
1777 int nregs = regs->num;
1778 rtx new_start = 0;
1779 struct movable *m;
1780 rtx p;
1781 rtx loop_start = loop->start;
1782 rtx loop_end = loop->end;
1783 /* Map of pseudo-register replacements to handle combining
1784 when we move several insns that load the same value
1785 into different pseudo-registers. */
1786 rtx *reg_map = (rtx *) xcalloc (nregs, sizeof (rtx));
1787 char *already_moved = (char *) xcalloc (nregs, sizeof (char));
1789 for (m = movables->head; m; m = m->next)
1791 /* Describe this movable insn. */
1793 if (loop_dump_stream)
1795 fprintf (loop_dump_stream, "Insn %d: regno %d (life %d), ",
1796 INSN_UID (m->insn), m->regno, m->lifetime);
1797 if (m->consec > 0)
1798 fprintf (loop_dump_stream, "consec %d, ", m->consec);
1799 if (m->cond)
1800 fprintf (loop_dump_stream, "cond ");
1801 if (m->force)
1802 fprintf (loop_dump_stream, "force ");
1803 if (m->global)
1804 fprintf (loop_dump_stream, "global ");
1805 if (m->done)
1806 fprintf (loop_dump_stream, "done ");
1807 if (m->move_insn)
1808 fprintf (loop_dump_stream, "move-insn ");
1809 if (m->match)
1810 fprintf (loop_dump_stream, "matches %d ",
1811 INSN_UID (m->match->insn));
1812 if (m->forces)
1813 fprintf (loop_dump_stream, "forces %d ",
1814 INSN_UID (m->forces->insn));
1817 /* Ignore the insn if it's already done (it matched something else).
1818 Otherwise, see if it is now safe to move. */
1820 if (!m->done
1821 && (! m->cond
1822 || (1 == loop_invariant_p (loop, m->set_src)
1823 && (m->dependencies == 0
1824 || 1 == loop_invariant_p (loop, m->dependencies))
1825 && (m->consec == 0
1826 || 1 == consec_sets_invariant_p (loop, m->set_dest,
1827 m->consec + 1,
1828 m->insn))))
1829 && (! m->forces || m->forces->done))
1831 int regno;
1832 rtx p;
1833 int savings = m->savings;
1835 /* We have an insn that is safe to move.
1836 Compute its desirability. */
1838 p = m->insn;
1839 regno = m->regno;
1841 if (loop_dump_stream)
1842 fprintf (loop_dump_stream, "savings %d ", savings);
1844 if (regs->array[regno].moved_once && loop_dump_stream)
1845 fprintf (loop_dump_stream, "halved since already moved ");
1847 /* An insn MUST be moved if we already moved something else
1848 which is safe only if this one is moved too: that is,
1849 if already_moved[REGNO] is nonzero. */
1851 /* An insn is desirable to move if the new lifetime of the
1852 register is no more than THRESHOLD times the old lifetime.
1853 If it's not desirable, it means the loop is so big
1854 that moving won't speed things up much,
1855 and it is liable to make register usage worse. */
1857 /* It is also desirable to move if it can be moved at no
1858 extra cost because something else was already moved. */
1860 if (already_moved[regno]
1861 || flag_move_all_movables
1862 || (threshold * savings * m->lifetime) >=
1863 (regs->array[regno].moved_once ? insn_count * 2 : insn_count)
1864 || (m->forces && m->forces->done
1865 && regs->array[m->forces->regno].n_times_set == 1))
1867 int count;
1868 struct movable *m1;
1869 rtx first = NULL_RTX;
1871 /* Now move the insns that set the reg. */
1873 if (m->partial && m->match)
1875 rtx newpat, i1;
1876 rtx r1, r2;
1877 /* Find the end of this chain of matching regs.
1878 Thus, we load each reg in the chain from that one reg.
1879 And that reg is loaded with 0 directly,
1880 since it has ->match == 0. */
1881 for (m1 = m; m1->match; m1 = m1->match);
1882 newpat = gen_move_insn (SET_DEST (PATTERN (m->insn)),
1883 SET_DEST (PATTERN (m1->insn)));
1884 i1 = loop_insn_hoist (loop, newpat);
1886 /* Mark the moved, invariant reg as being allowed to
1887 share a hard reg with the other matching invariant. */
1888 REG_NOTES (i1) = REG_NOTES (m->insn);
1889 r1 = SET_DEST (PATTERN (m->insn));
1890 r2 = SET_DEST (PATTERN (m1->insn));
1891 regs_may_share
1892 = gen_rtx_EXPR_LIST (VOIDmode, r1,
1893 gen_rtx_EXPR_LIST (VOIDmode, r2,
1894 regs_may_share));
1895 delete_insn (m->insn);
1897 if (new_start == 0)
1898 new_start = i1;
1900 if (loop_dump_stream)
1901 fprintf (loop_dump_stream, " moved to %d", INSN_UID (i1));
1903 /* If we are to re-generate the item being moved with a
1904 new move insn, first delete what we have and then emit
1905 the move insn before the loop. */
1906 else if (m->move_insn)
1908 rtx i1, temp, seq;
1910 for (count = m->consec; count >= 0; count--)
1912 /* If this is the first insn of a library call sequence,
1913 skip to the end. */
1914 if (GET_CODE (p) != NOTE
1915 && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
1916 p = XEXP (temp, 0);
1918 /* If this is the last insn of a libcall sequence, then
1919 delete every insn in the sequence except the last.
1920 The last insn is handled in the normal manner. */
1921 if (GET_CODE (p) != NOTE
1922 && (temp = find_reg_note (p, REG_RETVAL, NULL_RTX)))
1924 temp = XEXP (temp, 0);
1925 while (temp != p)
1926 temp = delete_insn (temp);
1929 temp = p;
1930 p = delete_insn (p);
1932 /* simplify_giv_expr expects that it can walk the insns
1933 at m->insn forwards and see this old sequence we are
1934 tossing here. delete_insn does preserve the next
1935 pointers, but when we skip over a NOTE we must fix
1936 it up. Otherwise that code walks into the non-deleted
1937 insn stream. */
1938 while (p && GET_CODE (p) == NOTE)
1939 p = NEXT_INSN (temp) = NEXT_INSN (p);
1942 start_sequence ();
1943 emit_move_insn (m->set_dest, m->set_src);
1944 temp = get_insns ();
1945 seq = gen_sequence ();
1946 end_sequence ();
1948 add_label_notes (m->set_src, temp);
1950 i1 = loop_insn_hoist (loop, seq);
1951 if (! find_reg_note (i1, REG_EQUAL, NULL_RTX))
1952 set_unique_reg_note (i1,
1953 m->is_equiv ? REG_EQUIV : REG_EQUAL,
1954 m->set_src);
1956 if (loop_dump_stream)
1957 fprintf (loop_dump_stream, " moved to %d", INSN_UID (i1));
1959 /* The more regs we move, the less we like moving them. */
1960 threshold -= 3;
1962 else
1964 for (count = m->consec; count >= 0; count--)
1966 rtx i1, temp;
1968 /* If first insn of libcall sequence, skip to end. */
1969 /* Do this at start of loop, since p is guaranteed to
1970 be an insn here. */
1971 if (GET_CODE (p) != NOTE
1972 && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
1973 p = XEXP (temp, 0);
1975 /* If last insn of libcall sequence, move all
1976 insns except the last before the loop. The last
1977 insn is handled in the normal manner. */
1978 if (GET_CODE (p) != NOTE
1979 && (temp = find_reg_note (p, REG_RETVAL, NULL_RTX)))
1981 rtx fn_address = 0;
1982 rtx fn_reg = 0;
1983 rtx fn_address_insn = 0;
1985 first = 0;
1986 for (temp = XEXP (temp, 0); temp != p;
1987 temp = NEXT_INSN (temp))
1989 rtx body;
1990 rtx n;
1991 rtx next;
1993 if (GET_CODE (temp) == NOTE)
1994 continue;
1996 body = PATTERN (temp);
1998 /* Find the next insn after TEMP,
1999 not counting USE or NOTE insns. */
2000 for (next = NEXT_INSN (temp); next != p;
2001 next = NEXT_INSN (next))
2002 if (! (GET_CODE (next) == INSN
2003 && GET_CODE (PATTERN (next)) == USE)
2004 && GET_CODE (next) != NOTE)
2005 break;
2007 /* If that is the call, this may be the insn
2008 that loads the function address.
2010 Extract the function address from the insn
2011 that loads it into a register.
2012 If this insn was cse'd, we get incorrect code.
2014 So emit a new move insn that copies the
2015 function address into the register that the
2016 call insn will use. flow.c will delete any
2017 redundant stores that we have created. */
2018 if (GET_CODE (next) == CALL_INSN
2019 && GET_CODE (body) == SET
2020 && GET_CODE (SET_DEST (body)) == REG
2021 && (n = find_reg_note (temp, REG_EQUAL,
2022 NULL_RTX)))
2024 fn_reg = SET_SRC (body);
2025 if (GET_CODE (fn_reg) != REG)
2026 fn_reg = SET_DEST (body);
2027 fn_address = XEXP (n, 0);
2028 fn_address_insn = temp;
2030 /* We have the call insn.
2031 If it uses the register we suspect it might,
2032 load it with the correct address directly. */
2033 if (GET_CODE (temp) == CALL_INSN
2034 && fn_address != 0
2035 && reg_referenced_p (fn_reg, body))
2036 loop_insn_emit_after (loop, 0, fn_address_insn,
2037 gen_move_insn
2038 (fn_reg, fn_address));
2040 if (GET_CODE (temp) == CALL_INSN)
2042 i1 = loop_call_insn_hoist (loop, body);
2043 /* Because the USAGE information potentially
2044 contains objects other than hard registers
2045 we need to copy it. */
2046 if (CALL_INSN_FUNCTION_USAGE (temp))
2047 CALL_INSN_FUNCTION_USAGE (i1)
2048 = copy_rtx (CALL_INSN_FUNCTION_USAGE (temp));
2050 else
2051 i1 = loop_insn_hoist (loop, body);
2052 if (first == 0)
2053 first = i1;
2054 if (temp == fn_address_insn)
2055 fn_address_insn = i1;
2056 REG_NOTES (i1) = REG_NOTES (temp);
2057 REG_NOTES (temp) = NULL;
2058 delete_insn (temp);
2060 if (new_start == 0)
2061 new_start = first;
2063 if (m->savemode != VOIDmode)
2065 /* P sets REG to zero; but we should clear only
2066 the bits that are not covered by the mode
2067 m->savemode. */
2068 rtx reg = m->set_dest;
2069 rtx sequence;
2070 rtx tem;
2072 start_sequence ();
2073 tem = expand_simple_binop
2074 (GET_MODE (reg), AND, reg,
2075 GEN_INT ((((HOST_WIDE_INT) 1
2076 << GET_MODE_BITSIZE (m->savemode)))
2077 - 1),
2078 reg, 1, OPTAB_LIB_WIDEN);
2079 if (tem == 0)
2080 abort ();
2081 if (tem != reg)
2082 emit_move_insn (reg, tem);
2083 sequence = gen_sequence ();
2084 end_sequence ();
2085 i1 = loop_insn_hoist (loop, sequence);
2087 else if (GET_CODE (p) == CALL_INSN)
2089 i1 = loop_call_insn_hoist (loop, PATTERN (p));
2090 /* Because the USAGE information potentially
2091 contains objects other than hard registers
2092 we need to copy it. */
2093 if (CALL_INSN_FUNCTION_USAGE (p))
2094 CALL_INSN_FUNCTION_USAGE (i1)
2095 = copy_rtx (CALL_INSN_FUNCTION_USAGE (p));
2097 else if (count == m->consec && m->move_insn_first)
2099 rtx seq;
2100 /* The SET_SRC might not be invariant, so we must
2101 use the REG_EQUAL note. */
2102 start_sequence ();
2103 emit_move_insn (m->set_dest, m->set_src);
2104 temp = get_insns ();
2105 seq = gen_sequence ();
2106 end_sequence ();
2108 add_label_notes (m->set_src, temp);
2110 i1 = loop_insn_hoist (loop, seq);
2111 if (! find_reg_note (i1, REG_EQUAL, NULL_RTX))
2112 set_unique_reg_note (i1, m->is_equiv ? REG_EQUIV
2113 : REG_EQUAL, m->set_src);
2115 else
2116 i1 = loop_insn_hoist (loop, PATTERN (p));
2118 if (REG_NOTES (i1) == 0)
2120 REG_NOTES (i1) = REG_NOTES (p);
2121 REG_NOTES (p) = NULL;
2123 /* If there is a REG_EQUAL note present whose value
2124 is not loop invariant, then delete it, since it
2125 may cause problems with later optimization passes.
2126 It is possible for cse to create such notes
2127 like this as a result of record_jump_cond. */
2129 if ((temp = find_reg_note (i1, REG_EQUAL, NULL_RTX))
2130 && ! loop_invariant_p (loop, XEXP (temp, 0)))
2131 remove_note (i1, temp);
2134 if (new_start == 0)
2135 new_start = i1;
2137 if (loop_dump_stream)
2138 fprintf (loop_dump_stream, " moved to %d",
2139 INSN_UID (i1));
2141 /* If library call, now fix the REG_NOTES that contain
2142 insn pointers, namely REG_LIBCALL on FIRST
2143 and REG_RETVAL on I1. */
2144 if ((temp = find_reg_note (i1, REG_RETVAL, NULL_RTX)))
2146 XEXP (temp, 0) = first;
2147 temp = find_reg_note (first, REG_LIBCALL, NULL_RTX);
2148 XEXP (temp, 0) = i1;
2151 temp = p;
2152 delete_insn (p);
2153 p = NEXT_INSN (p);
2155 /* simplify_giv_expr expects that it can walk the insns
2156 at m->insn forwards and see this old sequence we are
2157 tossing here. delete_insn does preserve the next
2158 pointers, but when we skip over a NOTE we must fix
2159 it up. Otherwise that code walks into the non-deleted
2160 insn stream. */
2161 while (p && GET_CODE (p) == NOTE)
2162 p = NEXT_INSN (temp) = NEXT_INSN (p);
2165 /* The more regs we move, the less we like moving them. */
2166 threshold -= 3;
2169 /* Any other movable that loads the same register
2170 MUST be moved. */
2171 already_moved[regno] = 1;
2173 /* This reg has been moved out of one loop. */
2174 regs->array[regno].moved_once = 1;
2176 /* The reg set here is now invariant. */
2177 if (! m->partial)
2179 int i;
2180 for (i = 0; i < LOOP_REGNO_NREGS (regno, m->set_dest); i++)
2181 regs->array[regno+i].set_in_loop = 0;
2184 m->done = 1;
2186 /* Change the length-of-life info for the register
2187 to say it lives at least the full length of this loop.
2188 This will help guide optimizations in outer loops. */
2190 if (REGNO_FIRST_LUID (regno) > INSN_LUID (loop_start))
2191 /* This is the old insn before all the moved insns.
2192 We can't use the moved insn because it is out of range
2193 in uid_luid. Only the old insns have luids. */
2194 REGNO_FIRST_UID (regno) = INSN_UID (loop_start);
2195 if (REGNO_LAST_LUID (regno) < INSN_LUID (loop_end))
2196 REGNO_LAST_UID (regno) = INSN_UID (loop_end);
2198 /* Combine with this moved insn any other matching movables. */
2200 if (! m->partial)
2201 for (m1 = movables->head; m1; m1 = m1->next)
2202 if (m1->match == m)
2204 rtx temp;
2206 /* Schedule the reg loaded by M1
2207 for replacement so that shares the reg of M.
2208 If the modes differ (only possible in restricted
2209 circumstances, make a SUBREG.
2211 Note this assumes that the target dependent files
2212 treat REG and SUBREG equally, including within
2213 GO_IF_LEGITIMATE_ADDRESS and in all the
2214 predicates since we never verify that replacing the
2215 original register with a SUBREG results in a
2216 recognizable insn. */
2217 if (GET_MODE (m->set_dest) == GET_MODE (m1->set_dest))
2218 reg_map[m1->regno] = m->set_dest;
2219 else
2220 reg_map[m1->regno]
2221 = gen_lowpart_common (GET_MODE (m1->set_dest),
2222 m->set_dest);
2224 /* Get rid of the matching insn
2225 and prevent further processing of it. */
2226 m1->done = 1;
2228 /* if library call, delete all insns. */
2229 if ((temp = find_reg_note (m1->insn, REG_RETVAL,
2230 NULL_RTX)))
2231 delete_insn_chain (XEXP (temp, 0), m1->insn);
2232 else
2233 delete_insn (m1->insn);
2235 /* Any other movable that loads the same register
2236 MUST be moved. */
2237 already_moved[m1->regno] = 1;
2239 /* The reg merged here is now invariant,
2240 if the reg it matches is invariant. */
2241 if (! m->partial)
2243 int i;
2244 for (i = 0;
2245 i < LOOP_REGNO_NREGS (regno, m1->set_dest);
2246 i++)
2247 regs->array[m1->regno+i].set_in_loop = 0;
2251 else if (loop_dump_stream)
2252 fprintf (loop_dump_stream, "not desirable");
2254 else if (loop_dump_stream && !m->match)
2255 fprintf (loop_dump_stream, "not safe");
2257 if (loop_dump_stream)
2258 fprintf (loop_dump_stream, "\n");
2261 if (new_start == 0)
2262 new_start = loop_start;
2264 /* Go through all the instructions in the loop, making
2265 all the register substitutions scheduled in REG_MAP. */
2266 for (p = new_start; p != loop_end; p = NEXT_INSN (p))
2267 if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
2268 || GET_CODE (p) == CALL_INSN)
2270 replace_regs (PATTERN (p), reg_map, nregs, 0);
2271 replace_regs (REG_NOTES (p), reg_map, nregs, 0);
2272 INSN_CODE (p) = -1;
2275 /* Clean up. */
2276 free (reg_map);
2277 free (already_moved);
2281 static void
2282 loop_movables_add (movables, m)
2283 struct loop_movables *movables;
2284 struct movable *m;
2286 if (movables->head == 0)
2287 movables->head = m;
2288 else
2289 movables->last->next = m;
2290 movables->last = m;
2294 static void
2295 loop_movables_free (movables)
2296 struct loop_movables *movables;
2298 struct movable *m;
2299 struct movable *m_next;
2301 for (m = movables->head; m; m = m_next)
2303 m_next = m->next;
2304 free (m);
2308 #if 0
2309 /* Scan X and replace the address of any MEM in it with ADDR.
2310 REG is the address that MEM should have before the replacement. */
2312 static void
2313 replace_call_address (x, reg, addr)
2314 rtx x, reg, addr;
2316 enum rtx_code code;
2317 int i;
2318 const char *fmt;
2320 if (x == 0)
2321 return;
2322 code = GET_CODE (x);
2323 switch (code)
2325 case PC:
2326 case CC0:
2327 case CONST_INT:
2328 case CONST_DOUBLE:
2329 case CONST:
2330 case SYMBOL_REF:
2331 case LABEL_REF:
2332 case REG:
2333 return;
2335 case SET:
2336 /* Short cut for very common case. */
2337 replace_call_address (XEXP (x, 1), reg, addr);
2338 return;
2340 case CALL:
2341 /* Short cut for very common case. */
2342 replace_call_address (XEXP (x, 0), reg, addr);
2343 return;
2345 case MEM:
2346 /* If this MEM uses a reg other than the one we expected,
2347 something is wrong. */
2348 if (XEXP (x, 0) != reg)
2349 abort ();
2350 XEXP (x, 0) = addr;
2351 return;
2353 default:
2354 break;
2357 fmt = GET_RTX_FORMAT (code);
2358 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2360 if (fmt[i] == 'e')
2361 replace_call_address (XEXP (x, i), reg, addr);
2362 else if (fmt[i] == 'E')
2364 int j;
2365 for (j = 0; j < XVECLEN (x, i); j++)
2366 replace_call_address (XVECEXP (x, i, j), reg, addr);
2370 #endif
2372 /* Return the number of memory refs to addresses that vary
2373 in the rtx X. */
2375 static int
2376 count_nonfixed_reads (loop, x)
2377 const struct loop *loop;
2378 rtx x;
2380 enum rtx_code code;
2381 int i;
2382 const char *fmt;
2383 int value;
2385 if (x == 0)
2386 return 0;
2388 code = GET_CODE (x);
2389 switch (code)
2391 case PC:
2392 case CC0:
2393 case CONST_INT:
2394 case CONST_DOUBLE:
2395 case CONST:
2396 case SYMBOL_REF:
2397 case LABEL_REF:
2398 case REG:
2399 return 0;
2401 case MEM:
2402 return ((loop_invariant_p (loop, XEXP (x, 0)) != 1)
2403 + count_nonfixed_reads (loop, XEXP (x, 0)));
2405 default:
2406 break;
2409 value = 0;
2410 fmt = GET_RTX_FORMAT (code);
2411 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2413 if (fmt[i] == 'e')
2414 value += count_nonfixed_reads (loop, XEXP (x, i));
2415 if (fmt[i] == 'E')
2417 int j;
2418 for (j = 0; j < XVECLEN (x, i); j++)
2419 value += count_nonfixed_reads (loop, XVECEXP (x, i, j));
2422 return value;
2425 /* Scan a loop setting the elements `cont', `vtop', `loops_enclosed',
2426 `has_call', `has_nonconst_call', `has_volatile', `has_tablejump',
2427 `unknown_address_altered', `unknown_constant_address_altered', and
2428 `num_mem_sets' in LOOP. Also, fill in the array `mems' and the
2429 list `store_mems' in LOOP. */
2431 static void
2432 prescan_loop (loop)
2433 struct loop *loop;
2435 int level = 1;
2436 rtx insn;
2437 struct loop_info *loop_info = LOOP_INFO (loop);
2438 rtx start = loop->start;
2439 rtx end = loop->end;
2440 /* The label after END. Jumping here is just like falling off the
2441 end of the loop. We use next_nonnote_insn instead of next_label
2442 as a hedge against the (pathological) case where some actual insn
2443 might end up between the two. */
2444 rtx exit_target = next_nonnote_insn (end);
2446 loop_info->has_indirect_jump = indirect_jump_in_function;
2447 loop_info->pre_header_has_call = 0;
2448 loop_info->has_call = 0;
2449 loop_info->has_nonconst_call = 0;
2450 loop_info->has_volatile = 0;
2451 loop_info->has_tablejump = 0;
2452 loop_info->has_multiple_exit_targets = 0;
2453 loop->level = 1;
2455 loop_info->unknown_address_altered = 0;
2456 loop_info->unknown_constant_address_altered = 0;
2457 loop_info->store_mems = NULL_RTX;
2458 loop_info->first_loop_store_insn = NULL_RTX;
2459 loop_info->mems_idx = 0;
2460 loop_info->num_mem_sets = 0;
2463 for (insn = start; insn && GET_CODE (insn) != CODE_LABEL;
2464 insn = PREV_INSN (insn))
2466 if (GET_CODE (insn) == CALL_INSN)
2468 loop_info->pre_header_has_call = 1;
2469 break;
2473 for (insn = NEXT_INSN (start); insn != NEXT_INSN (end);
2474 insn = NEXT_INSN (insn))
2476 switch (GET_CODE (insn))
2478 case NOTE:
2479 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
2481 ++level;
2482 /* Count number of loops contained in this one. */
2483 loop->level++;
2485 else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
2486 --level;
2487 break;
2489 case CALL_INSN:
2490 if (! CONST_OR_PURE_CALL_P (insn))
2492 loop_info->unknown_address_altered = 1;
2493 loop_info->has_nonconst_call = 1;
2495 loop_info->has_call = 1;
2496 if (can_throw_internal (insn))
2497 loop_info->has_multiple_exit_targets = 1;
2498 break;
2500 case JUMP_INSN:
2501 if (! loop_info->has_multiple_exit_targets)
2503 rtx set = pc_set (insn);
2505 if (set)
2507 rtx label1, label2;
2509 if (GET_CODE (SET_SRC (set)) == IF_THEN_ELSE)
2511 label1 = XEXP (SET_SRC (set), 1);
2512 label2 = XEXP (SET_SRC (set), 2);
2514 else
2516 label1 = SET_SRC (PATTERN (insn));
2517 label2 = NULL_RTX;
2522 if (label1 && label1 != pc_rtx)
2524 if (GET_CODE (label1) != LABEL_REF)
2526 /* Something tricky. */
2527 loop_info->has_multiple_exit_targets = 1;
2528 break;
2530 else if (XEXP (label1, 0) != exit_target
2531 && LABEL_OUTSIDE_LOOP_P (label1))
2533 /* A jump outside the current loop. */
2534 loop_info->has_multiple_exit_targets = 1;
2535 break;
2539 label1 = label2;
2540 label2 = NULL_RTX;
2542 while (label1);
2544 else
2546 /* A return, or something tricky. */
2547 loop_info->has_multiple_exit_targets = 1;
2550 /* FALLTHRU */
2552 case INSN:
2553 if (volatile_refs_p (PATTERN (insn)))
2554 loop_info->has_volatile = 1;
2556 if (GET_CODE (insn) == JUMP_INSN
2557 && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
2558 || GET_CODE (PATTERN (insn)) == ADDR_VEC))
2559 loop_info->has_tablejump = 1;
2561 note_stores (PATTERN (insn), note_addr_stored, loop_info);
2562 if (! loop_info->first_loop_store_insn && loop_info->store_mems)
2563 loop_info->first_loop_store_insn = insn;
2565 if (flag_non_call_exceptions && can_throw_internal (insn))
2566 loop_info->has_multiple_exit_targets = 1;
2567 break;
2569 default:
2570 break;
2574 /* Now, rescan the loop, setting up the LOOP_MEMS array. */
2575 if (/* An exception thrown by a called function might land us
2576 anywhere. */
2577 ! loop_info->has_nonconst_call
2578 /* We don't want loads for MEMs moved to a location before the
2579 one at which their stack memory becomes allocated. (Note
2580 that this is not a problem for malloc, etc., since those
2581 require actual function calls. */
2582 && ! current_function_calls_alloca
2583 /* There are ways to leave the loop other than falling off the
2584 end. */
2585 && ! loop_info->has_multiple_exit_targets)
2586 for (insn = NEXT_INSN (start); insn != NEXT_INSN (end);
2587 insn = NEXT_INSN (insn))
2588 for_each_rtx (&insn, insert_loop_mem, loop_info);
2590 /* BLKmode MEMs are added to LOOP_STORE_MEM as necessary so
2591 that loop_invariant_p and load_mems can use true_dependence
2592 to determine what is really clobbered. */
2593 if (loop_info->unknown_address_altered)
2595 rtx mem = gen_rtx_MEM (BLKmode, const0_rtx);
2597 loop_info->store_mems
2598 = gen_rtx_EXPR_LIST (VOIDmode, mem, loop_info->store_mems);
2600 if (loop_info->unknown_constant_address_altered)
2602 rtx mem = gen_rtx_MEM (BLKmode, const0_rtx);
2604 RTX_UNCHANGING_P (mem) = 1;
2605 loop_info->store_mems
2606 = gen_rtx_EXPR_LIST (VOIDmode, mem, loop_info->store_mems);
2610 /* Scan the function looking for loops. Record the start and end of each loop.
2611 Also mark as invalid loops any loops that contain a setjmp or are branched
2612 to from outside the loop. */
2614 static void
2615 find_and_verify_loops (f, loops)
2616 rtx f;
2617 struct loops *loops;
2619 rtx insn;
2620 rtx label;
2621 int num_loops;
2622 struct loop *current_loop;
2623 struct loop *next_loop;
2624 struct loop *loop;
2626 num_loops = loops->num;
2628 compute_luids (f, NULL_RTX, 0);
2630 /* If there are jumps to undefined labels,
2631 treat them as jumps out of any/all loops.
2632 This also avoids writing past end of tables when there are no loops. */
2633 uid_loop[0] = NULL;
2635 /* Find boundaries of loops, mark which loops are contained within
2636 loops, and invalidate loops that have setjmp. */
2638 num_loops = 0;
2639 current_loop = NULL;
2640 for (insn = f; insn; insn = NEXT_INSN (insn))
2642 if (GET_CODE (insn) == NOTE)
2643 switch (NOTE_LINE_NUMBER (insn))
2645 case NOTE_INSN_LOOP_BEG:
2646 next_loop = loops->array + num_loops;
2647 next_loop->num = num_loops;
2648 num_loops++;
2649 next_loop->start = insn;
2650 next_loop->outer = current_loop;
2651 current_loop = next_loop;
2652 break;
2654 case NOTE_INSN_LOOP_CONT:
2655 current_loop->cont = insn;
2656 break;
2658 case NOTE_INSN_LOOP_VTOP:
2659 current_loop->vtop = insn;
2660 break;
2662 case NOTE_INSN_LOOP_END:
2663 if (! current_loop)
2664 abort ();
2666 current_loop->end = insn;
2667 current_loop = current_loop->outer;
2668 break;
2670 default:
2671 break;
2674 if (GET_CODE (insn) == CALL_INSN
2675 && find_reg_note (insn, REG_SETJMP, NULL))
2677 /* In this case, we must invalidate our current loop and any
2678 enclosing loop. */
2679 for (loop = current_loop; loop; loop = loop->outer)
2681 loop->invalid = 1;
2682 if (loop_dump_stream)
2683 fprintf (loop_dump_stream,
2684 "\nLoop at %d ignored due to setjmp.\n",
2685 INSN_UID (loop->start));
2689 /* Note that this will mark the NOTE_INSN_LOOP_END note as being in the
2690 enclosing loop, but this doesn't matter. */
2691 uid_loop[INSN_UID (insn)] = current_loop;
2694 /* Any loop containing a label used in an initializer must be invalidated,
2695 because it can be jumped into from anywhere. */
2697 for (label = forced_labels; label; label = XEXP (label, 1))
2699 for (loop = uid_loop[INSN_UID (XEXP (label, 0))];
2700 loop; loop = loop->outer)
2701 loop->invalid = 1;
2704 /* Any loop containing a label used for an exception handler must be
2705 invalidated, because it can be jumped into from anywhere. */
2707 for (label = exception_handler_labels; label; label = XEXP (label, 1))
2709 for (loop = uid_loop[INSN_UID (XEXP (label, 0))];
2710 loop; loop = loop->outer)
2711 loop->invalid = 1;
2714 /* Now scan all insn's in the function. If any JUMP_INSN branches into a
2715 loop that it is not contained within, that loop is marked invalid.
2716 If any INSN or CALL_INSN uses a label's address, then the loop containing
2717 that label is marked invalid, because it could be jumped into from
2718 anywhere.
2720 Also look for blocks of code ending in an unconditional branch that
2721 exits the loop. If such a block is surrounded by a conditional
2722 branch around the block, move the block elsewhere (see below) and
2723 invert the jump to point to the code block. This may eliminate a
2724 label in our loop and will simplify processing by both us and a
2725 possible second cse pass. */
2727 for (insn = f; insn; insn = NEXT_INSN (insn))
2728 if (INSN_P (insn))
2730 struct loop *this_loop = uid_loop[INSN_UID (insn)];
2732 if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
2734 rtx note = find_reg_note (insn, REG_LABEL, NULL_RTX);
2735 if (note)
2737 for (loop = uid_loop[INSN_UID (XEXP (note, 0))];
2738 loop; loop = loop->outer)
2739 loop->invalid = 1;
2743 if (GET_CODE (insn) != JUMP_INSN)
2744 continue;
2746 mark_loop_jump (PATTERN (insn), this_loop);
2748 /* See if this is an unconditional branch outside the loop. */
2749 if (this_loop
2750 && (GET_CODE (PATTERN (insn)) == RETURN
2751 || (any_uncondjump_p (insn)
2752 && onlyjump_p (insn)
2753 && (uid_loop[INSN_UID (JUMP_LABEL (insn))]
2754 != this_loop)))
2755 && get_max_uid () < max_uid_for_loop)
2757 rtx p;
2758 rtx our_next = next_real_insn (insn);
2759 rtx last_insn_to_move = NEXT_INSN (insn);
2760 struct loop *dest_loop;
2761 struct loop *outer_loop = NULL;
2763 /* Go backwards until we reach the start of the loop, a label,
2764 or a JUMP_INSN. */
2765 for (p = PREV_INSN (insn);
2766 GET_CODE (p) != CODE_LABEL
2767 && ! (GET_CODE (p) == NOTE
2768 && NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
2769 && GET_CODE (p) != JUMP_INSN;
2770 p = PREV_INSN (p))
2773 /* Check for the case where we have a jump to an inner nested
2774 loop, and do not perform the optimization in that case. */
2776 if (JUMP_LABEL (insn))
2778 dest_loop = uid_loop[INSN_UID (JUMP_LABEL (insn))];
2779 if (dest_loop)
2781 for (outer_loop = dest_loop; outer_loop;
2782 outer_loop = outer_loop->outer)
2783 if (outer_loop == this_loop)
2784 break;
2788 /* Make sure that the target of P is within the current loop. */
2790 if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p)
2791 && uid_loop[INSN_UID (JUMP_LABEL (p))] != this_loop)
2792 outer_loop = this_loop;
2794 /* If we stopped on a JUMP_INSN to the next insn after INSN,
2795 we have a block of code to try to move.
2797 We look backward and then forward from the target of INSN
2798 to find a BARRIER at the same loop depth as the target.
2799 If we find such a BARRIER, we make a new label for the start
2800 of the block, invert the jump in P and point it to that label,
2801 and move the block of code to the spot we found. */
2803 if (! outer_loop
2804 && GET_CODE (p) == JUMP_INSN
2805 && JUMP_LABEL (p) != 0
2806 /* Just ignore jumps to labels that were never emitted.
2807 These always indicate compilation errors. */
2808 && INSN_UID (JUMP_LABEL (p)) != 0
2809 && any_condjump_p (p) && onlyjump_p (p)
2810 && next_real_insn (JUMP_LABEL (p)) == our_next
2811 /* If it's not safe to move the sequence, then we
2812 mustn't try. */
2813 && insns_safe_to_move_p (p, NEXT_INSN (insn),
2814 &last_insn_to_move))
2816 rtx target
2817 = JUMP_LABEL (insn) ? JUMP_LABEL (insn) : get_last_insn ();
2818 struct loop *target_loop = uid_loop[INSN_UID (target)];
2819 rtx loc, loc2;
2820 rtx tmp;
2822 /* Search for possible garbage past the conditional jumps
2823 and look for the last barrier. */
2824 for (tmp = last_insn_to_move;
2825 tmp && GET_CODE (tmp) != CODE_LABEL; tmp = NEXT_INSN (tmp))
2826 if (GET_CODE (tmp) == BARRIER)
2827 last_insn_to_move = tmp;
2829 for (loc = target; loc; loc = PREV_INSN (loc))
2830 if (GET_CODE (loc) == BARRIER
2831 /* Don't move things inside a tablejump. */
2832 && ((loc2 = next_nonnote_insn (loc)) == 0
2833 || GET_CODE (loc2) != CODE_LABEL
2834 || (loc2 = next_nonnote_insn (loc2)) == 0
2835 || GET_CODE (loc2) != JUMP_INSN
2836 || (GET_CODE (PATTERN (loc2)) != ADDR_VEC
2837 && GET_CODE (PATTERN (loc2)) != ADDR_DIFF_VEC))
2838 && uid_loop[INSN_UID (loc)] == target_loop)
2839 break;
2841 if (loc == 0)
2842 for (loc = target; loc; loc = NEXT_INSN (loc))
2843 if (GET_CODE (loc) == BARRIER
2844 /* Don't move things inside a tablejump. */
2845 && ((loc2 = next_nonnote_insn (loc)) == 0
2846 || GET_CODE (loc2) != CODE_LABEL
2847 || (loc2 = next_nonnote_insn (loc2)) == 0
2848 || GET_CODE (loc2) != JUMP_INSN
2849 || (GET_CODE (PATTERN (loc2)) != ADDR_VEC
2850 && GET_CODE (PATTERN (loc2)) != ADDR_DIFF_VEC))
2851 && uid_loop[INSN_UID (loc)] == target_loop)
2852 break;
2854 if (loc)
2856 rtx cond_label = JUMP_LABEL (p);
2857 rtx new_label = get_label_after (p);
2859 /* Ensure our label doesn't go away. */
2860 LABEL_NUSES (cond_label)++;
2862 /* Verify that uid_loop is large enough and that
2863 we can invert P. */
2864 if (invert_jump (p, new_label, 1))
2866 rtx q, r;
2868 /* If no suitable BARRIER was found, create a suitable
2869 one before TARGET. Since TARGET is a fall through
2870 path, we'll need to insert an jump around our block
2871 and add a BARRIER before TARGET.
2873 This creates an extra unconditional jump outside
2874 the loop. However, the benefits of removing rarely
2875 executed instructions from inside the loop usually
2876 outweighs the cost of the extra unconditional jump
2877 outside the loop. */
2878 if (loc == 0)
2880 rtx temp;
2882 temp = gen_jump (JUMP_LABEL (insn));
2883 temp = emit_jump_insn_before (temp, target);
2884 JUMP_LABEL (temp) = JUMP_LABEL (insn);
2885 LABEL_NUSES (JUMP_LABEL (insn))++;
2886 loc = emit_barrier_before (target);
2889 /* Include the BARRIER after INSN and copy the
2890 block after LOC. */
2891 if (squeeze_notes (&new_label, &last_insn_to_move))
2892 abort ();
2893 reorder_insns (new_label, last_insn_to_move, loc);
2895 /* All those insns are now in TARGET_LOOP. */
2896 for (q = new_label;
2897 q != NEXT_INSN (last_insn_to_move);
2898 q = NEXT_INSN (q))
2899 uid_loop[INSN_UID (q)] = target_loop;
2901 /* The label jumped to by INSN is no longer a loop
2902 exit. Unless INSN does not have a label (e.g.,
2903 it is a RETURN insn), search loop->exit_labels
2904 to find its label_ref, and remove it. Also turn
2905 off LABEL_OUTSIDE_LOOP_P bit. */
2906 if (JUMP_LABEL (insn))
2908 for (q = 0, r = this_loop->exit_labels;
2910 q = r, r = LABEL_NEXTREF (r))
2911 if (XEXP (r, 0) == JUMP_LABEL (insn))
2913 LABEL_OUTSIDE_LOOP_P (r) = 0;
2914 if (q)
2915 LABEL_NEXTREF (q) = LABEL_NEXTREF (r);
2916 else
2917 this_loop->exit_labels = LABEL_NEXTREF (r);
2918 break;
2921 for (loop = this_loop; loop && loop != target_loop;
2922 loop = loop->outer)
2923 loop->exit_count--;
2925 /* If we didn't find it, then something is
2926 wrong. */
2927 if (! r)
2928 abort ();
2931 /* P is now a jump outside the loop, so it must be put
2932 in loop->exit_labels, and marked as such.
2933 The easiest way to do this is to just call
2934 mark_loop_jump again for P. */
2935 mark_loop_jump (PATTERN (p), this_loop);
2937 /* If INSN now jumps to the insn after it,
2938 delete INSN. */
2939 if (JUMP_LABEL (insn) != 0
2940 && (next_real_insn (JUMP_LABEL (insn))
2941 == next_real_insn (insn)))
2942 delete_related_insns (insn);
2945 /* Continue the loop after where the conditional
2946 branch used to jump, since the only branch insn
2947 in the block (if it still remains) is an inter-loop
2948 branch and hence needs no processing. */
2949 insn = NEXT_INSN (cond_label);
2951 if (--LABEL_NUSES (cond_label) == 0)
2952 delete_related_insns (cond_label);
2954 /* This loop will be continued with NEXT_INSN (insn). */
2955 insn = PREV_INSN (insn);
2962 /* If any label in X jumps to a loop different from LOOP_NUM and any of the
2963 loops it is contained in, mark the target loop invalid.
2965 For speed, we assume that X is part of a pattern of a JUMP_INSN. */
2967 static void
2968 mark_loop_jump (x, loop)
2969 rtx x;
2970 struct loop *loop;
2972 struct loop *dest_loop;
2973 struct loop *outer_loop;
2974 int i;
2976 switch (GET_CODE (x))
2978 case PC:
2979 case USE:
2980 case CLOBBER:
2981 case REG:
2982 case MEM:
2983 case CONST_INT:
2984 case CONST_DOUBLE:
2985 case RETURN:
2986 return;
2988 case CONST:
2989 /* There could be a label reference in here. */
2990 mark_loop_jump (XEXP (x, 0), loop);
2991 return;
2993 case PLUS:
2994 case MINUS:
2995 case MULT:
2996 mark_loop_jump (XEXP (x, 0), loop);
2997 mark_loop_jump (XEXP (x, 1), loop);
2998 return;
3000 case LO_SUM:
3001 /* This may refer to a LABEL_REF or SYMBOL_REF. */
3002 mark_loop_jump (XEXP (x, 1), loop);
3003 return;
3005 case SIGN_EXTEND:
3006 case ZERO_EXTEND:
3007 mark_loop_jump (XEXP (x, 0), loop);
3008 return;
3010 case LABEL_REF:
3011 dest_loop = uid_loop[INSN_UID (XEXP (x, 0))];
3013 /* Link together all labels that branch outside the loop. This
3014 is used by final_[bg]iv_value and the loop unrolling code. Also
3015 mark this LABEL_REF so we know that this branch should predict
3016 false. */
3018 /* A check to make sure the label is not in an inner nested loop,
3019 since this does not count as a loop exit. */
3020 if (dest_loop)
3022 for (outer_loop = dest_loop; outer_loop;
3023 outer_loop = outer_loop->outer)
3024 if (outer_loop == loop)
3025 break;
3027 else
3028 outer_loop = NULL;
3030 if (loop && ! outer_loop)
3032 LABEL_OUTSIDE_LOOP_P (x) = 1;
3033 LABEL_NEXTREF (x) = loop->exit_labels;
3034 loop->exit_labels = x;
3036 for (outer_loop = loop;
3037 outer_loop && outer_loop != dest_loop;
3038 outer_loop = outer_loop->outer)
3039 outer_loop->exit_count++;
3042 /* If this is inside a loop, but not in the current loop or one enclosed
3043 by it, it invalidates at least one loop. */
3045 if (! dest_loop)
3046 return;
3048 /* We must invalidate every nested loop containing the target of this
3049 label, except those that also contain the jump insn. */
3051 for (; dest_loop; dest_loop = dest_loop->outer)
3053 /* Stop when we reach a loop that also contains the jump insn. */
3054 for (outer_loop = loop; outer_loop; outer_loop = outer_loop->outer)
3055 if (dest_loop == outer_loop)
3056 return;
3058 /* If we get here, we know we need to invalidate a loop. */
3059 if (loop_dump_stream && ! dest_loop->invalid)
3060 fprintf (loop_dump_stream,
3061 "\nLoop at %d ignored due to multiple entry points.\n",
3062 INSN_UID (dest_loop->start));
3064 dest_loop->invalid = 1;
3066 return;
3068 case SET:
3069 /* If this is not setting pc, ignore. */
3070 if (SET_DEST (x) == pc_rtx)
3071 mark_loop_jump (SET_SRC (x), loop);
3072 return;
3074 case IF_THEN_ELSE:
3075 mark_loop_jump (XEXP (x, 1), loop);
3076 mark_loop_jump (XEXP (x, 2), loop);
3077 return;
3079 case PARALLEL:
3080 case ADDR_VEC:
3081 for (i = 0; i < XVECLEN (x, 0); i++)
3082 mark_loop_jump (XVECEXP (x, 0, i), loop);
3083 return;
3085 case ADDR_DIFF_VEC:
3086 for (i = 0; i < XVECLEN (x, 1); i++)
3087 mark_loop_jump (XVECEXP (x, 1, i), loop);
3088 return;
3090 default:
3091 /* Strictly speaking this is not a jump into the loop, only a possible
3092 jump out of the loop. However, we have no way to link the destination
3093 of this jump onto the list of exit labels. To be safe we mark this
3094 loop and any containing loops as invalid. */
3095 if (loop)
3097 for (outer_loop = loop; outer_loop; outer_loop = outer_loop->outer)
3099 if (loop_dump_stream && ! outer_loop->invalid)
3100 fprintf (loop_dump_stream,
3101 "\nLoop at %d ignored due to unknown exit jump.\n",
3102 INSN_UID (outer_loop->start));
3103 outer_loop->invalid = 1;
3106 return;
3110 /* Return nonzero if there is a label in the range from
3111 insn INSN to and including the insn whose luid is END
3112 INSN must have an assigned luid (i.e., it must not have
3113 been previously created by loop.c). */
3115 static int
3116 labels_in_range_p (insn, end)
3117 rtx insn;
3118 int end;
3120 while (insn && INSN_LUID (insn) <= end)
3122 if (GET_CODE (insn) == CODE_LABEL)
3123 return 1;
3124 insn = NEXT_INSN (insn);
3127 return 0;
3130 /* Record that a memory reference X is being set. */
3132 static void
3133 note_addr_stored (x, y, data)
3134 rtx x;
3135 rtx y ATTRIBUTE_UNUSED;
3136 void *data ATTRIBUTE_UNUSED;
3138 struct loop_info *loop_info = data;
3140 if (x == 0 || GET_CODE (x) != MEM)
3141 return;
3143 /* Count number of memory writes.
3144 This affects heuristics in strength_reduce. */
3145 loop_info->num_mem_sets++;
3147 /* BLKmode MEM means all memory is clobbered. */
3148 if (GET_MODE (x) == BLKmode)
3150 if (RTX_UNCHANGING_P (x))
3151 loop_info->unknown_constant_address_altered = 1;
3152 else
3153 loop_info->unknown_address_altered = 1;
3155 return;
3158 loop_info->store_mems = gen_rtx_EXPR_LIST (VOIDmode, x,
3159 loop_info->store_mems);
3162 /* X is a value modified by an INSN that references a biv inside a loop
3163 exit test (ie, X is somehow related to the value of the biv). If X
3164 is a pseudo that is used more than once, then the biv is (effectively)
3165 used more than once. DATA is a pointer to a loop_regs structure. */
3167 static void
3168 note_set_pseudo_multiple_uses (x, y, data)
3169 rtx x;
3170 rtx y ATTRIBUTE_UNUSED;
3171 void *data;
3173 struct loop_regs *regs = (struct loop_regs *) data;
3175 if (x == 0)
3176 return;
3178 while (GET_CODE (x) == STRICT_LOW_PART
3179 || GET_CODE (x) == SIGN_EXTRACT
3180 || GET_CODE (x) == ZERO_EXTRACT
3181 || GET_CODE (x) == SUBREG)
3182 x = XEXP (x, 0);
3184 if (GET_CODE (x) != REG || REGNO (x) < FIRST_PSEUDO_REGISTER)
3185 return;
3187 /* If we do not have usage information, or if we know the register
3188 is used more than once, note that fact for check_dbra_loop. */
3189 if (REGNO (x) >= max_reg_before_loop
3190 || ! regs->array[REGNO (x)].single_usage
3191 || regs->array[REGNO (x)].single_usage == const0_rtx)
3192 regs->multiple_uses = 1;
3195 /* Return nonzero if the rtx X is invariant over the current loop.
3197 The value is 2 if we refer to something only conditionally invariant.
3199 A memory ref is invariant if it is not volatile and does not conflict
3200 with anything stored in `loop_info->store_mems'. */
3203 loop_invariant_p (loop, x)
3204 const struct loop *loop;
3205 rtx x;
3207 struct loop_info *loop_info = LOOP_INFO (loop);
3208 struct loop_regs *regs = LOOP_REGS (loop);
3209 int i;
3210 enum rtx_code code;
3211 const char *fmt;
3212 int conditional = 0;
3213 rtx mem_list_entry;
3215 if (x == 0)
3216 return 1;
3217 code = GET_CODE (x);
3218 switch (code)
3220 case CONST_INT:
3221 case CONST_DOUBLE:
3222 case SYMBOL_REF:
3223 case CONST:
3224 return 1;
3226 case LABEL_REF:
3227 /* A LABEL_REF is normally invariant, however, if we are unrolling
3228 loops, and this label is inside the loop, then it isn't invariant.
3229 This is because each unrolled copy of the loop body will have
3230 a copy of this label. If this was invariant, then an insn loading
3231 the address of this label into a register might get moved outside
3232 the loop, and then each loop body would end up using the same label.
3234 We don't know the loop bounds here though, so just fail for all
3235 labels. */
3236 if (flag_unroll_loops)
3237 return 0;
3238 else
3239 return 1;
3241 case PC:
3242 case CC0:
3243 case UNSPEC_VOLATILE:
3244 return 0;
3246 case REG:
3247 /* We used to check RTX_UNCHANGING_P (x) here, but that is invalid
3248 since the reg might be set by initialization within the loop. */
3250 if ((x == frame_pointer_rtx || x == hard_frame_pointer_rtx
3251 || x == arg_pointer_rtx || x == pic_offset_table_rtx)
3252 && ! current_function_has_nonlocal_goto)
3253 return 1;
3255 if (LOOP_INFO (loop)->has_call
3256 && REGNO (x) < FIRST_PSEUDO_REGISTER && call_used_regs[REGNO (x)])
3257 return 0;
3259 if (regs->array[REGNO (x)].set_in_loop < 0)
3260 return 2;
3262 return regs->array[REGNO (x)].set_in_loop == 0;
3264 case MEM:
3265 /* Volatile memory references must be rejected. Do this before
3266 checking for read-only items, so that volatile read-only items
3267 will be rejected also. */
3268 if (MEM_VOLATILE_P (x))
3269 return 0;
3271 /* See if there is any dependence between a store and this load. */
3272 mem_list_entry = loop_info->store_mems;
3273 while (mem_list_entry)
3275 if (true_dependence (XEXP (mem_list_entry, 0), VOIDmode,
3276 x, rtx_varies_p))
3277 return 0;
3279 mem_list_entry = XEXP (mem_list_entry, 1);
3282 /* It's not invalidated by a store in memory
3283 but we must still verify the address is invariant. */
3284 break;
3286 case ASM_OPERANDS:
3287 /* Don't mess with insns declared volatile. */
3288 if (MEM_VOLATILE_P (x))
3289 return 0;
3290 break;
3292 default:
3293 break;
3296 fmt = GET_RTX_FORMAT (code);
3297 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3299 if (fmt[i] == 'e')
3301 int tem = loop_invariant_p (loop, XEXP (x, i));
3302 if (tem == 0)
3303 return 0;
3304 if (tem == 2)
3305 conditional = 1;
3307 else if (fmt[i] == 'E')
3309 int j;
3310 for (j = 0; j < XVECLEN (x, i); j++)
3312 int tem = loop_invariant_p (loop, XVECEXP (x, i, j));
3313 if (tem == 0)
3314 return 0;
3315 if (tem == 2)
3316 conditional = 1;
3322 return 1 + conditional;
3325 /* Return nonzero if all the insns in the loop that set REG
3326 are INSN and the immediately following insns,
3327 and if each of those insns sets REG in an invariant way
3328 (not counting uses of REG in them).
3330 The value is 2 if some of these insns are only conditionally invariant.
3332 We assume that INSN itself is the first set of REG
3333 and that its source is invariant. */
3335 static int
3336 consec_sets_invariant_p (loop, reg, n_sets, insn)
3337 const struct loop *loop;
3338 int n_sets;
3339 rtx reg, insn;
3341 struct loop_regs *regs = LOOP_REGS (loop);
3342 rtx p = insn;
3343 unsigned int regno = REGNO (reg);
3344 rtx temp;
3345 /* Number of sets we have to insist on finding after INSN. */
3346 int count = n_sets - 1;
3347 int old = regs->array[regno].set_in_loop;
3348 int value = 0;
3349 int this;
3351 /* If N_SETS hit the limit, we can't rely on its value. */
3352 if (n_sets == 127)
3353 return 0;
3355 regs->array[regno].set_in_loop = 0;
3357 while (count > 0)
3359 enum rtx_code code;
3360 rtx set;
3362 p = NEXT_INSN (p);
3363 code = GET_CODE (p);
3365 /* If library call, skip to end of it. */
3366 if (code == INSN && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
3367 p = XEXP (temp, 0);
3369 this = 0;
3370 if (code == INSN
3371 && (set = single_set (p))
3372 && GET_CODE (SET_DEST (set)) == REG
3373 && REGNO (SET_DEST (set)) == regno)
3375 this = loop_invariant_p (loop, SET_SRC (set));
3376 if (this != 0)
3377 value |= this;
3378 else if ((temp = find_reg_note (p, REG_EQUAL, NULL_RTX)))
3380 /* If this is a libcall, then any invariant REG_EQUAL note is OK.
3381 If this is an ordinary insn, then only CONSTANT_P REG_EQUAL
3382 notes are OK. */
3383 this = (CONSTANT_P (XEXP (temp, 0))
3384 || (find_reg_note (p, REG_RETVAL, NULL_RTX)
3385 && loop_invariant_p (loop, XEXP (temp, 0))));
3386 if (this != 0)
3387 value |= this;
3390 if (this != 0)
3391 count--;
3392 else if (code != NOTE)
3394 regs->array[regno].set_in_loop = old;
3395 return 0;
3399 regs->array[regno].set_in_loop = old;
3400 /* If loop_invariant_p ever returned 2, we return 2. */
3401 return 1 + (value & 2);
3404 #if 0
3405 /* I don't think this condition is sufficient to allow INSN
3406 to be moved, so we no longer test it. */
3408 /* Return 1 if all insns in the basic block of INSN and following INSN
3409 that set REG are invariant according to TABLE. */
3411 static int
3412 all_sets_invariant_p (reg, insn, table)
3413 rtx reg, insn;
3414 short *table;
3416 rtx p = insn;
3417 int regno = REGNO (reg);
3419 while (1)
3421 enum rtx_code code;
3422 p = NEXT_INSN (p);
3423 code = GET_CODE (p);
3424 if (code == CODE_LABEL || code == JUMP_INSN)
3425 return 1;
3426 if (code == INSN && GET_CODE (PATTERN (p)) == SET
3427 && GET_CODE (SET_DEST (PATTERN (p))) == REG
3428 && REGNO (SET_DEST (PATTERN (p))) == regno)
3430 if (! loop_invariant_p (loop, SET_SRC (PATTERN (p)), table))
3431 return 0;
3435 #endif /* 0 */
3437 /* Look at all uses (not sets) of registers in X. For each, if it is
3438 the single use, set USAGE[REGNO] to INSN; if there was a previous use in
3439 a different insn, set USAGE[REGNO] to const0_rtx. */
3441 static void
3442 find_single_use_in_loop (regs, insn, x)
3443 struct loop_regs *regs;
3444 rtx insn;
3445 rtx x;
3447 enum rtx_code code = GET_CODE (x);
3448 const char *fmt = GET_RTX_FORMAT (code);
3449 int i, j;
3451 if (code == REG)
3452 regs->array[REGNO (x)].single_usage
3453 = (regs->array[REGNO (x)].single_usage != 0
3454 && regs->array[REGNO (x)].single_usage != insn)
3455 ? const0_rtx : insn;
3457 else if (code == SET)
3459 /* Don't count SET_DEST if it is a REG; otherwise count things
3460 in SET_DEST because if a register is partially modified, it won't
3461 show up as a potential movable so we don't care how USAGE is set
3462 for it. */
3463 if (GET_CODE (SET_DEST (x)) != REG)
3464 find_single_use_in_loop (regs, insn, SET_DEST (x));
3465 find_single_use_in_loop (regs, insn, SET_SRC (x));
3467 else
3468 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3470 if (fmt[i] == 'e' && XEXP (x, i) != 0)
3471 find_single_use_in_loop (regs, insn, XEXP (x, i));
3472 else if (fmt[i] == 'E')
3473 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
3474 find_single_use_in_loop (regs, insn, XVECEXP (x, i, j));
3478 /* Count and record any set in X which is contained in INSN. Update
3479 REGS->array[I].MAY_NOT_OPTIMIZE and LAST_SET for any register I set
3480 in X. */
3482 static void
3483 count_one_set (regs, insn, x, last_set)
3484 struct loop_regs *regs;
3485 rtx insn, x;
3486 rtx *last_set;
3488 if (GET_CODE (x) == CLOBBER && GET_CODE (XEXP (x, 0)) == REG)
3489 /* Don't move a reg that has an explicit clobber.
3490 It's not worth the pain to try to do it correctly. */
3491 regs->array[REGNO (XEXP (x, 0))].may_not_optimize = 1;
3493 if (GET_CODE (x) == SET || GET_CODE (x) == CLOBBER)
3495 rtx dest = SET_DEST (x);
3496 while (GET_CODE (dest) == SUBREG
3497 || GET_CODE (dest) == ZERO_EXTRACT
3498 || GET_CODE (dest) == SIGN_EXTRACT
3499 || GET_CODE (dest) == STRICT_LOW_PART)
3500 dest = XEXP (dest, 0);
3501 if (GET_CODE (dest) == REG)
3503 int i;
3504 int regno = REGNO (dest);
3505 for (i = 0; i < LOOP_REGNO_NREGS (regno, dest); i++)
3507 /* If this is the first setting of this reg
3508 in current basic block, and it was set before,
3509 it must be set in two basic blocks, so it cannot
3510 be moved out of the loop. */
3511 if (regs->array[regno].set_in_loop > 0
3512 && last_set == 0)
3513 regs->array[regno+i].may_not_optimize = 1;
3514 /* If this is not first setting in current basic block,
3515 see if reg was used in between previous one and this.
3516 If so, neither one can be moved. */
3517 if (last_set[regno] != 0
3518 && reg_used_between_p (dest, last_set[regno], insn))
3519 regs->array[regno+i].may_not_optimize = 1;
3520 if (regs->array[regno+i].set_in_loop < 127)
3521 ++regs->array[regno+i].set_in_loop;
3522 last_set[regno+i] = insn;
3528 /* Given a loop that is bounded by LOOP->START and LOOP->END and that
3529 is entered at LOOP->SCAN_START, return 1 if the register set in SET
3530 contained in insn INSN is used by any insn that precedes INSN in
3531 cyclic order starting from the loop entry point.
3533 We don't want to use INSN_LUID here because if we restrict INSN to those
3534 that have a valid INSN_LUID, it means we cannot move an invariant out
3535 from an inner loop past two loops. */
3537 static int
3538 loop_reg_used_before_p (loop, set, insn)
3539 const struct loop *loop;
3540 rtx set, insn;
3542 rtx reg = SET_DEST (set);
3543 rtx p;
3545 /* Scan forward checking for register usage. If we hit INSN, we
3546 are done. Otherwise, if we hit LOOP->END, wrap around to LOOP->START. */
3547 for (p = loop->scan_start; p != insn; p = NEXT_INSN (p))
3549 if (INSN_P (p) && reg_overlap_mentioned_p (reg, PATTERN (p)))
3550 return 1;
3552 if (p == loop->end)
3553 p = loop->start;
3556 return 0;
3560 /* Information we collect about arrays that we might want to prefetch. */
3561 struct prefetch_info
3563 struct iv_class *class; /* Class this prefetch is based on. */
3564 struct induction *giv; /* GIV this prefetch is based on. */
3565 rtx base_address; /* Start prefetching from this address plus
3566 index. */
3567 HOST_WIDE_INT index;
3568 HOST_WIDE_INT stride; /* Prefetch stride in bytes in each
3569 iteration. */
3570 unsigned int bytes_accesed; /* Sum of sizes of all acceses to this
3571 prefetch area in one iteration. */
3572 unsigned int total_bytes; /* Total bytes loop will access in this block.
3573 This is set only for loops with known
3574 iteration counts and is 0xffffffff
3575 otherwise. */
3576 unsigned int write : 1; /* 1 for read/write prefetches. */
3577 unsigned int prefetch_in_loop : 1;
3578 /* 1 for those chosen for prefetching. */
3579 unsigned int prefetch_before_loop : 1;
3580 /* 1 for those chosen for prefetching. */
3583 /* Data used by check_store function. */
3584 struct check_store_data
3586 rtx mem_address;
3587 int mem_write;
3590 static void check_store PARAMS ((rtx, rtx, void *));
3591 static void emit_prefetch_instructions PARAMS ((struct loop *));
3592 static int rtx_equal_for_prefetch_p PARAMS ((rtx, rtx));
3594 /* Set mem_write when mem_address is found. Used as callback to
3595 note_stores. */
3596 static void
3597 check_store (x, pat, data)
3598 rtx x, pat ATTRIBUTE_UNUSED;
3599 void *data;
3601 struct check_store_data *d = (struct check_store_data *) data;
3603 if ((GET_CODE (x) == MEM) && rtx_equal_p (d->mem_address, XEXP (x, 0)))
3604 d->mem_write = 1;
3607 /* Like rtx_equal_p, but attempts to swap commutative operands. This is
3608 important to get some addresses combined. Later more sophisticated
3609 transformations can be added when necesary.
3611 ??? Same trick with swapping operand is done at several other places.
3612 It can be nice to develop some common way to handle this. */
3614 static int
3615 rtx_equal_for_prefetch_p (x, y)
3616 rtx x, y;
3618 int i;
3619 int j;
3620 enum rtx_code code = GET_CODE (x);
3621 const char *fmt;
3623 if (x == y)
3624 return 1;
3625 if (code != GET_CODE (y))
3626 return 0;
3628 code = GET_CODE (x);
3630 if (GET_RTX_CLASS (code) == 'c')
3632 return ((rtx_equal_for_prefetch_p (XEXP (x, 0), XEXP (y, 0))
3633 && rtx_equal_for_prefetch_p (XEXP (x, 1), XEXP (y, 1)))
3634 || (rtx_equal_for_prefetch_p (XEXP (x, 0), XEXP (y, 1))
3635 && rtx_equal_for_prefetch_p (XEXP (x, 1), XEXP (y, 0))));
3637 /* Compare the elements. If any pair of corresponding elements fails to
3638 match, return 0 for the whole thing. */
3640 fmt = GET_RTX_FORMAT (code);
3641 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3643 switch (fmt[i])
3645 case 'w':
3646 if (XWINT (x, i) != XWINT (y, i))
3647 return 0;
3648 break;
3650 case 'i':
3651 if (XINT (x, i) != XINT (y, i))
3652 return 0;
3653 break;
3655 case 'E':
3656 /* Two vectors must have the same length. */
3657 if (XVECLEN (x, i) != XVECLEN (y, i))
3658 return 0;
3660 /* And the corresponding elements must match. */
3661 for (j = 0; j < XVECLEN (x, i); j++)
3662 if (rtx_equal_for_prefetch_p (XVECEXP (x, i, j),
3663 XVECEXP (y, i, j)) == 0)
3664 return 0;
3665 break;
3667 case 'e':
3668 if (rtx_equal_for_prefetch_p (XEXP (x, i), XEXP (y, i)) == 0)
3669 return 0;
3670 break;
3672 case 's':
3673 if (strcmp (XSTR (x, i), XSTR (y, i)))
3674 return 0;
3675 break;
3677 case 'u':
3678 /* These are just backpointers, so they don't matter. */
3679 break;
3681 case '0':
3682 break;
3684 /* It is believed that rtx's at this level will never
3685 contain anything but integers and other rtx's,
3686 except for within LABEL_REFs and SYMBOL_REFs. */
3687 default:
3688 abort ();
3691 return 1;
3694 /* Remove constant addition value from the expression X (when present)
3695 and return it. */
3697 static HOST_WIDE_INT
3698 remove_constant_addition (x)
3699 rtx *x;
3701 HOST_WIDE_INT addval = 0;
3702 rtx exp = *x;
3704 /* Avoid clobbering a shared CONST expression. */
3705 if (GET_CODE (exp) == CONST)
3707 if (GET_CODE (XEXP (exp, 0)) == PLUS
3708 && GET_CODE (XEXP (XEXP (exp, 0), 0)) == SYMBOL_REF
3709 && GET_CODE (XEXP (XEXP (exp, 0), 1)) == CONST_INT)
3711 *x = XEXP (XEXP (exp, 0), 0);
3712 return INTVAL (XEXP (XEXP (exp, 0), 1));
3714 return 0;
3717 if (GET_CODE (exp) == CONST_INT)
3719 addval = INTVAL (exp);
3720 *x = const0_rtx;
3723 /* For plus expression recurse on ourself. */
3724 else if (GET_CODE (exp) == PLUS)
3726 addval += remove_constant_addition (&XEXP (exp, 0));
3727 addval += remove_constant_addition (&XEXP (exp, 1));
3729 /* In case our parameter was constant, remove extra zero from the
3730 expression. */
3731 if (XEXP (exp, 0) == const0_rtx)
3732 *x = XEXP (exp, 1);
3733 else if (XEXP (exp, 1) == const0_rtx)
3734 *x = XEXP (exp, 0);
3737 return addval;
3740 /* Attempt to identify accesses to arrays that are most likely to cause cache
3741 misses, and emit prefetch instructions a few prefetch blocks forward.
3743 To detect the arrays we use the GIV information that was collected by the
3744 strength reduction pass.
3746 The prefetch instructions are generated after the GIV information is done
3747 and before the strength reduction process. The new GIVs are injected into
3748 the strength reduction tables, so the prefetch addresses are optimized as
3749 well.
3751 GIVs are split into base address, stride, and constant addition values.
3752 GIVs with the same address, stride and close addition values are combined
3753 into a single prefetch. Also writes to GIVs are detected, so that prefetch
3754 for write instructions can be used for the block we write to, on machines
3755 that support write prefetches.
3757 Several heuristics are used to determine when to prefetch. They are
3758 controlled by defined symbols that can be overridden for each target. */
3760 static void
3761 emit_prefetch_instructions (loop)
3762 struct loop *loop;
3764 int num_prefetches = 0;
3765 int num_real_prefetches = 0;
3766 int num_real_write_prefetches = 0;
3767 int ahead;
3768 int i;
3769 struct iv_class *bl;
3770 struct induction *iv;
3771 struct prefetch_info info[MAX_PREFETCHES];
3772 struct loop_ivs *ivs = LOOP_IVS (loop);
3774 if (!HAVE_prefetch)
3775 return;
3777 /* Consider only loops w/o calls. When a call is done, the loop is probably
3778 slow enough to read the memory. */
3779 if (PREFETCH_NO_CALL && LOOP_INFO (loop)->has_call)
3781 if (loop_dump_stream)
3782 fprintf (loop_dump_stream, "Prefetch: ignoring loop - has call.\n");
3784 return;
3787 if (PREFETCH_NO_LOW_LOOPCNT
3788 && LOOP_INFO (loop)->n_iterations
3789 && LOOP_INFO (loop)->n_iterations <= PREFETCH_LOW_LOOPCNT)
3791 if (loop_dump_stream)
3792 fprintf (loop_dump_stream,
3793 "Prefetch: ignoring loop - not enought iterations.\n");
3794 return;
3797 /* Search all induction variables and pick those interesting for the prefetch
3798 machinery. */
3799 for (bl = ivs->list; bl; bl = bl->next)
3801 struct induction *biv = bl->biv, *biv1;
3802 int basestride = 0;
3804 biv1 = biv;
3806 /* Expect all BIVs to be executed in each iteration. This makes our
3807 analysis more conservative. */
3808 while (biv1)
3810 /* Discard non-constant additions that we can't handle well yet, and
3811 BIVs that are executed multiple times; such BIVs ought to be
3812 handled in the nested loop. We accept not_every_iteration BIVs,
3813 since these only result in larger strides and make our
3814 heuristics more conservative.
3815 ??? What does the last sentence mean? */
3816 if (GET_CODE (biv->add_val) != CONST_INT)
3818 if (loop_dump_stream)
3820 fprintf (loop_dump_stream,
3821 "Prefetch: biv %i ignored: non-constant addition at insn %i:",
3822 REGNO (biv->src_reg), INSN_UID (biv->insn));
3823 print_rtl (loop_dump_stream, biv->add_val);
3824 fprintf (loop_dump_stream, "\n");
3826 break;
3829 if (biv->maybe_multiple)
3831 if (loop_dump_stream)
3833 fprintf (loop_dump_stream,
3834 "Prefetch: biv %i ignored: maybe_multiple at insn %i:",
3835 REGNO (biv->src_reg), INSN_UID (biv->insn));
3836 print_rtl (loop_dump_stream, biv->add_val);
3837 fprintf (loop_dump_stream, "\n");
3839 break;
3842 basestride += INTVAL (biv1->add_val);
3843 biv1 = biv1->next_iv;
3846 if (biv1 || !basestride)
3847 continue;
3849 for (iv = bl->giv; iv; iv = iv->next_iv)
3851 rtx address;
3852 rtx temp;
3853 HOST_WIDE_INT index = 0;
3854 int add = 1;
3855 HOST_WIDE_INT stride;
3856 struct check_store_data d;
3857 int size = GET_MODE_SIZE (GET_MODE (iv));
3859 /* There are several reasons why an induction variable is not
3860 interesting to us. */
3861 if (iv->giv_type != DEST_ADDR
3862 /* We are interested only in constant stride memory references
3863 in order to be able to compute density easily. */
3864 || GET_CODE (iv->mult_val) != CONST_INT
3865 /* Don't handle reversed order prefetches, since they are usually
3866 ineffective. Later we may be able to reverse such BIVs. */
3867 || (PREFETCH_NO_REVERSE_ORDER
3868 && (stride = INTVAL (iv->mult_val) * basestride) < 0)
3869 /* Prefetching of accesses with such an extreme stride is probably
3870 not worthwhile, either. */
3871 || (PREFETCH_NO_EXTREME_STRIDE
3872 && stride > PREFETCH_EXTREME_STRIDE)
3873 /* Ignore GIVs with varying add values; we can't predict the
3874 value for the next iteration. */
3875 || !loop_invariant_p (loop, iv->add_val)
3876 /* Ignore GIVs in the nested loops; they ought to have been
3877 handled already. */
3878 || iv->maybe_multiple)
3880 if (loop_dump_stream)
3881 fprintf (loop_dump_stream, "Prefetch: Ignoring giv at %i\n",
3882 INSN_UID (iv->insn));
3883 continue;
3886 /* Determine the pointer to the basic array we are examining. It is
3887 the sum of the BIV's initial value and the GIV's add_val. */
3888 index = 0;
3890 address = copy_rtx (iv->add_val);
3891 temp = copy_rtx (bl->initial_value);
3893 address = simplify_gen_binary (PLUS, Pmode, temp, address);
3894 index = remove_constant_addition (&address);
3896 index += size;
3897 d.mem_write = 0;
3898 d.mem_address = *iv->location;
3900 /* When the GIV is not always executed, we might be better off by
3901 not dirtying the cache pages. */
3902 if (PREFETCH_NOT_ALWAYS || iv->always_executed)
3903 note_stores (PATTERN (iv->insn), check_store, &d);
3905 /* Attempt to find another prefetch to the same array and see if we
3906 can merge this one. */
3907 for (i = 0; i < num_prefetches; i++)
3908 if (rtx_equal_for_prefetch_p (address, info[i].base_address)
3909 && stride == info[i].stride)
3911 /* In case both access same array (same location
3912 just with small difference in constant indexes), merge
3913 the prefetches. Just do the later and the earlier will
3914 get prefetched from previous iteration.
3915 4096 is artificial threshold. It should not be too small,
3916 but also not bigger than small portion of memory usually
3917 traversed by single loop. */
3918 if (index >= info[i].index && index - info[i].index < 4096)
3920 info[i].write |= d.mem_write;
3921 info[i].bytes_accesed += size;
3922 info[i].index = index;
3923 info[i].giv = iv;
3924 info[i].class = bl;
3925 info[num_prefetches].base_address = address;
3926 add = 0;
3927 break;
3930 if (index < info[i].index && info[i].index - index < 4096)
3932 info[i].write |= d.mem_write;
3933 info[i].bytes_accesed += size;
3934 add = 0;
3935 break;
3939 /* Merging failed. */
3940 if (add)
3942 info[num_prefetches].giv = iv;
3943 info[num_prefetches].class = bl;
3944 info[num_prefetches].index = index;
3945 info[num_prefetches].stride = stride;
3946 info[num_prefetches].base_address = address;
3947 info[num_prefetches].write = d.mem_write;
3948 info[num_prefetches].bytes_accesed = size;
3949 num_prefetches++;
3950 if (num_prefetches >= MAX_PREFETCHES)
3952 if (loop_dump_stream)
3953 fprintf (loop_dump_stream,
3954 "Maximal number of prefetches exceeded.\n");
3955 return;
3961 for (i = 0; i < num_prefetches; i++)
3963 /* Attempt to calculate the number of bytes fetched by the loop.
3964 Avoid overflow. */
3965 if (LOOP_INFO (loop)->n_iterations
3966 && ((unsigned HOST_WIDE_INT) (0xffffffff / info[i].stride)
3967 >= LOOP_INFO (loop)->n_iterations))
3968 info[i].total_bytes = info[i].stride * LOOP_INFO (loop)->n_iterations;
3969 else
3970 info[i].total_bytes = 0xffffffff;
3972 /* Prefetch is worthwhile only when the loads/stores are dense. */
3973 if (PREFETCH_ONLY_DENSE_MEM
3974 && info[i].bytes_accesed * 256 / info[i].stride > PREFETCH_DENSE_MEM
3975 && (info[i].total_bytes / PREFETCH_BLOCK
3976 >= PREFETCH_BLOCKS_BEFORE_LOOP_MIN))
3978 info[i].prefetch_before_loop = 1;
3979 info[i].prefetch_in_loop
3980 = (info[i].total_bytes / PREFETCH_BLOCK
3981 > PREFETCH_BLOCKS_BEFORE_LOOP_MAX);
3983 else
3984 info[i].prefetch_in_loop = 0, info[i].prefetch_before_loop = 0;
3986 if (info[i].prefetch_in_loop)
3988 num_real_prefetches += ((info[i].stride + PREFETCH_BLOCK - 1)
3989 / PREFETCH_BLOCK);
3990 if (info[i].write)
3991 num_real_write_prefetches
3992 += (info[i].stride + PREFETCH_BLOCK - 1) / PREFETCH_BLOCK;
3996 if (loop_dump_stream)
3998 for (i = 0; i < num_prefetches; i++)
4000 fprintf (loop_dump_stream, "Prefetch insn %i address: ",
4001 INSN_UID (info[i].giv->insn));
4002 print_rtl (loop_dump_stream, info[i].base_address);
4003 fprintf (loop_dump_stream, " Index: ");
4004 fprintf (loop_dump_stream, HOST_WIDE_INT_PRINT_DEC, info[i].index);
4005 fprintf (loop_dump_stream, " stride: ");
4006 fprintf (loop_dump_stream, HOST_WIDE_INT_PRINT_DEC, info[i].stride);
4007 fprintf (loop_dump_stream,
4008 " density: %i%% total_bytes: %u%sin loop: %s before: %s\n",
4009 (int) (info[i].bytes_accesed * 100 / info[i].stride),
4010 info[i].total_bytes,
4011 info[i].write ? " read/write " : " read only ",
4012 info[i].prefetch_in_loop ? "yes" : "no",
4013 info[i].prefetch_before_loop ? "yes" : "no");
4016 fprintf (loop_dump_stream, "Real prefetches needed: %i (write: %i)\n",
4017 num_real_prefetches, num_real_write_prefetches);
4020 if (!num_real_prefetches)
4021 return;
4023 ahead = SIMULTANEOUS_PREFETCHES / num_real_prefetches;
4025 if (!ahead)
4026 return;
4028 for (i = 0; i < num_prefetches; i++)
4030 if (info[i].prefetch_in_loop)
4032 int y;
4034 for (y = 0; y < ((info[i].stride + PREFETCH_BLOCK - 1)
4035 / PREFETCH_BLOCK); y++)
4037 rtx loc = copy_rtx (*info[i].giv->location);
4038 rtx insn;
4039 int bytes_ahead = PREFETCH_BLOCK * (ahead + y);
4040 rtx before_insn = info[i].giv->insn;
4041 rtx prev_insn = PREV_INSN (info[i].giv->insn);
4043 /* We can save some effort by offsetting the address on
4044 architectures with offsettable memory references. */
4045 if (offsettable_address_p (0, VOIDmode, loc))
4046 loc = plus_constant (loc, bytes_ahead);
4047 else
4049 rtx reg = gen_reg_rtx (Pmode);
4050 loop_iv_add_mult_emit_before (loop, loc, const1_rtx,
4051 GEN_INT (bytes_ahead), reg,
4052 0, before_insn);
4053 loc = reg;
4056 /* Make sure the address operand is valid for prefetch. */
4057 if (! (*insn_data[(int)CODE_FOR_prefetch].operand[0].predicate)
4058 (loc,
4059 insn_data[(int)CODE_FOR_prefetch].operand[0].mode))
4060 loc = force_reg (Pmode, loc);
4061 emit_insn_before (gen_prefetch (loc, GEN_INT (info[i].write),
4062 GEN_INT (3)),
4063 before_insn);
4065 /* Check all insns emitted and record the new GIV
4066 information. */
4067 insn = NEXT_INSN (prev_insn);
4068 while (insn != before_insn)
4070 insn = check_insn_for_givs (loop, insn,
4071 info[i].giv->always_executed,
4072 info[i].giv->maybe_multiple);
4073 insn = NEXT_INSN (insn);
4078 if (info[i].prefetch_before_loop)
4080 int y;
4082 /* Emit INSNs before the loop to fetch the first cache lines. */
4083 for (y = 0;
4084 (!info[i].prefetch_in_loop || y < ahead)
4085 && y * PREFETCH_BLOCK < (int) info[i].total_bytes; y ++)
4087 rtx reg = gen_reg_rtx (Pmode);
4088 rtx loop_start = loop->start;
4089 rtx add_val = simplify_gen_binary (PLUS, Pmode,
4090 info[i].giv->add_val,
4091 GEN_INT (y * PREFETCH_BLOCK));
4093 loop_iv_add_mult_emit_before (loop, info[i].class->initial_value,
4094 info[i].giv->mult_val,
4095 add_val, reg, 0, loop_start);
4096 emit_insn_before (gen_prefetch (reg, GEN_INT (info[i].write),
4097 GEN_INT (3)),
4098 loop_start);
4103 return;
4106 /* A "basic induction variable" or biv is a pseudo reg that is set
4107 (within this loop) only by incrementing or decrementing it. */
4108 /* A "general induction variable" or giv is a pseudo reg whose
4109 value is a linear function of a biv. */
4111 /* Bivs are recognized by `basic_induction_var';
4112 Givs by `general_induction_var'. */
4114 /* Communication with routines called via `note_stores'. */
4116 static rtx note_insn;
4118 /* Dummy register to have non-zero DEST_REG for DEST_ADDR type givs. */
4120 static rtx addr_placeholder;
4122 /* ??? Unfinished optimizations, and possible future optimizations,
4123 for the strength reduction code. */
4125 /* ??? The interaction of biv elimination, and recognition of 'constant'
4126 bivs, may cause problems. */
4128 /* ??? Add heuristics so that DEST_ADDR strength reduction does not cause
4129 performance problems.
4131 Perhaps don't eliminate things that can be combined with an addressing
4132 mode. Find all givs that have the same biv, mult_val, and add_val;
4133 then for each giv, check to see if its only use dies in a following
4134 memory address. If so, generate a new memory address and check to see
4135 if it is valid. If it is valid, then store the modified memory address,
4136 otherwise, mark the giv as not done so that it will get its own iv. */
4138 /* ??? Could try to optimize branches when it is known that a biv is always
4139 positive. */
4141 /* ??? When replace a biv in a compare insn, we should replace with closest
4142 giv so that an optimized branch can still be recognized by the combiner,
4143 e.g. the VAX acb insn. */
4145 /* ??? Many of the checks involving uid_luid could be simplified if regscan
4146 was rerun in loop_optimize whenever a register was added or moved.
4147 Also, some of the optimizations could be a little less conservative. */
4149 /* Scan the loop body and call FNCALL for each insn. In the addition to the
4150 LOOP and INSN parameters pass MAYBE_MULTIPLE and NOT_EVERY_ITERATION to the
4151 callback.
4153 NOT_EVERY_ITERATION if current insn is not executed at least once for every
4154 loop iteration except for the last one.
4156 MAYBE_MULTIPLE is 1 if current insn may be executed more than once for every
4157 loop iteration.
4159 void
4160 for_each_insn_in_loop (loop, fncall)
4161 struct loop *loop;
4162 loop_insn_callback fncall;
4164 /* This is 1 if current insn is not executed at least once for every loop
4165 iteration. */
4166 int not_every_iteration = 0;
4167 int maybe_multiple = 0;
4168 int past_loop_latch = 0;
4169 int loop_depth = 0;
4170 rtx p;
4172 /* If loop_scan_start points to the loop exit test, we have to be wary of
4173 subversive use of gotos inside expression statements. */
4174 if (prev_nonnote_insn (loop->scan_start) != prev_nonnote_insn (loop->start))
4175 maybe_multiple = back_branch_in_range_p (loop, loop->scan_start);
4177 /* Scan through loop to find all possible bivs. */
4179 for (p = next_insn_in_loop (loop, loop->scan_start);
4180 p != NULL_RTX;
4181 p = next_insn_in_loop (loop, p))
4183 p = fncall (loop, p, not_every_iteration, maybe_multiple);
4185 /* Past CODE_LABEL, we get to insns that may be executed multiple
4186 times. The only way we can be sure that they can't is if every
4187 jump insn between here and the end of the loop either
4188 returns, exits the loop, is a jump to a location that is still
4189 behind the label, or is a jump to the loop start. */
4191 if (GET_CODE (p) == CODE_LABEL)
4193 rtx insn = p;
4195 maybe_multiple = 0;
4197 while (1)
4199 insn = NEXT_INSN (insn);
4200 if (insn == loop->scan_start)
4201 break;
4202 if (insn == loop->end)
4204 if (loop->top != 0)
4205 insn = loop->top;
4206 else
4207 break;
4208 if (insn == loop->scan_start)
4209 break;
4212 if (GET_CODE (insn) == JUMP_INSN
4213 && GET_CODE (PATTERN (insn)) != RETURN
4214 && (!any_condjump_p (insn)
4215 || (JUMP_LABEL (insn) != 0
4216 && JUMP_LABEL (insn) != loop->scan_start
4217 && !loop_insn_first_p (p, JUMP_LABEL (insn)))))
4219 maybe_multiple = 1;
4220 break;
4225 /* Past a jump, we get to insns for which we can't count
4226 on whether they will be executed during each iteration. */
4227 /* This code appears twice in strength_reduce. There is also similar
4228 code in scan_loop. */
4229 if (GET_CODE (p) == JUMP_INSN
4230 /* If we enter the loop in the middle, and scan around to the
4231 beginning, don't set not_every_iteration for that.
4232 This can be any kind of jump, since we want to know if insns
4233 will be executed if the loop is executed. */
4234 && !(JUMP_LABEL (p) == loop->top
4235 && ((NEXT_INSN (NEXT_INSN (p)) == loop->end
4236 && any_uncondjump_p (p))
4237 || (NEXT_INSN (p) == loop->end && any_condjump_p (p)))))
4239 rtx label = 0;
4241 /* If this is a jump outside the loop, then it also doesn't
4242 matter. Check to see if the target of this branch is on the
4243 loop->exits_labels list. */
4245 for (label = loop->exit_labels; label; label = LABEL_NEXTREF (label))
4246 if (XEXP (label, 0) == JUMP_LABEL (p))
4247 break;
4249 if (!label)
4250 not_every_iteration = 1;
4253 else if (GET_CODE (p) == NOTE)
4255 /* At the virtual top of a converted loop, insns are again known to
4256 be executed each iteration: logically, the loop begins here
4257 even though the exit code has been duplicated.
4259 Insns are also again known to be executed each iteration at
4260 the LOOP_CONT note. */
4261 if ((NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_VTOP
4262 || NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_CONT)
4263 && loop_depth == 0)
4264 not_every_iteration = 0;
4265 else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
4266 loop_depth++;
4267 else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END)
4268 loop_depth--;
4271 /* Note if we pass a loop latch. If we do, then we can not clear
4272 NOT_EVERY_ITERATION below when we pass the last CODE_LABEL in
4273 a loop since a jump before the last CODE_LABEL may have started
4274 a new loop iteration.
4276 Note that LOOP_TOP is only set for rotated loops and we need
4277 this check for all loops, so compare against the CODE_LABEL
4278 which immediately follows LOOP_START. */
4279 if (GET_CODE (p) == JUMP_INSN
4280 && JUMP_LABEL (p) == NEXT_INSN (loop->start))
4281 past_loop_latch = 1;
4283 /* Unlike in the code motion pass where MAYBE_NEVER indicates that
4284 an insn may never be executed, NOT_EVERY_ITERATION indicates whether
4285 or not an insn is known to be executed each iteration of the
4286 loop, whether or not any iterations are known to occur.
4288 Therefore, if we have just passed a label and have no more labels
4289 between here and the test insn of the loop, and we have not passed
4290 a jump to the top of the loop, then we know these insns will be
4291 executed each iteration. */
4293 if (not_every_iteration
4294 && !past_loop_latch
4295 && GET_CODE (p) == CODE_LABEL
4296 && no_labels_between_p (p, loop->end)
4297 && loop_insn_first_p (p, loop->cont))
4298 not_every_iteration = 0;
4302 static void
4303 loop_bivs_find (loop)
4304 struct loop *loop;
4306 struct loop_regs *regs = LOOP_REGS (loop);
4307 struct loop_ivs *ivs = LOOP_IVS (loop);
4308 /* Temporary list pointers for traversing ivs->list. */
4309 struct iv_class *bl, **backbl;
4311 ivs->list = 0;
4313 for_each_insn_in_loop (loop, check_insn_for_bivs);
4315 /* Scan ivs->list to remove all regs that proved not to be bivs.
4316 Make a sanity check against regs->n_times_set. */
4317 for (backbl = &ivs->list, bl = *backbl; bl; bl = bl->next)
4319 if (REG_IV_TYPE (ivs, bl->regno) != BASIC_INDUCT
4320 /* Above happens if register modified by subreg, etc. */
4321 /* Make sure it is not recognized as a basic induction var: */
4322 || regs->array[bl->regno].n_times_set != bl->biv_count
4323 /* If never incremented, it is invariant that we decided not to
4324 move. So leave it alone. */
4325 || ! bl->incremented)
4327 if (loop_dump_stream)
4328 fprintf (loop_dump_stream, "Biv %d: discarded, %s\n",
4329 bl->regno,
4330 (REG_IV_TYPE (ivs, bl->regno) != BASIC_INDUCT
4331 ? "not induction variable"
4332 : (! bl->incremented ? "never incremented"
4333 : "count error")));
4335 REG_IV_TYPE (ivs, bl->regno) = NOT_BASIC_INDUCT;
4336 *backbl = bl->next;
4338 else
4340 backbl = &bl->next;
4342 if (loop_dump_stream)
4343 fprintf (loop_dump_stream, "Biv %d: verified\n", bl->regno);
4349 /* Determine how BIVS are initialised by looking through pre-header
4350 extended basic block. */
4351 static void
4352 loop_bivs_init_find (loop)
4353 struct loop *loop;
4355 struct loop_ivs *ivs = LOOP_IVS (loop);
4356 /* Temporary list pointers for traversing ivs->list. */
4357 struct iv_class *bl;
4358 int call_seen;
4359 rtx p;
4361 /* Find initial value for each biv by searching backwards from loop_start,
4362 halting at first label. Also record any test condition. */
4364 call_seen = 0;
4365 for (p = loop->start; p && GET_CODE (p) != CODE_LABEL; p = PREV_INSN (p))
4367 rtx test;
4369 note_insn = p;
4371 if (GET_CODE (p) == CALL_INSN)
4372 call_seen = 1;
4374 if (INSN_P (p))
4375 note_stores (PATTERN (p), record_initial, ivs);
4377 /* Record any test of a biv that branches around the loop if no store
4378 between it and the start of loop. We only care about tests with
4379 constants and registers and only certain of those. */
4380 if (GET_CODE (p) == JUMP_INSN
4381 && JUMP_LABEL (p) != 0
4382 && next_real_insn (JUMP_LABEL (p)) == next_real_insn (loop->end)
4383 && (test = get_condition_for_loop (loop, p)) != 0
4384 && GET_CODE (XEXP (test, 0)) == REG
4385 && REGNO (XEXP (test, 0)) < max_reg_before_loop
4386 && (bl = REG_IV_CLASS (ivs, REGNO (XEXP (test, 0)))) != 0
4387 && valid_initial_value_p (XEXP (test, 1), p, call_seen, loop->start)
4388 && bl->init_insn == 0)
4390 /* If an NE test, we have an initial value! */
4391 if (GET_CODE (test) == NE)
4393 bl->init_insn = p;
4394 bl->init_set = gen_rtx_SET (VOIDmode,
4395 XEXP (test, 0), XEXP (test, 1));
4397 else
4398 bl->initial_test = test;
4404 /* Look at the each biv and see if we can say anything better about its
4405 initial value from any initializing insns set up above. (This is done
4406 in two passes to avoid missing SETs in a PARALLEL.) */
4407 static void
4408 loop_bivs_check (loop)
4409 struct loop *loop;
4411 struct loop_ivs *ivs = LOOP_IVS (loop);
4412 /* Temporary list pointers for traversing ivs->list. */
4413 struct iv_class *bl;
4414 struct iv_class **backbl;
4416 for (backbl = &ivs->list; (bl = *backbl); backbl = &bl->next)
4418 rtx src;
4419 rtx note;
4421 if (! bl->init_insn)
4422 continue;
4424 /* IF INIT_INSN has a REG_EQUAL or REG_EQUIV note and the value
4425 is a constant, use the value of that. */
4426 if (((note = find_reg_note (bl->init_insn, REG_EQUAL, 0)) != NULL
4427 && CONSTANT_P (XEXP (note, 0)))
4428 || ((note = find_reg_note (bl->init_insn, REG_EQUIV, 0)) != NULL
4429 && CONSTANT_P (XEXP (note, 0))))
4430 src = XEXP (note, 0);
4431 else
4432 src = SET_SRC (bl->init_set);
4434 if (loop_dump_stream)
4435 fprintf (loop_dump_stream,
4436 "Biv %d: initialized at insn %d: initial value ",
4437 bl->regno, INSN_UID (bl->init_insn));
4439 if ((GET_MODE (src) == GET_MODE (regno_reg_rtx[bl->regno])
4440 || GET_MODE (src) == VOIDmode)
4441 && valid_initial_value_p (src, bl->init_insn,
4442 LOOP_INFO (loop)->pre_header_has_call,
4443 loop->start))
4445 bl->initial_value = src;
4447 if (loop_dump_stream)
4449 print_simple_rtl (loop_dump_stream, src);
4450 fputc ('\n', loop_dump_stream);
4453 /* If we can't make it a giv,
4454 let biv keep initial value of "itself". */
4455 else if (loop_dump_stream)
4456 fprintf (loop_dump_stream, "is complex\n");
4461 /* Search the loop for general induction variables. */
4463 static void
4464 loop_givs_find (loop)
4465 struct loop* loop;
4467 for_each_insn_in_loop (loop, check_insn_for_givs);
4471 /* For each giv for which we still don't know whether or not it is
4472 replaceable, check to see if it is replaceable because its final value
4473 can be calculated. */
4475 static void
4476 loop_givs_check (loop)
4477 struct loop *loop;
4479 struct loop_ivs *ivs = LOOP_IVS (loop);
4480 struct iv_class *bl;
4482 for (bl = ivs->list; bl; bl = bl->next)
4484 struct induction *v;
4486 for (v = bl->giv; v; v = v->next_iv)
4487 if (! v->replaceable && ! v->not_replaceable)
4488 check_final_value (loop, v);
4493 /* Return non-zero if it is possible to eliminate the biv BL provided
4494 all givs are reduced. This is possible if either the reg is not
4495 used outside the loop, or we can compute what its final value will
4496 be. */
4498 static int
4499 loop_biv_eliminable_p (loop, bl, threshold, insn_count)
4500 struct loop *loop;
4501 struct iv_class *bl;
4502 int threshold;
4503 int insn_count;
4505 /* For architectures with a decrement_and_branch_until_zero insn,
4506 don't do this if we put a REG_NONNEG note on the endtest for this
4507 biv. */
4509 #ifdef HAVE_decrement_and_branch_until_zero
4510 if (bl->nonneg)
4512 if (loop_dump_stream)
4513 fprintf (loop_dump_stream,
4514 "Cannot eliminate nonneg biv %d.\n", bl->regno);
4515 return 0;
4517 #endif
4519 /* Check that biv is used outside loop or if it has a final value.
4520 Compare against bl->init_insn rather than loop->start. We aren't
4521 concerned with any uses of the biv between init_insn and
4522 loop->start since these won't be affected by the value of the biv
4523 elsewhere in the function, so long as init_insn doesn't use the
4524 biv itself. */
4526 if ((REGNO_LAST_LUID (bl->regno) < INSN_LUID (loop->end)
4527 && bl->init_insn
4528 && INSN_UID (bl->init_insn) < max_uid_for_loop
4529 && REGNO_FIRST_LUID (bl->regno) >= INSN_LUID (bl->init_insn)
4530 && ! reg_mentioned_p (bl->biv->dest_reg, SET_SRC (bl->init_set)))
4531 || (bl->final_value = final_biv_value (loop, bl)))
4532 return maybe_eliminate_biv (loop, bl, 0, threshold, insn_count);
4534 if (loop_dump_stream)
4536 fprintf (loop_dump_stream,
4537 "Cannot eliminate biv %d.\n",
4538 bl->regno);
4539 fprintf (loop_dump_stream,
4540 "First use: insn %d, last use: insn %d.\n",
4541 REGNO_FIRST_UID (bl->regno),
4542 REGNO_LAST_UID (bl->regno));
4544 return 0;
4548 /* Reduce each giv of BL that we have decided to reduce. */
4550 static void
4551 loop_givs_reduce (loop, bl)
4552 struct loop *loop;
4553 struct iv_class *bl;
4555 struct induction *v;
4557 for (v = bl->giv; v; v = v->next_iv)
4559 struct induction *tv;
4560 if (! v->ignore && v->same == 0)
4562 int auto_inc_opt = 0;
4564 /* If the code for derived givs immediately below has already
4565 allocated a new_reg, we must keep it. */
4566 if (! v->new_reg)
4567 v->new_reg = gen_reg_rtx (v->mode);
4569 #ifdef AUTO_INC_DEC
4570 /* If the target has auto-increment addressing modes, and
4571 this is an address giv, then try to put the increment
4572 immediately after its use, so that flow can create an
4573 auto-increment addressing mode. */
4574 if (v->giv_type == DEST_ADDR && bl->biv_count == 1
4575 && bl->biv->always_executed && ! bl->biv->maybe_multiple
4576 /* We don't handle reversed biv's because bl->biv->insn
4577 does not have a valid INSN_LUID. */
4578 && ! bl->reversed
4579 && v->always_executed && ! v->maybe_multiple
4580 && INSN_UID (v->insn) < max_uid_for_loop)
4582 /* If other giv's have been combined with this one, then
4583 this will work only if all uses of the other giv's occur
4584 before this giv's insn. This is difficult to check.
4586 We simplify this by looking for the common case where
4587 there is one DEST_REG giv, and this giv's insn is the
4588 last use of the dest_reg of that DEST_REG giv. If the
4589 increment occurs after the address giv, then we can
4590 perform the optimization. (Otherwise, the increment
4591 would have to go before other_giv, and we would not be
4592 able to combine it with the address giv to get an
4593 auto-inc address.) */
4594 if (v->combined_with)
4596 struct induction *other_giv = 0;
4598 for (tv = bl->giv; tv; tv = tv->next_iv)
4599 if (tv->same == v)
4601 if (other_giv)
4602 break;
4603 else
4604 other_giv = tv;
4606 if (! tv && other_giv
4607 && REGNO (other_giv->dest_reg) < max_reg_before_loop
4608 && (REGNO_LAST_UID (REGNO (other_giv->dest_reg))
4609 == INSN_UID (v->insn))
4610 && INSN_LUID (v->insn) < INSN_LUID (bl->biv->insn))
4611 auto_inc_opt = 1;
4613 /* Check for case where increment is before the address
4614 giv. Do this test in "loop order". */
4615 else if ((INSN_LUID (v->insn) > INSN_LUID (bl->biv->insn)
4616 && (INSN_LUID (v->insn) < INSN_LUID (loop->scan_start)
4617 || (INSN_LUID (bl->biv->insn)
4618 > INSN_LUID (loop->scan_start))))
4619 || (INSN_LUID (v->insn) < INSN_LUID (loop->scan_start)
4620 && (INSN_LUID (loop->scan_start)
4621 < INSN_LUID (bl->biv->insn))))
4622 auto_inc_opt = -1;
4623 else
4624 auto_inc_opt = 1;
4626 #ifdef HAVE_cc0
4628 rtx prev;
4630 /* We can't put an insn immediately after one setting
4631 cc0, or immediately before one using cc0. */
4632 if ((auto_inc_opt == 1 && sets_cc0_p (PATTERN (v->insn)))
4633 || (auto_inc_opt == -1
4634 && (prev = prev_nonnote_insn (v->insn)) != 0
4635 && INSN_P (prev)
4636 && sets_cc0_p (PATTERN (prev))))
4637 auto_inc_opt = 0;
4639 #endif
4641 if (auto_inc_opt)
4642 v->auto_inc_opt = 1;
4644 #endif
4646 /* For each place where the biv is incremented, add an insn
4647 to increment the new, reduced reg for the giv. */
4648 for (tv = bl->biv; tv; tv = tv->next_iv)
4650 rtx insert_before;
4652 if (! auto_inc_opt)
4653 insert_before = tv->insn;
4654 else if (auto_inc_opt == 1)
4655 insert_before = NEXT_INSN (v->insn);
4656 else
4657 insert_before = v->insn;
4659 if (tv->mult_val == const1_rtx)
4660 loop_iv_add_mult_emit_before (loop, tv->add_val, v->mult_val,
4661 v->new_reg, v->new_reg,
4662 0, insert_before);
4663 else /* tv->mult_val == const0_rtx */
4664 /* A multiply is acceptable here
4665 since this is presumed to be seldom executed. */
4666 loop_iv_add_mult_emit_before (loop, tv->add_val, v->mult_val,
4667 v->add_val, v->new_reg,
4668 0, insert_before);
4671 /* Add code at loop start to initialize giv's reduced reg. */
4673 loop_iv_add_mult_hoist (loop,
4674 extend_value_for_giv (v, bl->initial_value),
4675 v->mult_val, v->add_val, v->new_reg);
4681 /* Check for givs whose first use is their definition and whose
4682 last use is the definition of another giv. If so, it is likely
4683 dead and should not be used to derive another giv nor to
4684 eliminate a biv. */
4686 static void
4687 loop_givs_dead_check (loop, bl)
4688 struct loop *loop ATTRIBUTE_UNUSED;
4689 struct iv_class *bl;
4691 struct induction *v;
4693 for (v = bl->giv; v; v = v->next_iv)
4695 if (v->ignore
4696 || (v->same && v->same->ignore))
4697 continue;
4699 if (v->giv_type == DEST_REG
4700 && REGNO_FIRST_UID (REGNO (v->dest_reg)) == INSN_UID (v->insn))
4702 struct induction *v1;
4704 for (v1 = bl->giv; v1; v1 = v1->next_iv)
4705 if (REGNO_LAST_UID (REGNO (v->dest_reg)) == INSN_UID (v1->insn))
4706 v->maybe_dead = 1;
4712 static void
4713 loop_givs_rescan (loop, bl, reg_map)
4714 struct loop *loop;
4715 struct iv_class *bl;
4716 rtx *reg_map;
4718 struct induction *v;
4720 for (v = bl->giv; v; v = v->next_iv)
4722 if (v->same && v->same->ignore)
4723 v->ignore = 1;
4725 if (v->ignore)
4726 continue;
4728 /* Update expression if this was combined, in case other giv was
4729 replaced. */
4730 if (v->same)
4731 v->new_reg = replace_rtx (v->new_reg,
4732 v->same->dest_reg, v->same->new_reg);
4734 /* See if this register is known to be a pointer to something. If
4735 so, see if we can find the alignment. First see if there is a
4736 destination register that is a pointer. If so, this shares the
4737 alignment too. Next see if we can deduce anything from the
4738 computational information. If not, and this is a DEST_ADDR
4739 giv, at least we know that it's a pointer, though we don't know
4740 the alignment. */
4741 if (GET_CODE (v->new_reg) == REG
4742 && v->giv_type == DEST_REG
4743 && REG_POINTER (v->dest_reg))
4744 mark_reg_pointer (v->new_reg,
4745 REGNO_POINTER_ALIGN (REGNO (v->dest_reg)));
4746 else if (GET_CODE (v->new_reg) == REG
4747 && REG_POINTER (v->src_reg))
4749 unsigned int align = REGNO_POINTER_ALIGN (REGNO (v->src_reg));
4751 if (align == 0
4752 || GET_CODE (v->add_val) != CONST_INT
4753 || INTVAL (v->add_val) % (align / BITS_PER_UNIT) != 0)
4754 align = 0;
4756 mark_reg_pointer (v->new_reg, align);
4758 else if (GET_CODE (v->new_reg) == REG
4759 && GET_CODE (v->add_val) == REG
4760 && REG_POINTER (v->add_val))
4762 unsigned int align = REGNO_POINTER_ALIGN (REGNO (v->add_val));
4764 if (align == 0 || GET_CODE (v->mult_val) != CONST_INT
4765 || INTVAL (v->mult_val) % (align / BITS_PER_UNIT) != 0)
4766 align = 0;
4768 mark_reg_pointer (v->new_reg, align);
4770 else if (GET_CODE (v->new_reg) == REG && v->giv_type == DEST_ADDR)
4771 mark_reg_pointer (v->new_reg, 0);
4773 if (v->giv_type == DEST_ADDR)
4774 /* Store reduced reg as the address in the memref where we found
4775 this giv. */
4776 validate_change (v->insn, v->location, v->new_reg, 0);
4777 else if (v->replaceable)
4779 reg_map[REGNO (v->dest_reg)] = v->new_reg;
4781 else
4783 /* Not replaceable; emit an insn to set the original giv reg from
4784 the reduced giv, same as above. */
4785 loop_insn_emit_after (loop, 0, v->insn,
4786 gen_move_insn (v->dest_reg, v->new_reg));
4789 /* When a loop is reversed, givs which depend on the reversed
4790 biv, and which are live outside the loop, must be set to their
4791 correct final value. This insn is only needed if the giv is
4792 not replaceable. The correct final value is the same as the
4793 value that the giv starts the reversed loop with. */
4794 if (bl->reversed && ! v->replaceable)
4795 loop_iv_add_mult_sink (loop,
4796 extend_value_for_giv (v, bl->initial_value),
4797 v->mult_val, v->add_val, v->dest_reg);
4798 else if (v->final_value)
4799 loop_insn_sink_or_swim (loop,
4800 gen_move_insn (v->dest_reg, v->final_value));
4802 if (loop_dump_stream)
4804 fprintf (loop_dump_stream, "giv at %d reduced to ",
4805 INSN_UID (v->insn));
4806 print_simple_rtl (loop_dump_stream, v->new_reg);
4807 fprintf (loop_dump_stream, "\n");
4813 static int
4814 loop_giv_reduce_benefit (loop, bl, v, test_reg)
4815 struct loop *loop ATTRIBUTE_UNUSED;
4816 struct iv_class *bl;
4817 struct induction *v;
4818 rtx test_reg;
4820 int add_cost;
4821 int benefit;
4823 benefit = v->benefit;
4824 PUT_MODE (test_reg, v->mode);
4825 add_cost = iv_add_mult_cost (bl->biv->add_val, v->mult_val,
4826 test_reg, test_reg);
4828 /* Reduce benefit if not replaceable, since we will insert a
4829 move-insn to replace the insn that calculates this giv. Don't do
4830 this unless the giv is a user variable, since it will often be
4831 marked non-replaceable because of the duplication of the exit
4832 code outside the loop. In such a case, the copies we insert are
4833 dead and will be deleted. So they don't have a cost. Similar
4834 situations exist. */
4835 /* ??? The new final_[bg]iv_value code does a much better job of
4836 finding replaceable giv's, and hence this code may no longer be
4837 necessary. */
4838 if (! v->replaceable && ! bl->eliminable
4839 && REG_USERVAR_P (v->dest_reg))
4840 benefit -= copy_cost;
4842 /* Decrease the benefit to count the add-insns that we will insert
4843 to increment the reduced reg for the giv. ??? This can
4844 overestimate the run-time cost of the additional insns, e.g. if
4845 there are multiple basic blocks that increment the biv, but only
4846 one of these blocks is executed during each iteration. There is
4847 no good way to detect cases like this with the current structure
4848 of the loop optimizer. This code is more accurate for
4849 determining code size than run-time benefits. */
4850 benefit -= add_cost * bl->biv_count;
4852 /* Decide whether to strength-reduce this giv or to leave the code
4853 unchanged (recompute it from the biv each time it is used). This
4854 decision can be made independently for each giv. */
4856 #ifdef AUTO_INC_DEC
4857 /* Attempt to guess whether autoincrement will handle some of the
4858 new add insns; if so, increase BENEFIT (undo the subtraction of
4859 add_cost that was done above). */
4860 if (v->giv_type == DEST_ADDR
4861 /* Increasing the benefit is risky, since this is only a guess.
4862 Avoid increasing register pressure in cases where there would
4863 be no other benefit from reducing this giv. */
4864 && benefit > 0
4865 && GET_CODE (v->mult_val) == CONST_INT)
4867 int size = GET_MODE_SIZE (GET_MODE (v->mem));
4869 if (HAVE_POST_INCREMENT
4870 && INTVAL (v->mult_val) == size)
4871 benefit += add_cost * bl->biv_count;
4872 else if (HAVE_PRE_INCREMENT
4873 && INTVAL (v->mult_val) == size)
4874 benefit += add_cost * bl->biv_count;
4875 else if (HAVE_POST_DECREMENT
4876 && -INTVAL (v->mult_val) == size)
4877 benefit += add_cost * bl->biv_count;
4878 else if (HAVE_PRE_DECREMENT
4879 && -INTVAL (v->mult_val) == size)
4880 benefit += add_cost * bl->biv_count;
4882 #endif
4884 return benefit;
4888 /* Free IV structures for LOOP. */
4890 static void
4891 loop_ivs_free (loop)
4892 struct loop *loop;
4894 struct loop_ivs *ivs = LOOP_IVS (loop);
4895 struct iv_class *iv = ivs->list;
4897 free (ivs->regs);
4899 while (iv)
4901 struct iv_class *next = iv->next;
4902 struct induction *induction;
4903 struct induction *next_induction;
4905 for (induction = iv->biv; induction; induction = next_induction)
4907 next_induction = induction->next_iv;
4908 free (induction);
4910 for (induction = iv->giv; induction; induction = next_induction)
4912 next_induction = induction->next_iv;
4913 free (induction);
4916 free (iv);
4917 iv = next;
4922 /* Perform strength reduction and induction variable elimination.
4924 Pseudo registers created during this function will be beyond the
4925 last valid index in several tables including
4926 REGS->ARRAY[I].N_TIMES_SET and REGNO_LAST_UID. This does not cause a
4927 problem here, because the added registers cannot be givs outside of
4928 their loop, and hence will never be reconsidered. But scan_loop
4929 must check regnos to make sure they are in bounds. */
4931 static void
4932 strength_reduce (loop, flags)
4933 struct loop *loop;
4934 int flags;
4936 struct loop_info *loop_info = LOOP_INFO (loop);
4937 struct loop_regs *regs = LOOP_REGS (loop);
4938 struct loop_ivs *ivs = LOOP_IVS (loop);
4939 rtx p;
4940 /* Temporary list pointer for traversing ivs->list. */
4941 struct iv_class *bl;
4942 /* Ratio of extra register life span we can justify
4943 for saving an instruction. More if loop doesn't call subroutines
4944 since in that case saving an insn makes more difference
4945 and more registers are available. */
4946 /* ??? could set this to last value of threshold in move_movables */
4947 int threshold = (loop_info->has_call ? 1 : 2) * (3 + n_non_fixed_regs);
4948 /* Map of pseudo-register replacements. */
4949 rtx *reg_map = NULL;
4950 int reg_map_size;
4951 int unrolled_insn_copies = 0;
4952 rtx test_reg = gen_rtx_REG (word_mode, LAST_VIRTUAL_REGISTER + 1);
4953 int insn_count = count_insns_in_loop (loop);
4955 addr_placeholder = gen_reg_rtx (Pmode);
4957 ivs->n_regs = max_reg_before_loop;
4958 ivs->regs = (struct iv *) xcalloc (ivs->n_regs, sizeof (struct iv));
4960 /* Find all BIVs in loop. */
4961 loop_bivs_find (loop);
4963 /* Exit if there are no bivs. */
4964 if (! ivs->list)
4966 /* Can still unroll the loop anyways, but indicate that there is no
4967 strength reduction info available. */
4968 if (flags & LOOP_UNROLL)
4969 unroll_loop (loop, insn_count, 0);
4971 loop_ivs_free (loop);
4972 return;
4975 /* Determine how BIVS are initialised by looking through pre-header
4976 extended basic block. */
4977 loop_bivs_init_find (loop);
4979 /* Look at the each biv and see if we can say anything better about its
4980 initial value from any initializing insns set up above. */
4981 loop_bivs_check (loop);
4983 /* Search the loop for general induction variables. */
4984 loop_givs_find (loop);
4986 /* Try to calculate and save the number of loop iterations. This is
4987 set to zero if the actual number can not be calculated. This must
4988 be called after all giv's have been identified, since otherwise it may
4989 fail if the iteration variable is a giv. */
4990 loop_iterations (loop);
4992 #ifdef HAVE_prefetch
4993 if (flags & LOOP_PREFETCH)
4994 emit_prefetch_instructions (loop);
4995 #endif
4997 /* Now for each giv for which we still don't know whether or not it is
4998 replaceable, check to see if it is replaceable because its final value
4999 can be calculated. This must be done after loop_iterations is called,
5000 so that final_giv_value will work correctly. */
5001 loop_givs_check (loop);
5003 /* Try to prove that the loop counter variable (if any) is always
5004 nonnegative; if so, record that fact with a REG_NONNEG note
5005 so that "decrement and branch until zero" insn can be used. */
5006 check_dbra_loop (loop, insn_count);
5008 /* Create reg_map to hold substitutions for replaceable giv regs.
5009 Some givs might have been made from biv increments, so look at
5010 ivs->reg_iv_type for a suitable size. */
5011 reg_map_size = ivs->n_regs;
5012 reg_map = (rtx *) xcalloc (reg_map_size, sizeof (rtx));
5014 /* Examine each iv class for feasibility of strength reduction/induction
5015 variable elimination. */
5017 for (bl = ivs->list; bl; bl = bl->next)
5019 struct induction *v;
5020 int benefit;
5022 /* Test whether it will be possible to eliminate this biv
5023 provided all givs are reduced. */
5024 bl->eliminable = loop_biv_eliminable_p (loop, bl, threshold, insn_count);
5026 /* This will be true at the end, if all givs which depend on this
5027 biv have been strength reduced.
5028 We can't (currently) eliminate the biv unless this is so. */
5029 bl->all_reduced = 1;
5031 /* Check each extension dependent giv in this class to see if its
5032 root biv is safe from wrapping in the interior mode. */
5033 check_ext_dependent_givs (bl, loop_info);
5035 /* Combine all giv's for this iv_class. */
5036 combine_givs (regs, bl);
5038 for (v = bl->giv; v; v = v->next_iv)
5040 struct induction *tv;
5042 if (v->ignore || v->same)
5043 continue;
5045 benefit = loop_giv_reduce_benefit (loop, bl, v, test_reg);
5047 /* If an insn is not to be strength reduced, then set its ignore
5048 flag, and clear bl->all_reduced. */
5050 /* A giv that depends on a reversed biv must be reduced if it is
5051 used after the loop exit, otherwise, it would have the wrong
5052 value after the loop exit. To make it simple, just reduce all
5053 of such giv's whether or not we know they are used after the loop
5054 exit. */
5056 if (! flag_reduce_all_givs
5057 && v->lifetime * threshold * benefit < insn_count
5058 && ! bl->reversed)
5060 if (loop_dump_stream)
5061 fprintf (loop_dump_stream,
5062 "giv of insn %d not worth while, %d vs %d.\n",
5063 INSN_UID (v->insn),
5064 v->lifetime * threshold * benefit, insn_count);
5065 v->ignore = 1;
5066 bl->all_reduced = 0;
5068 else
5070 /* Check that we can increment the reduced giv without a
5071 multiply insn. If not, reject it. */
5073 for (tv = bl->biv; tv; tv = tv->next_iv)
5074 if (tv->mult_val == const1_rtx
5075 && ! product_cheap_p (tv->add_val, v->mult_val))
5077 if (loop_dump_stream)
5078 fprintf (loop_dump_stream,
5079 "giv of insn %d: would need a multiply.\n",
5080 INSN_UID (v->insn));
5081 v->ignore = 1;
5082 bl->all_reduced = 0;
5083 break;
5088 /* Check for givs whose first use is their definition and whose
5089 last use is the definition of another giv. If so, it is likely
5090 dead and should not be used to derive another giv nor to
5091 eliminate a biv. */
5092 loop_givs_dead_check (loop, bl);
5094 /* Reduce each giv that we decided to reduce. */
5095 loop_givs_reduce (loop, bl);
5097 /* Rescan all givs. If a giv is the same as a giv not reduced, mark it
5098 as not reduced.
5100 For each giv register that can be reduced now: if replaceable,
5101 substitute reduced reg wherever the old giv occurs;
5102 else add new move insn "giv_reg = reduced_reg". */
5103 loop_givs_rescan (loop, bl, reg_map);
5105 /* All the givs based on the biv bl have been reduced if they
5106 merit it. */
5108 /* For each giv not marked as maybe dead that has been combined with a
5109 second giv, clear any "maybe dead" mark on that second giv.
5110 v->new_reg will either be or refer to the register of the giv it
5111 combined with.
5113 Doing this clearing avoids problems in biv elimination where
5114 a giv's new_reg is a complex value that can't be put in the
5115 insn but the giv combined with (with a reg as new_reg) is
5116 marked maybe_dead. Since the register will be used in either
5117 case, we'd prefer it be used from the simpler giv. */
5119 for (v = bl->giv; v; v = v->next_iv)
5120 if (! v->maybe_dead && v->same)
5121 v->same->maybe_dead = 0;
5123 /* Try to eliminate the biv, if it is a candidate.
5124 This won't work if ! bl->all_reduced,
5125 since the givs we planned to use might not have been reduced.
5127 We have to be careful that we didn't initially think we could
5128 eliminate this biv because of a giv that we now think may be
5129 dead and shouldn't be used as a biv replacement.
5131 Also, there is the possibility that we may have a giv that looks
5132 like it can be used to eliminate a biv, but the resulting insn
5133 isn't valid. This can happen, for example, on the 88k, where a
5134 JUMP_INSN can compare a register only with zero. Attempts to
5135 replace it with a compare with a constant will fail.
5137 Note that in cases where this call fails, we may have replaced some
5138 of the occurrences of the biv with a giv, but no harm was done in
5139 doing so in the rare cases where it can occur. */
5141 if (bl->all_reduced == 1 && bl->eliminable
5142 && maybe_eliminate_biv (loop, bl, 1, threshold, insn_count))
5144 /* ?? If we created a new test to bypass the loop entirely,
5145 or otherwise drop straight in, based on this test, then
5146 we might want to rewrite it also. This way some later
5147 pass has more hope of removing the initialization of this
5148 biv entirely. */
5150 /* If final_value != 0, then the biv may be used after loop end
5151 and we must emit an insn to set it just in case.
5153 Reversed bivs already have an insn after the loop setting their
5154 value, so we don't need another one. We can't calculate the
5155 proper final value for such a biv here anyways. */
5156 if (bl->final_value && ! bl->reversed)
5157 loop_insn_sink_or_swim (loop, gen_move_insn
5158 (bl->biv->dest_reg, bl->final_value));
5160 if (loop_dump_stream)
5161 fprintf (loop_dump_stream, "Reg %d: biv eliminated\n",
5162 bl->regno);
5164 /* See above note wrt final_value. But since we couldn't eliminate
5165 the biv, we must set the value after the loop instead of before. */
5166 else if (bl->final_value && ! bl->reversed)
5167 loop_insn_sink (loop, gen_move_insn (bl->biv->dest_reg,
5168 bl->final_value));
5171 /* Go through all the instructions in the loop, making all the
5172 register substitutions scheduled in REG_MAP. */
5174 for (p = loop->start; p != loop->end; p = NEXT_INSN (p))
5175 if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
5176 || GET_CODE (p) == CALL_INSN)
5178 replace_regs (PATTERN (p), reg_map, reg_map_size, 0);
5179 replace_regs (REG_NOTES (p), reg_map, reg_map_size, 0);
5180 INSN_CODE (p) = -1;
5183 if (loop_info->n_iterations > 0)
5185 /* When we completely unroll a loop we will likely not need the increment
5186 of the loop BIV and we will not need the conditional branch at the
5187 end of the loop. */
5188 unrolled_insn_copies = insn_count - 2;
5190 #ifdef HAVE_cc0
5191 /* When we completely unroll a loop on a HAVE_cc0 machine we will not
5192 need the comparison before the conditional branch at the end of the
5193 loop. */
5194 unrolled_insn_copies -= 1;
5195 #endif
5197 /* We'll need one copy for each loop iteration. */
5198 unrolled_insn_copies *= loop_info->n_iterations;
5200 /* A little slop to account for the ability to remove initialization
5201 code, better CSE, and other secondary benefits of completely
5202 unrolling some loops. */
5203 unrolled_insn_copies -= 1;
5205 /* Clamp the value. */
5206 if (unrolled_insn_copies < 0)
5207 unrolled_insn_copies = 0;
5210 /* Unroll loops from within strength reduction so that we can use the
5211 induction variable information that strength_reduce has already
5212 collected. Always unroll loops that would be as small or smaller
5213 unrolled than when rolled. */
5214 if ((flags & LOOP_UNROLL)
5215 || (loop_info->n_iterations > 0
5216 && unrolled_insn_copies <= insn_count))
5217 unroll_loop (loop, insn_count, 1);
5219 #ifdef HAVE_doloop_end
5220 if (HAVE_doloop_end && (flags & LOOP_BCT) && flag_branch_on_count_reg)
5221 doloop_optimize (loop);
5222 #endif /* HAVE_doloop_end */
5224 /* In case number of iterations is known, drop branch prediction note
5225 in the branch. Do that only in second loop pass, as loop unrolling
5226 may change the number of iterations performed. */
5227 if ((flags & LOOP_BCT)
5228 && loop_info->n_iterations / loop_info->unroll_number > 1)
5230 int n = loop_info->n_iterations / loop_info->unroll_number;
5231 predict_insn (PREV_INSN (loop->end),
5232 PRED_LOOP_ITERATIONS,
5233 REG_BR_PROB_BASE - REG_BR_PROB_BASE / n);
5236 if (loop_dump_stream)
5237 fprintf (loop_dump_stream, "\n");
5239 loop_ivs_free (loop);
5240 if (reg_map)
5241 free (reg_map);
5244 /*Record all basic induction variables calculated in the insn. */
5245 static rtx
5246 check_insn_for_bivs (loop, p, not_every_iteration, maybe_multiple)
5247 struct loop *loop;
5248 rtx p;
5249 int not_every_iteration;
5250 int maybe_multiple;
5252 struct loop_ivs *ivs = LOOP_IVS (loop);
5253 rtx set;
5254 rtx dest_reg;
5255 rtx inc_val;
5256 rtx mult_val;
5257 rtx *location;
5259 if (GET_CODE (p) == INSN
5260 && (set = single_set (p))
5261 && GET_CODE (SET_DEST (set)) == REG)
5263 dest_reg = SET_DEST (set);
5264 if (REGNO (dest_reg) < max_reg_before_loop
5265 && REGNO (dest_reg) >= FIRST_PSEUDO_REGISTER
5266 && REG_IV_TYPE (ivs, REGNO (dest_reg)) != NOT_BASIC_INDUCT)
5268 if (basic_induction_var (loop, SET_SRC (set),
5269 GET_MODE (SET_SRC (set)),
5270 dest_reg, p, &inc_val, &mult_val,
5271 &location))
5273 /* It is a possible basic induction variable.
5274 Create and initialize an induction structure for it. */
5276 struct induction *v
5277 = (struct induction *) xmalloc (sizeof (struct induction));
5279 record_biv (loop, v, p, dest_reg, inc_val, mult_val, location,
5280 not_every_iteration, maybe_multiple);
5281 REG_IV_TYPE (ivs, REGNO (dest_reg)) = BASIC_INDUCT;
5283 else if (REGNO (dest_reg) < ivs->n_regs)
5284 REG_IV_TYPE (ivs, REGNO (dest_reg)) = NOT_BASIC_INDUCT;
5287 return p;
5290 /* Record all givs calculated in the insn.
5291 A register is a giv if: it is only set once, it is a function of a
5292 biv and a constant (or invariant), and it is not a biv. */
5293 static rtx
5294 check_insn_for_givs (loop, p, not_every_iteration, maybe_multiple)
5295 struct loop *loop;
5296 rtx p;
5297 int not_every_iteration;
5298 int maybe_multiple;
5300 struct loop_regs *regs = LOOP_REGS (loop);
5302 rtx set;
5303 /* Look for a general induction variable in a register. */
5304 if (GET_CODE (p) == INSN
5305 && (set = single_set (p))
5306 && GET_CODE (SET_DEST (set)) == REG
5307 && ! regs->array[REGNO (SET_DEST (set))].may_not_optimize)
5309 rtx src_reg;
5310 rtx dest_reg;
5311 rtx add_val;
5312 rtx mult_val;
5313 rtx ext_val;
5314 int benefit;
5315 rtx regnote = 0;
5316 rtx last_consec_insn;
5318 dest_reg = SET_DEST (set);
5319 if (REGNO (dest_reg) < FIRST_PSEUDO_REGISTER)
5320 return p;
5322 if (/* SET_SRC is a giv. */
5323 (general_induction_var (loop, SET_SRC (set), &src_reg, &add_val,
5324 &mult_val, &ext_val, 0, &benefit, VOIDmode)
5325 /* Equivalent expression is a giv. */
5326 || ((regnote = find_reg_note (p, REG_EQUAL, NULL_RTX))
5327 && general_induction_var (loop, XEXP (regnote, 0), &src_reg,
5328 &add_val, &mult_val, &ext_val, 0,
5329 &benefit, VOIDmode)))
5330 /* Don't try to handle any regs made by loop optimization.
5331 We have nothing on them in regno_first_uid, etc. */
5332 && REGNO (dest_reg) < max_reg_before_loop
5333 /* Don't recognize a BASIC_INDUCT_VAR here. */
5334 && dest_reg != src_reg
5335 /* This must be the only place where the register is set. */
5336 && (regs->array[REGNO (dest_reg)].n_times_set == 1
5337 /* or all sets must be consecutive and make a giv. */
5338 || (benefit = consec_sets_giv (loop, benefit, p,
5339 src_reg, dest_reg,
5340 &add_val, &mult_val, &ext_val,
5341 &last_consec_insn))))
5343 struct induction *v
5344 = (struct induction *) xmalloc (sizeof (struct induction));
5346 /* If this is a library call, increase benefit. */
5347 if (find_reg_note (p, REG_RETVAL, NULL_RTX))
5348 benefit += libcall_benefit (p);
5350 /* Skip the consecutive insns, if there are any. */
5351 if (regs->array[REGNO (dest_reg)].n_times_set != 1)
5352 p = last_consec_insn;
5354 record_giv (loop, v, p, src_reg, dest_reg, mult_val, add_val,
5355 ext_val, benefit, DEST_REG, not_every_iteration,
5356 maybe_multiple, (rtx*) 0);
5361 #ifndef DONT_REDUCE_ADDR
5362 /* Look for givs which are memory addresses. */
5363 /* This resulted in worse code on a VAX 8600. I wonder if it
5364 still does. */
5365 if (GET_CODE (p) == INSN)
5366 find_mem_givs (loop, PATTERN (p), p, not_every_iteration,
5367 maybe_multiple);
5368 #endif
5370 /* Update the status of whether giv can derive other givs. This can
5371 change when we pass a label or an insn that updates a biv. */
5372 if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
5373 || GET_CODE (p) == CODE_LABEL)
5374 update_giv_derive (loop, p);
5375 return p;
5378 /* Return 1 if X is a valid source for an initial value (or as value being
5379 compared against in an initial test).
5381 X must be either a register or constant and must not be clobbered between
5382 the current insn and the start of the loop.
5384 INSN is the insn containing X. */
5386 static int
5387 valid_initial_value_p (x, insn, call_seen, loop_start)
5388 rtx x;
5389 rtx insn;
5390 int call_seen;
5391 rtx loop_start;
5393 if (CONSTANT_P (x))
5394 return 1;
5396 /* Only consider pseudos we know about initialized in insns whose luids
5397 we know. */
5398 if (GET_CODE (x) != REG
5399 || REGNO (x) >= max_reg_before_loop)
5400 return 0;
5402 /* Don't use call-clobbered registers across a call which clobbers it. On
5403 some machines, don't use any hard registers at all. */
5404 if (REGNO (x) < FIRST_PSEUDO_REGISTER
5405 && (SMALL_REGISTER_CLASSES
5406 || (call_used_regs[REGNO (x)] && call_seen)))
5407 return 0;
5409 /* Don't use registers that have been clobbered before the start of the
5410 loop. */
5411 if (reg_set_between_p (x, insn, loop_start))
5412 return 0;
5414 return 1;
5417 /* Scan X for memory refs and check each memory address
5418 as a possible giv. INSN is the insn whose pattern X comes from.
5419 NOT_EVERY_ITERATION is 1 if the insn might not be executed during
5420 every loop iteration. MAYBE_MULTIPLE is 1 if the insn might be executed
5421 more thanonce in each loop iteration. */
5423 static void
5424 find_mem_givs (loop, x, insn, not_every_iteration, maybe_multiple)
5425 const struct loop *loop;
5426 rtx x;
5427 rtx insn;
5428 int not_every_iteration, maybe_multiple;
5430 int i, j;
5431 enum rtx_code code;
5432 const char *fmt;
5434 if (x == 0)
5435 return;
5437 code = GET_CODE (x);
5438 switch (code)
5440 case REG:
5441 case CONST_INT:
5442 case CONST:
5443 case CONST_DOUBLE:
5444 case SYMBOL_REF:
5445 case LABEL_REF:
5446 case PC:
5447 case CC0:
5448 case ADDR_VEC:
5449 case ADDR_DIFF_VEC:
5450 case USE:
5451 case CLOBBER:
5452 return;
5454 case MEM:
5456 rtx src_reg;
5457 rtx add_val;
5458 rtx mult_val;
5459 rtx ext_val;
5460 int benefit;
5462 /* This code used to disable creating GIVs with mult_val == 1 and
5463 add_val == 0. However, this leads to lost optimizations when
5464 it comes time to combine a set of related DEST_ADDR GIVs, since
5465 this one would not be seen. */
5467 if (general_induction_var (loop, XEXP (x, 0), &src_reg, &add_val,
5468 &mult_val, &ext_val, 1, &benefit,
5469 GET_MODE (x)))
5471 /* Found one; record it. */
5472 struct induction *v
5473 = (struct induction *) xmalloc (sizeof (struct induction));
5475 record_giv (loop, v, insn, src_reg, addr_placeholder, mult_val,
5476 add_val, ext_val, benefit, DEST_ADDR,
5477 not_every_iteration, maybe_multiple, &XEXP (x, 0));
5479 v->mem = x;
5482 return;
5484 default:
5485 break;
5488 /* Recursively scan the subexpressions for other mem refs. */
5490 fmt = GET_RTX_FORMAT (code);
5491 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
5492 if (fmt[i] == 'e')
5493 find_mem_givs (loop, XEXP (x, i), insn, not_every_iteration,
5494 maybe_multiple);
5495 else if (fmt[i] == 'E')
5496 for (j = 0; j < XVECLEN (x, i); j++)
5497 find_mem_givs (loop, XVECEXP (x, i, j), insn, not_every_iteration,
5498 maybe_multiple);
5501 /* Fill in the data about one biv update.
5502 V is the `struct induction' in which we record the biv. (It is
5503 allocated by the caller, with alloca.)
5504 INSN is the insn that sets it.
5505 DEST_REG is the biv's reg.
5507 MULT_VAL is const1_rtx if the biv is being incremented here, in which case
5508 INC_VAL is the increment. Otherwise, MULT_VAL is const0_rtx and the biv is
5509 being set to INC_VAL.
5511 NOT_EVERY_ITERATION is nonzero if this biv update is not know to be
5512 executed every iteration; MAYBE_MULTIPLE is nonzero if this biv update
5513 can be executed more than once per iteration. If MAYBE_MULTIPLE
5514 and NOT_EVERY_ITERATION are both zero, we know that the biv update is
5515 executed exactly once per iteration. */
5517 static void
5518 record_biv (loop, v, insn, dest_reg, inc_val, mult_val, location,
5519 not_every_iteration, maybe_multiple)
5520 struct loop *loop;
5521 struct induction *v;
5522 rtx insn;
5523 rtx dest_reg;
5524 rtx inc_val;
5525 rtx mult_val;
5526 rtx *location;
5527 int not_every_iteration;
5528 int maybe_multiple;
5530 struct loop_ivs *ivs = LOOP_IVS (loop);
5531 struct iv_class *bl;
5533 v->insn = insn;
5534 v->src_reg = dest_reg;
5535 v->dest_reg = dest_reg;
5536 v->mult_val = mult_val;
5537 v->add_val = inc_val;
5538 v->ext_dependent = NULL_RTX;
5539 v->location = location;
5540 v->mode = GET_MODE (dest_reg);
5541 v->always_computable = ! not_every_iteration;
5542 v->always_executed = ! not_every_iteration;
5543 v->maybe_multiple = maybe_multiple;
5545 /* Add this to the reg's iv_class, creating a class
5546 if this is the first incrementation of the reg. */
5548 bl = REG_IV_CLASS (ivs, REGNO (dest_reg));
5549 if (bl == 0)
5551 /* Create and initialize new iv_class. */
5553 bl = (struct iv_class *) xmalloc (sizeof (struct iv_class));
5555 bl->regno = REGNO (dest_reg);
5556 bl->biv = 0;
5557 bl->giv = 0;
5558 bl->biv_count = 0;
5559 bl->giv_count = 0;
5561 /* Set initial value to the reg itself. */
5562 bl->initial_value = dest_reg;
5563 bl->final_value = 0;
5564 /* We haven't seen the initializing insn yet */
5565 bl->init_insn = 0;
5566 bl->init_set = 0;
5567 bl->initial_test = 0;
5568 bl->incremented = 0;
5569 bl->eliminable = 0;
5570 bl->nonneg = 0;
5571 bl->reversed = 0;
5572 bl->total_benefit = 0;
5574 /* Add this class to ivs->list. */
5575 bl->next = ivs->list;
5576 ivs->list = bl;
5578 /* Put it in the array of biv register classes. */
5579 REG_IV_CLASS (ivs, REGNO (dest_reg)) = bl;
5582 /* Update IV_CLASS entry for this biv. */
5583 v->next_iv = bl->biv;
5584 bl->biv = v;
5585 bl->biv_count++;
5586 if (mult_val == const1_rtx)
5587 bl->incremented = 1;
5589 if (loop_dump_stream)
5590 loop_biv_dump (v, loop_dump_stream, 0);
5593 /* Fill in the data about one giv.
5594 V is the `struct induction' in which we record the giv. (It is
5595 allocated by the caller, with alloca.)
5596 INSN is the insn that sets it.
5597 BENEFIT estimates the savings from deleting this insn.
5598 TYPE is DEST_REG or DEST_ADDR; it says whether the giv is computed
5599 into a register or is used as a memory address.
5601 SRC_REG is the biv reg which the giv is computed from.
5602 DEST_REG is the giv's reg (if the giv is stored in a reg).
5603 MULT_VAL and ADD_VAL are the coefficients used to compute the giv.
5604 LOCATION points to the place where this giv's value appears in INSN. */
5606 static void
5607 record_giv (loop, v, insn, src_reg, dest_reg, mult_val, add_val, ext_val,
5608 benefit, type, not_every_iteration, maybe_multiple, location)
5609 const struct loop *loop;
5610 struct induction *v;
5611 rtx insn;
5612 rtx src_reg;
5613 rtx dest_reg;
5614 rtx mult_val, add_val, ext_val;
5615 int benefit;
5616 enum g_types type;
5617 int not_every_iteration, maybe_multiple;
5618 rtx *location;
5620 struct loop_ivs *ivs = LOOP_IVS (loop);
5621 struct induction *b;
5622 struct iv_class *bl;
5623 rtx set = single_set (insn);
5624 rtx temp;
5626 /* Attempt to prove constantness of the values. Don't let simplity_rtx
5627 undo the MULT canonicalization that we performed earlier. */
5628 temp = simplify_rtx (add_val);
5629 if (temp
5630 && ! (GET_CODE (add_val) == MULT
5631 && GET_CODE (temp) == ASHIFT))
5632 add_val = temp;
5634 v->insn = insn;
5635 v->src_reg = src_reg;
5636 v->giv_type = type;
5637 v->dest_reg = dest_reg;
5638 v->mult_val = mult_val;
5639 v->add_val = add_val;
5640 v->ext_dependent = ext_val;
5641 v->benefit = benefit;
5642 v->location = location;
5643 v->cant_derive = 0;
5644 v->combined_with = 0;
5645 v->maybe_multiple = maybe_multiple;
5646 v->maybe_dead = 0;
5647 v->derive_adjustment = 0;
5648 v->same = 0;
5649 v->ignore = 0;
5650 v->new_reg = 0;
5651 v->final_value = 0;
5652 v->same_insn = 0;
5653 v->auto_inc_opt = 0;
5654 v->unrolled = 0;
5655 v->shared = 0;
5657 /* The v->always_computable field is used in update_giv_derive, to
5658 determine whether a giv can be used to derive another giv. For a
5659 DEST_REG giv, INSN computes a new value for the giv, so its value
5660 isn't computable if INSN insn't executed every iteration.
5661 However, for a DEST_ADDR giv, INSN merely uses the value of the giv;
5662 it does not compute a new value. Hence the value is always computable
5663 regardless of whether INSN is executed each iteration. */
5665 if (type == DEST_ADDR)
5666 v->always_computable = 1;
5667 else
5668 v->always_computable = ! not_every_iteration;
5670 v->always_executed = ! not_every_iteration;
5672 if (type == DEST_ADDR)
5674 v->mode = GET_MODE (*location);
5675 v->lifetime = 1;
5677 else /* type == DEST_REG */
5679 v->mode = GET_MODE (SET_DEST (set));
5681 v->lifetime = LOOP_REG_LIFETIME (loop, REGNO (dest_reg));
5683 /* If the lifetime is zero, it means that this register is
5684 really a dead store. So mark this as a giv that can be
5685 ignored. This will not prevent the biv from being eliminated. */
5686 if (v->lifetime == 0)
5687 v->ignore = 1;
5689 REG_IV_TYPE (ivs, REGNO (dest_reg)) = GENERAL_INDUCT;
5690 REG_IV_INFO (ivs, REGNO (dest_reg)) = v;
5693 /* Add the giv to the class of givs computed from one biv. */
5695 bl = REG_IV_CLASS (ivs, REGNO (src_reg));
5696 if (bl)
5698 v->next_iv = bl->giv;
5699 bl->giv = v;
5700 /* Don't count DEST_ADDR. This is supposed to count the number of
5701 insns that calculate givs. */
5702 if (type == DEST_REG)
5703 bl->giv_count++;
5704 bl->total_benefit += benefit;
5706 else
5707 /* Fatal error, biv missing for this giv? */
5708 abort ();
5710 if (type == DEST_ADDR)
5711 v->replaceable = 1;
5712 else
5714 /* The giv can be replaced outright by the reduced register only if all
5715 of the following conditions are true:
5716 - the insn that sets the giv is always executed on any iteration
5717 on which the giv is used at all
5718 (there are two ways to deduce this:
5719 either the insn is executed on every iteration,
5720 or all uses follow that insn in the same basic block),
5721 - the giv is not used outside the loop
5722 - no assignments to the biv occur during the giv's lifetime. */
5724 if (REGNO_FIRST_UID (REGNO (dest_reg)) == INSN_UID (insn)
5725 /* Previous line always fails if INSN was moved by loop opt. */
5726 && REGNO_LAST_LUID (REGNO (dest_reg))
5727 < INSN_LUID (loop->end)
5728 && (! not_every_iteration
5729 || last_use_this_basic_block (dest_reg, insn)))
5731 /* Now check that there are no assignments to the biv within the
5732 giv's lifetime. This requires two separate checks. */
5734 /* Check each biv update, and fail if any are between the first
5735 and last use of the giv.
5737 If this loop contains an inner loop that was unrolled, then
5738 the insn modifying the biv may have been emitted by the loop
5739 unrolling code, and hence does not have a valid luid. Just
5740 mark the biv as not replaceable in this case. It is not very
5741 useful as a biv, because it is used in two different loops.
5742 It is very unlikely that we would be able to optimize the giv
5743 using this biv anyways. */
5745 v->replaceable = 1;
5746 for (b = bl->biv; b; b = b->next_iv)
5748 if (INSN_UID (b->insn) >= max_uid_for_loop
5749 || ((INSN_LUID (b->insn)
5750 >= REGNO_FIRST_LUID (REGNO (dest_reg)))
5751 && (INSN_LUID (b->insn)
5752 <= REGNO_LAST_LUID (REGNO (dest_reg)))))
5754 v->replaceable = 0;
5755 v->not_replaceable = 1;
5756 break;
5760 /* If there are any backwards branches that go from after the
5761 biv update to before it, then this giv is not replaceable. */
5762 if (v->replaceable)
5763 for (b = bl->biv; b; b = b->next_iv)
5764 if (back_branch_in_range_p (loop, b->insn))
5766 v->replaceable = 0;
5767 v->not_replaceable = 1;
5768 break;
5771 else
5773 /* May still be replaceable, we don't have enough info here to
5774 decide. */
5775 v->replaceable = 0;
5776 v->not_replaceable = 0;
5780 /* Record whether the add_val contains a const_int, for later use by
5781 combine_givs. */
5783 rtx tem = add_val;
5785 v->no_const_addval = 1;
5786 if (tem == const0_rtx)
5788 else if (CONSTANT_P (add_val))
5789 v->no_const_addval = 0;
5790 if (GET_CODE (tem) == PLUS)
5792 while (1)
5794 if (GET_CODE (XEXP (tem, 0)) == PLUS)
5795 tem = XEXP (tem, 0);
5796 else if (GET_CODE (XEXP (tem, 1)) == PLUS)
5797 tem = XEXP (tem, 1);
5798 else
5799 break;
5801 if (CONSTANT_P (XEXP (tem, 1)))
5802 v->no_const_addval = 0;
5806 if (loop_dump_stream)
5807 loop_giv_dump (v, loop_dump_stream, 0);
5810 /* All this does is determine whether a giv can be made replaceable because
5811 its final value can be calculated. This code can not be part of record_giv
5812 above, because final_giv_value requires that the number of loop iterations
5813 be known, and that can not be accurately calculated until after all givs
5814 have been identified. */
5816 static void
5817 check_final_value (loop, v)
5818 const struct loop *loop;
5819 struct induction *v;
5821 struct loop_ivs *ivs = LOOP_IVS (loop);
5822 struct iv_class *bl;
5823 rtx final_value = 0;
5825 bl = REG_IV_CLASS (ivs, REGNO (v->src_reg));
5827 /* DEST_ADDR givs will never reach here, because they are always marked
5828 replaceable above in record_giv. */
5830 /* The giv can be replaced outright by the reduced register only if all
5831 of the following conditions are true:
5832 - the insn that sets the giv is always executed on any iteration
5833 on which the giv is used at all
5834 (there are two ways to deduce this:
5835 either the insn is executed on every iteration,
5836 or all uses follow that insn in the same basic block),
5837 - its final value can be calculated (this condition is different
5838 than the one above in record_giv)
5839 - it's not used before the it's set
5840 - no assignments to the biv occur during the giv's lifetime. */
5842 #if 0
5843 /* This is only called now when replaceable is known to be false. */
5844 /* Clear replaceable, so that it won't confuse final_giv_value. */
5845 v->replaceable = 0;
5846 #endif
5848 if ((final_value = final_giv_value (loop, v))
5849 && (v->always_computable || last_use_this_basic_block (v->dest_reg, v->insn)))
5851 int biv_increment_seen = 0, before_giv_insn = 0;
5852 rtx p = v->insn;
5853 rtx last_giv_use;
5855 v->replaceable = 1;
5857 /* When trying to determine whether or not a biv increment occurs
5858 during the lifetime of the giv, we can ignore uses of the variable
5859 outside the loop because final_value is true. Hence we can not
5860 use regno_last_uid and regno_first_uid as above in record_giv. */
5862 /* Search the loop to determine whether any assignments to the
5863 biv occur during the giv's lifetime. Start with the insn
5864 that sets the giv, and search around the loop until we come
5865 back to that insn again.
5867 Also fail if there is a jump within the giv's lifetime that jumps
5868 to somewhere outside the lifetime but still within the loop. This
5869 catches spaghetti code where the execution order is not linear, and
5870 hence the above test fails. Here we assume that the giv lifetime
5871 does not extend from one iteration of the loop to the next, so as
5872 to make the test easier. Since the lifetime isn't known yet,
5873 this requires two loops. See also record_giv above. */
5875 last_giv_use = v->insn;
5877 while (1)
5879 p = NEXT_INSN (p);
5880 if (p == loop->end)
5882 before_giv_insn = 1;
5883 p = NEXT_INSN (loop->start);
5885 if (p == v->insn)
5886 break;
5888 if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
5889 || GET_CODE (p) == CALL_INSN)
5891 /* It is possible for the BIV increment to use the GIV if we
5892 have a cycle. Thus we must be sure to check each insn for
5893 both BIV and GIV uses, and we must check for BIV uses
5894 first. */
5896 if (! biv_increment_seen
5897 && reg_set_p (v->src_reg, PATTERN (p)))
5898 biv_increment_seen = 1;
5900 if (reg_mentioned_p (v->dest_reg, PATTERN (p)))
5902 if (biv_increment_seen || before_giv_insn)
5904 v->replaceable = 0;
5905 v->not_replaceable = 1;
5906 break;
5908 last_giv_use = p;
5913 /* Now that the lifetime of the giv is known, check for branches
5914 from within the lifetime to outside the lifetime if it is still
5915 replaceable. */
5917 if (v->replaceable)
5919 p = v->insn;
5920 while (1)
5922 p = NEXT_INSN (p);
5923 if (p == loop->end)
5924 p = NEXT_INSN (loop->start);
5925 if (p == last_giv_use)
5926 break;
5928 if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p)
5929 && LABEL_NAME (JUMP_LABEL (p))
5930 && ((loop_insn_first_p (JUMP_LABEL (p), v->insn)
5931 && loop_insn_first_p (loop->start, JUMP_LABEL (p)))
5932 || (loop_insn_first_p (last_giv_use, JUMP_LABEL (p))
5933 && loop_insn_first_p (JUMP_LABEL (p), loop->end))))
5935 v->replaceable = 0;
5936 v->not_replaceable = 1;
5938 if (loop_dump_stream)
5939 fprintf (loop_dump_stream,
5940 "Found branch outside giv lifetime.\n");
5942 break;
5947 /* If it is replaceable, then save the final value. */
5948 if (v->replaceable)
5949 v->final_value = final_value;
5952 if (loop_dump_stream && v->replaceable)
5953 fprintf (loop_dump_stream, "Insn %d: giv reg %d final_value replaceable\n",
5954 INSN_UID (v->insn), REGNO (v->dest_reg));
5957 /* Update the status of whether a giv can derive other givs.
5959 We need to do something special if there is or may be an update to the biv
5960 between the time the giv is defined and the time it is used to derive
5961 another giv.
5963 In addition, a giv that is only conditionally set is not allowed to
5964 derive another giv once a label has been passed.
5966 The cases we look at are when a label or an update to a biv is passed. */
5968 static void
5969 update_giv_derive (loop, p)
5970 const struct loop *loop;
5971 rtx p;
5973 struct loop_ivs *ivs = LOOP_IVS (loop);
5974 struct iv_class *bl;
5975 struct induction *biv, *giv;
5976 rtx tem;
5977 int dummy;
5979 /* Search all IV classes, then all bivs, and finally all givs.
5981 There are three cases we are concerned with. First we have the situation
5982 of a giv that is only updated conditionally. In that case, it may not
5983 derive any givs after a label is passed.
5985 The second case is when a biv update occurs, or may occur, after the
5986 definition of a giv. For certain biv updates (see below) that are
5987 known to occur between the giv definition and use, we can adjust the
5988 giv definition. For others, or when the biv update is conditional,
5989 we must prevent the giv from deriving any other givs. There are two
5990 sub-cases within this case.
5992 If this is a label, we are concerned with any biv update that is done
5993 conditionally, since it may be done after the giv is defined followed by
5994 a branch here (actually, we need to pass both a jump and a label, but
5995 this extra tracking doesn't seem worth it).
5997 If this is a jump, we are concerned about any biv update that may be
5998 executed multiple times. We are actually only concerned about
5999 backward jumps, but it is probably not worth performing the test
6000 on the jump again here.
6002 If this is a biv update, we must adjust the giv status to show that a
6003 subsequent biv update was performed. If this adjustment cannot be done,
6004 the giv cannot derive further givs. */
6006 for (bl = ivs->list; bl; bl = bl->next)
6007 for (biv = bl->biv; biv; biv = biv->next_iv)
6008 if (GET_CODE (p) == CODE_LABEL || GET_CODE (p) == JUMP_INSN
6009 || biv->insn == p)
6011 for (giv = bl->giv; giv; giv = giv->next_iv)
6013 /* If cant_derive is already true, there is no point in
6014 checking all of these conditions again. */
6015 if (giv->cant_derive)
6016 continue;
6018 /* If this giv is conditionally set and we have passed a label,
6019 it cannot derive anything. */
6020 if (GET_CODE (p) == CODE_LABEL && ! giv->always_computable)
6021 giv->cant_derive = 1;
6023 /* Skip givs that have mult_val == 0, since
6024 they are really invariants. Also skip those that are
6025 replaceable, since we know their lifetime doesn't contain
6026 any biv update. */
6027 else if (giv->mult_val == const0_rtx || giv->replaceable)
6028 continue;
6030 /* The only way we can allow this giv to derive another
6031 is if this is a biv increment and we can form the product
6032 of biv->add_val and giv->mult_val. In this case, we will
6033 be able to compute a compensation. */
6034 else if (biv->insn == p)
6036 rtx ext_val_dummy;
6038 tem = 0;
6039 if (biv->mult_val == const1_rtx)
6040 tem = simplify_giv_expr (loop,
6041 gen_rtx_MULT (giv->mode,
6042 biv->add_val,
6043 giv->mult_val),
6044 &ext_val_dummy, &dummy);
6046 if (tem && giv->derive_adjustment)
6047 tem = simplify_giv_expr
6048 (loop,
6049 gen_rtx_PLUS (giv->mode, tem, giv->derive_adjustment),
6050 &ext_val_dummy, &dummy);
6052 if (tem)
6053 giv->derive_adjustment = tem;
6054 else
6055 giv->cant_derive = 1;
6057 else if ((GET_CODE (p) == CODE_LABEL && ! biv->always_computable)
6058 || (GET_CODE (p) == JUMP_INSN && biv->maybe_multiple))
6059 giv->cant_derive = 1;
6064 /* Check whether an insn is an increment legitimate for a basic induction var.
6065 X is the source of insn P, or a part of it.
6066 MODE is the mode in which X should be interpreted.
6068 DEST_REG is the putative biv, also the destination of the insn.
6069 We accept patterns of these forms:
6070 REG = REG + INVARIANT (includes REG = REG - CONSTANT)
6071 REG = INVARIANT + REG
6073 If X is suitable, we return 1, set *MULT_VAL to CONST1_RTX,
6074 store the additive term into *INC_VAL, and store the place where
6075 we found the additive term into *LOCATION.
6077 If X is an assignment of an invariant into DEST_REG, we set
6078 *MULT_VAL to CONST0_RTX, and store the invariant into *INC_VAL.
6080 We also want to detect a BIV when it corresponds to a variable
6081 whose mode was promoted via PROMOTED_MODE. In that case, an increment
6082 of the variable may be a PLUS that adds a SUBREG of that variable to
6083 an invariant and then sign- or zero-extends the result of the PLUS
6084 into the variable.
6086 Most GIVs in such cases will be in the promoted mode, since that is the
6087 probably the natural computation mode (and almost certainly the mode
6088 used for addresses) on the machine. So we view the pseudo-reg containing
6089 the variable as the BIV, as if it were simply incremented.
6091 Note that treating the entire pseudo as a BIV will result in making
6092 simple increments to any GIVs based on it. However, if the variable
6093 overflows in its declared mode but not its promoted mode, the result will
6094 be incorrect. This is acceptable if the variable is signed, since
6095 overflows in such cases are undefined, but not if it is unsigned, since
6096 those overflows are defined. So we only check for SIGN_EXTEND and
6097 not ZERO_EXTEND.
6099 If we cannot find a biv, we return 0. */
6101 static int
6102 basic_induction_var (loop, x, mode, dest_reg, p, inc_val, mult_val, location)
6103 const struct loop *loop;
6104 rtx x;
6105 enum machine_mode mode;
6106 rtx dest_reg;
6107 rtx p;
6108 rtx *inc_val;
6109 rtx *mult_val;
6110 rtx **location;
6112 enum rtx_code code;
6113 rtx *argp, arg;
6114 rtx insn, set = 0;
6116 code = GET_CODE (x);
6117 *location = NULL;
6118 switch (code)
6120 case PLUS:
6121 if (rtx_equal_p (XEXP (x, 0), dest_reg)
6122 || (GET_CODE (XEXP (x, 0)) == SUBREG
6123 && SUBREG_PROMOTED_VAR_P (XEXP (x, 0))
6124 && SUBREG_REG (XEXP (x, 0)) == dest_reg))
6126 argp = &XEXP (x, 1);
6128 else if (rtx_equal_p (XEXP (x, 1), dest_reg)
6129 || (GET_CODE (XEXP (x, 1)) == SUBREG
6130 && SUBREG_PROMOTED_VAR_P (XEXP (x, 1))
6131 && SUBREG_REG (XEXP (x, 1)) == dest_reg))
6133 argp = &XEXP (x, 0);
6135 else
6136 return 0;
6138 arg = *argp;
6139 if (loop_invariant_p (loop, arg) != 1)
6140 return 0;
6142 *inc_val = convert_modes (GET_MODE (dest_reg), GET_MODE (x), arg, 0);
6143 *mult_val = const1_rtx;
6144 *location = argp;
6145 return 1;
6147 case SUBREG:
6148 /* If what's inside the SUBREG is a BIV, then the SUBREG. This will
6149 handle addition of promoted variables.
6150 ??? The comment at the start of this function is wrong: promoted
6151 variable increments don't look like it says they do. */
6152 return basic_induction_var (loop, SUBREG_REG (x),
6153 GET_MODE (SUBREG_REG (x)),
6154 dest_reg, p, inc_val, mult_val, location);
6156 case REG:
6157 /* If this register is assigned in a previous insn, look at its
6158 source, but don't go outside the loop or past a label. */
6160 /* If this sets a register to itself, we would repeat any previous
6161 biv increment if we applied this strategy blindly. */
6162 if (rtx_equal_p (dest_reg, x))
6163 return 0;
6165 insn = p;
6166 while (1)
6168 rtx dest;
6171 insn = PREV_INSN (insn);
6173 while (insn && GET_CODE (insn) == NOTE
6174 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG);
6176 if (!insn)
6177 break;
6178 set = single_set (insn);
6179 if (set == 0)
6180 break;
6181 dest = SET_DEST (set);
6182 if (dest == x
6183 || (GET_CODE (dest) == SUBREG
6184 && (GET_MODE_SIZE (GET_MODE (dest)) <= UNITS_PER_WORD)
6185 && (GET_MODE_CLASS (GET_MODE (dest)) == MODE_INT)
6186 && SUBREG_REG (dest) == x))
6187 return basic_induction_var (loop, SET_SRC (set),
6188 (GET_MODE (SET_SRC (set)) == VOIDmode
6189 ? GET_MODE (x)
6190 : GET_MODE (SET_SRC (set))),
6191 dest_reg, insn,
6192 inc_val, mult_val, location);
6194 while (GET_CODE (dest) == SIGN_EXTRACT
6195 || GET_CODE (dest) == ZERO_EXTRACT
6196 || GET_CODE (dest) == SUBREG
6197 || GET_CODE (dest) == STRICT_LOW_PART)
6198 dest = XEXP (dest, 0);
6199 if (dest == x)
6200 break;
6202 /* Fall through. */
6204 /* Can accept constant setting of biv only when inside inner most loop.
6205 Otherwise, a biv of an inner loop may be incorrectly recognized
6206 as a biv of the outer loop,
6207 causing code to be moved INTO the inner loop. */
6208 case MEM:
6209 if (loop_invariant_p (loop, x) != 1)
6210 return 0;
6211 case CONST_INT:
6212 case SYMBOL_REF:
6213 case CONST:
6214 /* convert_modes aborts if we try to convert to or from CCmode, so just
6215 exclude that case. It is very unlikely that a condition code value
6216 would be a useful iterator anyways. */
6217 if (loop->level == 1
6218 && GET_MODE_CLASS (mode) != MODE_CC
6219 && GET_MODE_CLASS (GET_MODE (dest_reg)) != MODE_CC)
6221 /* Possible bug here? Perhaps we don't know the mode of X. */
6222 *inc_val = convert_modes (GET_MODE (dest_reg), mode, x, 0);
6223 *mult_val = const0_rtx;
6224 return 1;
6226 else
6227 return 0;
6229 case SIGN_EXTEND:
6230 return basic_induction_var (loop, XEXP (x, 0), GET_MODE (XEXP (x, 0)),
6231 dest_reg, p, inc_val, mult_val, location);
6233 case ASHIFTRT:
6234 /* Similar, since this can be a sign extension. */
6235 for (insn = PREV_INSN (p);
6236 (insn && GET_CODE (insn) == NOTE
6237 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG);
6238 insn = PREV_INSN (insn))
6241 if (insn)
6242 set = single_set (insn);
6244 if (! rtx_equal_p (dest_reg, XEXP (x, 0))
6245 && set && SET_DEST (set) == XEXP (x, 0)
6246 && GET_CODE (XEXP (x, 1)) == CONST_INT
6247 && INTVAL (XEXP (x, 1)) >= 0
6248 && GET_CODE (SET_SRC (set)) == ASHIFT
6249 && XEXP (x, 1) == XEXP (SET_SRC (set), 1))
6250 return basic_induction_var (loop, XEXP (SET_SRC (set), 0),
6251 GET_MODE (XEXP (x, 0)),
6252 dest_reg, insn, inc_val, mult_val,
6253 location);
6254 return 0;
6256 default:
6257 return 0;
6261 /* A general induction variable (giv) is any quantity that is a linear
6262 function of a basic induction variable,
6263 i.e. giv = biv * mult_val + add_val.
6264 The coefficients can be any loop invariant quantity.
6265 A giv need not be computed directly from the biv;
6266 it can be computed by way of other givs. */
6268 /* Determine whether X computes a giv.
6269 If it does, return a nonzero value
6270 which is the benefit from eliminating the computation of X;
6271 set *SRC_REG to the register of the biv that it is computed from;
6272 set *ADD_VAL and *MULT_VAL to the coefficients,
6273 such that the value of X is biv * mult + add; */
6275 static int
6276 general_induction_var (loop, x, src_reg, add_val, mult_val, ext_val,
6277 is_addr, pbenefit, addr_mode)
6278 const struct loop *loop;
6279 rtx x;
6280 rtx *src_reg;
6281 rtx *add_val;
6282 rtx *mult_val;
6283 rtx *ext_val;
6284 int is_addr;
6285 int *pbenefit;
6286 enum machine_mode addr_mode;
6288 struct loop_ivs *ivs = LOOP_IVS (loop);
6289 rtx orig_x = x;
6291 /* If this is an invariant, forget it, it isn't a giv. */
6292 if (loop_invariant_p (loop, x) == 1)
6293 return 0;
6295 *pbenefit = 0;
6296 *ext_val = NULL_RTX;
6297 x = simplify_giv_expr (loop, x, ext_val, pbenefit);
6298 if (x == 0)
6299 return 0;
6301 switch (GET_CODE (x))
6303 case USE:
6304 case CONST_INT:
6305 /* Since this is now an invariant and wasn't before, it must be a giv
6306 with MULT_VAL == 0. It doesn't matter which BIV we associate this
6307 with. */
6308 *src_reg = ivs->list->biv->dest_reg;
6309 *mult_val = const0_rtx;
6310 *add_val = x;
6311 break;
6313 case REG:
6314 /* This is equivalent to a BIV. */
6315 *src_reg = x;
6316 *mult_val = const1_rtx;
6317 *add_val = const0_rtx;
6318 break;
6320 case PLUS:
6321 /* Either (plus (biv) (invar)) or
6322 (plus (mult (biv) (invar_1)) (invar_2)). */
6323 if (GET_CODE (XEXP (x, 0)) == MULT)
6325 *src_reg = XEXP (XEXP (x, 0), 0);
6326 *mult_val = XEXP (XEXP (x, 0), 1);
6328 else
6330 *src_reg = XEXP (x, 0);
6331 *mult_val = const1_rtx;
6333 *add_val = XEXP (x, 1);
6334 break;
6336 case MULT:
6337 /* ADD_VAL is zero. */
6338 *src_reg = XEXP (x, 0);
6339 *mult_val = XEXP (x, 1);
6340 *add_val = const0_rtx;
6341 break;
6343 default:
6344 abort ();
6347 /* Remove any enclosing USE from ADD_VAL and MULT_VAL (there will be
6348 unless they are CONST_INT). */
6349 if (GET_CODE (*add_val) == USE)
6350 *add_val = XEXP (*add_val, 0);
6351 if (GET_CODE (*mult_val) == USE)
6352 *mult_val = XEXP (*mult_val, 0);
6354 if (is_addr)
6355 *pbenefit += address_cost (orig_x, addr_mode) - reg_address_cost;
6356 else
6357 *pbenefit += rtx_cost (orig_x, SET);
6359 /* Always return true if this is a giv so it will be detected as such,
6360 even if the benefit is zero or negative. This allows elimination
6361 of bivs that might otherwise not be eliminated. */
6362 return 1;
6365 /* Given an expression, X, try to form it as a linear function of a biv.
6366 We will canonicalize it to be of the form
6367 (plus (mult (BIV) (invar_1))
6368 (invar_2))
6369 with possible degeneracies.
6371 The invariant expressions must each be of a form that can be used as a
6372 machine operand. We surround then with a USE rtx (a hack, but localized
6373 and certainly unambiguous!) if not a CONST_INT for simplicity in this
6374 routine; it is the caller's responsibility to strip them.
6376 If no such canonicalization is possible (i.e., two biv's are used or an
6377 expression that is neither invariant nor a biv or giv), this routine
6378 returns 0.
6380 For a non-zero return, the result will have a code of CONST_INT, USE,
6381 REG (for a BIV), PLUS, or MULT. No other codes will occur.
6383 *BENEFIT will be incremented by the benefit of any sub-giv encountered. */
6385 static rtx sge_plus PARAMS ((enum machine_mode, rtx, rtx));
6386 static rtx sge_plus_constant PARAMS ((rtx, rtx));
6388 static rtx
6389 simplify_giv_expr (loop, x, ext_val, benefit)
6390 const struct loop *loop;
6391 rtx x;
6392 rtx *ext_val;
6393 int *benefit;
6395 struct loop_ivs *ivs = LOOP_IVS (loop);
6396 struct loop_regs *regs = LOOP_REGS (loop);
6397 enum machine_mode mode = GET_MODE (x);
6398 rtx arg0, arg1;
6399 rtx tem;
6401 /* If this is not an integer mode, or if we cannot do arithmetic in this
6402 mode, this can't be a giv. */
6403 if (mode != VOIDmode
6404 && (GET_MODE_CLASS (mode) != MODE_INT
6405 || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT))
6406 return NULL_RTX;
6408 switch (GET_CODE (x))
6410 case PLUS:
6411 arg0 = simplify_giv_expr (loop, XEXP (x, 0), ext_val, benefit);
6412 arg1 = simplify_giv_expr (loop, XEXP (x, 1), ext_val, benefit);
6413 if (arg0 == 0 || arg1 == 0)
6414 return NULL_RTX;
6416 /* Put constant last, CONST_INT last if both constant. */
6417 if ((GET_CODE (arg0) == USE
6418 || GET_CODE (arg0) == CONST_INT)
6419 && ! ((GET_CODE (arg0) == USE
6420 && GET_CODE (arg1) == USE)
6421 || GET_CODE (arg1) == CONST_INT))
6422 tem = arg0, arg0 = arg1, arg1 = tem;
6424 /* Handle addition of zero, then addition of an invariant. */
6425 if (arg1 == const0_rtx)
6426 return arg0;
6427 else if (GET_CODE (arg1) == CONST_INT || GET_CODE (arg1) == USE)
6428 switch (GET_CODE (arg0))
6430 case CONST_INT:
6431 case USE:
6432 /* Adding two invariants must result in an invariant, so enclose
6433 addition operation inside a USE and return it. */
6434 if (GET_CODE (arg0) == USE)
6435 arg0 = XEXP (arg0, 0);
6436 if (GET_CODE (arg1) == USE)
6437 arg1 = XEXP (arg1, 0);
6439 if (GET_CODE (arg0) == CONST_INT)
6440 tem = arg0, arg0 = arg1, arg1 = tem;
6441 if (GET_CODE (arg1) == CONST_INT)
6442 tem = sge_plus_constant (arg0, arg1);
6443 else
6444 tem = sge_plus (mode, arg0, arg1);
6446 if (GET_CODE (tem) != CONST_INT)
6447 tem = gen_rtx_USE (mode, tem);
6448 return tem;
6450 case REG:
6451 case MULT:
6452 /* biv + invar or mult + invar. Return sum. */
6453 return gen_rtx_PLUS (mode, arg0, arg1);
6455 case PLUS:
6456 /* (a + invar_1) + invar_2. Associate. */
6457 return
6458 simplify_giv_expr (loop,
6459 gen_rtx_PLUS (mode,
6460 XEXP (arg0, 0),
6461 gen_rtx_PLUS (mode,
6462 XEXP (arg0, 1),
6463 arg1)),
6464 ext_val, benefit);
6466 default:
6467 abort ();
6470 /* Each argument must be either REG, PLUS, or MULT. Convert REG to
6471 MULT to reduce cases. */
6472 if (GET_CODE (arg0) == REG)
6473 arg0 = gen_rtx_MULT (mode, arg0, const1_rtx);
6474 if (GET_CODE (arg1) == REG)
6475 arg1 = gen_rtx_MULT (mode, arg1, const1_rtx);
6477 /* Now have PLUS + PLUS, PLUS + MULT, MULT + PLUS, or MULT + MULT.
6478 Put a MULT first, leaving PLUS + PLUS, MULT + PLUS, or MULT + MULT.
6479 Recurse to associate the second PLUS. */
6480 if (GET_CODE (arg1) == MULT)
6481 tem = arg0, arg0 = arg1, arg1 = tem;
6483 if (GET_CODE (arg1) == PLUS)
6484 return
6485 simplify_giv_expr (loop,
6486 gen_rtx_PLUS (mode,
6487 gen_rtx_PLUS (mode, arg0,
6488 XEXP (arg1, 0)),
6489 XEXP (arg1, 1)),
6490 ext_val, benefit);
6492 /* Now must have MULT + MULT. Distribute if same biv, else not giv. */
6493 if (GET_CODE (arg0) != MULT || GET_CODE (arg1) != MULT)
6494 return NULL_RTX;
6496 if (!rtx_equal_p (arg0, arg1))
6497 return NULL_RTX;
6499 return simplify_giv_expr (loop,
6500 gen_rtx_MULT (mode,
6501 XEXP (arg0, 0),
6502 gen_rtx_PLUS (mode,
6503 XEXP (arg0, 1),
6504 XEXP (arg1, 1))),
6505 ext_val, benefit);
6507 case MINUS:
6508 /* Handle "a - b" as "a + b * (-1)". */
6509 return simplify_giv_expr (loop,
6510 gen_rtx_PLUS (mode,
6511 XEXP (x, 0),
6512 gen_rtx_MULT (mode,
6513 XEXP (x, 1),
6514 constm1_rtx)),
6515 ext_val, benefit);
6517 case MULT:
6518 arg0 = simplify_giv_expr (loop, XEXP (x, 0), ext_val, benefit);
6519 arg1 = simplify_giv_expr (loop, XEXP (x, 1), ext_val, benefit);
6520 if (arg0 == 0 || arg1 == 0)
6521 return NULL_RTX;
6523 /* Put constant last, CONST_INT last if both constant. */
6524 if ((GET_CODE (arg0) == USE || GET_CODE (arg0) == CONST_INT)
6525 && GET_CODE (arg1) != CONST_INT)
6526 tem = arg0, arg0 = arg1, arg1 = tem;
6528 /* If second argument is not now constant, not giv. */
6529 if (GET_CODE (arg1) != USE && GET_CODE (arg1) != CONST_INT)
6530 return NULL_RTX;
6532 /* Handle multiply by 0 or 1. */
6533 if (arg1 == const0_rtx)
6534 return const0_rtx;
6536 else if (arg1 == const1_rtx)
6537 return arg0;
6539 switch (GET_CODE (arg0))
6541 case REG:
6542 /* biv * invar. Done. */
6543 return gen_rtx_MULT (mode, arg0, arg1);
6545 case CONST_INT:
6546 /* Product of two constants. */
6547 return GEN_INT (INTVAL (arg0) * INTVAL (arg1));
6549 case USE:
6550 /* invar * invar is a giv, but attempt to simplify it somehow. */
6551 if (GET_CODE (arg1) != CONST_INT)
6552 return NULL_RTX;
6554 arg0 = XEXP (arg0, 0);
6555 if (GET_CODE (arg0) == MULT)
6557 /* (invar_0 * invar_1) * invar_2. Associate. */
6558 return simplify_giv_expr (loop,
6559 gen_rtx_MULT (mode,
6560 XEXP (arg0, 0),
6561 gen_rtx_MULT (mode,
6562 XEXP (arg0,
6564 arg1)),
6565 ext_val, benefit);
6567 /* Porpagate the MULT expressions to the intermost nodes. */
6568 else if (GET_CODE (arg0) == PLUS)
6570 /* (invar_0 + invar_1) * invar_2. Distribute. */
6571 return simplify_giv_expr (loop,
6572 gen_rtx_PLUS (mode,
6573 gen_rtx_MULT (mode,
6574 XEXP (arg0,
6576 arg1),
6577 gen_rtx_MULT (mode,
6578 XEXP (arg0,
6580 arg1)),
6581 ext_val, benefit);
6583 return gen_rtx_USE (mode, gen_rtx_MULT (mode, arg0, arg1));
6585 case MULT:
6586 /* (a * invar_1) * invar_2. Associate. */
6587 return simplify_giv_expr (loop,
6588 gen_rtx_MULT (mode,
6589 XEXP (arg0, 0),
6590 gen_rtx_MULT (mode,
6591 XEXP (arg0, 1),
6592 arg1)),
6593 ext_val, benefit);
6595 case PLUS:
6596 /* (a + invar_1) * invar_2. Distribute. */
6597 return simplify_giv_expr (loop,
6598 gen_rtx_PLUS (mode,
6599 gen_rtx_MULT (mode,
6600 XEXP (arg0, 0),
6601 arg1),
6602 gen_rtx_MULT (mode,
6603 XEXP (arg0, 1),
6604 arg1)),
6605 ext_val, benefit);
6607 default:
6608 abort ();
6611 case ASHIFT:
6612 /* Shift by constant is multiply by power of two. */
6613 if (GET_CODE (XEXP (x, 1)) != CONST_INT)
6614 return 0;
6616 return
6617 simplify_giv_expr (loop,
6618 gen_rtx_MULT (mode,
6619 XEXP (x, 0),
6620 GEN_INT ((HOST_WIDE_INT) 1
6621 << INTVAL (XEXP (x, 1)))),
6622 ext_val, benefit);
6624 case NEG:
6625 /* "-a" is "a * (-1)" */
6626 return simplify_giv_expr (loop,
6627 gen_rtx_MULT (mode, XEXP (x, 0), constm1_rtx),
6628 ext_val, benefit);
6630 case NOT:
6631 /* "~a" is "-a - 1". Silly, but easy. */
6632 return simplify_giv_expr (loop,
6633 gen_rtx_MINUS (mode,
6634 gen_rtx_NEG (mode, XEXP (x, 0)),
6635 const1_rtx),
6636 ext_val, benefit);
6638 case USE:
6639 /* Already in proper form for invariant. */
6640 return x;
6642 case SIGN_EXTEND:
6643 case ZERO_EXTEND:
6644 case TRUNCATE:
6645 /* Conditionally recognize extensions of simple IVs. After we've
6646 computed loop traversal counts and verified the range of the
6647 source IV, we'll reevaluate this as a GIV. */
6648 if (*ext_val == NULL_RTX)
6650 arg0 = simplify_giv_expr (loop, XEXP (x, 0), ext_val, benefit);
6651 if (arg0 && *ext_val == NULL_RTX && GET_CODE (arg0) == REG)
6653 *ext_val = gen_rtx_fmt_e (GET_CODE (x), mode, arg0);
6654 return arg0;
6657 goto do_default;
6659 case REG:
6660 /* If this is a new register, we can't deal with it. */
6661 if (REGNO (x) >= max_reg_before_loop)
6662 return 0;
6664 /* Check for biv or giv. */
6665 switch (REG_IV_TYPE (ivs, REGNO (x)))
6667 case BASIC_INDUCT:
6668 return x;
6669 case GENERAL_INDUCT:
6671 struct induction *v = REG_IV_INFO (ivs, REGNO (x));
6673 /* Form expression from giv and add benefit. Ensure this giv
6674 can derive another and subtract any needed adjustment if so. */
6676 /* Increasing the benefit here is risky. The only case in which it
6677 is arguably correct is if this is the only use of V. In other
6678 cases, this will artificially inflate the benefit of the current
6679 giv, and lead to suboptimal code. Thus, it is disabled, since
6680 potentially not reducing an only marginally beneficial giv is
6681 less harmful than reducing many givs that are not really
6682 beneficial. */
6684 rtx single_use = regs->array[REGNO (x)].single_usage;
6685 if (single_use && single_use != const0_rtx)
6686 *benefit += v->benefit;
6689 if (v->cant_derive)
6690 return 0;
6692 tem = gen_rtx_PLUS (mode, gen_rtx_MULT (mode,
6693 v->src_reg, v->mult_val),
6694 v->add_val);
6696 if (v->derive_adjustment)
6697 tem = gen_rtx_MINUS (mode, tem, v->derive_adjustment);
6698 arg0 = simplify_giv_expr (loop, tem, ext_val, benefit);
6699 if (*ext_val)
6701 if (!v->ext_dependent)
6702 return arg0;
6704 else
6706 *ext_val = v->ext_dependent;
6707 return arg0;
6709 return 0;
6712 default:
6713 do_default:
6714 /* If it isn't an induction variable, and it is invariant, we
6715 may be able to simplify things further by looking through
6716 the bits we just moved outside the loop. */
6717 if (loop_invariant_p (loop, x) == 1)
6719 struct movable *m;
6720 struct loop_movables *movables = LOOP_MOVABLES (loop);
6722 for (m = movables->head; m; m = m->next)
6723 if (rtx_equal_p (x, m->set_dest))
6725 /* Ok, we found a match. Substitute and simplify. */
6727 /* If we match another movable, we must use that, as
6728 this one is going away. */
6729 if (m->match)
6730 return simplify_giv_expr (loop, m->match->set_dest,
6731 ext_val, benefit);
6733 /* If consec is non-zero, this is a member of a group of
6734 instructions that were moved together. We handle this
6735 case only to the point of seeking to the last insn and
6736 looking for a REG_EQUAL. Fail if we don't find one. */
6737 if (m->consec != 0)
6739 int i = m->consec;
6740 tem = m->insn;
6743 tem = NEXT_INSN (tem);
6745 while (--i > 0);
6747 tem = find_reg_note (tem, REG_EQUAL, NULL_RTX);
6748 if (tem)
6749 tem = XEXP (tem, 0);
6751 else
6753 tem = single_set (m->insn);
6754 if (tem)
6755 tem = SET_SRC (tem);
6758 if (tem)
6760 /* What we are most interested in is pointer
6761 arithmetic on invariants -- only take
6762 patterns we may be able to do something with. */
6763 if (GET_CODE (tem) == PLUS
6764 || GET_CODE (tem) == MULT
6765 || GET_CODE (tem) == ASHIFT
6766 || GET_CODE (tem) == CONST_INT
6767 || GET_CODE (tem) == SYMBOL_REF)
6769 tem = simplify_giv_expr (loop, tem, ext_val,
6770 benefit);
6771 if (tem)
6772 return tem;
6774 else if (GET_CODE (tem) == CONST
6775 && GET_CODE (XEXP (tem, 0)) == PLUS
6776 && GET_CODE (XEXP (XEXP (tem, 0), 0)) == SYMBOL_REF
6777 && GET_CODE (XEXP (XEXP (tem, 0), 1)) == CONST_INT)
6779 tem = simplify_giv_expr (loop, XEXP (tem, 0),
6780 ext_val, benefit);
6781 if (tem)
6782 return tem;
6785 break;
6788 break;
6791 /* Fall through to general case. */
6792 default:
6793 /* If invariant, return as USE (unless CONST_INT).
6794 Otherwise, not giv. */
6795 if (GET_CODE (x) == USE)
6796 x = XEXP (x, 0);
6798 if (loop_invariant_p (loop, x) == 1)
6800 if (GET_CODE (x) == CONST_INT)
6801 return x;
6802 if (GET_CODE (x) == CONST
6803 && GET_CODE (XEXP (x, 0)) == PLUS
6804 && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
6805 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)
6806 x = XEXP (x, 0);
6807 return gen_rtx_USE (mode, x);
6809 else
6810 return 0;
6814 /* This routine folds invariants such that there is only ever one
6815 CONST_INT in the summation. It is only used by simplify_giv_expr. */
6817 static rtx
6818 sge_plus_constant (x, c)
6819 rtx x, c;
6821 if (GET_CODE (x) == CONST_INT)
6822 return GEN_INT (INTVAL (x) + INTVAL (c));
6823 else if (GET_CODE (x) != PLUS)
6824 return gen_rtx_PLUS (GET_MODE (x), x, c);
6825 else if (GET_CODE (XEXP (x, 1)) == CONST_INT)
6827 return gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
6828 GEN_INT (INTVAL (XEXP (x, 1)) + INTVAL (c)));
6830 else if (GET_CODE (XEXP (x, 0)) == PLUS
6831 || GET_CODE (XEXP (x, 1)) != PLUS)
6833 return gen_rtx_PLUS (GET_MODE (x),
6834 sge_plus_constant (XEXP (x, 0), c), XEXP (x, 1));
6836 else
6838 return gen_rtx_PLUS (GET_MODE (x),
6839 sge_plus_constant (XEXP (x, 1), c), XEXP (x, 0));
6843 static rtx
6844 sge_plus (mode, x, y)
6845 enum machine_mode mode;
6846 rtx x, y;
6848 while (GET_CODE (y) == PLUS)
6850 rtx a = XEXP (y, 0);
6851 if (GET_CODE (a) == CONST_INT)
6852 x = sge_plus_constant (x, a);
6853 else
6854 x = gen_rtx_PLUS (mode, x, a);
6855 y = XEXP (y, 1);
6857 if (GET_CODE (y) == CONST_INT)
6858 x = sge_plus_constant (x, y);
6859 else
6860 x = gen_rtx_PLUS (mode, x, y);
6861 return x;
6864 /* Help detect a giv that is calculated by several consecutive insns;
6865 for example,
6866 giv = biv * M
6867 giv = giv + A
6868 The caller has already identified the first insn P as having a giv as dest;
6869 we check that all other insns that set the same register follow
6870 immediately after P, that they alter nothing else,
6871 and that the result of the last is still a giv.
6873 The value is 0 if the reg set in P is not really a giv.
6874 Otherwise, the value is the amount gained by eliminating
6875 all the consecutive insns that compute the value.
6877 FIRST_BENEFIT is the amount gained by eliminating the first insn, P.
6878 SRC_REG is the reg of the biv; DEST_REG is the reg of the giv.
6880 The coefficients of the ultimate giv value are stored in
6881 *MULT_VAL and *ADD_VAL. */
6883 static int
6884 consec_sets_giv (loop, first_benefit, p, src_reg, dest_reg,
6885 add_val, mult_val, ext_val, last_consec_insn)
6886 const struct loop *loop;
6887 int first_benefit;
6888 rtx p;
6889 rtx src_reg;
6890 rtx dest_reg;
6891 rtx *add_val;
6892 rtx *mult_val;
6893 rtx *ext_val;
6894 rtx *last_consec_insn;
6896 struct loop_ivs *ivs = LOOP_IVS (loop);
6897 struct loop_regs *regs = LOOP_REGS (loop);
6898 int count;
6899 enum rtx_code code;
6900 int benefit;
6901 rtx temp;
6902 rtx set;
6904 /* Indicate that this is a giv so that we can update the value produced in
6905 each insn of the multi-insn sequence.
6907 This induction structure will be used only by the call to
6908 general_induction_var below, so we can allocate it on our stack.
6909 If this is a giv, our caller will replace the induct var entry with
6910 a new induction structure. */
6911 struct induction *v;
6913 if (REG_IV_TYPE (ivs, REGNO (dest_reg)) != UNKNOWN_INDUCT)
6914 return 0;
6916 v = (struct induction *) alloca (sizeof (struct induction));
6917 v->src_reg = src_reg;
6918 v->mult_val = *mult_val;
6919 v->add_val = *add_val;
6920 v->benefit = first_benefit;
6921 v->cant_derive = 0;
6922 v->derive_adjustment = 0;
6923 v->ext_dependent = NULL_RTX;
6925 REG_IV_TYPE (ivs, REGNO (dest_reg)) = GENERAL_INDUCT;
6926 REG_IV_INFO (ivs, REGNO (dest_reg)) = v;
6928 count = regs->array[REGNO (dest_reg)].n_times_set - 1;
6930 while (count > 0)
6932 p = NEXT_INSN (p);
6933 code = GET_CODE (p);
6935 /* If libcall, skip to end of call sequence. */
6936 if (code == INSN && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
6937 p = XEXP (temp, 0);
6939 if (code == INSN
6940 && (set = single_set (p))
6941 && GET_CODE (SET_DEST (set)) == REG
6942 && SET_DEST (set) == dest_reg
6943 && (general_induction_var (loop, SET_SRC (set), &src_reg,
6944 add_val, mult_val, ext_val, 0,
6945 &benefit, VOIDmode)
6946 /* Giv created by equivalent expression. */
6947 || ((temp = find_reg_note (p, REG_EQUAL, NULL_RTX))
6948 && general_induction_var (loop, XEXP (temp, 0), &src_reg,
6949 add_val, mult_val, ext_val, 0,
6950 &benefit, VOIDmode)))
6951 && src_reg == v->src_reg)
6953 if (find_reg_note (p, REG_RETVAL, NULL_RTX))
6954 benefit += libcall_benefit (p);
6956 count--;
6957 v->mult_val = *mult_val;
6958 v->add_val = *add_val;
6959 v->benefit += benefit;
6961 else if (code != NOTE)
6963 /* Allow insns that set something other than this giv to a
6964 constant. Such insns are needed on machines which cannot
6965 include long constants and should not disqualify a giv. */
6966 if (code == INSN
6967 && (set = single_set (p))
6968 && SET_DEST (set) != dest_reg
6969 && CONSTANT_P (SET_SRC (set)))
6970 continue;
6972 REG_IV_TYPE (ivs, REGNO (dest_reg)) = UNKNOWN_INDUCT;
6973 return 0;
6977 REG_IV_TYPE (ivs, REGNO (dest_reg)) = UNKNOWN_INDUCT;
6978 *last_consec_insn = p;
6979 return v->benefit;
6982 /* Return an rtx, if any, that expresses giv G2 as a function of the register
6983 represented by G1. If no such expression can be found, or it is clear that
6984 it cannot possibly be a valid address, 0 is returned.
6986 To perform the computation, we note that
6987 G1 = x * v + a and
6988 G2 = y * v + b
6989 where `v' is the biv.
6991 So G2 = (y/b) * G1 + (b - a*y/x).
6993 Note that MULT = y/x.
6995 Update: A and B are now allowed to be additive expressions such that
6996 B contains all variables in A. That is, computing B-A will not require
6997 subtracting variables. */
6999 static rtx
7000 express_from_1 (a, b, mult)
7001 rtx a, b, mult;
7003 /* If MULT is zero, then A*MULT is zero, and our expression is B. */
7005 if (mult == const0_rtx)
7006 return b;
7008 /* If MULT is not 1, we cannot handle A with non-constants, since we
7009 would then be required to subtract multiples of the registers in A.
7010 This is theoretically possible, and may even apply to some Fortran
7011 constructs, but it is a lot of work and we do not attempt it here. */
7013 if (mult != const1_rtx && GET_CODE (a) != CONST_INT)
7014 return NULL_RTX;
7016 /* In general these structures are sorted top to bottom (down the PLUS
7017 chain), but not left to right across the PLUS. If B is a higher
7018 order giv than A, we can strip one level and recurse. If A is higher
7019 order, we'll eventually bail out, but won't know that until the end.
7020 If they are the same, we'll strip one level around this loop. */
7022 while (GET_CODE (a) == PLUS && GET_CODE (b) == PLUS)
7024 rtx ra, rb, oa, ob, tmp;
7026 ra = XEXP (a, 0), oa = XEXP (a, 1);
7027 if (GET_CODE (ra) == PLUS)
7028 tmp = ra, ra = oa, oa = tmp;
7030 rb = XEXP (b, 0), ob = XEXP (b, 1);
7031 if (GET_CODE (rb) == PLUS)
7032 tmp = rb, rb = ob, ob = tmp;
7034 if (rtx_equal_p (ra, rb))
7035 /* We matched: remove one reg completely. */
7036 a = oa, b = ob;
7037 else if (GET_CODE (ob) != PLUS && rtx_equal_p (ra, ob))
7038 /* An alternate match. */
7039 a = oa, b = rb;
7040 else if (GET_CODE (oa) != PLUS && rtx_equal_p (oa, rb))
7041 /* An alternate match. */
7042 a = ra, b = ob;
7043 else
7045 /* Indicates an extra register in B. Strip one level from B and
7046 recurse, hoping B was the higher order expression. */
7047 ob = express_from_1 (a, ob, mult);
7048 if (ob == NULL_RTX)
7049 return NULL_RTX;
7050 return gen_rtx_PLUS (GET_MODE (b), rb, ob);
7054 /* Here we are at the last level of A, go through the cases hoping to
7055 get rid of everything but a constant. */
7057 if (GET_CODE (a) == PLUS)
7059 rtx ra, oa;
7061 ra = XEXP (a, 0), oa = XEXP (a, 1);
7062 if (rtx_equal_p (oa, b))
7063 oa = ra;
7064 else if (!rtx_equal_p (ra, b))
7065 return NULL_RTX;
7067 if (GET_CODE (oa) != CONST_INT)
7068 return NULL_RTX;
7070 return GEN_INT (-INTVAL (oa) * INTVAL (mult));
7072 else if (GET_CODE (a) == CONST_INT)
7074 return plus_constant (b, -INTVAL (a) * INTVAL (mult));
7076 else if (CONSTANT_P (a))
7078 enum machine_mode mode_a = GET_MODE (a);
7079 enum machine_mode mode_b = GET_MODE (b);
7080 enum machine_mode mode = mode_b == VOIDmode ? mode_a : mode_b;
7081 return simplify_gen_binary (MINUS, mode, b, a);
7083 else if (GET_CODE (b) == PLUS)
7085 if (rtx_equal_p (a, XEXP (b, 0)))
7086 return XEXP (b, 1);
7087 else if (rtx_equal_p (a, XEXP (b, 1)))
7088 return XEXP (b, 0);
7089 else
7090 return NULL_RTX;
7092 else if (rtx_equal_p (a, b))
7093 return const0_rtx;
7095 return NULL_RTX;
7099 express_from (g1, g2)
7100 struct induction *g1, *g2;
7102 rtx mult, add;
7104 /* The value that G1 will be multiplied by must be a constant integer. Also,
7105 the only chance we have of getting a valid address is if b*c/a (see above
7106 for notation) is also an integer. */
7107 if (GET_CODE (g1->mult_val) == CONST_INT
7108 && GET_CODE (g2->mult_val) == CONST_INT)
7110 if (g1->mult_val == const0_rtx
7111 || INTVAL (g2->mult_val) % INTVAL (g1->mult_val) != 0)
7112 return NULL_RTX;
7113 mult = GEN_INT (INTVAL (g2->mult_val) / INTVAL (g1->mult_val));
7115 else if (rtx_equal_p (g1->mult_val, g2->mult_val))
7116 mult = const1_rtx;
7117 else
7119 /* ??? Find out if the one is a multiple of the other? */
7120 return NULL_RTX;
7123 add = express_from_1 (g1->add_val, g2->add_val, mult);
7124 if (add == NULL_RTX)
7126 /* Failed. If we've got a multiplication factor between G1 and G2,
7127 scale G1's addend and try again. */
7128 if (INTVAL (mult) > 1)
7130 rtx g1_add_val = g1->add_val;
7131 if (GET_CODE (g1_add_val) == MULT
7132 && GET_CODE (XEXP (g1_add_val, 1)) == CONST_INT)
7134 HOST_WIDE_INT m;
7135 m = INTVAL (mult) * INTVAL (XEXP (g1_add_val, 1));
7136 g1_add_val = gen_rtx_MULT (GET_MODE (g1_add_val),
7137 XEXP (g1_add_val, 0), GEN_INT (m));
7139 else
7141 g1_add_val = gen_rtx_MULT (GET_MODE (g1_add_val), g1_add_val,
7142 mult);
7145 add = express_from_1 (g1_add_val, g2->add_val, const1_rtx);
7148 if (add == NULL_RTX)
7149 return NULL_RTX;
7151 /* Form simplified final result. */
7152 if (mult == const0_rtx)
7153 return add;
7154 else if (mult == const1_rtx)
7155 mult = g1->dest_reg;
7156 else
7157 mult = gen_rtx_MULT (g2->mode, g1->dest_reg, mult);
7159 if (add == const0_rtx)
7160 return mult;
7161 else
7163 if (GET_CODE (add) == PLUS
7164 && CONSTANT_P (XEXP (add, 1)))
7166 rtx tem = XEXP (add, 1);
7167 mult = gen_rtx_PLUS (g2->mode, mult, XEXP (add, 0));
7168 add = tem;
7171 return gen_rtx_PLUS (g2->mode, mult, add);
7175 /* Return an rtx, if any, that expresses giv G2 as a function of the register
7176 represented by G1. This indicates that G2 should be combined with G1 and
7177 that G2 can use (either directly or via an address expression) a register
7178 used to represent G1. */
7180 static rtx
7181 combine_givs_p (g1, g2)
7182 struct induction *g1, *g2;
7184 rtx comb, ret;
7186 /* With the introduction of ext dependent givs, we must care for modes.
7187 G2 must not use a wider mode than G1. */
7188 if (GET_MODE_SIZE (g1->mode) < GET_MODE_SIZE (g2->mode))
7189 return NULL_RTX;
7191 ret = comb = express_from (g1, g2);
7192 if (comb == NULL_RTX)
7193 return NULL_RTX;
7194 if (g1->mode != g2->mode)
7195 ret = gen_lowpart (g2->mode, comb);
7197 /* If these givs are identical, they can be combined. We use the results
7198 of express_from because the addends are not in a canonical form, so
7199 rtx_equal_p is a weaker test. */
7200 /* But don't combine a DEST_REG giv with a DEST_ADDR giv; we want the
7201 combination to be the other way round. */
7202 if (comb == g1->dest_reg
7203 && (g1->giv_type == DEST_REG || g2->giv_type == DEST_ADDR))
7205 return ret;
7208 /* If G2 can be expressed as a function of G1 and that function is valid
7209 as an address and no more expensive than using a register for G2,
7210 the expression of G2 in terms of G1 can be used. */
7211 if (ret != NULL_RTX
7212 && g2->giv_type == DEST_ADDR
7213 && memory_address_p (GET_MODE (g2->mem), ret)
7214 /* ??? Looses, especially with -fforce-addr, where *g2->location
7215 will always be a register, and so anything more complicated
7216 gets discarded. */
7217 #if 0
7218 #ifdef ADDRESS_COST
7219 && ADDRESS_COST (tem) <= ADDRESS_COST (*g2->location)
7220 #else
7221 && rtx_cost (tem, MEM) <= rtx_cost (*g2->location, MEM)
7222 #endif
7223 #endif
7226 return ret;
7229 return NULL_RTX;
7232 /* Check each extension dependent giv in this class to see if its
7233 root biv is safe from wrapping in the interior mode, which would
7234 make the giv illegal. */
7236 static void
7237 check_ext_dependent_givs (bl, loop_info)
7238 struct iv_class *bl;
7239 struct loop_info *loop_info;
7241 int ze_ok = 0, se_ok = 0, info_ok = 0;
7242 enum machine_mode biv_mode = GET_MODE (bl->biv->src_reg);
7243 HOST_WIDE_INT start_val;
7244 unsigned HOST_WIDE_INT u_end_val = 0;
7245 unsigned HOST_WIDE_INT u_start_val = 0;
7246 rtx incr = pc_rtx;
7247 struct induction *v;
7249 /* Make sure the iteration data is available. We must have
7250 constants in order to be certain of no overflow. */
7251 /* ??? An unknown iteration count with an increment of +-1
7252 combined with friendly exit tests of against an invariant
7253 value is also ameanable to optimization. Not implemented. */
7254 if (loop_info->n_iterations > 0
7255 && bl->initial_value
7256 && GET_CODE (bl->initial_value) == CONST_INT
7257 && (incr = biv_total_increment (bl))
7258 && GET_CODE (incr) == CONST_INT
7259 /* Make sure the host can represent the arithmetic. */
7260 && HOST_BITS_PER_WIDE_INT >= GET_MODE_BITSIZE (biv_mode))
7262 unsigned HOST_WIDE_INT abs_incr, total_incr;
7263 HOST_WIDE_INT s_end_val;
7264 int neg_incr;
7266 info_ok = 1;
7267 start_val = INTVAL (bl->initial_value);
7268 u_start_val = start_val;
7270 neg_incr = 0, abs_incr = INTVAL (incr);
7271 if (INTVAL (incr) < 0)
7272 neg_incr = 1, abs_incr = -abs_incr;
7273 total_incr = abs_incr * loop_info->n_iterations;
7275 /* Check for host arithmatic overflow. */
7276 if (total_incr / loop_info->n_iterations == abs_incr)
7278 unsigned HOST_WIDE_INT u_max;
7279 HOST_WIDE_INT s_max;
7281 u_end_val = start_val + (neg_incr ? -total_incr : total_incr);
7282 s_end_val = u_end_val;
7283 u_max = GET_MODE_MASK (biv_mode);
7284 s_max = u_max >> 1;
7286 /* Check zero extension of biv ok. */
7287 if (start_val >= 0
7288 /* Check for host arithmatic overflow. */
7289 && (neg_incr
7290 ? u_end_val < u_start_val
7291 : u_end_val > u_start_val)
7292 /* Check for target arithmetic overflow. */
7293 && (neg_incr
7294 ? 1 /* taken care of with host overflow */
7295 : u_end_val <= u_max))
7297 ze_ok = 1;
7300 /* Check sign extension of biv ok. */
7301 /* ??? While it is true that overflow with signed and pointer
7302 arithmetic is undefined, I fear too many programmers don't
7303 keep this fact in mind -- myself included on occasion.
7304 So leave alone with the signed overflow optimizations. */
7305 if (start_val >= -s_max - 1
7306 /* Check for host arithmatic overflow. */
7307 && (neg_incr
7308 ? s_end_val < start_val
7309 : s_end_val > start_val)
7310 /* Check for target arithmetic overflow. */
7311 && (neg_incr
7312 ? s_end_val >= -s_max - 1
7313 : s_end_val <= s_max))
7315 se_ok = 1;
7320 /* Invalidate givs that fail the tests. */
7321 for (v = bl->giv; v; v = v->next_iv)
7322 if (v->ext_dependent)
7324 enum rtx_code code = GET_CODE (v->ext_dependent);
7325 int ok = 0;
7327 switch (code)
7329 case SIGN_EXTEND:
7330 ok = se_ok;
7331 break;
7332 case ZERO_EXTEND:
7333 ok = ze_ok;
7334 break;
7336 case TRUNCATE:
7337 /* We don't know whether this value is being used as either
7338 signed or unsigned, so to safely truncate we must satisfy
7339 both. The initial check here verifies the BIV itself;
7340 once that is successful we may check its range wrt the
7341 derived GIV. */
7342 if (se_ok && ze_ok)
7344 enum machine_mode outer_mode = GET_MODE (v->ext_dependent);
7345 unsigned HOST_WIDE_INT max = GET_MODE_MASK (outer_mode) >> 1;
7347 /* We know from the above that both endpoints are nonnegative,
7348 and that there is no wrapping. Verify that both endpoints
7349 are within the (signed) range of the outer mode. */
7350 if (u_start_val <= max && u_end_val <= max)
7351 ok = 1;
7353 break;
7355 default:
7356 abort ();
7359 if (ok)
7361 if (loop_dump_stream)
7363 fprintf (loop_dump_stream,
7364 "Verified ext dependent giv at %d of reg %d\n",
7365 INSN_UID (v->insn), bl->regno);
7368 else
7370 if (loop_dump_stream)
7372 const char *why;
7374 if (info_ok)
7375 why = "biv iteration values overflowed";
7376 else
7378 if (incr == pc_rtx)
7379 incr = biv_total_increment (bl);
7380 if (incr == const1_rtx)
7381 why = "biv iteration info incomplete; incr by 1";
7382 else
7383 why = "biv iteration info incomplete";
7386 fprintf (loop_dump_stream,
7387 "Failed ext dependent giv at %d, %s\n",
7388 INSN_UID (v->insn), why);
7390 v->ignore = 1;
7391 bl->all_reduced = 0;
7396 /* Generate a version of VALUE in a mode appropriate for initializing V. */
7399 extend_value_for_giv (v, value)
7400 struct induction *v;
7401 rtx value;
7403 rtx ext_dep = v->ext_dependent;
7405 if (! ext_dep)
7406 return value;
7408 /* Recall that check_ext_dependent_givs verified that the known bounds
7409 of a biv did not overflow or wrap with respect to the extension for
7410 the giv. Therefore, constants need no additional adjustment. */
7411 if (CONSTANT_P (value) && GET_MODE (value) == VOIDmode)
7412 return value;
7414 /* Otherwise, we must adjust the value to compensate for the
7415 differing modes of the biv and the giv. */
7416 return gen_rtx_fmt_e (GET_CODE (ext_dep), GET_MODE (ext_dep), value);
7419 struct combine_givs_stats
7421 int giv_number;
7422 int total_benefit;
7425 static int
7426 cmp_combine_givs_stats (xp, yp)
7427 const PTR xp;
7428 const PTR yp;
7430 const struct combine_givs_stats * const x =
7431 (const struct combine_givs_stats *) xp;
7432 const struct combine_givs_stats * const y =
7433 (const struct combine_givs_stats *) yp;
7434 int d;
7435 d = y->total_benefit - x->total_benefit;
7436 /* Stabilize the sort. */
7437 if (!d)
7438 d = x->giv_number - y->giv_number;
7439 return d;
7442 /* Check all pairs of givs for iv_class BL and see if any can be combined with
7443 any other. If so, point SAME to the giv combined with and set NEW_REG to
7444 be an expression (in terms of the other giv's DEST_REG) equivalent to the
7445 giv. Also, update BENEFIT and related fields for cost/benefit analysis. */
7447 static void
7448 combine_givs (regs, bl)
7449 struct loop_regs *regs;
7450 struct iv_class *bl;
7452 /* Additional benefit to add for being combined multiple times. */
7453 const int extra_benefit = 3;
7455 struct induction *g1, *g2, **giv_array;
7456 int i, j, k, giv_count;
7457 struct combine_givs_stats *stats;
7458 rtx *can_combine;
7460 /* Count givs, because bl->giv_count is incorrect here. */
7461 giv_count = 0;
7462 for (g1 = bl->giv; g1; g1 = g1->next_iv)
7463 if (!g1->ignore)
7464 giv_count++;
7466 giv_array
7467 = (struct induction **) alloca (giv_count * sizeof (struct induction *));
7468 i = 0;
7469 for (g1 = bl->giv; g1; g1 = g1->next_iv)
7470 if (!g1->ignore)
7471 giv_array[i++] = g1;
7473 stats = (struct combine_givs_stats *) xcalloc (giv_count, sizeof (*stats));
7474 can_combine = (rtx *) xcalloc (giv_count, giv_count * sizeof (rtx));
7476 for (i = 0; i < giv_count; i++)
7478 int this_benefit;
7479 rtx single_use;
7481 g1 = giv_array[i];
7482 stats[i].giv_number = i;
7484 /* If a DEST_REG GIV is used only once, do not allow it to combine
7485 with anything, for in doing so we will gain nothing that cannot
7486 be had by simply letting the GIV with which we would have combined
7487 to be reduced on its own. The losage shows up in particular with
7488 DEST_ADDR targets on hosts with reg+reg addressing, though it can
7489 be seen elsewhere as well. */
7490 if (g1->giv_type == DEST_REG
7491 && (single_use = regs->array[REGNO (g1->dest_reg)].single_usage)
7492 && single_use != const0_rtx)
7493 continue;
7495 this_benefit = g1->benefit;
7496 /* Add an additional weight for zero addends. */
7497 if (g1->no_const_addval)
7498 this_benefit += 1;
7500 for (j = 0; j < giv_count; j++)
7502 rtx this_combine;
7504 g2 = giv_array[j];
7505 if (g1 != g2
7506 && (this_combine = combine_givs_p (g1, g2)) != NULL_RTX)
7508 can_combine[i * giv_count + j] = this_combine;
7509 this_benefit += g2->benefit + extra_benefit;
7512 stats[i].total_benefit = this_benefit;
7515 /* Iterate, combining until we can't. */
7516 restart:
7517 qsort (stats, giv_count, sizeof (*stats), cmp_combine_givs_stats);
7519 if (loop_dump_stream)
7521 fprintf (loop_dump_stream, "Sorted combine statistics:\n");
7522 for (k = 0; k < giv_count; k++)
7524 g1 = giv_array[stats[k].giv_number];
7525 if (!g1->combined_with && !g1->same)
7526 fprintf (loop_dump_stream, " {%d, %d}",
7527 INSN_UID (giv_array[stats[k].giv_number]->insn),
7528 stats[k].total_benefit);
7530 putc ('\n', loop_dump_stream);
7533 for (k = 0; k < giv_count; k++)
7535 int g1_add_benefit = 0;
7537 i = stats[k].giv_number;
7538 g1 = giv_array[i];
7540 /* If it has already been combined, skip. */
7541 if (g1->combined_with || g1->same)
7542 continue;
7544 for (j = 0; j < giv_count; j++)
7546 g2 = giv_array[j];
7547 if (g1 != g2 && can_combine[i * giv_count + j]
7548 /* If it has already been combined, skip. */
7549 && ! g2->same && ! g2->combined_with)
7551 int l;
7553 g2->new_reg = can_combine[i * giv_count + j];
7554 g2->same = g1;
7555 /* For destination, we now may replace by mem expression instead
7556 of register. This changes the costs considerably, so add the
7557 compensation. */
7558 if (g2->giv_type == DEST_ADDR)
7559 g2->benefit = (g2->benefit + reg_address_cost
7560 - address_cost (g2->new_reg,
7561 GET_MODE (g2->mem)));
7562 g1->combined_with++;
7563 g1->lifetime += g2->lifetime;
7565 g1_add_benefit += g2->benefit;
7567 /* ??? The new final_[bg]iv_value code does a much better job
7568 of finding replaceable giv's, and hence this code may no
7569 longer be necessary. */
7570 if (! g2->replaceable && REG_USERVAR_P (g2->dest_reg))
7571 g1_add_benefit -= copy_cost;
7573 /* To help optimize the next set of combinations, remove
7574 this giv from the benefits of other potential mates. */
7575 for (l = 0; l < giv_count; ++l)
7577 int m = stats[l].giv_number;
7578 if (can_combine[m * giv_count + j])
7579 stats[l].total_benefit -= g2->benefit + extra_benefit;
7582 if (loop_dump_stream)
7583 fprintf (loop_dump_stream,
7584 "giv at %d combined with giv at %d; new benefit %d + %d, lifetime %d\n",
7585 INSN_UID (g2->insn), INSN_UID (g1->insn),
7586 g1->benefit, g1_add_benefit, g1->lifetime);
7590 /* To help optimize the next set of combinations, remove
7591 this giv from the benefits of other potential mates. */
7592 if (g1->combined_with)
7594 for (j = 0; j < giv_count; ++j)
7596 int m = stats[j].giv_number;
7597 if (can_combine[m * giv_count + i])
7598 stats[j].total_benefit -= g1->benefit + extra_benefit;
7601 g1->benefit += g1_add_benefit;
7603 /* We've finished with this giv, and everything it touched.
7604 Restart the combination so that proper weights for the
7605 rest of the givs are properly taken into account. */
7606 /* ??? Ideally we would compact the arrays at this point, so
7607 as to not cover old ground. But sanely compacting
7608 can_combine is tricky. */
7609 goto restart;
7613 /* Clean up. */
7614 free (stats);
7615 free (can_combine);
7618 /* Generate sequence for REG = B * M + A. */
7620 static rtx
7621 gen_add_mult (b, m, a, reg)
7622 rtx b; /* initial value of basic induction variable */
7623 rtx m; /* multiplicative constant */
7624 rtx a; /* additive constant */
7625 rtx reg; /* destination register */
7627 rtx seq;
7628 rtx result;
7630 start_sequence ();
7631 /* Use unsigned arithmetic. */
7632 result = expand_mult_add (b, reg, m, a, GET_MODE (reg), 1);
7633 if (reg != result)
7634 emit_move_insn (reg, result);
7635 seq = gen_sequence ();
7636 end_sequence ();
7638 return seq;
7642 /* Update registers created in insn sequence SEQ. */
7644 static void
7645 loop_regs_update (loop, seq)
7646 const struct loop *loop ATTRIBUTE_UNUSED;
7647 rtx seq;
7649 /* Update register info for alias analysis. */
7651 if (GET_CODE (seq) == SEQUENCE)
7653 int i;
7654 for (i = 0; i < XVECLEN (seq, 0); ++i)
7656 rtx set = single_set (XVECEXP (seq, 0, i));
7657 if (set && GET_CODE (SET_DEST (set)) == REG)
7658 record_base_value (REGNO (SET_DEST (set)), SET_SRC (set), 0);
7661 else
7663 if (GET_CODE (seq) == SET
7664 && GET_CODE (SET_DEST (seq)) == REG)
7665 record_base_value (REGNO (SET_DEST (seq)), SET_SRC (seq), 0);
7670 /* EMIT code before BEFORE_BB/BEFORE_INSN to set REG = B * M + A. */
7672 void
7673 loop_iv_add_mult_emit_before (loop, b, m, a, reg, before_bb, before_insn)
7674 const struct loop *loop;
7675 rtx b; /* initial value of basic induction variable */
7676 rtx m; /* multiplicative constant */
7677 rtx a; /* additive constant */
7678 rtx reg; /* destination register */
7679 basic_block before_bb;
7680 rtx before_insn;
7682 rtx seq;
7684 if (! before_insn)
7686 loop_iv_add_mult_hoist (loop, b, m, a, reg);
7687 return;
7690 /* Use copy_rtx to prevent unexpected sharing of these rtx. */
7691 seq = gen_add_mult (copy_rtx (b), copy_rtx (m), copy_rtx (a), reg);
7693 /* Increase the lifetime of any invariants moved further in code. */
7694 update_reg_last_use (a, before_insn);
7695 update_reg_last_use (b, before_insn);
7696 update_reg_last_use (m, before_insn);
7698 loop_insn_emit_before (loop, before_bb, before_insn, seq);
7700 /* It is possible that the expansion created lots of new registers.
7701 Iterate over the sequence we just created and record them all. */
7702 loop_regs_update (loop, seq);
7706 /* Emit insns in loop pre-header to set REG = B * M + A. */
7708 void
7709 loop_iv_add_mult_sink (loop, b, m, a, reg)
7710 const struct loop *loop;
7711 rtx b; /* initial value of basic induction variable */
7712 rtx m; /* multiplicative constant */
7713 rtx a; /* additive constant */
7714 rtx reg; /* destination register */
7716 rtx seq;
7718 /* Use copy_rtx to prevent unexpected sharing of these rtx. */
7719 seq = gen_add_mult (copy_rtx (b), copy_rtx (m), copy_rtx (a), reg);
7721 /* Increase the lifetime of any invariants moved further in code.
7722 ???? Is this really necessary? */
7723 update_reg_last_use (a, loop->sink);
7724 update_reg_last_use (b, loop->sink);
7725 update_reg_last_use (m, loop->sink);
7727 loop_insn_sink (loop, seq);
7729 /* It is possible that the expansion created lots of new registers.
7730 Iterate over the sequence we just created and record them all. */
7731 loop_regs_update (loop, seq);
7735 /* Emit insns after loop to set REG = B * M + A. */
7737 void
7738 loop_iv_add_mult_hoist (loop, b, m, a, reg)
7739 const struct loop *loop;
7740 rtx b; /* initial value of basic induction variable */
7741 rtx m; /* multiplicative constant */
7742 rtx a; /* additive constant */
7743 rtx reg; /* destination register */
7745 rtx seq;
7747 /* Use copy_rtx to prevent unexpected sharing of these rtx. */
7748 seq = gen_add_mult (copy_rtx (b), copy_rtx (m), copy_rtx (a), reg);
7750 loop_insn_hoist (loop, seq);
7752 /* It is possible that the expansion created lots of new registers.
7753 Iterate over the sequence we just created and record them all. */
7754 loop_regs_update (loop, seq);
7759 /* Similar to gen_add_mult, but compute cost rather than generating
7760 sequence. */
7762 static int
7763 iv_add_mult_cost (b, m, a, reg)
7764 rtx b; /* initial value of basic induction variable */
7765 rtx m; /* multiplicative constant */
7766 rtx a; /* additive constant */
7767 rtx reg; /* destination register */
7769 int cost = 0;
7770 rtx last, result;
7772 start_sequence ();
7773 result = expand_mult_add (b, reg, m, a, GET_MODE (reg), 1);
7774 if (reg != result)
7775 emit_move_insn (reg, result);
7776 last = get_last_insn ();
7777 while (last)
7779 rtx t = single_set (last);
7780 if (t)
7781 cost += rtx_cost (SET_SRC (t), SET);
7782 last = PREV_INSN (last);
7784 end_sequence ();
7785 return cost;
7788 /* Test whether A * B can be computed without
7789 an actual multiply insn. Value is 1 if so. */
7791 static int
7792 product_cheap_p (a, b)
7793 rtx a;
7794 rtx b;
7796 int i;
7797 rtx tmp;
7798 int win = 1;
7800 /* If only one is constant, make it B. */
7801 if (GET_CODE (a) == CONST_INT)
7802 tmp = a, a = b, b = tmp;
7804 /* If first constant, both constant, so don't need multiply. */
7805 if (GET_CODE (a) == CONST_INT)
7806 return 1;
7808 /* If second not constant, neither is constant, so would need multiply. */
7809 if (GET_CODE (b) != CONST_INT)
7810 return 0;
7812 /* One operand is constant, so might not need multiply insn. Generate the
7813 code for the multiply and see if a call or multiply, or long sequence
7814 of insns is generated. */
7816 start_sequence ();
7817 expand_mult (GET_MODE (a), a, b, NULL_RTX, 1);
7818 tmp = gen_sequence ();
7819 end_sequence ();
7821 if (GET_CODE (tmp) == SEQUENCE)
7823 if (XVEC (tmp, 0) == 0)
7824 win = 1;
7825 else if (XVECLEN (tmp, 0) > 3)
7826 win = 0;
7827 else
7828 for (i = 0; i < XVECLEN (tmp, 0); i++)
7830 rtx insn = XVECEXP (tmp, 0, i);
7832 if (GET_CODE (insn) != INSN
7833 || (GET_CODE (PATTERN (insn)) == SET
7834 && GET_CODE (SET_SRC (PATTERN (insn))) == MULT)
7835 || (GET_CODE (PATTERN (insn)) == PARALLEL
7836 && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET
7837 && GET_CODE (SET_SRC (XVECEXP (PATTERN (insn), 0, 0))) == MULT))
7839 win = 0;
7840 break;
7844 else if (GET_CODE (tmp) == SET
7845 && GET_CODE (SET_SRC (tmp)) == MULT)
7846 win = 0;
7847 else if (GET_CODE (tmp) == PARALLEL
7848 && GET_CODE (XVECEXP (tmp, 0, 0)) == SET
7849 && GET_CODE (SET_SRC (XVECEXP (tmp, 0, 0))) == MULT)
7850 win = 0;
7852 return win;
7855 /* Check to see if loop can be terminated by a "decrement and branch until
7856 zero" instruction. If so, add a REG_NONNEG note to the branch insn if so.
7857 Also try reversing an increment loop to a decrement loop
7858 to see if the optimization can be performed.
7859 Value is nonzero if optimization was performed. */
7861 /* This is useful even if the architecture doesn't have such an insn,
7862 because it might change a loops which increments from 0 to n to a loop
7863 which decrements from n to 0. A loop that decrements to zero is usually
7864 faster than one that increments from zero. */
7866 /* ??? This could be rewritten to use some of the loop unrolling procedures,
7867 such as approx_final_value, biv_total_increment, loop_iterations, and
7868 final_[bg]iv_value. */
7870 static int
7871 check_dbra_loop (loop, insn_count)
7872 struct loop *loop;
7873 int insn_count;
7875 struct loop_info *loop_info = LOOP_INFO (loop);
7876 struct loop_regs *regs = LOOP_REGS (loop);
7877 struct loop_ivs *ivs = LOOP_IVS (loop);
7878 struct iv_class *bl;
7879 rtx reg;
7880 rtx jump_label;
7881 rtx final_value;
7882 rtx start_value;
7883 rtx new_add_val;
7884 rtx comparison;
7885 rtx before_comparison;
7886 rtx p;
7887 rtx jump;
7888 rtx first_compare;
7889 int compare_and_branch;
7890 rtx loop_start = loop->start;
7891 rtx loop_end = loop->end;
7893 /* If last insn is a conditional branch, and the insn before tests a
7894 register value, try to optimize it. Otherwise, we can't do anything. */
7896 jump = PREV_INSN (loop_end);
7897 comparison = get_condition_for_loop (loop, jump);
7898 if (comparison == 0)
7899 return 0;
7900 if (!onlyjump_p (jump))
7901 return 0;
7903 /* Try to compute whether the compare/branch at the loop end is one or
7904 two instructions. */
7905 get_condition (jump, &first_compare);
7906 if (first_compare == jump)
7907 compare_and_branch = 1;
7908 else if (first_compare == prev_nonnote_insn (jump))
7909 compare_and_branch = 2;
7910 else
7911 return 0;
7914 /* If more than one condition is present to control the loop, then
7915 do not proceed, as this function does not know how to rewrite
7916 loop tests with more than one condition.
7918 Look backwards from the first insn in the last comparison
7919 sequence and see if we've got another comparison sequence. */
7921 rtx jump1;
7922 if ((jump1 = prev_nonnote_insn (first_compare)) != loop->cont)
7923 if (GET_CODE (jump1) == JUMP_INSN)
7924 return 0;
7927 /* Check all of the bivs to see if the compare uses one of them.
7928 Skip biv's set more than once because we can't guarantee that
7929 it will be zero on the last iteration. Also skip if the biv is
7930 used between its update and the test insn. */
7932 for (bl = ivs->list; bl; bl = bl->next)
7934 if (bl->biv_count == 1
7935 && ! bl->biv->maybe_multiple
7936 && bl->biv->dest_reg == XEXP (comparison, 0)
7937 && ! reg_used_between_p (regno_reg_rtx[bl->regno], bl->biv->insn,
7938 first_compare))
7939 break;
7942 if (! bl)
7943 return 0;
7945 /* Look for the case where the basic induction variable is always
7946 nonnegative, and equals zero on the last iteration.
7947 In this case, add a reg_note REG_NONNEG, which allows the
7948 m68k DBRA instruction to be used. */
7950 if (((GET_CODE (comparison) == GT
7951 && GET_CODE (XEXP (comparison, 1)) == CONST_INT
7952 && INTVAL (XEXP (comparison, 1)) == -1)
7953 || (GET_CODE (comparison) == NE && XEXP (comparison, 1) == const0_rtx))
7954 && GET_CODE (bl->biv->add_val) == CONST_INT
7955 && INTVAL (bl->biv->add_val) < 0)
7957 /* Initial value must be greater than 0,
7958 init_val % -dec_value == 0 to ensure that it equals zero on
7959 the last iteration */
7961 if (GET_CODE (bl->initial_value) == CONST_INT
7962 && INTVAL (bl->initial_value) > 0
7963 && (INTVAL (bl->initial_value)
7964 % (-INTVAL (bl->biv->add_val))) == 0)
7966 /* register always nonnegative, add REG_NOTE to branch */
7967 if (! find_reg_note (jump, REG_NONNEG, NULL_RTX))
7968 REG_NOTES (jump)
7969 = gen_rtx_EXPR_LIST (REG_NONNEG, bl->biv->dest_reg,
7970 REG_NOTES (jump));
7971 bl->nonneg = 1;
7973 return 1;
7976 /* If the decrement is 1 and the value was tested as >= 0 before
7977 the loop, then we can safely optimize. */
7978 for (p = loop_start; p; p = PREV_INSN (p))
7980 if (GET_CODE (p) == CODE_LABEL)
7981 break;
7982 if (GET_CODE (p) != JUMP_INSN)
7983 continue;
7985 before_comparison = get_condition_for_loop (loop, p);
7986 if (before_comparison
7987 && XEXP (before_comparison, 0) == bl->biv->dest_reg
7988 && GET_CODE (before_comparison) == LT
7989 && XEXP (before_comparison, 1) == const0_rtx
7990 && ! reg_set_between_p (bl->biv->dest_reg, p, loop_start)
7991 && INTVAL (bl->biv->add_val) == -1)
7993 if (! find_reg_note (jump, REG_NONNEG, NULL_RTX))
7994 REG_NOTES (jump)
7995 = gen_rtx_EXPR_LIST (REG_NONNEG, bl->biv->dest_reg,
7996 REG_NOTES (jump));
7997 bl->nonneg = 1;
7999 return 1;
8003 else if (GET_CODE (bl->biv->add_val) == CONST_INT
8004 && INTVAL (bl->biv->add_val) > 0)
8006 /* Try to change inc to dec, so can apply above optimization. */
8007 /* Can do this if:
8008 all registers modified are induction variables or invariant,
8009 all memory references have non-overlapping addresses
8010 (obviously true if only one write)
8011 allow 2 insns for the compare/jump at the end of the loop. */
8012 /* Also, we must avoid any instructions which use both the reversed
8013 biv and another biv. Such instructions will fail if the loop is
8014 reversed. We meet this condition by requiring that either
8015 no_use_except_counting is true, or else that there is only
8016 one biv. */
8017 int num_nonfixed_reads = 0;
8018 /* 1 if the iteration var is used only to count iterations. */
8019 int no_use_except_counting = 0;
8020 /* 1 if the loop has no memory store, or it has a single memory store
8021 which is reversible. */
8022 int reversible_mem_store = 1;
8024 if (bl->giv_count == 0
8025 && !loop->exit_count
8026 && !loop_info->has_multiple_exit_targets)
8028 rtx bivreg = regno_reg_rtx[bl->regno];
8029 struct iv_class *blt;
8031 /* If there are no givs for this biv, and the only exit is the
8032 fall through at the end of the loop, then
8033 see if perhaps there are no uses except to count. */
8034 no_use_except_counting = 1;
8035 for (p = loop_start; p != loop_end; p = NEXT_INSN (p))
8036 if (INSN_P (p))
8038 rtx set = single_set (p);
8040 if (set && GET_CODE (SET_DEST (set)) == REG
8041 && REGNO (SET_DEST (set)) == bl->regno)
8042 /* An insn that sets the biv is okay. */
8044 else if ((p == prev_nonnote_insn (prev_nonnote_insn (loop_end))
8045 || p == prev_nonnote_insn (loop_end))
8046 && reg_mentioned_p (bivreg, PATTERN (p)))
8048 /* If either of these insns uses the biv and sets a pseudo
8049 that has more than one usage, then the biv has uses
8050 other than counting since it's used to derive a value
8051 that is used more than one time. */
8052 note_stores (PATTERN (p), note_set_pseudo_multiple_uses,
8053 regs);
8054 if (regs->multiple_uses)
8056 no_use_except_counting = 0;
8057 break;
8060 else if (reg_mentioned_p (bivreg, PATTERN (p)))
8062 no_use_except_counting = 0;
8063 break;
8067 /* A biv has uses besides counting if it is used to set
8068 another biv. */
8069 for (blt = ivs->list; blt; blt = blt->next)
8070 if (blt->init_set
8071 && reg_mentioned_p (bivreg, SET_SRC (blt->init_set)))
8073 no_use_except_counting = 0;
8074 break;
8078 if (no_use_except_counting)
8079 /* No need to worry about MEMs. */
8081 else if (loop_info->num_mem_sets <= 1)
8083 for (p = loop_start; p != loop_end; p = NEXT_INSN (p))
8084 if (INSN_P (p))
8085 num_nonfixed_reads += count_nonfixed_reads (loop, PATTERN (p));
8087 /* If the loop has a single store, and the destination address is
8088 invariant, then we can't reverse the loop, because this address
8089 might then have the wrong value at loop exit.
8090 This would work if the source was invariant also, however, in that
8091 case, the insn should have been moved out of the loop. */
8093 if (loop_info->num_mem_sets == 1)
8095 struct induction *v;
8097 /* If we could prove that each of the memory locations
8098 written to was different, then we could reverse the
8099 store -- but we don't presently have any way of
8100 knowing that. */
8101 reversible_mem_store = 0;
8103 /* If the store depends on a register that is set after the
8104 store, it depends on the initial value, and is thus not
8105 reversible. */
8106 for (v = bl->giv; reversible_mem_store && v; v = v->next_iv)
8108 if (v->giv_type == DEST_REG
8109 && reg_mentioned_p (v->dest_reg,
8110 PATTERN (loop_info->first_loop_store_insn))
8111 && loop_insn_first_p (loop_info->first_loop_store_insn,
8112 v->insn))
8113 reversible_mem_store = 0;
8117 else
8118 return 0;
8120 /* This code only acts for innermost loops. Also it simplifies
8121 the memory address check by only reversing loops with
8122 zero or one memory access.
8123 Two memory accesses could involve parts of the same array,
8124 and that can't be reversed.
8125 If the biv is used only for counting, than we don't need to worry
8126 about all these things. */
8128 if ((num_nonfixed_reads <= 1
8129 && ! loop_info->has_nonconst_call
8130 && ! loop_info->has_volatile
8131 && reversible_mem_store
8132 && (bl->giv_count + bl->biv_count + loop_info->num_mem_sets
8133 + num_unmoved_movables (loop) + compare_and_branch == insn_count)
8134 && (bl == ivs->list && bl->next == 0))
8135 || no_use_except_counting)
8137 rtx tem;
8139 /* Loop can be reversed. */
8140 if (loop_dump_stream)
8141 fprintf (loop_dump_stream, "Can reverse loop\n");
8143 /* Now check other conditions:
8145 The increment must be a constant, as must the initial value,
8146 and the comparison code must be LT.
8148 This test can probably be improved since +/- 1 in the constant
8149 can be obtained by changing LT to LE and vice versa; this is
8150 confusing. */
8152 if (comparison
8153 /* for constants, LE gets turned into LT */
8154 && (GET_CODE (comparison) == LT
8155 || (GET_CODE (comparison) == LE
8156 && no_use_except_counting)))
8158 HOST_WIDE_INT add_val, add_adjust, comparison_val = 0;
8159 rtx initial_value, comparison_value;
8160 int nonneg = 0;
8161 enum rtx_code cmp_code;
8162 int comparison_const_width;
8163 unsigned HOST_WIDE_INT comparison_sign_mask;
8165 add_val = INTVAL (bl->biv->add_val);
8166 comparison_value = XEXP (comparison, 1);
8167 if (GET_MODE (comparison_value) == VOIDmode)
8168 comparison_const_width
8169 = GET_MODE_BITSIZE (GET_MODE (XEXP (comparison, 0)));
8170 else
8171 comparison_const_width
8172 = GET_MODE_BITSIZE (GET_MODE (comparison_value));
8173 if (comparison_const_width > HOST_BITS_PER_WIDE_INT)
8174 comparison_const_width = HOST_BITS_PER_WIDE_INT;
8175 comparison_sign_mask
8176 = (unsigned HOST_WIDE_INT) 1 << (comparison_const_width - 1);
8178 /* If the comparison value is not a loop invariant, then we
8179 can not reverse this loop.
8181 ??? If the insns which initialize the comparison value as
8182 a whole compute an invariant result, then we could move
8183 them out of the loop and proceed with loop reversal. */
8184 if (! loop_invariant_p (loop, comparison_value))
8185 return 0;
8187 if (GET_CODE (comparison_value) == CONST_INT)
8188 comparison_val = INTVAL (comparison_value);
8189 initial_value = bl->initial_value;
8191 /* Normalize the initial value if it is an integer and
8192 has no other use except as a counter. This will allow
8193 a few more loops to be reversed. */
8194 if (no_use_except_counting
8195 && GET_CODE (comparison_value) == CONST_INT
8196 && GET_CODE (initial_value) == CONST_INT)
8198 comparison_val = comparison_val - INTVAL (bl->initial_value);
8199 /* The code below requires comparison_val to be a multiple
8200 of add_val in order to do the loop reversal, so
8201 round up comparison_val to a multiple of add_val.
8202 Since comparison_value is constant, we know that the
8203 current comparison code is LT. */
8204 comparison_val = comparison_val + add_val - 1;
8205 comparison_val
8206 -= (unsigned HOST_WIDE_INT) comparison_val % add_val;
8207 /* We postpone overflow checks for COMPARISON_VAL here;
8208 even if there is an overflow, we might still be able to
8209 reverse the loop, if converting the loop exit test to
8210 NE is possible. */
8211 initial_value = const0_rtx;
8214 /* First check if we can do a vanilla loop reversal. */
8215 if (initial_value == const0_rtx
8216 /* If we have a decrement_and_branch_on_count,
8217 prefer the NE test, since this will allow that
8218 instruction to be generated. Note that we must
8219 use a vanilla loop reversal if the biv is used to
8220 calculate a giv or has a non-counting use. */
8221 #if ! defined (HAVE_decrement_and_branch_until_zero) \
8222 && defined (HAVE_decrement_and_branch_on_count)
8223 && (! (add_val == 1 && loop->vtop
8224 && (bl->biv_count == 0
8225 || no_use_except_counting)))
8226 #endif
8227 && GET_CODE (comparison_value) == CONST_INT
8228 /* Now do postponed overflow checks on COMPARISON_VAL. */
8229 && ! (((comparison_val - add_val) ^ INTVAL (comparison_value))
8230 & comparison_sign_mask))
8232 /* Register will always be nonnegative, with value
8233 0 on last iteration */
8234 add_adjust = add_val;
8235 nonneg = 1;
8236 cmp_code = GE;
8238 else if (add_val == 1 && loop->vtop
8239 && (bl->biv_count == 0
8240 || no_use_except_counting))
8242 add_adjust = 0;
8243 cmp_code = NE;
8245 else
8246 return 0;
8248 if (GET_CODE (comparison) == LE)
8249 add_adjust -= add_val;
8251 /* If the initial value is not zero, or if the comparison
8252 value is not an exact multiple of the increment, then we
8253 can not reverse this loop. */
8254 if (initial_value == const0_rtx
8255 && GET_CODE (comparison_value) == CONST_INT)
8257 if (((unsigned HOST_WIDE_INT) comparison_val % add_val) != 0)
8258 return 0;
8260 else
8262 if (! no_use_except_counting || add_val != 1)
8263 return 0;
8266 final_value = comparison_value;
8268 /* Reset these in case we normalized the initial value
8269 and comparison value above. */
8270 if (GET_CODE (comparison_value) == CONST_INT
8271 && GET_CODE (initial_value) == CONST_INT)
8273 comparison_value = GEN_INT (comparison_val);
8274 final_value
8275 = GEN_INT (comparison_val + INTVAL (bl->initial_value));
8277 bl->initial_value = initial_value;
8279 /* Save some info needed to produce the new insns. */
8280 reg = bl->biv->dest_reg;
8281 jump_label = condjump_label (PREV_INSN (loop_end));
8282 new_add_val = GEN_INT (-INTVAL (bl->biv->add_val));
8284 /* Set start_value; if this is not a CONST_INT, we need
8285 to generate a SUB.
8286 Initialize biv to start_value before loop start.
8287 The old initializing insn will be deleted as a
8288 dead store by flow.c. */
8289 if (initial_value == const0_rtx
8290 && GET_CODE (comparison_value) == CONST_INT)
8292 start_value = GEN_INT (comparison_val - add_adjust);
8293 loop_insn_hoist (loop, gen_move_insn (reg, start_value));
8295 else if (GET_CODE (initial_value) == CONST_INT)
8297 enum machine_mode mode = GET_MODE (reg);
8298 rtx offset = GEN_INT (-INTVAL (initial_value) - add_adjust);
8299 rtx add_insn = gen_add3_insn (reg, comparison_value, offset);
8301 if (add_insn == 0)
8302 return 0;
8304 start_value
8305 = gen_rtx_PLUS (mode, comparison_value, offset);
8306 loop_insn_hoist (loop, add_insn);
8307 if (GET_CODE (comparison) == LE)
8308 final_value = gen_rtx_PLUS (mode, comparison_value,
8309 GEN_INT (add_val));
8311 else if (! add_adjust)
8313 enum machine_mode mode = GET_MODE (reg);
8314 rtx sub_insn = gen_sub3_insn (reg, comparison_value,
8315 initial_value);
8317 if (sub_insn == 0)
8318 return 0;
8319 start_value
8320 = gen_rtx_MINUS (mode, comparison_value, initial_value);
8321 loop_insn_hoist (loop, sub_insn);
8323 else
8324 /* We could handle the other cases too, but it'll be
8325 better to have a testcase first. */
8326 return 0;
8328 /* We may not have a single insn which can increment a reg, so
8329 create a sequence to hold all the insns from expand_inc. */
8330 start_sequence ();
8331 expand_inc (reg, new_add_val);
8332 tem = gen_sequence ();
8333 end_sequence ();
8335 p = loop_insn_emit_before (loop, 0, bl->biv->insn, tem);
8336 delete_insn (bl->biv->insn);
8338 /* Update biv info to reflect its new status. */
8339 bl->biv->insn = p;
8340 bl->initial_value = start_value;
8341 bl->biv->add_val = new_add_val;
8343 /* Update loop info. */
8344 loop_info->initial_value = reg;
8345 loop_info->initial_equiv_value = reg;
8346 loop_info->final_value = const0_rtx;
8347 loop_info->final_equiv_value = const0_rtx;
8348 loop_info->comparison_value = const0_rtx;
8349 loop_info->comparison_code = cmp_code;
8350 loop_info->increment = new_add_val;
8352 /* Inc LABEL_NUSES so that delete_insn will
8353 not delete the label. */
8354 LABEL_NUSES (XEXP (jump_label, 0))++;
8356 /* Emit an insn after the end of the loop to set the biv's
8357 proper exit value if it is used anywhere outside the loop. */
8358 if ((REGNO_LAST_UID (bl->regno) != INSN_UID (first_compare))
8359 || ! bl->init_insn
8360 || REGNO_FIRST_UID (bl->regno) != INSN_UID (bl->init_insn))
8361 loop_insn_sink (loop, gen_move_insn (reg, final_value));
8363 /* Delete compare/branch at end of loop. */
8364 delete_related_insns (PREV_INSN (loop_end));
8365 if (compare_and_branch == 2)
8366 delete_related_insns (first_compare);
8368 /* Add new compare/branch insn at end of loop. */
8369 start_sequence ();
8370 emit_cmp_and_jump_insns (reg, const0_rtx, cmp_code, NULL_RTX,
8371 GET_MODE (reg), 0,
8372 XEXP (jump_label, 0));
8373 tem = gen_sequence ();
8374 end_sequence ();
8375 emit_jump_insn_before (tem, loop_end);
8377 for (tem = PREV_INSN (loop_end);
8378 tem && GET_CODE (tem) != JUMP_INSN;
8379 tem = PREV_INSN (tem))
8382 if (tem)
8383 JUMP_LABEL (tem) = XEXP (jump_label, 0);
8385 if (nonneg)
8387 if (tem)
8389 /* Increment of LABEL_NUSES done above. */
8390 /* Register is now always nonnegative,
8391 so add REG_NONNEG note to the branch. */
8392 REG_NOTES (tem) = gen_rtx_EXPR_LIST (REG_NONNEG, reg,
8393 REG_NOTES (tem));
8395 bl->nonneg = 1;
8398 /* No insn may reference both the reversed and another biv or it
8399 will fail (see comment near the top of the loop reversal
8400 code).
8401 Earlier on, we have verified that the biv has no use except
8402 counting, or it is the only biv in this function.
8403 However, the code that computes no_use_except_counting does
8404 not verify reg notes. It's possible to have an insn that
8405 references another biv, and has a REG_EQUAL note with an
8406 expression based on the reversed biv. To avoid this case,
8407 remove all REG_EQUAL notes based on the reversed biv
8408 here. */
8409 for (p = loop_start; p != loop_end; p = NEXT_INSN (p))
8410 if (INSN_P (p))
8412 rtx *pnote;
8413 rtx set = single_set (p);
8414 /* If this is a set of a GIV based on the reversed biv, any
8415 REG_EQUAL notes should still be correct. */
8416 if (! set
8417 || GET_CODE (SET_DEST (set)) != REG
8418 || (size_t) REGNO (SET_DEST (set)) >= ivs->n_regs
8419 || REG_IV_TYPE (ivs, REGNO (SET_DEST (set))) != GENERAL_INDUCT
8420 || REG_IV_INFO (ivs, REGNO (SET_DEST (set)))->src_reg != bl->biv->src_reg)
8421 for (pnote = &REG_NOTES (p); *pnote;)
8423 if (REG_NOTE_KIND (*pnote) == REG_EQUAL
8424 && reg_mentioned_p (regno_reg_rtx[bl->regno],
8425 XEXP (*pnote, 0)))
8426 *pnote = XEXP (*pnote, 1);
8427 else
8428 pnote = &XEXP (*pnote, 1);
8432 /* Mark that this biv has been reversed. Each giv which depends
8433 on this biv, and which is also live past the end of the loop
8434 will have to be fixed up. */
8436 bl->reversed = 1;
8438 if (loop_dump_stream)
8440 fprintf (loop_dump_stream, "Reversed loop");
8441 if (bl->nonneg)
8442 fprintf (loop_dump_stream, " and added reg_nonneg\n");
8443 else
8444 fprintf (loop_dump_stream, "\n");
8447 return 1;
8452 return 0;
8455 /* Verify whether the biv BL appears to be eliminable,
8456 based on the insns in the loop that refer to it.
8458 If ELIMINATE_P is non-zero, actually do the elimination.
8460 THRESHOLD and INSN_COUNT are from loop_optimize and are used to
8461 determine whether invariant insns should be placed inside or at the
8462 start of the loop. */
8464 static int
8465 maybe_eliminate_biv (loop, bl, eliminate_p, threshold, insn_count)
8466 const struct loop *loop;
8467 struct iv_class *bl;
8468 int eliminate_p;
8469 int threshold, insn_count;
8471 struct loop_ivs *ivs = LOOP_IVS (loop);
8472 rtx reg = bl->biv->dest_reg;
8473 rtx p;
8475 /* Scan all insns in the loop, stopping if we find one that uses the
8476 biv in a way that we cannot eliminate. */
8478 for (p = loop->start; p != loop->end; p = NEXT_INSN (p))
8480 enum rtx_code code = GET_CODE (p);
8481 basic_block where_bb = 0;
8482 rtx where_insn = threshold >= insn_count ? 0 : p;
8484 /* If this is a libcall that sets a giv, skip ahead to its end. */
8485 if (GET_RTX_CLASS (code) == 'i')
8487 rtx note = find_reg_note (p, REG_LIBCALL, NULL_RTX);
8489 if (note)
8491 rtx last = XEXP (note, 0);
8492 rtx set = single_set (last);
8494 if (set && GET_CODE (SET_DEST (set)) == REG)
8496 unsigned int regno = REGNO (SET_DEST (set));
8498 if (regno < ivs->n_regs
8499 && REG_IV_TYPE (ivs, regno) == GENERAL_INDUCT
8500 && REG_IV_INFO (ivs, regno)->src_reg == bl->biv->src_reg)
8501 p = last;
8505 if ((code == INSN || code == JUMP_INSN || code == CALL_INSN)
8506 && reg_mentioned_p (reg, PATTERN (p))
8507 && ! maybe_eliminate_biv_1 (loop, PATTERN (p), p, bl,
8508 eliminate_p, where_bb, where_insn))
8510 if (loop_dump_stream)
8511 fprintf (loop_dump_stream,
8512 "Cannot eliminate biv %d: biv used in insn %d.\n",
8513 bl->regno, INSN_UID (p));
8514 break;
8518 if (p == loop->end)
8520 if (loop_dump_stream)
8521 fprintf (loop_dump_stream, "biv %d %s eliminated.\n",
8522 bl->regno, eliminate_p ? "was" : "can be");
8523 return 1;
8526 return 0;
8529 /* INSN and REFERENCE are instructions in the same insn chain.
8530 Return non-zero if INSN is first. */
8533 loop_insn_first_p (insn, reference)
8534 rtx insn, reference;
8536 rtx p, q;
8538 for (p = insn, q = reference;;)
8540 /* Start with test for not first so that INSN == REFERENCE yields not
8541 first. */
8542 if (q == insn || ! p)
8543 return 0;
8544 if (p == reference || ! q)
8545 return 1;
8547 /* Either of P or Q might be a NOTE. Notes have the same LUID as the
8548 previous insn, hence the <= comparison below does not work if
8549 P is a note. */
8550 if (INSN_UID (p) < max_uid_for_loop
8551 && INSN_UID (q) < max_uid_for_loop
8552 && GET_CODE (p) != NOTE)
8553 return INSN_LUID (p) <= INSN_LUID (q);
8555 if (INSN_UID (p) >= max_uid_for_loop
8556 || GET_CODE (p) == NOTE)
8557 p = NEXT_INSN (p);
8558 if (INSN_UID (q) >= max_uid_for_loop)
8559 q = NEXT_INSN (q);
8563 /* We are trying to eliminate BIV in INSN using GIV. Return non-zero if
8564 the offset that we have to take into account due to auto-increment /
8565 div derivation is zero. */
8566 static int
8567 biv_elimination_giv_has_0_offset (biv, giv, insn)
8568 struct induction *biv, *giv;
8569 rtx insn;
8571 /* If the giv V had the auto-inc address optimization applied
8572 to it, and INSN occurs between the giv insn and the biv
8573 insn, then we'd have to adjust the value used here.
8574 This is rare, so we don't bother to make this possible. */
8575 if (giv->auto_inc_opt
8576 && ((loop_insn_first_p (giv->insn, insn)
8577 && loop_insn_first_p (insn, biv->insn))
8578 || (loop_insn_first_p (biv->insn, insn)
8579 && loop_insn_first_p (insn, giv->insn))))
8580 return 0;
8582 return 1;
8585 /* If BL appears in X (part of the pattern of INSN), see if we can
8586 eliminate its use. If so, return 1. If not, return 0.
8588 If BIV does not appear in X, return 1.
8590 If ELIMINATE_P is non-zero, actually do the elimination.
8591 WHERE_INSN/WHERE_BB indicate where extra insns should be added.
8592 Depending on how many items have been moved out of the loop, it
8593 will either be before INSN (when WHERE_INSN is non-zero) or at the
8594 start of the loop (when WHERE_INSN is zero). */
8596 static int
8597 maybe_eliminate_biv_1 (loop, x, insn, bl, eliminate_p, where_bb, where_insn)
8598 const struct loop *loop;
8599 rtx x, insn;
8600 struct iv_class *bl;
8601 int eliminate_p;
8602 basic_block where_bb;
8603 rtx where_insn;
8605 enum rtx_code code = GET_CODE (x);
8606 rtx reg = bl->biv->dest_reg;
8607 enum machine_mode mode = GET_MODE (reg);
8608 struct induction *v;
8609 rtx arg, tem;
8610 #ifdef HAVE_cc0
8611 rtx new;
8612 #endif
8613 int arg_operand;
8614 const char *fmt;
8615 int i, j;
8617 switch (code)
8619 case REG:
8620 /* If we haven't already been able to do something with this BIV,
8621 we can't eliminate it. */
8622 if (x == reg)
8623 return 0;
8624 return 1;
8626 case SET:
8627 /* If this sets the BIV, it is not a problem. */
8628 if (SET_DEST (x) == reg)
8629 return 1;
8631 /* If this is an insn that defines a giv, it is also ok because
8632 it will go away when the giv is reduced. */
8633 for (v = bl->giv; v; v = v->next_iv)
8634 if (v->giv_type == DEST_REG && SET_DEST (x) == v->dest_reg)
8635 return 1;
8637 #ifdef HAVE_cc0
8638 if (SET_DEST (x) == cc0_rtx && SET_SRC (x) == reg)
8640 /* Can replace with any giv that was reduced and
8641 that has (MULT_VAL != 0) and (ADD_VAL == 0).
8642 Require a constant for MULT_VAL, so we know it's nonzero.
8643 ??? We disable this optimization to avoid potential
8644 overflows. */
8646 for (v = bl->giv; v; v = v->next_iv)
8647 if (GET_CODE (v->mult_val) == CONST_INT && v->mult_val != const0_rtx
8648 && v->add_val == const0_rtx
8649 && ! v->ignore && ! v->maybe_dead && v->always_computable
8650 && v->mode == mode
8651 && 0)
8653 if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
8654 continue;
8656 if (! eliminate_p)
8657 return 1;
8659 /* If the giv has the opposite direction of change,
8660 then reverse the comparison. */
8661 if (INTVAL (v->mult_val) < 0)
8662 new = gen_rtx_COMPARE (GET_MODE (v->new_reg),
8663 const0_rtx, v->new_reg);
8664 else
8665 new = v->new_reg;
8667 /* We can probably test that giv's reduced reg. */
8668 if (validate_change (insn, &SET_SRC (x), new, 0))
8669 return 1;
8672 /* Look for a giv with (MULT_VAL != 0) and (ADD_VAL != 0);
8673 replace test insn with a compare insn (cmp REDUCED_GIV ADD_VAL).
8674 Require a constant for MULT_VAL, so we know it's nonzero.
8675 ??? Do this only if ADD_VAL is a pointer to avoid a potential
8676 overflow problem. */
8678 for (v = bl->giv; v; v = v->next_iv)
8679 if (GET_CODE (v->mult_val) == CONST_INT
8680 && v->mult_val != const0_rtx
8681 && ! v->ignore && ! v->maybe_dead && v->always_computable
8682 && v->mode == mode
8683 && (GET_CODE (v->add_val) == SYMBOL_REF
8684 || GET_CODE (v->add_val) == LABEL_REF
8685 || GET_CODE (v->add_val) == CONST
8686 || (GET_CODE (v->add_val) == REG
8687 && REG_POINTER (v->add_val))))
8689 if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
8690 continue;
8692 if (! eliminate_p)
8693 return 1;
8695 /* If the giv has the opposite direction of change,
8696 then reverse the comparison. */
8697 if (INTVAL (v->mult_val) < 0)
8698 new = gen_rtx_COMPARE (VOIDmode, copy_rtx (v->add_val),
8699 v->new_reg);
8700 else
8701 new = gen_rtx_COMPARE (VOIDmode, v->new_reg,
8702 copy_rtx (v->add_val));
8704 /* Replace biv with the giv's reduced register. */
8705 update_reg_last_use (v->add_val, insn);
8706 if (validate_change (insn, &SET_SRC (PATTERN (insn)), new, 0))
8707 return 1;
8709 /* Insn doesn't support that constant or invariant. Copy it
8710 into a register (it will be a loop invariant.) */
8711 tem = gen_reg_rtx (GET_MODE (v->new_reg));
8713 loop_insn_emit_before (loop, 0, where_insn,
8714 gen_move_insn (tem,
8715 copy_rtx (v->add_val)));
8717 /* Substitute the new register for its invariant value in
8718 the compare expression. */
8719 XEXP (new, (INTVAL (v->mult_val) < 0) ? 0 : 1) = tem;
8720 if (validate_change (insn, &SET_SRC (PATTERN (insn)), new, 0))
8721 return 1;
8724 #endif
8725 break;
8727 case COMPARE:
8728 case EQ: case NE:
8729 case GT: case GE: case GTU: case GEU:
8730 case LT: case LE: case LTU: case LEU:
8731 /* See if either argument is the biv. */
8732 if (XEXP (x, 0) == reg)
8733 arg = XEXP (x, 1), arg_operand = 1;
8734 else if (XEXP (x, 1) == reg)
8735 arg = XEXP (x, 0), arg_operand = 0;
8736 else
8737 break;
8739 if (CONSTANT_P (arg))
8741 /* First try to replace with any giv that has constant positive
8742 mult_val and constant add_val. We might be able to support
8743 negative mult_val, but it seems complex to do it in general. */
8745 for (v = bl->giv; v; v = v->next_iv)
8746 if (GET_CODE (v->mult_val) == CONST_INT
8747 && INTVAL (v->mult_val) > 0
8748 && (GET_CODE (v->add_val) == SYMBOL_REF
8749 || GET_CODE (v->add_val) == LABEL_REF
8750 || GET_CODE (v->add_val) == CONST
8751 || (GET_CODE (v->add_val) == REG
8752 && REG_POINTER (v->add_val)))
8753 && ! v->ignore && ! v->maybe_dead && v->always_computable
8754 && v->mode == mode)
8756 if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
8757 continue;
8759 if (! eliminate_p)
8760 return 1;
8762 /* Replace biv with the giv's reduced reg. */
8763 validate_change (insn, &XEXP (x, 1 - arg_operand), v->new_reg, 1);
8765 /* If all constants are actually constant integers and
8766 the derived constant can be directly placed in the COMPARE,
8767 do so. */
8768 if (GET_CODE (arg) == CONST_INT
8769 && GET_CODE (v->mult_val) == CONST_INT
8770 && GET_CODE (v->add_val) == CONST_INT)
8772 validate_change (insn, &XEXP (x, arg_operand),
8773 GEN_INT (INTVAL (arg)
8774 * INTVAL (v->mult_val)
8775 + INTVAL (v->add_val)), 1);
8777 else
8779 /* Otherwise, load it into a register. */
8780 tem = gen_reg_rtx (mode);
8781 loop_iv_add_mult_emit_before (loop, arg,
8782 v->mult_val, v->add_val,
8783 tem, where_bb, where_insn);
8784 validate_change (insn, &XEXP (x, arg_operand), tem, 1);
8786 if (apply_change_group ())
8787 return 1;
8790 /* Look for giv with positive constant mult_val and nonconst add_val.
8791 Insert insns to calculate new compare value.
8792 ??? Turn this off due to possible overflow. */
8794 for (v = bl->giv; v; v = v->next_iv)
8795 if (GET_CODE (v->mult_val) == CONST_INT
8796 && INTVAL (v->mult_val) > 0
8797 && ! v->ignore && ! v->maybe_dead && v->always_computable
8798 && v->mode == mode
8799 && 0)
8801 rtx tem;
8803 if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
8804 continue;
8806 if (! eliminate_p)
8807 return 1;
8809 tem = gen_reg_rtx (mode);
8811 /* Replace biv with giv's reduced register. */
8812 validate_change (insn, &XEXP (x, 1 - arg_operand),
8813 v->new_reg, 1);
8815 /* Compute value to compare against. */
8816 loop_iv_add_mult_emit_before (loop, arg,
8817 v->mult_val, v->add_val,
8818 tem, where_bb, where_insn);
8819 /* Use it in this insn. */
8820 validate_change (insn, &XEXP (x, arg_operand), tem, 1);
8821 if (apply_change_group ())
8822 return 1;
8825 else if (GET_CODE (arg) == REG || GET_CODE (arg) == MEM)
8827 if (loop_invariant_p (loop, arg) == 1)
8829 /* Look for giv with constant positive mult_val and nonconst
8830 add_val. Insert insns to compute new compare value.
8831 ??? Turn this off due to possible overflow. */
8833 for (v = bl->giv; v; v = v->next_iv)
8834 if (GET_CODE (v->mult_val) == CONST_INT && INTVAL (v->mult_val) > 0
8835 && ! v->ignore && ! v->maybe_dead && v->always_computable
8836 && v->mode == mode
8837 && 0)
8839 rtx tem;
8841 if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
8842 continue;
8844 if (! eliminate_p)
8845 return 1;
8847 tem = gen_reg_rtx (mode);
8849 /* Replace biv with giv's reduced register. */
8850 validate_change (insn, &XEXP (x, 1 - arg_operand),
8851 v->new_reg, 1);
8853 /* Compute value to compare against. */
8854 loop_iv_add_mult_emit_before (loop, arg,
8855 v->mult_val, v->add_val,
8856 tem, where_bb, where_insn);
8857 validate_change (insn, &XEXP (x, arg_operand), tem, 1);
8858 if (apply_change_group ())
8859 return 1;
8863 /* This code has problems. Basically, you can't know when
8864 seeing if we will eliminate BL, whether a particular giv
8865 of ARG will be reduced. If it isn't going to be reduced,
8866 we can't eliminate BL. We can try forcing it to be reduced,
8867 but that can generate poor code.
8869 The problem is that the benefit of reducing TV, below should
8870 be increased if BL can actually be eliminated, but this means
8871 we might have to do a topological sort of the order in which
8872 we try to process biv. It doesn't seem worthwhile to do
8873 this sort of thing now. */
8875 #if 0
8876 /* Otherwise the reg compared with had better be a biv. */
8877 if (GET_CODE (arg) != REG
8878 || REG_IV_TYPE (ivs, REGNO (arg)) != BASIC_INDUCT)
8879 return 0;
8881 /* Look for a pair of givs, one for each biv,
8882 with identical coefficients. */
8883 for (v = bl->giv; v; v = v->next_iv)
8885 struct induction *tv;
8887 if (v->ignore || v->maybe_dead || v->mode != mode)
8888 continue;
8890 for (tv = REG_IV_CLASS (ivs, REGNO (arg))->giv; tv;
8891 tv = tv->next_iv)
8892 if (! tv->ignore && ! tv->maybe_dead
8893 && rtx_equal_p (tv->mult_val, v->mult_val)
8894 && rtx_equal_p (tv->add_val, v->add_val)
8895 && tv->mode == mode)
8897 if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
8898 continue;
8900 if (! eliminate_p)
8901 return 1;
8903 /* Replace biv with its giv's reduced reg. */
8904 XEXP (x, 1 - arg_operand) = v->new_reg;
8905 /* Replace other operand with the other giv's
8906 reduced reg. */
8907 XEXP (x, arg_operand) = tv->new_reg;
8908 return 1;
8911 #endif
8914 /* If we get here, the biv can't be eliminated. */
8915 return 0;
8917 case MEM:
8918 /* If this address is a DEST_ADDR giv, it doesn't matter if the
8919 biv is used in it, since it will be replaced. */
8920 for (v = bl->giv; v; v = v->next_iv)
8921 if (v->giv_type == DEST_ADDR && v->location == &XEXP (x, 0))
8922 return 1;
8923 break;
8925 default:
8926 break;
8929 /* See if any subexpression fails elimination. */
8930 fmt = GET_RTX_FORMAT (code);
8931 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
8933 switch (fmt[i])
8935 case 'e':
8936 if (! maybe_eliminate_biv_1 (loop, XEXP (x, i), insn, bl,
8937 eliminate_p, where_bb, where_insn))
8938 return 0;
8939 break;
8941 case 'E':
8942 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
8943 if (! maybe_eliminate_biv_1 (loop, XVECEXP (x, i, j), insn, bl,
8944 eliminate_p, where_bb, where_insn))
8945 return 0;
8946 break;
8950 return 1;
8953 /* Return nonzero if the last use of REG
8954 is in an insn following INSN in the same basic block. */
8956 static int
8957 last_use_this_basic_block (reg, insn)
8958 rtx reg;
8959 rtx insn;
8961 rtx n;
8962 for (n = insn;
8963 n && GET_CODE (n) != CODE_LABEL && GET_CODE (n) != JUMP_INSN;
8964 n = NEXT_INSN (n))
8966 if (REGNO_LAST_UID (REGNO (reg)) == INSN_UID (n))
8967 return 1;
8969 return 0;
8972 /* Called via `note_stores' to record the initial value of a biv. Here we
8973 just record the location of the set and process it later. */
8975 static void
8976 record_initial (dest, set, data)
8977 rtx dest;
8978 rtx set;
8979 void *data ATTRIBUTE_UNUSED;
8981 struct loop_ivs *ivs = (struct loop_ivs *) data;
8982 struct iv_class *bl;
8984 if (GET_CODE (dest) != REG
8985 || REGNO (dest) >= ivs->n_regs
8986 || REG_IV_TYPE (ivs, REGNO (dest)) != BASIC_INDUCT)
8987 return;
8989 bl = REG_IV_CLASS (ivs, REGNO (dest));
8991 /* If this is the first set found, record it. */
8992 if (bl->init_insn == 0)
8994 bl->init_insn = note_insn;
8995 bl->init_set = set;
8999 /* If any of the registers in X are "old" and currently have a last use earlier
9000 than INSN, update them to have a last use of INSN. Their actual last use
9001 will be the previous insn but it will not have a valid uid_luid so we can't
9002 use it. X must be a source expression only. */
9004 static void
9005 update_reg_last_use (x, insn)
9006 rtx x;
9007 rtx insn;
9009 /* Check for the case where INSN does not have a valid luid. In this case,
9010 there is no need to modify the regno_last_uid, as this can only happen
9011 when code is inserted after the loop_end to set a pseudo's final value,
9012 and hence this insn will never be the last use of x.
9013 ???? This comment is not correct. See for example loop_givs_reduce.
9014 This may insert an insn before another new insn. */
9015 if (GET_CODE (x) == REG && REGNO (x) < max_reg_before_loop
9016 && INSN_UID (insn) < max_uid_for_loop
9017 && REGNO_LAST_LUID (REGNO (x)) < INSN_LUID (insn))
9019 REGNO_LAST_UID (REGNO (x)) = INSN_UID (insn);
9021 else
9023 int i, j;
9024 const char *fmt = GET_RTX_FORMAT (GET_CODE (x));
9025 for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
9027 if (fmt[i] == 'e')
9028 update_reg_last_use (XEXP (x, i), insn);
9029 else if (fmt[i] == 'E')
9030 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
9031 update_reg_last_use (XVECEXP (x, i, j), insn);
9036 /* Given an insn INSN and condition COND, return the condition in a
9037 canonical form to simplify testing by callers. Specifically:
9039 (1) The code will always be a comparison operation (EQ, NE, GT, etc.).
9040 (2) Both operands will be machine operands; (cc0) will have been replaced.
9041 (3) If an operand is a constant, it will be the second operand.
9042 (4) (LE x const) will be replaced with (LT x <const+1>) and similarly
9043 for GE, GEU, and LEU.
9045 If the condition cannot be understood, or is an inequality floating-point
9046 comparison which needs to be reversed, 0 will be returned.
9048 If REVERSE is non-zero, then reverse the condition prior to canonizing it.
9050 If EARLIEST is non-zero, it is a pointer to a place where the earliest
9051 insn used in locating the condition was found. If a replacement test
9052 of the condition is desired, it should be placed in front of that
9053 insn and we will be sure that the inputs are still valid.
9055 If WANT_REG is non-zero, we wish the condition to be relative to that
9056 register, if possible. Therefore, do not canonicalize the condition
9057 further. */
9060 canonicalize_condition (insn, cond, reverse, earliest, want_reg)
9061 rtx insn;
9062 rtx cond;
9063 int reverse;
9064 rtx *earliest;
9065 rtx want_reg;
9067 enum rtx_code code;
9068 rtx prev = insn;
9069 rtx set;
9070 rtx tem;
9071 rtx op0, op1;
9072 int reverse_code = 0;
9073 enum machine_mode mode;
9075 code = GET_CODE (cond);
9076 mode = GET_MODE (cond);
9077 op0 = XEXP (cond, 0);
9078 op1 = XEXP (cond, 1);
9080 if (reverse)
9081 code = reversed_comparison_code (cond, insn);
9082 if (code == UNKNOWN)
9083 return 0;
9085 if (earliest)
9086 *earliest = insn;
9088 /* If we are comparing a register with zero, see if the register is set
9089 in the previous insn to a COMPARE or a comparison operation. Perform
9090 the same tests as a function of STORE_FLAG_VALUE as find_comparison_args
9091 in cse.c */
9093 while (GET_RTX_CLASS (code) == '<'
9094 && op1 == CONST0_RTX (GET_MODE (op0))
9095 && op0 != want_reg)
9097 /* Set non-zero when we find something of interest. */
9098 rtx x = 0;
9100 #ifdef HAVE_cc0
9101 /* If comparison with cc0, import actual comparison from compare
9102 insn. */
9103 if (op0 == cc0_rtx)
9105 if ((prev = prev_nonnote_insn (prev)) == 0
9106 || GET_CODE (prev) != INSN
9107 || (set = single_set (prev)) == 0
9108 || SET_DEST (set) != cc0_rtx)
9109 return 0;
9111 op0 = SET_SRC (set);
9112 op1 = CONST0_RTX (GET_MODE (op0));
9113 if (earliest)
9114 *earliest = prev;
9116 #endif
9118 /* If this is a COMPARE, pick up the two things being compared. */
9119 if (GET_CODE (op0) == COMPARE)
9121 op1 = XEXP (op0, 1);
9122 op0 = XEXP (op0, 0);
9123 continue;
9125 else if (GET_CODE (op0) != REG)
9126 break;
9128 /* Go back to the previous insn. Stop if it is not an INSN. We also
9129 stop if it isn't a single set or if it has a REG_INC note because
9130 we don't want to bother dealing with it. */
9132 if ((prev = prev_nonnote_insn (prev)) == 0
9133 || GET_CODE (prev) != INSN
9134 || FIND_REG_INC_NOTE (prev, NULL_RTX))
9135 break;
9137 set = set_of (op0, prev);
9139 if (set
9140 && (GET_CODE (set) != SET
9141 || !rtx_equal_p (SET_DEST (set), op0)))
9142 break;
9144 /* If this is setting OP0, get what it sets it to if it looks
9145 relevant. */
9146 if (set)
9148 enum machine_mode inner_mode = GET_MODE (SET_DEST (set));
9150 /* ??? We may not combine comparisons done in a CCmode with
9151 comparisons not done in a CCmode. This is to aid targets
9152 like Alpha that have an IEEE compliant EQ instruction, and
9153 a non-IEEE compliant BEQ instruction. The use of CCmode is
9154 actually artificial, simply to prevent the combination, but
9155 should not affect other platforms.
9157 However, we must allow VOIDmode comparisons to match either
9158 CCmode or non-CCmode comparison, because some ports have
9159 modeless comparisons inside branch patterns.
9161 ??? This mode check should perhaps look more like the mode check
9162 in simplify_comparison in combine. */
9164 if ((GET_CODE (SET_SRC (set)) == COMPARE
9165 || (((code == NE
9166 || (code == LT
9167 && GET_MODE_CLASS (inner_mode) == MODE_INT
9168 && (GET_MODE_BITSIZE (inner_mode)
9169 <= HOST_BITS_PER_WIDE_INT)
9170 && (STORE_FLAG_VALUE
9171 & ((HOST_WIDE_INT) 1
9172 << (GET_MODE_BITSIZE (inner_mode) - 1))))
9173 #ifdef FLOAT_STORE_FLAG_VALUE
9174 || (code == LT
9175 && GET_MODE_CLASS (inner_mode) == MODE_FLOAT
9176 && (REAL_VALUE_NEGATIVE
9177 (FLOAT_STORE_FLAG_VALUE (inner_mode))))
9178 #endif
9180 && GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<'))
9181 && (((GET_MODE_CLASS (mode) == MODE_CC)
9182 == (GET_MODE_CLASS (inner_mode) == MODE_CC))
9183 || mode == VOIDmode || inner_mode == VOIDmode))
9184 x = SET_SRC (set);
9185 else if (((code == EQ
9186 || (code == GE
9187 && (GET_MODE_BITSIZE (inner_mode)
9188 <= HOST_BITS_PER_WIDE_INT)
9189 && GET_MODE_CLASS (inner_mode) == MODE_INT
9190 && (STORE_FLAG_VALUE
9191 & ((HOST_WIDE_INT) 1
9192 << (GET_MODE_BITSIZE (inner_mode) - 1))))
9193 #ifdef FLOAT_STORE_FLAG_VALUE
9194 || (code == GE
9195 && GET_MODE_CLASS (inner_mode) == MODE_FLOAT
9196 && (REAL_VALUE_NEGATIVE
9197 (FLOAT_STORE_FLAG_VALUE (inner_mode))))
9198 #endif
9200 && GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<'
9201 && (((GET_MODE_CLASS (mode) == MODE_CC)
9202 == (GET_MODE_CLASS (inner_mode) == MODE_CC))
9203 || mode == VOIDmode || inner_mode == VOIDmode))
9206 reverse_code = 1;
9207 x = SET_SRC (set);
9209 else
9210 break;
9213 else if (reg_set_p (op0, prev))
9214 /* If this sets OP0, but not directly, we have to give up. */
9215 break;
9217 if (x)
9219 if (GET_RTX_CLASS (GET_CODE (x)) == '<')
9220 code = GET_CODE (x);
9221 if (reverse_code)
9223 code = reversed_comparison_code (x, prev);
9224 if (code == UNKNOWN)
9225 return 0;
9226 reverse_code = 0;
9229 op0 = XEXP (x, 0), op1 = XEXP (x, 1);
9230 if (earliest)
9231 *earliest = prev;
9235 /* If constant is first, put it last. */
9236 if (CONSTANT_P (op0))
9237 code = swap_condition (code), tem = op0, op0 = op1, op1 = tem;
9239 /* If OP0 is the result of a comparison, we weren't able to find what
9240 was really being compared, so fail. */
9241 if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
9242 return 0;
9244 /* Canonicalize any ordered comparison with integers involving equality
9245 if we can do computations in the relevant mode and we do not
9246 overflow. */
9248 if (GET_CODE (op1) == CONST_INT
9249 && GET_MODE (op0) != VOIDmode
9250 && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT)
9252 HOST_WIDE_INT const_val = INTVAL (op1);
9253 unsigned HOST_WIDE_INT uconst_val = const_val;
9254 unsigned HOST_WIDE_INT max_val
9255 = (unsigned HOST_WIDE_INT) GET_MODE_MASK (GET_MODE (op0));
9257 switch (code)
9259 case LE:
9260 if ((unsigned HOST_WIDE_INT) const_val != max_val >> 1)
9261 code = LT, op1 = GEN_INT (const_val + 1);
9262 break;
9264 /* When cross-compiling, const_val might be sign-extended from
9265 BITS_PER_WORD to HOST_BITS_PER_WIDE_INT */
9266 case GE:
9267 if ((HOST_WIDE_INT) (const_val & max_val)
9268 != (((HOST_WIDE_INT) 1
9269 << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
9270 code = GT, op1 = GEN_INT (const_val - 1);
9271 break;
9273 case LEU:
9274 if (uconst_val < max_val)
9275 code = LTU, op1 = GEN_INT (uconst_val + 1);
9276 break;
9278 case GEU:
9279 if (uconst_val != 0)
9280 code = GTU, op1 = GEN_INT (uconst_val - 1);
9281 break;
9283 default:
9284 break;
9288 #ifdef HAVE_cc0
9289 /* Never return CC0; return zero instead. */
9290 if (op0 == cc0_rtx)
9291 return 0;
9292 #endif
9294 return gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
9297 /* Given a jump insn JUMP, return the condition that will cause it to branch
9298 to its JUMP_LABEL. If the condition cannot be understood, or is an
9299 inequality floating-point comparison which needs to be reversed, 0 will
9300 be returned.
9302 If EARLIEST is non-zero, it is a pointer to a place where the earliest
9303 insn used in locating the condition was found. If a replacement test
9304 of the condition is desired, it should be placed in front of that
9305 insn and we will be sure that the inputs are still valid. */
9308 get_condition (jump, earliest)
9309 rtx jump;
9310 rtx *earliest;
9312 rtx cond;
9313 int reverse;
9314 rtx set;
9316 /* If this is not a standard conditional jump, we can't parse it. */
9317 if (GET_CODE (jump) != JUMP_INSN
9318 || ! any_condjump_p (jump))
9319 return 0;
9320 set = pc_set (jump);
9322 cond = XEXP (SET_SRC (set), 0);
9324 /* If this branches to JUMP_LABEL when the condition is false, reverse
9325 the condition. */
9326 reverse
9327 = GET_CODE (XEXP (SET_SRC (set), 2)) == LABEL_REF
9328 && XEXP (XEXP (SET_SRC (set), 2), 0) == JUMP_LABEL (jump);
9330 return canonicalize_condition (jump, cond, reverse, earliest, NULL_RTX);
9333 /* Similar to above routine, except that we also put an invariant last
9334 unless both operands are invariants. */
9337 get_condition_for_loop (loop, x)
9338 const struct loop *loop;
9339 rtx x;
9341 rtx comparison = get_condition (x, (rtx*) 0);
9343 if (comparison == 0
9344 || ! loop_invariant_p (loop, XEXP (comparison, 0))
9345 || loop_invariant_p (loop, XEXP (comparison, 1)))
9346 return comparison;
9348 return gen_rtx_fmt_ee (swap_condition (GET_CODE (comparison)), VOIDmode,
9349 XEXP (comparison, 1), XEXP (comparison, 0));
9352 /* Scan the function and determine whether it has indirect (computed) jumps.
9354 This is taken mostly from flow.c; similar code exists elsewhere
9355 in the compiler. It may be useful to put this into rtlanal.c. */
9356 static int
9357 indirect_jump_in_function_p (start)
9358 rtx start;
9360 rtx insn;
9362 for (insn = start; insn; insn = NEXT_INSN (insn))
9363 if (computed_jump_p (insn))
9364 return 1;
9366 return 0;
9369 /* Add MEM to the LOOP_MEMS array, if appropriate. See the
9370 documentation for LOOP_MEMS for the definition of `appropriate'.
9371 This function is called from prescan_loop via for_each_rtx. */
9373 static int
9374 insert_loop_mem (mem, data)
9375 rtx *mem;
9376 void *data ATTRIBUTE_UNUSED;
9378 struct loop_info *loop_info = data;
9379 int i;
9380 rtx m = *mem;
9382 if (m == NULL_RTX)
9383 return 0;
9385 switch (GET_CODE (m))
9387 case MEM:
9388 break;
9390 case CLOBBER:
9391 /* We're not interested in MEMs that are only clobbered. */
9392 return -1;
9394 case CONST_DOUBLE:
9395 /* We're not interested in the MEM associated with a
9396 CONST_DOUBLE, so there's no need to traverse into this. */
9397 return -1;
9399 case EXPR_LIST:
9400 /* We're not interested in any MEMs that only appear in notes. */
9401 return -1;
9403 default:
9404 /* This is not a MEM. */
9405 return 0;
9408 /* See if we've already seen this MEM. */
9409 for (i = 0; i < loop_info->mems_idx; ++i)
9410 if (rtx_equal_p (m, loop_info->mems[i].mem))
9412 if (GET_MODE (m) != GET_MODE (loop_info->mems[i].mem))
9413 /* The modes of the two memory accesses are different. If
9414 this happens, something tricky is going on, and we just
9415 don't optimize accesses to this MEM. */
9416 loop_info->mems[i].optimize = 0;
9418 return 0;
9421 /* Resize the array, if necessary. */
9422 if (loop_info->mems_idx == loop_info->mems_allocated)
9424 if (loop_info->mems_allocated != 0)
9425 loop_info->mems_allocated *= 2;
9426 else
9427 loop_info->mems_allocated = 32;
9429 loop_info->mems = (loop_mem_info *)
9430 xrealloc (loop_info->mems,
9431 loop_info->mems_allocated * sizeof (loop_mem_info));
9434 /* Actually insert the MEM. */
9435 loop_info->mems[loop_info->mems_idx].mem = m;
9436 /* We can't hoist this MEM out of the loop if it's a BLKmode MEM
9437 because we can't put it in a register. We still store it in the
9438 table, though, so that if we see the same address later, but in a
9439 non-BLK mode, we'll not think we can optimize it at that point. */
9440 loop_info->mems[loop_info->mems_idx].optimize = (GET_MODE (m) != BLKmode);
9441 loop_info->mems[loop_info->mems_idx].reg = NULL_RTX;
9442 ++loop_info->mems_idx;
9444 return 0;
9448 /* Allocate REGS->ARRAY or reallocate it if it is too small.
9450 Increment REGS->ARRAY[I].SET_IN_LOOP at the index I of each
9451 register that is modified by an insn between FROM and TO. If the
9452 value of an element of REGS->array[I].SET_IN_LOOP becomes 127 or
9453 more, stop incrementing it, to avoid overflow.
9455 Store in REGS->ARRAY[I].SINGLE_USAGE the single insn in which
9456 register I is used, if it is only used once. Otherwise, it is set
9457 to 0 (for no uses) or const0_rtx for more than one use. This
9458 parameter may be zero, in which case this processing is not done.
9460 Set REGS->ARRAY[I].MAY_NOT_OPTIMIZE nonzero if we should not
9461 optimize register I. */
9463 static void
9464 loop_regs_scan (loop, extra_size)
9465 const struct loop *loop;
9466 int extra_size;
9468 struct loop_regs *regs = LOOP_REGS (loop);
9469 int old_nregs;
9470 /* last_set[n] is nonzero iff reg n has been set in the current
9471 basic block. In that case, it is the insn that last set reg n. */
9472 rtx *last_set;
9473 rtx insn;
9474 int i;
9476 old_nregs = regs->num;
9477 regs->num = max_reg_num ();
9479 /* Grow the regs array if not allocated or too small. */
9480 if (regs->num >= regs->size)
9482 regs->size = regs->num + extra_size;
9484 regs->array = (struct loop_reg *)
9485 xrealloc (regs->array, regs->size * sizeof (*regs->array));
9487 /* Zero the new elements. */
9488 memset (regs->array + old_nregs, 0,
9489 (regs->size - old_nregs) * sizeof (*regs->array));
9492 /* Clear previously scanned fields but do not clear n_times_set. */
9493 for (i = 0; i < old_nregs; i++)
9495 regs->array[i].set_in_loop = 0;
9496 regs->array[i].may_not_optimize = 0;
9497 regs->array[i].single_usage = NULL_RTX;
9500 last_set = (rtx *) xcalloc (regs->num, sizeof (rtx));
9502 /* Scan the loop, recording register usage. */
9503 for (insn = loop->top ? loop->top : loop->start; insn != loop->end;
9504 insn = NEXT_INSN (insn))
9506 if (INSN_P (insn))
9508 /* Record registers that have exactly one use. */
9509 find_single_use_in_loop (regs, insn, PATTERN (insn));
9511 /* Include uses in REG_EQUAL notes. */
9512 if (REG_NOTES (insn))
9513 find_single_use_in_loop (regs, insn, REG_NOTES (insn));
9515 if (GET_CODE (PATTERN (insn)) == SET
9516 || GET_CODE (PATTERN (insn)) == CLOBBER)
9517 count_one_set (regs, insn, PATTERN (insn), last_set);
9518 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
9520 int i;
9521 for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
9522 count_one_set (regs, insn, XVECEXP (PATTERN (insn), 0, i),
9523 last_set);
9527 if (GET_CODE (insn) == CODE_LABEL || GET_CODE (insn) == JUMP_INSN)
9528 memset (last_set, 0, regs->num * sizeof (rtx));
9531 /* Invalidate all hard registers clobbered by calls. With one exception:
9532 a call-clobbered PIC register is still function-invariant for our
9533 purposes, since we can hoist any PIC calculations out of the loop.
9534 Thus the call to rtx_varies_p. */
9535 if (LOOP_INFO (loop)->has_call)
9536 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
9537 if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i)
9538 && rtx_varies_p (gen_rtx_REG (Pmode, i), /*for_alias=*/1))
9540 regs->array[i].may_not_optimize = 1;
9541 regs->array[i].set_in_loop = 1;
9544 #ifdef AVOID_CCMODE_COPIES
9545 /* Don't try to move insns which set CC registers if we should not
9546 create CCmode register copies. */
9547 for (i = regs->num - 1; i >= FIRST_PSEUDO_REGISTER; i--)
9548 if (GET_MODE_CLASS (GET_MODE (regno_reg_rtx[i])) == MODE_CC)
9549 regs->array[i].may_not_optimize = 1;
9550 #endif
9552 /* Set regs->array[I].n_times_set for the new registers. */
9553 for (i = old_nregs; i < regs->num; i++)
9554 regs->array[i].n_times_set = regs->array[i].set_in_loop;
9556 free (last_set);
9559 /* Returns the number of real INSNs in the LOOP. */
9561 static int
9562 count_insns_in_loop (loop)
9563 const struct loop *loop;
9565 int count = 0;
9566 rtx insn;
9568 for (insn = loop->top ? loop->top : loop->start; insn != loop->end;
9569 insn = NEXT_INSN (insn))
9570 if (INSN_P (insn))
9571 ++count;
9573 return count;
9576 /* Move MEMs into registers for the duration of the loop. */
9578 static void
9579 load_mems (loop)
9580 const struct loop *loop;
9582 struct loop_info *loop_info = LOOP_INFO (loop);
9583 struct loop_regs *regs = LOOP_REGS (loop);
9584 int maybe_never = 0;
9585 int i;
9586 rtx p, prev_ebb_head;
9587 rtx label = NULL_RTX;
9588 rtx end_label;
9589 /* Nonzero if the next instruction may never be executed. */
9590 int next_maybe_never = 0;
9591 unsigned int last_max_reg = max_reg_num ();
9593 if (loop_info->mems_idx == 0)
9594 return;
9596 /* We cannot use next_label here because it skips over normal insns. */
9597 end_label = next_nonnote_insn (loop->end);
9598 if (end_label && GET_CODE (end_label) != CODE_LABEL)
9599 end_label = NULL_RTX;
9601 /* Check to see if it's possible that some instructions in the loop are
9602 never executed. Also check if there is a goto out of the loop other
9603 than right after the end of the loop. */
9604 for (p = next_insn_in_loop (loop, loop->scan_start);
9605 p != NULL_RTX;
9606 p = next_insn_in_loop (loop, p))
9608 if (GET_CODE (p) == CODE_LABEL)
9609 maybe_never = 1;
9610 else if (GET_CODE (p) == JUMP_INSN
9611 /* If we enter the loop in the middle, and scan
9612 around to the beginning, don't set maybe_never
9613 for that. This must be an unconditional jump,
9614 otherwise the code at the top of the loop might
9615 never be executed. Unconditional jumps are
9616 followed a by barrier then loop end. */
9617 && ! (GET_CODE (p) == JUMP_INSN
9618 && JUMP_LABEL (p) == loop->top
9619 && NEXT_INSN (NEXT_INSN (p)) == loop->end
9620 && any_uncondjump_p (p)))
9622 /* If this is a jump outside of the loop but not right
9623 after the end of the loop, we would have to emit new fixup
9624 sequences for each such label. */
9625 if (/* If we can't tell where control might go when this
9626 JUMP_INSN is executed, we must be conservative. */
9627 !JUMP_LABEL (p)
9628 || (JUMP_LABEL (p) != end_label
9629 && (INSN_UID (JUMP_LABEL (p)) >= max_uid_for_loop
9630 || INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (loop->start)
9631 || INSN_LUID (JUMP_LABEL (p)) > INSN_LUID (loop->end))))
9632 return;
9634 if (!any_condjump_p (p))
9635 /* Something complicated. */
9636 maybe_never = 1;
9637 else
9638 /* If there are any more instructions in the loop, they
9639 might not be reached. */
9640 next_maybe_never = 1;
9642 else if (next_maybe_never)
9643 maybe_never = 1;
9646 /* Find start of the extended basic block that enters the loop. */
9647 for (p = loop->start;
9648 PREV_INSN (p) && GET_CODE (p) != CODE_LABEL;
9649 p = PREV_INSN (p))
9651 prev_ebb_head = p;
9653 cselib_init ();
9655 /* Build table of mems that get set to constant values before the
9656 loop. */
9657 for (; p != loop->start; p = NEXT_INSN (p))
9658 cselib_process_insn (p);
9660 /* Actually move the MEMs. */
9661 for (i = 0; i < loop_info->mems_idx; ++i)
9663 regset_head load_copies;
9664 regset_head store_copies;
9665 int written = 0;
9666 rtx reg;
9667 rtx mem = loop_info->mems[i].mem;
9668 rtx mem_list_entry;
9670 if (MEM_VOLATILE_P (mem)
9671 || loop_invariant_p (loop, XEXP (mem, 0)) != 1)
9672 /* There's no telling whether or not MEM is modified. */
9673 loop_info->mems[i].optimize = 0;
9675 /* Go through the MEMs written to in the loop to see if this
9676 one is aliased by one of them. */
9677 mem_list_entry = loop_info->store_mems;
9678 while (mem_list_entry)
9680 if (rtx_equal_p (mem, XEXP (mem_list_entry, 0)))
9681 written = 1;
9682 else if (true_dependence (XEXP (mem_list_entry, 0), VOIDmode,
9683 mem, rtx_varies_p))
9685 /* MEM is indeed aliased by this store. */
9686 loop_info->mems[i].optimize = 0;
9687 break;
9689 mem_list_entry = XEXP (mem_list_entry, 1);
9692 if (flag_float_store && written
9693 && GET_MODE_CLASS (GET_MODE (mem)) == MODE_FLOAT)
9694 loop_info->mems[i].optimize = 0;
9696 /* If this MEM is written to, we must be sure that there
9697 are no reads from another MEM that aliases this one. */
9698 if (loop_info->mems[i].optimize && written)
9700 int j;
9702 for (j = 0; j < loop_info->mems_idx; ++j)
9704 if (j == i)
9705 continue;
9706 else if (true_dependence (mem,
9707 VOIDmode,
9708 loop_info->mems[j].mem,
9709 rtx_varies_p))
9711 /* It's not safe to hoist loop_info->mems[i] out of
9712 the loop because writes to it might not be
9713 seen by reads from loop_info->mems[j]. */
9714 loop_info->mems[i].optimize = 0;
9715 break;
9720 if (maybe_never && may_trap_p (mem))
9721 /* We can't access the MEM outside the loop; it might
9722 cause a trap that wouldn't have happened otherwise. */
9723 loop_info->mems[i].optimize = 0;
9725 if (!loop_info->mems[i].optimize)
9726 /* We thought we were going to lift this MEM out of the
9727 loop, but later discovered that we could not. */
9728 continue;
9730 INIT_REG_SET (&load_copies);
9731 INIT_REG_SET (&store_copies);
9733 /* Allocate a pseudo for this MEM. We set REG_USERVAR_P in
9734 order to keep scan_loop from moving stores to this MEM
9735 out of the loop just because this REG is neither a
9736 user-variable nor used in the loop test. */
9737 reg = gen_reg_rtx (GET_MODE (mem));
9738 REG_USERVAR_P (reg) = 1;
9739 loop_info->mems[i].reg = reg;
9741 /* Now, replace all references to the MEM with the
9742 corresponding pseudos. */
9743 maybe_never = 0;
9744 for (p = next_insn_in_loop (loop, loop->scan_start);
9745 p != NULL_RTX;
9746 p = next_insn_in_loop (loop, p))
9748 if (INSN_P (p))
9750 rtx set;
9752 set = single_set (p);
9754 /* See if this copies the mem into a register that isn't
9755 modified afterwards. We'll try to do copy propagation
9756 a little further on. */
9757 if (set
9758 /* @@@ This test is _way_ too conservative. */
9759 && ! maybe_never
9760 && GET_CODE (SET_DEST (set)) == REG
9761 && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER
9762 && REGNO (SET_DEST (set)) < last_max_reg
9763 && regs->array[REGNO (SET_DEST (set))].n_times_set == 1
9764 && rtx_equal_p (SET_SRC (set), mem))
9765 SET_REGNO_REG_SET (&load_copies, REGNO (SET_DEST (set)));
9767 /* See if this copies the mem from a register that isn't
9768 modified afterwards. We'll try to remove the
9769 redundant copy later on by doing a little register
9770 renaming and copy propagation. This will help
9771 to untangle things for the BIV detection code. */
9772 if (set
9773 && ! maybe_never
9774 && GET_CODE (SET_SRC (set)) == REG
9775 && REGNO (SET_SRC (set)) >= FIRST_PSEUDO_REGISTER
9776 && REGNO (SET_SRC (set)) < last_max_reg
9777 && regs->array[REGNO (SET_SRC (set))].n_times_set == 1
9778 && rtx_equal_p (SET_DEST (set), mem))
9779 SET_REGNO_REG_SET (&store_copies, REGNO (SET_SRC (set)));
9781 /* Replace the memory reference with the shadow register. */
9782 replace_loop_mems (p, loop_info->mems[i].mem,
9783 loop_info->mems[i].reg);
9786 if (GET_CODE (p) == CODE_LABEL
9787 || GET_CODE (p) == JUMP_INSN)
9788 maybe_never = 1;
9791 if (! apply_change_group ())
9792 /* We couldn't replace all occurrences of the MEM. */
9793 loop_info->mems[i].optimize = 0;
9794 else
9796 /* Load the memory immediately before LOOP->START, which is
9797 the NOTE_LOOP_BEG. */
9798 cselib_val *e = cselib_lookup (mem, VOIDmode, 0);
9799 rtx set;
9800 rtx best = mem;
9801 int j;
9802 struct elt_loc_list *const_equiv = 0;
9804 if (e)
9806 struct elt_loc_list *equiv;
9807 struct elt_loc_list *best_equiv = 0;
9808 for (equiv = e->locs; equiv; equiv = equiv->next)
9810 if (CONSTANT_P (equiv->loc))
9811 const_equiv = equiv;
9812 else if (GET_CODE (equiv->loc) == REG
9813 /* Extending hard register lifetimes causes crash
9814 on SRC targets. Doing so on non-SRC is
9815 probably also not good idea, since we most
9816 probably have pseudoregister equivalence as
9817 well. */
9818 && REGNO (equiv->loc) >= FIRST_PSEUDO_REGISTER)
9819 best_equiv = equiv;
9821 /* Use the constant equivalence if that is cheap enough. */
9822 if (! best_equiv)
9823 best_equiv = const_equiv;
9824 else if (const_equiv
9825 && (rtx_cost (const_equiv->loc, SET)
9826 <= rtx_cost (best_equiv->loc, SET)))
9828 best_equiv = const_equiv;
9829 const_equiv = 0;
9832 /* If best_equiv is nonzero, we know that MEM is set to a
9833 constant or register before the loop. We will use this
9834 knowledge to initialize the shadow register with that
9835 constant or reg rather than by loading from MEM. */
9836 if (best_equiv)
9837 best = copy_rtx (best_equiv->loc);
9840 set = gen_move_insn (reg, best);
9841 set = loop_insn_hoist (loop, set);
9842 if (REG_P (best))
9844 for (p = prev_ebb_head; p != loop->start; p = NEXT_INSN (p))
9845 if (REGNO_LAST_UID (REGNO (best)) == INSN_UID (p))
9847 REGNO_LAST_UID (REGNO (best)) = INSN_UID (set);
9848 break;
9852 if (const_equiv)
9853 set_unique_reg_note (set, REG_EQUAL, copy_rtx (const_equiv->loc));
9855 if (written)
9857 if (label == NULL_RTX)
9859 label = gen_label_rtx ();
9860 emit_label_after (label, loop->end);
9863 /* Store the memory immediately after END, which is
9864 the NOTE_LOOP_END. */
9865 set = gen_move_insn (copy_rtx (mem), reg);
9866 loop_insn_emit_after (loop, 0, label, set);
9869 if (loop_dump_stream)
9871 fprintf (loop_dump_stream, "Hoisted regno %d %s from ",
9872 REGNO (reg), (written ? "r/w" : "r/o"));
9873 print_rtl (loop_dump_stream, mem);
9874 fputc ('\n', loop_dump_stream);
9877 /* Attempt a bit of copy propagation. This helps untangle the
9878 data flow, and enables {basic,general}_induction_var to find
9879 more bivs/givs. */
9880 EXECUTE_IF_SET_IN_REG_SET
9881 (&load_copies, FIRST_PSEUDO_REGISTER, j,
9883 try_copy_prop (loop, reg, j);
9885 CLEAR_REG_SET (&load_copies);
9887 EXECUTE_IF_SET_IN_REG_SET
9888 (&store_copies, FIRST_PSEUDO_REGISTER, j,
9890 try_swap_copy_prop (loop, reg, j);
9892 CLEAR_REG_SET (&store_copies);
9896 if (label != NULL_RTX && end_label != NULL_RTX)
9898 /* Now, we need to replace all references to the previous exit
9899 label with the new one. */
9900 rtx_pair rr;
9901 rr.r1 = end_label;
9902 rr.r2 = label;
9904 for (p = loop->start; p != loop->end; p = NEXT_INSN (p))
9906 for_each_rtx (&p, replace_label, &rr);
9908 /* If this is a JUMP_INSN, then we also need to fix the JUMP_LABEL
9909 field. This is not handled by for_each_rtx because it doesn't
9910 handle unprinted ('0') fields. We need to update JUMP_LABEL
9911 because the immediately following unroll pass will use it.
9912 replace_label would not work anyways, because that only handles
9913 LABEL_REFs. */
9914 if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p) == end_label)
9915 JUMP_LABEL (p) = label;
9919 cselib_finish ();
9922 /* For communication between note_reg_stored and its caller. */
9923 struct note_reg_stored_arg
9925 int set_seen;
9926 rtx reg;
9929 /* Called via note_stores, record in SET_SEEN whether X, which is written,
9930 is equal to ARG. */
9931 static void
9932 note_reg_stored (x, setter, arg)
9933 rtx x, setter ATTRIBUTE_UNUSED;
9934 void *arg;
9936 struct note_reg_stored_arg *t = (struct note_reg_stored_arg *) arg;
9937 if (t->reg == x)
9938 t->set_seen = 1;
9941 /* Try to replace every occurrence of pseudo REGNO with REPLACEMENT.
9942 There must be exactly one insn that sets this pseudo; it will be
9943 deleted if all replacements succeed and we can prove that the register
9944 is not used after the loop. */
9946 static void
9947 try_copy_prop (loop, replacement, regno)
9948 const struct loop *loop;
9949 rtx replacement;
9950 unsigned int regno;
9952 /* This is the reg that we are copying from. */
9953 rtx reg_rtx = regno_reg_rtx[regno];
9954 rtx init_insn = 0;
9955 rtx insn;
9956 /* These help keep track of whether we replaced all uses of the reg. */
9957 int replaced_last = 0;
9958 int store_is_first = 0;
9960 for (insn = next_insn_in_loop (loop, loop->scan_start);
9961 insn != NULL_RTX;
9962 insn = next_insn_in_loop (loop, insn))
9964 rtx set;
9966 /* Only substitute within one extended basic block from the initializing
9967 insn. */
9968 if (GET_CODE (insn) == CODE_LABEL && init_insn)
9969 break;
9971 if (! INSN_P (insn))
9972 continue;
9974 /* Is this the initializing insn? */
9975 set = single_set (insn);
9976 if (set
9977 && GET_CODE (SET_DEST (set)) == REG
9978 && REGNO (SET_DEST (set)) == regno)
9980 if (init_insn)
9981 abort ();
9983 init_insn = insn;
9984 if (REGNO_FIRST_UID (regno) == INSN_UID (insn))
9985 store_is_first = 1;
9988 /* Only substitute after seeing the initializing insn. */
9989 if (init_insn && insn != init_insn)
9991 struct note_reg_stored_arg arg;
9993 replace_loop_regs (insn, reg_rtx, replacement);
9994 if (REGNO_LAST_UID (regno) == INSN_UID (insn))
9995 replaced_last = 1;
9997 /* Stop replacing when REPLACEMENT is modified. */
9998 arg.reg = replacement;
9999 arg.set_seen = 0;
10000 note_stores (PATTERN (insn), note_reg_stored, &arg);
10001 if (arg.set_seen)
10003 rtx note = find_reg_note (insn, REG_EQUAL, NULL);
10005 /* It is possible that we've turned previously valid REG_EQUAL to
10006 invalid, as we change the REGNO to REPLACEMENT and unlike REGNO,
10007 REPLACEMENT is modified, we get different meaning. */
10008 if (note && reg_mentioned_p (replacement, XEXP (note, 0)))
10009 remove_note (insn, note);
10010 break;
10014 if (! init_insn)
10015 abort ();
10016 if (apply_change_group ())
10018 if (loop_dump_stream)
10019 fprintf (loop_dump_stream, " Replaced reg %d", regno);
10020 if (store_is_first && replaced_last)
10022 rtx first;
10023 rtx retval_note;
10025 /* Assume we're just deleting INIT_INSN. */
10026 first = init_insn;
10027 /* Look for REG_RETVAL note. If we're deleting the end of
10028 the libcall sequence, the whole sequence can go. */
10029 retval_note = find_reg_note (init_insn, REG_RETVAL, NULL_RTX);
10030 /* If we found a REG_RETVAL note, find the first instruction
10031 in the sequence. */
10032 if (retval_note)
10033 first = XEXP (retval_note, 0);
10035 /* Delete the instructions. */
10036 loop_delete_insns (first, init_insn);
10038 if (loop_dump_stream)
10039 fprintf (loop_dump_stream, ".\n");
10043 /* Replace all the instructions from FIRST up to and including LAST
10044 with NOTE_INSN_DELETED notes. */
10046 static void
10047 loop_delete_insns (first, last)
10048 rtx first;
10049 rtx last;
10051 while (1)
10053 if (loop_dump_stream)
10054 fprintf (loop_dump_stream, ", deleting init_insn (%d)",
10055 INSN_UID (first));
10056 delete_insn (first);
10058 /* If this was the LAST instructions we're supposed to delete,
10059 we're done. */
10060 if (first == last)
10061 break;
10063 first = NEXT_INSN (first);
10067 /* Try to replace occurrences of pseudo REGNO with REPLACEMENT within
10068 loop LOOP if the order of the sets of these registers can be
10069 swapped. There must be exactly one insn within the loop that sets
10070 this pseudo followed immediately by a move insn that sets
10071 REPLACEMENT with REGNO. */
10072 static void
10073 try_swap_copy_prop (loop, replacement, regno)
10074 const struct loop *loop;
10075 rtx replacement;
10076 unsigned int regno;
10078 rtx insn;
10079 rtx set = NULL_RTX;
10080 unsigned int new_regno;
10082 new_regno = REGNO (replacement);
10084 for (insn = next_insn_in_loop (loop, loop->scan_start);
10085 insn != NULL_RTX;
10086 insn = next_insn_in_loop (loop, insn))
10088 /* Search for the insn that copies REGNO to NEW_REGNO? */
10089 if (INSN_P (insn)
10090 && (set = single_set (insn))
10091 && GET_CODE (SET_DEST (set)) == REG
10092 && REGNO (SET_DEST (set)) == new_regno
10093 && GET_CODE (SET_SRC (set)) == REG
10094 && REGNO (SET_SRC (set)) == regno)
10095 break;
10098 if (insn != NULL_RTX)
10100 rtx prev_insn;
10101 rtx prev_set;
10103 /* Some DEF-USE info would come in handy here to make this
10104 function more general. For now, just check the previous insn
10105 which is the most likely candidate for setting REGNO. */
10107 prev_insn = PREV_INSN (insn);
10109 if (INSN_P (insn)
10110 && (prev_set = single_set (prev_insn))
10111 && GET_CODE (SET_DEST (prev_set)) == REG
10112 && REGNO (SET_DEST (prev_set)) == regno)
10114 /* We have:
10115 (set (reg regno) (expr))
10116 (set (reg new_regno) (reg regno))
10118 so try converting this to:
10119 (set (reg new_regno) (expr))
10120 (set (reg regno) (reg new_regno))
10122 The former construct is often generated when a global
10123 variable used for an induction variable is shadowed by a
10124 register (NEW_REGNO). The latter construct improves the
10125 chances of GIV replacement and BIV elimination. */
10127 validate_change (prev_insn, &SET_DEST (prev_set),
10128 replacement, 1);
10129 validate_change (insn, &SET_DEST (set),
10130 SET_SRC (set), 1);
10131 validate_change (insn, &SET_SRC (set),
10132 replacement, 1);
10134 if (apply_change_group ())
10136 if (loop_dump_stream)
10137 fprintf (loop_dump_stream,
10138 " Swapped set of reg %d at %d with reg %d at %d.\n",
10139 regno, INSN_UID (insn),
10140 new_regno, INSN_UID (prev_insn));
10142 /* Update first use of REGNO. */
10143 if (REGNO_FIRST_UID (regno) == INSN_UID (prev_insn))
10144 REGNO_FIRST_UID (regno) = INSN_UID (insn);
10146 /* Now perform copy propagation to hopefully
10147 remove all uses of REGNO within the loop. */
10148 try_copy_prop (loop, replacement, regno);
10154 /* Replace MEM with its associated pseudo register. This function is
10155 called from load_mems via for_each_rtx. DATA is actually a pointer
10156 to a structure describing the instruction currently being scanned
10157 and the MEM we are currently replacing. */
10159 static int
10160 replace_loop_mem (mem, data)
10161 rtx *mem;
10162 void *data;
10164 loop_replace_args *args = (loop_replace_args *) data;
10165 rtx m = *mem;
10167 if (m == NULL_RTX)
10168 return 0;
10170 switch (GET_CODE (m))
10172 case MEM:
10173 break;
10175 case CONST_DOUBLE:
10176 /* We're not interested in the MEM associated with a
10177 CONST_DOUBLE, so there's no need to traverse into one. */
10178 return -1;
10180 default:
10181 /* This is not a MEM. */
10182 return 0;
10185 if (!rtx_equal_p (args->match, m))
10186 /* This is not the MEM we are currently replacing. */
10187 return 0;
10189 /* Actually replace the MEM. */
10190 validate_change (args->insn, mem, args->replacement, 1);
10192 return 0;
10195 static void
10196 replace_loop_mems (insn, mem, reg)
10197 rtx insn;
10198 rtx mem;
10199 rtx reg;
10201 loop_replace_args args;
10203 args.insn = insn;
10204 args.match = mem;
10205 args.replacement = reg;
10207 for_each_rtx (&insn, replace_loop_mem, &args);
10210 /* Replace one register with another. Called through for_each_rtx; PX points
10211 to the rtx being scanned. DATA is actually a pointer to
10212 a structure of arguments. */
10214 static int
10215 replace_loop_reg (px, data)
10216 rtx *px;
10217 void *data;
10219 rtx x = *px;
10220 loop_replace_args *args = (loop_replace_args *) data;
10222 if (x == NULL_RTX)
10223 return 0;
10225 if (x == args->match)
10226 validate_change (args->insn, px, args->replacement, 1);
10228 return 0;
10231 static void
10232 replace_loop_regs (insn, reg, replacement)
10233 rtx insn;
10234 rtx reg;
10235 rtx replacement;
10237 loop_replace_args args;
10239 args.insn = insn;
10240 args.match = reg;
10241 args.replacement = replacement;
10243 for_each_rtx (&insn, replace_loop_reg, &args);
10246 /* Replace occurrences of the old exit label for the loop with the new
10247 one. DATA is an rtx_pair containing the old and new labels,
10248 respectively. */
10250 static int
10251 replace_label (x, data)
10252 rtx *x;
10253 void *data;
10255 rtx l = *x;
10256 rtx old_label = ((rtx_pair *) data)->r1;
10257 rtx new_label = ((rtx_pair *) data)->r2;
10259 if (l == NULL_RTX)
10260 return 0;
10262 if (GET_CODE (l) != LABEL_REF)
10263 return 0;
10265 if (XEXP (l, 0) != old_label)
10266 return 0;
10268 XEXP (l, 0) = new_label;
10269 ++LABEL_NUSES (new_label);
10270 --LABEL_NUSES (old_label);
10272 return 0;
10275 /* Emit insn for PATTERN after WHERE_INSN in basic block WHERE_BB
10276 (ignored in the interim). */
10278 static rtx
10279 loop_insn_emit_after (loop, where_bb, where_insn, pattern)
10280 const struct loop *loop ATTRIBUTE_UNUSED;
10281 basic_block where_bb ATTRIBUTE_UNUSED;
10282 rtx where_insn;
10283 rtx pattern;
10285 return emit_insn_after (pattern, where_insn);
10289 /* If WHERE_INSN is non-zero emit insn for PATTERN before WHERE_INSN
10290 in basic block WHERE_BB (ignored in the interim) within the loop
10291 otherwise hoist PATTERN into the loop pre-header. */
10294 loop_insn_emit_before (loop, where_bb, where_insn, pattern)
10295 const struct loop *loop;
10296 basic_block where_bb ATTRIBUTE_UNUSED;
10297 rtx where_insn;
10298 rtx pattern;
10300 if (! where_insn)
10301 return loop_insn_hoist (loop, pattern);
10302 return emit_insn_before (pattern, where_insn);
10306 /* Emit call insn for PATTERN before WHERE_INSN in basic block
10307 WHERE_BB (ignored in the interim) within the loop. */
10309 static rtx
10310 loop_call_insn_emit_before (loop, where_bb, where_insn, pattern)
10311 const struct loop *loop ATTRIBUTE_UNUSED;
10312 basic_block where_bb ATTRIBUTE_UNUSED;
10313 rtx where_insn;
10314 rtx pattern;
10316 return emit_call_insn_before (pattern, where_insn);
10320 /* Hoist insn for PATTERN into the loop pre-header. */
10323 loop_insn_hoist (loop, pattern)
10324 const struct loop *loop;
10325 rtx pattern;
10327 return loop_insn_emit_before (loop, 0, loop->start, pattern);
10331 /* Hoist call insn for PATTERN into the loop pre-header. */
10333 static rtx
10334 loop_call_insn_hoist (loop, pattern)
10335 const struct loop *loop;
10336 rtx pattern;
10338 return loop_call_insn_emit_before (loop, 0, loop->start, pattern);
10342 /* Sink insn for PATTERN after the loop end. */
10345 loop_insn_sink (loop, pattern)
10346 const struct loop *loop;
10347 rtx pattern;
10349 return loop_insn_emit_before (loop, 0, loop->sink, pattern);
10353 /* If the loop has multiple exits, emit insn for PATTERN before the
10354 loop to ensure that it will always be executed no matter how the
10355 loop exits. Otherwise, emit the insn for PATTERN after the loop,
10356 since this is slightly more efficient. */
10358 static rtx
10359 loop_insn_sink_or_swim (loop, pattern)
10360 const struct loop *loop;
10361 rtx pattern;
10363 if (loop->exit_count)
10364 return loop_insn_hoist (loop, pattern);
10365 else
10366 return loop_insn_sink (loop, pattern);
10369 static void
10370 loop_ivs_dump (loop, file, verbose)
10371 const struct loop *loop;
10372 FILE *file;
10373 int verbose;
10375 struct iv_class *bl;
10376 int iv_num = 0;
10378 if (! loop || ! file)
10379 return;
10381 for (bl = LOOP_IVS (loop)->list; bl; bl = bl->next)
10382 iv_num++;
10384 fprintf (file, "Loop %d: %d IV classes\n", loop->num, iv_num);
10386 for (bl = LOOP_IVS (loop)->list; bl; bl = bl->next)
10388 loop_iv_class_dump (bl, file, verbose);
10389 fputc ('\n', file);
10394 static void
10395 loop_iv_class_dump (bl, file, verbose)
10396 const struct iv_class *bl;
10397 FILE *file;
10398 int verbose ATTRIBUTE_UNUSED;
10400 struct induction *v;
10401 rtx incr;
10402 int i;
10404 if (! bl || ! file)
10405 return;
10407 fprintf (file, "IV class for reg %d, benefit %d\n",
10408 bl->regno, bl->total_benefit);
10410 fprintf (file, " Init insn %d", INSN_UID (bl->init_insn));
10411 if (bl->initial_value)
10413 fprintf (file, ", init val: ");
10414 print_simple_rtl (file, bl->initial_value);
10416 if (bl->initial_test)
10418 fprintf (file, ", init test: ");
10419 print_simple_rtl (file, bl->initial_test);
10421 fputc ('\n', file);
10423 if (bl->final_value)
10425 fprintf (file, " Final val: ");
10426 print_simple_rtl (file, bl->final_value);
10427 fputc ('\n', file);
10430 if ((incr = biv_total_increment (bl)))
10432 fprintf (file, " Total increment: ");
10433 print_simple_rtl (file, incr);
10434 fputc ('\n', file);
10437 /* List the increments. */
10438 for (i = 0, v = bl->biv; v; v = v->next_iv, i++)
10440 fprintf (file, " Inc%d: insn %d, incr: ", i, INSN_UID (v->insn));
10441 print_simple_rtl (file, v->add_val);
10442 fputc ('\n', file);
10445 /* List the givs. */
10446 for (i = 0, v = bl->giv; v; v = v->next_iv, i++)
10448 fprintf (file, " Giv%d: insn %d, benefit %d, ",
10449 i, INSN_UID (v->insn), v->benefit);
10450 if (v->giv_type == DEST_ADDR)
10451 print_simple_rtl (file, v->mem);
10452 else
10453 print_simple_rtl (file, single_set (v->insn));
10454 fputc ('\n', file);
10459 static void
10460 loop_biv_dump (v, file, verbose)
10461 const struct induction *v;
10462 FILE *file;
10463 int verbose;
10465 if (! v || ! file)
10466 return;
10468 fprintf (file,
10469 "Biv %d: insn %d",
10470 REGNO (v->dest_reg), INSN_UID (v->insn));
10471 fprintf (file, " const ");
10472 print_simple_rtl (file, v->add_val);
10474 if (verbose && v->final_value)
10476 fputc ('\n', file);
10477 fprintf (file, " final ");
10478 print_simple_rtl (file, v->final_value);
10481 fputc ('\n', file);
10485 static void
10486 loop_giv_dump (v, file, verbose)
10487 const struct induction *v;
10488 FILE *file;
10489 int verbose;
10491 if (! v || ! file)
10492 return;
10494 if (v->giv_type == DEST_REG)
10495 fprintf (file, "Giv %d: insn %d",
10496 REGNO (v->dest_reg), INSN_UID (v->insn));
10497 else
10498 fprintf (file, "Dest address: insn %d",
10499 INSN_UID (v->insn));
10501 fprintf (file, " src reg %d benefit %d",
10502 REGNO (v->src_reg), v->benefit);
10503 fprintf (file, " lifetime %d",
10504 v->lifetime);
10506 if (v->replaceable)
10507 fprintf (file, " replaceable");
10509 if (v->no_const_addval)
10510 fprintf (file, " ncav");
10512 if (v->ext_dependent)
10514 switch (GET_CODE (v->ext_dependent))
10516 case SIGN_EXTEND:
10517 fprintf (file, " ext se");
10518 break;
10519 case ZERO_EXTEND:
10520 fprintf (file, " ext ze");
10521 break;
10522 case TRUNCATE:
10523 fprintf (file, " ext tr");
10524 break;
10525 default:
10526 abort ();
10530 fputc ('\n', file);
10531 fprintf (file, " mult ");
10532 print_simple_rtl (file, v->mult_val);
10534 fputc ('\n', file);
10535 fprintf (file, " add ");
10536 print_simple_rtl (file, v->add_val);
10538 if (verbose && v->final_value)
10540 fputc ('\n', file);
10541 fprintf (file, " final ");
10542 print_simple_rtl (file, v->final_value);
10545 fputc ('\n', file);
10549 void
10550 debug_ivs (loop)
10551 const struct loop *loop;
10553 loop_ivs_dump (loop, stderr, 1);
10557 void
10558 debug_iv_class (bl)
10559 const struct iv_class *bl;
10561 loop_iv_class_dump (bl, stderr, 1);
10565 void
10566 debug_biv (v)
10567 const struct induction *v;
10569 loop_biv_dump (v, stderr, 1);
10573 void
10574 debug_giv (v)
10575 const struct induction *v;
10577 loop_giv_dump (v, stderr, 1);
10581 #define LOOP_BLOCK_NUM_1(INSN) \
10582 ((INSN) ? (BLOCK_FOR_INSN (INSN) ? BLOCK_NUM (INSN) : - 1) : -1)
10584 /* The notes do not have an assigned block, so look at the next insn. */
10585 #define LOOP_BLOCK_NUM(INSN) \
10586 ((INSN) ? (GET_CODE (INSN) == NOTE \
10587 ? LOOP_BLOCK_NUM_1 (next_nonnote_insn (INSN)) \
10588 : LOOP_BLOCK_NUM_1 (INSN)) \
10589 : -1)
10591 #define LOOP_INSN_UID(INSN) ((INSN) ? INSN_UID (INSN) : -1)
10593 static void
10594 loop_dump_aux (loop, file, verbose)
10595 const struct loop *loop;
10596 FILE *file;
10597 int verbose ATTRIBUTE_UNUSED;
10599 rtx label;
10601 if (! loop || ! file)
10602 return;
10604 /* Print diagnostics to compare our concept of a loop with
10605 what the loop notes say. */
10606 if (! PREV_INSN (loop->first->head)
10607 || GET_CODE (PREV_INSN (loop->first->head)) != NOTE
10608 || NOTE_LINE_NUMBER (PREV_INSN (loop->first->head))
10609 != NOTE_INSN_LOOP_BEG)
10610 fprintf (file, ";; No NOTE_INSN_LOOP_BEG at %d\n",
10611 INSN_UID (PREV_INSN (loop->first->head)));
10612 if (! NEXT_INSN (loop->last->end)
10613 || GET_CODE (NEXT_INSN (loop->last->end)) != NOTE
10614 || NOTE_LINE_NUMBER (NEXT_INSN (loop->last->end))
10615 != NOTE_INSN_LOOP_END)
10616 fprintf (file, ";; No NOTE_INSN_LOOP_END at %d\n",
10617 INSN_UID (NEXT_INSN (loop->last->end)));
10619 if (loop->start)
10621 fprintf (file,
10622 ";; start %d (%d), cont dom %d (%d), cont %d (%d), vtop %d (%d), end %d (%d)\n",
10623 LOOP_BLOCK_NUM (loop->start),
10624 LOOP_INSN_UID (loop->start),
10625 LOOP_BLOCK_NUM (loop->cont),
10626 LOOP_INSN_UID (loop->cont),
10627 LOOP_BLOCK_NUM (loop->cont),
10628 LOOP_INSN_UID (loop->cont),
10629 LOOP_BLOCK_NUM (loop->vtop),
10630 LOOP_INSN_UID (loop->vtop),
10631 LOOP_BLOCK_NUM (loop->end),
10632 LOOP_INSN_UID (loop->end));
10633 fprintf (file, ";; top %d (%d), scan start %d (%d)\n",
10634 LOOP_BLOCK_NUM (loop->top),
10635 LOOP_INSN_UID (loop->top),
10636 LOOP_BLOCK_NUM (loop->scan_start),
10637 LOOP_INSN_UID (loop->scan_start));
10638 fprintf (file, ";; exit_count %d", loop->exit_count);
10639 if (loop->exit_count)
10641 fputs (", labels:", file);
10642 for (label = loop->exit_labels; label; label = LABEL_NEXTREF (label))
10644 fprintf (file, " %d ",
10645 LOOP_INSN_UID (XEXP (label, 0)));
10648 fputs ("\n", file);
10650 /* This can happen when a marked loop appears as two nested loops,
10651 say from while (a || b) {}. The inner loop won't match
10652 the loop markers but the outer one will. */
10653 if (LOOP_BLOCK_NUM (loop->cont) != loop->latch->index)
10654 fprintf (file, ";; NOTE_INSN_LOOP_CONT not in loop latch\n");
10658 /* Call this function from the debugger to dump LOOP. */
10660 void
10661 debug_loop (loop)
10662 const struct loop *loop;
10664 flow_loop_dump (loop, stderr, loop_dump_aux, 1);
10667 /* Call this function from the debugger to dump LOOPS. */
10669 void
10670 debug_loops (loops)
10671 const struct loops *loops;
10673 flow_loops_dump (loops, stderr, loop_dump_aux, 1);