cp:
[official-gcc.git] / gcc / loop.c
blobbe4b12d0d74cdddb28f1de22a28ee775194c4a56
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 "function.h"
42 #include "expr.h"
43 #include "hard-reg-set.h"
44 #include "basic-block.h"
45 #include "insn-config.h"
46 #include "regs.h"
47 #include "recog.h"
48 #include "flags.h"
49 #include "real.h"
50 #include "loop.h"
51 #include "cselib.h"
52 #include "except.h"
53 #include "toplev.h"
54 #include "predict.h"
55 #include "insn-flags.h"
56 #include "optabs.h"
58 /* Not really meaningful values, but at least something. */
59 #ifndef SIMULTANEOUS_PREFETCHES
60 #define SIMULTANEOUS_PREFETCHES 3
61 #endif
62 #ifndef PREFETCH_BLOCK
63 #define PREFETCH_BLOCK 32
64 #endif
65 #ifndef HAVE_prefetch
66 #define HAVE_prefetch 0
67 #define CODE_FOR_prefetch 0
68 #define gen_prefetch(a,b,c) (abort(), NULL_RTX)
69 #endif
71 /* Give up the prefetch optimizations once we exceed a given threshhold.
72 It is unlikely that we would be able to optimize something in a loop
73 with so many detected prefetches. */
74 #define MAX_PREFETCHES 100
75 /* The number of prefetch blocks that are beneficial to fetch at once before
76 a loop with a known (and low) iteration count. */
77 #define PREFETCH_BLOCKS_BEFORE_LOOP_MAX 6
78 /* For very tiny loops it is not worthwhile to prefetch even before the loop,
79 since it is likely that the data are already in the cache. */
80 #define PREFETCH_BLOCKS_BEFORE_LOOP_MIN 2
82 /* Parameterize some prefetch heuristics so they can be turned on and off
83 easily for performance testing on new architecures. These can be
84 defined in target-dependent files. */
86 /* Prefetch is worthwhile only when loads/stores are dense. */
87 #ifndef PREFETCH_ONLY_DENSE_MEM
88 #define PREFETCH_ONLY_DENSE_MEM 1
89 #endif
91 /* Define what we mean by "dense" loads and stores; This value divided by 256
92 is the minimum percentage of memory references that worth prefetching. */
93 #ifndef PREFETCH_DENSE_MEM
94 #define PREFETCH_DENSE_MEM 220
95 #endif
97 /* Do not prefetch for a loop whose iteration count is known to be low. */
98 #ifndef PREFETCH_NO_LOW_LOOPCNT
99 #define PREFETCH_NO_LOW_LOOPCNT 1
100 #endif
102 /* Define what we mean by a "low" iteration count. */
103 #ifndef PREFETCH_LOW_LOOPCNT
104 #define PREFETCH_LOW_LOOPCNT 32
105 #endif
107 /* Do not prefetch for a loop that contains a function call; such a loop is
108 probably not an internal loop. */
109 #ifndef PREFETCH_NO_CALL
110 #define PREFETCH_NO_CALL 1
111 #endif
113 /* Do not prefetch accesses with an extreme stride. */
114 #ifndef PREFETCH_NO_EXTREME_STRIDE
115 #define PREFETCH_NO_EXTREME_STRIDE 1
116 #endif
118 /* Define what we mean by an "extreme" stride. */
119 #ifndef PREFETCH_EXTREME_STRIDE
120 #define PREFETCH_EXTREME_STRIDE 4096
121 #endif
123 /* Define a limit to how far apart indices can be and still be merged
124 into a single prefetch. */
125 #ifndef PREFETCH_EXTREME_DIFFERENCE
126 #define PREFETCH_EXTREME_DIFFERENCE 4096
127 #endif
129 /* Issue prefetch instructions before the loop to fetch data to be used
130 in the first few loop iterations. */
131 #ifndef PREFETCH_BEFORE_LOOP
132 #define PREFETCH_BEFORE_LOOP 1
133 #endif
135 /* Do not handle reversed order prefetches (negative stride). */
136 #ifndef PREFETCH_NO_REVERSE_ORDER
137 #define PREFETCH_NO_REVERSE_ORDER 1
138 #endif
140 /* Prefetch even if the GIV is in conditional code. */
141 #ifndef PREFETCH_CONDITIONAL
142 #define PREFETCH_CONDITIONAL 1
143 #endif
145 #define LOOP_REG_LIFETIME(LOOP, REGNO) \
146 ((REGNO_LAST_LUID (REGNO) - REGNO_FIRST_LUID (REGNO)))
148 #define LOOP_REG_GLOBAL_P(LOOP, REGNO) \
149 ((REGNO_LAST_LUID (REGNO) > INSN_LUID ((LOOP)->end) \
150 || REGNO_FIRST_LUID (REGNO) < INSN_LUID ((LOOP)->start)))
152 #define LOOP_REGNO_NREGS(REGNO, SET_DEST) \
153 ((REGNO) < FIRST_PSEUDO_REGISTER \
154 ? (int) HARD_REGNO_NREGS ((REGNO), GET_MODE (SET_DEST)) : 1)
157 /* Vector mapping INSN_UIDs to luids.
158 The luids are like uids but increase monotonically always.
159 We use them to see whether a jump comes from outside a given loop. */
161 int *uid_luid;
163 /* Indexed by INSN_UID, contains the ordinal giving the (innermost) loop
164 number the insn is contained in. */
166 struct loop **uid_loop;
168 /* 1 + largest uid of any insn. */
170 int max_uid_for_loop;
172 /* 1 + luid of last insn. */
174 static int max_luid;
176 /* Number of loops detected in current function. Used as index to the
177 next few tables. */
179 static int max_loop_num;
181 /* Bound on pseudo register number before loop optimization.
182 A pseudo has valid regscan info if its number is < max_reg_before_loop. */
183 unsigned int max_reg_before_loop;
185 /* The value to pass to the next call of reg_scan_update. */
186 static int loop_max_reg;
188 /* During the analysis of a loop, a chain of `struct movable's
189 is made to record all the movable insns found.
190 Then the entire chain can be scanned to decide which to move. */
192 struct movable
194 rtx insn; /* A movable insn */
195 rtx set_src; /* The expression this reg is set from. */
196 rtx set_dest; /* The destination of this SET. */
197 rtx dependencies; /* When INSN is libcall, this is an EXPR_LIST
198 of any registers used within the LIBCALL. */
199 int consec; /* Number of consecutive following insns
200 that must be moved with this one. */
201 unsigned int regno; /* The register it sets */
202 short lifetime; /* lifetime of that register;
203 may be adjusted when matching movables
204 that load the same value are found. */
205 short savings; /* Number of insns we can move for this reg,
206 including other movables that force this
207 or match this one. */
208 unsigned int cond : 1; /* 1 if only conditionally movable */
209 unsigned int force : 1; /* 1 means MUST move this insn */
210 unsigned int global : 1; /* 1 means reg is live outside this loop */
211 /* If PARTIAL is 1, GLOBAL means something different:
212 that the reg is live outside the range from where it is set
213 to the following label. */
214 unsigned int done : 1; /* 1 inhibits further processing of this */
216 unsigned int partial : 1; /* 1 means this reg is used for zero-extending.
217 In particular, moving it does not make it
218 invariant. */
219 unsigned int move_insn : 1; /* 1 means that we call emit_move_insn to
220 load SRC, rather than copying INSN. */
221 unsigned int move_insn_first:1;/* Same as above, if this is necessary for the
222 first insn of a consecutive sets group. */
223 unsigned int is_equiv : 1; /* 1 means a REG_EQUIV is present on INSN. */
224 enum machine_mode savemode; /* Nonzero means it is a mode for a low part
225 that we should avoid changing when clearing
226 the rest of the reg. */
227 struct movable *match; /* First entry for same value */
228 struct movable *forces; /* An insn that must be moved if this is */
229 struct movable *next;
233 FILE *loop_dump_stream;
235 /* Forward declarations. */
237 static void invalidate_loops_containing_label PARAMS ((rtx));
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 static rtx gen_load_of_final_value PARAMS ((rtx, rtx));
357 void debug_ivs PARAMS ((const struct loop *));
358 void debug_iv_class PARAMS ((const struct iv_class *));
359 void debug_biv PARAMS ((const struct induction *));
360 void debug_giv PARAMS ((const struct induction *));
361 void debug_loop PARAMS ((const struct loop *));
362 void debug_loops PARAMS ((const struct loops *));
364 typedef struct rtx_pair
366 rtx r1;
367 rtx r2;
368 } rtx_pair;
370 typedef struct loop_replace_args
372 rtx match;
373 rtx replacement;
374 rtx insn;
375 } loop_replace_args;
377 /* Nonzero iff INSN is between START and END, inclusive. */
378 #define INSN_IN_RANGE_P(INSN, START, END) \
379 (INSN_UID (INSN) < max_uid_for_loop \
380 && INSN_LUID (INSN) >= INSN_LUID (START) \
381 && INSN_LUID (INSN) <= INSN_LUID (END))
383 /* Indirect_jump_in_function is computed once per function. */
384 static int indirect_jump_in_function;
385 static int indirect_jump_in_function_p PARAMS ((rtx));
387 static int compute_luids PARAMS ((rtx, rtx, int));
389 static int biv_elimination_giv_has_0_offset PARAMS ((struct induction *,
390 struct induction *,
391 rtx));
393 /* Benefit penalty, if a giv is not replaceable, i.e. must emit an insn to
394 copy the value of the strength reduced giv to its original register. */
395 static int copy_cost;
397 /* Cost of using a register, to normalize the benefits of a giv. */
398 static int reg_address_cost;
400 void
401 init_loop ()
403 rtx reg = gen_rtx_REG (word_mode, LAST_VIRTUAL_REGISTER + 1);
405 reg_address_cost = address_cost (reg, SImode);
407 copy_cost = COSTS_N_INSNS (1);
410 /* Compute the mapping from uids to luids.
411 LUIDs are numbers assigned to insns, like uids,
412 except that luids increase monotonically through the code.
413 Start at insn START and stop just before END. Assign LUIDs
414 starting with PREV_LUID + 1. Return the last assigned LUID + 1. */
415 static int
416 compute_luids (start, end, prev_luid)
417 rtx start, end;
418 int prev_luid;
420 int i;
421 rtx insn;
423 for (insn = start, i = prev_luid; insn != end; insn = NEXT_INSN (insn))
425 if (INSN_UID (insn) >= max_uid_for_loop)
426 continue;
427 /* Don't assign luids to line-number NOTEs, so that the distance in
428 luids between two insns is not affected by -g. */
429 if (GET_CODE (insn) != NOTE
430 || NOTE_LINE_NUMBER (insn) <= 0)
431 uid_luid[INSN_UID (insn)] = ++i;
432 else
433 /* Give a line number note the same luid as preceding insn. */
434 uid_luid[INSN_UID (insn)] = i;
436 return i + 1;
439 /* Entry point of this file. Perform loop optimization
440 on the current function. F is the first insn of the function
441 and DUMPFILE is a stream for output of a trace of actions taken
442 (or 0 if none should be output). */
444 void
445 loop_optimize (f, dumpfile, flags)
446 /* f is the first instruction of a chain of insns for one function */
447 rtx f;
448 FILE *dumpfile;
449 int flags;
451 rtx insn;
452 int i;
453 struct loops loops_data;
454 struct loops *loops = &loops_data;
455 struct loop_info *loops_info;
457 loop_dump_stream = dumpfile;
459 init_recog_no_volatile ();
461 max_reg_before_loop = max_reg_num ();
462 loop_max_reg = max_reg_before_loop;
464 regs_may_share = 0;
466 /* Count the number of loops. */
468 max_loop_num = 0;
469 for (insn = f; insn; insn = NEXT_INSN (insn))
471 if (GET_CODE (insn) == NOTE
472 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
473 max_loop_num++;
476 /* Don't waste time if no loops. */
477 if (max_loop_num == 0)
478 return;
480 loops->num = max_loop_num;
482 /* Get size to use for tables indexed by uids.
483 Leave some space for labels allocated by find_and_verify_loops. */
484 max_uid_for_loop = get_max_uid () + 1 + max_loop_num * 32;
486 uid_luid = (int *) xcalloc (max_uid_for_loop, sizeof (int));
487 uid_loop = (struct loop **) xcalloc (max_uid_for_loop,
488 sizeof (struct loop *));
490 /* Allocate storage for array of loops. */
491 loops->array = (struct loop *)
492 xcalloc (loops->num, sizeof (struct loop));
494 /* Find and process each loop.
495 First, find them, and record them in order of their beginnings. */
496 find_and_verify_loops (f, loops);
498 /* Allocate and initialize auxiliary loop information. */
499 loops_info = xcalloc (loops->num, sizeof (struct loop_info));
500 for (i = 0; i < loops->num; i++)
501 loops->array[i].aux = loops_info + i;
503 /* Now find all register lifetimes. This must be done after
504 find_and_verify_loops, because it might reorder the insns in the
505 function. */
506 reg_scan (f, max_reg_before_loop, 1);
508 /* This must occur after reg_scan so that registers created by gcse
509 will have entries in the register tables.
511 We could have added a call to reg_scan after gcse_main in toplev.c,
512 but moving this call to init_alias_analysis is more efficient. */
513 init_alias_analysis ();
515 /* See if we went too far. Note that get_max_uid already returns
516 one more that the maximum uid of all insn. */
517 if (get_max_uid () > max_uid_for_loop)
518 abort ();
519 /* Now reset it to the actual size we need. See above. */
520 max_uid_for_loop = get_max_uid ();
522 /* find_and_verify_loops has already called compute_luids, but it
523 might have rearranged code afterwards, so we need to recompute
524 the luids now. */
525 max_luid = compute_luids (f, NULL_RTX, 0);
527 /* Don't leave gaps in uid_luid for insns that have been
528 deleted. It is possible that the first or last insn
529 using some register has been deleted by cross-jumping.
530 Make sure that uid_luid for that former insn's uid
531 points to the general area where that insn used to be. */
532 for (i = 0; i < max_uid_for_loop; i++)
534 uid_luid[0] = uid_luid[i];
535 if (uid_luid[0] != 0)
536 break;
538 for (i = 0; i < max_uid_for_loop; i++)
539 if (uid_luid[i] == 0)
540 uid_luid[i] = uid_luid[i - 1];
542 /* Determine if the function has indirect jump. On some systems
543 this prevents low overhead loop instructions from being used. */
544 indirect_jump_in_function = indirect_jump_in_function_p (f);
546 /* Now scan the loops, last ones first, since this means inner ones are done
547 before outer ones. */
548 for (i = max_loop_num - 1; i >= 0; i--)
550 struct loop *loop = &loops->array[i];
552 if (! loop->invalid && loop->end)
553 scan_loop (loop, flags);
556 end_alias_analysis ();
558 /* Clean up. */
559 free (uid_luid);
560 free (uid_loop);
561 free (loops_info);
562 free (loops->array);
565 /* Returns the next insn, in execution order, after INSN. START and
566 END are the NOTE_INSN_LOOP_BEG and NOTE_INSN_LOOP_END for the loop,
567 respectively. LOOP->TOP, if non-NULL, is the top of the loop in the
568 insn-stream; it is used with loops that are entered near the
569 bottom. */
571 static rtx
572 next_insn_in_loop (loop, insn)
573 const struct loop *loop;
574 rtx insn;
576 insn = NEXT_INSN (insn);
578 if (insn == loop->end)
580 if (loop->top)
581 /* Go to the top of the loop, and continue there. */
582 insn = loop->top;
583 else
584 /* We're done. */
585 insn = NULL_RTX;
588 if (insn == loop->scan_start)
589 /* We're done. */
590 insn = NULL_RTX;
592 return insn;
595 /* Optimize one loop described by LOOP. */
597 /* ??? Could also move memory writes out of loops if the destination address
598 is invariant, the source is invariant, the memory write is not volatile,
599 and if we can prove that no read inside the loop can read this address
600 before the write occurs. If there is a read of this address after the
601 write, then we can also mark the memory read as invariant. */
603 static void
604 scan_loop (loop, flags)
605 struct loop *loop;
606 int flags;
608 struct loop_info *loop_info = LOOP_INFO (loop);
609 struct loop_regs *regs = LOOP_REGS (loop);
610 int i;
611 rtx loop_start = loop->start;
612 rtx loop_end = loop->end;
613 rtx p;
614 /* 1 if we are scanning insns that could be executed zero times. */
615 int maybe_never = 0;
616 /* 1 if we are scanning insns that might never be executed
617 due to a subroutine call which might exit before they are reached. */
618 int call_passed = 0;
619 /* Jump insn that enters the loop, or 0 if control drops in. */
620 rtx loop_entry_jump = 0;
621 /* Number of insns in the loop. */
622 int insn_count;
623 int tem;
624 rtx temp, update_start, update_end;
625 /* The SET from an insn, if it is the only SET in the insn. */
626 rtx set, set1;
627 /* Chain describing insns movable in current loop. */
628 struct loop_movables *movables = LOOP_MOVABLES (loop);
629 /* Ratio of extra register life span we can justify
630 for saving an instruction. More if loop doesn't call subroutines
631 since in that case saving an insn makes more difference
632 and more registers are available. */
633 int threshold;
634 /* Nonzero if we are scanning instructions in a sub-loop. */
635 int loop_depth = 0;
636 int in_libcall;
638 loop->top = 0;
640 movables->head = 0;
641 movables->last = 0;
643 /* Determine whether this loop starts with a jump down to a test at
644 the end. This will occur for a small number of loops with a test
645 that is too complex to duplicate in front of the loop.
647 We search for the first insn or label in the loop, skipping NOTEs.
648 However, we must be careful not to skip past a NOTE_INSN_LOOP_BEG
649 (because we might have a loop executed only once that contains a
650 loop which starts with a jump to its exit test) or a NOTE_INSN_LOOP_END
651 (in case we have a degenerate loop).
653 Note that if we mistakenly think that a loop is entered at the top
654 when, in fact, it is entered at the exit test, the only effect will be
655 slightly poorer optimization. Making the opposite error can generate
656 incorrect code. Since very few loops now start with a jump to the
657 exit test, the code here to detect that case is very conservative. */
659 for (p = NEXT_INSN (loop_start);
660 p != loop_end
661 && GET_CODE (p) != CODE_LABEL && ! INSN_P (p)
662 && (GET_CODE (p) != NOTE
663 || (NOTE_LINE_NUMBER (p) != NOTE_INSN_LOOP_BEG
664 && NOTE_LINE_NUMBER (p) != NOTE_INSN_LOOP_END));
665 p = NEXT_INSN (p))
668 loop->scan_start = p;
670 /* If loop end is the end of the current function, then emit a
671 NOTE_INSN_DELETED after loop_end and set loop->sink to the dummy
672 note insn. This is the position we use when sinking insns out of
673 the loop. */
674 if (NEXT_INSN (loop->end) != 0)
675 loop->sink = NEXT_INSN (loop->end);
676 else
677 loop->sink = emit_note_after (NOTE_INSN_DELETED, loop->end);
679 /* Set up variables describing this loop. */
680 prescan_loop (loop);
681 threshold = (loop_info->has_call ? 1 : 2) * (1 + n_non_fixed_regs);
683 /* If loop has a jump before the first label,
684 the true entry is the target of that jump.
685 Start scan from there.
686 But record in LOOP->TOP the place where the end-test jumps
687 back to so we can scan that after the end of the loop. */
688 if (GET_CODE (p) == JUMP_INSN)
690 loop_entry_jump = p;
692 /* Loop entry must be unconditional jump (and not a RETURN) */
693 if (any_uncondjump_p (p)
694 && JUMP_LABEL (p) != 0
695 /* Check to see whether the jump actually
696 jumps out of the loop (meaning it's no loop).
697 This case can happen for things like
698 do {..} while (0). If this label was generated previously
699 by loop, we can't tell anything about it and have to reject
700 the loop. */
701 && INSN_IN_RANGE_P (JUMP_LABEL (p), loop_start, loop_end))
703 loop->top = next_label (loop->scan_start);
704 loop->scan_start = JUMP_LABEL (p);
708 /* If LOOP->SCAN_START was an insn created by loop, we don't know its luid
709 as required by loop_reg_used_before_p. So skip such loops. (This
710 test may never be true, but it's best to play it safe.)
712 Also, skip loops where we do not start scanning at a label. This
713 test also rejects loops starting with a JUMP_INSN that failed the
714 test above. */
716 if (INSN_UID (loop->scan_start) >= max_uid_for_loop
717 || GET_CODE (loop->scan_start) != CODE_LABEL)
719 if (loop_dump_stream)
720 fprintf (loop_dump_stream, "\nLoop from %d to %d is phony.\n\n",
721 INSN_UID (loop_start), INSN_UID (loop_end));
722 return;
725 /* Allocate extra space for REGs that might be created by load_mems.
726 We allocate a little extra slop as well, in the hopes that we
727 won't have to reallocate the regs array. */
728 loop_regs_scan (loop, loop_info->mems_idx + 16);
729 insn_count = count_insns_in_loop (loop);
731 if (loop_dump_stream)
733 fprintf (loop_dump_stream, "\nLoop from %d to %d: %d real insns.\n",
734 INSN_UID (loop_start), INSN_UID (loop_end), insn_count);
735 if (loop->cont)
736 fprintf (loop_dump_stream, "Continue at insn %d.\n",
737 INSN_UID (loop->cont));
740 /* Scan through the loop finding insns that are safe to move.
741 Set REGS->ARRAY[I].SET_IN_LOOP negative for the reg I being set, so that
742 this reg will be considered invariant for subsequent insns.
743 We consider whether subsequent insns use the reg
744 in deciding whether it is worth actually moving.
746 MAYBE_NEVER is nonzero if we have passed a conditional jump insn
747 and therefore it is possible that the insns we are scanning
748 would never be executed. At such times, we must make sure
749 that it is safe to execute the insn once instead of zero times.
750 When MAYBE_NEVER is 0, all insns will be executed at least once
751 so that is not a problem. */
753 for (in_libcall = 0, p = next_insn_in_loop (loop, loop->scan_start);
754 p != NULL_RTX;
755 p = next_insn_in_loop (loop, p))
757 if (in_libcall && INSN_P (p) && find_reg_note (p, REG_RETVAL, NULL_RTX))
758 in_libcall--;
759 if (GET_CODE (p) == INSN)
761 temp = find_reg_note (p, REG_LIBCALL, NULL_RTX);
762 if (temp)
763 in_libcall++;
764 if (! in_libcall
765 && (set = single_set (p))
766 && GET_CODE (SET_DEST (set)) == REG
767 #ifdef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
768 && SET_DEST (set) != pic_offset_table_rtx
769 #endif
770 && ! regs->array[REGNO (SET_DEST (set))].may_not_optimize)
772 int tem1 = 0;
773 int tem2 = 0;
774 int move_insn = 0;
775 rtx src = SET_SRC (set);
776 rtx dependencies = 0;
778 /* Figure out what to use as a source of this insn. If a
779 REG_EQUIV note is given or if a REG_EQUAL note with a
780 constant operand is specified, use it as the source and
781 mark that we should move this insn by calling
782 emit_move_insn rather that duplicating the insn.
784 Otherwise, only use the REG_EQUAL contents if a REG_RETVAL
785 note is present. */
786 temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
787 if (temp)
788 src = XEXP (temp, 0), move_insn = 1;
789 else
791 temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
792 if (temp && CONSTANT_P (XEXP (temp, 0)))
793 src = XEXP (temp, 0), move_insn = 1;
794 if (temp && find_reg_note (p, REG_RETVAL, NULL_RTX))
796 src = XEXP (temp, 0);
797 /* A libcall block can use regs that don't appear in
798 the equivalent expression. To move the libcall,
799 we must move those regs too. */
800 dependencies = libcall_other_reg (p, src);
804 /* For parallels, add any possible uses to the depencies, as
805 we can't move the insn without resolving them first. */
806 if (GET_CODE (PATTERN (p)) == PARALLEL)
808 for (i = 0; i < XVECLEN (PATTERN (p), 0); i++)
810 rtx x = XVECEXP (PATTERN (p), 0, i);
811 if (GET_CODE (x) == USE)
812 dependencies
813 = gen_rtx_EXPR_LIST (VOIDmode, XEXP (x, 0),
814 dependencies);
818 /* Don't try to optimize a register that was made
819 by loop-optimization for an inner loop.
820 We don't know its life-span, so we can't compute
821 the benefit. */
822 if (REGNO (SET_DEST (set)) >= max_reg_before_loop)
824 else if (/* The register is used in basic blocks other
825 than the one where it is set (meaning that
826 something after this point in the loop might
827 depend on its value before the set). */
828 ! reg_in_basic_block_p (p, SET_DEST (set))
829 /* And the set is not guaranteed to be executed once
830 the loop starts, or the value before the set is
831 needed before the set occurs...
833 ??? Note we have quadratic behavior here, mitigated
834 by the fact that the previous test will often fail for
835 large loops. Rather than re-scanning the entire loop
836 each time for register usage, we should build tables
837 of the register usage and use them here instead. */
838 && (maybe_never
839 || loop_reg_used_before_p (loop, set, p)))
840 /* It is unsafe to move the set.
842 This code used to consider it OK to move a set of a variable
843 which was not created by the user and not used in an exit
844 test.
845 That behavior is incorrect and was removed. */
847 else if ((tem = loop_invariant_p (loop, src))
848 && (dependencies == 0
849 || (tem2
850 = loop_invariant_p (loop, dependencies)) != 0)
851 && (regs->array[REGNO (SET_DEST (set))].set_in_loop == 1
852 || (tem1
853 = consec_sets_invariant_p
854 (loop, SET_DEST (set),
855 regs->array[REGNO (SET_DEST (set))].set_in_loop,
856 p)))
857 /* If the insn can cause a trap (such as divide by zero),
858 can't move it unless it's guaranteed to be executed
859 once loop is entered. Even a function call might
860 prevent the trap insn from being reached
861 (since it might exit!) */
862 && ! ((maybe_never || call_passed)
863 && may_trap_p (src)))
865 struct movable *m;
866 int regno = REGNO (SET_DEST (set));
868 /* A potential lossage is where we have a case where two insns
869 can be combined as long as they are both in the loop, but
870 we move one of them outside the loop. For large loops,
871 this can lose. The most common case of this is the address
872 of a function being called.
874 Therefore, if this register is marked as being used
875 exactly once if we are in a loop with calls
876 (a "large loop"), see if we can replace the usage of
877 this register with the source of this SET. If we can,
878 delete this insn.
880 Don't do this if P has a REG_RETVAL note or if we have
881 SMALL_REGISTER_CLASSES and SET_SRC is a hard register. */
883 if (loop_info->has_call
884 && regs->array[regno].single_usage != 0
885 && regs->array[regno].single_usage != const0_rtx
886 && REGNO_FIRST_UID (regno) == INSN_UID (p)
887 && (REGNO_LAST_UID (regno)
888 == INSN_UID (regs->array[regno].single_usage))
889 && regs->array[regno].set_in_loop == 1
890 && GET_CODE (SET_SRC (set)) != ASM_OPERANDS
891 && ! side_effects_p (SET_SRC (set))
892 && ! find_reg_note (p, REG_RETVAL, NULL_RTX)
893 && (! SMALL_REGISTER_CLASSES
894 || (! (GET_CODE (SET_SRC (set)) == REG
895 && (REGNO (SET_SRC (set))
896 < FIRST_PSEUDO_REGISTER))))
897 /* This test is not redundant; SET_SRC (set) might be
898 a call-clobbered register and the life of REGNO
899 might span a call. */
900 && ! modified_between_p (SET_SRC (set), p,
901 regs->array[regno].single_usage)
902 && no_labels_between_p (p,
903 regs->array[regno].single_usage)
904 && validate_replace_rtx (SET_DEST (set), SET_SRC (set),
905 regs->array[regno].single_usage))
907 /* Replace any usage in a REG_EQUAL note. Must copy
908 the new source, so that we don't get rtx sharing
909 between the SET_SOURCE and REG_NOTES of insn p. */
910 REG_NOTES (regs->array[regno].single_usage)
911 = (replace_rtx
912 (REG_NOTES (regs->array[regno].single_usage),
913 SET_DEST (set), copy_rtx (SET_SRC (set))));
915 delete_insn (p);
916 for (i = 0; i < LOOP_REGNO_NREGS (regno, SET_DEST (set));
917 i++)
918 regs->array[regno+i].set_in_loop = 0;
919 continue;
922 m = (struct movable *) xmalloc (sizeof (struct movable));
923 m->next = 0;
924 m->insn = p;
925 m->set_src = src;
926 m->dependencies = dependencies;
927 m->set_dest = SET_DEST (set);
928 m->force = 0;
929 m->consec
930 = regs->array[REGNO (SET_DEST (set))].set_in_loop - 1;
931 m->done = 0;
932 m->forces = 0;
933 m->partial = 0;
934 m->move_insn = move_insn;
935 m->move_insn_first = 0;
936 m->is_equiv = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
937 m->savemode = VOIDmode;
938 m->regno = regno;
939 /* Set M->cond if either loop_invariant_p
940 or consec_sets_invariant_p returned 2
941 (only conditionally invariant). */
942 m->cond = ((tem | tem1 | tem2) > 1);
943 m->global = LOOP_REG_GLOBAL_P (loop, regno);
944 m->match = 0;
945 m->lifetime = LOOP_REG_LIFETIME (loop, regno);
946 m->savings = regs->array[regno].n_times_set;
947 if (find_reg_note (p, REG_RETVAL, NULL_RTX))
948 m->savings += libcall_benefit (p);
949 for (i = 0; i < LOOP_REGNO_NREGS (regno, SET_DEST (set)); i++)
950 regs->array[regno+i].set_in_loop = move_insn ? -2 : -1;
951 /* Add M to the end of the chain MOVABLES. */
952 loop_movables_add (movables, m);
954 if (m->consec > 0)
956 /* It is possible for the first instruction to have a
957 REG_EQUAL note but a non-invariant SET_SRC, so we must
958 remember the status of the first instruction in case
959 the last instruction doesn't have a REG_EQUAL note. */
960 m->move_insn_first = m->move_insn;
962 /* Skip this insn, not checking REG_LIBCALL notes. */
963 p = next_nonnote_insn (p);
964 /* Skip the consecutive insns, if there are any. */
965 p = skip_consec_insns (p, m->consec);
966 /* Back up to the last insn of the consecutive group. */
967 p = prev_nonnote_insn (p);
969 /* We must now reset m->move_insn, m->is_equiv, and
970 possibly m->set_src to correspond to the effects of
971 all the insns. */
972 temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
973 if (temp)
974 m->set_src = XEXP (temp, 0), m->move_insn = 1;
975 else
977 temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
978 if (temp && CONSTANT_P (XEXP (temp, 0)))
979 m->set_src = XEXP (temp, 0), m->move_insn = 1;
980 else
981 m->move_insn = 0;
984 m->is_equiv
985 = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
988 /* If this register is always set within a STRICT_LOW_PART
989 or set to zero, then its high bytes are constant.
990 So clear them outside the loop and within the loop
991 just load the low bytes.
992 We must check that the machine has an instruction to do so.
993 Also, if the value loaded into the register
994 depends on the same register, this cannot be done. */
995 else if (SET_SRC (set) == const0_rtx
996 && GET_CODE (NEXT_INSN (p)) == INSN
997 && (set1 = single_set (NEXT_INSN (p)))
998 && GET_CODE (set1) == SET
999 && (GET_CODE (SET_DEST (set1)) == STRICT_LOW_PART)
1000 && (GET_CODE (XEXP (SET_DEST (set1), 0)) == SUBREG)
1001 && (SUBREG_REG (XEXP (SET_DEST (set1), 0))
1002 == SET_DEST (set))
1003 && !reg_mentioned_p (SET_DEST (set), SET_SRC (set1)))
1005 int regno = REGNO (SET_DEST (set));
1006 if (regs->array[regno].set_in_loop == 2)
1008 struct movable *m;
1009 m = (struct movable *) xmalloc (sizeof (struct movable));
1010 m->next = 0;
1011 m->insn = p;
1012 m->set_dest = SET_DEST (set);
1013 m->dependencies = 0;
1014 m->force = 0;
1015 m->consec = 0;
1016 m->done = 0;
1017 m->forces = 0;
1018 m->move_insn = 0;
1019 m->move_insn_first = 0;
1020 m->partial = 1;
1021 /* If the insn may not be executed on some cycles,
1022 we can't clear the whole reg; clear just high part.
1023 Not even if the reg is used only within this loop.
1024 Consider this:
1025 while (1)
1026 while (s != t) {
1027 if (foo ()) x = *s;
1028 use (x);
1030 Clearing x before the inner loop could clobber a value
1031 being saved from the last time around the outer loop.
1032 However, if the reg is not used outside this loop
1033 and all uses of the register are in the same
1034 basic block as the store, there is no problem.
1036 If this insn was made by loop, we don't know its
1037 INSN_LUID and hence must make a conservative
1038 assumption. */
1039 m->global = (INSN_UID (p) >= max_uid_for_loop
1040 || LOOP_REG_GLOBAL_P (loop, regno)
1041 || (labels_in_range_p
1042 (p, REGNO_FIRST_LUID (regno))));
1043 if (maybe_never && m->global)
1044 m->savemode = GET_MODE (SET_SRC (set1));
1045 else
1046 m->savemode = VOIDmode;
1047 m->regno = regno;
1048 m->cond = 0;
1049 m->match = 0;
1050 m->lifetime = LOOP_REG_LIFETIME (loop, regno);
1051 m->savings = 1;
1052 for (i = 0;
1053 i < LOOP_REGNO_NREGS (regno, SET_DEST (set));
1054 i++)
1055 regs->array[regno+i].set_in_loop = -1;
1056 /* Add M to the end of the chain MOVABLES. */
1057 loop_movables_add (movables, m);
1062 /* Past a call insn, we get to insns which might not be executed
1063 because the call might exit. This matters for insns that trap.
1064 Constant and pure call insns always return, so they don't count. */
1065 else if (GET_CODE (p) == CALL_INSN && ! CONST_OR_PURE_CALL_P (p))
1066 call_passed = 1;
1067 /* Past a label or a jump, we get to insns for which we
1068 can't count on whether or how many times they will be
1069 executed during each iteration. Therefore, we can
1070 only move out sets of trivial variables
1071 (those not used after the loop). */
1072 /* Similar code appears twice in strength_reduce. */
1073 else if ((GET_CODE (p) == CODE_LABEL || GET_CODE (p) == JUMP_INSN)
1074 /* If we enter the loop in the middle, and scan around to the
1075 beginning, don't set maybe_never for that. This must be an
1076 unconditional jump, otherwise the code at the top of the
1077 loop might never be executed. Unconditional jumps are
1078 followed by a barrier then the loop_end. */
1079 && ! (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p) == loop->top
1080 && NEXT_INSN (NEXT_INSN (p)) == loop_end
1081 && any_uncondjump_p (p)))
1082 maybe_never = 1;
1083 else if (GET_CODE (p) == NOTE)
1085 /* At the virtual top of a converted loop, insns are again known to
1086 be executed: logically, the loop begins here even though the exit
1087 code has been duplicated. */
1088 if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_VTOP && loop_depth == 0)
1089 maybe_never = call_passed = 0;
1090 else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
1091 loop_depth++;
1092 else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END)
1093 loop_depth--;
1097 /* If one movable subsumes another, ignore that other. */
1099 ignore_some_movables (movables);
1101 /* For each movable insn, see if the reg that it loads
1102 leads when it dies right into another conditionally movable insn.
1103 If so, record that the second insn "forces" the first one,
1104 since the second can be moved only if the first is. */
1106 force_movables (movables);
1108 /* See if there are multiple movable insns that load the same value.
1109 If there are, make all but the first point at the first one
1110 through the `match' field, and add the priorities of them
1111 all together as the priority of the first. */
1113 combine_movables (movables, regs);
1115 /* Now consider each movable insn to decide whether it is worth moving.
1116 Store 0 in regs->array[I].set_in_loop for each reg I that is moved.
1118 Generally this increases code size, so do not move moveables when
1119 optimizing for code size. */
1121 if (! optimize_size)
1123 move_movables (loop, movables, threshold, insn_count);
1125 /* Recalculate regs->array if move_movables has created new
1126 registers. */
1127 if (max_reg_num () > regs->num)
1129 loop_regs_scan (loop, 0);
1130 for (update_start = loop_start;
1131 PREV_INSN (update_start)
1132 && GET_CODE (PREV_INSN (update_start)) != CODE_LABEL;
1133 update_start = PREV_INSN (update_start))
1135 update_end = NEXT_INSN (loop_end);
1137 reg_scan_update (update_start, update_end, loop_max_reg);
1138 loop_max_reg = max_reg_num ();
1142 /* Now candidates that still are negative are those not moved.
1143 Change regs->array[I].set_in_loop to indicate that those are not actually
1144 invariant. */
1145 for (i = 0; i < regs->num; i++)
1146 if (regs->array[i].set_in_loop < 0)
1147 regs->array[i].set_in_loop = regs->array[i].n_times_set;
1149 /* Now that we've moved some things out of the loop, we might be able to
1150 hoist even more memory references. */
1151 load_mems (loop);
1153 /* Recalculate regs->array if load_mems has created new registers. */
1154 if (max_reg_num () > regs->num)
1155 loop_regs_scan (loop, 0);
1157 for (update_start = loop_start;
1158 PREV_INSN (update_start)
1159 && GET_CODE (PREV_INSN (update_start)) != CODE_LABEL;
1160 update_start = PREV_INSN (update_start))
1162 update_end = NEXT_INSN (loop_end);
1164 reg_scan_update (update_start, update_end, loop_max_reg);
1165 loop_max_reg = max_reg_num ();
1167 if (flag_strength_reduce)
1169 if (update_end && GET_CODE (update_end) == CODE_LABEL)
1170 /* Ensure our label doesn't go away. */
1171 LABEL_NUSES (update_end)++;
1173 strength_reduce (loop, flags);
1175 reg_scan_update (update_start, update_end, loop_max_reg);
1176 loop_max_reg = max_reg_num ();
1178 if (update_end && GET_CODE (update_end) == CODE_LABEL
1179 && --LABEL_NUSES (update_end) == 0)
1180 delete_related_insns (update_end);
1184 /* The movable information is required for strength reduction. */
1185 loop_movables_free (movables);
1187 free (regs->array);
1188 regs->array = 0;
1189 regs->num = 0;
1192 /* Add elements to *OUTPUT to record all the pseudo-regs
1193 mentioned in IN_THIS but not mentioned in NOT_IN_THIS. */
1195 void
1196 record_excess_regs (in_this, not_in_this, output)
1197 rtx in_this, not_in_this;
1198 rtx *output;
1200 enum rtx_code code;
1201 const char *fmt;
1202 int i;
1204 code = GET_CODE (in_this);
1206 switch (code)
1208 case PC:
1209 case CC0:
1210 case CONST_INT:
1211 case CONST_DOUBLE:
1212 case CONST:
1213 case SYMBOL_REF:
1214 case LABEL_REF:
1215 return;
1217 case REG:
1218 if (REGNO (in_this) >= FIRST_PSEUDO_REGISTER
1219 && ! reg_mentioned_p (in_this, not_in_this))
1220 *output = gen_rtx_EXPR_LIST (VOIDmode, in_this, *output);
1221 return;
1223 default:
1224 break;
1227 fmt = GET_RTX_FORMAT (code);
1228 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1230 int j;
1232 switch (fmt[i])
1234 case 'E':
1235 for (j = 0; j < XVECLEN (in_this, i); j++)
1236 record_excess_regs (XVECEXP (in_this, i, j), not_in_this, output);
1237 break;
1239 case 'e':
1240 record_excess_regs (XEXP (in_this, i), not_in_this, output);
1241 break;
1246 /* Check what regs are referred to in the libcall block ending with INSN,
1247 aside from those mentioned in the equivalent value.
1248 If there are none, return 0.
1249 If there are one or more, return an EXPR_LIST containing all of them. */
1252 libcall_other_reg (insn, equiv)
1253 rtx insn, equiv;
1255 rtx note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
1256 rtx p = XEXP (note, 0);
1257 rtx output = 0;
1259 /* First, find all the regs used in the libcall block
1260 that are not mentioned as inputs to the result. */
1262 while (p != insn)
1264 if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
1265 || GET_CODE (p) == CALL_INSN)
1266 record_excess_regs (PATTERN (p), equiv, &output);
1267 p = NEXT_INSN (p);
1270 return output;
1273 /* Return 1 if all uses of REG
1274 are between INSN and the end of the basic block. */
1276 static int
1277 reg_in_basic_block_p (insn, reg)
1278 rtx insn, reg;
1280 int regno = REGNO (reg);
1281 rtx p;
1283 if (REGNO_FIRST_UID (regno) != INSN_UID (insn))
1284 return 0;
1286 /* Search this basic block for the already recorded last use of the reg. */
1287 for (p = insn; p; p = NEXT_INSN (p))
1289 switch (GET_CODE (p))
1291 case NOTE:
1292 break;
1294 case INSN:
1295 case CALL_INSN:
1296 /* Ordinary insn: if this is the last use, we win. */
1297 if (REGNO_LAST_UID (regno) == INSN_UID (p))
1298 return 1;
1299 break;
1301 case JUMP_INSN:
1302 /* Jump insn: if this is the last use, we win. */
1303 if (REGNO_LAST_UID (regno) == INSN_UID (p))
1304 return 1;
1305 /* Otherwise, it's the end of the basic block, so we lose. */
1306 return 0;
1308 case CODE_LABEL:
1309 case BARRIER:
1310 /* It's the end of the basic block, so we lose. */
1311 return 0;
1313 default:
1314 break;
1318 /* The "last use" that was recorded can't be found after the first
1319 use. This can happen when the last use was deleted while
1320 processing an inner loop, this inner loop was then completely
1321 unrolled, and the outer loop is always exited after the inner loop,
1322 so that everything after the first use becomes a single basic block. */
1323 return 1;
1326 /* Compute the benefit of eliminating the insns in the block whose
1327 last insn is LAST. This may be a group of insns used to compute a
1328 value directly or can contain a library call. */
1330 static int
1331 libcall_benefit (last)
1332 rtx last;
1334 rtx insn;
1335 int benefit = 0;
1337 for (insn = XEXP (find_reg_note (last, REG_RETVAL, NULL_RTX), 0);
1338 insn != last; insn = NEXT_INSN (insn))
1340 if (GET_CODE (insn) == CALL_INSN)
1341 benefit += 10; /* Assume at least this many insns in a library
1342 routine. */
1343 else if (GET_CODE (insn) == INSN
1344 && GET_CODE (PATTERN (insn)) != USE
1345 && GET_CODE (PATTERN (insn)) != CLOBBER)
1346 benefit++;
1349 return benefit;
1352 /* Skip COUNT insns from INSN, counting library calls as 1 insn. */
1354 static rtx
1355 skip_consec_insns (insn, count)
1356 rtx insn;
1357 int count;
1359 for (; count > 0; count--)
1361 rtx temp;
1363 /* If first insn of libcall sequence, skip to end. */
1364 /* Do this at start of loop, since INSN is guaranteed to
1365 be an insn here. */
1366 if (GET_CODE (insn) != NOTE
1367 && (temp = find_reg_note (insn, REG_LIBCALL, NULL_RTX)))
1368 insn = XEXP (temp, 0);
1371 insn = NEXT_INSN (insn);
1372 while (GET_CODE (insn) == NOTE);
1375 return insn;
1378 /* Ignore any movable whose insn falls within a libcall
1379 which is part of another movable.
1380 We make use of the fact that the movable for the libcall value
1381 was made later and so appears later on the chain. */
1383 static void
1384 ignore_some_movables (movables)
1385 struct loop_movables *movables;
1387 struct movable *m, *m1;
1389 for (m = movables->head; m; m = m->next)
1391 /* Is this a movable for the value of a libcall? */
1392 rtx note = find_reg_note (m->insn, REG_RETVAL, NULL_RTX);
1393 if (note)
1395 rtx insn;
1396 /* Check for earlier movables inside that range,
1397 and mark them invalid. We cannot use LUIDs here because
1398 insns created by loop.c for prior loops don't have LUIDs.
1399 Rather than reject all such insns from movables, we just
1400 explicitly check each insn in the libcall (since invariant
1401 libcalls aren't that common). */
1402 for (insn = XEXP (note, 0); insn != m->insn; insn = NEXT_INSN (insn))
1403 for (m1 = movables->head; m1 != m; m1 = m1->next)
1404 if (m1->insn == insn)
1405 m1->done = 1;
1410 /* For each movable insn, see if the reg that it loads
1411 leads when it dies right into another conditionally movable insn.
1412 If so, record that the second insn "forces" the first one,
1413 since the second can be moved only if the first is. */
1415 static void
1416 force_movables (movables)
1417 struct loop_movables *movables;
1419 struct movable *m, *m1;
1421 for (m1 = movables->head; m1; m1 = m1->next)
1422 /* Omit this if moving just the (SET (REG) 0) of a zero-extend. */
1423 if (!m1->partial && !m1->done)
1425 int regno = m1->regno;
1426 for (m = m1->next; m; m = m->next)
1427 /* ??? Could this be a bug? What if CSE caused the
1428 register of M1 to be used after this insn?
1429 Since CSE does not update regno_last_uid,
1430 this insn M->insn might not be where it dies.
1431 But very likely this doesn't matter; what matters is
1432 that M's reg is computed from M1's reg. */
1433 if (INSN_UID (m->insn) == REGNO_LAST_UID (regno)
1434 && !m->done)
1435 break;
1436 if (m != 0 && m->set_src == m1->set_dest
1437 /* If m->consec, m->set_src isn't valid. */
1438 && m->consec == 0)
1439 m = 0;
1441 /* Increase the priority of the moving the first insn
1442 since it permits the second to be moved as well. */
1443 if (m != 0)
1445 m->forces = m1;
1446 m1->lifetime += m->lifetime;
1447 m1->savings += m->savings;
1452 /* Find invariant expressions that are equal and can be combined into
1453 one register. */
1455 static void
1456 combine_movables (movables, regs)
1457 struct loop_movables *movables;
1458 struct loop_regs *regs;
1460 struct movable *m;
1461 char *matched_regs = (char *) xmalloc (regs->num);
1462 enum machine_mode mode;
1464 /* Regs that are set more than once are not allowed to match
1465 or be matched. I'm no longer sure why not. */
1466 /* Only pseudo registers are allowed to match or be matched,
1467 since move_movables does not validate the change. */
1468 /* Perhaps testing m->consec_sets would be more appropriate here? */
1470 for (m = movables->head; m; m = m->next)
1471 if (m->match == 0 && regs->array[m->regno].n_times_set == 1
1472 && m->regno >= FIRST_PSEUDO_REGISTER
1473 && !m->partial)
1475 struct movable *m1;
1476 int regno = m->regno;
1478 memset (matched_regs, 0, regs->num);
1479 matched_regs[regno] = 1;
1481 /* We want later insns to match the first one. Don't make the first
1482 one match any later ones. So start this loop at m->next. */
1483 for (m1 = m->next; m1; m1 = m1->next)
1484 if (m != m1 && m1->match == 0
1485 && regs->array[m1->regno].n_times_set == 1
1486 && m1->regno >= FIRST_PSEUDO_REGISTER
1487 /* A reg used outside the loop mustn't be eliminated. */
1488 && !m1->global
1489 /* A reg used for zero-extending mustn't be eliminated. */
1490 && !m1->partial
1491 && (matched_regs[m1->regno]
1494 /* Can combine regs with different modes loaded from the
1495 same constant only if the modes are the same or
1496 if both are integer modes with M wider or the same
1497 width as M1. The check for integer is redundant, but
1498 safe, since the only case of differing destination
1499 modes with equal sources is when both sources are
1500 VOIDmode, i.e., CONST_INT. */
1501 (GET_MODE (m->set_dest) == GET_MODE (m1->set_dest)
1502 || (GET_MODE_CLASS (GET_MODE (m->set_dest)) == MODE_INT
1503 && GET_MODE_CLASS (GET_MODE (m1->set_dest)) == MODE_INT
1504 && (GET_MODE_BITSIZE (GET_MODE (m->set_dest))
1505 >= GET_MODE_BITSIZE (GET_MODE (m1->set_dest)))))
1506 /* See if the source of M1 says it matches M. */
1507 && ((GET_CODE (m1->set_src) == REG
1508 && matched_regs[REGNO (m1->set_src)])
1509 || rtx_equal_for_loop_p (m->set_src, m1->set_src,
1510 movables, regs))))
1511 && ((m->dependencies == m1->dependencies)
1512 || rtx_equal_p (m->dependencies, m1->dependencies)))
1514 m->lifetime += m1->lifetime;
1515 m->savings += m1->savings;
1516 m1->done = 1;
1517 m1->match = m;
1518 matched_regs[m1->regno] = 1;
1522 /* Now combine the regs used for zero-extension.
1523 This can be done for those not marked `global'
1524 provided their lives don't overlap. */
1526 for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
1527 mode = GET_MODE_WIDER_MODE (mode))
1529 struct movable *m0 = 0;
1531 /* Combine all the registers for extension from mode MODE.
1532 Don't combine any that are used outside this loop. */
1533 for (m = movables->head; m; m = m->next)
1534 if (m->partial && ! m->global
1535 && mode == GET_MODE (SET_SRC (PATTERN (NEXT_INSN (m->insn)))))
1537 struct movable *m1;
1539 int first = REGNO_FIRST_LUID (m->regno);
1540 int last = REGNO_LAST_LUID (m->regno);
1542 if (m0 == 0)
1544 /* First one: don't check for overlap, just record it. */
1545 m0 = m;
1546 continue;
1549 /* Make sure they extend to the same mode.
1550 (Almost always true.) */
1551 if (GET_MODE (m->set_dest) != GET_MODE (m0->set_dest))
1552 continue;
1554 /* We already have one: check for overlap with those
1555 already combined together. */
1556 for (m1 = movables->head; m1 != m; m1 = m1->next)
1557 if (m1 == m0 || (m1->partial && m1->match == m0))
1558 if (! (REGNO_FIRST_LUID (m1->regno) > last
1559 || REGNO_LAST_LUID (m1->regno) < first))
1560 goto overlap;
1562 /* No overlap: we can combine this with the others. */
1563 m0->lifetime += m->lifetime;
1564 m0->savings += m->savings;
1565 m->done = 1;
1566 m->match = m0;
1568 overlap:
1573 /* Clean up. */
1574 free (matched_regs);
1577 /* Returns the number of movable instructions in LOOP that were not
1578 moved outside the loop. */
1580 static int
1581 num_unmoved_movables (loop)
1582 const struct loop *loop;
1584 int num = 0;
1585 struct movable *m;
1587 for (m = LOOP_MOVABLES (loop)->head; m; m = m->next)
1588 if (!m->done)
1589 ++num;
1591 return num;
1595 /* Return 1 if regs X and Y will become the same if moved. */
1597 static int
1598 regs_match_p (x, y, movables)
1599 rtx x, y;
1600 struct loop_movables *movables;
1602 unsigned int xn = REGNO (x);
1603 unsigned int yn = REGNO (y);
1604 struct movable *mx, *my;
1606 for (mx = movables->head; mx; mx = mx->next)
1607 if (mx->regno == xn)
1608 break;
1610 for (my = movables->head; my; my = my->next)
1611 if (my->regno == yn)
1612 break;
1614 return (mx && my
1615 && ((mx->match == my->match && mx->match != 0)
1616 || mx->match == my
1617 || mx == my->match));
1620 /* Return 1 if X and Y are identical-looking rtx's.
1621 This is the Lisp function EQUAL for rtx arguments.
1623 If two registers are matching movables or a movable register and an
1624 equivalent constant, consider them equal. */
1626 static int
1627 rtx_equal_for_loop_p (x, y, movables, regs)
1628 rtx x, y;
1629 struct loop_movables *movables;
1630 struct loop_regs *regs;
1632 int i;
1633 int j;
1634 struct movable *m;
1635 enum rtx_code code;
1636 const char *fmt;
1638 if (x == y)
1639 return 1;
1640 if (x == 0 || y == 0)
1641 return 0;
1643 code = GET_CODE (x);
1645 /* If we have a register and a constant, they may sometimes be
1646 equal. */
1647 if (GET_CODE (x) == REG && regs->array[REGNO (x)].set_in_loop == -2
1648 && CONSTANT_P (y))
1650 for (m = movables->head; m; m = m->next)
1651 if (m->move_insn && m->regno == REGNO (x)
1652 && rtx_equal_p (m->set_src, y))
1653 return 1;
1655 else if (GET_CODE (y) == REG && regs->array[REGNO (y)].set_in_loop == -2
1656 && CONSTANT_P (x))
1658 for (m = movables->head; m; m = m->next)
1659 if (m->move_insn && m->regno == REGNO (y)
1660 && rtx_equal_p (m->set_src, x))
1661 return 1;
1664 /* Otherwise, rtx's of different codes cannot be equal. */
1665 if (code != GET_CODE (y))
1666 return 0;
1668 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
1669 (REG:SI x) and (REG:HI x) are NOT equivalent. */
1671 if (GET_MODE (x) != GET_MODE (y))
1672 return 0;
1674 /* These three types of rtx's can be compared nonrecursively. */
1675 if (code == REG)
1676 return (REGNO (x) == REGNO (y) || regs_match_p (x, y, movables));
1678 if (code == LABEL_REF)
1679 return XEXP (x, 0) == XEXP (y, 0);
1680 if (code == SYMBOL_REF)
1681 return XSTR (x, 0) == XSTR (y, 0);
1683 /* Compare the elements. If any pair of corresponding elements
1684 fail to match, return 0 for the whole things. */
1686 fmt = GET_RTX_FORMAT (code);
1687 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1689 switch (fmt[i])
1691 case 'w':
1692 if (XWINT (x, i) != XWINT (y, i))
1693 return 0;
1694 break;
1696 case 'i':
1697 if (XINT (x, i) != XINT (y, i))
1698 return 0;
1699 break;
1701 case 'E':
1702 /* Two vectors must have the same length. */
1703 if (XVECLEN (x, i) != XVECLEN (y, i))
1704 return 0;
1706 /* And the corresponding elements must match. */
1707 for (j = 0; j < XVECLEN (x, i); j++)
1708 if (rtx_equal_for_loop_p (XVECEXP (x, i, j), XVECEXP (y, i, j),
1709 movables, regs) == 0)
1710 return 0;
1711 break;
1713 case 'e':
1714 if (rtx_equal_for_loop_p (XEXP (x, i), XEXP (y, i), movables, regs)
1715 == 0)
1716 return 0;
1717 break;
1719 case 's':
1720 if (strcmp (XSTR (x, i), XSTR (y, i)))
1721 return 0;
1722 break;
1724 case 'u':
1725 /* These are just backpointers, so they don't matter. */
1726 break;
1728 case '0':
1729 break;
1731 /* It is believed that rtx's at this level will never
1732 contain anything but integers and other rtx's,
1733 except for within LABEL_REFs and SYMBOL_REFs. */
1734 default:
1735 abort ();
1738 return 1;
1741 /* If X contains any LABEL_REF's, add REG_LABEL notes for them to all
1742 insns in INSNS which use the reference. LABEL_NUSES for CODE_LABEL
1743 references is incremented once for each added note. */
1745 static void
1746 add_label_notes (x, insns)
1747 rtx x;
1748 rtx insns;
1750 enum rtx_code code = GET_CODE (x);
1751 int i, j;
1752 const char *fmt;
1753 rtx insn;
1755 if (code == LABEL_REF && !LABEL_REF_NONLOCAL_P (x))
1757 /* This code used to ignore labels that referred to dispatch tables to
1758 avoid flow generating (slighly) worse code.
1760 We no longer ignore such label references (see LABEL_REF handling in
1761 mark_jump_label for additional information). */
1762 for (insn = insns; insn; insn = NEXT_INSN (insn))
1763 if (reg_mentioned_p (XEXP (x, 0), insn))
1765 REG_NOTES (insn) = gen_rtx_INSN_LIST (REG_LABEL, XEXP (x, 0),
1766 REG_NOTES (insn));
1767 if (LABEL_P (XEXP (x, 0)))
1768 LABEL_NUSES (XEXP (x, 0))++;
1772 fmt = GET_RTX_FORMAT (code);
1773 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1775 if (fmt[i] == 'e')
1776 add_label_notes (XEXP (x, i), insns);
1777 else if (fmt[i] == 'E')
1778 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1779 add_label_notes (XVECEXP (x, i, j), insns);
1783 /* Scan MOVABLES, and move the insns that deserve to be moved.
1784 If two matching movables are combined, replace one reg with the
1785 other throughout. */
1787 static void
1788 move_movables (loop, movables, threshold, insn_count)
1789 struct loop *loop;
1790 struct loop_movables *movables;
1791 int threshold;
1792 int insn_count;
1794 struct loop_regs *regs = LOOP_REGS (loop);
1795 int nregs = regs->num;
1796 rtx new_start = 0;
1797 struct movable *m;
1798 rtx p;
1799 rtx loop_start = loop->start;
1800 rtx loop_end = loop->end;
1801 /* Map of pseudo-register replacements to handle combining
1802 when we move several insns that load the same value
1803 into different pseudo-registers. */
1804 rtx *reg_map = (rtx *) xcalloc (nregs, sizeof (rtx));
1805 char *already_moved = (char *) xcalloc (nregs, sizeof (char));
1807 for (m = movables->head; m; m = m->next)
1809 /* Describe this movable insn. */
1811 if (loop_dump_stream)
1813 fprintf (loop_dump_stream, "Insn %d: regno %d (life %d), ",
1814 INSN_UID (m->insn), m->regno, m->lifetime);
1815 if (m->consec > 0)
1816 fprintf (loop_dump_stream, "consec %d, ", m->consec);
1817 if (m->cond)
1818 fprintf (loop_dump_stream, "cond ");
1819 if (m->force)
1820 fprintf (loop_dump_stream, "force ");
1821 if (m->global)
1822 fprintf (loop_dump_stream, "global ");
1823 if (m->done)
1824 fprintf (loop_dump_stream, "done ");
1825 if (m->move_insn)
1826 fprintf (loop_dump_stream, "move-insn ");
1827 if (m->match)
1828 fprintf (loop_dump_stream, "matches %d ",
1829 INSN_UID (m->match->insn));
1830 if (m->forces)
1831 fprintf (loop_dump_stream, "forces %d ",
1832 INSN_UID (m->forces->insn));
1835 /* Ignore the insn if it's already done (it matched something else).
1836 Otherwise, see if it is now safe to move. */
1838 if (!m->done
1839 && (! m->cond
1840 || (1 == loop_invariant_p (loop, m->set_src)
1841 && (m->dependencies == 0
1842 || 1 == loop_invariant_p (loop, m->dependencies))
1843 && (m->consec == 0
1844 || 1 == consec_sets_invariant_p (loop, m->set_dest,
1845 m->consec + 1,
1846 m->insn))))
1847 && (! m->forces || m->forces->done))
1849 int regno;
1850 rtx p;
1851 int savings = m->savings;
1853 /* We have an insn that is safe to move.
1854 Compute its desirability. */
1856 p = m->insn;
1857 regno = m->regno;
1859 if (loop_dump_stream)
1860 fprintf (loop_dump_stream, "savings %d ", savings);
1862 if (regs->array[regno].moved_once && loop_dump_stream)
1863 fprintf (loop_dump_stream, "halved since already moved ");
1865 /* An insn MUST be moved if we already moved something else
1866 which is safe only if this one is moved too: that is,
1867 if already_moved[REGNO] is nonzero. */
1869 /* An insn is desirable to move if the new lifetime of the
1870 register is no more than THRESHOLD times the old lifetime.
1871 If it's not desirable, it means the loop is so big
1872 that moving won't speed things up much,
1873 and it is liable to make register usage worse. */
1875 /* It is also desirable to move if it can be moved at no
1876 extra cost because something else was already moved. */
1878 if (already_moved[regno]
1879 || flag_move_all_movables
1880 || (threshold * savings * m->lifetime) >=
1881 (regs->array[regno].moved_once ? insn_count * 2 : insn_count)
1882 || (m->forces && m->forces->done
1883 && regs->array[m->forces->regno].n_times_set == 1))
1885 int count;
1886 struct movable *m1;
1887 rtx first = NULL_RTX;
1889 /* Now move the insns that set the reg. */
1891 if (m->partial && m->match)
1893 rtx newpat, i1;
1894 rtx r1, r2;
1895 /* Find the end of this chain of matching regs.
1896 Thus, we load each reg in the chain from that one reg.
1897 And that reg is loaded with 0 directly,
1898 since it has ->match == 0. */
1899 for (m1 = m; m1->match; m1 = m1->match);
1900 newpat = gen_move_insn (SET_DEST (PATTERN (m->insn)),
1901 SET_DEST (PATTERN (m1->insn)));
1902 i1 = loop_insn_hoist (loop, newpat);
1904 /* Mark the moved, invariant reg as being allowed to
1905 share a hard reg with the other matching invariant. */
1906 REG_NOTES (i1) = REG_NOTES (m->insn);
1907 r1 = SET_DEST (PATTERN (m->insn));
1908 r2 = SET_DEST (PATTERN (m1->insn));
1909 regs_may_share
1910 = gen_rtx_EXPR_LIST (VOIDmode, r1,
1911 gen_rtx_EXPR_LIST (VOIDmode, r2,
1912 regs_may_share));
1913 delete_insn (m->insn);
1915 if (new_start == 0)
1916 new_start = i1;
1918 if (loop_dump_stream)
1919 fprintf (loop_dump_stream, " moved to %d", INSN_UID (i1));
1921 /* If we are to re-generate the item being moved with a
1922 new move insn, first delete what we have and then emit
1923 the move insn before the loop. */
1924 else if (m->move_insn)
1926 rtx i1, temp, seq;
1928 for (count = m->consec; count >= 0; count--)
1930 /* If this is the first insn of a library call sequence,
1931 something is very wrong. */
1932 if (GET_CODE (p) != NOTE
1933 && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
1934 abort ();
1936 /* If this is the last insn of a libcall sequence, then
1937 delete every insn in the sequence except the last.
1938 The last insn is handled in the normal manner. */
1939 if (GET_CODE (p) != NOTE
1940 && (temp = find_reg_note (p, REG_RETVAL, NULL_RTX)))
1942 temp = XEXP (temp, 0);
1943 while (temp != p)
1944 temp = delete_insn (temp);
1947 temp = p;
1948 p = delete_insn (p);
1950 /* simplify_giv_expr expects that it can walk the insns
1951 at m->insn forwards and see this old sequence we are
1952 tossing here. delete_insn does preserve the next
1953 pointers, but when we skip over a NOTE we must fix
1954 it up. Otherwise that code walks into the non-deleted
1955 insn stream. */
1956 while (p && GET_CODE (p) == NOTE)
1957 p = NEXT_INSN (temp) = NEXT_INSN (p);
1960 start_sequence ();
1961 emit_move_insn (m->set_dest, m->set_src);
1962 seq = get_insns ();
1963 end_sequence ();
1965 add_label_notes (m->set_src, seq);
1967 i1 = loop_insn_hoist (loop, seq);
1968 if (! find_reg_note (i1, REG_EQUAL, NULL_RTX))
1969 set_unique_reg_note (i1,
1970 m->is_equiv ? REG_EQUIV : REG_EQUAL,
1971 m->set_src);
1973 if (loop_dump_stream)
1974 fprintf (loop_dump_stream, " moved to %d", INSN_UID (i1));
1976 /* The more regs we move, the less we like moving them. */
1977 threshold -= 3;
1979 else
1981 for (count = m->consec; count >= 0; count--)
1983 rtx i1, temp;
1985 /* If first insn of libcall sequence, skip to end. */
1986 /* Do this at start of loop, since p is guaranteed to
1987 be an insn here. */
1988 if (GET_CODE (p) != NOTE
1989 && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
1990 p = XEXP (temp, 0);
1992 /* If last insn of libcall sequence, move all
1993 insns except the last before the loop. The last
1994 insn is handled in the normal manner. */
1995 if (GET_CODE (p) != NOTE
1996 && (temp = find_reg_note (p, REG_RETVAL, NULL_RTX)))
1998 rtx fn_address = 0;
1999 rtx fn_reg = 0;
2000 rtx fn_address_insn = 0;
2002 first = 0;
2003 for (temp = XEXP (temp, 0); temp != p;
2004 temp = NEXT_INSN (temp))
2006 rtx body;
2007 rtx n;
2008 rtx next;
2010 if (GET_CODE (temp) == NOTE)
2011 continue;
2013 body = PATTERN (temp);
2015 /* Find the next insn after TEMP,
2016 not counting USE or NOTE insns. */
2017 for (next = NEXT_INSN (temp); next != p;
2018 next = NEXT_INSN (next))
2019 if (! (GET_CODE (next) == INSN
2020 && GET_CODE (PATTERN (next)) == USE)
2021 && GET_CODE (next) != NOTE)
2022 break;
2024 /* If that is the call, this may be the insn
2025 that loads the function address.
2027 Extract the function address from the insn
2028 that loads it into a register.
2029 If this insn was cse'd, we get incorrect code.
2031 So emit a new move insn that copies the
2032 function address into the register that the
2033 call insn will use. flow.c will delete any
2034 redundant stores that we have created. */
2035 if (GET_CODE (next) == CALL_INSN
2036 && GET_CODE (body) == SET
2037 && GET_CODE (SET_DEST (body)) == REG
2038 && (n = find_reg_note (temp, REG_EQUAL,
2039 NULL_RTX)))
2041 fn_reg = SET_SRC (body);
2042 if (GET_CODE (fn_reg) != REG)
2043 fn_reg = SET_DEST (body);
2044 fn_address = XEXP (n, 0);
2045 fn_address_insn = temp;
2047 /* We have the call insn.
2048 If it uses the register we suspect it might,
2049 load it with the correct address directly. */
2050 if (GET_CODE (temp) == CALL_INSN
2051 && fn_address != 0
2052 && reg_referenced_p (fn_reg, body))
2053 loop_insn_emit_after (loop, 0, fn_address_insn,
2054 gen_move_insn
2055 (fn_reg, fn_address));
2057 if (GET_CODE (temp) == CALL_INSN)
2059 i1 = loop_call_insn_hoist (loop, body);
2060 /* Because the USAGE information potentially
2061 contains objects other than hard registers
2062 we need to copy it. */
2063 if (CALL_INSN_FUNCTION_USAGE (temp))
2064 CALL_INSN_FUNCTION_USAGE (i1)
2065 = copy_rtx (CALL_INSN_FUNCTION_USAGE (temp));
2067 else
2068 i1 = loop_insn_hoist (loop, body);
2069 if (first == 0)
2070 first = i1;
2071 if (temp == fn_address_insn)
2072 fn_address_insn = i1;
2073 REG_NOTES (i1) = REG_NOTES (temp);
2074 REG_NOTES (temp) = NULL;
2075 delete_insn (temp);
2077 if (new_start == 0)
2078 new_start = first;
2080 if (m->savemode != VOIDmode)
2082 /* P sets REG to zero; but we should clear only
2083 the bits that are not covered by the mode
2084 m->savemode. */
2085 rtx reg = m->set_dest;
2086 rtx sequence;
2087 rtx tem;
2089 start_sequence ();
2090 tem = expand_simple_binop
2091 (GET_MODE (reg), AND, reg,
2092 GEN_INT ((((HOST_WIDE_INT) 1
2093 << GET_MODE_BITSIZE (m->savemode)))
2094 - 1),
2095 reg, 1, OPTAB_LIB_WIDEN);
2096 if (tem == 0)
2097 abort ();
2098 if (tem != reg)
2099 emit_move_insn (reg, tem);
2100 sequence = get_insns ();
2101 end_sequence ();
2102 i1 = loop_insn_hoist (loop, sequence);
2104 else if (GET_CODE (p) == CALL_INSN)
2106 i1 = loop_call_insn_hoist (loop, PATTERN (p));
2107 /* Because the USAGE information potentially
2108 contains objects other than hard registers
2109 we need to copy it. */
2110 if (CALL_INSN_FUNCTION_USAGE (p))
2111 CALL_INSN_FUNCTION_USAGE (i1)
2112 = copy_rtx (CALL_INSN_FUNCTION_USAGE (p));
2114 else if (count == m->consec && m->move_insn_first)
2116 rtx seq;
2117 /* The SET_SRC might not be invariant, so we must
2118 use the REG_EQUAL note. */
2119 start_sequence ();
2120 emit_move_insn (m->set_dest, m->set_src);
2121 seq = get_insns ();
2122 end_sequence ();
2124 add_label_notes (m->set_src, seq);
2126 i1 = loop_insn_hoist (loop, seq);
2127 if (! find_reg_note (i1, REG_EQUAL, NULL_RTX))
2128 set_unique_reg_note (i1, m->is_equiv ? REG_EQUIV
2129 : REG_EQUAL, m->set_src);
2131 else
2132 i1 = loop_insn_hoist (loop, PATTERN (p));
2134 if (REG_NOTES (i1) == 0)
2136 REG_NOTES (i1) = REG_NOTES (p);
2137 REG_NOTES (p) = NULL;
2139 /* If there is a REG_EQUAL note present whose value
2140 is not loop invariant, then delete it, since it
2141 may cause problems with later optimization passes.
2142 It is possible for cse to create such notes
2143 like this as a result of record_jump_cond. */
2145 if ((temp = find_reg_note (i1, REG_EQUAL, NULL_RTX))
2146 && ! loop_invariant_p (loop, XEXP (temp, 0)))
2147 remove_note (i1, temp);
2150 if (new_start == 0)
2151 new_start = i1;
2153 if (loop_dump_stream)
2154 fprintf (loop_dump_stream, " moved to %d",
2155 INSN_UID (i1));
2157 /* If library call, now fix the REG_NOTES that contain
2158 insn pointers, namely REG_LIBCALL on FIRST
2159 and REG_RETVAL on I1. */
2160 if ((temp = find_reg_note (i1, REG_RETVAL, NULL_RTX)))
2162 XEXP (temp, 0) = first;
2163 temp = find_reg_note (first, REG_LIBCALL, NULL_RTX);
2164 XEXP (temp, 0) = i1;
2167 temp = p;
2168 delete_insn (p);
2169 p = NEXT_INSN (p);
2171 /* simplify_giv_expr expects that it can walk the insns
2172 at m->insn forwards and see this old sequence we are
2173 tossing here. delete_insn does preserve the next
2174 pointers, but when we skip over a NOTE we must fix
2175 it up. Otherwise that code walks into the non-deleted
2176 insn stream. */
2177 while (p && GET_CODE (p) == NOTE)
2178 p = NEXT_INSN (temp) = NEXT_INSN (p);
2181 /* The more regs we move, the less we like moving them. */
2182 threshold -= 3;
2185 /* Any other movable that loads the same register
2186 MUST be moved. */
2187 already_moved[regno] = 1;
2189 /* This reg has been moved out of one loop. */
2190 regs->array[regno].moved_once = 1;
2192 /* The reg set here is now invariant. */
2193 if (! m->partial)
2195 int i;
2196 for (i = 0; i < LOOP_REGNO_NREGS (regno, m->set_dest); i++)
2197 regs->array[regno+i].set_in_loop = 0;
2200 m->done = 1;
2202 /* Change the length-of-life info for the register
2203 to say it lives at least the full length of this loop.
2204 This will help guide optimizations in outer loops. */
2206 if (REGNO_FIRST_LUID (regno) > INSN_LUID (loop_start))
2207 /* This is the old insn before all the moved insns.
2208 We can't use the moved insn because it is out of range
2209 in uid_luid. Only the old insns have luids. */
2210 REGNO_FIRST_UID (regno) = INSN_UID (loop_start);
2211 if (REGNO_LAST_LUID (regno) < INSN_LUID (loop_end))
2212 REGNO_LAST_UID (regno) = INSN_UID (loop_end);
2214 /* Combine with this moved insn any other matching movables. */
2216 if (! m->partial)
2217 for (m1 = movables->head; m1; m1 = m1->next)
2218 if (m1->match == m)
2220 rtx temp;
2222 /* Schedule the reg loaded by M1
2223 for replacement so that shares the reg of M.
2224 If the modes differ (only possible in restricted
2225 circumstances, make a SUBREG.
2227 Note this assumes that the target dependent files
2228 treat REG and SUBREG equally, including within
2229 GO_IF_LEGITIMATE_ADDRESS and in all the
2230 predicates since we never verify that replacing the
2231 original register with a SUBREG results in a
2232 recognizable insn. */
2233 if (GET_MODE (m->set_dest) == GET_MODE (m1->set_dest))
2234 reg_map[m1->regno] = m->set_dest;
2235 else
2236 reg_map[m1->regno]
2237 = gen_lowpart_common (GET_MODE (m1->set_dest),
2238 m->set_dest);
2240 /* Get rid of the matching insn
2241 and prevent further processing of it. */
2242 m1->done = 1;
2244 /* if library call, delete all insns. */
2245 if ((temp = find_reg_note (m1->insn, REG_RETVAL,
2246 NULL_RTX)))
2247 delete_insn_chain (XEXP (temp, 0), m1->insn);
2248 else
2249 delete_insn (m1->insn);
2251 /* Any other movable that loads the same register
2252 MUST be moved. */
2253 already_moved[m1->regno] = 1;
2255 /* The reg merged here is now invariant,
2256 if the reg it matches is invariant. */
2257 if (! m->partial)
2259 int i;
2260 for (i = 0;
2261 i < LOOP_REGNO_NREGS (regno, m1->set_dest);
2262 i++)
2263 regs->array[m1->regno+i].set_in_loop = 0;
2267 else if (loop_dump_stream)
2268 fprintf (loop_dump_stream, "not desirable");
2270 else if (loop_dump_stream && !m->match)
2271 fprintf (loop_dump_stream, "not safe");
2273 if (loop_dump_stream)
2274 fprintf (loop_dump_stream, "\n");
2277 if (new_start == 0)
2278 new_start = loop_start;
2280 /* Go through all the instructions in the loop, making
2281 all the register substitutions scheduled in REG_MAP. */
2282 for (p = new_start; p != loop_end; p = NEXT_INSN (p))
2283 if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
2284 || GET_CODE (p) == CALL_INSN)
2286 replace_regs (PATTERN (p), reg_map, nregs, 0);
2287 replace_regs (REG_NOTES (p), reg_map, nregs, 0);
2288 INSN_CODE (p) = -1;
2291 /* Clean up. */
2292 free (reg_map);
2293 free (already_moved);
2297 static void
2298 loop_movables_add (movables, m)
2299 struct loop_movables *movables;
2300 struct movable *m;
2302 if (movables->head == 0)
2303 movables->head = m;
2304 else
2305 movables->last->next = m;
2306 movables->last = m;
2310 static void
2311 loop_movables_free (movables)
2312 struct loop_movables *movables;
2314 struct movable *m;
2315 struct movable *m_next;
2317 for (m = movables->head; m; m = m_next)
2319 m_next = m->next;
2320 free (m);
2324 #if 0
2325 /* Scan X and replace the address of any MEM in it with ADDR.
2326 REG is the address that MEM should have before the replacement. */
2328 static void
2329 replace_call_address (x, reg, addr)
2330 rtx x, reg, addr;
2332 enum rtx_code code;
2333 int i;
2334 const char *fmt;
2336 if (x == 0)
2337 return;
2338 code = GET_CODE (x);
2339 switch (code)
2341 case PC:
2342 case CC0:
2343 case CONST_INT:
2344 case CONST_DOUBLE:
2345 case CONST:
2346 case SYMBOL_REF:
2347 case LABEL_REF:
2348 case REG:
2349 return;
2351 case SET:
2352 /* Short cut for very common case. */
2353 replace_call_address (XEXP (x, 1), reg, addr);
2354 return;
2356 case CALL:
2357 /* Short cut for very common case. */
2358 replace_call_address (XEXP (x, 0), reg, addr);
2359 return;
2361 case MEM:
2362 /* If this MEM uses a reg other than the one we expected,
2363 something is wrong. */
2364 if (XEXP (x, 0) != reg)
2365 abort ();
2366 XEXP (x, 0) = addr;
2367 return;
2369 default:
2370 break;
2373 fmt = GET_RTX_FORMAT (code);
2374 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2376 if (fmt[i] == 'e')
2377 replace_call_address (XEXP (x, i), reg, addr);
2378 else if (fmt[i] == 'E')
2380 int j;
2381 for (j = 0; j < XVECLEN (x, i); j++)
2382 replace_call_address (XVECEXP (x, i, j), reg, addr);
2386 #endif
2388 /* Return the number of memory refs to addresses that vary
2389 in the rtx X. */
2391 static int
2392 count_nonfixed_reads (loop, x)
2393 const struct loop *loop;
2394 rtx x;
2396 enum rtx_code code;
2397 int i;
2398 const char *fmt;
2399 int value;
2401 if (x == 0)
2402 return 0;
2404 code = GET_CODE (x);
2405 switch (code)
2407 case PC:
2408 case CC0:
2409 case CONST_INT:
2410 case CONST_DOUBLE:
2411 case CONST:
2412 case SYMBOL_REF:
2413 case LABEL_REF:
2414 case REG:
2415 return 0;
2417 case MEM:
2418 return ((loop_invariant_p (loop, XEXP (x, 0)) != 1)
2419 + count_nonfixed_reads (loop, XEXP (x, 0)));
2421 default:
2422 break;
2425 value = 0;
2426 fmt = GET_RTX_FORMAT (code);
2427 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2429 if (fmt[i] == 'e')
2430 value += count_nonfixed_reads (loop, XEXP (x, i));
2431 if (fmt[i] == 'E')
2433 int j;
2434 for (j = 0; j < XVECLEN (x, i); j++)
2435 value += count_nonfixed_reads (loop, XVECEXP (x, i, j));
2438 return value;
2441 /* Scan a loop setting the elements `cont', `vtop', `loops_enclosed',
2442 `has_call', `has_nonconst_call', `has_volatile', `has_tablejump',
2443 `unknown_address_altered', `unknown_constant_address_altered', and
2444 `num_mem_sets' in LOOP. Also, fill in the array `mems' and the
2445 list `store_mems' in LOOP. */
2447 static void
2448 prescan_loop (loop)
2449 struct loop *loop;
2451 int level = 1;
2452 rtx insn;
2453 struct loop_info *loop_info = LOOP_INFO (loop);
2454 rtx start = loop->start;
2455 rtx end = loop->end;
2456 /* The label after END. Jumping here is just like falling off the
2457 end of the loop. We use next_nonnote_insn instead of next_label
2458 as a hedge against the (pathological) case where some actual insn
2459 might end up between the two. */
2460 rtx exit_target = next_nonnote_insn (end);
2462 loop_info->has_indirect_jump = indirect_jump_in_function;
2463 loop_info->pre_header_has_call = 0;
2464 loop_info->has_call = 0;
2465 loop_info->has_nonconst_call = 0;
2466 loop_info->has_prefetch = 0;
2467 loop_info->has_volatile = 0;
2468 loop_info->has_tablejump = 0;
2469 loop_info->has_multiple_exit_targets = 0;
2470 loop->level = 1;
2472 loop_info->unknown_address_altered = 0;
2473 loop_info->unknown_constant_address_altered = 0;
2474 loop_info->store_mems = NULL_RTX;
2475 loop_info->first_loop_store_insn = NULL_RTX;
2476 loop_info->mems_idx = 0;
2477 loop_info->num_mem_sets = 0;
2478 /* If loop opts run twice, this was set on 1st pass for 2nd. */
2479 loop_info->preconditioned = NOTE_PRECONDITIONED (end);
2481 for (insn = start; insn && GET_CODE (insn) != CODE_LABEL;
2482 insn = PREV_INSN (insn))
2484 if (GET_CODE (insn) == CALL_INSN)
2486 loop_info->pre_header_has_call = 1;
2487 break;
2491 for (insn = NEXT_INSN (start); insn != NEXT_INSN (end);
2492 insn = NEXT_INSN (insn))
2494 switch (GET_CODE (insn))
2496 case NOTE:
2497 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
2499 ++level;
2500 /* Count number of loops contained in this one. */
2501 loop->level++;
2503 else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
2504 --level;
2505 break;
2507 case CALL_INSN:
2508 if (! CONST_OR_PURE_CALL_P (insn))
2510 loop_info->unknown_address_altered = 1;
2511 loop_info->has_nonconst_call = 1;
2513 else if (pure_call_p (insn))
2514 loop_info->has_nonconst_call = 1;
2515 loop_info->has_call = 1;
2516 if (can_throw_internal (insn))
2517 loop_info->has_multiple_exit_targets = 1;
2518 break;
2520 case JUMP_INSN:
2521 if (! loop_info->has_multiple_exit_targets)
2523 rtx set = pc_set (insn);
2525 if (set)
2527 rtx src = SET_SRC (set);
2528 rtx label1, label2;
2530 if (GET_CODE (src) == IF_THEN_ELSE)
2532 label1 = XEXP (src, 1);
2533 label2 = XEXP (src, 2);
2535 else
2537 label1 = src;
2538 label2 = NULL_RTX;
2543 if (label1 && label1 != pc_rtx)
2545 if (GET_CODE (label1) != LABEL_REF)
2547 /* Something tricky. */
2548 loop_info->has_multiple_exit_targets = 1;
2549 break;
2551 else if (XEXP (label1, 0) != exit_target
2552 && LABEL_OUTSIDE_LOOP_P (label1))
2554 /* A jump outside the current loop. */
2555 loop_info->has_multiple_exit_targets = 1;
2556 break;
2560 label1 = label2;
2561 label2 = NULL_RTX;
2563 while (label1);
2565 else
2567 /* A return, or something tricky. */
2568 loop_info->has_multiple_exit_targets = 1;
2571 /* FALLTHRU */
2573 case INSN:
2574 if (volatile_refs_p (PATTERN (insn)))
2575 loop_info->has_volatile = 1;
2577 if (GET_CODE (insn) == JUMP_INSN
2578 && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
2579 || GET_CODE (PATTERN (insn)) == ADDR_VEC))
2580 loop_info->has_tablejump = 1;
2582 note_stores (PATTERN (insn), note_addr_stored, loop_info);
2583 if (! loop_info->first_loop_store_insn && loop_info->store_mems)
2584 loop_info->first_loop_store_insn = insn;
2586 if (flag_non_call_exceptions && can_throw_internal (insn))
2587 loop_info->has_multiple_exit_targets = 1;
2588 break;
2590 default:
2591 break;
2595 /* Now, rescan the loop, setting up the LOOP_MEMS array. */
2596 if (/* An exception thrown by a called function might land us
2597 anywhere. */
2598 ! loop_info->has_nonconst_call
2599 /* We don't want loads for MEMs moved to a location before the
2600 one at which their stack memory becomes allocated. (Note
2601 that this is not a problem for malloc, etc., since those
2602 require actual function calls. */
2603 && ! current_function_calls_alloca
2604 /* There are ways to leave the loop other than falling off the
2605 end. */
2606 && ! loop_info->has_multiple_exit_targets)
2607 for (insn = NEXT_INSN (start); insn != NEXT_INSN (end);
2608 insn = NEXT_INSN (insn))
2609 for_each_rtx (&insn, insert_loop_mem, loop_info);
2611 /* BLKmode MEMs are added to LOOP_STORE_MEM as necessary so
2612 that loop_invariant_p and load_mems can use true_dependence
2613 to determine what is really clobbered. */
2614 if (loop_info->unknown_address_altered)
2616 rtx mem = gen_rtx_MEM (BLKmode, const0_rtx);
2618 loop_info->store_mems
2619 = gen_rtx_EXPR_LIST (VOIDmode, mem, loop_info->store_mems);
2621 if (loop_info->unknown_constant_address_altered)
2623 rtx mem = gen_rtx_MEM (BLKmode, const0_rtx);
2625 RTX_UNCHANGING_P (mem) = 1;
2626 loop_info->store_mems
2627 = gen_rtx_EXPR_LIST (VOIDmode, mem, loop_info->store_mems);
2631 /* Invalidate all loops containing LABEL. */
2633 static void
2634 invalidate_loops_containing_label (label)
2635 rtx label;
2637 struct loop *loop;
2638 for (loop = uid_loop[INSN_UID (label)]; loop; loop = loop->outer)
2639 loop->invalid = 1;
2642 /* Scan the function looking for loops. Record the start and end of each loop.
2643 Also mark as invalid loops any loops that contain a setjmp or are branched
2644 to from outside the loop. */
2646 static void
2647 find_and_verify_loops (f, loops)
2648 rtx f;
2649 struct loops *loops;
2651 rtx insn;
2652 rtx label;
2653 int num_loops;
2654 struct loop *current_loop;
2655 struct loop *next_loop;
2656 struct loop *loop;
2658 num_loops = loops->num;
2660 compute_luids (f, NULL_RTX, 0);
2662 /* If there are jumps to undefined labels,
2663 treat them as jumps out of any/all loops.
2664 This also avoids writing past end of tables when there are no loops. */
2665 uid_loop[0] = NULL;
2667 /* Find boundaries of loops, mark which loops are contained within
2668 loops, and invalidate loops that have setjmp. */
2670 num_loops = 0;
2671 current_loop = NULL;
2672 for (insn = f; insn; insn = NEXT_INSN (insn))
2674 if (GET_CODE (insn) == NOTE)
2675 switch (NOTE_LINE_NUMBER (insn))
2677 case NOTE_INSN_LOOP_BEG:
2678 next_loop = loops->array + num_loops;
2679 next_loop->num = num_loops;
2680 num_loops++;
2681 next_loop->start = insn;
2682 next_loop->outer = current_loop;
2683 current_loop = next_loop;
2684 break;
2686 case NOTE_INSN_LOOP_CONT:
2687 current_loop->cont = insn;
2688 break;
2690 case NOTE_INSN_LOOP_VTOP:
2691 current_loop->vtop = insn;
2692 break;
2694 case NOTE_INSN_LOOP_END:
2695 if (! current_loop)
2696 abort ();
2698 current_loop->end = insn;
2699 current_loop = current_loop->outer;
2700 break;
2702 default:
2703 break;
2706 if (GET_CODE (insn) == CALL_INSN
2707 && find_reg_note (insn, REG_SETJMP, NULL))
2709 /* In this case, we must invalidate our current loop and any
2710 enclosing loop. */
2711 for (loop = current_loop; loop; loop = loop->outer)
2713 loop->invalid = 1;
2714 if (loop_dump_stream)
2715 fprintf (loop_dump_stream,
2716 "\nLoop at %d ignored due to setjmp.\n",
2717 INSN_UID (loop->start));
2721 /* Note that this will mark the NOTE_INSN_LOOP_END note as being in the
2722 enclosing loop, but this doesn't matter. */
2723 uid_loop[INSN_UID (insn)] = current_loop;
2726 /* Any loop containing a label used in an initializer must be invalidated,
2727 because it can be jumped into from anywhere. */
2728 for (label = forced_labels; label; label = XEXP (label, 1))
2729 invalidate_loops_containing_label (XEXP (label, 0));
2731 /* Any loop containing a label used for an exception handler must be
2732 invalidated, because it can be jumped into from anywhere. */
2733 for_each_eh_label (invalidate_loops_containing_label);
2735 /* Now scan all insn's in the function. If any JUMP_INSN branches into a
2736 loop that it is not contained within, that loop is marked invalid.
2737 If any INSN or CALL_INSN uses a label's address, then the loop containing
2738 that label is marked invalid, because it could be jumped into from
2739 anywhere.
2741 Also look for blocks of code ending in an unconditional branch that
2742 exits the loop. If such a block is surrounded by a conditional
2743 branch around the block, move the block elsewhere (see below) and
2744 invert the jump to point to the code block. This may eliminate a
2745 label in our loop and will simplify processing by both us and a
2746 possible second cse pass. */
2748 for (insn = f; insn; insn = NEXT_INSN (insn))
2749 if (INSN_P (insn))
2751 struct loop *this_loop = uid_loop[INSN_UID (insn)];
2753 if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
2755 rtx note = find_reg_note (insn, REG_LABEL, NULL_RTX);
2756 if (note)
2757 invalidate_loops_containing_label (XEXP (note, 0));
2760 if (GET_CODE (insn) != JUMP_INSN)
2761 continue;
2763 mark_loop_jump (PATTERN (insn), this_loop);
2765 /* See if this is an unconditional branch outside the loop. */
2766 if (this_loop
2767 && (GET_CODE (PATTERN (insn)) == RETURN
2768 || (any_uncondjump_p (insn)
2769 && onlyjump_p (insn)
2770 && (uid_loop[INSN_UID (JUMP_LABEL (insn))]
2771 != this_loop)))
2772 && get_max_uid () < max_uid_for_loop)
2774 rtx p;
2775 rtx our_next = next_real_insn (insn);
2776 rtx last_insn_to_move = NEXT_INSN (insn);
2777 struct loop *dest_loop;
2778 struct loop *outer_loop = NULL;
2780 /* Go backwards until we reach the start of the loop, a label,
2781 or a JUMP_INSN. */
2782 for (p = PREV_INSN (insn);
2783 GET_CODE (p) != CODE_LABEL
2784 && ! (GET_CODE (p) == NOTE
2785 && NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
2786 && GET_CODE (p) != JUMP_INSN;
2787 p = PREV_INSN (p))
2790 /* Check for the case where we have a jump to an inner nested
2791 loop, and do not perform the optimization in that case. */
2793 if (JUMP_LABEL (insn))
2795 dest_loop = uid_loop[INSN_UID (JUMP_LABEL (insn))];
2796 if (dest_loop)
2798 for (outer_loop = dest_loop; outer_loop;
2799 outer_loop = outer_loop->outer)
2800 if (outer_loop == this_loop)
2801 break;
2805 /* Make sure that the target of P is within the current loop. */
2807 if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p)
2808 && uid_loop[INSN_UID (JUMP_LABEL (p))] != this_loop)
2809 outer_loop = this_loop;
2811 /* If we stopped on a JUMP_INSN to the next insn after INSN,
2812 we have a block of code to try to move.
2814 We look backward and then forward from the target of INSN
2815 to find a BARRIER at the same loop depth as the target.
2816 If we find such a BARRIER, we make a new label for the start
2817 of the block, invert the jump in P and point it to that label,
2818 and move the block of code to the spot we found. */
2820 if (! outer_loop
2821 && GET_CODE (p) == JUMP_INSN
2822 && JUMP_LABEL (p) != 0
2823 /* Just ignore jumps to labels that were never emitted.
2824 These always indicate compilation errors. */
2825 && INSN_UID (JUMP_LABEL (p)) != 0
2826 && any_condjump_p (p) && onlyjump_p (p)
2827 && next_real_insn (JUMP_LABEL (p)) == our_next
2828 /* If it's not safe to move the sequence, then we
2829 mustn't try. */
2830 && insns_safe_to_move_p (p, NEXT_INSN (insn),
2831 &last_insn_to_move))
2833 rtx target
2834 = JUMP_LABEL (insn) ? JUMP_LABEL (insn) : get_last_insn ();
2835 struct loop *target_loop = uid_loop[INSN_UID (target)];
2836 rtx loc, loc2;
2837 rtx tmp;
2839 /* Search for possible garbage past the conditional jumps
2840 and look for the last barrier. */
2841 for (tmp = last_insn_to_move;
2842 tmp && GET_CODE (tmp) != CODE_LABEL; tmp = NEXT_INSN (tmp))
2843 if (GET_CODE (tmp) == BARRIER)
2844 last_insn_to_move = tmp;
2846 for (loc = target; loc; loc = PREV_INSN (loc))
2847 if (GET_CODE (loc) == BARRIER
2848 /* Don't move things inside a tablejump. */
2849 && ((loc2 = next_nonnote_insn (loc)) == 0
2850 || GET_CODE (loc2) != CODE_LABEL
2851 || (loc2 = next_nonnote_insn (loc2)) == 0
2852 || GET_CODE (loc2) != JUMP_INSN
2853 || (GET_CODE (PATTERN (loc2)) != ADDR_VEC
2854 && GET_CODE (PATTERN (loc2)) != ADDR_DIFF_VEC))
2855 && uid_loop[INSN_UID (loc)] == target_loop)
2856 break;
2858 if (loc == 0)
2859 for (loc = target; loc; loc = NEXT_INSN (loc))
2860 if (GET_CODE (loc) == BARRIER
2861 /* Don't move things inside a tablejump. */
2862 && ((loc2 = next_nonnote_insn (loc)) == 0
2863 || GET_CODE (loc2) != CODE_LABEL
2864 || (loc2 = next_nonnote_insn (loc2)) == 0
2865 || GET_CODE (loc2) != JUMP_INSN
2866 || (GET_CODE (PATTERN (loc2)) != ADDR_VEC
2867 && GET_CODE (PATTERN (loc2)) != ADDR_DIFF_VEC))
2868 && uid_loop[INSN_UID (loc)] == target_loop)
2869 break;
2871 if (loc)
2873 rtx cond_label = JUMP_LABEL (p);
2874 rtx new_label = get_label_after (p);
2876 /* Ensure our label doesn't go away. */
2877 LABEL_NUSES (cond_label)++;
2879 /* Verify that uid_loop is large enough and that
2880 we can invert P. */
2881 if (invert_jump (p, new_label, 1))
2883 rtx q, r;
2885 /* If no suitable BARRIER was found, create a suitable
2886 one before TARGET. Since TARGET is a fall through
2887 path, we'll need to insert an jump around our block
2888 and add a BARRIER before TARGET.
2890 This creates an extra unconditional jump outside
2891 the loop. However, the benefits of removing rarely
2892 executed instructions from inside the loop usually
2893 outweighs the cost of the extra unconditional jump
2894 outside the loop. */
2895 if (loc == 0)
2897 rtx temp;
2899 temp = gen_jump (JUMP_LABEL (insn));
2900 temp = emit_jump_insn_before (temp, target);
2901 JUMP_LABEL (temp) = JUMP_LABEL (insn);
2902 LABEL_NUSES (JUMP_LABEL (insn))++;
2903 loc = emit_barrier_before (target);
2906 /* Include the BARRIER after INSN and copy the
2907 block after LOC. */
2908 if (squeeze_notes (&new_label, &last_insn_to_move))
2909 abort ();
2910 reorder_insns (new_label, last_insn_to_move, loc);
2912 /* All those insns are now in TARGET_LOOP. */
2913 for (q = new_label;
2914 q != NEXT_INSN (last_insn_to_move);
2915 q = NEXT_INSN (q))
2916 uid_loop[INSN_UID (q)] = target_loop;
2918 /* The label jumped to by INSN is no longer a loop
2919 exit. Unless INSN does not have a label (e.g.,
2920 it is a RETURN insn), search loop->exit_labels
2921 to find its label_ref, and remove it. Also turn
2922 off LABEL_OUTSIDE_LOOP_P bit. */
2923 if (JUMP_LABEL (insn))
2925 for (q = 0, r = this_loop->exit_labels;
2927 q = r, r = LABEL_NEXTREF (r))
2928 if (XEXP (r, 0) == JUMP_LABEL (insn))
2930 LABEL_OUTSIDE_LOOP_P (r) = 0;
2931 if (q)
2932 LABEL_NEXTREF (q) = LABEL_NEXTREF (r);
2933 else
2934 this_loop->exit_labels = LABEL_NEXTREF (r);
2935 break;
2938 for (loop = this_loop; loop && loop != target_loop;
2939 loop = loop->outer)
2940 loop->exit_count--;
2942 /* If we didn't find it, then something is
2943 wrong. */
2944 if (! r)
2945 abort ();
2948 /* P is now a jump outside the loop, so it must be put
2949 in loop->exit_labels, and marked as such.
2950 The easiest way to do this is to just call
2951 mark_loop_jump again for P. */
2952 mark_loop_jump (PATTERN (p), this_loop);
2954 /* If INSN now jumps to the insn after it,
2955 delete INSN. */
2956 if (JUMP_LABEL (insn) != 0
2957 && (next_real_insn (JUMP_LABEL (insn))
2958 == next_real_insn (insn)))
2959 delete_related_insns (insn);
2962 /* Continue the loop after where the conditional
2963 branch used to jump, since the only branch insn
2964 in the block (if it still remains) is an inter-loop
2965 branch and hence needs no processing. */
2966 insn = NEXT_INSN (cond_label);
2968 if (--LABEL_NUSES (cond_label) == 0)
2969 delete_related_insns (cond_label);
2971 /* This loop will be continued with NEXT_INSN (insn). */
2972 insn = PREV_INSN (insn);
2979 /* If any label in X jumps to a loop different from LOOP_NUM and any of the
2980 loops it is contained in, mark the target loop invalid.
2982 For speed, we assume that X is part of a pattern of a JUMP_INSN. */
2984 static void
2985 mark_loop_jump (x, loop)
2986 rtx x;
2987 struct loop *loop;
2989 struct loop *dest_loop;
2990 struct loop *outer_loop;
2991 int i;
2993 switch (GET_CODE (x))
2995 case PC:
2996 case USE:
2997 case CLOBBER:
2998 case REG:
2999 case MEM:
3000 case CONST_INT:
3001 case CONST_DOUBLE:
3002 case RETURN:
3003 return;
3005 case CONST:
3006 /* There could be a label reference in here. */
3007 mark_loop_jump (XEXP (x, 0), loop);
3008 return;
3010 case PLUS:
3011 case MINUS:
3012 case MULT:
3013 mark_loop_jump (XEXP (x, 0), loop);
3014 mark_loop_jump (XEXP (x, 1), loop);
3015 return;
3017 case LO_SUM:
3018 /* This may refer to a LABEL_REF or SYMBOL_REF. */
3019 mark_loop_jump (XEXP (x, 1), loop);
3020 return;
3022 case SIGN_EXTEND:
3023 case ZERO_EXTEND:
3024 mark_loop_jump (XEXP (x, 0), loop);
3025 return;
3027 case LABEL_REF:
3028 dest_loop = uid_loop[INSN_UID (XEXP (x, 0))];
3030 /* Link together all labels that branch outside the loop. This
3031 is used by final_[bg]iv_value and the loop unrolling code. Also
3032 mark this LABEL_REF so we know that this branch should predict
3033 false. */
3035 /* A check to make sure the label is not in an inner nested loop,
3036 since this does not count as a loop exit. */
3037 if (dest_loop)
3039 for (outer_loop = dest_loop; outer_loop;
3040 outer_loop = outer_loop->outer)
3041 if (outer_loop == loop)
3042 break;
3044 else
3045 outer_loop = NULL;
3047 if (loop && ! outer_loop)
3049 LABEL_OUTSIDE_LOOP_P (x) = 1;
3050 LABEL_NEXTREF (x) = loop->exit_labels;
3051 loop->exit_labels = x;
3053 for (outer_loop = loop;
3054 outer_loop && outer_loop != dest_loop;
3055 outer_loop = outer_loop->outer)
3056 outer_loop->exit_count++;
3059 /* If this is inside a loop, but not in the current loop or one enclosed
3060 by it, it invalidates at least one loop. */
3062 if (! dest_loop)
3063 return;
3065 /* We must invalidate every nested loop containing the target of this
3066 label, except those that also contain the jump insn. */
3068 for (; dest_loop; dest_loop = dest_loop->outer)
3070 /* Stop when we reach a loop that also contains the jump insn. */
3071 for (outer_loop = loop; outer_loop; outer_loop = outer_loop->outer)
3072 if (dest_loop == outer_loop)
3073 return;
3075 /* If we get here, we know we need to invalidate a loop. */
3076 if (loop_dump_stream && ! dest_loop->invalid)
3077 fprintf (loop_dump_stream,
3078 "\nLoop at %d ignored due to multiple entry points.\n",
3079 INSN_UID (dest_loop->start));
3081 dest_loop->invalid = 1;
3083 return;
3085 case SET:
3086 /* If this is not setting pc, ignore. */
3087 if (SET_DEST (x) == pc_rtx)
3088 mark_loop_jump (SET_SRC (x), loop);
3089 return;
3091 case IF_THEN_ELSE:
3092 mark_loop_jump (XEXP (x, 1), loop);
3093 mark_loop_jump (XEXP (x, 2), loop);
3094 return;
3096 case PARALLEL:
3097 case ADDR_VEC:
3098 for (i = 0; i < XVECLEN (x, 0); i++)
3099 mark_loop_jump (XVECEXP (x, 0, i), loop);
3100 return;
3102 case ADDR_DIFF_VEC:
3103 for (i = 0; i < XVECLEN (x, 1); i++)
3104 mark_loop_jump (XVECEXP (x, 1, i), loop);
3105 return;
3107 default:
3108 /* Strictly speaking this is not a jump into the loop, only a possible
3109 jump out of the loop. However, we have no way to link the destination
3110 of this jump onto the list of exit labels. To be safe we mark this
3111 loop and any containing loops as invalid. */
3112 if (loop)
3114 for (outer_loop = loop; outer_loop; outer_loop = outer_loop->outer)
3116 if (loop_dump_stream && ! outer_loop->invalid)
3117 fprintf (loop_dump_stream,
3118 "\nLoop at %d ignored due to unknown exit jump.\n",
3119 INSN_UID (outer_loop->start));
3120 outer_loop->invalid = 1;
3123 return;
3127 /* Return nonzero if there is a label in the range from
3128 insn INSN to and including the insn whose luid is END
3129 INSN must have an assigned luid (i.e., it must not have
3130 been previously created by loop.c). */
3132 static int
3133 labels_in_range_p (insn, end)
3134 rtx insn;
3135 int end;
3137 while (insn && INSN_LUID (insn) <= end)
3139 if (GET_CODE (insn) == CODE_LABEL)
3140 return 1;
3141 insn = NEXT_INSN (insn);
3144 return 0;
3147 /* Record that a memory reference X is being set. */
3149 static void
3150 note_addr_stored (x, y, data)
3151 rtx x;
3152 rtx y ATTRIBUTE_UNUSED;
3153 void *data ATTRIBUTE_UNUSED;
3155 struct loop_info *loop_info = data;
3157 if (x == 0 || GET_CODE (x) != MEM)
3158 return;
3160 /* Count number of memory writes.
3161 This affects heuristics in strength_reduce. */
3162 loop_info->num_mem_sets++;
3164 /* BLKmode MEM means all memory is clobbered. */
3165 if (GET_MODE (x) == BLKmode)
3167 if (RTX_UNCHANGING_P (x))
3168 loop_info->unknown_constant_address_altered = 1;
3169 else
3170 loop_info->unknown_address_altered = 1;
3172 return;
3175 loop_info->store_mems = gen_rtx_EXPR_LIST (VOIDmode, x,
3176 loop_info->store_mems);
3179 /* X is a value modified by an INSN that references a biv inside a loop
3180 exit test (ie, X is somehow related to the value of the biv). If X
3181 is a pseudo that is used more than once, then the biv is (effectively)
3182 used more than once. DATA is a pointer to a loop_regs structure. */
3184 static void
3185 note_set_pseudo_multiple_uses (x, y, data)
3186 rtx x;
3187 rtx y ATTRIBUTE_UNUSED;
3188 void *data;
3190 struct loop_regs *regs = (struct loop_regs *) data;
3192 if (x == 0)
3193 return;
3195 while (GET_CODE (x) == STRICT_LOW_PART
3196 || GET_CODE (x) == SIGN_EXTRACT
3197 || GET_CODE (x) == ZERO_EXTRACT
3198 || GET_CODE (x) == SUBREG)
3199 x = XEXP (x, 0);
3201 if (GET_CODE (x) != REG || REGNO (x) < FIRST_PSEUDO_REGISTER)
3202 return;
3204 /* If we do not have usage information, or if we know the register
3205 is used more than once, note that fact for check_dbra_loop. */
3206 if (REGNO (x) >= max_reg_before_loop
3207 || ! regs->array[REGNO (x)].single_usage
3208 || regs->array[REGNO (x)].single_usage == const0_rtx)
3209 regs->multiple_uses = 1;
3212 /* Return nonzero if the rtx X is invariant over the current loop.
3214 The value is 2 if we refer to something only conditionally invariant.
3216 A memory ref is invariant if it is not volatile and does not conflict
3217 with anything stored in `loop_info->store_mems'. */
3220 loop_invariant_p (loop, x)
3221 const struct loop *loop;
3222 rtx x;
3224 struct loop_info *loop_info = LOOP_INFO (loop);
3225 struct loop_regs *regs = LOOP_REGS (loop);
3226 int i;
3227 enum rtx_code code;
3228 const char *fmt;
3229 int conditional = 0;
3230 rtx mem_list_entry;
3232 if (x == 0)
3233 return 1;
3234 code = GET_CODE (x);
3235 switch (code)
3237 case CONST_INT:
3238 case CONST_DOUBLE:
3239 case SYMBOL_REF:
3240 case CONST:
3241 return 1;
3243 case LABEL_REF:
3244 /* A LABEL_REF is normally invariant, however, if we are unrolling
3245 loops, and this label is inside the loop, then it isn't invariant.
3246 This is because each unrolled copy of the loop body will have
3247 a copy of this label. If this was invariant, then an insn loading
3248 the address of this label into a register might get moved outside
3249 the loop, and then each loop body would end up using the same label.
3251 We don't know the loop bounds here though, so just fail for all
3252 labels. */
3253 if (flag_unroll_loops)
3254 return 0;
3255 else
3256 return 1;
3258 case PC:
3259 case CC0:
3260 case UNSPEC_VOLATILE:
3261 return 0;
3263 case REG:
3264 /* We used to check RTX_UNCHANGING_P (x) here, but that is invalid
3265 since the reg might be set by initialization within the loop. */
3267 if ((x == frame_pointer_rtx || x == hard_frame_pointer_rtx
3268 || x == arg_pointer_rtx || x == pic_offset_table_rtx)
3269 && ! current_function_has_nonlocal_goto)
3270 return 1;
3272 if (LOOP_INFO (loop)->has_call
3273 && REGNO (x) < FIRST_PSEUDO_REGISTER && call_used_regs[REGNO (x)])
3274 return 0;
3276 if (regs->array[REGNO (x)].set_in_loop < 0)
3277 return 2;
3279 return regs->array[REGNO (x)].set_in_loop == 0;
3281 case MEM:
3282 /* Volatile memory references must be rejected. Do this before
3283 checking for read-only items, so that volatile read-only items
3284 will be rejected also. */
3285 if (MEM_VOLATILE_P (x))
3286 return 0;
3288 /* See if there is any dependence between a store and this load. */
3289 mem_list_entry = loop_info->store_mems;
3290 while (mem_list_entry)
3292 if (true_dependence (XEXP (mem_list_entry, 0), VOIDmode,
3293 x, rtx_varies_p))
3294 return 0;
3296 mem_list_entry = XEXP (mem_list_entry, 1);
3299 /* It's not invalidated by a store in memory
3300 but we must still verify the address is invariant. */
3301 break;
3303 case ASM_OPERANDS:
3304 /* Don't mess with insns declared volatile. */
3305 if (MEM_VOLATILE_P (x))
3306 return 0;
3307 break;
3309 default:
3310 break;
3313 fmt = GET_RTX_FORMAT (code);
3314 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3316 if (fmt[i] == 'e')
3318 int tem = loop_invariant_p (loop, XEXP (x, i));
3319 if (tem == 0)
3320 return 0;
3321 if (tem == 2)
3322 conditional = 1;
3324 else if (fmt[i] == 'E')
3326 int j;
3327 for (j = 0; j < XVECLEN (x, i); j++)
3329 int tem = loop_invariant_p (loop, XVECEXP (x, i, j));
3330 if (tem == 0)
3331 return 0;
3332 if (tem == 2)
3333 conditional = 1;
3339 return 1 + conditional;
3342 /* Return nonzero if all the insns in the loop that set REG
3343 are INSN and the immediately following insns,
3344 and if each of those insns sets REG in an invariant way
3345 (not counting uses of REG in them).
3347 The value is 2 if some of these insns are only conditionally invariant.
3349 We assume that INSN itself is the first set of REG
3350 and that its source is invariant. */
3352 static int
3353 consec_sets_invariant_p (loop, reg, n_sets, insn)
3354 const struct loop *loop;
3355 int n_sets;
3356 rtx reg, insn;
3358 struct loop_regs *regs = LOOP_REGS (loop);
3359 rtx p = insn;
3360 unsigned int regno = REGNO (reg);
3361 rtx temp;
3362 /* Number of sets we have to insist on finding after INSN. */
3363 int count = n_sets - 1;
3364 int old = regs->array[regno].set_in_loop;
3365 int value = 0;
3366 int this;
3368 /* If N_SETS hit the limit, we can't rely on its value. */
3369 if (n_sets == 127)
3370 return 0;
3372 regs->array[regno].set_in_loop = 0;
3374 while (count > 0)
3376 enum rtx_code code;
3377 rtx set;
3379 p = NEXT_INSN (p);
3380 code = GET_CODE (p);
3382 /* If library call, skip to end of it. */
3383 if (code == INSN && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
3384 p = XEXP (temp, 0);
3386 this = 0;
3387 if (code == INSN
3388 && (set = single_set (p))
3389 && GET_CODE (SET_DEST (set)) == REG
3390 && REGNO (SET_DEST (set)) == regno)
3392 this = loop_invariant_p (loop, SET_SRC (set));
3393 if (this != 0)
3394 value |= this;
3395 else if ((temp = find_reg_note (p, REG_EQUAL, NULL_RTX)))
3397 /* If this is a libcall, then any invariant REG_EQUAL note is OK.
3398 If this is an ordinary insn, then only CONSTANT_P REG_EQUAL
3399 notes are OK. */
3400 this = (CONSTANT_P (XEXP (temp, 0))
3401 || (find_reg_note (p, REG_RETVAL, NULL_RTX)
3402 && loop_invariant_p (loop, XEXP (temp, 0))));
3403 if (this != 0)
3404 value |= this;
3407 if (this != 0)
3408 count--;
3409 else if (code != NOTE)
3411 regs->array[regno].set_in_loop = old;
3412 return 0;
3416 regs->array[regno].set_in_loop = old;
3417 /* If loop_invariant_p ever returned 2, we return 2. */
3418 return 1 + (value & 2);
3421 #if 0
3422 /* I don't think this condition is sufficient to allow INSN
3423 to be moved, so we no longer test it. */
3425 /* Return 1 if all insns in the basic block of INSN and following INSN
3426 that set REG are invariant according to TABLE. */
3428 static int
3429 all_sets_invariant_p (reg, insn, table)
3430 rtx reg, insn;
3431 short *table;
3433 rtx p = insn;
3434 int regno = REGNO (reg);
3436 while (1)
3438 enum rtx_code code;
3439 p = NEXT_INSN (p);
3440 code = GET_CODE (p);
3441 if (code == CODE_LABEL || code == JUMP_INSN)
3442 return 1;
3443 if (code == INSN && GET_CODE (PATTERN (p)) == SET
3444 && GET_CODE (SET_DEST (PATTERN (p))) == REG
3445 && REGNO (SET_DEST (PATTERN (p))) == regno)
3447 if (! loop_invariant_p (loop, SET_SRC (PATTERN (p)), table))
3448 return 0;
3452 #endif /* 0 */
3454 /* Look at all uses (not sets) of registers in X. For each, if it is
3455 the single use, set USAGE[REGNO] to INSN; if there was a previous use in
3456 a different insn, set USAGE[REGNO] to const0_rtx. */
3458 static void
3459 find_single_use_in_loop (regs, insn, x)
3460 struct loop_regs *regs;
3461 rtx insn;
3462 rtx x;
3464 enum rtx_code code = GET_CODE (x);
3465 const char *fmt = GET_RTX_FORMAT (code);
3466 int i, j;
3468 if (code == REG)
3469 regs->array[REGNO (x)].single_usage
3470 = (regs->array[REGNO (x)].single_usage != 0
3471 && regs->array[REGNO (x)].single_usage != insn)
3472 ? const0_rtx : insn;
3474 else if (code == SET)
3476 /* Don't count SET_DEST if it is a REG; otherwise count things
3477 in SET_DEST because if a register is partially modified, it won't
3478 show up as a potential movable so we don't care how USAGE is set
3479 for it. */
3480 if (GET_CODE (SET_DEST (x)) != REG)
3481 find_single_use_in_loop (regs, insn, SET_DEST (x));
3482 find_single_use_in_loop (regs, insn, SET_SRC (x));
3484 else
3485 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3487 if (fmt[i] == 'e' && XEXP (x, i) != 0)
3488 find_single_use_in_loop (regs, insn, XEXP (x, i));
3489 else if (fmt[i] == 'E')
3490 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
3491 find_single_use_in_loop (regs, insn, XVECEXP (x, i, j));
3495 /* Count and record any set in X which is contained in INSN. Update
3496 REGS->array[I].MAY_NOT_OPTIMIZE and LAST_SET for any register I set
3497 in X. */
3499 static void
3500 count_one_set (regs, insn, x, last_set)
3501 struct loop_regs *regs;
3502 rtx insn, x;
3503 rtx *last_set;
3505 if (GET_CODE (x) == CLOBBER && GET_CODE (XEXP (x, 0)) == REG)
3506 /* Don't move a reg that has an explicit clobber.
3507 It's not worth the pain to try to do it correctly. */
3508 regs->array[REGNO (XEXP (x, 0))].may_not_optimize = 1;
3510 if (GET_CODE (x) == SET || GET_CODE (x) == CLOBBER)
3512 rtx dest = SET_DEST (x);
3513 while (GET_CODE (dest) == SUBREG
3514 || GET_CODE (dest) == ZERO_EXTRACT
3515 || GET_CODE (dest) == SIGN_EXTRACT
3516 || GET_CODE (dest) == STRICT_LOW_PART)
3517 dest = XEXP (dest, 0);
3518 if (GET_CODE (dest) == REG)
3520 int i;
3521 int regno = REGNO (dest);
3522 for (i = 0; i < LOOP_REGNO_NREGS (regno, dest); i++)
3524 /* If this is the first setting of this reg
3525 in current basic block, and it was set before,
3526 it must be set in two basic blocks, so it cannot
3527 be moved out of the loop. */
3528 if (regs->array[regno].set_in_loop > 0
3529 && last_set == 0)
3530 regs->array[regno+i].may_not_optimize = 1;
3531 /* If this is not first setting in current basic block,
3532 see if reg was used in between previous one and this.
3533 If so, neither one can be moved. */
3534 if (last_set[regno] != 0
3535 && reg_used_between_p (dest, last_set[regno], insn))
3536 regs->array[regno+i].may_not_optimize = 1;
3537 if (regs->array[regno+i].set_in_loop < 127)
3538 ++regs->array[regno+i].set_in_loop;
3539 last_set[regno+i] = insn;
3545 /* Given a loop that is bounded by LOOP->START and LOOP->END and that
3546 is entered at LOOP->SCAN_START, return 1 if the register set in SET
3547 contained in insn INSN is used by any insn that precedes INSN in
3548 cyclic order starting from the loop entry point.
3550 We don't want to use INSN_LUID here because if we restrict INSN to those
3551 that have a valid INSN_LUID, it means we cannot move an invariant out
3552 from an inner loop past two loops. */
3554 static int
3555 loop_reg_used_before_p (loop, set, insn)
3556 const struct loop *loop;
3557 rtx set, insn;
3559 rtx reg = SET_DEST (set);
3560 rtx p;
3562 /* Scan forward checking for register usage. If we hit INSN, we
3563 are done. Otherwise, if we hit LOOP->END, wrap around to LOOP->START. */
3564 for (p = loop->scan_start; p != insn; p = NEXT_INSN (p))
3566 if (INSN_P (p) && reg_overlap_mentioned_p (reg, PATTERN (p)))
3567 return 1;
3569 if (p == loop->end)
3570 p = loop->start;
3573 return 0;
3577 /* Information we collect about arrays that we might want to prefetch. */
3578 struct prefetch_info
3580 struct iv_class *class; /* Class this prefetch is based on. */
3581 struct induction *giv; /* GIV this prefetch is based on. */
3582 rtx base_address; /* Start prefetching from this address plus
3583 index. */
3584 HOST_WIDE_INT index;
3585 HOST_WIDE_INT stride; /* Prefetch stride in bytes in each
3586 iteration. */
3587 unsigned int bytes_accessed; /* Sum of sizes of all accesses to this
3588 prefetch area in one iteration. */
3589 unsigned int total_bytes; /* Total bytes loop will access in this block.
3590 This is set only for loops with known
3591 iteration counts and is 0xffffffff
3592 otherwise. */
3593 int prefetch_in_loop; /* Number of prefetch insns in loop. */
3594 int prefetch_before_loop; /* Number of prefetch insns before loop. */
3595 unsigned int write : 1; /* 1 for read/write prefetches. */
3598 /* Data used by check_store function. */
3599 struct check_store_data
3601 rtx mem_address;
3602 int mem_write;
3605 static void check_store PARAMS ((rtx, rtx, void *));
3606 static void emit_prefetch_instructions PARAMS ((struct loop *));
3607 static int rtx_equal_for_prefetch_p PARAMS ((rtx, rtx));
3609 /* Set mem_write when mem_address is found. Used as callback to
3610 note_stores. */
3611 static void
3612 check_store (x, pat, data)
3613 rtx x, pat ATTRIBUTE_UNUSED;
3614 void *data;
3616 struct check_store_data *d = (struct check_store_data *) data;
3618 if ((GET_CODE (x) == MEM) && rtx_equal_p (d->mem_address, XEXP (x, 0)))
3619 d->mem_write = 1;
3622 /* Like rtx_equal_p, but attempts to swap commutative operands. This is
3623 important to get some addresses combined. Later more sophisticated
3624 transformations can be added when necesary.
3626 ??? Same trick with swapping operand is done at several other places.
3627 It can be nice to develop some common way to handle this. */
3629 static int
3630 rtx_equal_for_prefetch_p (x, y)
3631 rtx x, y;
3633 int i;
3634 int j;
3635 enum rtx_code code = GET_CODE (x);
3636 const char *fmt;
3638 if (x == y)
3639 return 1;
3640 if (code != GET_CODE (y))
3641 return 0;
3643 code = GET_CODE (x);
3645 if (GET_RTX_CLASS (code) == 'c')
3647 return ((rtx_equal_for_prefetch_p (XEXP (x, 0), XEXP (y, 0))
3648 && rtx_equal_for_prefetch_p (XEXP (x, 1), XEXP (y, 1)))
3649 || (rtx_equal_for_prefetch_p (XEXP (x, 0), XEXP (y, 1))
3650 && rtx_equal_for_prefetch_p (XEXP (x, 1), XEXP (y, 0))));
3652 /* Compare the elements. If any pair of corresponding elements fails to
3653 match, return 0 for the whole thing. */
3655 fmt = GET_RTX_FORMAT (code);
3656 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3658 switch (fmt[i])
3660 case 'w':
3661 if (XWINT (x, i) != XWINT (y, i))
3662 return 0;
3663 break;
3665 case 'i':
3666 if (XINT (x, i) != XINT (y, i))
3667 return 0;
3668 break;
3670 case 'E':
3671 /* Two vectors must have the same length. */
3672 if (XVECLEN (x, i) != XVECLEN (y, i))
3673 return 0;
3675 /* And the corresponding elements must match. */
3676 for (j = 0; j < XVECLEN (x, i); j++)
3677 if (rtx_equal_for_prefetch_p (XVECEXP (x, i, j),
3678 XVECEXP (y, i, j)) == 0)
3679 return 0;
3680 break;
3682 case 'e':
3683 if (rtx_equal_for_prefetch_p (XEXP (x, i), XEXP (y, i)) == 0)
3684 return 0;
3685 break;
3687 case 's':
3688 if (strcmp (XSTR (x, i), XSTR (y, i)))
3689 return 0;
3690 break;
3692 case 'u':
3693 /* These are just backpointers, so they don't matter. */
3694 break;
3696 case '0':
3697 break;
3699 /* It is believed that rtx's at this level will never
3700 contain anything but integers and other rtx's,
3701 except for within LABEL_REFs and SYMBOL_REFs. */
3702 default:
3703 abort ();
3706 return 1;
3709 /* Remove constant addition value from the expression X (when present)
3710 and return it. */
3712 static HOST_WIDE_INT
3713 remove_constant_addition (x)
3714 rtx *x;
3716 HOST_WIDE_INT addval = 0;
3717 rtx exp = *x;
3719 /* Avoid clobbering a shared CONST expression. */
3720 if (GET_CODE (exp) == CONST)
3722 if (GET_CODE (XEXP (exp, 0)) == PLUS
3723 && GET_CODE (XEXP (XEXP (exp, 0), 0)) == SYMBOL_REF
3724 && GET_CODE (XEXP (XEXP (exp, 0), 1)) == CONST_INT)
3726 *x = XEXP (XEXP (exp, 0), 0);
3727 return INTVAL (XEXP (XEXP (exp, 0), 1));
3729 return 0;
3732 if (GET_CODE (exp) == CONST_INT)
3734 addval = INTVAL (exp);
3735 *x = const0_rtx;
3738 /* For plus expression recurse on ourself. */
3739 else if (GET_CODE (exp) == PLUS)
3741 addval += remove_constant_addition (&XEXP (exp, 0));
3742 addval += remove_constant_addition (&XEXP (exp, 1));
3744 /* In case our parameter was constant, remove extra zero from the
3745 expression. */
3746 if (XEXP (exp, 0) == const0_rtx)
3747 *x = XEXP (exp, 1);
3748 else if (XEXP (exp, 1) == const0_rtx)
3749 *x = XEXP (exp, 0);
3752 return addval;
3755 /* Attempt to identify accesses to arrays that are most likely to cause cache
3756 misses, and emit prefetch instructions a few prefetch blocks forward.
3758 To detect the arrays we use the GIV information that was collected by the
3759 strength reduction pass.
3761 The prefetch instructions are generated after the GIV information is done
3762 and before the strength reduction process. The new GIVs are injected into
3763 the strength reduction tables, so the prefetch addresses are optimized as
3764 well.
3766 GIVs are split into base address, stride, and constant addition values.
3767 GIVs with the same address, stride and close addition values are combined
3768 into a single prefetch. Also writes to GIVs are detected, so that prefetch
3769 for write instructions can be used for the block we write to, on machines
3770 that support write prefetches.
3772 Several heuristics are used to determine when to prefetch. They are
3773 controlled by defined symbols that can be overridden for each target. */
3775 static void
3776 emit_prefetch_instructions (loop)
3777 struct loop *loop;
3779 int num_prefetches = 0;
3780 int num_real_prefetches = 0;
3781 int num_real_write_prefetches = 0;
3782 int num_prefetches_before = 0;
3783 int num_write_prefetches_before = 0;
3784 int ahead = 0;
3785 int i;
3786 struct iv_class *bl;
3787 struct induction *iv;
3788 struct prefetch_info info[MAX_PREFETCHES];
3789 struct loop_ivs *ivs = LOOP_IVS (loop);
3791 if (!HAVE_prefetch)
3792 return;
3794 /* Consider only loops w/o calls. When a call is done, the loop is probably
3795 slow enough to read the memory. */
3796 if (PREFETCH_NO_CALL && LOOP_INFO (loop)->has_call)
3798 if (loop_dump_stream)
3799 fprintf (loop_dump_stream, "Prefetch: ignoring loop: has call.\n");
3801 return;
3804 /* Don't prefetch in loops known to have few iterations. */
3805 if (PREFETCH_NO_LOW_LOOPCNT
3806 && LOOP_INFO (loop)->n_iterations
3807 && LOOP_INFO (loop)->n_iterations <= PREFETCH_LOW_LOOPCNT)
3809 if (loop_dump_stream)
3810 fprintf (loop_dump_stream,
3811 "Prefetch: ignoring loop: not enough iterations.\n");
3812 return;
3815 /* Search all induction variables and pick those interesting for the prefetch
3816 machinery. */
3817 for (bl = ivs->list; bl; bl = bl->next)
3819 struct induction *biv = bl->biv, *biv1;
3820 int basestride = 0;
3822 biv1 = biv;
3824 /* Expect all BIVs to be executed in each iteration. This makes our
3825 analysis more conservative. */
3826 while (biv1)
3828 /* Discard non-constant additions that we can't handle well yet, and
3829 BIVs that are executed multiple times; such BIVs ought to be
3830 handled in the nested loop. We accept not_every_iteration BIVs,
3831 since these only result in larger strides and make our
3832 heuristics more conservative. */
3833 if (GET_CODE (biv->add_val) != CONST_INT)
3835 if (loop_dump_stream)
3837 fprintf (loop_dump_stream,
3838 "Prefetch: ignoring biv %d: non-constant addition at insn %d:",
3839 REGNO (biv->src_reg), INSN_UID (biv->insn));
3840 print_rtl (loop_dump_stream, biv->add_val);
3841 fprintf (loop_dump_stream, "\n");
3843 break;
3846 if (biv->maybe_multiple)
3848 if (loop_dump_stream)
3850 fprintf (loop_dump_stream,
3851 "Prefetch: ignoring biv %d: maybe_multiple at insn %i:",
3852 REGNO (biv->src_reg), INSN_UID (biv->insn));
3853 print_rtl (loop_dump_stream, biv->add_val);
3854 fprintf (loop_dump_stream, "\n");
3856 break;
3859 basestride += INTVAL (biv1->add_val);
3860 biv1 = biv1->next_iv;
3863 if (biv1 || !basestride)
3864 continue;
3866 for (iv = bl->giv; iv; iv = iv->next_iv)
3868 rtx address;
3869 rtx temp;
3870 HOST_WIDE_INT index = 0;
3871 int add = 1;
3872 HOST_WIDE_INT stride = 0;
3873 int stride_sign = 1;
3874 struct check_store_data d;
3875 const char *ignore_reason = NULL;
3876 int size = GET_MODE_SIZE (GET_MODE (iv));
3878 /* See whether an induction variable is interesting to us and if
3879 not, report the reason. */
3880 if (iv->giv_type != DEST_ADDR)
3881 ignore_reason = "giv is not a destination address";
3883 /* We are interested only in constant stride memory references
3884 in order to be able to compute density easily. */
3885 else if (GET_CODE (iv->mult_val) != CONST_INT)
3886 ignore_reason = "stride is not constant";
3888 else
3890 stride = INTVAL (iv->mult_val) * basestride;
3891 if (stride < 0)
3893 stride = -stride;
3894 stride_sign = -1;
3897 /* On some targets, reversed order prefetches are not
3898 worthwhile. */
3899 if (PREFETCH_NO_REVERSE_ORDER && stride_sign < 0)
3900 ignore_reason = "reversed order stride";
3902 /* Prefetch of accesses with an extreme stride might not be
3903 worthwhile, either. */
3904 else if (PREFETCH_NO_EXTREME_STRIDE
3905 && stride > PREFETCH_EXTREME_STRIDE)
3906 ignore_reason = "extreme stride";
3908 /* Ignore GIVs with varying add values; we can't predict the
3909 value for the next iteration. */
3910 else if (!loop_invariant_p (loop, iv->add_val))
3911 ignore_reason = "giv has varying add value";
3913 /* Ignore GIVs in the nested loops; they ought to have been
3914 handled already. */
3915 else if (iv->maybe_multiple)
3916 ignore_reason = "giv is in nested loop";
3919 if (ignore_reason != NULL)
3921 if (loop_dump_stream)
3922 fprintf (loop_dump_stream,
3923 "Prefetch: ignoring giv at %d: %s.\n",
3924 INSN_UID (iv->insn), ignore_reason);
3925 continue;
3928 /* Determine the pointer to the basic array we are examining. It is
3929 the sum of the BIV's initial value and the GIV's add_val. */
3930 address = copy_rtx (iv->add_val);
3931 temp = copy_rtx (bl->initial_value);
3933 address = simplify_gen_binary (PLUS, Pmode, temp, address);
3934 index = remove_constant_addition (&address);
3936 d.mem_write = 0;
3937 d.mem_address = *iv->location;
3939 /* When the GIV is not always executed, we might be better off by
3940 not dirtying the cache pages. */
3941 if (PREFETCH_CONDITIONAL || iv->always_executed)
3942 note_stores (PATTERN (iv->insn), check_store, &d);
3943 else
3945 if (loop_dump_stream)
3946 fprintf (loop_dump_stream, "Prefetch: Ignoring giv at %d: %s\n",
3947 INSN_UID (iv->insn), "in conditional code.");
3948 continue;
3951 /* Attempt to find another prefetch to the same array and see if we
3952 can merge this one. */
3953 for (i = 0; i < num_prefetches; i++)
3954 if (rtx_equal_for_prefetch_p (address, info[i].base_address)
3955 && stride == info[i].stride)
3957 /* In case both access same array (same location
3958 just with small difference in constant indexes), merge
3959 the prefetches. Just do the later and the earlier will
3960 get prefetched from previous iteration.
3961 The artificial threshold should not be too small,
3962 but also not bigger than small portion of memory usually
3963 traversed by single loop. */
3964 if (index >= info[i].index
3965 && index - info[i].index < PREFETCH_EXTREME_DIFFERENCE)
3967 info[i].write |= d.mem_write;
3968 info[i].bytes_accessed += size;
3969 info[i].index = index;
3970 info[i].giv = iv;
3971 info[i].class = bl;
3972 info[num_prefetches].base_address = address;
3973 add = 0;
3974 break;
3977 if (index < info[i].index
3978 && info[i].index - index < PREFETCH_EXTREME_DIFFERENCE)
3980 info[i].write |= d.mem_write;
3981 info[i].bytes_accessed += size;
3982 add = 0;
3983 break;
3987 /* Merging failed. */
3988 if (add)
3990 info[num_prefetches].giv = iv;
3991 info[num_prefetches].class = bl;
3992 info[num_prefetches].index = index;
3993 info[num_prefetches].stride = stride;
3994 info[num_prefetches].base_address = address;
3995 info[num_prefetches].write = d.mem_write;
3996 info[num_prefetches].bytes_accessed = size;
3997 num_prefetches++;
3998 if (num_prefetches >= MAX_PREFETCHES)
4000 if (loop_dump_stream)
4001 fprintf (loop_dump_stream,
4002 "Maximal number of prefetches exceeded.\n");
4003 return;
4009 for (i = 0; i < num_prefetches; i++)
4011 int density;
4013 /* Attempt to calculate the total number of bytes fetched by all
4014 iterations of the loop. Avoid overflow. */
4015 if (LOOP_INFO (loop)->n_iterations
4016 && ((unsigned HOST_WIDE_INT) (0xffffffff / info[i].stride)
4017 >= LOOP_INFO (loop)->n_iterations))
4018 info[i].total_bytes = info[i].stride * LOOP_INFO (loop)->n_iterations;
4019 else
4020 info[i].total_bytes = 0xffffffff;
4022 density = info[i].bytes_accessed * 100 / info[i].stride;
4024 /* Prefetch might be worthwhile only when the loads/stores are dense. */
4025 if (PREFETCH_ONLY_DENSE_MEM)
4026 if (density * 256 > PREFETCH_DENSE_MEM * 100
4027 && (info[i].total_bytes / PREFETCH_BLOCK
4028 >= PREFETCH_BLOCKS_BEFORE_LOOP_MIN))
4030 info[i].prefetch_before_loop = 1;
4031 info[i].prefetch_in_loop
4032 = (info[i].total_bytes / PREFETCH_BLOCK
4033 > PREFETCH_BLOCKS_BEFORE_LOOP_MAX);
4035 else
4037 info[i].prefetch_in_loop = 0, info[i].prefetch_before_loop = 0;
4038 if (loop_dump_stream)
4039 fprintf (loop_dump_stream,
4040 "Prefetch: ignoring giv at %d: %d%% density is too low.\n",
4041 INSN_UID (info[i].giv->insn), density);
4043 else
4044 info[i].prefetch_in_loop = 1, info[i].prefetch_before_loop = 1;
4046 /* Find how many prefetch instructions we'll use within the loop. */
4047 if (info[i].prefetch_in_loop != 0)
4049 info[i].prefetch_in_loop = ((info[i].stride + PREFETCH_BLOCK - 1)
4050 / PREFETCH_BLOCK);
4051 num_real_prefetches += info[i].prefetch_in_loop;
4052 if (info[i].write)
4053 num_real_write_prefetches += info[i].prefetch_in_loop;
4057 /* Determine how many iterations ahead to prefetch within the loop, based
4058 on how many prefetches we currently expect to do within the loop. */
4059 if (num_real_prefetches != 0)
4061 if ((ahead = SIMULTANEOUS_PREFETCHES / num_real_prefetches) == 0)
4063 if (loop_dump_stream)
4064 fprintf (loop_dump_stream,
4065 "Prefetch: ignoring prefetches within loop: ahead is zero; %d < %d\n",
4066 SIMULTANEOUS_PREFETCHES, num_real_prefetches);
4067 num_real_prefetches = 0, num_real_write_prefetches = 0;
4070 /* We'll also use AHEAD to determine how many prefetch instructions to
4071 emit before a loop, so don't leave it zero. */
4072 if (ahead == 0)
4073 ahead = PREFETCH_BLOCKS_BEFORE_LOOP_MAX;
4075 for (i = 0; i < num_prefetches; i++)
4077 /* Update if we've decided not to prefetch anything within the loop. */
4078 if (num_real_prefetches == 0)
4079 info[i].prefetch_in_loop = 0;
4081 /* Find how many prefetch instructions we'll use before the loop. */
4082 if (info[i].prefetch_before_loop != 0)
4084 int n = info[i].total_bytes / PREFETCH_BLOCK;
4085 if (n > ahead)
4086 n = ahead;
4087 info[i].prefetch_before_loop = n;
4088 num_prefetches_before += n;
4089 if (info[i].write)
4090 num_write_prefetches_before += n;
4093 if (loop_dump_stream)
4095 if (info[i].prefetch_in_loop == 0
4096 && info[i].prefetch_before_loop == 0)
4097 continue;
4098 fprintf (loop_dump_stream, "Prefetch insn: %d",
4099 INSN_UID (info[i].giv->insn));
4100 fprintf (loop_dump_stream,
4101 "; in loop: %d; before: %d; %s\n",
4102 info[i].prefetch_in_loop,
4103 info[i].prefetch_before_loop,
4104 info[i].write ? "read/write" : "read only");
4105 fprintf (loop_dump_stream,
4106 " density: %d%%; bytes_accessed: %u; total_bytes: %u\n",
4107 (int) (info[i].bytes_accessed * 100 / info[i].stride),
4108 info[i].bytes_accessed, info[i].total_bytes);
4109 fprintf (loop_dump_stream, " index: ");
4110 fprintf (loop_dump_stream, HOST_WIDE_INT_PRINT_DEC, info[i].index);
4111 fprintf (loop_dump_stream, "; stride: ");
4112 fprintf (loop_dump_stream, HOST_WIDE_INT_PRINT_DEC, info[i].stride);
4113 fprintf (loop_dump_stream, "; address: ");
4114 print_rtl (loop_dump_stream, info[i].base_address);
4115 fprintf (loop_dump_stream, "\n");
4119 if (num_real_prefetches + num_prefetches_before > 0)
4121 /* Record that this loop uses prefetch instructions. */
4122 LOOP_INFO (loop)->has_prefetch = 1;
4124 if (loop_dump_stream)
4126 fprintf (loop_dump_stream, "Real prefetches needed within loop: %d (write: %d)\n",
4127 num_real_prefetches, num_real_write_prefetches);
4128 fprintf (loop_dump_stream, "Real prefetches needed before loop: %d (write: %d)\n",
4129 num_prefetches_before, num_write_prefetches_before);
4133 for (i = 0; i < num_prefetches; i++)
4135 int y;
4137 for (y = 0; y < info[i].prefetch_in_loop; y++)
4139 rtx loc = copy_rtx (*info[i].giv->location);
4140 rtx insn;
4141 int bytes_ahead = PREFETCH_BLOCK * (ahead + y);
4142 rtx before_insn = info[i].giv->insn;
4143 rtx prev_insn = PREV_INSN (info[i].giv->insn);
4144 rtx seq;
4146 /* We can save some effort by offsetting the address on
4147 architectures with offsettable memory references. */
4148 if (offsettable_address_p (0, VOIDmode, loc))
4149 loc = plus_constant (loc, bytes_ahead);
4150 else
4152 rtx reg = gen_reg_rtx (Pmode);
4153 loop_iv_add_mult_emit_before (loop, loc, const1_rtx,
4154 GEN_INT (bytes_ahead), reg,
4155 0, before_insn);
4156 loc = reg;
4159 start_sequence ();
4160 /* Make sure the address operand is valid for prefetch. */
4161 if (! (*insn_data[(int)CODE_FOR_prefetch].operand[0].predicate)
4162 (loc, insn_data[(int)CODE_FOR_prefetch].operand[0].mode))
4163 loc = force_reg (Pmode, loc);
4164 emit_insn (gen_prefetch (loc, GEN_INT (info[i].write),
4165 GEN_INT (3)));
4166 seq = get_insns ();
4167 end_sequence ();
4168 emit_insn_before (seq, before_insn);
4170 /* Check all insns emitted and record the new GIV
4171 information. */
4172 insn = NEXT_INSN (prev_insn);
4173 while (insn != before_insn)
4175 insn = check_insn_for_givs (loop, insn,
4176 info[i].giv->always_executed,
4177 info[i].giv->maybe_multiple);
4178 insn = NEXT_INSN (insn);
4182 if (PREFETCH_BEFORE_LOOP)
4184 /* Emit insns before the loop to fetch the first cache lines or,
4185 if we're not prefetching within the loop, everything we expect
4186 to need. */
4187 for (y = 0; y < info[i].prefetch_before_loop; y++)
4189 rtx reg = gen_reg_rtx (Pmode);
4190 rtx loop_start = loop->start;
4191 rtx init_val = info[i].class->initial_value;
4192 rtx add_val = simplify_gen_binary (PLUS, Pmode,
4193 info[i].giv->add_val,
4194 GEN_INT (y * PREFETCH_BLOCK));
4196 /* Functions called by LOOP_IV_ADD_EMIT_BEFORE expect a
4197 non-constant INIT_VAL to have the same mode as REG, which
4198 in this case we know to be Pmode. */
4199 if (GET_MODE (init_val) != Pmode && !CONSTANT_P (init_val))
4200 init_val = convert_to_mode (Pmode, init_val, 0);
4201 loop_iv_add_mult_emit_before (loop, init_val,
4202 info[i].giv->mult_val,
4203 add_val, reg, 0, loop_start);
4204 emit_insn_before (gen_prefetch (reg, GEN_INT (info[i].write),
4205 GEN_INT (3)),
4206 loop_start);
4211 return;
4214 /* A "basic induction variable" or biv is a pseudo reg that is set
4215 (within this loop) only by incrementing or decrementing it. */
4216 /* A "general induction variable" or giv is a pseudo reg whose
4217 value is a linear function of a biv. */
4219 /* Bivs are recognized by `basic_induction_var';
4220 Givs by `general_induction_var'. */
4222 /* Communication with routines called via `note_stores'. */
4224 static rtx note_insn;
4226 /* Dummy register to have nonzero DEST_REG for DEST_ADDR type givs. */
4228 static rtx addr_placeholder;
4230 /* ??? Unfinished optimizations, and possible future optimizations,
4231 for the strength reduction code. */
4233 /* ??? The interaction of biv elimination, and recognition of 'constant'
4234 bivs, may cause problems. */
4236 /* ??? Add heuristics so that DEST_ADDR strength reduction does not cause
4237 performance problems.
4239 Perhaps don't eliminate things that can be combined with an addressing
4240 mode. Find all givs that have the same biv, mult_val, and add_val;
4241 then for each giv, check to see if its only use dies in a following
4242 memory address. If so, generate a new memory address and check to see
4243 if it is valid. If it is valid, then store the modified memory address,
4244 otherwise, mark the giv as not done so that it will get its own iv. */
4246 /* ??? Could try to optimize branches when it is known that a biv is always
4247 positive. */
4249 /* ??? When replace a biv in a compare insn, we should replace with closest
4250 giv so that an optimized branch can still be recognized by the combiner,
4251 e.g. the VAX acb insn. */
4253 /* ??? Many of the checks involving uid_luid could be simplified if regscan
4254 was rerun in loop_optimize whenever a register was added or moved.
4255 Also, some of the optimizations could be a little less conservative. */
4257 /* Scan the loop body and call FNCALL for each insn. In the addition to the
4258 LOOP and INSN parameters pass MAYBE_MULTIPLE and NOT_EVERY_ITERATION to the
4259 callback.
4261 NOT_EVERY_ITERATION is 1 if current insn is not known to be executed at
4262 least once for every loop iteration except for the last one.
4264 MAYBE_MULTIPLE is 1 if current insn may be executed more than once for every
4265 loop iteration.
4267 void
4268 for_each_insn_in_loop (loop, fncall)
4269 struct loop *loop;
4270 loop_insn_callback fncall;
4272 int not_every_iteration = 0;
4273 int maybe_multiple = 0;
4274 int past_loop_latch = 0;
4275 int loop_depth = 0;
4276 rtx p;
4278 /* If loop_scan_start points to the loop exit test, we have to be wary of
4279 subversive use of gotos inside expression statements. */
4280 if (prev_nonnote_insn (loop->scan_start) != prev_nonnote_insn (loop->start))
4281 maybe_multiple = back_branch_in_range_p (loop, loop->scan_start);
4283 /* Scan through loop and update NOT_EVERY_ITERATION and MAYBE_MULTIPLE. */
4284 for (p = next_insn_in_loop (loop, loop->scan_start);
4285 p != NULL_RTX;
4286 p = next_insn_in_loop (loop, p))
4288 p = fncall (loop, p, not_every_iteration, maybe_multiple);
4290 /* Past CODE_LABEL, we get to insns that may be executed multiple
4291 times. The only way we can be sure that they can't is if every
4292 jump insn between here and the end of the loop either
4293 returns, exits the loop, is a jump to a location that is still
4294 behind the label, or is a jump to the loop start. */
4296 if (GET_CODE (p) == CODE_LABEL)
4298 rtx insn = p;
4300 maybe_multiple = 0;
4302 while (1)
4304 insn = NEXT_INSN (insn);
4305 if (insn == loop->scan_start)
4306 break;
4307 if (insn == loop->end)
4309 if (loop->top != 0)
4310 insn = loop->top;
4311 else
4312 break;
4313 if (insn == loop->scan_start)
4314 break;
4317 if (GET_CODE (insn) == JUMP_INSN
4318 && GET_CODE (PATTERN (insn)) != RETURN
4319 && (!any_condjump_p (insn)
4320 || (JUMP_LABEL (insn) != 0
4321 && JUMP_LABEL (insn) != loop->scan_start
4322 && !loop_insn_first_p (p, JUMP_LABEL (insn)))))
4324 maybe_multiple = 1;
4325 break;
4330 /* Past a jump, we get to insns for which we can't count
4331 on whether they will be executed during each iteration. */
4332 /* This code appears twice in strength_reduce. There is also similar
4333 code in scan_loop. */
4334 if (GET_CODE (p) == JUMP_INSN
4335 /* If we enter the loop in the middle, and scan around to the
4336 beginning, don't set not_every_iteration for that.
4337 This can be any kind of jump, since we want to know if insns
4338 will be executed if the loop is executed. */
4339 && !(JUMP_LABEL (p) == loop->top
4340 && ((NEXT_INSN (NEXT_INSN (p)) == loop->end
4341 && any_uncondjump_p (p))
4342 || (NEXT_INSN (p) == loop->end && any_condjump_p (p)))))
4344 rtx label = 0;
4346 /* If this is a jump outside the loop, then it also doesn't
4347 matter. Check to see if the target of this branch is on the
4348 loop->exits_labels list. */
4350 for (label = loop->exit_labels; label; label = LABEL_NEXTREF (label))
4351 if (XEXP (label, 0) == JUMP_LABEL (p))
4352 break;
4354 if (!label)
4355 not_every_iteration = 1;
4358 else if (GET_CODE (p) == NOTE)
4360 /* At the virtual top of a converted loop, insns are again known to
4361 be executed each iteration: logically, the loop begins here
4362 even though the exit code has been duplicated.
4364 Insns are also again known to be executed each iteration at
4365 the LOOP_CONT note. */
4366 if ((NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_VTOP
4367 || NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_CONT)
4368 && loop_depth == 0)
4369 not_every_iteration = 0;
4370 else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
4371 loop_depth++;
4372 else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END)
4373 loop_depth--;
4376 /* Note if we pass a loop latch. If we do, then we can not clear
4377 NOT_EVERY_ITERATION below when we pass the last CODE_LABEL in
4378 a loop since a jump before the last CODE_LABEL may have started
4379 a new loop iteration.
4381 Note that LOOP_TOP is only set for rotated loops and we need
4382 this check for all loops, so compare against the CODE_LABEL
4383 which immediately follows LOOP_START. */
4384 if (GET_CODE (p) == JUMP_INSN
4385 && JUMP_LABEL (p) == NEXT_INSN (loop->start))
4386 past_loop_latch = 1;
4388 /* Unlike in the code motion pass where MAYBE_NEVER indicates that
4389 an insn may never be executed, NOT_EVERY_ITERATION indicates whether
4390 or not an insn is known to be executed each iteration of the
4391 loop, whether or not any iterations are known to occur.
4393 Therefore, if we have just passed a label and have no more labels
4394 between here and the test insn of the loop, and we have not passed
4395 a jump to the top of the loop, then we know these insns will be
4396 executed each iteration. */
4398 if (not_every_iteration
4399 && !past_loop_latch
4400 && GET_CODE (p) == CODE_LABEL
4401 && no_labels_between_p (p, loop->end)
4402 && loop_insn_first_p (p, loop->cont))
4403 not_every_iteration = 0;
4407 static void
4408 loop_bivs_find (loop)
4409 struct loop *loop;
4411 struct loop_regs *regs = LOOP_REGS (loop);
4412 struct loop_ivs *ivs = LOOP_IVS (loop);
4413 /* Temporary list pointers for traversing ivs->list. */
4414 struct iv_class *bl, **backbl;
4416 ivs->list = 0;
4418 for_each_insn_in_loop (loop, check_insn_for_bivs);
4420 /* Scan ivs->list to remove all regs that proved not to be bivs.
4421 Make a sanity check against regs->n_times_set. */
4422 for (backbl = &ivs->list, bl = *backbl; bl; bl = bl->next)
4424 if (REG_IV_TYPE (ivs, bl->regno) != BASIC_INDUCT
4425 /* Above happens if register modified by subreg, etc. */
4426 /* Make sure it is not recognized as a basic induction var: */
4427 || regs->array[bl->regno].n_times_set != bl->biv_count
4428 /* If never incremented, it is invariant that we decided not to
4429 move. So leave it alone. */
4430 || ! bl->incremented)
4432 if (loop_dump_stream)
4433 fprintf (loop_dump_stream, "Biv %d: discarded, %s\n",
4434 bl->regno,
4435 (REG_IV_TYPE (ivs, bl->regno) != BASIC_INDUCT
4436 ? "not induction variable"
4437 : (! bl->incremented ? "never incremented"
4438 : "count error")));
4440 REG_IV_TYPE (ivs, bl->regno) = NOT_BASIC_INDUCT;
4441 *backbl = bl->next;
4443 else
4445 backbl = &bl->next;
4447 if (loop_dump_stream)
4448 fprintf (loop_dump_stream, "Biv %d: verified\n", bl->regno);
4454 /* Determine how BIVS are initialized by looking through pre-header
4455 extended basic block. */
4456 static void
4457 loop_bivs_init_find (loop)
4458 struct loop *loop;
4460 struct loop_ivs *ivs = LOOP_IVS (loop);
4461 /* Temporary list pointers for traversing ivs->list. */
4462 struct iv_class *bl;
4463 int call_seen;
4464 rtx p;
4466 /* Find initial value for each biv by searching backwards from loop_start,
4467 halting at first label. Also record any test condition. */
4469 call_seen = 0;
4470 for (p = loop->start; p && GET_CODE (p) != CODE_LABEL; p = PREV_INSN (p))
4472 rtx test;
4474 note_insn = p;
4476 if (GET_CODE (p) == CALL_INSN)
4477 call_seen = 1;
4479 if (INSN_P (p))
4480 note_stores (PATTERN (p), record_initial, ivs);
4482 /* Record any test of a biv that branches around the loop if no store
4483 between it and the start of loop. We only care about tests with
4484 constants and registers and only certain of those. */
4485 if (GET_CODE (p) == JUMP_INSN
4486 && JUMP_LABEL (p) != 0
4487 && next_real_insn (JUMP_LABEL (p)) == next_real_insn (loop->end)
4488 && (test = get_condition_for_loop (loop, p)) != 0
4489 && GET_CODE (XEXP (test, 0)) == REG
4490 && REGNO (XEXP (test, 0)) < max_reg_before_loop
4491 && (bl = REG_IV_CLASS (ivs, REGNO (XEXP (test, 0)))) != 0
4492 && valid_initial_value_p (XEXP (test, 1), p, call_seen, loop->start)
4493 && bl->init_insn == 0)
4495 /* If an NE test, we have an initial value! */
4496 if (GET_CODE (test) == NE)
4498 bl->init_insn = p;
4499 bl->init_set = gen_rtx_SET (VOIDmode,
4500 XEXP (test, 0), XEXP (test, 1));
4502 else
4503 bl->initial_test = test;
4509 /* Look at the each biv and see if we can say anything better about its
4510 initial value from any initializing insns set up above. (This is done
4511 in two passes to avoid missing SETs in a PARALLEL.) */
4512 static void
4513 loop_bivs_check (loop)
4514 struct loop *loop;
4516 struct loop_ivs *ivs = LOOP_IVS (loop);
4517 /* Temporary list pointers for traversing ivs->list. */
4518 struct iv_class *bl;
4519 struct iv_class **backbl;
4521 for (backbl = &ivs->list; (bl = *backbl); backbl = &bl->next)
4523 rtx src;
4524 rtx note;
4526 if (! bl->init_insn)
4527 continue;
4529 /* IF INIT_INSN has a REG_EQUAL or REG_EQUIV note and the value
4530 is a constant, use the value of that. */
4531 if (((note = find_reg_note (bl->init_insn, REG_EQUAL, 0)) != NULL
4532 && CONSTANT_P (XEXP (note, 0)))
4533 || ((note = find_reg_note (bl->init_insn, REG_EQUIV, 0)) != NULL
4534 && CONSTANT_P (XEXP (note, 0))))
4535 src = XEXP (note, 0);
4536 else
4537 src = SET_SRC (bl->init_set);
4539 if (loop_dump_stream)
4540 fprintf (loop_dump_stream,
4541 "Biv %d: initialized at insn %d: initial value ",
4542 bl->regno, INSN_UID (bl->init_insn));
4544 if ((GET_MODE (src) == GET_MODE (regno_reg_rtx[bl->regno])
4545 || GET_MODE (src) == VOIDmode)
4546 && valid_initial_value_p (src, bl->init_insn,
4547 LOOP_INFO (loop)->pre_header_has_call,
4548 loop->start))
4550 bl->initial_value = src;
4552 if (loop_dump_stream)
4554 print_simple_rtl (loop_dump_stream, src);
4555 fputc ('\n', loop_dump_stream);
4558 /* If we can't make it a giv,
4559 let biv keep initial value of "itself". */
4560 else if (loop_dump_stream)
4561 fprintf (loop_dump_stream, "is complex\n");
4566 /* Search the loop for general induction variables. */
4568 static void
4569 loop_givs_find (loop)
4570 struct loop* loop;
4572 for_each_insn_in_loop (loop, check_insn_for_givs);
4576 /* For each giv for which we still don't know whether or not it is
4577 replaceable, check to see if it is replaceable because its final value
4578 can be calculated. */
4580 static void
4581 loop_givs_check (loop)
4582 struct loop *loop;
4584 struct loop_ivs *ivs = LOOP_IVS (loop);
4585 struct iv_class *bl;
4587 for (bl = ivs->list; bl; bl = bl->next)
4589 struct induction *v;
4591 for (v = bl->giv; v; v = v->next_iv)
4592 if (! v->replaceable && ! v->not_replaceable)
4593 check_final_value (loop, v);
4598 /* Return nonzero if it is possible to eliminate the biv BL provided
4599 all givs are reduced. This is possible if either the reg is not
4600 used outside the loop, or we can compute what its final value will
4601 be. */
4603 static int
4604 loop_biv_eliminable_p (loop, bl, threshold, insn_count)
4605 struct loop *loop;
4606 struct iv_class *bl;
4607 int threshold;
4608 int insn_count;
4610 /* For architectures with a decrement_and_branch_until_zero insn,
4611 don't do this if we put a REG_NONNEG note on the endtest for this
4612 biv. */
4614 #ifdef HAVE_decrement_and_branch_until_zero
4615 if (bl->nonneg)
4617 if (loop_dump_stream)
4618 fprintf (loop_dump_stream,
4619 "Cannot eliminate nonneg biv %d.\n", bl->regno);
4620 return 0;
4622 #endif
4624 /* Check that biv is used outside loop or if it has a final value.
4625 Compare against bl->init_insn rather than loop->start. We aren't
4626 concerned with any uses of the biv between init_insn and
4627 loop->start since these won't be affected by the value of the biv
4628 elsewhere in the function, so long as init_insn doesn't use the
4629 biv itself. */
4631 if ((REGNO_LAST_LUID (bl->regno) < INSN_LUID (loop->end)
4632 && bl->init_insn
4633 && INSN_UID (bl->init_insn) < max_uid_for_loop
4634 && REGNO_FIRST_LUID (bl->regno) >= INSN_LUID (bl->init_insn)
4635 && ! reg_mentioned_p (bl->biv->dest_reg, SET_SRC (bl->init_set)))
4636 || (bl->final_value = final_biv_value (loop, bl)))
4637 return maybe_eliminate_biv (loop, bl, 0, threshold, insn_count);
4639 if (loop_dump_stream)
4641 fprintf (loop_dump_stream,
4642 "Cannot eliminate biv %d.\n",
4643 bl->regno);
4644 fprintf (loop_dump_stream,
4645 "First use: insn %d, last use: insn %d.\n",
4646 REGNO_FIRST_UID (bl->regno),
4647 REGNO_LAST_UID (bl->regno));
4649 return 0;
4653 /* Reduce each giv of BL that we have decided to reduce. */
4655 static void
4656 loop_givs_reduce (loop, bl)
4657 struct loop *loop;
4658 struct iv_class *bl;
4660 struct induction *v;
4662 for (v = bl->giv; v; v = v->next_iv)
4664 struct induction *tv;
4665 if (! v->ignore && v->same == 0)
4667 int auto_inc_opt = 0;
4669 /* If the code for derived givs immediately below has already
4670 allocated a new_reg, we must keep it. */
4671 if (! v->new_reg)
4672 v->new_reg = gen_reg_rtx (v->mode);
4674 #ifdef AUTO_INC_DEC
4675 /* If the target has auto-increment addressing modes, and
4676 this is an address giv, then try to put the increment
4677 immediately after its use, so that flow can create an
4678 auto-increment addressing mode. */
4679 if (v->giv_type == DEST_ADDR && bl->biv_count == 1
4680 && bl->biv->always_executed && ! bl->biv->maybe_multiple
4681 /* We don't handle reversed biv's because bl->biv->insn
4682 does not have a valid INSN_LUID. */
4683 && ! bl->reversed
4684 && v->always_executed && ! v->maybe_multiple
4685 && INSN_UID (v->insn) < max_uid_for_loop)
4687 /* If other giv's have been combined with this one, then
4688 this will work only if all uses of the other giv's occur
4689 before this giv's insn. This is difficult to check.
4691 We simplify this by looking for the common case where
4692 there is one DEST_REG giv, and this giv's insn is the
4693 last use of the dest_reg of that DEST_REG giv. If the
4694 increment occurs after the address giv, then we can
4695 perform the optimization. (Otherwise, the increment
4696 would have to go before other_giv, and we would not be
4697 able to combine it with the address giv to get an
4698 auto-inc address.) */
4699 if (v->combined_with)
4701 struct induction *other_giv = 0;
4703 for (tv = bl->giv; tv; tv = tv->next_iv)
4704 if (tv->same == v)
4706 if (other_giv)
4707 break;
4708 else
4709 other_giv = tv;
4711 if (! tv && other_giv
4712 && REGNO (other_giv->dest_reg) < max_reg_before_loop
4713 && (REGNO_LAST_UID (REGNO (other_giv->dest_reg))
4714 == INSN_UID (v->insn))
4715 && INSN_LUID (v->insn) < INSN_LUID (bl->biv->insn))
4716 auto_inc_opt = 1;
4718 /* Check for case where increment is before the address
4719 giv. Do this test in "loop order". */
4720 else if ((INSN_LUID (v->insn) > INSN_LUID (bl->biv->insn)
4721 && (INSN_LUID (v->insn) < INSN_LUID (loop->scan_start)
4722 || (INSN_LUID (bl->biv->insn)
4723 > INSN_LUID (loop->scan_start))))
4724 || (INSN_LUID (v->insn) < INSN_LUID (loop->scan_start)
4725 && (INSN_LUID (loop->scan_start)
4726 < INSN_LUID (bl->biv->insn))))
4727 auto_inc_opt = -1;
4728 else
4729 auto_inc_opt = 1;
4731 #ifdef HAVE_cc0
4733 rtx prev;
4735 /* We can't put an insn immediately after one setting
4736 cc0, or immediately before one using cc0. */
4737 if ((auto_inc_opt == 1 && sets_cc0_p (PATTERN (v->insn)))
4738 || (auto_inc_opt == -1
4739 && (prev = prev_nonnote_insn (v->insn)) != 0
4740 && INSN_P (prev)
4741 && sets_cc0_p (PATTERN (prev))))
4742 auto_inc_opt = 0;
4744 #endif
4746 if (auto_inc_opt)
4747 v->auto_inc_opt = 1;
4749 #endif
4751 /* For each place where the biv is incremented, add an insn
4752 to increment the new, reduced reg for the giv. */
4753 for (tv = bl->biv; tv; tv = tv->next_iv)
4755 rtx insert_before;
4757 if (! auto_inc_opt)
4758 insert_before = NEXT_INSN (tv->insn);
4759 else if (auto_inc_opt == 1)
4760 insert_before = NEXT_INSN (v->insn);
4761 else
4762 insert_before = v->insn;
4764 if (tv->mult_val == const1_rtx)
4765 loop_iv_add_mult_emit_before (loop, tv->add_val, v->mult_val,
4766 v->new_reg, v->new_reg,
4767 0, insert_before);
4768 else /* tv->mult_val == const0_rtx */
4769 /* A multiply is acceptable here
4770 since this is presumed to be seldom executed. */
4771 loop_iv_add_mult_emit_before (loop, tv->add_val, v->mult_val,
4772 v->add_val, v->new_reg,
4773 0, insert_before);
4776 /* Add code at loop start to initialize giv's reduced reg. */
4778 loop_iv_add_mult_hoist (loop,
4779 extend_value_for_giv (v, bl->initial_value),
4780 v->mult_val, v->add_val, v->new_reg);
4786 /* Check for givs whose first use is their definition and whose
4787 last use is the definition of another giv. If so, it is likely
4788 dead and should not be used to derive another giv nor to
4789 eliminate a biv. */
4791 static void
4792 loop_givs_dead_check (loop, bl)
4793 struct loop *loop ATTRIBUTE_UNUSED;
4794 struct iv_class *bl;
4796 struct induction *v;
4798 for (v = bl->giv; v; v = v->next_iv)
4800 if (v->ignore
4801 || (v->same && v->same->ignore))
4802 continue;
4804 if (v->giv_type == DEST_REG
4805 && REGNO_FIRST_UID (REGNO (v->dest_reg)) == INSN_UID (v->insn))
4807 struct induction *v1;
4809 for (v1 = bl->giv; v1; v1 = v1->next_iv)
4810 if (REGNO_LAST_UID (REGNO (v->dest_reg)) == INSN_UID (v1->insn))
4811 v->maybe_dead = 1;
4817 static void
4818 loop_givs_rescan (loop, bl, reg_map)
4819 struct loop *loop;
4820 struct iv_class *bl;
4821 rtx *reg_map;
4823 struct induction *v;
4825 for (v = bl->giv; v; v = v->next_iv)
4827 if (v->same && v->same->ignore)
4828 v->ignore = 1;
4830 if (v->ignore)
4831 continue;
4833 /* Update expression if this was combined, in case other giv was
4834 replaced. */
4835 if (v->same)
4836 v->new_reg = replace_rtx (v->new_reg,
4837 v->same->dest_reg, v->same->new_reg);
4839 /* See if this register is known to be a pointer to something. If
4840 so, see if we can find the alignment. First see if there is a
4841 destination register that is a pointer. If so, this shares the
4842 alignment too. Next see if we can deduce anything from the
4843 computational information. If not, and this is a DEST_ADDR
4844 giv, at least we know that it's a pointer, though we don't know
4845 the alignment. */
4846 if (GET_CODE (v->new_reg) == REG
4847 && v->giv_type == DEST_REG
4848 && REG_POINTER (v->dest_reg))
4849 mark_reg_pointer (v->new_reg,
4850 REGNO_POINTER_ALIGN (REGNO (v->dest_reg)));
4851 else if (GET_CODE (v->new_reg) == REG
4852 && REG_POINTER (v->src_reg))
4854 unsigned int align = REGNO_POINTER_ALIGN (REGNO (v->src_reg));
4856 if (align == 0
4857 || GET_CODE (v->add_val) != CONST_INT
4858 || INTVAL (v->add_val) % (align / BITS_PER_UNIT) != 0)
4859 align = 0;
4861 mark_reg_pointer (v->new_reg, align);
4863 else if (GET_CODE (v->new_reg) == REG
4864 && GET_CODE (v->add_val) == REG
4865 && REG_POINTER (v->add_val))
4867 unsigned int align = REGNO_POINTER_ALIGN (REGNO (v->add_val));
4869 if (align == 0 || GET_CODE (v->mult_val) != CONST_INT
4870 || INTVAL (v->mult_val) % (align / BITS_PER_UNIT) != 0)
4871 align = 0;
4873 mark_reg_pointer (v->new_reg, align);
4875 else if (GET_CODE (v->new_reg) == REG && v->giv_type == DEST_ADDR)
4876 mark_reg_pointer (v->new_reg, 0);
4878 if (v->giv_type == DEST_ADDR)
4879 /* Store reduced reg as the address in the memref where we found
4880 this giv. */
4881 validate_change (v->insn, v->location, v->new_reg, 0);
4882 else if (v->replaceable)
4884 reg_map[REGNO (v->dest_reg)] = v->new_reg;
4886 else
4888 rtx original_insn = v->insn;
4889 rtx note;
4891 /* Not replaceable; emit an insn to set the original giv reg from
4892 the reduced giv, same as above. */
4893 v->insn = loop_insn_emit_after (loop, 0, original_insn,
4894 gen_move_insn (v->dest_reg,
4895 v->new_reg));
4897 /* The original insn may have a REG_EQUAL note. This note is
4898 now incorrect and may result in invalid substitutions later.
4899 The original insn is dead, but may be part of a libcall
4900 sequence, which doesn't seem worth the bother of handling. */
4901 note = find_reg_note (original_insn, REG_EQUAL, NULL_RTX);
4902 if (note)
4903 remove_note (original_insn, note);
4906 /* When a loop is reversed, givs which depend on the reversed
4907 biv, and which are live outside the loop, must be set to their
4908 correct final value. This insn is only needed if the giv is
4909 not replaceable. The correct final value is the same as the
4910 value that the giv starts the reversed loop with. */
4911 if (bl->reversed && ! v->replaceable)
4912 loop_iv_add_mult_sink (loop,
4913 extend_value_for_giv (v, bl->initial_value),
4914 v->mult_val, v->add_val, v->dest_reg);
4915 else if (v->final_value)
4916 loop_insn_sink_or_swim (loop,
4917 gen_load_of_final_value (v->dest_reg,
4918 v->final_value));
4920 if (loop_dump_stream)
4922 fprintf (loop_dump_stream, "giv at %d reduced to ",
4923 INSN_UID (v->insn));
4924 print_simple_rtl (loop_dump_stream, v->new_reg);
4925 fprintf (loop_dump_stream, "\n");
4931 static int
4932 loop_giv_reduce_benefit (loop, bl, v, test_reg)
4933 struct loop *loop ATTRIBUTE_UNUSED;
4934 struct iv_class *bl;
4935 struct induction *v;
4936 rtx test_reg;
4938 int add_cost;
4939 int benefit;
4941 benefit = v->benefit;
4942 PUT_MODE (test_reg, v->mode);
4943 add_cost = iv_add_mult_cost (bl->biv->add_val, v->mult_val,
4944 test_reg, test_reg);
4946 /* Reduce benefit if not replaceable, since we will insert a
4947 move-insn to replace the insn that calculates this giv. Don't do
4948 this unless the giv is a user variable, since it will often be
4949 marked non-replaceable because of the duplication of the exit
4950 code outside the loop. In such a case, the copies we insert are
4951 dead and will be deleted. So they don't have a cost. Similar
4952 situations exist. */
4953 /* ??? The new final_[bg]iv_value code does a much better job of
4954 finding replaceable giv's, and hence this code may no longer be
4955 necessary. */
4956 if (! v->replaceable && ! bl->eliminable
4957 && REG_USERVAR_P (v->dest_reg))
4958 benefit -= copy_cost;
4960 /* Decrease the benefit to count the add-insns that we will insert
4961 to increment the reduced reg for the giv. ??? This can
4962 overestimate the run-time cost of the additional insns, e.g. if
4963 there are multiple basic blocks that increment the biv, but only
4964 one of these blocks is executed during each iteration. There is
4965 no good way to detect cases like this with the current structure
4966 of the loop optimizer. This code is more accurate for
4967 determining code size than run-time benefits. */
4968 benefit -= add_cost * bl->biv_count;
4970 /* Decide whether to strength-reduce this giv or to leave the code
4971 unchanged (recompute it from the biv each time it is used). This
4972 decision can be made independently for each giv. */
4974 #ifdef AUTO_INC_DEC
4975 /* Attempt to guess whether autoincrement will handle some of the
4976 new add insns; if so, increase BENEFIT (undo the subtraction of
4977 add_cost that was done above). */
4978 if (v->giv_type == DEST_ADDR
4979 /* Increasing the benefit is risky, since this is only a guess.
4980 Avoid increasing register pressure in cases where there would
4981 be no other benefit from reducing this giv. */
4982 && benefit > 0
4983 && GET_CODE (v->mult_val) == CONST_INT)
4985 int size = GET_MODE_SIZE (GET_MODE (v->mem));
4987 if (HAVE_POST_INCREMENT
4988 && INTVAL (v->mult_val) == size)
4989 benefit += add_cost * bl->biv_count;
4990 else if (HAVE_PRE_INCREMENT
4991 && INTVAL (v->mult_val) == size)
4992 benefit += add_cost * bl->biv_count;
4993 else if (HAVE_POST_DECREMENT
4994 && -INTVAL (v->mult_val) == size)
4995 benefit += add_cost * bl->biv_count;
4996 else if (HAVE_PRE_DECREMENT
4997 && -INTVAL (v->mult_val) == size)
4998 benefit += add_cost * bl->biv_count;
5000 #endif
5002 return benefit;
5006 /* Free IV structures for LOOP. */
5008 static void
5009 loop_ivs_free (loop)
5010 struct loop *loop;
5012 struct loop_ivs *ivs = LOOP_IVS (loop);
5013 struct iv_class *iv = ivs->list;
5015 free (ivs->regs);
5017 while (iv)
5019 struct iv_class *next = iv->next;
5020 struct induction *induction;
5021 struct induction *next_induction;
5023 for (induction = iv->biv; induction; induction = next_induction)
5025 next_induction = induction->next_iv;
5026 free (induction);
5028 for (induction = iv->giv; induction; induction = next_induction)
5030 next_induction = induction->next_iv;
5031 free (induction);
5034 free (iv);
5035 iv = next;
5040 /* Perform strength reduction and induction variable elimination.
5042 Pseudo registers created during this function will be beyond the
5043 last valid index in several tables including
5044 REGS->ARRAY[I].N_TIMES_SET and REGNO_LAST_UID. This does not cause a
5045 problem here, because the added registers cannot be givs outside of
5046 their loop, and hence will never be reconsidered. But scan_loop
5047 must check regnos to make sure they are in bounds. */
5049 static void
5050 strength_reduce (loop, flags)
5051 struct loop *loop;
5052 int flags;
5054 struct loop_info *loop_info = LOOP_INFO (loop);
5055 struct loop_regs *regs = LOOP_REGS (loop);
5056 struct loop_ivs *ivs = LOOP_IVS (loop);
5057 rtx p;
5058 /* Temporary list pointer for traversing ivs->list. */
5059 struct iv_class *bl;
5060 /* Ratio of extra register life span we can justify
5061 for saving an instruction. More if loop doesn't call subroutines
5062 since in that case saving an insn makes more difference
5063 and more registers are available. */
5064 /* ??? could set this to last value of threshold in move_movables */
5065 int threshold = (loop_info->has_call ? 1 : 2) * (3 + n_non_fixed_regs);
5066 /* Map of pseudo-register replacements. */
5067 rtx *reg_map = NULL;
5068 int reg_map_size;
5069 int unrolled_insn_copies = 0;
5070 rtx test_reg = gen_rtx_REG (word_mode, LAST_VIRTUAL_REGISTER + 1);
5071 int insn_count = count_insns_in_loop (loop);
5073 addr_placeholder = gen_reg_rtx (Pmode);
5075 ivs->n_regs = max_reg_before_loop;
5076 ivs->regs = (struct iv *) xcalloc (ivs->n_regs, sizeof (struct iv));
5078 /* Find all BIVs in loop. */
5079 loop_bivs_find (loop);
5081 /* Exit if there are no bivs. */
5082 if (! ivs->list)
5084 /* Can still unroll the loop anyways, but indicate that there is no
5085 strength reduction info available. */
5086 if (flags & LOOP_UNROLL)
5087 unroll_loop (loop, insn_count, 0);
5089 loop_ivs_free (loop);
5090 return;
5093 /* Determine how BIVS are initialized by looking through pre-header
5094 extended basic block. */
5095 loop_bivs_init_find (loop);
5097 /* Look at the each biv and see if we can say anything better about its
5098 initial value from any initializing insns set up above. */
5099 loop_bivs_check (loop);
5101 /* Search the loop for general induction variables. */
5102 loop_givs_find (loop);
5104 /* Try to calculate and save the number of loop iterations. This is
5105 set to zero if the actual number can not be calculated. This must
5106 be called after all giv's have been identified, since otherwise it may
5107 fail if the iteration variable is a giv. */
5108 loop_iterations (loop);
5110 #ifdef HAVE_prefetch
5111 if (flags & LOOP_PREFETCH)
5112 emit_prefetch_instructions (loop);
5113 #endif
5115 /* Now for each giv for which we still don't know whether or not it is
5116 replaceable, check to see if it is replaceable because its final value
5117 can be calculated. This must be done after loop_iterations is called,
5118 so that final_giv_value will work correctly. */
5119 loop_givs_check (loop);
5121 /* Try to prove that the loop counter variable (if any) is always
5122 nonnegative; if so, record that fact with a REG_NONNEG note
5123 so that "decrement and branch until zero" insn can be used. */
5124 check_dbra_loop (loop, insn_count);
5126 /* Create reg_map to hold substitutions for replaceable giv regs.
5127 Some givs might have been made from biv increments, so look at
5128 ivs->reg_iv_type for a suitable size. */
5129 reg_map_size = ivs->n_regs;
5130 reg_map = (rtx *) xcalloc (reg_map_size, sizeof (rtx));
5132 /* Examine each iv class for feasibility of strength reduction/induction
5133 variable elimination. */
5135 for (bl = ivs->list; bl; bl = bl->next)
5137 struct induction *v;
5138 int benefit;
5140 /* Test whether it will be possible to eliminate this biv
5141 provided all givs are reduced. */
5142 bl->eliminable = loop_biv_eliminable_p (loop, bl, threshold, insn_count);
5144 /* This will be true at the end, if all givs which depend on this
5145 biv have been strength reduced.
5146 We can't (currently) eliminate the biv unless this is so. */
5147 bl->all_reduced = 1;
5149 /* Check each extension dependent giv in this class to see if its
5150 root biv is safe from wrapping in the interior mode. */
5151 check_ext_dependent_givs (bl, loop_info);
5153 /* Combine all giv's for this iv_class. */
5154 combine_givs (regs, bl);
5156 for (v = bl->giv; v; v = v->next_iv)
5158 struct induction *tv;
5160 if (v->ignore || v->same)
5161 continue;
5163 benefit = loop_giv_reduce_benefit (loop, bl, v, test_reg);
5165 /* If an insn is not to be strength reduced, then set its ignore
5166 flag, and clear bl->all_reduced. */
5168 /* A giv that depends on a reversed biv must be reduced if it is
5169 used after the loop exit, otherwise, it would have the wrong
5170 value after the loop exit. To make it simple, just reduce all
5171 of such giv's whether or not we know they are used after the loop
5172 exit. */
5174 if (! flag_reduce_all_givs
5175 && v->lifetime * threshold * benefit < insn_count
5176 && ! bl->reversed)
5178 if (loop_dump_stream)
5179 fprintf (loop_dump_stream,
5180 "giv of insn %d not worth while, %d vs %d.\n",
5181 INSN_UID (v->insn),
5182 v->lifetime * threshold * benefit, insn_count);
5183 v->ignore = 1;
5184 bl->all_reduced = 0;
5186 else
5188 /* Check that we can increment the reduced giv without a
5189 multiply insn. If not, reject it. */
5191 for (tv = bl->biv; tv; tv = tv->next_iv)
5192 if (tv->mult_val == const1_rtx
5193 && ! product_cheap_p (tv->add_val, v->mult_val))
5195 if (loop_dump_stream)
5196 fprintf (loop_dump_stream,
5197 "giv of insn %d: would need a multiply.\n",
5198 INSN_UID (v->insn));
5199 v->ignore = 1;
5200 bl->all_reduced = 0;
5201 break;
5206 /* Check for givs whose first use is their definition and whose
5207 last use is the definition of another giv. If so, it is likely
5208 dead and should not be used to derive another giv nor to
5209 eliminate a biv. */
5210 loop_givs_dead_check (loop, bl);
5212 /* Reduce each giv that we decided to reduce. */
5213 loop_givs_reduce (loop, bl);
5215 /* Rescan all givs. If a giv is the same as a giv not reduced, mark it
5216 as not reduced.
5218 For each giv register that can be reduced now: if replaceable,
5219 substitute reduced reg wherever the old giv occurs;
5220 else add new move insn "giv_reg = reduced_reg". */
5221 loop_givs_rescan (loop, bl, reg_map);
5223 /* All the givs based on the biv bl have been reduced if they
5224 merit it. */
5226 /* For each giv not marked as maybe dead that has been combined with a
5227 second giv, clear any "maybe dead" mark on that second giv.
5228 v->new_reg will either be or refer to the register of the giv it
5229 combined with.
5231 Doing this clearing avoids problems in biv elimination where
5232 a giv's new_reg is a complex value that can't be put in the
5233 insn but the giv combined with (with a reg as new_reg) is
5234 marked maybe_dead. Since the register will be used in either
5235 case, we'd prefer it be used from the simpler giv. */
5237 for (v = bl->giv; v; v = v->next_iv)
5238 if (! v->maybe_dead && v->same)
5239 v->same->maybe_dead = 0;
5241 /* Try to eliminate the biv, if it is a candidate.
5242 This won't work if ! bl->all_reduced,
5243 since the givs we planned to use might not have been reduced.
5245 We have to be careful that we didn't initially think we could
5246 eliminate this biv because of a giv that we now think may be
5247 dead and shouldn't be used as a biv replacement.
5249 Also, there is the possibility that we may have a giv that looks
5250 like it can be used to eliminate a biv, but the resulting insn
5251 isn't valid. This can happen, for example, on the 88k, where a
5252 JUMP_INSN can compare a register only with zero. Attempts to
5253 replace it with a compare with a constant will fail.
5255 Note that in cases where this call fails, we may have replaced some
5256 of the occurrences of the biv with a giv, but no harm was done in
5257 doing so in the rare cases where it can occur. */
5259 if (bl->all_reduced == 1 && bl->eliminable
5260 && maybe_eliminate_biv (loop, bl, 1, threshold, insn_count))
5262 /* ?? If we created a new test to bypass the loop entirely,
5263 or otherwise drop straight in, based on this test, then
5264 we might want to rewrite it also. This way some later
5265 pass has more hope of removing the initialization of this
5266 biv entirely. */
5268 /* If final_value != 0, then the biv may be used after loop end
5269 and we must emit an insn to set it just in case.
5271 Reversed bivs already have an insn after the loop setting their
5272 value, so we don't need another one. We can't calculate the
5273 proper final value for such a biv here anyways. */
5274 if (bl->final_value && ! bl->reversed)
5275 loop_insn_sink_or_swim (loop,
5276 gen_load_of_final_value (bl->biv->dest_reg,
5277 bl->final_value));
5279 if (loop_dump_stream)
5280 fprintf (loop_dump_stream, "Reg %d: biv eliminated\n",
5281 bl->regno);
5283 /* See above note wrt final_value. But since we couldn't eliminate
5284 the biv, we must set the value after the loop instead of before. */
5285 else if (bl->final_value && ! bl->reversed)
5286 loop_insn_sink (loop, gen_load_of_final_value (bl->biv->dest_reg,
5287 bl->final_value));
5290 /* Go through all the instructions in the loop, making all the
5291 register substitutions scheduled in REG_MAP. */
5293 for (p = loop->start; p != loop->end; p = NEXT_INSN (p))
5294 if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
5295 || GET_CODE (p) == CALL_INSN)
5297 replace_regs (PATTERN (p), reg_map, reg_map_size, 0);
5298 replace_regs (REG_NOTES (p), reg_map, reg_map_size, 0);
5299 INSN_CODE (p) = -1;
5302 if (loop_info->n_iterations > 0)
5304 /* When we completely unroll a loop we will likely not need the increment
5305 of the loop BIV and we will not need the conditional branch at the
5306 end of the loop. */
5307 unrolled_insn_copies = insn_count - 2;
5309 #ifdef HAVE_cc0
5310 /* When we completely unroll a loop on a HAVE_cc0 machine we will not
5311 need the comparison before the conditional branch at the end of the
5312 loop. */
5313 unrolled_insn_copies -= 1;
5314 #endif
5316 /* We'll need one copy for each loop iteration. */
5317 unrolled_insn_copies *= loop_info->n_iterations;
5319 /* A little slop to account for the ability to remove initialization
5320 code, better CSE, and other secondary benefits of completely
5321 unrolling some loops. */
5322 unrolled_insn_copies -= 1;
5324 /* Clamp the value. */
5325 if (unrolled_insn_copies < 0)
5326 unrolled_insn_copies = 0;
5329 /* Unroll loops from within strength reduction so that we can use the
5330 induction variable information that strength_reduce has already
5331 collected. Always unroll loops that would be as small or smaller
5332 unrolled than when rolled. */
5333 if ((flags & LOOP_UNROLL)
5334 || ((flags & LOOP_AUTO_UNROLL)
5335 && loop_info->n_iterations > 0
5336 && unrolled_insn_copies <= insn_count))
5337 unroll_loop (loop, insn_count, 1);
5339 #ifdef HAVE_doloop_end
5340 if (HAVE_doloop_end && (flags & LOOP_BCT) && flag_branch_on_count_reg)
5341 doloop_optimize (loop);
5342 #endif /* HAVE_doloop_end */
5344 /* In case number of iterations is known, drop branch prediction note
5345 in the branch. Do that only in second loop pass, as loop unrolling
5346 may change the number of iterations performed. */
5347 if (flags & LOOP_BCT)
5349 unsigned HOST_WIDE_INT n
5350 = loop_info->n_iterations / loop_info->unroll_number;
5351 if (n > 1)
5352 predict_insn (prev_nonnote_insn (loop->end), PRED_LOOP_ITERATIONS,
5353 REG_BR_PROB_BASE - REG_BR_PROB_BASE / n);
5356 if (loop_dump_stream)
5357 fprintf (loop_dump_stream, "\n");
5359 loop_ivs_free (loop);
5360 if (reg_map)
5361 free (reg_map);
5364 /*Record all basic induction variables calculated in the insn. */
5365 static rtx
5366 check_insn_for_bivs (loop, p, not_every_iteration, maybe_multiple)
5367 struct loop *loop;
5368 rtx p;
5369 int not_every_iteration;
5370 int maybe_multiple;
5372 struct loop_ivs *ivs = LOOP_IVS (loop);
5373 rtx set;
5374 rtx dest_reg;
5375 rtx inc_val;
5376 rtx mult_val;
5377 rtx *location;
5379 if (GET_CODE (p) == INSN
5380 && (set = single_set (p))
5381 && GET_CODE (SET_DEST (set)) == REG)
5383 dest_reg = SET_DEST (set);
5384 if (REGNO (dest_reg) < max_reg_before_loop
5385 && REGNO (dest_reg) >= FIRST_PSEUDO_REGISTER
5386 && REG_IV_TYPE (ivs, REGNO (dest_reg)) != NOT_BASIC_INDUCT)
5388 if (basic_induction_var (loop, SET_SRC (set),
5389 GET_MODE (SET_SRC (set)),
5390 dest_reg, p, &inc_val, &mult_val,
5391 &location))
5393 /* It is a possible basic induction variable.
5394 Create and initialize an induction structure for it. */
5396 struct induction *v
5397 = (struct induction *) xmalloc (sizeof (struct induction));
5399 record_biv (loop, v, p, dest_reg, inc_val, mult_val, location,
5400 not_every_iteration, maybe_multiple);
5401 REG_IV_TYPE (ivs, REGNO (dest_reg)) = BASIC_INDUCT;
5403 else if (REGNO (dest_reg) < ivs->n_regs)
5404 REG_IV_TYPE (ivs, REGNO (dest_reg)) = NOT_BASIC_INDUCT;
5407 return p;
5410 /* Record all givs calculated in the insn.
5411 A register is a giv if: it is only set once, it is a function of a
5412 biv and a constant (or invariant), and it is not a biv. */
5413 static rtx
5414 check_insn_for_givs (loop, p, not_every_iteration, maybe_multiple)
5415 struct loop *loop;
5416 rtx p;
5417 int not_every_iteration;
5418 int maybe_multiple;
5420 struct loop_regs *regs = LOOP_REGS (loop);
5422 rtx set;
5423 /* Look for a general induction variable in a register. */
5424 if (GET_CODE (p) == INSN
5425 && (set = single_set (p))
5426 && GET_CODE (SET_DEST (set)) == REG
5427 && ! regs->array[REGNO (SET_DEST (set))].may_not_optimize)
5429 rtx src_reg;
5430 rtx dest_reg;
5431 rtx add_val;
5432 rtx mult_val;
5433 rtx ext_val;
5434 int benefit;
5435 rtx regnote = 0;
5436 rtx last_consec_insn;
5438 dest_reg = SET_DEST (set);
5439 if (REGNO (dest_reg) < FIRST_PSEUDO_REGISTER)
5440 return p;
5442 if (/* SET_SRC is a giv. */
5443 (general_induction_var (loop, SET_SRC (set), &src_reg, &add_val,
5444 &mult_val, &ext_val, 0, &benefit, VOIDmode)
5445 /* Equivalent expression is a giv. */
5446 || ((regnote = find_reg_note (p, REG_EQUAL, NULL_RTX))
5447 && general_induction_var (loop, XEXP (regnote, 0), &src_reg,
5448 &add_val, &mult_val, &ext_val, 0,
5449 &benefit, VOIDmode)))
5450 /* Don't try to handle any regs made by loop optimization.
5451 We have nothing on them in regno_first_uid, etc. */
5452 && REGNO (dest_reg) < max_reg_before_loop
5453 /* Don't recognize a BASIC_INDUCT_VAR here. */
5454 && dest_reg != src_reg
5455 /* This must be the only place where the register is set. */
5456 && (regs->array[REGNO (dest_reg)].n_times_set == 1
5457 /* or all sets must be consecutive and make a giv. */
5458 || (benefit = consec_sets_giv (loop, benefit, p,
5459 src_reg, dest_reg,
5460 &add_val, &mult_val, &ext_val,
5461 &last_consec_insn))))
5463 struct induction *v
5464 = (struct induction *) xmalloc (sizeof (struct induction));
5466 /* If this is a library call, increase benefit. */
5467 if (find_reg_note (p, REG_RETVAL, NULL_RTX))
5468 benefit += libcall_benefit (p);
5470 /* Skip the consecutive insns, if there are any. */
5471 if (regs->array[REGNO (dest_reg)].n_times_set != 1)
5472 p = last_consec_insn;
5474 record_giv (loop, v, p, src_reg, dest_reg, mult_val, add_val,
5475 ext_val, benefit, DEST_REG, not_every_iteration,
5476 maybe_multiple, (rtx*) 0);
5481 #ifndef DONT_REDUCE_ADDR
5482 /* Look for givs which are memory addresses. */
5483 /* This resulted in worse code on a VAX 8600. I wonder if it
5484 still does. */
5485 if (GET_CODE (p) == INSN)
5486 find_mem_givs (loop, PATTERN (p), p, not_every_iteration,
5487 maybe_multiple);
5488 #endif
5490 /* Update the status of whether giv can derive other givs. This can
5491 change when we pass a label or an insn that updates a biv. */
5492 if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
5493 || GET_CODE (p) == CODE_LABEL)
5494 update_giv_derive (loop, p);
5495 return p;
5498 /* Return 1 if X is a valid source for an initial value (or as value being
5499 compared against in an initial test).
5501 X must be either a register or constant and must not be clobbered between
5502 the current insn and the start of the loop.
5504 INSN is the insn containing X. */
5506 static int
5507 valid_initial_value_p (x, insn, call_seen, loop_start)
5508 rtx x;
5509 rtx insn;
5510 int call_seen;
5511 rtx loop_start;
5513 if (CONSTANT_P (x))
5514 return 1;
5516 /* Only consider pseudos we know about initialized in insns whose luids
5517 we know. */
5518 if (GET_CODE (x) != REG
5519 || REGNO (x) >= max_reg_before_loop)
5520 return 0;
5522 /* Don't use call-clobbered registers across a call which clobbers it. On
5523 some machines, don't use any hard registers at all. */
5524 if (REGNO (x) < FIRST_PSEUDO_REGISTER
5525 && (SMALL_REGISTER_CLASSES
5526 || (call_used_regs[REGNO (x)] && call_seen)))
5527 return 0;
5529 /* Don't use registers that have been clobbered before the start of the
5530 loop. */
5531 if (reg_set_between_p (x, insn, loop_start))
5532 return 0;
5534 return 1;
5537 /* Scan X for memory refs and check each memory address
5538 as a possible giv. INSN is the insn whose pattern X comes from.
5539 NOT_EVERY_ITERATION is 1 if the insn might not be executed during
5540 every loop iteration. MAYBE_MULTIPLE is 1 if the insn might be executed
5541 more thanonce in each loop iteration. */
5543 static void
5544 find_mem_givs (loop, x, insn, not_every_iteration, maybe_multiple)
5545 const struct loop *loop;
5546 rtx x;
5547 rtx insn;
5548 int not_every_iteration, maybe_multiple;
5550 int i, j;
5551 enum rtx_code code;
5552 const char *fmt;
5554 if (x == 0)
5555 return;
5557 code = GET_CODE (x);
5558 switch (code)
5560 case REG:
5561 case CONST_INT:
5562 case CONST:
5563 case CONST_DOUBLE:
5564 case SYMBOL_REF:
5565 case LABEL_REF:
5566 case PC:
5567 case CC0:
5568 case ADDR_VEC:
5569 case ADDR_DIFF_VEC:
5570 case USE:
5571 case CLOBBER:
5572 return;
5574 case MEM:
5576 rtx src_reg;
5577 rtx add_val;
5578 rtx mult_val;
5579 rtx ext_val;
5580 int benefit;
5582 /* This code used to disable creating GIVs with mult_val == 1 and
5583 add_val == 0. However, this leads to lost optimizations when
5584 it comes time to combine a set of related DEST_ADDR GIVs, since
5585 this one would not be seen. */
5587 if (general_induction_var (loop, XEXP (x, 0), &src_reg, &add_val,
5588 &mult_val, &ext_val, 1, &benefit,
5589 GET_MODE (x)))
5591 /* Found one; record it. */
5592 struct induction *v
5593 = (struct induction *) xmalloc (sizeof (struct induction));
5595 record_giv (loop, v, insn, src_reg, addr_placeholder, mult_val,
5596 add_val, ext_val, benefit, DEST_ADDR,
5597 not_every_iteration, maybe_multiple, &XEXP (x, 0));
5599 v->mem = x;
5602 return;
5604 default:
5605 break;
5608 /* Recursively scan the subexpressions for other mem refs. */
5610 fmt = GET_RTX_FORMAT (code);
5611 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
5612 if (fmt[i] == 'e')
5613 find_mem_givs (loop, XEXP (x, i), insn, not_every_iteration,
5614 maybe_multiple);
5615 else if (fmt[i] == 'E')
5616 for (j = 0; j < XVECLEN (x, i); j++)
5617 find_mem_givs (loop, XVECEXP (x, i, j), insn, not_every_iteration,
5618 maybe_multiple);
5621 /* Fill in the data about one biv update.
5622 V is the `struct induction' in which we record the biv. (It is
5623 allocated by the caller, with alloca.)
5624 INSN is the insn that sets it.
5625 DEST_REG is the biv's reg.
5627 MULT_VAL is const1_rtx if the biv is being incremented here, in which case
5628 INC_VAL is the increment. Otherwise, MULT_VAL is const0_rtx and the biv is
5629 being set to INC_VAL.
5631 NOT_EVERY_ITERATION is nonzero if this biv update is not know to be
5632 executed every iteration; MAYBE_MULTIPLE is nonzero if this biv update
5633 can be executed more than once per iteration. If MAYBE_MULTIPLE
5634 and NOT_EVERY_ITERATION are both zero, we know that the biv update is
5635 executed exactly once per iteration. */
5637 static void
5638 record_biv (loop, v, insn, dest_reg, inc_val, mult_val, location,
5639 not_every_iteration, maybe_multiple)
5640 struct loop *loop;
5641 struct induction *v;
5642 rtx insn;
5643 rtx dest_reg;
5644 rtx inc_val;
5645 rtx mult_val;
5646 rtx *location;
5647 int not_every_iteration;
5648 int maybe_multiple;
5650 struct loop_ivs *ivs = LOOP_IVS (loop);
5651 struct iv_class *bl;
5653 v->insn = insn;
5654 v->src_reg = dest_reg;
5655 v->dest_reg = dest_reg;
5656 v->mult_val = mult_val;
5657 v->add_val = inc_val;
5658 v->ext_dependent = NULL_RTX;
5659 v->location = location;
5660 v->mode = GET_MODE (dest_reg);
5661 v->always_computable = ! not_every_iteration;
5662 v->always_executed = ! not_every_iteration;
5663 v->maybe_multiple = maybe_multiple;
5665 /* Add this to the reg's iv_class, creating a class
5666 if this is the first incrementation of the reg. */
5668 bl = REG_IV_CLASS (ivs, REGNO (dest_reg));
5669 if (bl == 0)
5671 /* Create and initialize new iv_class. */
5673 bl = (struct iv_class *) xmalloc (sizeof (struct iv_class));
5675 bl->regno = REGNO (dest_reg);
5676 bl->biv = 0;
5677 bl->giv = 0;
5678 bl->biv_count = 0;
5679 bl->giv_count = 0;
5681 /* Set initial value to the reg itself. */
5682 bl->initial_value = dest_reg;
5683 bl->final_value = 0;
5684 /* We haven't seen the initializing insn yet */
5685 bl->init_insn = 0;
5686 bl->init_set = 0;
5687 bl->initial_test = 0;
5688 bl->incremented = 0;
5689 bl->eliminable = 0;
5690 bl->nonneg = 0;
5691 bl->reversed = 0;
5692 bl->total_benefit = 0;
5694 /* Add this class to ivs->list. */
5695 bl->next = ivs->list;
5696 ivs->list = bl;
5698 /* Put it in the array of biv register classes. */
5699 REG_IV_CLASS (ivs, REGNO (dest_reg)) = bl;
5702 /* Update IV_CLASS entry for this biv. */
5703 v->next_iv = bl->biv;
5704 bl->biv = v;
5705 bl->biv_count++;
5706 if (mult_val == const1_rtx)
5707 bl->incremented = 1;
5709 if (loop_dump_stream)
5710 loop_biv_dump (v, loop_dump_stream, 0);
5713 /* Fill in the data about one giv.
5714 V is the `struct induction' in which we record the giv. (It is
5715 allocated by the caller, with alloca.)
5716 INSN is the insn that sets it.
5717 BENEFIT estimates the savings from deleting this insn.
5718 TYPE is DEST_REG or DEST_ADDR; it says whether the giv is computed
5719 into a register or is used as a memory address.
5721 SRC_REG is the biv reg which the giv is computed from.
5722 DEST_REG is the giv's reg (if the giv is stored in a reg).
5723 MULT_VAL and ADD_VAL are the coefficients used to compute the giv.
5724 LOCATION points to the place where this giv's value appears in INSN. */
5726 static void
5727 record_giv (loop, v, insn, src_reg, dest_reg, mult_val, add_val, ext_val,
5728 benefit, type, not_every_iteration, maybe_multiple, location)
5729 const struct loop *loop;
5730 struct induction *v;
5731 rtx insn;
5732 rtx src_reg;
5733 rtx dest_reg;
5734 rtx mult_val, add_val, ext_val;
5735 int benefit;
5736 enum g_types type;
5737 int not_every_iteration, maybe_multiple;
5738 rtx *location;
5740 struct loop_ivs *ivs = LOOP_IVS (loop);
5741 struct induction *b;
5742 struct iv_class *bl;
5743 rtx set = single_set (insn);
5744 rtx temp;
5746 /* Attempt to prove constantness of the values. Don't let simplity_rtx
5747 undo the MULT canonicalization that we performed earlier. */
5748 temp = simplify_rtx (add_val);
5749 if (temp
5750 && ! (GET_CODE (add_val) == MULT
5751 && GET_CODE (temp) == ASHIFT))
5752 add_val = temp;
5754 v->insn = insn;
5755 v->src_reg = src_reg;
5756 v->giv_type = type;
5757 v->dest_reg = dest_reg;
5758 v->mult_val = mult_val;
5759 v->add_val = add_val;
5760 v->ext_dependent = ext_val;
5761 v->benefit = benefit;
5762 v->location = location;
5763 v->cant_derive = 0;
5764 v->combined_with = 0;
5765 v->maybe_multiple = maybe_multiple;
5766 v->maybe_dead = 0;
5767 v->derive_adjustment = 0;
5768 v->same = 0;
5769 v->ignore = 0;
5770 v->new_reg = 0;
5771 v->final_value = 0;
5772 v->same_insn = 0;
5773 v->auto_inc_opt = 0;
5774 v->unrolled = 0;
5775 v->shared = 0;
5777 /* The v->always_computable field is used in update_giv_derive, to
5778 determine whether a giv can be used to derive another giv. For a
5779 DEST_REG giv, INSN computes a new value for the giv, so its value
5780 isn't computable if INSN insn't executed every iteration.
5781 However, for a DEST_ADDR giv, INSN merely uses the value of the giv;
5782 it does not compute a new value. Hence the value is always computable
5783 regardless of whether INSN is executed each iteration. */
5785 if (type == DEST_ADDR)
5786 v->always_computable = 1;
5787 else
5788 v->always_computable = ! not_every_iteration;
5790 v->always_executed = ! not_every_iteration;
5792 if (type == DEST_ADDR)
5794 v->mode = GET_MODE (*location);
5795 v->lifetime = 1;
5797 else /* type == DEST_REG */
5799 v->mode = GET_MODE (SET_DEST (set));
5801 v->lifetime = LOOP_REG_LIFETIME (loop, REGNO (dest_reg));
5803 /* If the lifetime is zero, it means that this register is
5804 really a dead store. So mark this as a giv that can be
5805 ignored. This will not prevent the biv from being eliminated. */
5806 if (v->lifetime == 0)
5807 v->ignore = 1;
5809 REG_IV_TYPE (ivs, REGNO (dest_reg)) = GENERAL_INDUCT;
5810 REG_IV_INFO (ivs, REGNO (dest_reg)) = v;
5813 /* Add the giv to the class of givs computed from one biv. */
5815 bl = REG_IV_CLASS (ivs, REGNO (src_reg));
5816 if (bl)
5818 v->next_iv = bl->giv;
5819 bl->giv = v;
5820 /* Don't count DEST_ADDR. This is supposed to count the number of
5821 insns that calculate givs. */
5822 if (type == DEST_REG)
5823 bl->giv_count++;
5824 bl->total_benefit += benefit;
5826 else
5827 /* Fatal error, biv missing for this giv? */
5828 abort ();
5830 if (type == DEST_ADDR)
5831 v->replaceable = 1;
5832 else
5834 /* The giv can be replaced outright by the reduced register only if all
5835 of the following conditions are true:
5836 - the insn that sets the giv is always executed on any iteration
5837 on which the giv is used at all
5838 (there are two ways to deduce this:
5839 either the insn is executed on every iteration,
5840 or all uses follow that insn in the same basic block),
5841 - the giv is not used outside the loop
5842 - no assignments to the biv occur during the giv's lifetime. */
5844 if (REGNO_FIRST_UID (REGNO (dest_reg)) == INSN_UID (insn)
5845 /* Previous line always fails if INSN was moved by loop opt. */
5846 && REGNO_LAST_LUID (REGNO (dest_reg))
5847 < INSN_LUID (loop->end)
5848 && (! not_every_iteration
5849 || last_use_this_basic_block (dest_reg, insn)))
5851 /* Now check that there are no assignments to the biv within the
5852 giv's lifetime. This requires two separate checks. */
5854 /* Check each biv update, and fail if any are between the first
5855 and last use of the giv.
5857 If this loop contains an inner loop that was unrolled, then
5858 the insn modifying the biv may have been emitted by the loop
5859 unrolling code, and hence does not have a valid luid. Just
5860 mark the biv as not replaceable in this case. It is not very
5861 useful as a biv, because it is used in two different loops.
5862 It is very unlikely that we would be able to optimize the giv
5863 using this biv anyways. */
5865 v->replaceable = 1;
5866 for (b = bl->biv; b; b = b->next_iv)
5868 if (INSN_UID (b->insn) >= max_uid_for_loop
5869 || ((INSN_LUID (b->insn)
5870 >= REGNO_FIRST_LUID (REGNO (dest_reg)))
5871 && (INSN_LUID (b->insn)
5872 <= REGNO_LAST_LUID (REGNO (dest_reg)))))
5874 v->replaceable = 0;
5875 v->not_replaceable = 1;
5876 break;
5880 /* If there are any backwards branches that go from after the
5881 biv update to before it, then this giv is not replaceable. */
5882 if (v->replaceable)
5883 for (b = bl->biv; b; b = b->next_iv)
5884 if (back_branch_in_range_p (loop, b->insn))
5886 v->replaceable = 0;
5887 v->not_replaceable = 1;
5888 break;
5891 else
5893 /* May still be replaceable, we don't have enough info here to
5894 decide. */
5895 v->replaceable = 0;
5896 v->not_replaceable = 0;
5900 /* Record whether the add_val contains a const_int, for later use by
5901 combine_givs. */
5903 rtx tem = add_val;
5905 v->no_const_addval = 1;
5906 if (tem == const0_rtx)
5908 else if (CONSTANT_P (add_val))
5909 v->no_const_addval = 0;
5910 if (GET_CODE (tem) == PLUS)
5912 while (1)
5914 if (GET_CODE (XEXP (tem, 0)) == PLUS)
5915 tem = XEXP (tem, 0);
5916 else if (GET_CODE (XEXP (tem, 1)) == PLUS)
5917 tem = XEXP (tem, 1);
5918 else
5919 break;
5921 if (CONSTANT_P (XEXP (tem, 1)))
5922 v->no_const_addval = 0;
5926 if (loop_dump_stream)
5927 loop_giv_dump (v, loop_dump_stream, 0);
5930 /* All this does is determine whether a giv can be made replaceable because
5931 its final value can be calculated. This code can not be part of record_giv
5932 above, because final_giv_value requires that the number of loop iterations
5933 be known, and that can not be accurately calculated until after all givs
5934 have been identified. */
5936 static void
5937 check_final_value (loop, v)
5938 const struct loop *loop;
5939 struct induction *v;
5941 struct loop_ivs *ivs = LOOP_IVS (loop);
5942 struct iv_class *bl;
5943 rtx final_value = 0;
5945 bl = REG_IV_CLASS (ivs, REGNO (v->src_reg));
5947 /* DEST_ADDR givs will never reach here, because they are always marked
5948 replaceable above in record_giv. */
5950 /* The giv can be replaced outright by the reduced register only if all
5951 of the following conditions are true:
5952 - the insn that sets the giv is always executed on any iteration
5953 on which the giv is used at all
5954 (there are two ways to deduce this:
5955 either the insn is executed on every iteration,
5956 or all uses follow that insn in the same basic block),
5957 - its final value can be calculated (this condition is different
5958 than the one above in record_giv)
5959 - it's not used before the it's set
5960 - no assignments to the biv occur during the giv's lifetime. */
5962 #if 0
5963 /* This is only called now when replaceable is known to be false. */
5964 /* Clear replaceable, so that it won't confuse final_giv_value. */
5965 v->replaceable = 0;
5966 #endif
5968 if ((final_value = final_giv_value (loop, v))
5969 && (v->always_executed
5970 || last_use_this_basic_block (v->dest_reg, v->insn)))
5972 int biv_increment_seen = 0, before_giv_insn = 0;
5973 rtx p = v->insn;
5974 rtx last_giv_use;
5976 v->replaceable = 1;
5978 /* When trying to determine whether or not a biv increment occurs
5979 during the lifetime of the giv, we can ignore uses of the variable
5980 outside the loop because final_value is true. Hence we can not
5981 use regno_last_uid and regno_first_uid as above in record_giv. */
5983 /* Search the loop to determine whether any assignments to the
5984 biv occur during the giv's lifetime. Start with the insn
5985 that sets the giv, and search around the loop until we come
5986 back to that insn again.
5988 Also fail if there is a jump within the giv's lifetime that jumps
5989 to somewhere outside the lifetime but still within the loop. This
5990 catches spaghetti code where the execution order is not linear, and
5991 hence the above test fails. Here we assume that the giv lifetime
5992 does not extend from one iteration of the loop to the next, so as
5993 to make the test easier. Since the lifetime isn't known yet,
5994 this requires two loops. See also record_giv above. */
5996 last_giv_use = v->insn;
5998 while (1)
6000 p = NEXT_INSN (p);
6001 if (p == loop->end)
6003 before_giv_insn = 1;
6004 p = NEXT_INSN (loop->start);
6006 if (p == v->insn)
6007 break;
6009 if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
6010 || GET_CODE (p) == CALL_INSN)
6012 /* It is possible for the BIV increment to use the GIV if we
6013 have a cycle. Thus we must be sure to check each insn for
6014 both BIV and GIV uses, and we must check for BIV uses
6015 first. */
6017 if (! biv_increment_seen
6018 && reg_set_p (v->src_reg, PATTERN (p)))
6019 biv_increment_seen = 1;
6021 if (reg_mentioned_p (v->dest_reg, PATTERN (p)))
6023 if (biv_increment_seen || before_giv_insn)
6025 v->replaceable = 0;
6026 v->not_replaceable = 1;
6027 break;
6029 last_giv_use = p;
6034 /* Now that the lifetime of the giv is known, check for branches
6035 from within the lifetime to outside the lifetime if it is still
6036 replaceable. */
6038 if (v->replaceable)
6040 p = v->insn;
6041 while (1)
6043 p = NEXT_INSN (p);
6044 if (p == loop->end)
6045 p = NEXT_INSN (loop->start);
6046 if (p == last_giv_use)
6047 break;
6049 if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p)
6050 && LABEL_NAME (JUMP_LABEL (p))
6051 && ((loop_insn_first_p (JUMP_LABEL (p), v->insn)
6052 && loop_insn_first_p (loop->start, JUMP_LABEL (p)))
6053 || (loop_insn_first_p (last_giv_use, JUMP_LABEL (p))
6054 && loop_insn_first_p (JUMP_LABEL (p), loop->end))))
6056 v->replaceable = 0;
6057 v->not_replaceable = 1;
6059 if (loop_dump_stream)
6060 fprintf (loop_dump_stream,
6061 "Found branch outside giv lifetime.\n");
6063 break;
6068 /* If it is replaceable, then save the final value. */
6069 if (v->replaceable)
6070 v->final_value = final_value;
6073 if (loop_dump_stream && v->replaceable)
6074 fprintf (loop_dump_stream, "Insn %d: giv reg %d final_value replaceable\n",
6075 INSN_UID (v->insn), REGNO (v->dest_reg));
6078 /* Update the status of whether a giv can derive other givs.
6080 We need to do something special if there is or may be an update to the biv
6081 between the time the giv is defined and the time it is used to derive
6082 another giv.
6084 In addition, a giv that is only conditionally set is not allowed to
6085 derive another giv once a label has been passed.
6087 The cases we look at are when a label or an update to a biv is passed. */
6089 static void
6090 update_giv_derive (loop, p)
6091 const struct loop *loop;
6092 rtx p;
6094 struct loop_ivs *ivs = LOOP_IVS (loop);
6095 struct iv_class *bl;
6096 struct induction *biv, *giv;
6097 rtx tem;
6098 int dummy;
6100 /* Search all IV classes, then all bivs, and finally all givs.
6102 There are three cases we are concerned with. First we have the situation
6103 of a giv that is only updated conditionally. In that case, it may not
6104 derive any givs after a label is passed.
6106 The second case is when a biv update occurs, or may occur, after the
6107 definition of a giv. For certain biv updates (see below) that are
6108 known to occur between the giv definition and use, we can adjust the
6109 giv definition. For others, or when the biv update is conditional,
6110 we must prevent the giv from deriving any other givs. There are two
6111 sub-cases within this case.
6113 If this is a label, we are concerned with any biv update that is done
6114 conditionally, since it may be done after the giv is defined followed by
6115 a branch here (actually, we need to pass both a jump and a label, but
6116 this extra tracking doesn't seem worth it).
6118 If this is a jump, we are concerned about any biv update that may be
6119 executed multiple times. We are actually only concerned about
6120 backward jumps, but it is probably not worth performing the test
6121 on the jump again here.
6123 If this is a biv update, we must adjust the giv status to show that a
6124 subsequent biv update was performed. If this adjustment cannot be done,
6125 the giv cannot derive further givs. */
6127 for (bl = ivs->list; bl; bl = bl->next)
6128 for (biv = bl->biv; biv; biv = biv->next_iv)
6129 if (GET_CODE (p) == CODE_LABEL || GET_CODE (p) == JUMP_INSN
6130 || biv->insn == p)
6132 for (giv = bl->giv; giv; giv = giv->next_iv)
6134 /* If cant_derive is already true, there is no point in
6135 checking all of these conditions again. */
6136 if (giv->cant_derive)
6137 continue;
6139 /* If this giv is conditionally set and we have passed a label,
6140 it cannot derive anything. */
6141 if (GET_CODE (p) == CODE_LABEL && ! giv->always_computable)
6142 giv->cant_derive = 1;
6144 /* Skip givs that have mult_val == 0, since
6145 they are really invariants. Also skip those that are
6146 replaceable, since we know their lifetime doesn't contain
6147 any biv update. */
6148 else if (giv->mult_val == const0_rtx || giv->replaceable)
6149 continue;
6151 /* The only way we can allow this giv to derive another
6152 is if this is a biv increment and we can form the product
6153 of biv->add_val and giv->mult_val. In this case, we will
6154 be able to compute a compensation. */
6155 else if (biv->insn == p)
6157 rtx ext_val_dummy;
6159 tem = 0;
6160 if (biv->mult_val == const1_rtx)
6161 tem = simplify_giv_expr (loop,
6162 gen_rtx_MULT (giv->mode,
6163 biv->add_val,
6164 giv->mult_val),
6165 &ext_val_dummy, &dummy);
6167 if (tem && giv->derive_adjustment)
6168 tem = simplify_giv_expr
6169 (loop,
6170 gen_rtx_PLUS (giv->mode, tem, giv->derive_adjustment),
6171 &ext_val_dummy, &dummy);
6173 if (tem)
6174 giv->derive_adjustment = tem;
6175 else
6176 giv->cant_derive = 1;
6178 else if ((GET_CODE (p) == CODE_LABEL && ! biv->always_computable)
6179 || (GET_CODE (p) == JUMP_INSN && biv->maybe_multiple))
6180 giv->cant_derive = 1;
6185 /* Check whether an insn is an increment legitimate for a basic induction var.
6186 X is the source of insn P, or a part of it.
6187 MODE is the mode in which X should be interpreted.
6189 DEST_REG is the putative biv, also the destination of the insn.
6190 We accept patterns of these forms:
6191 REG = REG + INVARIANT (includes REG = REG - CONSTANT)
6192 REG = INVARIANT + REG
6194 If X is suitable, we return 1, set *MULT_VAL to CONST1_RTX,
6195 store the additive term into *INC_VAL, and store the place where
6196 we found the additive term into *LOCATION.
6198 If X is an assignment of an invariant into DEST_REG, we set
6199 *MULT_VAL to CONST0_RTX, and store the invariant into *INC_VAL.
6201 We also want to detect a BIV when it corresponds to a variable
6202 whose mode was promoted via PROMOTED_MODE. In that case, an increment
6203 of the variable may be a PLUS that adds a SUBREG of that variable to
6204 an invariant and then sign- or zero-extends the result of the PLUS
6205 into the variable.
6207 Most GIVs in such cases will be in the promoted mode, since that is the
6208 probably the natural computation mode (and almost certainly the mode
6209 used for addresses) on the machine. So we view the pseudo-reg containing
6210 the variable as the BIV, as if it were simply incremented.
6212 Note that treating the entire pseudo as a BIV will result in making
6213 simple increments to any GIVs based on it. However, if the variable
6214 overflows in its declared mode but not its promoted mode, the result will
6215 be incorrect. This is acceptable if the variable is signed, since
6216 overflows in such cases are undefined, but not if it is unsigned, since
6217 those overflows are defined. So we only check for SIGN_EXTEND and
6218 not ZERO_EXTEND.
6220 If we cannot find a biv, we return 0. */
6222 static int
6223 basic_induction_var (loop, x, mode, dest_reg, p, inc_val, mult_val, location)
6224 const struct loop *loop;
6225 rtx x;
6226 enum machine_mode mode;
6227 rtx dest_reg;
6228 rtx p;
6229 rtx *inc_val;
6230 rtx *mult_val;
6231 rtx **location;
6233 enum rtx_code code;
6234 rtx *argp, arg;
6235 rtx insn, set = 0;
6237 code = GET_CODE (x);
6238 *location = NULL;
6239 switch (code)
6241 case PLUS:
6242 if (rtx_equal_p (XEXP (x, 0), dest_reg)
6243 || (GET_CODE (XEXP (x, 0)) == SUBREG
6244 && SUBREG_PROMOTED_VAR_P (XEXP (x, 0))
6245 && SUBREG_REG (XEXP (x, 0)) == dest_reg))
6247 argp = &XEXP (x, 1);
6249 else if (rtx_equal_p (XEXP (x, 1), dest_reg)
6250 || (GET_CODE (XEXP (x, 1)) == SUBREG
6251 && SUBREG_PROMOTED_VAR_P (XEXP (x, 1))
6252 && SUBREG_REG (XEXP (x, 1)) == dest_reg))
6254 argp = &XEXP (x, 0);
6256 else
6257 return 0;
6259 arg = *argp;
6260 if (loop_invariant_p (loop, arg) != 1)
6261 return 0;
6263 *inc_val = convert_modes (GET_MODE (dest_reg), GET_MODE (x), arg, 0);
6264 *mult_val = const1_rtx;
6265 *location = argp;
6266 return 1;
6268 case SUBREG:
6269 /* If what's inside the SUBREG is a BIV, then the SUBREG. This will
6270 handle addition of promoted variables.
6271 ??? The comment at the start of this function is wrong: promoted
6272 variable increments don't look like it says they do. */
6273 return basic_induction_var (loop, SUBREG_REG (x),
6274 GET_MODE (SUBREG_REG (x)),
6275 dest_reg, p, inc_val, mult_val, location);
6277 case REG:
6278 /* If this register is assigned in a previous insn, look at its
6279 source, but don't go outside the loop or past a label. */
6281 /* If this sets a register to itself, we would repeat any previous
6282 biv increment if we applied this strategy blindly. */
6283 if (rtx_equal_p (dest_reg, x))
6284 return 0;
6286 insn = p;
6287 while (1)
6289 rtx dest;
6292 insn = PREV_INSN (insn);
6294 while (insn && GET_CODE (insn) == NOTE
6295 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG);
6297 if (!insn)
6298 break;
6299 set = single_set (insn);
6300 if (set == 0)
6301 break;
6302 dest = SET_DEST (set);
6303 if (dest == x
6304 || (GET_CODE (dest) == SUBREG
6305 && (GET_MODE_SIZE (GET_MODE (dest)) <= UNITS_PER_WORD)
6306 && (GET_MODE_CLASS (GET_MODE (dest)) == MODE_INT)
6307 && SUBREG_REG (dest) == x))
6308 return basic_induction_var (loop, SET_SRC (set),
6309 (GET_MODE (SET_SRC (set)) == VOIDmode
6310 ? GET_MODE (x)
6311 : GET_MODE (SET_SRC (set))),
6312 dest_reg, insn,
6313 inc_val, mult_val, location);
6315 while (GET_CODE (dest) == SIGN_EXTRACT
6316 || GET_CODE (dest) == ZERO_EXTRACT
6317 || GET_CODE (dest) == SUBREG
6318 || GET_CODE (dest) == STRICT_LOW_PART)
6319 dest = XEXP (dest, 0);
6320 if (dest == x)
6321 break;
6323 /* Fall through. */
6325 /* Can accept constant setting of biv only when inside inner most loop.
6326 Otherwise, a biv of an inner loop may be incorrectly recognized
6327 as a biv of the outer loop,
6328 causing code to be moved INTO the inner loop. */
6329 case MEM:
6330 if (loop_invariant_p (loop, x) != 1)
6331 return 0;
6332 case CONST_INT:
6333 case SYMBOL_REF:
6334 case CONST:
6335 /* convert_modes aborts if we try to convert to or from CCmode, so just
6336 exclude that case. It is very unlikely that a condition code value
6337 would be a useful iterator anyways. convert_modes aborts if we try to
6338 convert a float mode to non-float or vice versa too. */
6339 if (loop->level == 1
6340 && GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (dest_reg))
6341 && GET_MODE_CLASS (mode) != MODE_CC)
6343 /* Possible bug here? Perhaps we don't know the mode of X. */
6344 *inc_val = convert_modes (GET_MODE (dest_reg), mode, x, 0);
6345 *mult_val = const0_rtx;
6346 return 1;
6348 else
6349 return 0;
6351 case SIGN_EXTEND:
6352 return basic_induction_var (loop, XEXP (x, 0), GET_MODE (XEXP (x, 0)),
6353 dest_reg, p, inc_val, mult_val, location);
6355 case ASHIFTRT:
6356 /* Similar, since this can be a sign extension. */
6357 for (insn = PREV_INSN (p);
6358 (insn && GET_CODE (insn) == NOTE
6359 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG);
6360 insn = PREV_INSN (insn))
6363 if (insn)
6364 set = single_set (insn);
6366 if (! rtx_equal_p (dest_reg, XEXP (x, 0))
6367 && set && SET_DEST (set) == XEXP (x, 0)
6368 && GET_CODE (XEXP (x, 1)) == CONST_INT
6369 && INTVAL (XEXP (x, 1)) >= 0
6370 && GET_CODE (SET_SRC (set)) == ASHIFT
6371 && XEXP (x, 1) == XEXP (SET_SRC (set), 1))
6372 return basic_induction_var (loop, XEXP (SET_SRC (set), 0),
6373 GET_MODE (XEXP (x, 0)),
6374 dest_reg, insn, inc_val, mult_val,
6375 location);
6376 return 0;
6378 default:
6379 return 0;
6383 /* A general induction variable (giv) is any quantity that is a linear
6384 function of a basic induction variable,
6385 i.e. giv = biv * mult_val + add_val.
6386 The coefficients can be any loop invariant quantity.
6387 A giv need not be computed directly from the biv;
6388 it can be computed by way of other givs. */
6390 /* Determine whether X computes a giv.
6391 If it does, return a nonzero value
6392 which is the benefit from eliminating the computation of X;
6393 set *SRC_REG to the register of the biv that it is computed from;
6394 set *ADD_VAL and *MULT_VAL to the coefficients,
6395 such that the value of X is biv * mult + add; */
6397 static int
6398 general_induction_var (loop, x, src_reg, add_val, mult_val, ext_val,
6399 is_addr, pbenefit, addr_mode)
6400 const struct loop *loop;
6401 rtx x;
6402 rtx *src_reg;
6403 rtx *add_val;
6404 rtx *mult_val;
6405 rtx *ext_val;
6406 int is_addr;
6407 int *pbenefit;
6408 enum machine_mode addr_mode;
6410 struct loop_ivs *ivs = LOOP_IVS (loop);
6411 rtx orig_x = x;
6413 /* If this is an invariant, forget it, it isn't a giv. */
6414 if (loop_invariant_p (loop, x) == 1)
6415 return 0;
6417 *pbenefit = 0;
6418 *ext_val = NULL_RTX;
6419 x = simplify_giv_expr (loop, x, ext_val, pbenefit);
6420 if (x == 0)
6421 return 0;
6423 switch (GET_CODE (x))
6425 case USE:
6426 case CONST_INT:
6427 /* Since this is now an invariant and wasn't before, it must be a giv
6428 with MULT_VAL == 0. It doesn't matter which BIV we associate this
6429 with. */
6430 *src_reg = ivs->list->biv->dest_reg;
6431 *mult_val = const0_rtx;
6432 *add_val = x;
6433 break;
6435 case REG:
6436 /* This is equivalent to a BIV. */
6437 *src_reg = x;
6438 *mult_val = const1_rtx;
6439 *add_val = const0_rtx;
6440 break;
6442 case PLUS:
6443 /* Either (plus (biv) (invar)) or
6444 (plus (mult (biv) (invar_1)) (invar_2)). */
6445 if (GET_CODE (XEXP (x, 0)) == MULT)
6447 *src_reg = XEXP (XEXP (x, 0), 0);
6448 *mult_val = XEXP (XEXP (x, 0), 1);
6450 else
6452 *src_reg = XEXP (x, 0);
6453 *mult_val = const1_rtx;
6455 *add_val = XEXP (x, 1);
6456 break;
6458 case MULT:
6459 /* ADD_VAL is zero. */
6460 *src_reg = XEXP (x, 0);
6461 *mult_val = XEXP (x, 1);
6462 *add_val = const0_rtx;
6463 break;
6465 default:
6466 abort ();
6469 /* Remove any enclosing USE from ADD_VAL and MULT_VAL (there will be
6470 unless they are CONST_INT). */
6471 if (GET_CODE (*add_val) == USE)
6472 *add_val = XEXP (*add_val, 0);
6473 if (GET_CODE (*mult_val) == USE)
6474 *mult_val = XEXP (*mult_val, 0);
6476 if (is_addr)
6477 *pbenefit += address_cost (orig_x, addr_mode) - reg_address_cost;
6478 else
6479 *pbenefit += rtx_cost (orig_x, SET);
6481 /* Always return true if this is a giv so it will be detected as such,
6482 even if the benefit is zero or negative. This allows elimination
6483 of bivs that might otherwise not be eliminated. */
6484 return 1;
6487 /* Given an expression, X, try to form it as a linear function of a biv.
6488 We will canonicalize it to be of the form
6489 (plus (mult (BIV) (invar_1))
6490 (invar_2))
6491 with possible degeneracies.
6493 The invariant expressions must each be of a form that can be used as a
6494 machine operand. We surround then with a USE rtx (a hack, but localized
6495 and certainly unambiguous!) if not a CONST_INT for simplicity in this
6496 routine; it is the caller's responsibility to strip them.
6498 If no such canonicalization is possible (i.e., two biv's are used or an
6499 expression that is neither invariant nor a biv or giv), this routine
6500 returns 0.
6502 For a nonzero return, the result will have a code of CONST_INT, USE,
6503 REG (for a BIV), PLUS, or MULT. No other codes will occur.
6505 *BENEFIT will be incremented by the benefit of any sub-giv encountered. */
6507 static rtx sge_plus PARAMS ((enum machine_mode, rtx, rtx));
6508 static rtx sge_plus_constant PARAMS ((rtx, rtx));
6510 static rtx
6511 simplify_giv_expr (loop, x, ext_val, benefit)
6512 const struct loop *loop;
6513 rtx x;
6514 rtx *ext_val;
6515 int *benefit;
6517 struct loop_ivs *ivs = LOOP_IVS (loop);
6518 struct loop_regs *regs = LOOP_REGS (loop);
6519 enum machine_mode mode = GET_MODE (x);
6520 rtx arg0, arg1;
6521 rtx tem;
6523 /* If this is not an integer mode, or if we cannot do arithmetic in this
6524 mode, this can't be a giv. */
6525 if (mode != VOIDmode
6526 && (GET_MODE_CLASS (mode) != MODE_INT
6527 || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT))
6528 return NULL_RTX;
6530 switch (GET_CODE (x))
6532 case PLUS:
6533 arg0 = simplify_giv_expr (loop, XEXP (x, 0), ext_val, benefit);
6534 arg1 = simplify_giv_expr (loop, XEXP (x, 1), ext_val, benefit);
6535 if (arg0 == 0 || arg1 == 0)
6536 return NULL_RTX;
6538 /* Put constant last, CONST_INT last if both constant. */
6539 if ((GET_CODE (arg0) == USE
6540 || GET_CODE (arg0) == CONST_INT)
6541 && ! ((GET_CODE (arg0) == USE
6542 && GET_CODE (arg1) == USE)
6543 || GET_CODE (arg1) == CONST_INT))
6544 tem = arg0, arg0 = arg1, arg1 = tem;
6546 /* Handle addition of zero, then addition of an invariant. */
6547 if (arg1 == const0_rtx)
6548 return arg0;
6549 else if (GET_CODE (arg1) == CONST_INT || GET_CODE (arg1) == USE)
6550 switch (GET_CODE (arg0))
6552 case CONST_INT:
6553 case USE:
6554 /* Adding two invariants must result in an invariant, so enclose
6555 addition operation inside a USE and return it. */
6556 if (GET_CODE (arg0) == USE)
6557 arg0 = XEXP (arg0, 0);
6558 if (GET_CODE (arg1) == USE)
6559 arg1 = XEXP (arg1, 0);
6561 if (GET_CODE (arg0) == CONST_INT)
6562 tem = arg0, arg0 = arg1, arg1 = tem;
6563 if (GET_CODE (arg1) == CONST_INT)
6564 tem = sge_plus_constant (arg0, arg1);
6565 else
6566 tem = sge_plus (mode, arg0, arg1);
6568 if (GET_CODE (tem) != CONST_INT)
6569 tem = gen_rtx_USE (mode, tem);
6570 return tem;
6572 case REG:
6573 case MULT:
6574 /* biv + invar or mult + invar. Return sum. */
6575 return gen_rtx_PLUS (mode, arg0, arg1);
6577 case PLUS:
6578 /* (a + invar_1) + invar_2. Associate. */
6579 return
6580 simplify_giv_expr (loop,
6581 gen_rtx_PLUS (mode,
6582 XEXP (arg0, 0),
6583 gen_rtx_PLUS (mode,
6584 XEXP (arg0, 1),
6585 arg1)),
6586 ext_val, benefit);
6588 default:
6589 abort ();
6592 /* Each argument must be either REG, PLUS, or MULT. Convert REG to
6593 MULT to reduce cases. */
6594 if (GET_CODE (arg0) == REG)
6595 arg0 = gen_rtx_MULT (mode, arg0, const1_rtx);
6596 if (GET_CODE (arg1) == REG)
6597 arg1 = gen_rtx_MULT (mode, arg1, const1_rtx);
6599 /* Now have PLUS + PLUS, PLUS + MULT, MULT + PLUS, or MULT + MULT.
6600 Put a MULT first, leaving PLUS + PLUS, MULT + PLUS, or MULT + MULT.
6601 Recurse to associate the second PLUS. */
6602 if (GET_CODE (arg1) == MULT)
6603 tem = arg0, arg0 = arg1, arg1 = tem;
6605 if (GET_CODE (arg1) == PLUS)
6606 return
6607 simplify_giv_expr (loop,
6608 gen_rtx_PLUS (mode,
6609 gen_rtx_PLUS (mode, arg0,
6610 XEXP (arg1, 0)),
6611 XEXP (arg1, 1)),
6612 ext_val, benefit);
6614 /* Now must have MULT + MULT. Distribute if same biv, else not giv. */
6615 if (GET_CODE (arg0) != MULT || GET_CODE (arg1) != MULT)
6616 return NULL_RTX;
6618 if (!rtx_equal_p (arg0, arg1))
6619 return NULL_RTX;
6621 return simplify_giv_expr (loop,
6622 gen_rtx_MULT (mode,
6623 XEXP (arg0, 0),
6624 gen_rtx_PLUS (mode,
6625 XEXP (arg0, 1),
6626 XEXP (arg1, 1))),
6627 ext_val, benefit);
6629 case MINUS:
6630 /* Handle "a - b" as "a + b * (-1)". */
6631 return simplify_giv_expr (loop,
6632 gen_rtx_PLUS (mode,
6633 XEXP (x, 0),
6634 gen_rtx_MULT (mode,
6635 XEXP (x, 1),
6636 constm1_rtx)),
6637 ext_val, benefit);
6639 case MULT:
6640 arg0 = simplify_giv_expr (loop, XEXP (x, 0), ext_val, benefit);
6641 arg1 = simplify_giv_expr (loop, XEXP (x, 1), ext_val, benefit);
6642 if (arg0 == 0 || arg1 == 0)
6643 return NULL_RTX;
6645 /* Put constant last, CONST_INT last if both constant. */
6646 if ((GET_CODE (arg0) == USE || GET_CODE (arg0) == CONST_INT)
6647 && GET_CODE (arg1) != CONST_INT)
6648 tem = arg0, arg0 = arg1, arg1 = tem;
6650 /* If second argument is not now constant, not giv. */
6651 if (GET_CODE (arg1) != USE && GET_CODE (arg1) != CONST_INT)
6652 return NULL_RTX;
6654 /* Handle multiply by 0 or 1. */
6655 if (arg1 == const0_rtx)
6656 return const0_rtx;
6658 else if (arg1 == const1_rtx)
6659 return arg0;
6661 switch (GET_CODE (arg0))
6663 case REG:
6664 /* biv * invar. Done. */
6665 return gen_rtx_MULT (mode, arg0, arg1);
6667 case CONST_INT:
6668 /* Product of two constants. */
6669 return GEN_INT (INTVAL (arg0) * INTVAL (arg1));
6671 case USE:
6672 /* invar * invar is a giv, but attempt to simplify it somehow. */
6673 if (GET_CODE (arg1) != CONST_INT)
6674 return NULL_RTX;
6676 arg0 = XEXP (arg0, 0);
6677 if (GET_CODE (arg0) == MULT)
6679 /* (invar_0 * invar_1) * invar_2. Associate. */
6680 return simplify_giv_expr (loop,
6681 gen_rtx_MULT (mode,
6682 XEXP (arg0, 0),
6683 gen_rtx_MULT (mode,
6684 XEXP (arg0,
6686 arg1)),
6687 ext_val, benefit);
6689 /* Porpagate the MULT expressions to the intermost nodes. */
6690 else if (GET_CODE (arg0) == PLUS)
6692 /* (invar_0 + invar_1) * invar_2. Distribute. */
6693 return simplify_giv_expr (loop,
6694 gen_rtx_PLUS (mode,
6695 gen_rtx_MULT (mode,
6696 XEXP (arg0,
6698 arg1),
6699 gen_rtx_MULT (mode,
6700 XEXP (arg0,
6702 arg1)),
6703 ext_val, benefit);
6705 return gen_rtx_USE (mode, gen_rtx_MULT (mode, arg0, arg1));
6707 case MULT:
6708 /* (a * invar_1) * invar_2. Associate. */
6709 return simplify_giv_expr (loop,
6710 gen_rtx_MULT (mode,
6711 XEXP (arg0, 0),
6712 gen_rtx_MULT (mode,
6713 XEXP (arg0, 1),
6714 arg1)),
6715 ext_val, benefit);
6717 case PLUS:
6718 /* (a + invar_1) * invar_2. Distribute. */
6719 return simplify_giv_expr (loop,
6720 gen_rtx_PLUS (mode,
6721 gen_rtx_MULT (mode,
6722 XEXP (arg0, 0),
6723 arg1),
6724 gen_rtx_MULT (mode,
6725 XEXP (arg0, 1),
6726 arg1)),
6727 ext_val, benefit);
6729 default:
6730 abort ();
6733 case ASHIFT:
6734 /* Shift by constant is multiply by power of two. */
6735 if (GET_CODE (XEXP (x, 1)) != CONST_INT)
6736 return 0;
6738 return
6739 simplify_giv_expr (loop,
6740 gen_rtx_MULT (mode,
6741 XEXP (x, 0),
6742 GEN_INT ((HOST_WIDE_INT) 1
6743 << INTVAL (XEXP (x, 1)))),
6744 ext_val, benefit);
6746 case NEG:
6747 /* "-a" is "a * (-1)" */
6748 return simplify_giv_expr (loop,
6749 gen_rtx_MULT (mode, XEXP (x, 0), constm1_rtx),
6750 ext_val, benefit);
6752 case NOT:
6753 /* "~a" is "-a - 1". Silly, but easy. */
6754 return simplify_giv_expr (loop,
6755 gen_rtx_MINUS (mode,
6756 gen_rtx_NEG (mode, XEXP (x, 0)),
6757 const1_rtx),
6758 ext_val, benefit);
6760 case USE:
6761 /* Already in proper form for invariant. */
6762 return x;
6764 case SIGN_EXTEND:
6765 case ZERO_EXTEND:
6766 case TRUNCATE:
6767 /* Conditionally recognize extensions of simple IVs. After we've
6768 computed loop traversal counts and verified the range of the
6769 source IV, we'll reevaluate this as a GIV. */
6770 if (*ext_val == NULL_RTX)
6772 arg0 = simplify_giv_expr (loop, XEXP (x, 0), ext_val, benefit);
6773 if (arg0 && *ext_val == NULL_RTX && GET_CODE (arg0) == REG)
6775 *ext_val = gen_rtx_fmt_e (GET_CODE (x), mode, arg0);
6776 return arg0;
6779 goto do_default;
6781 case REG:
6782 /* If this is a new register, we can't deal with it. */
6783 if (REGNO (x) >= max_reg_before_loop)
6784 return 0;
6786 /* Check for biv or giv. */
6787 switch (REG_IV_TYPE (ivs, REGNO (x)))
6789 case BASIC_INDUCT:
6790 return x;
6791 case GENERAL_INDUCT:
6793 struct induction *v = REG_IV_INFO (ivs, REGNO (x));
6795 /* Form expression from giv and add benefit. Ensure this giv
6796 can derive another and subtract any needed adjustment if so. */
6798 /* Increasing the benefit here is risky. The only case in which it
6799 is arguably correct is if this is the only use of V. In other
6800 cases, this will artificially inflate the benefit of the current
6801 giv, and lead to suboptimal code. Thus, it is disabled, since
6802 potentially not reducing an only marginally beneficial giv is
6803 less harmful than reducing many givs that are not really
6804 beneficial. */
6806 rtx single_use = regs->array[REGNO (x)].single_usage;
6807 if (single_use && single_use != const0_rtx)
6808 *benefit += v->benefit;
6811 if (v->cant_derive)
6812 return 0;
6814 tem = gen_rtx_PLUS (mode, gen_rtx_MULT (mode,
6815 v->src_reg, v->mult_val),
6816 v->add_val);
6818 if (v->derive_adjustment)
6819 tem = gen_rtx_MINUS (mode, tem, v->derive_adjustment);
6820 arg0 = simplify_giv_expr (loop, tem, ext_val, benefit);
6821 if (*ext_val)
6823 if (!v->ext_dependent)
6824 return arg0;
6826 else
6828 *ext_val = v->ext_dependent;
6829 return arg0;
6831 return 0;
6834 default:
6835 do_default:
6836 /* If it isn't an induction variable, and it is invariant, we
6837 may be able to simplify things further by looking through
6838 the bits we just moved outside the loop. */
6839 if (loop_invariant_p (loop, x) == 1)
6841 struct movable *m;
6842 struct loop_movables *movables = LOOP_MOVABLES (loop);
6844 for (m = movables->head; m; m = m->next)
6845 if (rtx_equal_p (x, m->set_dest))
6847 /* Ok, we found a match. Substitute and simplify. */
6849 /* If we match another movable, we must use that, as
6850 this one is going away. */
6851 if (m->match)
6852 return simplify_giv_expr (loop, m->match->set_dest,
6853 ext_val, benefit);
6855 /* If consec is nonzero, this is a member of a group of
6856 instructions that were moved together. We handle this
6857 case only to the point of seeking to the last insn and
6858 looking for a REG_EQUAL. Fail if we don't find one. */
6859 if (m->consec != 0)
6861 int i = m->consec;
6862 tem = m->insn;
6865 tem = NEXT_INSN (tem);
6867 while (--i > 0);
6869 tem = find_reg_note (tem, REG_EQUAL, NULL_RTX);
6870 if (tem)
6871 tem = XEXP (tem, 0);
6873 else
6875 tem = single_set (m->insn);
6876 if (tem)
6877 tem = SET_SRC (tem);
6880 if (tem)
6882 /* What we are most interested in is pointer
6883 arithmetic on invariants -- only take
6884 patterns we may be able to do something with. */
6885 if (GET_CODE (tem) == PLUS
6886 || GET_CODE (tem) == MULT
6887 || GET_CODE (tem) == ASHIFT
6888 || GET_CODE (tem) == CONST_INT
6889 || GET_CODE (tem) == SYMBOL_REF)
6891 tem = simplify_giv_expr (loop, tem, ext_val,
6892 benefit);
6893 if (tem)
6894 return tem;
6896 else if (GET_CODE (tem) == CONST
6897 && GET_CODE (XEXP (tem, 0)) == PLUS
6898 && GET_CODE (XEXP (XEXP (tem, 0), 0)) == SYMBOL_REF
6899 && GET_CODE (XEXP (XEXP (tem, 0), 1)) == CONST_INT)
6901 tem = simplify_giv_expr (loop, XEXP (tem, 0),
6902 ext_val, benefit);
6903 if (tem)
6904 return tem;
6907 break;
6910 break;
6913 /* Fall through to general case. */
6914 default:
6915 /* If invariant, return as USE (unless CONST_INT).
6916 Otherwise, not giv. */
6917 if (GET_CODE (x) == USE)
6918 x = XEXP (x, 0);
6920 if (loop_invariant_p (loop, x) == 1)
6922 if (GET_CODE (x) == CONST_INT)
6923 return x;
6924 if (GET_CODE (x) == CONST
6925 && GET_CODE (XEXP (x, 0)) == PLUS
6926 && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
6927 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)
6928 x = XEXP (x, 0);
6929 return gen_rtx_USE (mode, x);
6931 else
6932 return 0;
6936 /* This routine folds invariants such that there is only ever one
6937 CONST_INT in the summation. It is only used by simplify_giv_expr. */
6939 static rtx
6940 sge_plus_constant (x, c)
6941 rtx x, c;
6943 if (GET_CODE (x) == CONST_INT)
6944 return GEN_INT (INTVAL (x) + INTVAL (c));
6945 else if (GET_CODE (x) != PLUS)
6946 return gen_rtx_PLUS (GET_MODE (x), x, c);
6947 else if (GET_CODE (XEXP (x, 1)) == CONST_INT)
6949 return gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
6950 GEN_INT (INTVAL (XEXP (x, 1)) + INTVAL (c)));
6952 else if (GET_CODE (XEXP (x, 0)) == PLUS
6953 || GET_CODE (XEXP (x, 1)) != PLUS)
6955 return gen_rtx_PLUS (GET_MODE (x),
6956 sge_plus_constant (XEXP (x, 0), c), XEXP (x, 1));
6958 else
6960 return gen_rtx_PLUS (GET_MODE (x),
6961 sge_plus_constant (XEXP (x, 1), c), XEXP (x, 0));
6965 static rtx
6966 sge_plus (mode, x, y)
6967 enum machine_mode mode;
6968 rtx x, y;
6970 while (GET_CODE (y) == PLUS)
6972 rtx a = XEXP (y, 0);
6973 if (GET_CODE (a) == CONST_INT)
6974 x = sge_plus_constant (x, a);
6975 else
6976 x = gen_rtx_PLUS (mode, x, a);
6977 y = XEXP (y, 1);
6979 if (GET_CODE (y) == CONST_INT)
6980 x = sge_plus_constant (x, y);
6981 else
6982 x = gen_rtx_PLUS (mode, x, y);
6983 return x;
6986 /* Help detect a giv that is calculated by several consecutive insns;
6987 for example,
6988 giv = biv * M
6989 giv = giv + A
6990 The caller has already identified the first insn P as having a giv as dest;
6991 we check that all other insns that set the same register follow
6992 immediately after P, that they alter nothing else,
6993 and that the result of the last is still a giv.
6995 The value is 0 if the reg set in P is not really a giv.
6996 Otherwise, the value is the amount gained by eliminating
6997 all the consecutive insns that compute the value.
6999 FIRST_BENEFIT is the amount gained by eliminating the first insn, P.
7000 SRC_REG is the reg of the biv; DEST_REG is the reg of the giv.
7002 The coefficients of the ultimate giv value are stored in
7003 *MULT_VAL and *ADD_VAL. */
7005 static int
7006 consec_sets_giv (loop, first_benefit, p, src_reg, dest_reg,
7007 add_val, mult_val, ext_val, last_consec_insn)
7008 const struct loop *loop;
7009 int first_benefit;
7010 rtx p;
7011 rtx src_reg;
7012 rtx dest_reg;
7013 rtx *add_val;
7014 rtx *mult_val;
7015 rtx *ext_val;
7016 rtx *last_consec_insn;
7018 struct loop_ivs *ivs = LOOP_IVS (loop);
7019 struct loop_regs *regs = LOOP_REGS (loop);
7020 int count;
7021 enum rtx_code code;
7022 int benefit;
7023 rtx temp;
7024 rtx set;
7026 /* Indicate that this is a giv so that we can update the value produced in
7027 each insn of the multi-insn sequence.
7029 This induction structure will be used only by the call to
7030 general_induction_var below, so we can allocate it on our stack.
7031 If this is a giv, our caller will replace the induct var entry with
7032 a new induction structure. */
7033 struct induction *v;
7035 if (REG_IV_TYPE (ivs, REGNO (dest_reg)) != UNKNOWN_INDUCT)
7036 return 0;
7038 v = (struct induction *) alloca (sizeof (struct induction));
7039 v->src_reg = src_reg;
7040 v->mult_val = *mult_val;
7041 v->add_val = *add_val;
7042 v->benefit = first_benefit;
7043 v->cant_derive = 0;
7044 v->derive_adjustment = 0;
7045 v->ext_dependent = NULL_RTX;
7047 REG_IV_TYPE (ivs, REGNO (dest_reg)) = GENERAL_INDUCT;
7048 REG_IV_INFO (ivs, REGNO (dest_reg)) = v;
7050 count = regs->array[REGNO (dest_reg)].n_times_set - 1;
7052 while (count > 0)
7054 p = NEXT_INSN (p);
7055 code = GET_CODE (p);
7057 /* If libcall, skip to end of call sequence. */
7058 if (code == INSN && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
7059 p = XEXP (temp, 0);
7061 if (code == INSN
7062 && (set = single_set (p))
7063 && GET_CODE (SET_DEST (set)) == REG
7064 && SET_DEST (set) == dest_reg
7065 && (general_induction_var (loop, SET_SRC (set), &src_reg,
7066 add_val, mult_val, ext_val, 0,
7067 &benefit, VOIDmode)
7068 /* Giv created by equivalent expression. */
7069 || ((temp = find_reg_note (p, REG_EQUAL, NULL_RTX))
7070 && general_induction_var (loop, XEXP (temp, 0), &src_reg,
7071 add_val, mult_val, ext_val, 0,
7072 &benefit, VOIDmode)))
7073 && src_reg == v->src_reg)
7075 if (find_reg_note (p, REG_RETVAL, NULL_RTX))
7076 benefit += libcall_benefit (p);
7078 count--;
7079 v->mult_val = *mult_val;
7080 v->add_val = *add_val;
7081 v->benefit += benefit;
7083 else if (code != NOTE)
7085 /* Allow insns that set something other than this giv to a
7086 constant. Such insns are needed on machines which cannot
7087 include long constants and should not disqualify a giv. */
7088 if (code == INSN
7089 && (set = single_set (p))
7090 && SET_DEST (set) != dest_reg
7091 && CONSTANT_P (SET_SRC (set)))
7092 continue;
7094 REG_IV_TYPE (ivs, REGNO (dest_reg)) = UNKNOWN_INDUCT;
7095 return 0;
7099 REG_IV_TYPE (ivs, REGNO (dest_reg)) = UNKNOWN_INDUCT;
7100 *last_consec_insn = p;
7101 return v->benefit;
7104 /* Return an rtx, if any, that expresses giv G2 as a function of the register
7105 represented by G1. If no such expression can be found, or it is clear that
7106 it cannot possibly be a valid address, 0 is returned.
7108 To perform the computation, we note that
7109 G1 = x * v + a and
7110 G2 = y * v + b
7111 where `v' is the biv.
7113 So G2 = (y/b) * G1 + (b - a*y/x).
7115 Note that MULT = y/x.
7117 Update: A and B are now allowed to be additive expressions such that
7118 B contains all variables in A. That is, computing B-A will not require
7119 subtracting variables. */
7121 static rtx
7122 express_from_1 (a, b, mult)
7123 rtx a, b, mult;
7125 /* If MULT is zero, then A*MULT is zero, and our expression is B. */
7127 if (mult == const0_rtx)
7128 return b;
7130 /* If MULT is not 1, we cannot handle A with non-constants, since we
7131 would then be required to subtract multiples of the registers in A.
7132 This is theoretically possible, and may even apply to some Fortran
7133 constructs, but it is a lot of work and we do not attempt it here. */
7135 if (mult != const1_rtx && GET_CODE (a) != CONST_INT)
7136 return NULL_RTX;
7138 /* In general these structures are sorted top to bottom (down the PLUS
7139 chain), but not left to right across the PLUS. If B is a higher
7140 order giv than A, we can strip one level and recurse. If A is higher
7141 order, we'll eventually bail out, but won't know that until the end.
7142 If they are the same, we'll strip one level around this loop. */
7144 while (GET_CODE (a) == PLUS && GET_CODE (b) == PLUS)
7146 rtx ra, rb, oa, ob, tmp;
7148 ra = XEXP (a, 0), oa = XEXP (a, 1);
7149 if (GET_CODE (ra) == PLUS)
7150 tmp = ra, ra = oa, oa = tmp;
7152 rb = XEXP (b, 0), ob = XEXP (b, 1);
7153 if (GET_CODE (rb) == PLUS)
7154 tmp = rb, rb = ob, ob = tmp;
7156 if (rtx_equal_p (ra, rb))
7157 /* We matched: remove one reg completely. */
7158 a = oa, b = ob;
7159 else if (GET_CODE (ob) != PLUS && rtx_equal_p (ra, ob))
7160 /* An alternate match. */
7161 a = oa, b = rb;
7162 else if (GET_CODE (oa) != PLUS && rtx_equal_p (oa, rb))
7163 /* An alternate match. */
7164 a = ra, b = ob;
7165 else
7167 /* Indicates an extra register in B. Strip one level from B and
7168 recurse, hoping B was the higher order expression. */
7169 ob = express_from_1 (a, ob, mult);
7170 if (ob == NULL_RTX)
7171 return NULL_RTX;
7172 return gen_rtx_PLUS (GET_MODE (b), rb, ob);
7176 /* Here we are at the last level of A, go through the cases hoping to
7177 get rid of everything but a constant. */
7179 if (GET_CODE (a) == PLUS)
7181 rtx ra, oa;
7183 ra = XEXP (a, 0), oa = XEXP (a, 1);
7184 if (rtx_equal_p (oa, b))
7185 oa = ra;
7186 else if (!rtx_equal_p (ra, b))
7187 return NULL_RTX;
7189 if (GET_CODE (oa) != CONST_INT)
7190 return NULL_RTX;
7192 return GEN_INT (-INTVAL (oa) * INTVAL (mult));
7194 else if (GET_CODE (a) == CONST_INT)
7196 return plus_constant (b, -INTVAL (a) * INTVAL (mult));
7198 else if (CONSTANT_P (a))
7200 enum machine_mode mode_a = GET_MODE (a);
7201 enum machine_mode mode_b = GET_MODE (b);
7202 enum machine_mode mode = mode_b == VOIDmode ? mode_a : mode_b;
7203 return simplify_gen_binary (MINUS, mode, b, a);
7205 else if (GET_CODE (b) == PLUS)
7207 if (rtx_equal_p (a, XEXP (b, 0)))
7208 return XEXP (b, 1);
7209 else if (rtx_equal_p (a, XEXP (b, 1)))
7210 return XEXP (b, 0);
7211 else
7212 return NULL_RTX;
7214 else if (rtx_equal_p (a, b))
7215 return const0_rtx;
7217 return NULL_RTX;
7221 express_from (g1, g2)
7222 struct induction *g1, *g2;
7224 rtx mult, add;
7226 /* The value that G1 will be multiplied by must be a constant integer. Also,
7227 the only chance we have of getting a valid address is if b*c/a (see above
7228 for notation) is also an integer. */
7229 if (GET_CODE (g1->mult_val) == CONST_INT
7230 && GET_CODE (g2->mult_val) == CONST_INT)
7232 if (g1->mult_val == const0_rtx
7233 || INTVAL (g2->mult_val) % INTVAL (g1->mult_val) != 0)
7234 return NULL_RTX;
7235 mult = GEN_INT (INTVAL (g2->mult_val) / INTVAL (g1->mult_val));
7237 else if (rtx_equal_p (g1->mult_val, g2->mult_val))
7238 mult = const1_rtx;
7239 else
7241 /* ??? Find out if the one is a multiple of the other? */
7242 return NULL_RTX;
7245 add = express_from_1 (g1->add_val, g2->add_val, mult);
7246 if (add == NULL_RTX)
7248 /* Failed. If we've got a multiplication factor between G1 and G2,
7249 scale G1's addend and try again. */
7250 if (INTVAL (mult) > 1)
7252 rtx g1_add_val = g1->add_val;
7253 if (GET_CODE (g1_add_val) == MULT
7254 && GET_CODE (XEXP (g1_add_val, 1)) == CONST_INT)
7256 HOST_WIDE_INT m;
7257 m = INTVAL (mult) * INTVAL (XEXP (g1_add_val, 1));
7258 g1_add_val = gen_rtx_MULT (GET_MODE (g1_add_val),
7259 XEXP (g1_add_val, 0), GEN_INT (m));
7261 else
7263 g1_add_val = gen_rtx_MULT (GET_MODE (g1_add_val), g1_add_val,
7264 mult);
7267 add = express_from_1 (g1_add_val, g2->add_val, const1_rtx);
7270 if (add == NULL_RTX)
7271 return NULL_RTX;
7273 /* Form simplified final result. */
7274 if (mult == const0_rtx)
7275 return add;
7276 else if (mult == const1_rtx)
7277 mult = g1->dest_reg;
7278 else
7279 mult = gen_rtx_MULT (g2->mode, g1->dest_reg, mult);
7281 if (add == const0_rtx)
7282 return mult;
7283 else
7285 if (GET_CODE (add) == PLUS
7286 && CONSTANT_P (XEXP (add, 1)))
7288 rtx tem = XEXP (add, 1);
7289 mult = gen_rtx_PLUS (g2->mode, mult, XEXP (add, 0));
7290 add = tem;
7293 return gen_rtx_PLUS (g2->mode, mult, add);
7297 /* Return an rtx, if any, that expresses giv G2 as a function of the register
7298 represented by G1. This indicates that G2 should be combined with G1 and
7299 that G2 can use (either directly or via an address expression) a register
7300 used to represent G1. */
7302 static rtx
7303 combine_givs_p (g1, g2)
7304 struct induction *g1, *g2;
7306 rtx comb, ret;
7308 /* With the introduction of ext dependent givs, we must care for modes.
7309 G2 must not use a wider mode than G1. */
7310 if (GET_MODE_SIZE (g1->mode) < GET_MODE_SIZE (g2->mode))
7311 return NULL_RTX;
7313 ret = comb = express_from (g1, g2);
7314 if (comb == NULL_RTX)
7315 return NULL_RTX;
7316 if (g1->mode != g2->mode)
7317 ret = gen_lowpart (g2->mode, comb);
7319 /* If these givs are identical, they can be combined. We use the results
7320 of express_from because the addends are not in a canonical form, so
7321 rtx_equal_p is a weaker test. */
7322 /* But don't combine a DEST_REG giv with a DEST_ADDR giv; we want the
7323 combination to be the other way round. */
7324 if (comb == g1->dest_reg
7325 && (g1->giv_type == DEST_REG || g2->giv_type == DEST_ADDR))
7327 return ret;
7330 /* If G2 can be expressed as a function of G1 and that function is valid
7331 as an address and no more expensive than using a register for G2,
7332 the expression of G2 in terms of G1 can be used. */
7333 if (ret != NULL_RTX
7334 && g2->giv_type == DEST_ADDR
7335 && memory_address_p (GET_MODE (g2->mem), ret)
7336 /* ??? Looses, especially with -fforce-addr, where *g2->location
7337 will always be a register, and so anything more complicated
7338 gets discarded. */
7339 #if 0
7340 #ifdef ADDRESS_COST
7341 && ADDRESS_COST (tem) <= ADDRESS_COST (*g2->location)
7342 #else
7343 && rtx_cost (tem, MEM) <= rtx_cost (*g2->location, MEM)
7344 #endif
7345 #endif
7348 return ret;
7351 return NULL_RTX;
7354 /* Check each extension dependent giv in this class to see if its
7355 root biv is safe from wrapping in the interior mode, which would
7356 make the giv illegal. */
7358 static void
7359 check_ext_dependent_givs (bl, loop_info)
7360 struct iv_class *bl;
7361 struct loop_info *loop_info;
7363 int ze_ok = 0, se_ok = 0, info_ok = 0;
7364 enum machine_mode biv_mode = GET_MODE (bl->biv->src_reg);
7365 HOST_WIDE_INT start_val;
7366 unsigned HOST_WIDE_INT u_end_val = 0;
7367 unsigned HOST_WIDE_INT u_start_val = 0;
7368 rtx incr = pc_rtx;
7369 struct induction *v;
7371 /* Make sure the iteration data is available. We must have
7372 constants in order to be certain of no overflow. */
7373 /* ??? An unknown iteration count with an increment of +-1
7374 combined with friendly exit tests of against an invariant
7375 value is also ameanable to optimization. Not implemented. */
7376 if (loop_info->n_iterations > 0
7377 && bl->initial_value
7378 && GET_CODE (bl->initial_value) == CONST_INT
7379 && (incr = biv_total_increment (bl))
7380 && GET_CODE (incr) == CONST_INT
7381 /* Make sure the host can represent the arithmetic. */
7382 && HOST_BITS_PER_WIDE_INT >= GET_MODE_BITSIZE (biv_mode))
7384 unsigned HOST_WIDE_INT abs_incr, total_incr;
7385 HOST_WIDE_INT s_end_val;
7386 int neg_incr;
7388 info_ok = 1;
7389 start_val = INTVAL (bl->initial_value);
7390 u_start_val = start_val;
7392 neg_incr = 0, abs_incr = INTVAL (incr);
7393 if (INTVAL (incr) < 0)
7394 neg_incr = 1, abs_incr = -abs_incr;
7395 total_incr = abs_incr * loop_info->n_iterations;
7397 /* Check for host arithmatic overflow. */
7398 if (total_incr / loop_info->n_iterations == abs_incr)
7400 unsigned HOST_WIDE_INT u_max;
7401 HOST_WIDE_INT s_max;
7403 u_end_val = start_val + (neg_incr ? -total_incr : total_incr);
7404 s_end_val = u_end_val;
7405 u_max = GET_MODE_MASK (biv_mode);
7406 s_max = u_max >> 1;
7408 /* Check zero extension of biv ok. */
7409 if (start_val >= 0
7410 /* Check for host arithmatic overflow. */
7411 && (neg_incr
7412 ? u_end_val < u_start_val
7413 : u_end_val > u_start_val)
7414 /* Check for target arithmetic overflow. */
7415 && (neg_incr
7416 ? 1 /* taken care of with host overflow */
7417 : u_end_val <= u_max))
7419 ze_ok = 1;
7422 /* Check sign extension of biv ok. */
7423 /* ??? While it is true that overflow with signed and pointer
7424 arithmetic is undefined, I fear too many programmers don't
7425 keep this fact in mind -- myself included on occasion.
7426 So leave alone with the signed overflow optimizations. */
7427 if (start_val >= -s_max - 1
7428 /* Check for host arithmatic overflow. */
7429 && (neg_incr
7430 ? s_end_val < start_val
7431 : s_end_val > start_val)
7432 /* Check for target arithmetic overflow. */
7433 && (neg_incr
7434 ? s_end_val >= -s_max - 1
7435 : s_end_val <= s_max))
7437 se_ok = 1;
7442 /* Invalidate givs that fail the tests. */
7443 for (v = bl->giv; v; v = v->next_iv)
7444 if (v->ext_dependent)
7446 enum rtx_code code = GET_CODE (v->ext_dependent);
7447 int ok = 0;
7449 switch (code)
7451 case SIGN_EXTEND:
7452 ok = se_ok;
7453 break;
7454 case ZERO_EXTEND:
7455 ok = ze_ok;
7456 break;
7458 case TRUNCATE:
7459 /* We don't know whether this value is being used as either
7460 signed or unsigned, so to safely truncate we must satisfy
7461 both. The initial check here verifies the BIV itself;
7462 once that is successful we may check its range wrt the
7463 derived GIV. */
7464 if (se_ok && ze_ok)
7466 enum machine_mode outer_mode = GET_MODE (v->ext_dependent);
7467 unsigned HOST_WIDE_INT max = GET_MODE_MASK (outer_mode) >> 1;
7469 /* We know from the above that both endpoints are nonnegative,
7470 and that there is no wrapping. Verify that both endpoints
7471 are within the (signed) range of the outer mode. */
7472 if (u_start_val <= max && u_end_val <= max)
7473 ok = 1;
7475 break;
7477 default:
7478 abort ();
7481 if (ok)
7483 if (loop_dump_stream)
7485 fprintf (loop_dump_stream,
7486 "Verified ext dependent giv at %d of reg %d\n",
7487 INSN_UID (v->insn), bl->regno);
7490 else
7492 if (loop_dump_stream)
7494 const char *why;
7496 if (info_ok)
7497 why = "biv iteration values overflowed";
7498 else
7500 if (incr == pc_rtx)
7501 incr = biv_total_increment (bl);
7502 if (incr == const1_rtx)
7503 why = "biv iteration info incomplete; incr by 1";
7504 else
7505 why = "biv iteration info incomplete";
7508 fprintf (loop_dump_stream,
7509 "Failed ext dependent giv at %d, %s\n",
7510 INSN_UID (v->insn), why);
7512 v->ignore = 1;
7513 bl->all_reduced = 0;
7518 /* Generate a version of VALUE in a mode appropriate for initializing V. */
7521 extend_value_for_giv (v, value)
7522 struct induction *v;
7523 rtx value;
7525 rtx ext_dep = v->ext_dependent;
7527 if (! ext_dep)
7528 return value;
7530 /* Recall that check_ext_dependent_givs verified that the known bounds
7531 of a biv did not overflow or wrap with respect to the extension for
7532 the giv. Therefore, constants need no additional adjustment. */
7533 if (CONSTANT_P (value) && GET_MODE (value) == VOIDmode)
7534 return value;
7536 /* Otherwise, we must adjust the value to compensate for the
7537 differing modes of the biv and the giv. */
7538 return gen_rtx_fmt_e (GET_CODE (ext_dep), GET_MODE (ext_dep), value);
7541 struct combine_givs_stats
7543 int giv_number;
7544 int total_benefit;
7547 static int
7548 cmp_combine_givs_stats (xp, yp)
7549 const PTR xp;
7550 const PTR yp;
7552 const struct combine_givs_stats * const x =
7553 (const struct combine_givs_stats *) xp;
7554 const struct combine_givs_stats * const y =
7555 (const struct combine_givs_stats *) yp;
7556 int d;
7557 d = y->total_benefit - x->total_benefit;
7558 /* Stabilize the sort. */
7559 if (!d)
7560 d = x->giv_number - y->giv_number;
7561 return d;
7564 /* Check all pairs of givs for iv_class BL and see if any can be combined with
7565 any other. If so, point SAME to the giv combined with and set NEW_REG to
7566 be an expression (in terms of the other giv's DEST_REG) equivalent to the
7567 giv. Also, update BENEFIT and related fields for cost/benefit analysis. */
7569 static void
7570 combine_givs (regs, bl)
7571 struct loop_regs *regs;
7572 struct iv_class *bl;
7574 /* Additional benefit to add for being combined multiple times. */
7575 const int extra_benefit = 3;
7577 struct induction *g1, *g2, **giv_array;
7578 int i, j, k, giv_count;
7579 struct combine_givs_stats *stats;
7580 rtx *can_combine;
7582 /* Count givs, because bl->giv_count is incorrect here. */
7583 giv_count = 0;
7584 for (g1 = bl->giv; g1; g1 = g1->next_iv)
7585 if (!g1->ignore)
7586 giv_count++;
7588 giv_array
7589 = (struct induction **) alloca (giv_count * sizeof (struct induction *));
7590 i = 0;
7591 for (g1 = bl->giv; g1; g1 = g1->next_iv)
7592 if (!g1->ignore)
7593 giv_array[i++] = g1;
7595 stats = (struct combine_givs_stats *) xcalloc (giv_count, sizeof (*stats));
7596 can_combine = (rtx *) xcalloc (giv_count, giv_count * sizeof (rtx));
7598 for (i = 0; i < giv_count; i++)
7600 int this_benefit;
7601 rtx single_use;
7603 g1 = giv_array[i];
7604 stats[i].giv_number = i;
7606 /* If a DEST_REG GIV is used only once, do not allow it to combine
7607 with anything, for in doing so we will gain nothing that cannot
7608 be had by simply letting the GIV with which we would have combined
7609 to be reduced on its own. The losage shows up in particular with
7610 DEST_ADDR targets on hosts with reg+reg addressing, though it can
7611 be seen elsewhere as well. */
7612 if (g1->giv_type == DEST_REG
7613 && (single_use = regs->array[REGNO (g1->dest_reg)].single_usage)
7614 && single_use != const0_rtx)
7615 continue;
7617 this_benefit = g1->benefit;
7618 /* Add an additional weight for zero addends. */
7619 if (g1->no_const_addval)
7620 this_benefit += 1;
7622 for (j = 0; j < giv_count; j++)
7624 rtx this_combine;
7626 g2 = giv_array[j];
7627 if (g1 != g2
7628 && (this_combine = combine_givs_p (g1, g2)) != NULL_RTX)
7630 can_combine[i * giv_count + j] = this_combine;
7631 this_benefit += g2->benefit + extra_benefit;
7634 stats[i].total_benefit = this_benefit;
7637 /* Iterate, combining until we can't. */
7638 restart:
7639 qsort (stats, giv_count, sizeof (*stats), cmp_combine_givs_stats);
7641 if (loop_dump_stream)
7643 fprintf (loop_dump_stream, "Sorted combine statistics:\n");
7644 for (k = 0; k < giv_count; k++)
7646 g1 = giv_array[stats[k].giv_number];
7647 if (!g1->combined_with && !g1->same)
7648 fprintf (loop_dump_stream, " {%d, %d}",
7649 INSN_UID (giv_array[stats[k].giv_number]->insn),
7650 stats[k].total_benefit);
7652 putc ('\n', loop_dump_stream);
7655 for (k = 0; k < giv_count; k++)
7657 int g1_add_benefit = 0;
7659 i = stats[k].giv_number;
7660 g1 = giv_array[i];
7662 /* If it has already been combined, skip. */
7663 if (g1->combined_with || g1->same)
7664 continue;
7666 for (j = 0; j < giv_count; j++)
7668 g2 = giv_array[j];
7669 if (g1 != g2 && can_combine[i * giv_count + j]
7670 /* If it has already been combined, skip. */
7671 && ! g2->same && ! g2->combined_with)
7673 int l;
7675 g2->new_reg = can_combine[i * giv_count + j];
7676 g2->same = g1;
7677 /* For destination, we now may replace by mem expression instead
7678 of register. This changes the costs considerably, so add the
7679 compensation. */
7680 if (g2->giv_type == DEST_ADDR)
7681 g2->benefit = (g2->benefit + reg_address_cost
7682 - address_cost (g2->new_reg,
7683 GET_MODE (g2->mem)));
7684 g1->combined_with++;
7685 g1->lifetime += g2->lifetime;
7687 g1_add_benefit += g2->benefit;
7689 /* ??? The new final_[bg]iv_value code does a much better job
7690 of finding replaceable giv's, and hence this code may no
7691 longer be necessary. */
7692 if (! g2->replaceable && REG_USERVAR_P (g2->dest_reg))
7693 g1_add_benefit -= copy_cost;
7695 /* To help optimize the next set of combinations, remove
7696 this giv from the benefits of other potential mates. */
7697 for (l = 0; l < giv_count; ++l)
7699 int m = stats[l].giv_number;
7700 if (can_combine[m * giv_count + j])
7701 stats[l].total_benefit -= g2->benefit + extra_benefit;
7704 if (loop_dump_stream)
7705 fprintf (loop_dump_stream,
7706 "giv at %d combined with giv at %d; new benefit %d + %d, lifetime %d\n",
7707 INSN_UID (g2->insn), INSN_UID (g1->insn),
7708 g1->benefit, g1_add_benefit, g1->lifetime);
7712 /* To help optimize the next set of combinations, remove
7713 this giv from the benefits of other potential mates. */
7714 if (g1->combined_with)
7716 for (j = 0; j < giv_count; ++j)
7718 int m = stats[j].giv_number;
7719 if (can_combine[m * giv_count + i])
7720 stats[j].total_benefit -= g1->benefit + extra_benefit;
7723 g1->benefit += g1_add_benefit;
7725 /* We've finished with this giv, and everything it touched.
7726 Restart the combination so that proper weights for the
7727 rest of the givs are properly taken into account. */
7728 /* ??? Ideally we would compact the arrays at this point, so
7729 as to not cover old ground. But sanely compacting
7730 can_combine is tricky. */
7731 goto restart;
7735 /* Clean up. */
7736 free (stats);
7737 free (can_combine);
7740 /* Generate sequence for REG = B * M + A. */
7742 static rtx
7743 gen_add_mult (b, m, a, reg)
7744 rtx b; /* initial value of basic induction variable */
7745 rtx m; /* multiplicative constant */
7746 rtx a; /* additive constant */
7747 rtx reg; /* destination register */
7749 rtx seq;
7750 rtx result;
7752 start_sequence ();
7753 /* Use unsigned arithmetic. */
7754 result = expand_mult_add (b, reg, m, a, GET_MODE (reg), 1);
7755 if (reg != result)
7756 emit_move_insn (reg, result);
7757 seq = get_insns ();
7758 end_sequence ();
7760 return seq;
7764 /* Update registers created in insn sequence SEQ. */
7766 static void
7767 loop_regs_update (loop, seq)
7768 const struct loop *loop ATTRIBUTE_UNUSED;
7769 rtx seq;
7771 rtx insn;
7773 /* Update register info for alias analysis. */
7775 if (seq == NULL_RTX)
7776 return;
7778 if (INSN_P (seq))
7780 insn = seq;
7781 while (insn != NULL_RTX)
7783 rtx set = single_set (insn);
7785 if (set && GET_CODE (SET_DEST (set)) == REG)
7786 record_base_value (REGNO (SET_DEST (set)), SET_SRC (set), 0);
7788 insn = NEXT_INSN (insn);
7791 else if (GET_CODE (seq) == SET
7792 && GET_CODE (SET_DEST (seq)) == REG)
7793 record_base_value (REGNO (SET_DEST (seq)), SET_SRC (seq), 0);
7797 /* EMIT code before BEFORE_BB/BEFORE_INSN to set REG = B * M + A. */
7799 void
7800 loop_iv_add_mult_emit_before (loop, b, m, a, reg, before_bb, before_insn)
7801 const struct loop *loop;
7802 rtx b; /* initial value of basic induction variable */
7803 rtx m; /* multiplicative constant */
7804 rtx a; /* additive constant */
7805 rtx reg; /* destination register */
7806 basic_block before_bb;
7807 rtx before_insn;
7809 rtx seq;
7811 if (! before_insn)
7813 loop_iv_add_mult_hoist (loop, b, m, a, reg);
7814 return;
7817 /* Use copy_rtx to prevent unexpected sharing of these rtx. */
7818 seq = gen_add_mult (copy_rtx (b), copy_rtx (m), copy_rtx (a), reg);
7820 /* Increase the lifetime of any invariants moved further in code. */
7821 update_reg_last_use (a, before_insn);
7822 update_reg_last_use (b, before_insn);
7823 update_reg_last_use (m, before_insn);
7825 loop_insn_emit_before (loop, before_bb, before_insn, seq);
7827 /* It is possible that the expansion created lots of new registers.
7828 Iterate over the sequence we just created and record them all. */
7829 loop_regs_update (loop, seq);
7833 /* Emit insns in loop pre-header to set REG = B * M + A. */
7835 void
7836 loop_iv_add_mult_sink (loop, b, m, a, reg)
7837 const struct loop *loop;
7838 rtx b; /* initial value of basic induction variable */
7839 rtx m; /* multiplicative constant */
7840 rtx a; /* additive constant */
7841 rtx reg; /* destination register */
7843 rtx seq;
7845 /* Use copy_rtx to prevent unexpected sharing of these rtx. */
7846 seq = gen_add_mult (copy_rtx (b), copy_rtx (m), copy_rtx (a), reg);
7848 /* Increase the lifetime of any invariants moved further in code.
7849 ???? Is this really necessary? */
7850 update_reg_last_use (a, loop->sink);
7851 update_reg_last_use (b, loop->sink);
7852 update_reg_last_use (m, loop->sink);
7854 loop_insn_sink (loop, seq);
7856 /* It is possible that the expansion created lots of new registers.
7857 Iterate over the sequence we just created and record them all. */
7858 loop_regs_update (loop, seq);
7862 /* Emit insns after loop to set REG = B * M + A. */
7864 void
7865 loop_iv_add_mult_hoist (loop, b, m, a, reg)
7866 const struct loop *loop;
7867 rtx b; /* initial value of basic induction variable */
7868 rtx m; /* multiplicative constant */
7869 rtx a; /* additive constant */
7870 rtx reg; /* destination register */
7872 rtx seq;
7874 /* Use copy_rtx to prevent unexpected sharing of these rtx. */
7875 seq = gen_add_mult (copy_rtx (b), copy_rtx (m), copy_rtx (a), reg);
7877 loop_insn_hoist (loop, seq);
7879 /* It is possible that the expansion created lots of new registers.
7880 Iterate over the sequence we just created and record them all. */
7881 loop_regs_update (loop, seq);
7886 /* Similar to gen_add_mult, but compute cost rather than generating
7887 sequence. */
7889 static int
7890 iv_add_mult_cost (b, m, a, reg)
7891 rtx b; /* initial value of basic induction variable */
7892 rtx m; /* multiplicative constant */
7893 rtx a; /* additive constant */
7894 rtx reg; /* destination register */
7896 int cost = 0;
7897 rtx last, result;
7899 start_sequence ();
7900 result = expand_mult_add (b, reg, m, a, GET_MODE (reg), 1);
7901 if (reg != result)
7902 emit_move_insn (reg, result);
7903 last = get_last_insn ();
7904 while (last)
7906 rtx t = single_set (last);
7907 if (t)
7908 cost += rtx_cost (SET_SRC (t), SET);
7909 last = PREV_INSN (last);
7911 end_sequence ();
7912 return cost;
7915 /* Test whether A * B can be computed without
7916 an actual multiply insn. Value is 1 if so.
7918 ??? This function stinks because it generates a ton of wasted RTL
7919 ??? and as a result fragments GC memory to no end. There are other
7920 ??? places in the compiler which are invoked a lot and do the same
7921 ??? thing, generate wasted RTL just to see if something is possible. */
7923 static int
7924 product_cheap_p (a, b)
7925 rtx a;
7926 rtx b;
7928 rtx tmp;
7929 int win, n_insns;
7931 /* If only one is constant, make it B. */
7932 if (GET_CODE (a) == CONST_INT)
7933 tmp = a, a = b, b = tmp;
7935 /* If first constant, both constant, so don't need multiply. */
7936 if (GET_CODE (a) == CONST_INT)
7937 return 1;
7939 /* If second not constant, neither is constant, so would need multiply. */
7940 if (GET_CODE (b) != CONST_INT)
7941 return 0;
7943 /* One operand is constant, so might not need multiply insn. Generate the
7944 code for the multiply and see if a call or multiply, or long sequence
7945 of insns is generated. */
7947 start_sequence ();
7948 expand_mult (GET_MODE (a), a, b, NULL_RTX, 1);
7949 tmp = get_insns ();
7950 end_sequence ();
7952 win = 1;
7953 if (INSN_P (tmp))
7955 n_insns = 0;
7956 while (tmp != NULL_RTX)
7958 rtx next = NEXT_INSN (tmp);
7960 if (++n_insns > 3
7961 || GET_CODE (tmp) != INSN
7962 || (GET_CODE (PATTERN (tmp)) == SET
7963 && GET_CODE (SET_SRC (PATTERN (tmp))) == MULT)
7964 || (GET_CODE (PATTERN (tmp)) == PARALLEL
7965 && GET_CODE (XVECEXP (PATTERN (tmp), 0, 0)) == SET
7966 && GET_CODE (SET_SRC (XVECEXP (PATTERN (tmp), 0, 0))) == MULT))
7968 win = 0;
7969 break;
7972 tmp = next;
7975 else if (GET_CODE (tmp) == SET
7976 && GET_CODE (SET_SRC (tmp)) == MULT)
7977 win = 0;
7978 else if (GET_CODE (tmp) == PARALLEL
7979 && GET_CODE (XVECEXP (tmp, 0, 0)) == SET
7980 && GET_CODE (SET_SRC (XVECEXP (tmp, 0, 0))) == MULT)
7981 win = 0;
7983 return win;
7986 /* Check to see if loop can be terminated by a "decrement and branch until
7987 zero" instruction. If so, add a REG_NONNEG note to the branch insn if so.
7988 Also try reversing an increment loop to a decrement loop
7989 to see if the optimization can be performed.
7990 Value is nonzero if optimization was performed. */
7992 /* This is useful even if the architecture doesn't have such an insn,
7993 because it might change a loops which increments from 0 to n to a loop
7994 which decrements from n to 0. A loop that decrements to zero is usually
7995 faster than one that increments from zero. */
7997 /* ??? This could be rewritten to use some of the loop unrolling procedures,
7998 such as approx_final_value, biv_total_increment, loop_iterations, and
7999 final_[bg]iv_value. */
8001 static int
8002 check_dbra_loop (loop, insn_count)
8003 struct loop *loop;
8004 int insn_count;
8006 struct loop_info *loop_info = LOOP_INFO (loop);
8007 struct loop_regs *regs = LOOP_REGS (loop);
8008 struct loop_ivs *ivs = LOOP_IVS (loop);
8009 struct iv_class *bl;
8010 rtx reg;
8011 rtx jump_label;
8012 rtx final_value;
8013 rtx start_value;
8014 rtx new_add_val;
8015 rtx comparison;
8016 rtx before_comparison;
8017 rtx p;
8018 rtx jump;
8019 rtx first_compare;
8020 int compare_and_branch;
8021 rtx loop_start = loop->start;
8022 rtx loop_end = loop->end;
8024 /* If last insn is a conditional branch, and the insn before tests a
8025 register value, try to optimize it. Otherwise, we can't do anything. */
8027 jump = PREV_INSN (loop_end);
8028 comparison = get_condition_for_loop (loop, jump);
8029 if (comparison == 0)
8030 return 0;
8031 if (!onlyjump_p (jump))
8032 return 0;
8034 /* Try to compute whether the compare/branch at the loop end is one or
8035 two instructions. */
8036 get_condition (jump, &first_compare);
8037 if (first_compare == jump)
8038 compare_and_branch = 1;
8039 else if (first_compare == prev_nonnote_insn (jump))
8040 compare_and_branch = 2;
8041 else
8042 return 0;
8045 /* If more than one condition is present to control the loop, then
8046 do not proceed, as this function does not know how to rewrite
8047 loop tests with more than one condition.
8049 Look backwards from the first insn in the last comparison
8050 sequence and see if we've got another comparison sequence. */
8052 rtx jump1;
8053 if ((jump1 = prev_nonnote_insn (first_compare)) != loop->cont)
8054 if (GET_CODE (jump1) == JUMP_INSN)
8055 return 0;
8058 /* Check all of the bivs to see if the compare uses one of them.
8059 Skip biv's set more than once because we can't guarantee that
8060 it will be zero on the last iteration. Also skip if the biv is
8061 used between its update and the test insn. */
8063 for (bl = ivs->list; bl; bl = bl->next)
8065 if (bl->biv_count == 1
8066 && ! bl->biv->maybe_multiple
8067 && bl->biv->dest_reg == XEXP (comparison, 0)
8068 && ! reg_used_between_p (regno_reg_rtx[bl->regno], bl->biv->insn,
8069 first_compare))
8070 break;
8073 if (! bl)
8074 return 0;
8076 /* Look for the case where the basic induction variable is always
8077 nonnegative, and equals zero on the last iteration.
8078 In this case, add a reg_note REG_NONNEG, which allows the
8079 m68k DBRA instruction to be used. */
8081 if (((GET_CODE (comparison) == GT
8082 && GET_CODE (XEXP (comparison, 1)) == CONST_INT
8083 && INTVAL (XEXP (comparison, 1)) == -1)
8084 || (GET_CODE (comparison) == NE && XEXP (comparison, 1) == const0_rtx))
8085 && GET_CODE (bl->biv->add_val) == CONST_INT
8086 && INTVAL (bl->biv->add_val) < 0)
8088 /* Initial value must be greater than 0,
8089 init_val % -dec_value == 0 to ensure that it equals zero on
8090 the last iteration */
8092 if (GET_CODE (bl->initial_value) == CONST_INT
8093 && INTVAL (bl->initial_value) > 0
8094 && (INTVAL (bl->initial_value)
8095 % (-INTVAL (bl->biv->add_val))) == 0)
8097 /* register always nonnegative, add REG_NOTE to branch */
8098 if (! find_reg_note (jump, REG_NONNEG, NULL_RTX))
8099 REG_NOTES (jump)
8100 = gen_rtx_EXPR_LIST (REG_NONNEG, bl->biv->dest_reg,
8101 REG_NOTES (jump));
8102 bl->nonneg = 1;
8104 return 1;
8107 /* If the decrement is 1 and the value was tested as >= 0 before
8108 the loop, then we can safely optimize. */
8109 for (p = loop_start; p; p = PREV_INSN (p))
8111 if (GET_CODE (p) == CODE_LABEL)
8112 break;
8113 if (GET_CODE (p) != JUMP_INSN)
8114 continue;
8116 before_comparison = get_condition_for_loop (loop, p);
8117 if (before_comparison
8118 && XEXP (before_comparison, 0) == bl->biv->dest_reg
8119 && GET_CODE (before_comparison) == LT
8120 && XEXP (before_comparison, 1) == const0_rtx
8121 && ! reg_set_between_p (bl->biv->dest_reg, p, loop_start)
8122 && INTVAL (bl->biv->add_val) == -1)
8124 if (! find_reg_note (jump, REG_NONNEG, NULL_RTX))
8125 REG_NOTES (jump)
8126 = gen_rtx_EXPR_LIST (REG_NONNEG, bl->biv->dest_reg,
8127 REG_NOTES (jump));
8128 bl->nonneg = 1;
8130 return 1;
8134 else if (GET_CODE (bl->biv->add_val) == CONST_INT
8135 && INTVAL (bl->biv->add_val) > 0)
8137 /* Try to change inc to dec, so can apply above optimization. */
8138 /* Can do this if:
8139 all registers modified are induction variables or invariant,
8140 all memory references have non-overlapping addresses
8141 (obviously true if only one write)
8142 allow 2 insns for the compare/jump at the end of the loop. */
8143 /* Also, we must avoid any instructions which use both the reversed
8144 biv and another biv. Such instructions will fail if the loop is
8145 reversed. We meet this condition by requiring that either
8146 no_use_except_counting is true, or else that there is only
8147 one biv. */
8148 int num_nonfixed_reads = 0;
8149 /* 1 if the iteration var is used only to count iterations. */
8150 int no_use_except_counting = 0;
8151 /* 1 if the loop has no memory store, or it has a single memory store
8152 which is reversible. */
8153 int reversible_mem_store = 1;
8155 if (bl->giv_count == 0
8156 && !loop->exit_count
8157 && !loop_info->has_multiple_exit_targets)
8159 rtx bivreg = regno_reg_rtx[bl->regno];
8160 struct iv_class *blt;
8162 /* If there are no givs for this biv, and the only exit is the
8163 fall through at the end of the loop, then
8164 see if perhaps there are no uses except to count. */
8165 no_use_except_counting = 1;
8166 for (p = loop_start; p != loop_end; p = NEXT_INSN (p))
8167 if (INSN_P (p))
8169 rtx set = single_set (p);
8171 if (set && GET_CODE (SET_DEST (set)) == REG
8172 && REGNO (SET_DEST (set)) == bl->regno)
8173 /* An insn that sets the biv is okay. */
8175 else if ((p == prev_nonnote_insn (prev_nonnote_insn (loop_end))
8176 || p == prev_nonnote_insn (loop_end))
8177 && reg_mentioned_p (bivreg, PATTERN (p)))
8179 /* If either of these insns uses the biv and sets a pseudo
8180 that has more than one usage, then the biv has uses
8181 other than counting since it's used to derive a value
8182 that is used more than one time. */
8183 note_stores (PATTERN (p), note_set_pseudo_multiple_uses,
8184 regs);
8185 if (regs->multiple_uses)
8187 no_use_except_counting = 0;
8188 break;
8191 else if (reg_mentioned_p (bivreg, PATTERN (p)))
8193 no_use_except_counting = 0;
8194 break;
8198 /* A biv has uses besides counting if it is used to set
8199 another biv. */
8200 for (blt = ivs->list; blt; blt = blt->next)
8201 if (blt->init_set
8202 && reg_mentioned_p (bivreg, SET_SRC (blt->init_set)))
8204 no_use_except_counting = 0;
8205 break;
8209 if (no_use_except_counting)
8210 /* No need to worry about MEMs. */
8212 else if (loop_info->num_mem_sets <= 1)
8214 for (p = loop_start; p != loop_end; p = NEXT_INSN (p))
8215 if (INSN_P (p))
8216 num_nonfixed_reads += count_nonfixed_reads (loop, PATTERN (p));
8218 /* If the loop has a single store, and the destination address is
8219 invariant, then we can't reverse the loop, because this address
8220 might then have the wrong value at loop exit.
8221 This would work if the source was invariant also, however, in that
8222 case, the insn should have been moved out of the loop. */
8224 if (loop_info->num_mem_sets == 1)
8226 struct induction *v;
8228 /* If we could prove that each of the memory locations
8229 written to was different, then we could reverse the
8230 store -- but we don't presently have any way of
8231 knowing that. */
8232 reversible_mem_store = 0;
8234 /* If the store depends on a register that is set after the
8235 store, it depends on the initial value, and is thus not
8236 reversible. */
8237 for (v = bl->giv; reversible_mem_store && v; v = v->next_iv)
8239 if (v->giv_type == DEST_REG
8240 && reg_mentioned_p (v->dest_reg,
8241 PATTERN (loop_info->first_loop_store_insn))
8242 && loop_insn_first_p (loop_info->first_loop_store_insn,
8243 v->insn))
8244 reversible_mem_store = 0;
8248 else
8249 return 0;
8251 /* This code only acts for innermost loops. Also it simplifies
8252 the memory address check by only reversing loops with
8253 zero or one memory access.
8254 Two memory accesses could involve parts of the same array,
8255 and that can't be reversed.
8256 If the biv is used only for counting, than we don't need to worry
8257 about all these things. */
8259 if ((num_nonfixed_reads <= 1
8260 && ! loop_info->has_nonconst_call
8261 && ! loop_info->has_prefetch
8262 && ! loop_info->has_volatile
8263 && reversible_mem_store
8264 && (bl->giv_count + bl->biv_count + loop_info->num_mem_sets
8265 + num_unmoved_movables (loop) + compare_and_branch == insn_count)
8266 && (bl == ivs->list && bl->next == 0))
8267 || (no_use_except_counting && ! loop_info->has_prefetch))
8269 rtx tem;
8271 /* Loop can be reversed. */
8272 if (loop_dump_stream)
8273 fprintf (loop_dump_stream, "Can reverse loop\n");
8275 /* Now check other conditions:
8277 The increment must be a constant, as must the initial value,
8278 and the comparison code must be LT.
8280 This test can probably be improved since +/- 1 in the constant
8281 can be obtained by changing LT to LE and vice versa; this is
8282 confusing. */
8284 if (comparison
8285 /* for constants, LE gets turned into LT */
8286 && (GET_CODE (comparison) == LT
8287 || (GET_CODE (comparison) == LE
8288 && no_use_except_counting)))
8290 HOST_WIDE_INT add_val, add_adjust, comparison_val = 0;
8291 rtx initial_value, comparison_value;
8292 int nonneg = 0;
8293 enum rtx_code cmp_code;
8294 int comparison_const_width;
8295 unsigned HOST_WIDE_INT comparison_sign_mask;
8297 add_val = INTVAL (bl->biv->add_val);
8298 comparison_value = XEXP (comparison, 1);
8299 if (GET_MODE (comparison_value) == VOIDmode)
8300 comparison_const_width
8301 = GET_MODE_BITSIZE (GET_MODE (XEXP (comparison, 0)));
8302 else
8303 comparison_const_width
8304 = GET_MODE_BITSIZE (GET_MODE (comparison_value));
8305 if (comparison_const_width > HOST_BITS_PER_WIDE_INT)
8306 comparison_const_width = HOST_BITS_PER_WIDE_INT;
8307 comparison_sign_mask
8308 = (unsigned HOST_WIDE_INT) 1 << (comparison_const_width - 1);
8310 /* If the comparison value is not a loop invariant, then we
8311 can not reverse this loop.
8313 ??? If the insns which initialize the comparison value as
8314 a whole compute an invariant result, then we could move
8315 them out of the loop and proceed with loop reversal. */
8316 if (! loop_invariant_p (loop, comparison_value))
8317 return 0;
8319 if (GET_CODE (comparison_value) == CONST_INT)
8320 comparison_val = INTVAL (comparison_value);
8321 initial_value = bl->initial_value;
8323 /* Normalize the initial value if it is an integer and
8324 has no other use except as a counter. This will allow
8325 a few more loops to be reversed. */
8326 if (no_use_except_counting
8327 && GET_CODE (comparison_value) == CONST_INT
8328 && GET_CODE (initial_value) == CONST_INT)
8330 comparison_val = comparison_val - INTVAL (bl->initial_value);
8331 /* The code below requires comparison_val to be a multiple
8332 of add_val in order to do the loop reversal, so
8333 round up comparison_val to a multiple of add_val.
8334 Since comparison_value is constant, we know that the
8335 current comparison code is LT. */
8336 comparison_val = comparison_val + add_val - 1;
8337 comparison_val
8338 -= (unsigned HOST_WIDE_INT) comparison_val % add_val;
8339 /* We postpone overflow checks for COMPARISON_VAL here;
8340 even if there is an overflow, we might still be able to
8341 reverse the loop, if converting the loop exit test to
8342 NE is possible. */
8343 initial_value = const0_rtx;
8346 /* First check if we can do a vanilla loop reversal. */
8347 if (initial_value == const0_rtx
8348 /* If we have a decrement_and_branch_on_count,
8349 prefer the NE test, since this will allow that
8350 instruction to be generated. Note that we must
8351 use a vanilla loop reversal if the biv is used to
8352 calculate a giv or has a non-counting use. */
8353 #if ! defined (HAVE_decrement_and_branch_until_zero) \
8354 && defined (HAVE_decrement_and_branch_on_count)
8355 && (! (add_val == 1 && loop->vtop
8356 && (bl->biv_count == 0
8357 || no_use_except_counting)))
8358 #endif
8359 && GET_CODE (comparison_value) == CONST_INT
8360 /* Now do postponed overflow checks on COMPARISON_VAL. */
8361 && ! (((comparison_val - add_val) ^ INTVAL (comparison_value))
8362 & comparison_sign_mask))
8364 /* Register will always be nonnegative, with value
8365 0 on last iteration */
8366 add_adjust = add_val;
8367 nonneg = 1;
8368 cmp_code = GE;
8370 else if (add_val == 1 && loop->vtop
8371 && (bl->biv_count == 0
8372 || no_use_except_counting))
8374 add_adjust = 0;
8375 cmp_code = NE;
8377 else
8378 return 0;
8380 if (GET_CODE (comparison) == LE)
8381 add_adjust -= add_val;
8383 /* If the initial value is not zero, or if the comparison
8384 value is not an exact multiple of the increment, then we
8385 can not reverse this loop. */
8386 if (initial_value == const0_rtx
8387 && GET_CODE (comparison_value) == CONST_INT)
8389 if (((unsigned HOST_WIDE_INT) comparison_val % add_val) != 0)
8390 return 0;
8392 else
8394 if (! no_use_except_counting || add_val != 1)
8395 return 0;
8398 final_value = comparison_value;
8400 /* Reset these in case we normalized the initial value
8401 and comparison value above. */
8402 if (GET_CODE (comparison_value) == CONST_INT
8403 && GET_CODE (initial_value) == CONST_INT)
8405 comparison_value = GEN_INT (comparison_val);
8406 final_value
8407 = GEN_INT (comparison_val + INTVAL (bl->initial_value));
8409 bl->initial_value = initial_value;
8411 /* Save some info needed to produce the new insns. */
8412 reg = bl->biv->dest_reg;
8413 jump_label = condjump_label (PREV_INSN (loop_end));
8414 new_add_val = GEN_INT (-INTVAL (bl->biv->add_val));
8416 /* Set start_value; if this is not a CONST_INT, we need
8417 to generate a SUB.
8418 Initialize biv to start_value before loop start.
8419 The old initializing insn will be deleted as a
8420 dead store by flow.c. */
8421 if (initial_value == const0_rtx
8422 && GET_CODE (comparison_value) == CONST_INT)
8424 start_value = GEN_INT (comparison_val - add_adjust);
8425 loop_insn_hoist (loop, gen_move_insn (reg, start_value));
8427 else if (GET_CODE (initial_value) == CONST_INT)
8429 enum machine_mode mode = GET_MODE (reg);
8430 rtx offset = GEN_INT (-INTVAL (initial_value) - add_adjust);
8431 rtx add_insn = gen_add3_insn (reg, comparison_value, offset);
8433 if (add_insn == 0)
8434 return 0;
8436 start_value
8437 = gen_rtx_PLUS (mode, comparison_value, offset);
8438 loop_insn_hoist (loop, add_insn);
8439 if (GET_CODE (comparison) == LE)
8440 final_value = gen_rtx_PLUS (mode, comparison_value,
8441 GEN_INT (add_val));
8443 else if (! add_adjust)
8445 enum machine_mode mode = GET_MODE (reg);
8446 rtx sub_insn = gen_sub3_insn (reg, comparison_value,
8447 initial_value);
8449 if (sub_insn == 0)
8450 return 0;
8451 start_value
8452 = gen_rtx_MINUS (mode, comparison_value, initial_value);
8453 loop_insn_hoist (loop, sub_insn);
8455 else
8456 /* We could handle the other cases too, but it'll be
8457 better to have a testcase first. */
8458 return 0;
8460 /* We may not have a single insn which can increment a reg, so
8461 create a sequence to hold all the insns from expand_inc. */
8462 start_sequence ();
8463 expand_inc (reg, new_add_val);
8464 tem = get_insns ();
8465 end_sequence ();
8467 p = loop_insn_emit_before (loop, 0, bl->biv->insn, tem);
8468 delete_insn (bl->biv->insn);
8470 /* Update biv info to reflect its new status. */
8471 bl->biv->insn = p;
8472 bl->initial_value = start_value;
8473 bl->biv->add_val = new_add_val;
8475 /* Update loop info. */
8476 loop_info->initial_value = reg;
8477 loop_info->initial_equiv_value = reg;
8478 loop_info->final_value = const0_rtx;
8479 loop_info->final_equiv_value = const0_rtx;
8480 loop_info->comparison_value = const0_rtx;
8481 loop_info->comparison_code = cmp_code;
8482 loop_info->increment = new_add_val;
8484 /* Inc LABEL_NUSES so that delete_insn will
8485 not delete the label. */
8486 LABEL_NUSES (XEXP (jump_label, 0))++;
8488 /* Emit an insn after the end of the loop to set the biv's
8489 proper exit value if it is used anywhere outside the loop. */
8490 if ((REGNO_LAST_UID (bl->regno) != INSN_UID (first_compare))
8491 || ! bl->init_insn
8492 || REGNO_FIRST_UID (bl->regno) != INSN_UID (bl->init_insn))
8493 loop_insn_sink (loop, gen_load_of_final_value (reg, final_value));
8495 /* Delete compare/branch at end of loop. */
8496 delete_related_insns (PREV_INSN (loop_end));
8497 if (compare_and_branch == 2)
8498 delete_related_insns (first_compare);
8500 /* Add new compare/branch insn at end of loop. */
8501 start_sequence ();
8502 emit_cmp_and_jump_insns (reg, const0_rtx, cmp_code, NULL_RTX,
8503 GET_MODE (reg), 0,
8504 XEXP (jump_label, 0));
8505 tem = get_insns ();
8506 end_sequence ();
8507 emit_jump_insn_before (tem, loop_end);
8509 for (tem = PREV_INSN (loop_end);
8510 tem && GET_CODE (tem) != JUMP_INSN;
8511 tem = PREV_INSN (tem))
8514 if (tem)
8515 JUMP_LABEL (tem) = XEXP (jump_label, 0);
8517 if (nonneg)
8519 if (tem)
8521 /* Increment of LABEL_NUSES done above. */
8522 /* Register is now always nonnegative,
8523 so add REG_NONNEG note to the branch. */
8524 REG_NOTES (tem) = gen_rtx_EXPR_LIST (REG_NONNEG, reg,
8525 REG_NOTES (tem));
8527 bl->nonneg = 1;
8530 /* No insn may reference both the reversed and another biv or it
8531 will fail (see comment near the top of the loop reversal
8532 code).
8533 Earlier on, we have verified that the biv has no use except
8534 counting, or it is the only biv in this function.
8535 However, the code that computes no_use_except_counting does
8536 not verify reg notes. It's possible to have an insn that
8537 references another biv, and has a REG_EQUAL note with an
8538 expression based on the reversed biv. To avoid this case,
8539 remove all REG_EQUAL notes based on the reversed biv
8540 here. */
8541 for (p = loop_start; p != loop_end; p = NEXT_INSN (p))
8542 if (INSN_P (p))
8544 rtx *pnote;
8545 rtx set = single_set (p);
8546 /* If this is a set of a GIV based on the reversed biv, any
8547 REG_EQUAL notes should still be correct. */
8548 if (! set
8549 || GET_CODE (SET_DEST (set)) != REG
8550 || (size_t) REGNO (SET_DEST (set)) >= ivs->n_regs
8551 || REG_IV_TYPE (ivs, REGNO (SET_DEST (set))) != GENERAL_INDUCT
8552 || REG_IV_INFO (ivs, REGNO (SET_DEST (set)))->src_reg != bl->biv->src_reg)
8553 for (pnote = &REG_NOTES (p); *pnote;)
8555 if (REG_NOTE_KIND (*pnote) == REG_EQUAL
8556 && reg_mentioned_p (regno_reg_rtx[bl->regno],
8557 XEXP (*pnote, 0)))
8558 *pnote = XEXP (*pnote, 1);
8559 else
8560 pnote = &XEXP (*pnote, 1);
8564 /* Mark that this biv has been reversed. Each giv which depends
8565 on this biv, and which is also live past the end of the loop
8566 will have to be fixed up. */
8568 bl->reversed = 1;
8570 if (loop_dump_stream)
8572 fprintf (loop_dump_stream, "Reversed loop");
8573 if (bl->nonneg)
8574 fprintf (loop_dump_stream, " and added reg_nonneg\n");
8575 else
8576 fprintf (loop_dump_stream, "\n");
8579 return 1;
8584 return 0;
8587 /* Verify whether the biv BL appears to be eliminable,
8588 based on the insns in the loop that refer to it.
8590 If ELIMINATE_P is nonzero, actually do the elimination.
8592 THRESHOLD and INSN_COUNT are from loop_optimize and are used to
8593 determine whether invariant insns should be placed inside or at the
8594 start of the loop. */
8596 static int
8597 maybe_eliminate_biv (loop, bl, eliminate_p, threshold, insn_count)
8598 const struct loop *loop;
8599 struct iv_class *bl;
8600 int eliminate_p;
8601 int threshold, insn_count;
8603 struct loop_ivs *ivs = LOOP_IVS (loop);
8604 rtx reg = bl->biv->dest_reg;
8605 rtx p;
8607 /* Scan all insns in the loop, stopping if we find one that uses the
8608 biv in a way that we cannot eliminate. */
8610 for (p = loop->start; p != loop->end; p = NEXT_INSN (p))
8612 enum rtx_code code = GET_CODE (p);
8613 basic_block where_bb = 0;
8614 rtx where_insn = threshold >= insn_count ? 0 : p;
8616 /* If this is a libcall that sets a giv, skip ahead to its end. */
8617 if (GET_RTX_CLASS (code) == 'i')
8619 rtx note = find_reg_note (p, REG_LIBCALL, NULL_RTX);
8621 if (note)
8623 rtx last = XEXP (note, 0);
8624 rtx set = single_set (last);
8626 if (set && GET_CODE (SET_DEST (set)) == REG)
8628 unsigned int regno = REGNO (SET_DEST (set));
8630 if (regno < ivs->n_regs
8631 && REG_IV_TYPE (ivs, regno) == GENERAL_INDUCT
8632 && REG_IV_INFO (ivs, regno)->src_reg == bl->biv->src_reg)
8633 p = last;
8637 if ((code == INSN || code == JUMP_INSN || code == CALL_INSN)
8638 && reg_mentioned_p (reg, PATTERN (p))
8639 && ! maybe_eliminate_biv_1 (loop, PATTERN (p), p, bl,
8640 eliminate_p, where_bb, where_insn))
8642 if (loop_dump_stream)
8643 fprintf (loop_dump_stream,
8644 "Cannot eliminate biv %d: biv used in insn %d.\n",
8645 bl->regno, INSN_UID (p));
8646 break;
8650 if (p == loop->end)
8652 if (loop_dump_stream)
8653 fprintf (loop_dump_stream, "biv %d %s eliminated.\n",
8654 bl->regno, eliminate_p ? "was" : "can be");
8655 return 1;
8658 return 0;
8661 /* INSN and REFERENCE are instructions in the same insn chain.
8662 Return nonzero if INSN is first. */
8665 loop_insn_first_p (insn, reference)
8666 rtx insn, reference;
8668 rtx p, q;
8670 for (p = insn, q = reference;;)
8672 /* Start with test for not first so that INSN == REFERENCE yields not
8673 first. */
8674 if (q == insn || ! p)
8675 return 0;
8676 if (p == reference || ! q)
8677 return 1;
8679 /* Either of P or Q might be a NOTE. Notes have the same LUID as the
8680 previous insn, hence the <= comparison below does not work if
8681 P is a note. */
8682 if (INSN_UID (p) < max_uid_for_loop
8683 && INSN_UID (q) < max_uid_for_loop
8684 && GET_CODE (p) != NOTE)
8685 return INSN_LUID (p) <= INSN_LUID (q);
8687 if (INSN_UID (p) >= max_uid_for_loop
8688 || GET_CODE (p) == NOTE)
8689 p = NEXT_INSN (p);
8690 if (INSN_UID (q) >= max_uid_for_loop)
8691 q = NEXT_INSN (q);
8695 /* We are trying to eliminate BIV in INSN using GIV. Return nonzero if
8696 the offset that we have to take into account due to auto-increment /
8697 div derivation is zero. */
8698 static int
8699 biv_elimination_giv_has_0_offset (biv, giv, insn)
8700 struct induction *biv, *giv;
8701 rtx insn;
8703 /* If the giv V had the auto-inc address optimization applied
8704 to it, and INSN occurs between the giv insn and the biv
8705 insn, then we'd have to adjust the value used here.
8706 This is rare, so we don't bother to make this possible. */
8707 if (giv->auto_inc_opt
8708 && ((loop_insn_first_p (giv->insn, insn)
8709 && loop_insn_first_p (insn, biv->insn))
8710 || (loop_insn_first_p (biv->insn, insn)
8711 && loop_insn_first_p (insn, giv->insn))))
8712 return 0;
8714 return 1;
8717 /* If BL appears in X (part of the pattern of INSN), see if we can
8718 eliminate its use. If so, return 1. If not, return 0.
8720 If BIV does not appear in X, return 1.
8722 If ELIMINATE_P is nonzero, actually do the elimination.
8723 WHERE_INSN/WHERE_BB indicate where extra insns should be added.
8724 Depending on how many items have been moved out of the loop, it
8725 will either be before INSN (when WHERE_INSN is nonzero) or at the
8726 start of the loop (when WHERE_INSN is zero). */
8728 static int
8729 maybe_eliminate_biv_1 (loop, x, insn, bl, eliminate_p, where_bb, where_insn)
8730 const struct loop *loop;
8731 rtx x, insn;
8732 struct iv_class *bl;
8733 int eliminate_p;
8734 basic_block where_bb;
8735 rtx where_insn;
8737 enum rtx_code code = GET_CODE (x);
8738 rtx reg = bl->biv->dest_reg;
8739 enum machine_mode mode = GET_MODE (reg);
8740 struct induction *v;
8741 rtx arg, tem;
8742 #ifdef HAVE_cc0
8743 rtx new;
8744 #endif
8745 int arg_operand;
8746 const char *fmt;
8747 int i, j;
8749 switch (code)
8751 case REG:
8752 /* If we haven't already been able to do something with this BIV,
8753 we can't eliminate it. */
8754 if (x == reg)
8755 return 0;
8756 return 1;
8758 case SET:
8759 /* If this sets the BIV, it is not a problem. */
8760 if (SET_DEST (x) == reg)
8761 return 1;
8763 /* If this is an insn that defines a giv, it is also ok because
8764 it will go away when the giv is reduced. */
8765 for (v = bl->giv; v; v = v->next_iv)
8766 if (v->giv_type == DEST_REG && SET_DEST (x) == v->dest_reg)
8767 return 1;
8769 #ifdef HAVE_cc0
8770 if (SET_DEST (x) == cc0_rtx && SET_SRC (x) == reg)
8772 /* Can replace with any giv that was reduced and
8773 that has (MULT_VAL != 0) and (ADD_VAL == 0).
8774 Require a constant for MULT_VAL, so we know it's nonzero.
8775 ??? We disable this optimization to avoid potential
8776 overflows. */
8778 for (v = bl->giv; v; v = v->next_iv)
8779 if (GET_CODE (v->mult_val) == CONST_INT && v->mult_val != const0_rtx
8780 && v->add_val == const0_rtx
8781 && ! v->ignore && ! v->maybe_dead && v->always_computable
8782 && v->mode == mode
8783 && 0)
8785 if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
8786 continue;
8788 if (! eliminate_p)
8789 return 1;
8791 /* If the giv has the opposite direction of change,
8792 then reverse the comparison. */
8793 if (INTVAL (v->mult_val) < 0)
8794 new = gen_rtx_COMPARE (GET_MODE (v->new_reg),
8795 const0_rtx, v->new_reg);
8796 else
8797 new = v->new_reg;
8799 /* We can probably test that giv's reduced reg. */
8800 if (validate_change (insn, &SET_SRC (x), new, 0))
8801 return 1;
8804 /* Look for a giv with (MULT_VAL != 0) and (ADD_VAL != 0);
8805 replace test insn with a compare insn (cmp REDUCED_GIV ADD_VAL).
8806 Require a constant for MULT_VAL, so we know it's nonzero.
8807 ??? Do this only if ADD_VAL is a pointer to avoid a potential
8808 overflow problem. */
8810 for (v = bl->giv; v; v = v->next_iv)
8811 if (GET_CODE (v->mult_val) == CONST_INT
8812 && v->mult_val != const0_rtx
8813 && ! v->ignore && ! v->maybe_dead && v->always_computable
8814 && v->mode == mode
8815 && (GET_CODE (v->add_val) == SYMBOL_REF
8816 || GET_CODE (v->add_val) == LABEL_REF
8817 || GET_CODE (v->add_val) == CONST
8818 || (GET_CODE (v->add_val) == REG
8819 && REG_POINTER (v->add_val))))
8821 if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
8822 continue;
8824 if (! eliminate_p)
8825 return 1;
8827 /* If the giv has the opposite direction of change,
8828 then reverse the comparison. */
8829 if (INTVAL (v->mult_val) < 0)
8830 new = gen_rtx_COMPARE (VOIDmode, copy_rtx (v->add_val),
8831 v->new_reg);
8832 else
8833 new = gen_rtx_COMPARE (VOIDmode, v->new_reg,
8834 copy_rtx (v->add_val));
8836 /* Replace biv with the giv's reduced register. */
8837 update_reg_last_use (v->add_val, insn);
8838 if (validate_change (insn, &SET_SRC (PATTERN (insn)), new, 0))
8839 return 1;
8841 /* Insn doesn't support that constant or invariant. Copy it
8842 into a register (it will be a loop invariant.) */
8843 tem = gen_reg_rtx (GET_MODE (v->new_reg));
8845 loop_insn_emit_before (loop, 0, where_insn,
8846 gen_move_insn (tem,
8847 copy_rtx (v->add_val)));
8849 /* Substitute the new register for its invariant value in
8850 the compare expression. */
8851 XEXP (new, (INTVAL (v->mult_val) < 0) ? 0 : 1) = tem;
8852 if (validate_change (insn, &SET_SRC (PATTERN (insn)), new, 0))
8853 return 1;
8856 #endif
8857 break;
8859 case COMPARE:
8860 case EQ: case NE:
8861 case GT: case GE: case GTU: case GEU:
8862 case LT: case LE: case LTU: case LEU:
8863 /* See if either argument is the biv. */
8864 if (XEXP (x, 0) == reg)
8865 arg = XEXP (x, 1), arg_operand = 1;
8866 else if (XEXP (x, 1) == reg)
8867 arg = XEXP (x, 0), arg_operand = 0;
8868 else
8869 break;
8871 if (CONSTANT_P (arg))
8873 /* First try to replace with any giv that has constant positive
8874 mult_val and constant add_val. We might be able to support
8875 negative mult_val, but it seems complex to do it in general. */
8877 for (v = bl->giv; v; v = v->next_iv)
8878 if (GET_CODE (v->mult_val) == CONST_INT
8879 && INTVAL (v->mult_val) > 0
8880 && (GET_CODE (v->add_val) == SYMBOL_REF
8881 || GET_CODE (v->add_val) == LABEL_REF
8882 || GET_CODE (v->add_val) == CONST
8883 || (GET_CODE (v->add_val) == REG
8884 && REG_POINTER (v->add_val)))
8885 && ! v->ignore && ! v->maybe_dead && v->always_computable
8886 && v->mode == mode)
8888 if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
8889 continue;
8891 /* Don't eliminate if the linear combination that makes up
8892 the giv overflows when it is applied to ARG. */
8893 if (GET_CODE (arg) == CONST_INT)
8895 rtx add_val;
8897 if (GET_CODE (v->add_val) == CONST_INT)
8898 add_val = v->add_val;
8899 else
8900 add_val = const0_rtx;
8902 if (const_mult_add_overflow_p (arg, v->mult_val,
8903 add_val, mode, 1))
8904 continue;
8907 if (! eliminate_p)
8908 return 1;
8910 /* Replace biv with the giv's reduced reg. */
8911 validate_change (insn, &XEXP (x, 1 - arg_operand), v->new_reg, 1);
8913 /* If all constants are actually constant integers and
8914 the derived constant can be directly placed in the COMPARE,
8915 do so. */
8916 if (GET_CODE (arg) == CONST_INT
8917 && GET_CODE (v->add_val) == CONST_INT)
8919 tem = expand_mult_add (arg, NULL_RTX, v->mult_val,
8920 v->add_val, mode, 1);
8922 else
8924 /* Otherwise, load it into a register. */
8925 tem = gen_reg_rtx (mode);
8926 loop_iv_add_mult_emit_before (loop, arg,
8927 v->mult_val, v->add_val,
8928 tem, where_bb, where_insn);
8931 validate_change (insn, &XEXP (x, arg_operand), tem, 1);
8933 if (apply_change_group ())
8934 return 1;
8937 /* Look for giv with positive constant mult_val and nonconst add_val.
8938 Insert insns to calculate new compare value.
8939 ??? Turn this off due to possible overflow. */
8941 for (v = bl->giv; v; v = v->next_iv)
8942 if (GET_CODE (v->mult_val) == CONST_INT
8943 && INTVAL (v->mult_val) > 0
8944 && ! v->ignore && ! v->maybe_dead && v->always_computable
8945 && v->mode == mode
8946 && 0)
8948 rtx tem;
8950 if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
8951 continue;
8953 if (! eliminate_p)
8954 return 1;
8956 tem = gen_reg_rtx (mode);
8958 /* Replace biv with giv's reduced register. */
8959 validate_change (insn, &XEXP (x, 1 - arg_operand),
8960 v->new_reg, 1);
8962 /* Compute value to compare against. */
8963 loop_iv_add_mult_emit_before (loop, arg,
8964 v->mult_val, v->add_val,
8965 tem, where_bb, where_insn);
8966 /* Use it in this insn. */
8967 validate_change (insn, &XEXP (x, arg_operand), tem, 1);
8968 if (apply_change_group ())
8969 return 1;
8972 else if (GET_CODE (arg) == REG || GET_CODE (arg) == MEM)
8974 if (loop_invariant_p (loop, arg) == 1)
8976 /* Look for giv with constant positive mult_val and nonconst
8977 add_val. Insert insns to compute new compare value.
8978 ??? Turn this off due to possible overflow. */
8980 for (v = bl->giv; v; v = v->next_iv)
8981 if (GET_CODE (v->mult_val) == CONST_INT && INTVAL (v->mult_val) > 0
8982 && ! v->ignore && ! v->maybe_dead && v->always_computable
8983 && v->mode == mode
8984 && 0)
8986 rtx tem;
8988 if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
8989 continue;
8991 if (! eliminate_p)
8992 return 1;
8994 tem = gen_reg_rtx (mode);
8996 /* Replace biv with giv's reduced register. */
8997 validate_change (insn, &XEXP (x, 1 - arg_operand),
8998 v->new_reg, 1);
9000 /* Compute value to compare against. */
9001 loop_iv_add_mult_emit_before (loop, arg,
9002 v->mult_val, v->add_val,
9003 tem, where_bb, where_insn);
9004 validate_change (insn, &XEXP (x, arg_operand), tem, 1);
9005 if (apply_change_group ())
9006 return 1;
9010 /* This code has problems. Basically, you can't know when
9011 seeing if we will eliminate BL, whether a particular giv
9012 of ARG will be reduced. If it isn't going to be reduced,
9013 we can't eliminate BL. We can try forcing it to be reduced,
9014 but that can generate poor code.
9016 The problem is that the benefit of reducing TV, below should
9017 be increased if BL can actually be eliminated, but this means
9018 we might have to do a topological sort of the order in which
9019 we try to process biv. It doesn't seem worthwhile to do
9020 this sort of thing now. */
9022 #if 0
9023 /* Otherwise the reg compared with had better be a biv. */
9024 if (GET_CODE (arg) != REG
9025 || REG_IV_TYPE (ivs, REGNO (arg)) != BASIC_INDUCT)
9026 return 0;
9028 /* Look for a pair of givs, one for each biv,
9029 with identical coefficients. */
9030 for (v = bl->giv; v; v = v->next_iv)
9032 struct induction *tv;
9034 if (v->ignore || v->maybe_dead || v->mode != mode)
9035 continue;
9037 for (tv = REG_IV_CLASS (ivs, REGNO (arg))->giv; tv;
9038 tv = tv->next_iv)
9039 if (! tv->ignore && ! tv->maybe_dead
9040 && rtx_equal_p (tv->mult_val, v->mult_val)
9041 && rtx_equal_p (tv->add_val, v->add_val)
9042 && tv->mode == mode)
9044 if (! biv_elimination_giv_has_0_offset (bl->biv, v, insn))
9045 continue;
9047 if (! eliminate_p)
9048 return 1;
9050 /* Replace biv with its giv's reduced reg. */
9051 XEXP (x, 1 - arg_operand) = v->new_reg;
9052 /* Replace other operand with the other giv's
9053 reduced reg. */
9054 XEXP (x, arg_operand) = tv->new_reg;
9055 return 1;
9058 #endif
9061 /* If we get here, the biv can't be eliminated. */
9062 return 0;
9064 case MEM:
9065 /* If this address is a DEST_ADDR giv, it doesn't matter if the
9066 biv is used in it, since it will be replaced. */
9067 for (v = bl->giv; v; v = v->next_iv)
9068 if (v->giv_type == DEST_ADDR && v->location == &XEXP (x, 0))
9069 return 1;
9070 break;
9072 default:
9073 break;
9076 /* See if any subexpression fails elimination. */
9077 fmt = GET_RTX_FORMAT (code);
9078 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
9080 switch (fmt[i])
9082 case 'e':
9083 if (! maybe_eliminate_biv_1 (loop, XEXP (x, i), insn, bl,
9084 eliminate_p, where_bb, where_insn))
9085 return 0;
9086 break;
9088 case 'E':
9089 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
9090 if (! maybe_eliminate_biv_1 (loop, XVECEXP (x, i, j), insn, bl,
9091 eliminate_p, where_bb, where_insn))
9092 return 0;
9093 break;
9097 return 1;
9100 /* Return nonzero if the last use of REG
9101 is in an insn following INSN in the same basic block. */
9103 static int
9104 last_use_this_basic_block (reg, insn)
9105 rtx reg;
9106 rtx insn;
9108 rtx n;
9109 for (n = insn;
9110 n && GET_CODE (n) != CODE_LABEL && GET_CODE (n) != JUMP_INSN;
9111 n = NEXT_INSN (n))
9113 if (REGNO_LAST_UID (REGNO (reg)) == INSN_UID (n))
9114 return 1;
9116 return 0;
9119 /* Called via `note_stores' to record the initial value of a biv. Here we
9120 just record the location of the set and process it later. */
9122 static void
9123 record_initial (dest, set, data)
9124 rtx dest;
9125 rtx set;
9126 void *data ATTRIBUTE_UNUSED;
9128 struct loop_ivs *ivs = (struct loop_ivs *) data;
9129 struct iv_class *bl;
9131 if (GET_CODE (dest) != REG
9132 || REGNO (dest) >= ivs->n_regs
9133 || REG_IV_TYPE (ivs, REGNO (dest)) != BASIC_INDUCT)
9134 return;
9136 bl = REG_IV_CLASS (ivs, REGNO (dest));
9138 /* If this is the first set found, record it. */
9139 if (bl->init_insn == 0)
9141 bl->init_insn = note_insn;
9142 bl->init_set = set;
9146 /* If any of the registers in X are "old" and currently have a last use earlier
9147 than INSN, update them to have a last use of INSN. Their actual last use
9148 will be the previous insn but it will not have a valid uid_luid so we can't
9149 use it. X must be a source expression only. */
9151 static void
9152 update_reg_last_use (x, insn)
9153 rtx x;
9154 rtx insn;
9156 /* Check for the case where INSN does not have a valid luid. In this case,
9157 there is no need to modify the regno_last_uid, as this can only happen
9158 when code is inserted after the loop_end to set a pseudo's final value,
9159 and hence this insn will never be the last use of x.
9160 ???? This comment is not correct. See for example loop_givs_reduce.
9161 This may insert an insn before another new insn. */
9162 if (GET_CODE (x) == REG && REGNO (x) < max_reg_before_loop
9163 && INSN_UID (insn) < max_uid_for_loop
9164 && REGNO_LAST_LUID (REGNO (x)) < INSN_LUID (insn))
9166 REGNO_LAST_UID (REGNO (x)) = INSN_UID (insn);
9168 else
9170 int i, j;
9171 const char *fmt = GET_RTX_FORMAT (GET_CODE (x));
9172 for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
9174 if (fmt[i] == 'e')
9175 update_reg_last_use (XEXP (x, i), insn);
9176 else if (fmt[i] == 'E')
9177 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
9178 update_reg_last_use (XVECEXP (x, i, j), insn);
9183 /* Given an insn INSN and condition COND, return the condition in a
9184 canonical form to simplify testing by callers. Specifically:
9186 (1) The code will always be a comparison operation (EQ, NE, GT, etc.).
9187 (2) Both operands will be machine operands; (cc0) will have been replaced.
9188 (3) If an operand is a constant, it will be the second operand.
9189 (4) (LE x const) will be replaced with (LT x <const+1>) and similarly
9190 for GE, GEU, and LEU.
9192 If the condition cannot be understood, or is an inequality floating-point
9193 comparison which needs to be reversed, 0 will be returned.
9195 If REVERSE is nonzero, then reverse the condition prior to canonizing it.
9197 If EARLIEST is nonzero, it is a pointer to a place where the earliest
9198 insn used in locating the condition was found. If a replacement test
9199 of the condition is desired, it should be placed in front of that
9200 insn and we will be sure that the inputs are still valid.
9202 If WANT_REG is nonzero, we wish the condition to be relative to that
9203 register, if possible. Therefore, do not canonicalize the condition
9204 further. */
9207 canonicalize_condition (insn, cond, reverse, earliest, want_reg)
9208 rtx insn;
9209 rtx cond;
9210 int reverse;
9211 rtx *earliest;
9212 rtx want_reg;
9214 enum rtx_code code;
9215 rtx prev = insn;
9216 rtx set;
9217 rtx tem;
9218 rtx op0, op1;
9219 int reverse_code = 0;
9220 enum machine_mode mode;
9222 code = GET_CODE (cond);
9223 mode = GET_MODE (cond);
9224 op0 = XEXP (cond, 0);
9225 op1 = XEXP (cond, 1);
9227 if (reverse)
9228 code = reversed_comparison_code (cond, insn);
9229 if (code == UNKNOWN)
9230 return 0;
9232 if (earliest)
9233 *earliest = insn;
9235 /* If we are comparing a register with zero, see if the register is set
9236 in the previous insn to a COMPARE or a comparison operation. Perform
9237 the same tests as a function of STORE_FLAG_VALUE as find_comparison_args
9238 in cse.c */
9240 while (GET_RTX_CLASS (code) == '<'
9241 && op1 == CONST0_RTX (GET_MODE (op0))
9242 && op0 != want_reg)
9244 /* Set nonzero when we find something of interest. */
9245 rtx x = 0;
9247 #ifdef HAVE_cc0
9248 /* If comparison with cc0, import actual comparison from compare
9249 insn. */
9250 if (op0 == cc0_rtx)
9252 if ((prev = prev_nonnote_insn (prev)) == 0
9253 || GET_CODE (prev) != INSN
9254 || (set = single_set (prev)) == 0
9255 || SET_DEST (set) != cc0_rtx)
9256 return 0;
9258 op0 = SET_SRC (set);
9259 op1 = CONST0_RTX (GET_MODE (op0));
9260 if (earliest)
9261 *earliest = prev;
9263 #endif
9265 /* If this is a COMPARE, pick up the two things being compared. */
9266 if (GET_CODE (op0) == COMPARE)
9268 op1 = XEXP (op0, 1);
9269 op0 = XEXP (op0, 0);
9270 continue;
9272 else if (GET_CODE (op0) != REG)
9273 break;
9275 /* Go back to the previous insn. Stop if it is not an INSN. We also
9276 stop if it isn't a single set or if it has a REG_INC note because
9277 we don't want to bother dealing with it. */
9279 if ((prev = prev_nonnote_insn (prev)) == 0
9280 || GET_CODE (prev) != INSN
9281 || FIND_REG_INC_NOTE (prev, NULL_RTX))
9282 break;
9284 set = set_of (op0, prev);
9286 if (set
9287 && (GET_CODE (set) != SET
9288 || !rtx_equal_p (SET_DEST (set), op0)))
9289 break;
9291 /* If this is setting OP0, get what it sets it to if it looks
9292 relevant. */
9293 if (set)
9295 enum machine_mode inner_mode = GET_MODE (SET_DEST (set));
9296 #ifdef FLOAT_STORE_FLAG_VALUE
9297 REAL_VALUE_TYPE fsfv;
9298 #endif
9300 /* ??? We may not combine comparisons done in a CCmode with
9301 comparisons not done in a CCmode. This is to aid targets
9302 like Alpha that have an IEEE compliant EQ instruction, and
9303 a non-IEEE compliant BEQ instruction. The use of CCmode is
9304 actually artificial, simply to prevent the combination, but
9305 should not affect other platforms.
9307 However, we must allow VOIDmode comparisons to match either
9308 CCmode or non-CCmode comparison, because some ports have
9309 modeless comparisons inside branch patterns.
9311 ??? This mode check should perhaps look more like the mode check
9312 in simplify_comparison in combine. */
9314 if ((GET_CODE (SET_SRC (set)) == COMPARE
9315 || (((code == NE
9316 || (code == LT
9317 && GET_MODE_CLASS (inner_mode) == MODE_INT
9318 && (GET_MODE_BITSIZE (inner_mode)
9319 <= HOST_BITS_PER_WIDE_INT)
9320 && (STORE_FLAG_VALUE
9321 & ((HOST_WIDE_INT) 1
9322 << (GET_MODE_BITSIZE (inner_mode) - 1))))
9323 #ifdef FLOAT_STORE_FLAG_VALUE
9324 || (code == LT
9325 && GET_MODE_CLASS (inner_mode) == MODE_FLOAT
9326 && (fsfv = FLOAT_STORE_FLAG_VALUE (inner_mode),
9327 REAL_VALUE_NEGATIVE (fsfv)))
9328 #endif
9330 && GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<'))
9331 && (((GET_MODE_CLASS (mode) == MODE_CC)
9332 == (GET_MODE_CLASS (inner_mode) == MODE_CC))
9333 || mode == VOIDmode || inner_mode == VOIDmode))
9334 x = SET_SRC (set);
9335 else if (((code == EQ
9336 || (code == GE
9337 && (GET_MODE_BITSIZE (inner_mode)
9338 <= HOST_BITS_PER_WIDE_INT)
9339 && GET_MODE_CLASS (inner_mode) == MODE_INT
9340 && (STORE_FLAG_VALUE
9341 & ((HOST_WIDE_INT) 1
9342 << (GET_MODE_BITSIZE (inner_mode) - 1))))
9343 #ifdef FLOAT_STORE_FLAG_VALUE
9344 || (code == GE
9345 && GET_MODE_CLASS (inner_mode) == MODE_FLOAT
9346 && (fsfv = FLOAT_STORE_FLAG_VALUE (inner_mode),
9347 REAL_VALUE_NEGATIVE (fsfv)))
9348 #endif
9350 && GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<'
9351 && (((GET_MODE_CLASS (mode) == MODE_CC)
9352 == (GET_MODE_CLASS (inner_mode) == MODE_CC))
9353 || mode == VOIDmode || inner_mode == VOIDmode))
9356 reverse_code = 1;
9357 x = SET_SRC (set);
9359 else
9360 break;
9363 else if (reg_set_p (op0, prev))
9364 /* If this sets OP0, but not directly, we have to give up. */
9365 break;
9367 if (x)
9369 if (GET_RTX_CLASS (GET_CODE (x)) == '<')
9370 code = GET_CODE (x);
9371 if (reverse_code)
9373 code = reversed_comparison_code (x, prev);
9374 if (code == UNKNOWN)
9375 return 0;
9376 reverse_code = 0;
9379 op0 = XEXP (x, 0), op1 = XEXP (x, 1);
9380 if (earliest)
9381 *earliest = prev;
9385 /* If constant is first, put it last. */
9386 if (CONSTANT_P (op0))
9387 code = swap_condition (code), tem = op0, op0 = op1, op1 = tem;
9389 /* If OP0 is the result of a comparison, we weren't able to find what
9390 was really being compared, so fail. */
9391 if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
9392 return 0;
9394 /* Canonicalize any ordered comparison with integers involving equality
9395 if we can do computations in the relevant mode and we do not
9396 overflow. */
9398 if (GET_CODE (op1) == CONST_INT
9399 && GET_MODE (op0) != VOIDmode
9400 && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT)
9402 HOST_WIDE_INT const_val = INTVAL (op1);
9403 unsigned HOST_WIDE_INT uconst_val = const_val;
9404 unsigned HOST_WIDE_INT max_val
9405 = (unsigned HOST_WIDE_INT) GET_MODE_MASK (GET_MODE (op0));
9407 switch (code)
9409 case LE:
9410 if ((unsigned HOST_WIDE_INT) const_val != max_val >> 1)
9411 code = LT, op1 = gen_int_mode (const_val + 1, GET_MODE (op0));
9412 break;
9414 /* When cross-compiling, const_val might be sign-extended from
9415 BITS_PER_WORD to HOST_BITS_PER_WIDE_INT */
9416 case GE:
9417 if ((HOST_WIDE_INT) (const_val & max_val)
9418 != (((HOST_WIDE_INT) 1
9419 << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
9420 code = GT, op1 = gen_int_mode (const_val - 1, GET_MODE (op0));
9421 break;
9423 case LEU:
9424 if (uconst_val < max_val)
9425 code = LTU, op1 = gen_int_mode (uconst_val + 1, GET_MODE (op0));
9426 break;
9428 case GEU:
9429 if (uconst_val != 0)
9430 code = GTU, op1 = gen_int_mode (uconst_val - 1, GET_MODE (op0));
9431 break;
9433 default:
9434 break;
9438 #ifdef HAVE_cc0
9439 /* Never return CC0; return zero instead. */
9440 if (op0 == cc0_rtx)
9441 return 0;
9442 #endif
9444 return gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
9447 /* Given a jump insn JUMP, return the condition that will cause it to branch
9448 to its JUMP_LABEL. If the condition cannot be understood, or is an
9449 inequality floating-point comparison which needs to be reversed, 0 will
9450 be returned.
9452 If EARLIEST is nonzero, it is a pointer to a place where the earliest
9453 insn used in locating the condition was found. If a replacement test
9454 of the condition is desired, it should be placed in front of that
9455 insn and we will be sure that the inputs are still valid. */
9458 get_condition (jump, earliest)
9459 rtx jump;
9460 rtx *earliest;
9462 rtx cond;
9463 int reverse;
9464 rtx set;
9466 /* If this is not a standard conditional jump, we can't parse it. */
9467 if (GET_CODE (jump) != JUMP_INSN
9468 || ! any_condjump_p (jump))
9469 return 0;
9470 set = pc_set (jump);
9472 cond = XEXP (SET_SRC (set), 0);
9474 /* If this branches to JUMP_LABEL when the condition is false, reverse
9475 the condition. */
9476 reverse
9477 = GET_CODE (XEXP (SET_SRC (set), 2)) == LABEL_REF
9478 && XEXP (XEXP (SET_SRC (set), 2), 0) == JUMP_LABEL (jump);
9480 return canonicalize_condition (jump, cond, reverse, earliest, NULL_RTX);
9483 /* Similar to above routine, except that we also put an invariant last
9484 unless both operands are invariants. */
9487 get_condition_for_loop (loop, x)
9488 const struct loop *loop;
9489 rtx x;
9491 rtx comparison = get_condition (x, (rtx*) 0);
9493 if (comparison == 0
9494 || ! loop_invariant_p (loop, XEXP (comparison, 0))
9495 || loop_invariant_p (loop, XEXP (comparison, 1)))
9496 return comparison;
9498 return gen_rtx_fmt_ee (swap_condition (GET_CODE (comparison)), VOIDmode,
9499 XEXP (comparison, 1), XEXP (comparison, 0));
9502 /* Scan the function and determine whether it has indirect (computed) jumps.
9504 This is taken mostly from flow.c; similar code exists elsewhere
9505 in the compiler. It may be useful to put this into rtlanal.c. */
9506 static int
9507 indirect_jump_in_function_p (start)
9508 rtx start;
9510 rtx insn;
9512 for (insn = start; insn; insn = NEXT_INSN (insn))
9513 if (computed_jump_p (insn))
9514 return 1;
9516 return 0;
9519 /* Add MEM to the LOOP_MEMS array, if appropriate. See the
9520 documentation for LOOP_MEMS for the definition of `appropriate'.
9521 This function is called from prescan_loop via for_each_rtx. */
9523 static int
9524 insert_loop_mem (mem, data)
9525 rtx *mem;
9526 void *data ATTRIBUTE_UNUSED;
9528 struct loop_info *loop_info = data;
9529 int i;
9530 rtx m = *mem;
9532 if (m == NULL_RTX)
9533 return 0;
9535 switch (GET_CODE (m))
9537 case MEM:
9538 break;
9540 case CLOBBER:
9541 /* We're not interested in MEMs that are only clobbered. */
9542 return -1;
9544 case CONST_DOUBLE:
9545 /* We're not interested in the MEM associated with a
9546 CONST_DOUBLE, so there's no need to traverse into this. */
9547 return -1;
9549 case EXPR_LIST:
9550 /* We're not interested in any MEMs that only appear in notes. */
9551 return -1;
9553 default:
9554 /* This is not a MEM. */
9555 return 0;
9558 /* See if we've already seen this MEM. */
9559 for (i = 0; i < loop_info->mems_idx; ++i)
9560 if (rtx_equal_p (m, loop_info->mems[i].mem))
9562 if (GET_MODE (m) != GET_MODE (loop_info->mems[i].mem))
9563 /* The modes of the two memory accesses are different. If
9564 this happens, something tricky is going on, and we just
9565 don't optimize accesses to this MEM. */
9566 loop_info->mems[i].optimize = 0;
9568 return 0;
9571 /* Resize the array, if necessary. */
9572 if (loop_info->mems_idx == loop_info->mems_allocated)
9574 if (loop_info->mems_allocated != 0)
9575 loop_info->mems_allocated *= 2;
9576 else
9577 loop_info->mems_allocated = 32;
9579 loop_info->mems = (loop_mem_info *)
9580 xrealloc (loop_info->mems,
9581 loop_info->mems_allocated * sizeof (loop_mem_info));
9584 /* Actually insert the MEM. */
9585 loop_info->mems[loop_info->mems_idx].mem = m;
9586 /* We can't hoist this MEM out of the loop if it's a BLKmode MEM
9587 because we can't put it in a register. We still store it in the
9588 table, though, so that if we see the same address later, but in a
9589 non-BLK mode, we'll not think we can optimize it at that point. */
9590 loop_info->mems[loop_info->mems_idx].optimize = (GET_MODE (m) != BLKmode);
9591 loop_info->mems[loop_info->mems_idx].reg = NULL_RTX;
9592 ++loop_info->mems_idx;
9594 return 0;
9598 /* Allocate REGS->ARRAY or reallocate it if it is too small.
9600 Increment REGS->ARRAY[I].SET_IN_LOOP at the index I of each
9601 register that is modified by an insn between FROM and TO. If the
9602 value of an element of REGS->array[I].SET_IN_LOOP becomes 127 or
9603 more, stop incrementing it, to avoid overflow.
9605 Store in REGS->ARRAY[I].SINGLE_USAGE the single insn in which
9606 register I is used, if it is only used once. Otherwise, it is set
9607 to 0 (for no uses) or const0_rtx for more than one use. This
9608 parameter may be zero, in which case this processing is not done.
9610 Set REGS->ARRAY[I].MAY_NOT_OPTIMIZE nonzero if we should not
9611 optimize register I. */
9613 static void
9614 loop_regs_scan (loop, extra_size)
9615 const struct loop *loop;
9616 int extra_size;
9618 struct loop_regs *regs = LOOP_REGS (loop);
9619 int old_nregs;
9620 /* last_set[n] is nonzero iff reg n has been set in the current
9621 basic block. In that case, it is the insn that last set reg n. */
9622 rtx *last_set;
9623 rtx insn;
9624 int i;
9626 old_nregs = regs->num;
9627 regs->num = max_reg_num ();
9629 /* Grow the regs array if not allocated or too small. */
9630 if (regs->num >= regs->size)
9632 regs->size = regs->num + extra_size;
9634 regs->array = (struct loop_reg *)
9635 xrealloc (regs->array, regs->size * sizeof (*regs->array));
9637 /* Zero the new elements. */
9638 memset (regs->array + old_nregs, 0,
9639 (regs->size - old_nregs) * sizeof (*regs->array));
9642 /* Clear previously scanned fields but do not clear n_times_set. */
9643 for (i = 0; i < old_nregs; i++)
9645 regs->array[i].set_in_loop = 0;
9646 regs->array[i].may_not_optimize = 0;
9647 regs->array[i].single_usage = NULL_RTX;
9650 last_set = (rtx *) xcalloc (regs->num, sizeof (rtx));
9652 /* Scan the loop, recording register usage. */
9653 for (insn = loop->top ? loop->top : loop->start; insn != loop->end;
9654 insn = NEXT_INSN (insn))
9656 if (INSN_P (insn))
9658 /* Record registers that have exactly one use. */
9659 find_single_use_in_loop (regs, insn, PATTERN (insn));
9661 /* Include uses in REG_EQUAL notes. */
9662 if (REG_NOTES (insn))
9663 find_single_use_in_loop (regs, insn, REG_NOTES (insn));
9665 if (GET_CODE (PATTERN (insn)) == SET
9666 || GET_CODE (PATTERN (insn)) == CLOBBER)
9667 count_one_set (regs, insn, PATTERN (insn), last_set);
9668 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
9670 int i;
9671 for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
9672 count_one_set (regs, insn, XVECEXP (PATTERN (insn), 0, i),
9673 last_set);
9677 if (GET_CODE (insn) == CODE_LABEL || GET_CODE (insn) == JUMP_INSN)
9678 memset (last_set, 0, regs->num * sizeof (rtx));
9680 /* Invalidate all registers used for function argument passing.
9681 We check rtx_varies_p for the same reason as below, to allow
9682 optimizing PIC calculations. */
9683 if (GET_CODE (insn) == CALL_INSN)
9685 rtx link;
9686 for (link = CALL_INSN_FUNCTION_USAGE (insn);
9687 link;
9688 link = XEXP (link, 1))
9690 rtx op, reg;
9692 if (GET_CODE (op = XEXP (link, 0)) == USE
9693 && GET_CODE (reg = XEXP (op, 0)) == REG
9694 && rtx_varies_p (reg, 1))
9695 regs->array[REGNO (reg)].may_not_optimize = 1;
9700 /* Invalidate all hard registers clobbered by calls. With one exception:
9701 a call-clobbered PIC register is still function-invariant for our
9702 purposes, since we can hoist any PIC calculations out of the loop.
9703 Thus the call to rtx_varies_p. */
9704 if (LOOP_INFO (loop)->has_call)
9705 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
9706 if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i)
9707 && rtx_varies_p (regno_reg_rtx[i], 1))
9709 regs->array[i].may_not_optimize = 1;
9710 regs->array[i].set_in_loop = 1;
9713 #ifdef AVOID_CCMODE_COPIES
9714 /* Don't try to move insns which set CC registers if we should not
9715 create CCmode register copies. */
9716 for (i = regs->num - 1; i >= FIRST_PSEUDO_REGISTER; i--)
9717 if (GET_MODE_CLASS (GET_MODE (regno_reg_rtx[i])) == MODE_CC)
9718 regs->array[i].may_not_optimize = 1;
9719 #endif
9721 /* Set regs->array[I].n_times_set for the new registers. */
9722 for (i = old_nregs; i < regs->num; i++)
9723 regs->array[i].n_times_set = regs->array[i].set_in_loop;
9725 free (last_set);
9728 /* Returns the number of real INSNs in the LOOP. */
9730 static int
9731 count_insns_in_loop (loop)
9732 const struct loop *loop;
9734 int count = 0;
9735 rtx insn;
9737 for (insn = loop->top ? loop->top : loop->start; insn != loop->end;
9738 insn = NEXT_INSN (insn))
9739 if (INSN_P (insn))
9740 ++count;
9742 return count;
9745 /* Move MEMs into registers for the duration of the loop. */
9747 static void
9748 load_mems (loop)
9749 const struct loop *loop;
9751 struct loop_info *loop_info = LOOP_INFO (loop);
9752 struct loop_regs *regs = LOOP_REGS (loop);
9753 int maybe_never = 0;
9754 int i;
9755 rtx p, prev_ebb_head;
9756 rtx label = NULL_RTX;
9757 rtx end_label;
9758 /* Nonzero if the next instruction may never be executed. */
9759 int next_maybe_never = 0;
9760 unsigned int last_max_reg = max_reg_num ();
9762 if (loop_info->mems_idx == 0)
9763 return;
9765 /* We cannot use next_label here because it skips over normal insns. */
9766 end_label = next_nonnote_insn (loop->end);
9767 if (end_label && GET_CODE (end_label) != CODE_LABEL)
9768 end_label = NULL_RTX;
9770 /* Check to see if it's possible that some instructions in the loop are
9771 never executed. Also check if there is a goto out of the loop other
9772 than right after the end of the loop. */
9773 for (p = next_insn_in_loop (loop, loop->scan_start);
9774 p != NULL_RTX;
9775 p = next_insn_in_loop (loop, p))
9777 if (GET_CODE (p) == CODE_LABEL)
9778 maybe_never = 1;
9779 else if (GET_CODE (p) == JUMP_INSN
9780 /* If we enter the loop in the middle, and scan
9781 around to the beginning, don't set maybe_never
9782 for that. This must be an unconditional jump,
9783 otherwise the code at the top of the loop might
9784 never be executed. Unconditional jumps are
9785 followed a by barrier then loop end. */
9786 && ! (GET_CODE (p) == JUMP_INSN
9787 && JUMP_LABEL (p) == loop->top
9788 && NEXT_INSN (NEXT_INSN (p)) == loop->end
9789 && any_uncondjump_p (p)))
9791 /* If this is a jump outside of the loop but not right
9792 after the end of the loop, we would have to emit new fixup
9793 sequences for each such label. */
9794 if (/* If we can't tell where control might go when this
9795 JUMP_INSN is executed, we must be conservative. */
9796 !JUMP_LABEL (p)
9797 || (JUMP_LABEL (p) != end_label
9798 && (INSN_UID (JUMP_LABEL (p)) >= max_uid_for_loop
9799 || INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (loop->start)
9800 || INSN_LUID (JUMP_LABEL (p)) > INSN_LUID (loop->end))))
9801 return;
9803 if (!any_condjump_p (p))
9804 /* Something complicated. */
9805 maybe_never = 1;
9806 else
9807 /* If there are any more instructions in the loop, they
9808 might not be reached. */
9809 next_maybe_never = 1;
9811 else if (next_maybe_never)
9812 maybe_never = 1;
9815 /* Find start of the extended basic block that enters the loop. */
9816 for (p = loop->start;
9817 PREV_INSN (p) && GET_CODE (p) != CODE_LABEL;
9818 p = PREV_INSN (p))
9820 prev_ebb_head = p;
9822 cselib_init ();
9824 /* Build table of mems that get set to constant values before the
9825 loop. */
9826 for (; p != loop->start; p = NEXT_INSN (p))
9827 cselib_process_insn (p);
9829 /* Actually move the MEMs. */
9830 for (i = 0; i < loop_info->mems_idx; ++i)
9832 regset_head load_copies;
9833 regset_head store_copies;
9834 int written = 0;
9835 rtx reg;
9836 rtx mem = loop_info->mems[i].mem;
9837 rtx mem_list_entry;
9839 if (MEM_VOLATILE_P (mem)
9840 || loop_invariant_p (loop, XEXP (mem, 0)) != 1)
9841 /* There's no telling whether or not MEM is modified. */
9842 loop_info->mems[i].optimize = 0;
9844 /* Go through the MEMs written to in the loop to see if this
9845 one is aliased by one of them. */
9846 mem_list_entry = loop_info->store_mems;
9847 while (mem_list_entry)
9849 if (rtx_equal_p (mem, XEXP (mem_list_entry, 0)))
9850 written = 1;
9851 else if (true_dependence (XEXP (mem_list_entry, 0), VOIDmode,
9852 mem, rtx_varies_p))
9854 /* MEM is indeed aliased by this store. */
9855 loop_info->mems[i].optimize = 0;
9856 break;
9858 mem_list_entry = XEXP (mem_list_entry, 1);
9861 if (flag_float_store && written
9862 && GET_MODE_CLASS (GET_MODE (mem)) == MODE_FLOAT)
9863 loop_info->mems[i].optimize = 0;
9865 /* If this MEM is written to, we must be sure that there
9866 are no reads from another MEM that aliases this one. */
9867 if (loop_info->mems[i].optimize && written)
9869 int j;
9871 for (j = 0; j < loop_info->mems_idx; ++j)
9873 if (j == i)
9874 continue;
9875 else if (true_dependence (mem,
9876 VOIDmode,
9877 loop_info->mems[j].mem,
9878 rtx_varies_p))
9880 /* It's not safe to hoist loop_info->mems[i] out of
9881 the loop because writes to it might not be
9882 seen by reads from loop_info->mems[j]. */
9883 loop_info->mems[i].optimize = 0;
9884 break;
9889 if (maybe_never && may_trap_p (mem))
9890 /* We can't access the MEM outside the loop; it might
9891 cause a trap that wouldn't have happened otherwise. */
9892 loop_info->mems[i].optimize = 0;
9894 if (!loop_info->mems[i].optimize)
9895 /* We thought we were going to lift this MEM out of the
9896 loop, but later discovered that we could not. */
9897 continue;
9899 INIT_REG_SET (&load_copies);
9900 INIT_REG_SET (&store_copies);
9902 /* Allocate a pseudo for this MEM. We set REG_USERVAR_P in
9903 order to keep scan_loop from moving stores to this MEM
9904 out of the loop just because this REG is neither a
9905 user-variable nor used in the loop test. */
9906 reg = gen_reg_rtx (GET_MODE (mem));
9907 REG_USERVAR_P (reg) = 1;
9908 loop_info->mems[i].reg = reg;
9910 /* Now, replace all references to the MEM with the
9911 corresponding pseudos. */
9912 maybe_never = 0;
9913 for (p = next_insn_in_loop (loop, loop->scan_start);
9914 p != NULL_RTX;
9915 p = next_insn_in_loop (loop, p))
9917 if (INSN_P (p))
9919 rtx set;
9921 set = single_set (p);
9923 /* See if this copies the mem into a register that isn't
9924 modified afterwards. We'll try to do copy propagation
9925 a little further on. */
9926 if (set
9927 /* @@@ This test is _way_ too conservative. */
9928 && ! maybe_never
9929 && GET_CODE (SET_DEST (set)) == REG
9930 && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER
9931 && REGNO (SET_DEST (set)) < last_max_reg
9932 && regs->array[REGNO (SET_DEST (set))].n_times_set == 1
9933 && rtx_equal_p (SET_SRC (set), mem))
9934 SET_REGNO_REG_SET (&load_copies, REGNO (SET_DEST (set)));
9936 /* See if this copies the mem from a register that isn't
9937 modified afterwards. We'll try to remove the
9938 redundant copy later on by doing a little register
9939 renaming and copy propagation. This will help
9940 to untangle things for the BIV detection code. */
9941 if (set
9942 && ! maybe_never
9943 && GET_CODE (SET_SRC (set)) == REG
9944 && REGNO (SET_SRC (set)) >= FIRST_PSEUDO_REGISTER
9945 && REGNO (SET_SRC (set)) < last_max_reg
9946 && regs->array[REGNO (SET_SRC (set))].n_times_set == 1
9947 && rtx_equal_p (SET_DEST (set), mem))
9948 SET_REGNO_REG_SET (&store_copies, REGNO (SET_SRC (set)));
9950 /* If this is a call which uses / clobbers this memory
9951 location, we must not change the interface here. */
9952 if (GET_CODE (p) == CALL_INSN
9953 && reg_mentioned_p (loop_info->mems[i].mem,
9954 CALL_INSN_FUNCTION_USAGE (p)))
9956 cancel_changes (0);
9957 loop_info->mems[i].optimize = 0;
9958 break;
9960 else
9961 /* Replace the memory reference with the shadow register. */
9962 replace_loop_mems (p, loop_info->mems[i].mem,
9963 loop_info->mems[i].reg);
9966 if (GET_CODE (p) == CODE_LABEL
9967 || GET_CODE (p) == JUMP_INSN)
9968 maybe_never = 1;
9971 if (! loop_info->mems[i].optimize)
9972 ; /* We found we couldn't do the replacement, so do nothing. */
9973 else if (! apply_change_group ())
9974 /* We couldn't replace all occurrences of the MEM. */
9975 loop_info->mems[i].optimize = 0;
9976 else
9978 /* Load the memory immediately before LOOP->START, which is
9979 the NOTE_LOOP_BEG. */
9980 cselib_val *e = cselib_lookup (mem, VOIDmode, 0);
9981 rtx set;
9982 rtx best = mem;
9983 int j;
9984 struct elt_loc_list *const_equiv = 0;
9986 if (e)
9988 struct elt_loc_list *equiv;
9989 struct elt_loc_list *best_equiv = 0;
9990 for (equiv = e->locs; equiv; equiv = equiv->next)
9992 if (CONSTANT_P (equiv->loc))
9993 const_equiv = equiv;
9994 else if (GET_CODE (equiv->loc) == REG
9995 /* Extending hard register lifetimes causes crash
9996 on SRC targets. Doing so on non-SRC is
9997 probably also not good idea, since we most
9998 probably have pseudoregister equivalence as
9999 well. */
10000 && REGNO (equiv->loc) >= FIRST_PSEUDO_REGISTER)
10001 best_equiv = equiv;
10003 /* Use the constant equivalence if that is cheap enough. */
10004 if (! best_equiv)
10005 best_equiv = const_equiv;
10006 else if (const_equiv
10007 && (rtx_cost (const_equiv->loc, SET)
10008 <= rtx_cost (best_equiv->loc, SET)))
10010 best_equiv = const_equiv;
10011 const_equiv = 0;
10014 /* If best_equiv is nonzero, we know that MEM is set to a
10015 constant or register before the loop. We will use this
10016 knowledge to initialize the shadow register with that
10017 constant or reg rather than by loading from MEM. */
10018 if (best_equiv)
10019 best = copy_rtx (best_equiv->loc);
10022 set = gen_move_insn (reg, best);
10023 set = loop_insn_hoist (loop, set);
10024 if (REG_P (best))
10026 for (p = prev_ebb_head; p != loop->start; p = NEXT_INSN (p))
10027 if (REGNO_LAST_UID (REGNO (best)) == INSN_UID (p))
10029 REGNO_LAST_UID (REGNO (best)) = INSN_UID (set);
10030 break;
10034 if (const_equiv)
10035 set_unique_reg_note (set, REG_EQUAL, copy_rtx (const_equiv->loc));
10037 if (written)
10039 if (label == NULL_RTX)
10041 label = gen_label_rtx ();
10042 emit_label_after (label, loop->end);
10045 /* Store the memory immediately after END, which is
10046 the NOTE_LOOP_END. */
10047 set = gen_move_insn (copy_rtx (mem), reg);
10048 loop_insn_emit_after (loop, 0, label, set);
10051 if (loop_dump_stream)
10053 fprintf (loop_dump_stream, "Hoisted regno %d %s from ",
10054 REGNO (reg), (written ? "r/w" : "r/o"));
10055 print_rtl (loop_dump_stream, mem);
10056 fputc ('\n', loop_dump_stream);
10059 /* Attempt a bit of copy propagation. This helps untangle the
10060 data flow, and enables {basic,general}_induction_var to find
10061 more bivs/givs. */
10062 EXECUTE_IF_SET_IN_REG_SET
10063 (&load_copies, FIRST_PSEUDO_REGISTER, j,
10065 try_copy_prop (loop, reg, j);
10067 CLEAR_REG_SET (&load_copies);
10069 EXECUTE_IF_SET_IN_REG_SET
10070 (&store_copies, FIRST_PSEUDO_REGISTER, j,
10072 try_swap_copy_prop (loop, reg, j);
10074 CLEAR_REG_SET (&store_copies);
10078 if (label != NULL_RTX && end_label != NULL_RTX)
10080 /* Now, we need to replace all references to the previous exit
10081 label with the new one. */
10082 rtx_pair rr;
10083 rr.r1 = end_label;
10084 rr.r2 = label;
10086 for (p = loop->start; p != loop->end; p = NEXT_INSN (p))
10088 for_each_rtx (&p, replace_label, &rr);
10090 /* If this is a JUMP_INSN, then we also need to fix the JUMP_LABEL
10091 field. This is not handled by for_each_rtx because it doesn't
10092 handle unprinted ('0') fields. We need to update JUMP_LABEL
10093 because the immediately following unroll pass will use it.
10094 replace_label would not work anyways, because that only handles
10095 LABEL_REFs. */
10096 if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p) == end_label)
10097 JUMP_LABEL (p) = label;
10101 cselib_finish ();
10104 /* For communication between note_reg_stored and its caller. */
10105 struct note_reg_stored_arg
10107 int set_seen;
10108 rtx reg;
10111 /* Called via note_stores, record in SET_SEEN whether X, which is written,
10112 is equal to ARG. */
10113 static void
10114 note_reg_stored (x, setter, arg)
10115 rtx x, setter ATTRIBUTE_UNUSED;
10116 void *arg;
10118 struct note_reg_stored_arg *t = (struct note_reg_stored_arg *) arg;
10119 if (t->reg == x)
10120 t->set_seen = 1;
10123 /* Try to replace every occurrence of pseudo REGNO with REPLACEMENT.
10124 There must be exactly one insn that sets this pseudo; it will be
10125 deleted if all replacements succeed and we can prove that the register
10126 is not used after the loop. */
10128 static void
10129 try_copy_prop (loop, replacement, regno)
10130 const struct loop *loop;
10131 rtx replacement;
10132 unsigned int regno;
10134 /* This is the reg that we are copying from. */
10135 rtx reg_rtx = regno_reg_rtx[regno];
10136 rtx init_insn = 0;
10137 rtx insn;
10138 /* These help keep track of whether we replaced all uses of the reg. */
10139 int replaced_last = 0;
10140 int store_is_first = 0;
10142 for (insn = next_insn_in_loop (loop, loop->scan_start);
10143 insn != NULL_RTX;
10144 insn = next_insn_in_loop (loop, insn))
10146 rtx set;
10148 /* Only substitute within one extended basic block from the initializing
10149 insn. */
10150 if (GET_CODE (insn) == CODE_LABEL && init_insn)
10151 break;
10153 if (! INSN_P (insn))
10154 continue;
10156 /* Is this the initializing insn? */
10157 set = single_set (insn);
10158 if (set
10159 && GET_CODE (SET_DEST (set)) == REG
10160 && REGNO (SET_DEST (set)) == regno)
10162 if (init_insn)
10163 abort ();
10165 init_insn = insn;
10166 if (REGNO_FIRST_UID (regno) == INSN_UID (insn))
10167 store_is_first = 1;
10170 /* Only substitute after seeing the initializing insn. */
10171 if (init_insn && insn != init_insn)
10173 struct note_reg_stored_arg arg;
10175 replace_loop_regs (insn, reg_rtx, replacement);
10176 if (REGNO_LAST_UID (regno) == INSN_UID (insn))
10177 replaced_last = 1;
10179 /* Stop replacing when REPLACEMENT is modified. */
10180 arg.reg = replacement;
10181 arg.set_seen = 0;
10182 note_stores (PATTERN (insn), note_reg_stored, &arg);
10183 if (arg.set_seen)
10185 rtx note = find_reg_note (insn, REG_EQUAL, NULL);
10187 /* It is possible that we've turned previously valid REG_EQUAL to
10188 invalid, as we change the REGNO to REPLACEMENT and unlike REGNO,
10189 REPLACEMENT is modified, we get different meaning. */
10190 if (note && reg_mentioned_p (replacement, XEXP (note, 0)))
10191 remove_note (insn, note);
10192 break;
10196 if (! init_insn)
10197 abort ();
10198 if (apply_change_group ())
10200 if (loop_dump_stream)
10201 fprintf (loop_dump_stream, " Replaced reg %d", regno);
10202 if (store_is_first && replaced_last)
10204 rtx first;
10205 rtx retval_note;
10207 /* Assume we're just deleting INIT_INSN. */
10208 first = init_insn;
10209 /* Look for REG_RETVAL note. If we're deleting the end of
10210 the libcall sequence, the whole sequence can go. */
10211 retval_note = find_reg_note (init_insn, REG_RETVAL, NULL_RTX);
10212 /* If we found a REG_RETVAL note, find the first instruction
10213 in the sequence. */
10214 if (retval_note)
10215 first = XEXP (retval_note, 0);
10217 /* Delete the instructions. */
10218 loop_delete_insns (first, init_insn);
10220 if (loop_dump_stream)
10221 fprintf (loop_dump_stream, ".\n");
10225 /* Replace all the instructions from FIRST up to and including LAST
10226 with NOTE_INSN_DELETED notes. */
10228 static void
10229 loop_delete_insns (first, last)
10230 rtx first;
10231 rtx last;
10233 while (1)
10235 if (loop_dump_stream)
10236 fprintf (loop_dump_stream, ", deleting init_insn (%d)",
10237 INSN_UID (first));
10238 delete_insn (first);
10240 /* If this was the LAST instructions we're supposed to delete,
10241 we're done. */
10242 if (first == last)
10243 break;
10245 first = NEXT_INSN (first);
10249 /* Try to replace occurrences of pseudo REGNO with REPLACEMENT within
10250 loop LOOP if the order of the sets of these registers can be
10251 swapped. There must be exactly one insn within the loop that sets
10252 this pseudo followed immediately by a move insn that sets
10253 REPLACEMENT with REGNO. */
10254 static void
10255 try_swap_copy_prop (loop, replacement, regno)
10256 const struct loop *loop;
10257 rtx replacement;
10258 unsigned int regno;
10260 rtx insn;
10261 rtx set = NULL_RTX;
10262 unsigned int new_regno;
10264 new_regno = REGNO (replacement);
10266 for (insn = next_insn_in_loop (loop, loop->scan_start);
10267 insn != NULL_RTX;
10268 insn = next_insn_in_loop (loop, insn))
10270 /* Search for the insn that copies REGNO to NEW_REGNO? */
10271 if (INSN_P (insn)
10272 && (set = single_set (insn))
10273 && GET_CODE (SET_DEST (set)) == REG
10274 && REGNO (SET_DEST (set)) == new_regno
10275 && GET_CODE (SET_SRC (set)) == REG
10276 && REGNO (SET_SRC (set)) == regno)
10277 break;
10280 if (insn != NULL_RTX)
10282 rtx prev_insn;
10283 rtx prev_set;
10285 /* Some DEF-USE info would come in handy here to make this
10286 function more general. For now, just check the previous insn
10287 which is the most likely candidate for setting REGNO. */
10289 prev_insn = PREV_INSN (insn);
10291 if (INSN_P (insn)
10292 && (prev_set = single_set (prev_insn))
10293 && GET_CODE (SET_DEST (prev_set)) == REG
10294 && REGNO (SET_DEST (prev_set)) == regno)
10296 /* We have:
10297 (set (reg regno) (expr))
10298 (set (reg new_regno) (reg regno))
10300 so try converting this to:
10301 (set (reg new_regno) (expr))
10302 (set (reg regno) (reg new_regno))
10304 The former construct is often generated when a global
10305 variable used for an induction variable is shadowed by a
10306 register (NEW_REGNO). The latter construct improves the
10307 chances of GIV replacement and BIV elimination. */
10309 validate_change (prev_insn, &SET_DEST (prev_set),
10310 replacement, 1);
10311 validate_change (insn, &SET_DEST (set),
10312 SET_SRC (set), 1);
10313 validate_change (insn, &SET_SRC (set),
10314 replacement, 1);
10316 if (apply_change_group ())
10318 if (loop_dump_stream)
10319 fprintf (loop_dump_stream,
10320 " Swapped set of reg %d at %d with reg %d at %d.\n",
10321 regno, INSN_UID (insn),
10322 new_regno, INSN_UID (prev_insn));
10324 /* Update first use of REGNO. */
10325 if (REGNO_FIRST_UID (regno) == INSN_UID (prev_insn))
10326 REGNO_FIRST_UID (regno) = INSN_UID (insn);
10328 /* Now perform copy propagation to hopefully
10329 remove all uses of REGNO within the loop. */
10330 try_copy_prop (loop, replacement, regno);
10336 /* Replace MEM with its associated pseudo register. This function is
10337 called from load_mems via for_each_rtx. DATA is actually a pointer
10338 to a structure describing the instruction currently being scanned
10339 and the MEM we are currently replacing. */
10341 static int
10342 replace_loop_mem (mem, data)
10343 rtx *mem;
10344 void *data;
10346 loop_replace_args *args = (loop_replace_args *) data;
10347 rtx m = *mem;
10349 if (m == NULL_RTX)
10350 return 0;
10352 switch (GET_CODE (m))
10354 case MEM:
10355 break;
10357 case CONST_DOUBLE:
10358 /* We're not interested in the MEM associated with a
10359 CONST_DOUBLE, so there's no need to traverse into one. */
10360 return -1;
10362 default:
10363 /* This is not a MEM. */
10364 return 0;
10367 if (!rtx_equal_p (args->match, m))
10368 /* This is not the MEM we are currently replacing. */
10369 return 0;
10371 /* Actually replace the MEM. */
10372 validate_change (args->insn, mem, args->replacement, 1);
10374 return 0;
10377 static void
10378 replace_loop_mems (insn, mem, reg)
10379 rtx insn;
10380 rtx mem;
10381 rtx reg;
10383 loop_replace_args args;
10385 args.insn = insn;
10386 args.match = mem;
10387 args.replacement = reg;
10389 for_each_rtx (&insn, replace_loop_mem, &args);
10392 /* Replace one register with another. Called through for_each_rtx; PX points
10393 to the rtx being scanned. DATA is actually a pointer to
10394 a structure of arguments. */
10396 static int
10397 replace_loop_reg (px, data)
10398 rtx *px;
10399 void *data;
10401 rtx x = *px;
10402 loop_replace_args *args = (loop_replace_args *) data;
10404 if (x == NULL_RTX)
10405 return 0;
10407 if (x == args->match)
10408 validate_change (args->insn, px, args->replacement, 1);
10410 return 0;
10413 static void
10414 replace_loop_regs (insn, reg, replacement)
10415 rtx insn;
10416 rtx reg;
10417 rtx replacement;
10419 loop_replace_args args;
10421 args.insn = insn;
10422 args.match = reg;
10423 args.replacement = replacement;
10425 for_each_rtx (&insn, replace_loop_reg, &args);
10428 /* Replace occurrences of the old exit label for the loop with the new
10429 one. DATA is an rtx_pair containing the old and new labels,
10430 respectively. */
10432 static int
10433 replace_label (x, data)
10434 rtx *x;
10435 void *data;
10437 rtx l = *x;
10438 rtx old_label = ((rtx_pair *) data)->r1;
10439 rtx new_label = ((rtx_pair *) data)->r2;
10441 if (l == NULL_RTX)
10442 return 0;
10444 if (GET_CODE (l) != LABEL_REF)
10445 return 0;
10447 if (XEXP (l, 0) != old_label)
10448 return 0;
10450 XEXP (l, 0) = new_label;
10451 ++LABEL_NUSES (new_label);
10452 --LABEL_NUSES (old_label);
10454 return 0;
10457 /* Emit insn for PATTERN after WHERE_INSN in basic block WHERE_BB
10458 (ignored in the interim). */
10460 static rtx
10461 loop_insn_emit_after (loop, where_bb, where_insn, pattern)
10462 const struct loop *loop ATTRIBUTE_UNUSED;
10463 basic_block where_bb ATTRIBUTE_UNUSED;
10464 rtx where_insn;
10465 rtx pattern;
10467 return emit_insn_after (pattern, where_insn);
10471 /* If WHERE_INSN is nonzero emit insn for PATTERN before WHERE_INSN
10472 in basic block WHERE_BB (ignored in the interim) within the loop
10473 otherwise hoist PATTERN into the loop pre-header. */
10476 loop_insn_emit_before (loop, where_bb, where_insn, pattern)
10477 const struct loop *loop;
10478 basic_block where_bb ATTRIBUTE_UNUSED;
10479 rtx where_insn;
10480 rtx pattern;
10482 if (! where_insn)
10483 return loop_insn_hoist (loop, pattern);
10484 return emit_insn_before (pattern, where_insn);
10488 /* Emit call insn for PATTERN before WHERE_INSN in basic block
10489 WHERE_BB (ignored in the interim) within the loop. */
10491 static rtx
10492 loop_call_insn_emit_before (loop, where_bb, where_insn, pattern)
10493 const struct loop *loop ATTRIBUTE_UNUSED;
10494 basic_block where_bb ATTRIBUTE_UNUSED;
10495 rtx where_insn;
10496 rtx pattern;
10498 return emit_call_insn_before (pattern, where_insn);
10502 /* Hoist insn for PATTERN into the loop pre-header. */
10505 loop_insn_hoist (loop, pattern)
10506 const struct loop *loop;
10507 rtx pattern;
10509 return loop_insn_emit_before (loop, 0, loop->start, pattern);
10513 /* Hoist call insn for PATTERN into the loop pre-header. */
10515 static rtx
10516 loop_call_insn_hoist (loop, pattern)
10517 const struct loop *loop;
10518 rtx pattern;
10520 return loop_call_insn_emit_before (loop, 0, loop->start, pattern);
10524 /* Sink insn for PATTERN after the loop end. */
10527 loop_insn_sink (loop, pattern)
10528 const struct loop *loop;
10529 rtx pattern;
10531 return loop_insn_emit_before (loop, 0, loop->sink, pattern);
10534 /* bl->final_value can be eighter general_operand or PLUS of general_operand
10535 and constant. Emit sequence of intructions to load it into REG */
10536 static rtx
10537 gen_load_of_final_value (reg, final_value)
10538 rtx reg, final_value;
10540 rtx seq;
10541 start_sequence ();
10542 final_value = force_operand (final_value, reg);
10543 if (final_value != reg)
10544 emit_move_insn (reg, final_value);
10545 seq = get_insns ();
10546 end_sequence ();
10547 return seq;
10550 /* If the loop has multiple exits, emit insn for PATTERN before the
10551 loop to ensure that it will always be executed no matter how the
10552 loop exits. Otherwise, emit the insn for PATTERN after the loop,
10553 since this is slightly more efficient. */
10555 static rtx
10556 loop_insn_sink_or_swim (loop, pattern)
10557 const struct loop *loop;
10558 rtx pattern;
10560 if (loop->exit_count)
10561 return loop_insn_hoist (loop, pattern);
10562 else
10563 return loop_insn_sink (loop, pattern);
10566 static void
10567 loop_ivs_dump (loop, file, verbose)
10568 const struct loop *loop;
10569 FILE *file;
10570 int verbose;
10572 struct iv_class *bl;
10573 int iv_num = 0;
10575 if (! loop || ! file)
10576 return;
10578 for (bl = LOOP_IVS (loop)->list; bl; bl = bl->next)
10579 iv_num++;
10581 fprintf (file, "Loop %d: %d IV classes\n", loop->num, iv_num);
10583 for (bl = LOOP_IVS (loop)->list; bl; bl = bl->next)
10585 loop_iv_class_dump (bl, file, verbose);
10586 fputc ('\n', file);
10591 static void
10592 loop_iv_class_dump (bl, file, verbose)
10593 const struct iv_class *bl;
10594 FILE *file;
10595 int verbose ATTRIBUTE_UNUSED;
10597 struct induction *v;
10598 rtx incr;
10599 int i;
10601 if (! bl || ! file)
10602 return;
10604 fprintf (file, "IV class for reg %d, benefit %d\n",
10605 bl->regno, bl->total_benefit);
10607 fprintf (file, " Init insn %d", INSN_UID (bl->init_insn));
10608 if (bl->initial_value)
10610 fprintf (file, ", init val: ");
10611 print_simple_rtl (file, bl->initial_value);
10613 if (bl->initial_test)
10615 fprintf (file, ", init test: ");
10616 print_simple_rtl (file, bl->initial_test);
10618 fputc ('\n', file);
10620 if (bl->final_value)
10622 fprintf (file, " Final val: ");
10623 print_simple_rtl (file, bl->final_value);
10624 fputc ('\n', file);
10627 if ((incr = biv_total_increment (bl)))
10629 fprintf (file, " Total increment: ");
10630 print_simple_rtl (file, incr);
10631 fputc ('\n', file);
10634 /* List the increments. */
10635 for (i = 0, v = bl->biv; v; v = v->next_iv, i++)
10637 fprintf (file, " Inc%d: insn %d, incr: ", i, INSN_UID (v->insn));
10638 print_simple_rtl (file, v->add_val);
10639 fputc ('\n', file);
10642 /* List the givs. */
10643 for (i = 0, v = bl->giv; v; v = v->next_iv, i++)
10645 fprintf (file, " Giv%d: insn %d, benefit %d, ",
10646 i, INSN_UID (v->insn), v->benefit);
10647 if (v->giv_type == DEST_ADDR)
10648 print_simple_rtl (file, v->mem);
10649 else
10650 print_simple_rtl (file, single_set (v->insn));
10651 fputc ('\n', file);
10656 static void
10657 loop_biv_dump (v, file, verbose)
10658 const struct induction *v;
10659 FILE *file;
10660 int verbose;
10662 if (! v || ! file)
10663 return;
10665 fprintf (file,
10666 "Biv %d: insn %d",
10667 REGNO (v->dest_reg), INSN_UID (v->insn));
10668 fprintf (file, " const ");
10669 print_simple_rtl (file, v->add_val);
10671 if (verbose && v->final_value)
10673 fputc ('\n', file);
10674 fprintf (file, " final ");
10675 print_simple_rtl (file, v->final_value);
10678 fputc ('\n', file);
10682 static void
10683 loop_giv_dump (v, file, verbose)
10684 const struct induction *v;
10685 FILE *file;
10686 int verbose;
10688 if (! v || ! file)
10689 return;
10691 if (v->giv_type == DEST_REG)
10692 fprintf (file, "Giv %d: insn %d",
10693 REGNO (v->dest_reg), INSN_UID (v->insn));
10694 else
10695 fprintf (file, "Dest address: insn %d",
10696 INSN_UID (v->insn));
10698 fprintf (file, " src reg %d benefit %d",
10699 REGNO (v->src_reg), v->benefit);
10700 fprintf (file, " lifetime %d",
10701 v->lifetime);
10703 if (v->replaceable)
10704 fprintf (file, " replaceable");
10706 if (v->no_const_addval)
10707 fprintf (file, " ncav");
10709 if (v->ext_dependent)
10711 switch (GET_CODE (v->ext_dependent))
10713 case SIGN_EXTEND:
10714 fprintf (file, " ext se");
10715 break;
10716 case ZERO_EXTEND:
10717 fprintf (file, " ext ze");
10718 break;
10719 case TRUNCATE:
10720 fprintf (file, " ext tr");
10721 break;
10722 default:
10723 abort ();
10727 fputc ('\n', file);
10728 fprintf (file, " mult ");
10729 print_simple_rtl (file, v->mult_val);
10731 fputc ('\n', file);
10732 fprintf (file, " add ");
10733 print_simple_rtl (file, v->add_val);
10735 if (verbose && v->final_value)
10737 fputc ('\n', file);
10738 fprintf (file, " final ");
10739 print_simple_rtl (file, v->final_value);
10742 fputc ('\n', file);
10746 void
10747 debug_ivs (loop)
10748 const struct loop *loop;
10750 loop_ivs_dump (loop, stderr, 1);
10754 void
10755 debug_iv_class (bl)
10756 const struct iv_class *bl;
10758 loop_iv_class_dump (bl, stderr, 1);
10762 void
10763 debug_biv (v)
10764 const struct induction *v;
10766 loop_biv_dump (v, stderr, 1);
10770 void
10771 debug_giv (v)
10772 const struct induction *v;
10774 loop_giv_dump (v, stderr, 1);
10778 #define LOOP_BLOCK_NUM_1(INSN) \
10779 ((INSN) ? (BLOCK_FOR_INSN (INSN) ? BLOCK_NUM (INSN) : - 1) : -1)
10781 /* The notes do not have an assigned block, so look at the next insn. */
10782 #define LOOP_BLOCK_NUM(INSN) \
10783 ((INSN) ? (GET_CODE (INSN) == NOTE \
10784 ? LOOP_BLOCK_NUM_1 (next_nonnote_insn (INSN)) \
10785 : LOOP_BLOCK_NUM_1 (INSN)) \
10786 : -1)
10788 #define LOOP_INSN_UID(INSN) ((INSN) ? INSN_UID (INSN) : -1)
10790 static void
10791 loop_dump_aux (loop, file, verbose)
10792 const struct loop *loop;
10793 FILE *file;
10794 int verbose ATTRIBUTE_UNUSED;
10796 rtx label;
10798 if (! loop || ! file)
10799 return;
10801 /* Print diagnostics to compare our concept of a loop with
10802 what the loop notes say. */
10803 if (! PREV_INSN (loop->first->head)
10804 || GET_CODE (PREV_INSN (loop->first->head)) != NOTE
10805 || NOTE_LINE_NUMBER (PREV_INSN (loop->first->head))
10806 != NOTE_INSN_LOOP_BEG)
10807 fprintf (file, ";; No NOTE_INSN_LOOP_BEG at %d\n",
10808 INSN_UID (PREV_INSN (loop->first->head)));
10809 if (! NEXT_INSN (loop->last->end)
10810 || GET_CODE (NEXT_INSN (loop->last->end)) != NOTE
10811 || NOTE_LINE_NUMBER (NEXT_INSN (loop->last->end))
10812 != NOTE_INSN_LOOP_END)
10813 fprintf (file, ";; No NOTE_INSN_LOOP_END at %d\n",
10814 INSN_UID (NEXT_INSN (loop->last->end)));
10816 if (loop->start)
10818 fprintf (file,
10819 ";; start %d (%d), cont dom %d (%d), cont %d (%d), vtop %d (%d), end %d (%d)\n",
10820 LOOP_BLOCK_NUM (loop->start),
10821 LOOP_INSN_UID (loop->start),
10822 LOOP_BLOCK_NUM (loop->cont),
10823 LOOP_INSN_UID (loop->cont),
10824 LOOP_BLOCK_NUM (loop->cont),
10825 LOOP_INSN_UID (loop->cont),
10826 LOOP_BLOCK_NUM (loop->vtop),
10827 LOOP_INSN_UID (loop->vtop),
10828 LOOP_BLOCK_NUM (loop->end),
10829 LOOP_INSN_UID (loop->end));
10830 fprintf (file, ";; top %d (%d), scan start %d (%d)\n",
10831 LOOP_BLOCK_NUM (loop->top),
10832 LOOP_INSN_UID (loop->top),
10833 LOOP_BLOCK_NUM (loop->scan_start),
10834 LOOP_INSN_UID (loop->scan_start));
10835 fprintf (file, ";; exit_count %d", loop->exit_count);
10836 if (loop->exit_count)
10838 fputs (", labels:", file);
10839 for (label = loop->exit_labels; label; label = LABEL_NEXTREF (label))
10841 fprintf (file, " %d ",
10842 LOOP_INSN_UID (XEXP (label, 0)));
10845 fputs ("\n", file);
10847 /* This can happen when a marked loop appears as two nested loops,
10848 say from while (a || b) {}. The inner loop won't match
10849 the loop markers but the outer one will. */
10850 if (LOOP_BLOCK_NUM (loop->cont) != loop->latch->index)
10851 fprintf (file, ";; NOTE_INSN_LOOP_CONT not in loop latch\n");
10855 /* Call this function from the debugger to dump LOOP. */
10857 void
10858 debug_loop (loop)
10859 const struct loop *loop;
10861 flow_loop_dump (loop, stderr, loop_dump_aux, 1);
10864 /* Call this function from the debugger to dump LOOPS. */
10866 void
10867 debug_loops (loops)
10868 const struct loops *loops;
10870 flow_loops_dump (loops, stderr, loop_dump_aux, 1);