Line data Source code
1 : /* Rtl-level induction variable analysis.
2 : Copyright (C) 2004-2026 Free Software Foundation, Inc.
3 :
4 : This file is part of GCC.
5 :
6 : GCC is free software; you can redistribute it and/or modify it
7 : under the terms of the GNU General Public License as published by the
8 : Free Software Foundation; either version 3, or (at your option) any
9 : later version.
10 :
11 : GCC is distributed in the hope that it will be useful, but WITHOUT
12 : ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 : FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 : for more details.
15 :
16 : You should have received a copy of the GNU General Public License
17 : along with GCC; see the file COPYING3. If not see
18 : <http://www.gnu.org/licenses/>. */
19 :
20 : /* This is a simple analysis of induction variables of the loop. The major use
21 : is for determining the number of iterations of a loop for loop unrolling,
22 : doloop optimization and branch prediction. The iv information is computed
23 : on demand.
24 :
25 : Induction variables are analyzed by walking the use-def chains. When
26 : a basic induction variable (biv) is found, it is cached in the bivs
27 : hash table. When register is proved to be a biv, its description
28 : is stored to DF_REF_DATA of the def reference.
29 :
30 : The analysis works always with one loop -- you must call
31 : iv_analysis_loop_init (loop) for it. All the other functions then work with
32 : this loop. When you need to work with another loop, just call
33 : iv_analysis_loop_init for it. When you no longer need iv analysis, call
34 : iv_analysis_done () to clean up the memory.
35 :
36 : The available functions are:
37 :
38 : iv_analyze (insn, mode, reg, iv): Stores the description of the induction
39 : variable corresponding to the use of register REG in INSN to IV, given
40 : that REG has mode MODE. Returns true if REG is an induction variable
41 : in INSN. false otherwise. If a use of REG is not found in INSN,
42 : the following insns are scanned (so that we may call this function
43 : on insns returned by get_condition).
44 : iv_analyze_result (insn, def, iv): Stores to IV the description of the iv
45 : corresponding to DEF, which is a register defined in INSN.
46 : iv_analyze_expr (insn, mode, expr, iv): Stores to IV the description of iv
47 : corresponding to expression EXPR evaluated at INSN. All registers used by
48 : EXPR must also be used in INSN. MODE is the mode of EXPR.
49 : */
50 :
51 : #include "config.h"
52 : #include "system.h"
53 : #include "coretypes.h"
54 : #include "backend.h"
55 : #include "rtl.h"
56 : #include "df.h"
57 : #include "memmodel.h"
58 : #include "emit-rtl.h"
59 : #include "diagnostic-core.h"
60 : #include "cfgloop.h"
61 : #include "intl.h"
62 : #include "dumpfile.h"
63 : #include "rtl-iter.h"
64 : #include "tree-ssa-loop-niter.h"
65 : #include "regs.h"
66 : #include "function-abi.h"
67 :
68 : /* Possible return values of iv_get_reaching_def. */
69 :
70 : enum iv_grd_result
71 : {
72 : /* More than one reaching def, or reaching def that does not
73 : dominate the use. */
74 : GRD_INVALID,
75 :
76 : /* The use is trivial invariant of the loop, i.e. is not changed
77 : inside the loop. */
78 : GRD_INVARIANT,
79 :
80 : /* The use is reached by initial value and a value from the
81 : previous iteration. */
82 : GRD_MAYBE_BIV,
83 :
84 : /* The use has single dominating def. */
85 : GRD_SINGLE_DOM
86 : };
87 :
88 : /* Information about a biv. */
89 :
90 : class biv_entry
91 : {
92 : public:
93 : unsigned regno; /* The register of the biv. */
94 : class rtx_iv iv; /* Value of the biv. */
95 : };
96 :
97 : static bool clean_slate = true;
98 :
99 : static unsigned int iv_ref_table_size = 0;
100 :
101 : /* Table of rtx_ivs indexed by the df_ref uid field. */
102 : static class rtx_iv ** iv_ref_table;
103 :
104 : /* Induction variable stored at the reference. */
105 : #define DF_REF_IV(REF) iv_ref_table[DF_REF_ID (REF)]
106 : #define DF_REF_IV_SET(REF, IV) iv_ref_table[DF_REF_ID (REF)] = (IV)
107 :
108 : /* The current loop. */
109 :
110 : static class loop *current_loop;
111 :
112 : /* Hashtable helper. */
113 :
114 : struct biv_entry_hasher : free_ptr_hash <biv_entry>
115 : {
116 : typedef rtx_def *compare_type;
117 : static inline hashval_t hash (const biv_entry *);
118 : static inline bool equal (const biv_entry *, const rtx_def *);
119 : };
120 :
121 : /* Returns hash value for biv B. */
122 :
123 : inline hashval_t
124 117148 : biv_entry_hasher::hash (const biv_entry *b)
125 : {
126 117148 : return b->regno;
127 : }
128 :
129 : /* Compares biv B and register R. */
130 :
131 : inline bool
132 137086 : biv_entry_hasher::equal (const biv_entry *b, const rtx_def *r)
133 : {
134 137086 : return b->regno == REGNO (r);
135 : }
136 :
137 : /* Bivs of the current loop. */
138 :
139 : static hash_table<biv_entry_hasher> *bivs;
140 :
141 : static bool iv_analyze_op (rtx_insn *, scalar_int_mode, rtx, class rtx_iv *);
142 :
143 : /* Return the RTX code corresponding to the IV extend code EXTEND. */
144 : static inline enum rtx_code
145 4 : iv_extend_to_rtx_code (enum iv_extend_code extend)
146 : {
147 4 : switch (extend)
148 : {
149 : case IV_SIGN_EXTEND:
150 : return SIGN_EXTEND;
151 : case IV_ZERO_EXTEND:
152 : return ZERO_EXTEND;
153 : case IV_UNKNOWN_EXTEND:
154 : return UNKNOWN;
155 : }
156 0 : gcc_unreachable ();
157 : }
158 :
159 : /* Dumps information about IV to FILE. */
160 :
161 : extern void dump_iv_info (FILE *, class rtx_iv *);
162 : void
163 570 : dump_iv_info (FILE *file, class rtx_iv *iv)
164 : {
165 570 : if (!iv->base)
166 : {
167 57 : fprintf (file, "not simple");
168 57 : return;
169 : }
170 :
171 513 : if (iv->step == const0_rtx
172 221 : && !iv->first_special)
173 221 : fprintf (file, "invariant ");
174 :
175 513 : print_rtl (file, iv->base);
176 513 : if (iv->step != const0_rtx)
177 : {
178 292 : fprintf (file, " + ");
179 292 : print_rtl (file, iv->step);
180 292 : fprintf (file, " * iteration");
181 : }
182 513 : fprintf (file, " (in %s)", GET_MODE_NAME (iv->mode));
183 :
184 513 : if (iv->mode != iv->extend_mode)
185 0 : fprintf (file, " %s to %s",
186 0 : rtx_name[iv_extend_to_rtx_code (iv->extend)],
187 0 : GET_MODE_NAME (iv->extend_mode));
188 :
189 513 : if (iv->mult != const1_rtx)
190 : {
191 0 : fprintf (file, " * ");
192 0 : print_rtl (file, iv->mult);
193 : }
194 513 : if (iv->delta != const0_rtx)
195 : {
196 0 : fprintf (file, " + ");
197 0 : print_rtl (file, iv->delta);
198 : }
199 513 : if (iv->first_special)
200 0 : fprintf (file, " (first special)");
201 : }
202 :
203 : static void
204 2687382 : check_iv_ref_table_size (void)
205 : {
206 2687382 : if (iv_ref_table_size < DF_DEFS_TABLE_SIZE ())
207 : {
208 261644 : unsigned int new_size = DF_DEFS_TABLE_SIZE () + (DF_DEFS_TABLE_SIZE () / 4);
209 261644 : iv_ref_table = XRESIZEVEC (class rtx_iv *, iv_ref_table, new_size);
210 261644 : memset (&iv_ref_table[iv_ref_table_size], 0,
211 261644 : (new_size - iv_ref_table_size) * sizeof (class rtx_iv *));
212 261644 : iv_ref_table_size = new_size;
213 : }
214 2687382 : }
215 :
216 :
217 : /* Checks whether REG is a well-behaved register. */
218 :
219 : static bool
220 3870165 : simple_reg_p (rtx reg)
221 : {
222 3870165 : unsigned r;
223 :
224 3870165 : if (GET_CODE (reg) == SUBREG)
225 : {
226 11878 : if (!subreg_lowpart_p (reg))
227 : return false;
228 11850 : reg = SUBREG_REG (reg);
229 : }
230 :
231 3870137 : if (!REG_P (reg))
232 : return false;
233 :
234 3564128 : r = REGNO (reg);
235 3564128 : if (HARD_REGISTER_NUM_P (r))
236 : return false;
237 :
238 3526348 : if (GET_MODE_CLASS (GET_MODE (reg)) != MODE_INT)
239 12 : return false;
240 :
241 : return true;
242 : }
243 :
244 : /* Clears the information about ivs stored in df. */
245 :
246 : static void
247 644336 : clear_iv_info (void)
248 : {
249 644336 : unsigned i, n_defs = DF_DEFS_TABLE_SIZE ();
250 644336 : class rtx_iv *iv;
251 :
252 644336 : check_iv_ref_table_size ();
253 77274324 : for (i = 0; i < n_defs; i++)
254 : {
255 75985652 : iv = iv_ref_table[i];
256 75985652 : if (iv)
257 : {
258 692601 : free (iv);
259 692601 : iv_ref_table[i] = NULL;
260 : }
261 : }
262 :
263 644336 : bivs->empty ();
264 644336 : }
265 :
266 :
267 : /* Prepare the data for an induction variable analysis of a LOOP. */
268 :
269 : void
270 644336 : iv_analysis_loop_init (class loop *loop)
271 : {
272 644336 : current_loop = loop;
273 :
274 : /* Clear the information from the analysis of the previous loop. */
275 644336 : if (clean_slate)
276 : {
277 186287 : df_set_flags (DF_EQ_NOTES + DF_DEFER_INSN_RESCAN);
278 186287 : bivs = new hash_table<biv_entry_hasher> (10);
279 186287 : clean_slate = false;
280 : }
281 : else
282 458049 : clear_iv_info ();
283 :
284 : /* Get rid of the ud chains before processing the rescans. Then add
285 : the problem back. */
286 644336 : df_remove_problem (df_chain);
287 644336 : df_process_deferred_rescans ();
288 644336 : df_set_flags (DF_RD_PRUNE_DEAD_DEFS);
289 644336 : df_chain_add_problem (DF_UD_CHAIN);
290 644336 : df_note_add_problem ();
291 644336 : df_analyze_loop (loop);
292 644336 : if (dump_file)
293 174 : df_dump_region (dump_file);
294 :
295 644336 : check_iv_ref_table_size ();
296 644336 : }
297 :
298 : /* Finds the definition of REG that dominates loop latch and stores
299 : it to DEF. Returns false if there is not a single definition
300 : dominating the latch. If REG has no definition in loop, DEF
301 : is set to NULL and true is returned. */
302 :
303 : static bool
304 675608 : latch_dominating_def (rtx reg, df_ref *def)
305 : {
306 675608 : df_ref single_rd = NULL, adef;
307 675608 : unsigned regno = REGNO (reg);
308 675608 : class df_rd_bb_info *bb_info = DF_RD_BB_INFO (current_loop->latch);
309 :
310 2208548 : for (adef = DF_REG_DEF_CHAIN (regno); adef; adef = DF_REF_NEXT_REG (adef))
311 : {
312 1532965 : if (!bitmap_bit_p (df->blocks_to_analyze, DF_REF_BBNO (adef))
313 1532965 : || !bitmap_bit_p (&bb_info->out, DF_REF_ID (adef)))
314 874246 : continue;
315 :
316 : /* More than one reaching definition. */
317 658719 : if (single_rd)
318 : return false;
319 :
320 658719 : if (!just_once_each_iteration_p (current_loop, DF_REF_BB (adef)))
321 : return false;
322 :
323 : single_rd = adef;
324 : }
325 :
326 675583 : *def = single_rd;
327 675583 : return true;
328 : }
329 :
330 : /* Gets definition of REG reaching its use in INSN and stores it to DEF. */
331 :
332 : static enum iv_grd_result
333 2072788 : iv_get_reaching_def (rtx_insn *insn, rtx reg, df_ref *def)
334 : {
335 2072788 : df_ref use, adef;
336 2072788 : basic_block def_bb, use_bb;
337 2072788 : rtx_insn *def_insn;
338 2072788 : bool dom_p;
339 :
340 2072788 : *def = NULL;
341 2072788 : if (!simple_reg_p (reg))
342 : return GRD_INVALID;
343 1983297 : if (GET_CODE (reg) == SUBREG)
344 0 : reg = SUBREG_REG (reg);
345 1983297 : gcc_assert (REG_P (reg));
346 :
347 1983297 : use = df_find_use (insn, reg);
348 1983297 : gcc_assert (use != NULL);
349 :
350 1983297 : if (!DF_REF_CHAIN (use))
351 : return GRD_INVARIANT;
352 :
353 : /* More than one reaching def. */
354 1701189 : if (DF_REF_CHAIN (use)->next)
355 : return GRD_INVALID;
356 :
357 1671862 : adef = DF_REF_CHAIN (use)->ref;
358 :
359 : /* We do not handle setting only part of the register. */
360 1671862 : if (DF_REF_FLAGS (adef) & DF_REF_READ_WRITE)
361 : return GRD_INVALID;
362 :
363 1671860 : def_insn = DF_REF_INSN (adef);
364 1671860 : def_bb = DF_REF_BB (adef);
365 1671860 : use_bb = BLOCK_FOR_INSN (insn);
366 :
367 1671860 : if (use_bb == def_bb)
368 1539068 : dom_p = (DF_INSN_LUID (def_insn) < DF_INSN_LUID (insn));
369 : else
370 132792 : dom_p = dominated_by_p (CDI_DOMINATORS, use_bb, def_bb);
371 :
372 1671860 : if (dom_p)
373 : {
374 672708 : *def = adef;
375 672708 : return GRD_SINGLE_DOM;
376 : }
377 :
378 : /* The definition does not dominate the use. This is still OK if
379 : this may be a use of a biv, i.e. if the def_bb dominates loop
380 : latch. */
381 999152 : if (just_once_each_iteration_p (current_loop, def_bb))
382 995327 : return GRD_MAYBE_BIV;
383 :
384 : return GRD_INVALID;
385 : }
386 :
387 : /* Sets IV to invariant CST in MODE. Always returns true (just for
388 : consistency with other iv manipulation functions that may fail). */
389 :
390 : static bool
391 925933 : iv_constant (class rtx_iv *iv, scalar_int_mode mode, rtx cst)
392 : {
393 925933 : iv->mode = mode;
394 925933 : iv->base = cst;
395 925933 : iv->step = const0_rtx;
396 925933 : iv->first_special = false;
397 925933 : iv->extend = IV_UNKNOWN_EXTEND;
398 925933 : iv->extend_mode = iv->mode;
399 925933 : iv->delta = const0_rtx;
400 925933 : iv->mult = const1_rtx;
401 :
402 925933 : return true;
403 : }
404 :
405 : /* Evaluates application of subreg to MODE on IV. */
406 :
407 : static bool
408 6665 : iv_subreg (class rtx_iv *iv, scalar_int_mode mode)
409 : {
410 : /* If iv is invariant, just calculate the new value. */
411 6665 : if (iv->step == const0_rtx
412 77 : && !iv->first_special)
413 : {
414 75 : rtx val = get_iv_value (iv, const0_rtx);
415 75 : val = lowpart_subreg (mode, val,
416 75 : iv->extend == IV_UNKNOWN_EXTEND
417 : ? iv->mode : iv->extend_mode);
418 :
419 75 : iv->base = val;
420 75 : iv->extend = IV_UNKNOWN_EXTEND;
421 75 : iv->mode = iv->extend_mode = mode;
422 75 : iv->delta = const0_rtx;
423 75 : iv->mult = const1_rtx;
424 75 : return true;
425 : }
426 :
427 6590 : if (iv->extend_mode == mode)
428 : return true;
429 :
430 19770 : if (GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (iv->mode))
431 : return false;
432 :
433 6590 : iv->extend = IV_UNKNOWN_EXTEND;
434 6590 : iv->mode = mode;
435 :
436 6590 : iv->base = simplify_gen_binary (PLUS, iv->extend_mode, iv->delta,
437 : simplify_gen_binary (MULT, iv->extend_mode,
438 : iv->base, iv->mult));
439 6590 : iv->step = simplify_gen_binary (MULT, iv->extend_mode, iv->step, iv->mult);
440 6590 : iv->mult = const1_rtx;
441 6590 : iv->delta = const0_rtx;
442 6590 : iv->first_special = false;
443 :
444 6590 : return true;
445 : }
446 :
447 : /* Evaluates application of EXTEND to MODE on IV. */
448 :
449 : static bool
450 985 : iv_extend (class rtx_iv *iv, enum iv_extend_code extend, scalar_int_mode mode)
451 : {
452 : /* If iv is invariant, just calculate the new value. */
453 985 : if (iv->step == const0_rtx
454 4 : && !iv->first_special)
455 : {
456 4 : rtx val = get_iv_value (iv, const0_rtx);
457 4 : if (iv->extend_mode != iv->mode
458 0 : && iv->extend != IV_UNKNOWN_EXTEND
459 4 : && iv->extend != extend)
460 0 : val = lowpart_subreg (iv->mode, val, iv->extend_mode);
461 4 : val = simplify_gen_unary (iv_extend_to_rtx_code (extend), mode,
462 : val,
463 4 : iv->extend == extend
464 : ? iv->extend_mode : iv->mode);
465 4 : iv->base = val;
466 4 : iv->extend = IV_UNKNOWN_EXTEND;
467 4 : iv->mode = iv->extend_mode = mode;
468 4 : iv->delta = const0_rtx;
469 4 : iv->mult = const1_rtx;
470 4 : return true;
471 : }
472 :
473 981 : if (mode != iv->extend_mode)
474 : return false;
475 :
476 34 : if (iv->extend != IV_UNKNOWN_EXTEND
477 0 : && iv->extend != extend)
478 : return false;
479 :
480 34 : iv->extend = extend;
481 :
482 34 : return true;
483 : }
484 :
485 : /* Evaluates negation of IV. */
486 :
487 : static bool
488 51 : iv_neg (class rtx_iv *iv)
489 : {
490 51 : if (iv->extend == IV_UNKNOWN_EXTEND)
491 : {
492 51 : iv->base = simplify_gen_unary (NEG, iv->extend_mode,
493 : iv->base, iv->extend_mode);
494 51 : iv->step = simplify_gen_unary (NEG, iv->extend_mode,
495 : iv->step, iv->extend_mode);
496 : }
497 : else
498 : {
499 0 : iv->delta = simplify_gen_unary (NEG, iv->extend_mode,
500 : iv->delta, iv->extend_mode);
501 0 : iv->mult = simplify_gen_unary (NEG, iv->extend_mode,
502 : iv->mult, iv->extend_mode);
503 : }
504 :
505 51 : return true;
506 : }
507 :
508 : /* Evaluates addition or subtraction (according to OP) of IV1 to IV0. */
509 :
510 : static bool
511 455634 : iv_add (class rtx_iv *iv0, class rtx_iv *iv1, enum rtx_code op)
512 : {
513 455634 : scalar_int_mode mode;
514 455634 : rtx arg;
515 :
516 : /* Extend the constant to extend_mode of the other operand if necessary. */
517 455634 : if (iv0->extend == IV_UNKNOWN_EXTEND
518 455633 : && iv0->mode == iv0->extend_mode
519 454681 : && iv0->step == const0_rtx
520 459783 : && GET_MODE_SIZE (iv0->extend_mode) < GET_MODE_SIZE (iv1->extend_mode))
521 : {
522 266 : iv0->extend_mode = iv1->extend_mode;
523 266 : iv0->base = simplify_gen_unary (ZERO_EXTEND, iv0->extend_mode,
524 : iv0->base, iv0->mode);
525 : }
526 455634 : if (iv1->extend == IV_UNKNOWN_EXTEND
527 455634 : && iv1->mode == iv1->extend_mode
528 455365 : && iv1->step == const0_rtx
529 1819320 : && GET_MODE_SIZE (iv1->extend_mode) < GET_MODE_SIZE (iv0->extend_mode))
530 : {
531 949 : iv1->extend_mode = iv0->extend_mode;
532 949 : iv1->base = simplify_gen_unary (ZERO_EXTEND, iv1->extend_mode,
533 : iv1->base, iv1->mode);
534 : }
535 :
536 455634 : mode = iv0->extend_mode;
537 455634 : if (mode != iv1->extend_mode)
538 : return false;
539 :
540 455634 : if (iv0->extend == IV_UNKNOWN_EXTEND
541 455633 : && iv1->extend == IV_UNKNOWN_EXTEND)
542 : {
543 455633 : if (iv0->mode != iv1->mode)
544 : return false;
545 :
546 455633 : iv0->base = simplify_gen_binary (op, mode, iv0->base, iv1->base);
547 455633 : iv0->step = simplify_gen_binary (op, mode, iv0->step, iv1->step);
548 :
549 455633 : return true;
550 : }
551 :
552 : /* Handle addition of constant. */
553 1 : if (iv1->extend == IV_UNKNOWN_EXTEND
554 1 : && iv1->mode == mode
555 2 : && iv1->step == const0_rtx)
556 : {
557 1 : iv0->delta = simplify_gen_binary (op, mode, iv0->delta, iv1->base);
558 1 : return true;
559 : }
560 :
561 0 : if (iv0->extend == IV_UNKNOWN_EXTEND
562 0 : && iv0->mode == mode
563 0 : && iv0->step == const0_rtx)
564 : {
565 0 : arg = iv0->base;
566 0 : *iv0 = *iv1;
567 0 : if (op == MINUS
568 0 : && !iv_neg (iv0))
569 : return false;
570 :
571 0 : iv0->delta = simplify_gen_binary (PLUS, mode, iv0->delta, arg);
572 0 : return true;
573 : }
574 :
575 : return false;
576 : }
577 :
578 : /* Evaluates multiplication of IV by constant CST. */
579 :
580 : static bool
581 104 : iv_mult (class rtx_iv *iv, rtx mby)
582 : {
583 104 : scalar_int_mode mode = iv->extend_mode;
584 :
585 104 : if (GET_MODE (mby) != VOIDmode
586 104 : && GET_MODE (mby) != mode)
587 : return false;
588 :
589 104 : if (iv->extend == IV_UNKNOWN_EXTEND)
590 : {
591 97 : iv->base = simplify_gen_binary (MULT, mode, iv->base, mby);
592 97 : iv->step = simplify_gen_binary (MULT, mode, iv->step, mby);
593 : }
594 : else
595 : {
596 7 : iv->delta = simplify_gen_binary (MULT, mode, iv->delta, mby);
597 7 : iv->mult = simplify_gen_binary (MULT, mode, iv->mult, mby);
598 : }
599 :
600 : return true;
601 : }
602 :
603 : /* Evaluates shift of IV by constant CST. */
604 :
605 : static bool
606 99 : iv_shift (class rtx_iv *iv, rtx mby)
607 : {
608 99 : scalar_int_mode mode = iv->extend_mode;
609 :
610 99 : if (GET_MODE (mby) != VOIDmode
611 99 : && GET_MODE (mby) != mode)
612 : return false;
613 :
614 99 : if (iv->extend == IV_UNKNOWN_EXTEND)
615 : {
616 99 : iv->base = simplify_gen_binary (ASHIFT, mode, iv->base, mby);
617 99 : iv->step = simplify_gen_binary (ASHIFT, mode, iv->step, mby);
618 : }
619 : else
620 : {
621 0 : iv->delta = simplify_gen_binary (ASHIFT, mode, iv->delta, mby);
622 0 : iv->mult = simplify_gen_binary (ASHIFT, mode, iv->mult, mby);
623 : }
624 :
625 : return true;
626 : }
627 :
628 : /* The recursive part of get_biv_step. Gets the value of the single value
629 : defined by DEF wrto initial value of REG inside loop, in shape described
630 : at get_biv_step. */
631 :
632 : static bool
633 537171 : get_biv_step_1 (df_ref def, scalar_int_mode outer_mode, rtx reg,
634 : rtx *inner_step, scalar_int_mode *inner_mode,
635 : enum iv_extend_code *extend,
636 : rtx *outer_step)
637 : {
638 537171 : rtx set, rhs, op0 = NULL_RTX, op1 = NULL_RTX;
639 537171 : rtx next, nextr;
640 537171 : enum rtx_code code, prev_code = UNKNOWN;
641 537171 : rtx_insn *insn = DF_REF_INSN (def);
642 537171 : df_ref next_def;
643 537171 : enum iv_grd_result res;
644 :
645 537171 : set = single_set (insn);
646 537171 : if (!set)
647 : return false;
648 :
649 535594 : rhs = find_reg_equal_equiv_note (insn);
650 535594 : if (rhs)
651 1917 : rhs = XEXP (rhs, 0);
652 : else
653 533677 : rhs = SET_SRC (set);
654 :
655 535594 : code = GET_CODE (rhs);
656 535594 : switch (code)
657 : {
658 : case SUBREG:
659 : case REG:
660 : next = rhs;
661 : break;
662 :
663 493316 : case PLUS:
664 493316 : case MINUS:
665 493316 : op0 = XEXP (rhs, 0);
666 493316 : op1 = XEXP (rhs, 1);
667 :
668 493316 : if (code == PLUS && CONSTANT_P (op0))
669 : std::swap (op0, op1);
670 :
671 493316 : if (!simple_reg_p (op0)
672 493316 : || !CONSTANT_P (op1))
673 : return false;
674 :
675 473181 : if (GET_MODE (rhs) != outer_mode)
676 : {
677 : /* ppc64 uses expressions like
678 :
679 : (set x:SI (plus:SI (subreg:SI y:DI) 1)).
680 :
681 : this is equivalent to
682 :
683 : (set x':DI (plus:DI y:DI 1))
684 : (set x:SI (subreg:SI (x':DI)). */
685 16 : if (GET_CODE (op0) != SUBREG)
686 : return false;
687 9 : if (GET_MODE (SUBREG_REG (op0)) != outer_mode)
688 : return false;
689 : }
690 :
691 : next = op0;
692 : break;
693 :
694 68 : case SIGN_EXTEND:
695 68 : case ZERO_EXTEND:
696 68 : if (GET_MODE (rhs) != outer_mode)
697 : return false;
698 :
699 68 : op0 = XEXP (rhs, 0);
700 :
701 : /* rv64 wraps SImode arithmetic inside an extension to DImode.
702 : This matches the actual hardware semantics. So peek inside
703 : the extension and see if we have simple arithmetic that we
704 : can analyze. */
705 68 : if (GET_CODE (op0) == PLUS)
706 : {
707 0 : rhs = op0;
708 0 : op0 = XEXP (rhs, 0);
709 0 : op1 = XEXP (rhs, 1);
710 :
711 0 : if (CONSTANT_P (op0))
712 0 : std::swap (op0, op1);
713 :
714 0 : if (!simple_reg_p (op0) || !CONSTANT_P (op1))
715 : return false;
716 :
717 0 : op1 = simplify_gen_unary (code, outer_mode, op1, GET_MODE (rhs));
718 0 : prev_code = code;
719 0 : code = PLUS;
720 : }
721 :
722 68 : if (!simple_reg_p (op0))
723 : return false;
724 :
725 : next = op0;
726 : break;
727 :
728 : default:
729 : return false;
730 : }
731 :
732 499121 : if (GET_CODE (next) == SUBREG)
733 : {
734 562 : if (!subreg_lowpart_p (next))
735 : return false;
736 :
737 517 : nextr = SUBREG_REG (next);
738 517 : if (GET_MODE (nextr) != outer_mode)
739 : return false;
740 : }
741 : else
742 : nextr = next;
743 :
744 498579 : res = iv_get_reaching_def (insn, nextr, &next_def);
745 :
746 498579 : if (res == GRD_INVALID || res == GRD_INVARIANT)
747 : return false;
748 :
749 494167 : if (res == GRD_MAYBE_BIV)
750 : {
751 472922 : if (!rtx_equal_p (nextr, reg))
752 : return false;
753 :
754 472335 : *inner_step = const0_rtx;
755 472335 : *extend = IV_UNKNOWN_EXTEND;
756 472335 : *inner_mode = outer_mode;
757 472335 : *outer_step = const0_rtx;
758 : }
759 21245 : else if (!get_biv_step_1 (next_def, outer_mode, reg,
760 : inner_step, inner_mode, extend,
761 : outer_step))
762 : return false;
763 :
764 485734 : if (GET_CODE (next) == SUBREG)
765 : {
766 15 : scalar_int_mode amode;
767 15 : if (!is_a <scalar_int_mode> (GET_MODE (next), &amode)
768 30 : || GET_MODE_SIZE (amode) > GET_MODE_SIZE (*inner_mode))
769 537171 : return false;
770 :
771 15 : *inner_mode = amode;
772 15 : *inner_step = simplify_gen_binary (PLUS, outer_mode,
773 : *inner_step, *outer_step);
774 15 : *outer_step = const0_rtx;
775 15 : *extend = IV_UNKNOWN_EXTEND;
776 : }
777 :
778 485734 : switch (code)
779 : {
780 : case REG:
781 : case SUBREG:
782 : break;
783 :
784 472331 : case PLUS:
785 472331 : case MINUS:
786 472331 : if (*inner_mode == outer_mode
787 : /* See comment in previous switch. */
788 472331 : || GET_MODE (rhs) != outer_mode)
789 472330 : *inner_step = simplify_gen_binary (code, outer_mode,
790 : *inner_step, op1);
791 : else
792 1 : *outer_step = simplify_gen_binary (code, outer_mode,
793 : *outer_step, op1);
794 :
795 472331 : if (prev_code == SIGN_EXTEND)
796 0 : *extend = IV_SIGN_EXTEND;
797 472331 : else if (prev_code == ZERO_EXTEND)
798 0 : *extend = IV_ZERO_EXTEND;
799 : break;
800 :
801 15 : case SIGN_EXTEND:
802 15 : case ZERO_EXTEND:
803 15 : gcc_assert (GET_MODE (op0) == *inner_mode
804 : && *extend == IV_UNKNOWN_EXTEND
805 : && *outer_step == const0_rtx);
806 :
807 15 : *extend = (code == SIGN_EXTEND) ? IV_SIGN_EXTEND : IV_ZERO_EXTEND;
808 15 : break;
809 :
810 : default:
811 : return false;
812 : }
813 :
814 : return true;
815 : }
816 :
817 : /* Gets the operation on register REG inside loop, in shape
818 :
819 : OUTER_STEP + EXTEND_{OUTER_MODE} (SUBREG_{INNER_MODE} (REG + INNER_STEP))
820 :
821 : If the operation cannot be described in this shape, return false.
822 : LAST_DEF is the definition of REG that dominates loop latch. */
823 :
824 : static bool
825 515926 : get_biv_step (df_ref last_def, scalar_int_mode outer_mode, rtx reg,
826 : rtx *inner_step, scalar_int_mode *inner_mode,
827 : enum iv_extend_code *extend, rtx *outer_step)
828 : {
829 515926 : if (!get_biv_step_1 (last_def, outer_mode, reg,
830 : inner_step, inner_mode, extend,
831 : outer_step))
832 : return false;
833 :
834 472335 : gcc_assert ((*inner_mode == outer_mode) != (*extend != IV_UNKNOWN_EXTEND));
835 472335 : gcc_assert (*inner_mode != outer_mode || *outer_step == const0_rtx);
836 :
837 : return true;
838 : }
839 :
840 : /* Records information that DEF is induction variable IV. */
841 :
842 : static void
843 692601 : record_iv (df_ref def, class rtx_iv *iv)
844 : {
845 692601 : class rtx_iv *recorded_iv = XNEW (class rtx_iv);
846 :
847 692601 : *recorded_iv = *iv;
848 692601 : check_iv_ref_table_size ();
849 692601 : DF_REF_IV_SET (def, recorded_iv);
850 692601 : }
851 :
852 : /* If DEF was already analyzed for bivness, store the description of the biv to
853 : IV and return true. Otherwise return false. */
854 :
855 : static bool
856 590544 : analyzed_for_bivness_p (rtx def, class rtx_iv *iv)
857 : {
858 590544 : class biv_entry *biv = bivs->find_with_hash (def, REGNO (def));
859 :
860 590544 : if (!biv)
861 : return false;
862 :
863 74618 : *iv = biv->iv;
864 74618 : return true;
865 : }
866 :
867 : static void
868 515926 : record_biv (rtx def, class rtx_iv *iv)
869 : {
870 515926 : class biv_entry *biv = XNEW (class biv_entry);
871 515926 : biv_entry **slot = bivs->find_slot_with_hash (def, REGNO (def), INSERT);
872 :
873 515926 : biv->regno = REGNO (def);
874 515926 : biv->iv = *iv;
875 515926 : gcc_assert (!*slot);
876 515926 : *slot = biv;
877 515926 : }
878 :
879 : /* Determines whether DEF is a biv and if so, stores its description
880 : to *IV. OUTER_MODE is the mode of DEF. */
881 :
882 : static bool
883 590544 : iv_analyze_biv (scalar_int_mode outer_mode, rtx def, class rtx_iv *iv)
884 : {
885 590544 : rtx inner_step, outer_step;
886 590544 : scalar_int_mode inner_mode;
887 590544 : enum iv_extend_code extend;
888 590544 : df_ref last_def;
889 :
890 590544 : if (dump_file)
891 : {
892 217 : fprintf (dump_file, "Analyzing ");
893 217 : print_rtl (dump_file, def);
894 217 : fprintf (dump_file, " for bivness.\n");
895 : }
896 :
897 590544 : if (!REG_P (def))
898 : {
899 0 : if (!CONSTANT_P (def))
900 : return false;
901 :
902 0 : return iv_constant (iv, outer_mode, def);
903 : }
904 :
905 590544 : if (!latch_dominating_def (def, &last_def))
906 : {
907 0 : if (dump_file)
908 0 : fprintf (dump_file, " not simple.\n");
909 : return false;
910 : }
911 :
912 590544 : if (!last_def)
913 0 : return iv_constant (iv, outer_mode, def);
914 :
915 590544 : if (analyzed_for_bivness_p (def, iv))
916 : {
917 74618 : if (dump_file)
918 71 : fprintf (dump_file, " already analysed.\n");
919 74618 : return iv->base != NULL_RTX;
920 : }
921 :
922 515926 : if (!get_biv_step (last_def, outer_mode, def, &inner_step, &inner_mode,
923 : &extend, &outer_step))
924 : {
925 43591 : iv->base = NULL_RTX;
926 43591 : goto end;
927 : }
928 :
929 : /* Loop transforms base to es (base + inner_step) + outer_step,
930 : where es means extend of subreg between inner_mode and outer_mode.
931 : The corresponding induction variable is
932 :
933 : es ((base - outer_step) + i * (inner_step + outer_step)) + outer_step */
934 :
935 472335 : iv->base = simplify_gen_binary (MINUS, outer_mode, def, outer_step);
936 472335 : iv->step = simplify_gen_binary (PLUS, outer_mode, inner_step, outer_step);
937 472335 : iv->mode = inner_mode;
938 472335 : iv->extend_mode = outer_mode;
939 472335 : iv->extend = extend;
940 472335 : iv->mult = const1_rtx;
941 472335 : iv->delta = outer_step;
942 472335 : iv->first_special = inner_mode != outer_mode;
943 :
944 515926 : end:
945 515926 : if (dump_file)
946 : {
947 146 : fprintf (dump_file, " ");
948 146 : dump_iv_info (dump_file, iv);
949 146 : fprintf (dump_file, "\n");
950 : }
951 :
952 515926 : record_biv (def, iv);
953 515926 : return iv->base != NULL_RTX;
954 : }
955 :
956 : /* Analyzes expression RHS used at INSN and stores the result to *IV.
957 : The mode of the induction variable is MODE. */
958 :
959 : bool
960 1666510 : iv_analyze_expr (rtx_insn *insn, scalar_int_mode mode, rtx rhs,
961 : class rtx_iv *iv)
962 : {
963 1666510 : rtx mby = NULL_RTX;
964 1666510 : rtx op0 = NULL_RTX, op1 = NULL_RTX;
965 1666510 : class rtx_iv iv0, iv1;
966 1666510 : enum rtx_code code = GET_CODE (rhs);
967 1666510 : scalar_int_mode omode = mode;
968 :
969 1666510 : iv->base = NULL_RTX;
970 1666510 : iv->step = NULL_RTX;
971 :
972 1666510 : gcc_assert (GET_MODE (rhs) == mode || GET_MODE (rhs) == VOIDmode);
973 :
974 1666510 : if (CONSTANT_P (rhs)
975 1211810 : || REG_P (rhs)
976 661102 : || code == SUBREG)
977 1007761 : return iv_analyze_op (insn, mode, rhs, iv);
978 :
979 658749 : switch (code)
980 : {
981 : case REG:
982 : op0 = rhs;
983 : break;
984 :
985 10884 : case SIGN_EXTEND:
986 10884 : case ZERO_EXTEND:
987 10884 : case NEG:
988 10884 : op0 = XEXP (rhs, 0);
989 : /* We don't know how many bits there are in a sign-extended constant. */
990 10884 : if (!is_a <scalar_int_mode> (GET_MODE (op0), &omode))
991 : return false;
992 : break;
993 :
994 501474 : case PLUS:
995 501474 : case MINUS:
996 501474 : op0 = XEXP (rhs, 0);
997 501474 : op1 = XEXP (rhs, 1);
998 501474 : break;
999 :
1000 1223 : case MULT:
1001 1223 : op0 = XEXP (rhs, 0);
1002 1223 : mby = XEXP (rhs, 1);
1003 1223 : if (!CONSTANT_P (mby))
1004 513 : std::swap (op0, mby);
1005 1223 : if (!CONSTANT_P (mby))
1006 : return false;
1007 : break;
1008 :
1009 2168 : case ASHIFT:
1010 2168 : op0 = XEXP (rhs, 0);
1011 2168 : mby = XEXP (rhs, 1);
1012 2168 : if (!CONSTANT_P (mby))
1013 : return false;
1014 : break;
1015 :
1016 : default:
1017 : return false;
1018 : }
1019 :
1020 515178 : if (op0
1021 515178 : && !iv_analyze_expr (insn, omode, op0, &iv0))
1022 : return false;
1023 :
1024 459970 : if (op1
1025 459970 : && !iv_analyze_expr (insn, omode, op1, &iv1))
1026 : return false;
1027 :
1028 456873 : switch (code)
1029 : {
1030 49 : case SIGN_EXTEND:
1031 49 : if (!iv_extend (&iv0, IV_SIGN_EXTEND, mode))
1032 : return false;
1033 : break;
1034 :
1035 936 : case ZERO_EXTEND:
1036 936 : if (!iv_extend (&iv0, IV_ZERO_EXTEND, mode))
1037 : return false;
1038 : break;
1039 :
1040 51 : case NEG:
1041 51 : if (!iv_neg (&iv0))
1042 : return false;
1043 : break;
1044 :
1045 455634 : case PLUS:
1046 455634 : case MINUS:
1047 455634 : if (!iv_add (&iv0, &iv1, code))
1048 : return false;
1049 : break;
1050 :
1051 104 : case MULT:
1052 104 : if (!iv_mult (&iv0, mby))
1053 : return false;
1054 : break;
1055 :
1056 99 : case ASHIFT:
1057 99 : if (!iv_shift (&iv0, mby))
1058 : return false;
1059 : break;
1060 :
1061 : default:
1062 : break;
1063 : }
1064 :
1065 455926 : *iv = iv0;
1066 455926 : return iv->base != NULL_RTX;
1067 : }
1068 :
1069 : /* Analyzes iv DEF and stores the result to *IV. */
1070 :
1071 : static bool
1072 706109 : iv_analyze_def (df_ref def, class rtx_iv *iv)
1073 : {
1074 706109 : rtx_insn *insn = DF_REF_INSN (def);
1075 706109 : rtx reg = DF_REF_REG (def);
1076 706109 : rtx set, rhs;
1077 :
1078 706109 : if (dump_file)
1079 : {
1080 203 : fprintf (dump_file, "Analyzing def of ");
1081 203 : print_rtl (dump_file, reg);
1082 203 : fprintf (dump_file, " in insn ");
1083 203 : print_rtl_single (dump_file, insn);
1084 : }
1085 :
1086 706109 : check_iv_ref_table_size ();
1087 706109 : if (DF_REF_IV (def))
1088 : {
1089 13067 : if (dump_file)
1090 0 : fprintf (dump_file, " already analysed.\n");
1091 13067 : *iv = *DF_REF_IV (def);
1092 13067 : return iv->base != NULL_RTX;
1093 : }
1094 :
1095 693042 : iv->base = NULL_RTX;
1096 693042 : iv->step = NULL_RTX;
1097 :
1098 693042 : scalar_int_mode mode;
1099 693042 : if (!REG_P (reg) || !is_a <scalar_int_mode> (GET_MODE (reg), &mode))
1100 : return false;
1101 :
1102 692890 : set = single_set (insn);
1103 692890 : if (!set)
1104 : return false;
1105 :
1106 692601 : if (!REG_P (SET_DEST (set)))
1107 : return false;
1108 :
1109 692601 : gcc_assert (SET_DEST (set) == reg);
1110 692601 : rhs = find_reg_equal_equiv_note (insn);
1111 692601 : if (rhs)
1112 7795 : rhs = XEXP (rhs, 0);
1113 : else
1114 684806 : rhs = SET_SRC (set);
1115 :
1116 692601 : iv_analyze_expr (insn, mode, rhs, iv);
1117 692601 : record_iv (def, iv);
1118 :
1119 692601 : if (dump_file)
1120 : {
1121 203 : print_rtl (dump_file, reg);
1122 203 : fprintf (dump_file, " in insn ");
1123 203 : print_rtl_single (dump_file, insn);
1124 203 : fprintf (dump_file, " is ");
1125 203 : dump_iv_info (dump_file, iv);
1126 203 : fprintf (dump_file, "\n");
1127 : }
1128 :
1129 692601 : return iv->base != NULL_RTX;
1130 : }
1131 :
1132 : /* Analyzes operand OP of INSN and stores the result to *IV. MODE is the
1133 : mode of OP. */
1134 :
1135 : static bool
1136 2235671 : iv_analyze_op (rtx_insn *insn, scalar_int_mode mode, rtx op, class rtx_iv *iv)
1137 : {
1138 2235671 : df_ref def = NULL;
1139 2235671 : enum iv_grd_result res;
1140 :
1141 2235671 : if (dump_file)
1142 : {
1143 513 : fprintf (dump_file, "Analyzing operand ");
1144 513 : print_rtl (dump_file, op);
1145 513 : fprintf (dump_file, " of insn ");
1146 513 : print_rtl_single (dump_file, insn);
1147 : }
1148 :
1149 2235671 : if (function_invariant_p (op))
1150 : res = GRD_INVARIANT;
1151 1588418 : else if (GET_CODE (op) == SUBREG)
1152 : {
1153 14209 : scalar_int_mode inner_mode;
1154 14209 : if (!subreg_lowpart_p (op)
1155 27888 : || !is_a <scalar_int_mode> (GET_MODE (SUBREG_REG (op)), &inner_mode))
1156 : return false;
1157 :
1158 13679 : if (!iv_analyze_op (insn, inner_mode, SUBREG_REG (op), iv))
1159 : return false;
1160 :
1161 6665 : return iv_subreg (iv, mode);
1162 : }
1163 : else
1164 : {
1165 1574209 : res = iv_get_reaching_def (insn, op, &def);
1166 1574209 : if (res == GRD_INVALID)
1167 : {
1168 121661 : if (dump_file)
1169 6 : fprintf (dump_file, " not simple.\n");
1170 : return false;
1171 : }
1172 : }
1173 :
1174 1452548 : if (res == GRD_INVARIANT)
1175 : {
1176 925933 : iv_constant (iv, mode, op);
1177 :
1178 925933 : if (dump_file)
1179 : {
1180 221 : fprintf (dump_file, " ");
1181 221 : dump_iv_info (dump_file, iv);
1182 221 : fprintf (dump_file, "\n");
1183 : }
1184 : return true;
1185 : }
1186 :
1187 1173868 : if (res == GRD_MAYBE_BIV)
1188 522405 : return iv_analyze_biv (mode, op, iv);
1189 :
1190 651463 : return iv_analyze_def (def, iv);
1191 : }
1192 :
1193 : /* Analyzes value VAL at INSN and stores the result to *IV. MODE is the
1194 : mode of VAL. */
1195 :
1196 : bool
1197 1214231 : iv_analyze (rtx_insn *insn, scalar_int_mode mode, rtx val, class rtx_iv *iv)
1198 : {
1199 1214231 : rtx reg;
1200 :
1201 : /* We must find the insn in that val is used, so that we get to UD chains.
1202 : Since the function is sometimes called on result of get_condition,
1203 : this does not necessarily have to be directly INSN; scan also the
1204 : following insns. */
1205 1214231 : if (simple_reg_p (val))
1206 : {
1207 964797 : if (GET_CODE (val) == SUBREG)
1208 11816 : reg = SUBREG_REG (val);
1209 : else
1210 964797 : reg = val;
1211 :
1212 964797 : while (!df_find_use (insn, reg))
1213 0 : insn = NEXT_INSN (insn);
1214 : }
1215 :
1216 1214231 : return iv_analyze_op (insn, mode, val, iv);
1217 : }
1218 :
1219 : /* Analyzes definition of DEF in INSN and stores the result to IV. */
1220 :
1221 : bool
1222 54646 : iv_analyze_result (rtx_insn *insn, rtx def, class rtx_iv *iv)
1223 : {
1224 54646 : df_ref adef;
1225 :
1226 54646 : adef = df_find_def (insn, def);
1227 54646 : if (!adef)
1228 : return false;
1229 :
1230 54646 : return iv_analyze_def (adef, iv);
1231 : }
1232 :
1233 : /* Checks whether definition of register REG in INSN is a basic induction
1234 : variable. MODE is the mode of REG.
1235 :
1236 : IV analysis must have been initialized (via a call to
1237 : iv_analysis_loop_init) for this function to produce a result. */
1238 :
1239 : bool
1240 89762 : biv_p (rtx_insn *insn, scalar_int_mode mode, rtx reg)
1241 : {
1242 89762 : class rtx_iv iv;
1243 89762 : df_ref def, last_def;
1244 :
1245 89762 : if (!simple_reg_p (reg))
1246 : return false;
1247 :
1248 85064 : def = df_find_def (insn, reg);
1249 85064 : gcc_assert (def != NULL);
1250 85064 : if (!latch_dominating_def (reg, &last_def))
1251 : return false;
1252 85039 : if (last_def != def)
1253 : return false;
1254 :
1255 68139 : if (!iv_analyze_biv (mode, reg, &iv))
1256 : return false;
1257 :
1258 54648 : return iv.step != const0_rtx;
1259 : }
1260 :
1261 : /* Calculates value of IV at ITERATION-th iteration. */
1262 :
1263 : rtx
1264 79 : get_iv_value (class rtx_iv *iv, rtx iteration)
1265 : {
1266 79 : rtx val;
1267 :
1268 : /* We would need to generate some if_then_else patterns, and so far
1269 : it is not needed anywhere. */
1270 79 : gcc_assert (!iv->first_special);
1271 :
1272 79 : if (iv->step != const0_rtx && iteration != const0_rtx)
1273 0 : val = simplify_gen_binary (PLUS, iv->extend_mode, iv->base,
1274 : simplify_gen_binary (MULT, iv->extend_mode,
1275 : iv->step, iteration));
1276 : else
1277 79 : val = iv->base;
1278 :
1279 79 : if (iv->extend_mode == iv->mode)
1280 : return val;
1281 :
1282 0 : val = lowpart_subreg (iv->mode, val, iv->extend_mode);
1283 :
1284 0 : if (iv->extend == IV_UNKNOWN_EXTEND)
1285 : return val;
1286 :
1287 0 : val = simplify_gen_unary (iv_extend_to_rtx_code (iv->extend),
1288 : iv->extend_mode, val, iv->mode);
1289 0 : val = simplify_gen_binary (PLUS, iv->extend_mode, iv->delta,
1290 : simplify_gen_binary (MULT, iv->extend_mode,
1291 : iv->mult, val));
1292 :
1293 0 : return val;
1294 : }
1295 :
1296 : /* Free the data for an induction variable analysis. */
1297 :
1298 : void
1299 221221 : iv_analysis_done (void)
1300 : {
1301 221221 : if (!clean_slate)
1302 : {
1303 186287 : clear_iv_info ();
1304 186287 : clean_slate = true;
1305 186287 : df_finish_pass (true);
1306 186287 : delete bivs;
1307 186287 : bivs = NULL;
1308 186287 : free (iv_ref_table);
1309 186287 : iv_ref_table = NULL;
1310 186287 : iv_ref_table_size = 0;
1311 : }
1312 221221 : }
1313 :
1314 : /* Computes inverse to X modulo (1 << MOD). */
1315 :
1316 : static uint64_t
1317 395343 : inverse (uint64_t x, int mod)
1318 : {
1319 395343 : uint64_t mask =
1320 395343 : ((uint64_t) 1 << (mod - 1) << 1) - 1;
1321 395343 : uint64_t rslt = 1;
1322 395343 : int i;
1323 :
1324 22089940 : for (i = 0; i < mod - 1; i++)
1325 : {
1326 21694597 : rslt = (rslt * x) & mask;
1327 21694597 : x = (x * x) & mask;
1328 : }
1329 :
1330 395343 : return rslt;
1331 : }
1332 :
1333 : /* Checks whether any register in X is in set ALT. */
1334 :
1335 : static bool
1336 43103001 : altered_reg_used (const_rtx x, bitmap alt)
1337 : {
1338 43103001 : subrtx_iterator::array_type array;
1339 273087557 : FOR_EACH_SUBRTX (iter, array, x, NONCONST)
1340 : {
1341 230647933 : const_rtx x = *iter;
1342 230647933 : if (REG_P (x) && REGNO_REG_SET_P (alt, REGNO (x)))
1343 663377 : return true;
1344 : }
1345 42439624 : return false;
1346 43103001 : }
1347 :
1348 : /* Marks registers altered by EXPR in set ALT. */
1349 :
1350 : static void
1351 10163880 : mark_altered (rtx expr, const_rtx by ATTRIBUTE_UNUSED, void *alt)
1352 : {
1353 10163880 : if (GET_CODE (expr) == SUBREG)
1354 0 : expr = SUBREG_REG (expr);
1355 10163880 : if (!REG_P (expr))
1356 : return;
1357 :
1358 8866483 : SET_REGNO_REG_SET ((bitmap) alt, REGNO (expr));
1359 : }
1360 :
1361 : /* Checks whether RHS is simple enough to process. */
1362 :
1363 : static bool
1364 6725382 : simple_rhs_p (rtx rhs)
1365 : {
1366 6725382 : rtx op0, op1;
1367 :
1368 6725382 : if (function_invariant_p (rhs)
1369 6725382 : || (REG_P (rhs) && !HARD_REGISTER_P (rhs)))
1370 : return true;
1371 :
1372 4384453 : switch (GET_CODE (rhs))
1373 : {
1374 1308478 : case PLUS:
1375 1308478 : case MINUS:
1376 1308478 : case AND:
1377 1308478 : op0 = XEXP (rhs, 0);
1378 1308478 : op1 = XEXP (rhs, 1);
1379 : /* Allow reg OP const and reg OP reg. */
1380 1241440 : if (!(REG_P (op0) && !HARD_REGISTER_P (op0))
1381 1383977 : && !function_invariant_p (op0))
1382 : return false;
1383 643412 : if (!(REG_P (op1) && !HARD_REGISTER_P (op1))
1384 1186705 : && !function_invariant_p (op1))
1385 : return false;
1386 :
1387 : return true;
1388 :
1389 640092 : case ASHIFT:
1390 640092 : case ASHIFTRT:
1391 640092 : case LSHIFTRT:
1392 640092 : case MULT:
1393 640092 : op0 = XEXP (rhs, 0);
1394 640092 : op1 = XEXP (rhs, 1);
1395 : /* Allow reg OP const. */
1396 640092 : if (!(REG_P (op0) && !HARD_REGISTER_P (op0)))
1397 : return false;
1398 622517 : if (!function_invariant_p (op1))
1399 : return false;
1400 :
1401 : return true;
1402 :
1403 : default:
1404 : return false;
1405 : }
1406 : }
1407 :
1408 : /* If any registers in *EXPR that have a single definition, try to replace
1409 : them with the known-equivalent values. */
1410 :
1411 : static void
1412 2327481 : replace_single_def_regs (rtx *expr)
1413 : {
1414 2327481 : subrtx_var_iterator::array_type array;
1415 2413811 : repeat:
1416 14663986 : FOR_EACH_SUBRTX_VAR (iter, array, *expr, NONCONST)
1417 : {
1418 12336505 : rtx x = *iter;
1419 12336505 : if (REG_P (x))
1420 3557545 : if (rtx new_x = df_find_single_def_src (x))
1421 : {
1422 86330 : *expr = simplify_replace_rtx (*expr, x, new_x);
1423 86330 : goto repeat;
1424 : }
1425 : }
1426 2327481 : }
1427 :
1428 : /* A subroutine of simplify_using_initial_values, this function examines INSN
1429 : to see if it contains a suitable set that we can use to make a replacement.
1430 : If it is suitable, return true and set DEST and SRC to the lhs and rhs of
1431 : the set; return false otherwise. */
1432 :
1433 : static bool
1434 16423473 : suitable_set_for_replacement (rtx_insn *insn, rtx *dest, rtx *src)
1435 : {
1436 16423473 : rtx set = single_set (insn);
1437 16423473 : rtx lhs = NULL_RTX, rhs;
1438 :
1439 16423473 : if (!set)
1440 : return false;
1441 :
1442 8022715 : lhs = SET_DEST (set);
1443 8022715 : if (!REG_P (lhs))
1444 : return false;
1445 :
1446 6725382 : rhs = find_reg_equal_equiv_note (insn);
1447 6725382 : if (rhs)
1448 473801 : rhs = XEXP (rhs, 0);
1449 : else
1450 6251581 : rhs = SET_SRC (set);
1451 :
1452 6725382 : if (!simple_rhs_p (rhs))
1453 : return false;
1454 :
1455 4049746 : *dest = lhs;
1456 4049746 : *src = rhs;
1457 4049746 : return true;
1458 : }
1459 :
1460 : /* Using the data returned by suitable_set_for_replacement, replace DEST
1461 : with SRC in *EXPR and return the new expression. Also call
1462 : replace_single_def_regs if the replacement changed something. */
1463 : static void
1464 5370585 : replace_in_expr (rtx *expr, rtx dest, rtx src)
1465 : {
1466 5370585 : rtx old = *expr;
1467 5370585 : *expr = simplify_replace_rtx (*expr, dest, src);
1468 5370585 : if (old == *expr)
1469 : return;
1470 1178012 : replace_single_def_regs (expr);
1471 : }
1472 :
1473 : /* Checks whether A implies B. */
1474 :
1475 : static bool
1476 1971295 : implies_p (rtx a, rtx b)
1477 : {
1478 1971295 : rtx op0, op1, opb0, opb1;
1479 1971295 : machine_mode mode;
1480 :
1481 1971295 : if (rtx_equal_p (a, b))
1482 : return true;
1483 :
1484 1969824 : if (GET_CODE (a) == EQ)
1485 : {
1486 410027 : op0 = XEXP (a, 0);
1487 410027 : op1 = XEXP (a, 1);
1488 :
1489 410027 : if (REG_P (op0)
1490 229404 : || (GET_CODE (op0) == SUBREG
1491 3314 : && REG_P (SUBREG_REG (op0))))
1492 : {
1493 183363 : rtx r = simplify_replace_rtx (b, op0, op1);
1494 183363 : if (r == const_true_rtx)
1495 : return true;
1496 : }
1497 :
1498 392602 : if (REG_P (op1)
1499 293148 : || (GET_CODE (op1) == SUBREG
1500 978 : && REG_P (SUBREG_REG (op1))))
1501 : {
1502 100432 : rtx r = simplify_replace_rtx (b, op1, op0);
1503 100432 : if (r == const_true_rtx)
1504 : return true;
1505 : }
1506 : }
1507 :
1508 1952319 : if (b == const_true_rtx)
1509 : return true;
1510 :
1511 1952319 : if ((GET_RTX_CLASS (GET_CODE (a)) != RTX_COMM_COMPARE
1512 : && GET_RTX_CLASS (GET_CODE (a)) != RTX_COMPARE)
1513 1943308 : || (GET_RTX_CLASS (GET_CODE (b)) != RTX_COMM_COMPARE
1514 : && GET_RTX_CLASS (GET_CODE (b)) != RTX_COMPARE))
1515 : return false;
1516 :
1517 1924982 : op0 = XEXP (a, 0);
1518 1924982 : op1 = XEXP (a, 1);
1519 1924982 : opb0 = XEXP (b, 0);
1520 1924982 : opb1 = XEXP (b, 1);
1521 :
1522 1924982 : mode = GET_MODE (op0);
1523 1924982 : if (mode != GET_MODE (opb0))
1524 : mode = VOIDmode;
1525 1666943 : else if (mode == VOIDmode)
1526 : {
1527 0 : mode = GET_MODE (op1);
1528 0 : if (mode != GET_MODE (opb1))
1529 258039 : mode = VOIDmode;
1530 : }
1531 :
1532 : /* A < B implies A + 1 <= B. */
1533 1924982 : if ((GET_CODE (a) == GT || GET_CODE (a) == LT)
1534 438518 : && (GET_CODE (b) == GE || GET_CODE (b) == LE))
1535 : {
1536 :
1537 40547 : if (GET_CODE (a) == GT)
1538 24943 : std::swap (op0, op1);
1539 :
1540 40547 : if (GET_CODE (b) == GE)
1541 16561 : std::swap (opb0, opb1);
1542 :
1543 40547 : if (SCALAR_INT_MODE_P (mode)
1544 39991 : && rtx_equal_p (op1, opb1)
1545 43841 : && simplify_gen_binary (MINUS, mode, opb0, op0) == const1_rtx)
1546 : return true;
1547 40349 : return false;
1548 : }
1549 :
1550 : /* A < B or A > B imply A != B. TODO: Likewise
1551 : A + n < B implies A != B + n if neither wraps. */
1552 1884435 : if (GET_CODE (b) == NE
1553 : && (GET_CODE (a) == GT || GET_CODE (a) == GTU
1554 : || GET_CODE (a) == LT || GET_CODE (a) == LTU))
1555 : {
1556 154889 : if (rtx_equal_p (op0, opb0)
1557 154889 : && rtx_equal_p (op1, opb1))
1558 : return true;
1559 : }
1560 :
1561 : /* For unsigned comparisons, A != 0 implies A > 0 and A >= 1. */
1562 1857143 : if (GET_CODE (a) == NE
1563 510326 : && op1 == const0_rtx)
1564 : {
1565 287836 : if ((GET_CODE (b) == GTU
1566 27176 : && opb1 == const0_rtx)
1567 287836 : || (GET_CODE (b) == GEU
1568 5539 : && opb1 == const1_rtx))
1569 0 : return rtx_equal_p (op0, opb0);
1570 : }
1571 :
1572 : /* A != N is equivalent to A - (N + 1) <u -1. */
1573 1857143 : if (GET_CODE (a) == NE
1574 510326 : && CONST_INT_P (op1)
1575 357926 : && GET_CODE (b) == LTU
1576 48556 : && opb1 == constm1_rtx
1577 14929 : && GET_CODE (opb0) == PLUS
1578 5350 : && CONST_INT_P (XEXP (opb0, 1))
1579 : /* Avoid overflows. */
1580 553 : && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (opb0, 1))
1581 : != (HOST_WIDE_INT_1U
1582 : << (HOST_BITS_PER_WIDE_INT - 1)) - 1)
1583 553 : && INTVAL (XEXP (opb0, 1)) + 1 == -INTVAL (op1))
1584 286 : return rtx_equal_p (op0, XEXP (opb0, 0));
1585 :
1586 : /* Likewise, A != N implies A - N > 0. */
1587 1856857 : if (GET_CODE (a) == NE
1588 510040 : && CONST_INT_P (op1))
1589 : {
1590 357640 : if (GET_CODE (b) == GTU
1591 33013 : && GET_CODE (opb0) == PLUS
1592 18775 : && opb1 == const0_rtx
1593 0 : && CONST_INT_P (XEXP (opb0, 1))
1594 : /* Avoid overflows. */
1595 0 : && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (opb0, 1))
1596 : != (HOST_WIDE_INT_1U << (HOST_BITS_PER_WIDE_INT - 1)))
1597 357640 : && rtx_equal_p (XEXP (opb0, 0), op0))
1598 0 : return INTVAL (op1) == -INTVAL (XEXP (opb0, 1));
1599 357640 : if (GET_CODE (b) == GEU
1600 9941 : && GET_CODE (opb0) == PLUS
1601 2856 : && opb1 == const1_rtx
1602 0 : && CONST_INT_P (XEXP (opb0, 1))
1603 : /* Avoid overflows. */
1604 0 : && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (opb0, 1))
1605 : != (HOST_WIDE_INT_1U << (HOST_BITS_PER_WIDE_INT - 1)))
1606 357640 : && rtx_equal_p (XEXP (opb0, 0), op0))
1607 0 : return INTVAL (op1) == -INTVAL (XEXP (opb0, 1));
1608 : }
1609 :
1610 : /* A >s X, where X is positive, implies A <u Y, if Y is negative. */
1611 1856857 : if ((GET_CODE (a) == GT || GET_CODE (a) == GE)
1612 272710 : && CONST_INT_P (op1)
1613 186503 : && ((GET_CODE (a) == GT && op1 == constm1_rtx)
1614 157868 : || INTVAL (op1) >= 0)
1615 175413 : && GET_CODE (b) == LTU
1616 8154 : && CONST_INT_P (opb1)
1617 1864473 : && rtx_equal_p (op0, opb0))
1618 762 : return INTVAL (opb1) < 0;
1619 :
1620 : return false;
1621 : }
1622 :
1623 : /* Canonicalizes COND so that
1624 :
1625 : (1) Ensure that operands are ordered according to
1626 : swap_commutative_operands_p.
1627 : (2) (LE x const) will be replaced with (LT x <const+1>) and similarly
1628 : for GE, GEU, and LEU. */
1629 :
1630 : rtx
1631 1965162 : canon_condition (rtx cond)
1632 : {
1633 1965162 : rtx op0, op1;
1634 1965162 : enum rtx_code code;
1635 1965162 : machine_mode mode;
1636 :
1637 1965162 : code = GET_CODE (cond);
1638 1965162 : op0 = XEXP (cond, 0);
1639 1965162 : op1 = XEXP (cond, 1);
1640 :
1641 1965162 : if (swap_commutative_operands_p (op0, op1))
1642 : {
1643 178253 : code = swap_condition (code);
1644 178253 : std::swap (op0, op1);
1645 : }
1646 :
1647 1965162 : mode = GET_MODE (op0);
1648 1965162 : if (mode == VOIDmode)
1649 0 : mode = GET_MODE (op1);
1650 1965162 : gcc_assert (mode != VOIDmode);
1651 :
1652 1965162 : if (CONST_SCALAR_INT_P (op1) && GET_MODE_CLASS (mode) != MODE_CC)
1653 : {
1654 1304790 : rtx_mode_t const_val (op1, mode);
1655 :
1656 1304790 : switch (code)
1657 : {
1658 68338 : case LE:
1659 68338 : if (wi::ne_p (const_val, wi::max_value (mode, SIGNED)))
1660 : {
1661 68338 : code = LT;
1662 68338 : op1 = immed_wide_int_const (wi::add (const_val, 1), mode);
1663 : }
1664 : break;
1665 :
1666 114992 : case GE:
1667 114992 : if (wi::ne_p (const_val, wi::min_value (mode, SIGNED)))
1668 : {
1669 114992 : code = GT;
1670 114992 : op1 = immed_wide_int_const (wi::sub (const_val, 1), mode);
1671 : }
1672 : break;
1673 :
1674 34402 : case LEU:
1675 34402 : if (wi::ne_p (const_val, -1))
1676 : {
1677 34402 : code = LTU;
1678 34402 : op1 = immed_wide_int_const (wi::add (const_val, 1), mode);
1679 : }
1680 : break;
1681 :
1682 88086 : case GEU:
1683 88086 : if (wi::ne_p (const_val, 0))
1684 : {
1685 88086 : code = GTU;
1686 88086 : op1 = immed_wide_int_const (wi::sub (const_val, 1), mode);
1687 : }
1688 : break;
1689 :
1690 : default:
1691 : break;
1692 : }
1693 : }
1694 :
1695 1965162 : if (op0 != XEXP (cond, 0)
1696 1786909 : || op1 != XEXP (cond, 1)
1697 1524687 : || code != GET_CODE (cond)
1698 1524687 : || GET_MODE (cond) != SImode)
1699 1422316 : cond = gen_rtx_fmt_ee (code, SImode, op0, op1);
1700 :
1701 1965162 : return cond;
1702 : }
1703 :
1704 : /* Reverses CONDition; returns NULL if we cannot. */
1705 :
1706 : static rtx
1707 1784941 : reversed_condition (rtx cond)
1708 : {
1709 1784941 : enum rtx_code reversed;
1710 1784941 : reversed = reversed_comparison_code (cond, NULL);
1711 1784941 : if (reversed == UNKNOWN)
1712 : return NULL_RTX;
1713 : else
1714 1775280 : return gen_rtx_fmt_ee (reversed,
1715 : GET_MODE (cond), XEXP (cond, 0),
1716 : XEXP (cond, 1));
1717 : }
1718 :
1719 : /* Tries to use the fact that COND holds to simplify EXPR. ALTERED is the
1720 : set of altered regs. */
1721 :
1722 : void
1723 1228492 : simplify_using_condition (rtx cond, rtx *expr, regset altered)
1724 : {
1725 1228492 : rtx rev, reve, exp = *expr;
1726 :
1727 : /* If some register gets altered later, we do not really speak about its
1728 : value at the time of comparison. */
1729 1228492 : if (altered && altered_reg_used (cond, altered))
1730 : return;
1731 :
1732 1204111 : if (GET_CODE (cond) == EQ
1733 226430 : && REG_P (XEXP (cond, 0)) && CONSTANT_P (XEXP (cond, 1)))
1734 : {
1735 65003 : *expr = simplify_replace_rtx (*expr, XEXP (cond, 0), XEXP (cond, 1));
1736 65003 : return;
1737 : }
1738 :
1739 1139108 : if (!COMPARISON_P (exp))
1740 : return;
1741 :
1742 491640 : rev = reversed_condition (cond);
1743 491640 : reve = reversed_condition (exp);
1744 :
1745 491640 : cond = canon_condition (cond);
1746 491640 : exp = canon_condition (exp);
1747 491640 : if (rev)
1748 490242 : rev = canon_condition (rev);
1749 491640 : if (reve)
1750 491640 : reve = canon_condition (reve);
1751 :
1752 491640 : if (rtx_equal_p (exp, cond))
1753 : {
1754 6277 : *expr = const_true_rtx;
1755 6277 : return;
1756 : }
1757 :
1758 485363 : if (rev && rtx_equal_p (exp, rev))
1759 : {
1760 942 : *expr = const0_rtx;
1761 942 : return;
1762 : }
1763 :
1764 484421 : if (implies_p (cond, exp))
1765 : {
1766 28333 : *expr = const_true_rtx;
1767 28333 : return;
1768 : }
1769 :
1770 456088 : if (reve && implies_p (cond, reve))
1771 : {
1772 290 : *expr = const0_rtx;
1773 290 : return;
1774 : }
1775 :
1776 : /* A proof by contradiction. If *EXPR implies (not cond), *EXPR must
1777 : be false. */
1778 455798 : if (rev && implies_p (exp, rev))
1779 : {
1780 8362 : *expr = const0_rtx;
1781 8362 : return;
1782 : }
1783 :
1784 : /* Similarly, If (not *EXPR) implies (not cond), *EXPR must be true. */
1785 447436 : if (rev && reve && implies_p (reve, rev))
1786 : {
1787 1199 : *expr = const_true_rtx;
1788 1199 : return;
1789 : }
1790 :
1791 : /* We would like to have some other tests here. TODO. */
1792 :
1793 : return;
1794 : }
1795 :
1796 : /* Use relationship between A and *B to eventually eliminate *B.
1797 : OP is the operation we consider. */
1798 :
1799 : static void
1800 130348 : eliminate_implied_condition (enum rtx_code op, rtx a, rtx *b)
1801 : {
1802 130348 : switch (op)
1803 : {
1804 0 : case AND:
1805 : /* If A implies *B, we may replace *B by true. */
1806 0 : if (implies_p (a, *b))
1807 0 : *b = const_true_rtx;
1808 : break;
1809 :
1810 130348 : case IOR:
1811 : /* If *B implies A, we may replace *B by false. */
1812 130348 : if (implies_p (*b, a))
1813 9315 : *b = const0_rtx;
1814 : break;
1815 :
1816 0 : default:
1817 0 : gcc_unreachable ();
1818 : }
1819 130348 : }
1820 :
1821 : /* Eliminates the conditions in TAIL that are implied by HEAD. OP is the
1822 : operation we consider. */
1823 :
1824 : static void
1825 651778 : eliminate_implied_conditions (enum rtx_code op, rtx *head, rtx tail)
1826 : {
1827 651778 : rtx elt;
1828 :
1829 716952 : for (elt = tail; elt; elt = XEXP (elt, 1))
1830 65174 : eliminate_implied_condition (op, *head, &XEXP (elt, 0));
1831 716952 : for (elt = tail; elt; elt = XEXP (elt, 1))
1832 65174 : eliminate_implied_condition (op, XEXP (elt, 0), head);
1833 651778 : }
1834 :
1835 : /* Simplifies *EXPR using initial values at the start of the LOOP. If *EXPR
1836 : is a list, its elements are assumed to be combined using OP. */
1837 :
1838 : static void
1839 4868533 : simplify_using_initial_values (class loop *loop, enum rtx_code op, rtx *expr)
1840 : {
1841 4868533 : bool expression_valid;
1842 4868533 : rtx head, tail, last_valid_expr;
1843 4868533 : rtx_expr_list *cond_list;
1844 4868533 : rtx_insn *insn;
1845 4868533 : rtx neutral, aggr;
1846 4868533 : regset altered, this_altered;
1847 4868533 : edge e;
1848 :
1849 4868533 : if (!*expr)
1850 3719066 : return;
1851 :
1852 2352317 : if (CONSTANT_P (*expr))
1853 : return;
1854 :
1855 1801247 : if (GET_CODE (*expr) == EXPR_LIST)
1856 : {
1857 651778 : head = XEXP (*expr, 0);
1858 651778 : tail = XEXP (*expr, 1);
1859 :
1860 651778 : eliminate_implied_conditions (op, &head, tail);
1861 :
1862 651778 : switch (op)
1863 : {
1864 5040 : case AND:
1865 5040 : neutral = const_true_rtx;
1866 5040 : aggr = const0_rtx;
1867 5040 : break;
1868 :
1869 646738 : case IOR:
1870 646738 : neutral = const0_rtx;
1871 646738 : aggr = const_true_rtx;
1872 646738 : break;
1873 :
1874 0 : default:
1875 0 : gcc_unreachable ();
1876 : }
1877 :
1878 651778 : simplify_using_initial_values (loop, UNKNOWN, &head);
1879 651778 : if (head == aggr)
1880 : {
1881 9 : XEXP (*expr, 0) = aggr;
1882 9 : XEXP (*expr, 1) = NULL_RTX;
1883 9 : return;
1884 : }
1885 651769 : else if (head == neutral)
1886 : {
1887 390134 : *expr = tail;
1888 390134 : simplify_using_initial_values (loop, op, expr);
1889 390134 : return;
1890 : }
1891 261635 : simplify_using_initial_values (loop, op, &tail);
1892 :
1893 261635 : if (tail && XEXP (tail, 0) == aggr)
1894 : {
1895 0 : *expr = tail;
1896 0 : return;
1897 : }
1898 :
1899 261635 : XEXP (*expr, 0) = head;
1900 261635 : XEXP (*expr, 1) = tail;
1901 261635 : return;
1902 : }
1903 :
1904 1149469 : gcc_assert (op == UNKNOWN);
1905 :
1906 1149469 : replace_single_def_regs (expr);
1907 1149469 : if (CONSTANT_P (*expr))
1908 : return;
1909 :
1910 1149467 : e = loop_preheader_edge (loop);
1911 1149467 : if (e->src == ENTRY_BLOCK_PTR_FOR_FN (cfun))
1912 : return;
1913 :
1914 1149467 : altered = ALLOC_REG_SET (®_obstack);
1915 1149467 : this_altered = ALLOC_REG_SET (®_obstack);
1916 :
1917 1149467 : expression_valid = true;
1918 1149467 : last_valid_expr = *expr;
1919 1149467 : cond_list = NULL;
1920 2086904 : while (1)
1921 : {
1922 2086904 : insn = BB_END (e->src);
1923 2086904 : if (any_condjump_p (insn) && onlyjump_p (insn))
1924 : {
1925 901221 : rtx cond = get_condition (BB_END (e->src), NULL, false, true);
1926 :
1927 901221 : if (cond && (e->flags & EDGE_FALLTHRU))
1928 614839 : cond = reversed_condition (cond);
1929 892174 : if (cond)
1930 : {
1931 887721 : rtx old = *expr;
1932 887721 : simplify_using_condition (cond, expr, altered);
1933 887721 : if (old != *expr)
1934 : {
1935 43575 : rtx note;
1936 43575 : if (CONSTANT_P (*expr))
1937 42996 : goto out;
1938 971 : for (note = cond_list; note; note = XEXP (note, 1))
1939 : {
1940 511 : simplify_using_condition (XEXP (note, 0), expr, altered);
1941 511 : if (CONSTANT_P (*expr))
1942 119 : goto out;
1943 : }
1944 : }
1945 844606 : cond_list = alloc_EXPR_LIST (0, cond, cond_list);
1946 : }
1947 : }
1948 :
1949 19929224 : FOR_BB_INSNS_REVERSE (e->src, insn)
1950 : {
1951 18555023 : rtx src, dest;
1952 18555023 : rtx old = *expr;
1953 :
1954 18555023 : if (!INSN_P (insn))
1955 2131550 : continue;
1956 :
1957 16423473 : CLEAR_REG_SET (this_altered);
1958 16423473 : note_stores (insn, mark_altered, this_altered);
1959 16423473 : if (CALL_P (insn))
1960 : {
1961 : /* Kill all registers that might be clobbered by the call.
1962 : We don't track modes of hard registers, so we need to be
1963 : conservative and assume that partial kills are full kills. */
1964 139017 : function_abi callee_abi = insn_callee_abi (insn);
1965 139017 : IOR_REG_SET_HRS (this_altered,
1966 : callee_abi.full_and_partial_reg_clobbers ());
1967 : }
1968 :
1969 16423473 : if (suitable_set_for_replacement (insn, &dest, &src))
1970 : {
1971 4049746 : rtx_expr_list **pnote, **pnote_next;
1972 :
1973 4049746 : replace_in_expr (expr, dest, src);
1974 4049746 : if (CONSTANT_P (*expr))
1975 669588 : goto out;
1976 :
1977 5044193 : for (pnote = &cond_list; *pnote; pnote = pnote_next)
1978 : {
1979 1320839 : rtx_expr_list *note = *pnote;
1980 1320839 : rtx old_cond = XEXP (note, 0);
1981 :
1982 1320839 : pnote_next = (rtx_expr_list **)&XEXP (note, 1);
1983 1320839 : replace_in_expr (&XEXP (note, 0), dest, src);
1984 :
1985 : /* We can no longer use a condition that has been simplified
1986 : to a constant, and simplify_using_condition will abort if
1987 : we try. */
1988 1320839 : if (CONSTANT_P (XEXP (note, 0)))
1989 : {
1990 28 : *pnote = *pnote_next;
1991 28 : pnote_next = pnote;
1992 28 : free_EXPR_LIST_node (note);
1993 : }
1994 : /* Retry simplifications with this condition if either the
1995 : expression or the condition changed. */
1996 1320811 : else if (old_cond != XEXP (note, 0) || old != *expr)
1997 340260 : simplify_using_condition (XEXP (note, 0), expr, altered);
1998 : }
1999 : }
2000 : else
2001 : {
2002 12373727 : rtx_expr_list **pnote, **pnote_next;
2003 :
2004 : /* If we did not use this insn to make a replacement, any overlap
2005 : between stores in this insn and our expression will cause the
2006 : expression to become invalid. */
2007 12373727 : if (altered_reg_used (*expr, this_altered))
2008 339105 : goto out;
2009 :
2010 : /* Likewise for the conditions. */
2011 25781519 : for (pnote = &cond_list; *pnote; pnote = pnote_next)
2012 : {
2013 13746897 : rtx_expr_list *note = *pnote;
2014 13746897 : rtx old_cond = XEXP (note, 0);
2015 :
2016 13746897 : pnote_next = (rtx_expr_list **)&XEXP (note, 1);
2017 13746897 : if (altered_reg_used (old_cond, this_altered))
2018 : {
2019 207184 : *pnote = *pnote_next;
2020 207184 : pnote_next = pnote;
2021 207184 : free_EXPR_LIST_node (note);
2022 : }
2023 : }
2024 : }
2025 :
2026 15757976 : if (CONSTANT_P (*expr))
2027 4091 : goto out;
2028 :
2029 15753885 : IOR_REG_SET (altered, this_altered);
2030 :
2031 : /* If the expression now contains regs that have been altered, we
2032 : can't return it to the caller. However, it is still valid for
2033 : further simplification, so keep searching to see if we can
2034 : eventually turn it into a constant. */
2035 15753885 : if (altered_reg_used (*expr, altered))
2036 : expression_valid = false;
2037 15661178 : if (expression_valid)
2038 15659414 : last_valid_expr = *expr;
2039 : }
2040 :
2041 1374201 : if (!single_pred_p (e->src)
2042 1374201 : || single_pred (e->src) == ENTRY_BLOCK_PTR_FOR_FN (cfun))
2043 : break;
2044 : e = single_pred_edge (e->src);
2045 : }
2046 :
2047 1149467 : out:
2048 1149467 : free_EXPR_LIST_list (&cond_list);
2049 1149467 : if (!CONSTANT_P (*expr))
2050 775869 : *expr = last_valid_expr;
2051 1149467 : FREE_REG_SET (altered);
2052 1149467 : FREE_REG_SET (this_altered);
2053 : }
2054 :
2055 : /* Transforms invariant IV into MODE. Adds assumptions based on the fact
2056 : that IV occurs as left operands of comparison COND and its signedness
2057 : is SIGNED_P to DESC. */
2058 :
2059 : static void
2060 1 : shorten_into_mode (class rtx_iv *iv, scalar_int_mode mode,
2061 : enum rtx_code cond, bool signed_p, class niter_desc *desc)
2062 : {
2063 1 : rtx mmin, mmax, cond_over, cond_under;
2064 :
2065 1 : get_mode_bounds (mode, signed_p, iv->extend_mode, &mmin, &mmax);
2066 1 : cond_under = simplify_gen_relational (LT, SImode, iv->extend_mode,
2067 : iv->base, mmin);
2068 1 : cond_over = simplify_gen_relational (GT, SImode, iv->extend_mode,
2069 : iv->base, mmax);
2070 :
2071 1 : switch (cond)
2072 : {
2073 0 : case LE:
2074 0 : case LT:
2075 0 : case LEU:
2076 0 : case LTU:
2077 0 : if (cond_under != const0_rtx)
2078 0 : desc->infinite =
2079 0 : alloc_EXPR_LIST (0, cond_under, desc->infinite);
2080 0 : if (cond_over != const0_rtx)
2081 0 : desc->noloop_assumptions =
2082 0 : alloc_EXPR_LIST (0, cond_over, desc->noloop_assumptions);
2083 : break;
2084 :
2085 1 : case GE:
2086 1 : case GT:
2087 1 : case GEU:
2088 1 : case GTU:
2089 1 : if (cond_over != const0_rtx)
2090 1 : desc->infinite =
2091 1 : alloc_EXPR_LIST (0, cond_over, desc->infinite);
2092 1 : if (cond_under != const0_rtx)
2093 1 : desc->noloop_assumptions =
2094 1 : alloc_EXPR_LIST (0, cond_under, desc->noloop_assumptions);
2095 : break;
2096 :
2097 0 : case NE:
2098 0 : if (cond_over != const0_rtx)
2099 0 : desc->infinite =
2100 0 : alloc_EXPR_LIST (0, cond_over, desc->infinite);
2101 0 : if (cond_under != const0_rtx)
2102 0 : desc->infinite =
2103 0 : alloc_EXPR_LIST (0, cond_under, desc->infinite);
2104 : break;
2105 :
2106 0 : default:
2107 0 : gcc_unreachable ();
2108 : }
2109 :
2110 1 : iv->mode = mode;
2111 1 : iv->extend = signed_p ? IV_SIGN_EXTEND : IV_ZERO_EXTEND;
2112 1 : }
2113 :
2114 : /* Transforms IV0 and IV1 compared by COND so that they are both compared as
2115 : subregs of the same mode if possible (sometimes it is necessary to add
2116 : some assumptions to DESC). */
2117 :
2118 : static bool
2119 429937 : canonicalize_iv_subregs (class rtx_iv *iv0, class rtx_iv *iv1,
2120 : enum rtx_code cond, class niter_desc *desc)
2121 : {
2122 429937 : scalar_int_mode comp_mode;
2123 429937 : bool signed_p;
2124 :
2125 : /* If the ivs behave specially in the first iteration, or are
2126 : added/multiplied after extending, we ignore them. */
2127 429937 : if (iv0->first_special || iv0->mult != const1_rtx || iv0->delta != const0_rtx)
2128 : return false;
2129 429936 : if (iv1->first_special || iv1->mult != const1_rtx || iv1->delta != const0_rtx)
2130 : return false;
2131 :
2132 : /* If there is some extend, it must match signedness of the comparison. */
2133 429936 : switch (cond)
2134 : {
2135 34101 : case LE:
2136 34101 : case LT:
2137 34101 : if (iv0->extend == IV_ZERO_EXTEND
2138 34101 : || iv1->extend == IV_ZERO_EXTEND)
2139 : return false;
2140 : signed_p = true;
2141 : break;
2142 :
2143 30837 : case LEU:
2144 30837 : case LTU:
2145 30837 : if (iv0->extend == IV_SIGN_EXTEND
2146 30837 : || iv1->extend == IV_SIGN_EXTEND)
2147 : return false;
2148 : signed_p = false;
2149 : break;
2150 :
2151 364998 : case NE:
2152 364998 : if (iv0->extend != IV_UNKNOWN_EXTEND
2153 0 : && iv1->extend != IV_UNKNOWN_EXTEND
2154 0 : && iv0->extend != iv1->extend)
2155 : return false;
2156 :
2157 364998 : signed_p = false;
2158 364998 : if (iv0->extend != IV_UNKNOWN_EXTEND)
2159 0 : signed_p = iv0->extend == IV_SIGN_EXTEND;
2160 364998 : if (iv1->extend != IV_UNKNOWN_EXTEND)
2161 0 : signed_p = iv1->extend == IV_SIGN_EXTEND;
2162 : break;
2163 :
2164 0 : default:
2165 0 : gcc_unreachable ();
2166 : }
2167 :
2168 : /* Values of both variables should be computed in the same mode. These
2169 : might indeed be different, if we have comparison like
2170 :
2171 : (compare (subreg:SI (iv0)) (subreg:SI (iv1)))
2172 :
2173 : and iv0 and iv1 are both ivs iterating in SI mode, but calculated
2174 : in different modes. This does not seem impossible to handle, but
2175 : it hardly ever occurs in practice.
2176 :
2177 : The only exception is the case when one of operands is invariant.
2178 : For example pentium 3 generates comparisons like
2179 : (lt (subreg:HI (reg:SI)) 100). Here we assign HImode to 100, but we
2180 : definitely do not want this prevent the optimization. */
2181 429936 : comp_mode = iv0->extend_mode;
2182 1289808 : if (GET_MODE_BITSIZE (comp_mode) < GET_MODE_BITSIZE (iv1->extend_mode))
2183 429936 : comp_mode = iv1->extend_mode;
2184 :
2185 429936 : if (iv0->extend_mode != comp_mode)
2186 : {
2187 481 : if (iv0->mode != iv0->extend_mode
2188 481 : || iv0->step != const0_rtx)
2189 : return false;
2190 :
2191 463 : iv0->base = simplify_gen_unary (signed_p ? SIGN_EXTEND : ZERO_EXTEND,
2192 : comp_mode, iv0->base, iv0->mode);
2193 463 : iv0->extend_mode = comp_mode;
2194 : }
2195 :
2196 429918 : if (iv1->extend_mode != comp_mode)
2197 : {
2198 5820 : if (iv1->mode != iv1->extend_mode
2199 5820 : || iv1->step != const0_rtx)
2200 : return false;
2201 :
2202 5806 : iv1->base = simplify_gen_unary (signed_p ? SIGN_EXTEND : ZERO_EXTEND,
2203 : comp_mode, iv1->base, iv1->mode);
2204 5806 : iv1->extend_mode = comp_mode;
2205 : }
2206 :
2207 : /* Check that both ivs belong to a range of a single mode. If one of the
2208 : operands is an invariant, we may need to shorten it into the common
2209 : mode. */
2210 429904 : if (iv0->mode == iv0->extend_mode
2211 423634 : && iv0->step == const0_rtx
2212 561038 : && iv0->mode != iv1->mode)
2213 0 : shorten_into_mode (iv0, iv1->mode, cond, signed_p, desc);
2214 :
2215 429904 : if (iv1->mode == iv1->extend_mode
2216 423635 : && iv1->step == const0_rtx
2217 729008 : && iv0->mode != iv1->mode)
2218 1 : shorten_into_mode (iv1, iv0->mode, swap_condition (cond), signed_p, desc);
2219 :
2220 429904 : if (iv0->mode != iv1->mode)
2221 : return false;
2222 :
2223 429904 : desc->mode = iv0->mode;
2224 429904 : desc->signed_p = signed_p;
2225 :
2226 429904 : return true;
2227 : }
2228 :
2229 : /* Tries to estimate the maximum number of iterations in LOOP, and return the
2230 : result. This function is called from iv_number_of_iterations with
2231 : a number of fields in DESC already filled in. OLD_NITER is the original
2232 : expression for the number of iterations, before we tried to simplify it. */
2233 :
2234 : static uint64_t
2235 210021 : determine_max_iter (class loop *loop, class niter_desc *desc, rtx old_niter)
2236 : {
2237 210021 : rtx niter = desc->niter_expr;
2238 210021 : rtx mmin, mmax, cmp;
2239 210021 : uint64_t nmax, inc;
2240 210021 : uint64_t andmax = 0;
2241 :
2242 : /* We used to look for constant operand 0 of AND,
2243 : but canonicalization should always make this impossible. */
2244 210021 : gcc_checking_assert (GET_CODE (niter) != AND
2245 : || !CONST_INT_P (XEXP (niter, 0)));
2246 :
2247 210021 : if (GET_CODE (niter) == AND
2248 11000 : && CONST_INT_P (XEXP (niter, 1)))
2249 : {
2250 11000 : andmax = UINTVAL (XEXP (niter, 1));
2251 11000 : niter = XEXP (niter, 0);
2252 : }
2253 :
2254 210021 : get_mode_bounds (desc->mode, desc->signed_p, desc->mode, &mmin, &mmax);
2255 210021 : nmax = UINTVAL (mmax) - UINTVAL (mmin);
2256 :
2257 210021 : if (GET_CODE (niter) == UDIV)
2258 : {
2259 2855 : if (!CONST_INT_P (XEXP (niter, 1)))
2260 : return nmax;
2261 2855 : inc = INTVAL (XEXP (niter, 1));
2262 2855 : niter = XEXP (niter, 0);
2263 : }
2264 : else
2265 : inc = 1;
2266 :
2267 : /* We could use a binary search here, but for now improving the upper
2268 : bound by just one eliminates one important corner case. */
2269 210021 : cmp = simplify_gen_relational (desc->signed_p ? LT : LTU, VOIDmode,
2270 : desc->mode, old_niter, mmax);
2271 210021 : simplify_using_initial_values (loop, UNKNOWN, &cmp);
2272 210021 : if (cmp == const_true_rtx)
2273 : {
2274 115829 : nmax--;
2275 :
2276 115829 : if (dump_file)
2277 15 : fprintf (dump_file, ";; improved upper bound by one.\n");
2278 : }
2279 210021 : nmax /= inc;
2280 210021 : if (andmax)
2281 11000 : nmax = MIN (nmax, andmax);
2282 210021 : if (dump_file)
2283 24 : fprintf (dump_file, ";; Determined upper bound %" PRId64".\n",
2284 : nmax);
2285 : return nmax;
2286 : }
2287 :
2288 : /* Computes number of iterations of the CONDITION in INSN in LOOP and stores
2289 : the result into DESC. Very similar to determine_number_of_iterations
2290 : (basically its rtl version), complicated by things like subregs. */
2291 :
2292 : static void
2293 744392 : iv_number_of_iterations (class loop *loop, rtx_insn *insn, rtx condition,
2294 : class niter_desc *desc)
2295 : {
2296 744392 : rtx op0, op1, delta, step, bound, may_xform, tmp, tmp0, tmp1;
2297 744392 : class rtx_iv iv0, iv1;
2298 744392 : rtx assumption, may_not_xform;
2299 744392 : enum rtx_code cond;
2300 744392 : machine_mode nonvoid_mode;
2301 744392 : scalar_int_mode comp_mode;
2302 744392 : rtx mmin, mmax, mode_mmin, mode_mmax;
2303 744392 : uint64_t s, size, d, inv, max, up, down;
2304 744392 : int64_t inc, step_val;
2305 744392 : int was_sharp = false;
2306 744392 : rtx old_niter;
2307 744392 : bool step_is_pow2;
2308 :
2309 : /* The meaning of these assumptions is this:
2310 : if !assumptions
2311 : then the rest of information does not have to be valid
2312 : if noloop_assumptions then the loop does not roll
2313 : if infinite then this exit is never used */
2314 :
2315 744392 : desc->assumptions = NULL_RTX;
2316 744392 : desc->noloop_assumptions = NULL_RTX;
2317 744392 : desc->infinite = NULL_RTX;
2318 744392 : desc->simple_p = true;
2319 :
2320 744392 : desc->const_iter = false;
2321 744392 : desc->niter_expr = NULL_RTX;
2322 :
2323 744392 : cond = GET_CODE (condition);
2324 744392 : gcc_assert (COMPARISON_P (condition));
2325 :
2326 744392 : nonvoid_mode = GET_MODE (XEXP (condition, 0));
2327 744392 : if (nonvoid_mode == VOIDmode)
2328 0 : nonvoid_mode = GET_MODE (XEXP (condition, 1));
2329 : /* The constant comparisons should be folded. */
2330 744392 : gcc_assert (nonvoid_mode != VOIDmode);
2331 :
2332 : /* We only handle integers or pointers. */
2333 744392 : scalar_int_mode mode;
2334 744392 : if (!is_a <scalar_int_mode> (nonvoid_mode, &mode))
2335 492 : goto fail;
2336 :
2337 743900 : op0 = XEXP (condition, 0);
2338 743900 : if (!iv_analyze (insn, mode, op0, &iv0))
2339 273569 : goto fail;
2340 :
2341 470331 : op1 = XEXP (condition, 1);
2342 470331 : if (!iv_analyze (insn, mode, op1, &iv1))
2343 36885 : goto fail;
2344 :
2345 866641 : if (GET_MODE_BITSIZE (iv0.extend_mode) > HOST_BITS_PER_WIDE_INT
2346 866641 : || GET_MODE_BITSIZE (iv1.extend_mode) > HOST_BITS_PER_WIDE_INT)
2347 257 : goto fail;
2348 :
2349 : /* Check condition and normalize it. */
2350 :
2351 433189 : switch (cond)
2352 : {
2353 29178 : case GE:
2354 29178 : case GT:
2355 29178 : case GEU:
2356 29178 : case GTU:
2357 29178 : std::swap (iv0, iv1);
2358 29178 : cond = swap_condition (cond);
2359 29178 : break;
2360 : case NE:
2361 : case LE:
2362 : case LEU:
2363 : case LT:
2364 : case LTU:
2365 : break;
2366 3252 : default:
2367 3252 : goto fail;
2368 : }
2369 :
2370 : /* Handle extends. This is relatively nontrivial, so we only try in some
2371 : easy cases, when we can canonicalize the ivs (possibly by adding some
2372 : assumptions) to shape subreg (base + i * step). This function also fills
2373 : in desc->mode and desc->signed_p. */
2374 :
2375 429937 : if (!canonicalize_iv_subregs (&iv0, &iv1, cond, desc))
2376 33 : goto fail;
2377 :
2378 429904 : comp_mode = iv0.extend_mode;
2379 429904 : mode = iv0.mode;
2380 429904 : size = GET_MODE_PRECISION (mode);
2381 429904 : get_mode_bounds (mode, (cond == LE || cond == LT), comp_mode, &mmin, &mmax);
2382 429904 : mode_mmin = lowpart_subreg (mode, mmin, comp_mode);
2383 429904 : mode_mmax = lowpart_subreg (mode, mmax, comp_mode);
2384 :
2385 429904 : if (!CONST_INT_P (iv0.step) || !CONST_INT_P (iv1.step))
2386 0 : goto fail;
2387 :
2388 : /* We can take care of the case of two induction variables chasing each other
2389 : if the test is NE. I have never seen a loop using it, but still it is
2390 : cool. */
2391 429904 : if (iv0.step != const0_rtx && iv1.step != const0_rtx)
2392 : {
2393 394 : if (cond != NE)
2394 228 : goto fail;
2395 :
2396 166 : iv0.step = simplify_gen_binary (MINUS, comp_mode, iv0.step, iv1.step);
2397 166 : iv1.step = const0_rtx;
2398 : }
2399 :
2400 429676 : iv0.step = lowpart_subreg (mode, iv0.step, comp_mode);
2401 429676 : iv1.step = lowpart_subreg (mode, iv1.step, comp_mode);
2402 :
2403 : /* This is either infinite loop or the one that ends immediately, depending
2404 : on initial values. Unswitching should remove this kind of conditions. */
2405 429676 : if (iv0.step == const0_rtx && iv1.step == const0_rtx)
2406 7134 : goto fail;
2407 :
2408 422542 : if (cond != NE)
2409 : {
2410 59810 : if (iv0.step == const0_rtx)
2411 8198 : step_val = -INTVAL (iv1.step);
2412 : else
2413 51612 : step_val = INTVAL (iv0.step);
2414 :
2415 : /* Ignore loops of while (i-- < 10) type. */
2416 59810 : if (step_val < 0)
2417 3167 : goto fail;
2418 :
2419 56643 : step_is_pow2 = !(step_val & (step_val - 1));
2420 : }
2421 : else
2422 : {
2423 : /* We do not care about whether the step is power of two in this
2424 : case. */
2425 : step_is_pow2 = false;
2426 432396 : step_val = 0;
2427 : }
2428 :
2429 : /* Some more condition normalization. We must record some assumptions
2430 : due to overflows. */
2431 56643 : switch (cond)
2432 : {
2433 43622 : case LT:
2434 43622 : case LTU:
2435 : /* We want to take care only of non-sharp relationals; this is easy,
2436 : as in cases the overflow would make the transformation unsafe
2437 : the loop does not roll. Seemingly it would make more sense to want
2438 : to take care of sharp relationals instead, as NE is more similar to
2439 : them, but the problem is that here the transformation would be more
2440 : difficult due to possibly infinite loops. */
2441 43622 : if (iv0.step == const0_rtx)
2442 : {
2443 5858 : tmp = lowpart_subreg (mode, iv0.base, comp_mode);
2444 5858 : assumption = simplify_gen_relational (EQ, SImode, mode, tmp,
2445 : mode_mmax);
2446 5858 : if (assumption == const_true_rtx)
2447 0 : goto zero_iter_simplify;
2448 5858 : iv0.base = simplify_gen_binary (PLUS, comp_mode,
2449 : iv0.base, const1_rtx);
2450 : }
2451 : else
2452 : {
2453 37764 : tmp = lowpart_subreg (mode, iv1.base, comp_mode);
2454 37764 : assumption = simplify_gen_relational (EQ, SImode, mode, tmp,
2455 : mode_mmin);
2456 37764 : if (assumption == const_true_rtx)
2457 0 : goto zero_iter_simplify;
2458 37764 : iv1.base = simplify_gen_binary (PLUS, comp_mode,
2459 : iv1.base, constm1_rtx);
2460 : }
2461 :
2462 43622 : if (assumption != const0_rtx)
2463 31508 : desc->noloop_assumptions =
2464 31508 : alloc_EXPR_LIST (0, assumption, desc->noloop_assumptions);
2465 43622 : cond = (cond == LT) ? LE : LEU;
2466 :
2467 : /* It will be useful to be able to tell the difference once more in
2468 : LE -> NE reduction. */
2469 : was_sharp = true;
2470 : break;
2471 375753 : default: ;
2472 : }
2473 :
2474 : /* Take care of trivially infinite loops. */
2475 375753 : if (cond != NE)
2476 : {
2477 56643 : if (iv0.step == const0_rtx)
2478 : {
2479 6765 : tmp = lowpart_subreg (mode, iv0.base, comp_mode);
2480 6765 : if (rtx_equal_p (tmp, mode_mmin))
2481 : {
2482 0 : desc->infinite =
2483 0 : alloc_EXPR_LIST (0, const_true_rtx, NULL_RTX);
2484 : /* Fill in the remaining fields somehow. */
2485 0 : goto zero_iter_simplify;
2486 : }
2487 : }
2488 : else
2489 : {
2490 49878 : tmp = lowpart_subreg (mode, iv1.base, comp_mode);
2491 49878 : if (rtx_equal_p (tmp, mode_mmax))
2492 : {
2493 0 : desc->infinite =
2494 0 : alloc_EXPR_LIST (0, const_true_rtx, NULL_RTX);
2495 : /* Fill in the remaining fields somehow. */
2496 0 : goto zero_iter_simplify;
2497 : }
2498 : }
2499 : }
2500 :
2501 : /* If we can we want to take care of NE conditions instead of size
2502 : comparisons, as they are much more friendly (most importantly
2503 : this takes care of special handling of loops with step 1). We can
2504 : do it if we first check that upper bound is greater or equal to
2505 : lower bound, their difference is constant c modulo step and that
2506 : there is not an overflow. */
2507 56643 : if (cond != NE)
2508 : {
2509 56643 : if (iv0.step == const0_rtx)
2510 6765 : step = simplify_gen_unary (NEG, comp_mode, iv1.step, comp_mode);
2511 : else
2512 : step = iv0.step;
2513 56643 : step = lowpart_subreg (mode, step, comp_mode);
2514 56643 : delta = simplify_gen_binary (MINUS, comp_mode, iv1.base, iv0.base);
2515 56643 : delta = lowpart_subreg (mode, delta, comp_mode);
2516 56643 : delta = simplify_gen_binary (UMOD, mode, delta, step);
2517 56643 : may_xform = const0_rtx;
2518 56643 : may_not_xform = const_true_rtx;
2519 :
2520 56643 : if (CONST_INT_P (delta))
2521 : {
2522 32611 : if (was_sharp && INTVAL (delta) == INTVAL (step) - 1)
2523 : {
2524 : /* A special case. We have transformed condition of type
2525 : for (i = 0; i < 4; i += 4)
2526 : into
2527 : for (i = 0; i <= 3; i += 4)
2528 : obviously if the test for overflow during that transformation
2529 : passed, we cannot overflow here. Most importantly any
2530 : loop with sharp end condition and step 1 falls into this
2531 : category, so handling this case specially is definitely
2532 : worth the troubles. */
2533 : may_xform = const_true_rtx;
2534 : }
2535 9405 : else if (iv0.step == const0_rtx)
2536 : {
2537 663 : bound = simplify_gen_binary (PLUS, comp_mode, mmin, step);
2538 663 : bound = simplify_gen_binary (MINUS, comp_mode, bound, delta);
2539 663 : bound = lowpart_subreg (mode, bound, comp_mode);
2540 663 : tmp = lowpart_subreg (mode, iv0.base, comp_mode);
2541 663 : may_xform = simplify_gen_relational (cond, SImode, mode,
2542 : bound, tmp);
2543 663 : may_not_xform = simplify_gen_relational (reverse_condition (cond),
2544 : SImode, mode,
2545 : bound, tmp);
2546 : }
2547 : else
2548 : {
2549 8742 : bound = simplify_gen_binary (MINUS, comp_mode, mmax, step);
2550 8742 : bound = simplify_gen_binary (PLUS, comp_mode, bound, delta);
2551 8742 : bound = lowpart_subreg (mode, bound, comp_mode);
2552 8742 : tmp = lowpart_subreg (mode, iv1.base, comp_mode);
2553 8742 : may_xform = simplify_gen_relational (cond, SImode, mode,
2554 : tmp, bound);
2555 8742 : may_not_xform = simplify_gen_relational (reverse_condition (cond),
2556 : SImode, mode,
2557 : tmp, bound);
2558 : }
2559 : }
2560 :
2561 56643 : if (may_xform != const0_rtx)
2562 : {
2563 : /* We perform the transformation always provided that it is not
2564 : completely senseless. This is OK, as we would need this assumption
2565 : to determine the number of iterations anyway. */
2566 32611 : if (may_xform != const_true_rtx)
2567 : {
2568 : /* If the step is a power of two and the final value we have
2569 : computed overflows, the cycle is infinite. Otherwise it
2570 : is nontrivial to compute the number of iterations. */
2571 9009 : if (step_is_pow2)
2572 9009 : desc->infinite = alloc_EXPR_LIST (0, may_not_xform,
2573 : desc->infinite);
2574 : else
2575 0 : desc->assumptions = alloc_EXPR_LIST (0, may_xform,
2576 : desc->assumptions);
2577 : }
2578 :
2579 : /* We are going to lose some information about upper bound on
2580 : number of iterations in this step, so record the information
2581 : here. */
2582 32611 : inc = INTVAL (iv0.step) - INTVAL (iv1.step);
2583 32611 : if (CONST_INT_P (iv1.base))
2584 1367 : up = INTVAL (iv1.base);
2585 : else
2586 31244 : up = INTVAL (mode_mmax) - inc;
2587 32611 : down = INTVAL (CONST_INT_P (iv0.base)
2588 : ? iv0.base
2589 : : mode_mmin);
2590 32611 : max = (up - down) / inc + 1;
2591 32611 : if (!desc->infinite
2592 23602 : && !desc->assumptions)
2593 23602 : record_niter_bound (loop, max, false, true);
2594 :
2595 32611 : if (iv0.step == const0_rtx)
2596 : {
2597 1711 : iv0.base = simplify_gen_binary (PLUS, comp_mode, iv0.base, delta);
2598 1711 : iv0.base = simplify_gen_binary (MINUS, comp_mode, iv0.base, step);
2599 : }
2600 : else
2601 : {
2602 30900 : iv1.base = simplify_gen_binary (MINUS, comp_mode, iv1.base, delta);
2603 30900 : iv1.base = simplify_gen_binary (PLUS, comp_mode, iv1.base, step);
2604 : }
2605 :
2606 32611 : tmp0 = lowpart_subreg (mode, iv0.base, comp_mode);
2607 32611 : tmp1 = lowpart_subreg (mode, iv1.base, comp_mode);
2608 32611 : assumption = simplify_gen_relational (reverse_condition (cond),
2609 : SImode, mode, tmp0, tmp1);
2610 32611 : if (assumption == const_true_rtx)
2611 0 : goto zero_iter_simplify;
2612 32611 : else if (assumption != const0_rtx)
2613 65222 : desc->noloop_assumptions =
2614 32611 : alloc_EXPR_LIST (0, assumption, desc->noloop_assumptions);
2615 : cond = NE;
2616 : }
2617 : }
2618 :
2619 : /* Count the number of iterations. */
2620 32611 : if (cond == NE)
2621 : {
2622 : /* Everything we do here is just arithmetics modulo size of mode. This
2623 : makes us able to do more involved computations of number of iterations
2624 : than in other cases. First transform the condition into shape
2625 : s * i <> c, with s positive. */
2626 395343 : iv1.base = simplify_gen_binary (MINUS, comp_mode, iv1.base, iv0.base);
2627 395343 : iv0.base = const0_rtx;
2628 395343 : iv0.step = simplify_gen_binary (MINUS, comp_mode, iv0.step, iv1.step);
2629 395343 : iv1.step = const0_rtx;
2630 395343 : if (INTVAL (iv0.step) < 0)
2631 : {
2632 137224 : iv0.step = simplify_gen_unary (NEG, comp_mode, iv0.step, comp_mode);
2633 137224 : iv1.base = simplify_gen_unary (NEG, comp_mode, iv1.base, comp_mode);
2634 : }
2635 395343 : iv0.step = lowpart_subreg (mode, iv0.step, comp_mode);
2636 :
2637 : /* Let nsd (s, size of mode) = d. If d does not divide c, the loop
2638 : is infinite. Otherwise, the number of iterations is
2639 : (inverse(s/d) * (c/d)) mod (size of mode/d). */
2640 395343 : s = INTVAL (iv0.step); d = 1;
2641 912155 : while (s % 2 != 1)
2642 : {
2643 516812 : s /= 2;
2644 516812 : d *= 2;
2645 516812 : size--;
2646 : }
2647 395343 : bound = gen_int_mode (((uint64_t) 1 << (size - 1) << 1) - 1, mode);
2648 :
2649 395343 : tmp1 = lowpart_subreg (mode, iv1.base, comp_mode);
2650 395343 : tmp = simplify_gen_binary (UMOD, mode, tmp1, gen_int_mode (d, mode));
2651 395343 : assumption = simplify_gen_relational (NE, SImode, mode, tmp, const0_rtx);
2652 395343 : desc->infinite = alloc_EXPR_LIST (0, assumption, desc->infinite);
2653 :
2654 395343 : tmp = simplify_gen_binary (UDIV, mode, tmp1, gen_int_mode (d, mode));
2655 395343 : inv = inverse (s, size);
2656 395343 : tmp = simplify_gen_binary (MULT, mode, tmp, gen_int_mode (inv, mode));
2657 395343 : desc->niter_expr = simplify_gen_binary (AND, mode, tmp, bound);
2658 : }
2659 : else
2660 : {
2661 24032 : if (iv1.step == const0_rtx)
2662 : /* Condition in shape a + s * i <= b
2663 : We must know that b + s does not overflow and a <= b + s and then we
2664 : can compute number of iterations as (b + s - a) / s. (It might
2665 : seem that we in fact could be more clever about testing the b + s
2666 : overflow condition using some information about b - a mod s,
2667 : but it was already taken into account during LE -> NE transform). */
2668 : {
2669 18978 : step = iv0.step;
2670 18978 : tmp0 = lowpart_subreg (mode, iv0.base, comp_mode);
2671 18978 : tmp1 = lowpart_subreg (mode, iv1.base, comp_mode);
2672 :
2673 18978 : bound = simplify_gen_binary (MINUS, mode, mode_mmax,
2674 : lowpart_subreg (mode, step,
2675 : comp_mode));
2676 18978 : if (step_is_pow2)
2677 : {
2678 17175 : rtx t0, t1;
2679 :
2680 : /* If s is power of 2, we know that the loop is infinite if
2681 : a % s <= b % s and b + s overflows. */
2682 17175 : assumption = simplify_gen_relational (reverse_condition (cond),
2683 : SImode, mode,
2684 : tmp1, bound);
2685 :
2686 17175 : t0 = simplify_gen_binary (UMOD, mode, copy_rtx (tmp0), step);
2687 17175 : t1 = simplify_gen_binary (UMOD, mode, copy_rtx (tmp1), step);
2688 17175 : tmp = simplify_gen_relational (cond, SImode, mode, t0, t1);
2689 17175 : assumption = simplify_gen_binary (AND, SImode, assumption, tmp);
2690 17175 : desc->infinite =
2691 17175 : alloc_EXPR_LIST (0, assumption, desc->infinite);
2692 : }
2693 : else
2694 : {
2695 1803 : assumption = simplify_gen_relational (cond, SImode, mode,
2696 : tmp1, bound);
2697 1803 : desc->assumptions =
2698 1803 : alloc_EXPR_LIST (0, assumption, desc->assumptions);
2699 : }
2700 :
2701 18978 : tmp = simplify_gen_binary (PLUS, comp_mode, iv1.base, iv0.step);
2702 18978 : tmp = lowpart_subreg (mode, tmp, comp_mode);
2703 18978 : assumption = simplify_gen_relational (reverse_condition (cond),
2704 : SImode, mode, tmp0, tmp);
2705 :
2706 18978 : delta = simplify_gen_binary (PLUS, mode, tmp1, step);
2707 18978 : delta = simplify_gen_binary (MINUS, mode, delta, tmp0);
2708 : }
2709 : else
2710 : {
2711 : /* Condition in shape a <= b - s * i
2712 : We must know that a - s does not overflow and a - s <= b and then
2713 : we can again compute number of iterations as (b - (a - s)) / s. */
2714 5054 : step = simplify_gen_unary (NEG, mode, iv1.step, mode);
2715 5054 : tmp0 = lowpart_subreg (mode, iv0.base, comp_mode);
2716 5054 : tmp1 = lowpart_subreg (mode, iv1.base, comp_mode);
2717 :
2718 5054 : bound = simplify_gen_binary (PLUS, mode, mode_mmin,
2719 : lowpart_subreg (mode, step, comp_mode));
2720 5054 : if (step_is_pow2)
2721 : {
2722 3994 : rtx t0, t1;
2723 :
2724 : /* If s is power of 2, we know that the loop is infinite if
2725 : a % s <= b % s and a - s overflows. */
2726 3994 : assumption = simplify_gen_relational (reverse_condition (cond),
2727 : SImode, mode,
2728 : bound, tmp0);
2729 :
2730 3994 : t0 = simplify_gen_binary (UMOD, mode, copy_rtx (tmp0), step);
2731 3994 : t1 = simplify_gen_binary (UMOD, mode, copy_rtx (tmp1), step);
2732 3994 : tmp = simplify_gen_relational (cond, SImode, mode, t0, t1);
2733 3994 : assumption = simplify_gen_binary (AND, SImode, assumption, tmp);
2734 3994 : desc->infinite =
2735 3994 : alloc_EXPR_LIST (0, assumption, desc->infinite);
2736 : }
2737 : else
2738 : {
2739 1060 : assumption = simplify_gen_relational (cond, SImode, mode,
2740 : bound, tmp0);
2741 1060 : desc->assumptions =
2742 1060 : alloc_EXPR_LIST (0, assumption, desc->assumptions);
2743 : }
2744 :
2745 5054 : tmp = simplify_gen_binary (PLUS, comp_mode, iv0.base, iv1.step);
2746 5054 : tmp = lowpart_subreg (mode, tmp, comp_mode);
2747 5054 : assumption = simplify_gen_relational (reverse_condition (cond),
2748 : SImode, mode,
2749 : tmp, tmp1);
2750 5054 : delta = simplify_gen_binary (MINUS, mode, tmp0, step);
2751 5054 : delta = simplify_gen_binary (MINUS, mode, tmp1, delta);
2752 : }
2753 24032 : if (assumption == const_true_rtx)
2754 0 : goto zero_iter_simplify;
2755 24032 : else if (assumption != const0_rtx)
2756 23801 : desc->noloop_assumptions =
2757 23801 : alloc_EXPR_LIST (0, assumption, desc->noloop_assumptions);
2758 24032 : delta = simplify_gen_binary (UDIV, mode, delta, step);
2759 24032 : desc->niter_expr = delta;
2760 : }
2761 :
2762 419375 : old_niter = desc->niter_expr;
2763 :
2764 419375 : simplify_using_initial_values (loop, AND, &desc->assumptions);
2765 419375 : if (desc->assumptions
2766 2182 : && XEXP (desc->assumptions, 0) == const0_rtx)
2767 5 : goto fail;
2768 419370 : simplify_using_initial_values (loop, IOR, &desc->noloop_assumptions);
2769 419370 : simplify_using_initial_values (loop, IOR, &desc->infinite);
2770 419370 : simplify_using_initial_values (loop, UNKNOWN, &desc->niter_expr);
2771 :
2772 : /* Rerun the simplification. Consider code (created by copying loop headers)
2773 :
2774 : i = 0;
2775 :
2776 : if (0 < n)
2777 : {
2778 : do
2779 : {
2780 : i++;
2781 : } while (i < n);
2782 : }
2783 :
2784 : The first pass determines that i = 0, the second pass uses it to eliminate
2785 : noloop assumption. */
2786 :
2787 419370 : simplify_using_initial_values (loop, AND, &desc->assumptions);
2788 419370 : if (desc->assumptions
2789 2177 : && XEXP (desc->assumptions, 0) == const0_rtx)
2790 0 : goto fail;
2791 419370 : simplify_using_initial_values (loop, IOR, &desc->noloop_assumptions);
2792 419370 : simplify_using_initial_values (loop, IOR, &desc->infinite);
2793 419370 : simplify_using_initial_values (loop, UNKNOWN, &desc->niter_expr);
2794 :
2795 419370 : if (desc->noloop_assumptions
2796 46221 : && XEXP (desc->noloop_assumptions, 0) == const_true_rtx)
2797 0 : goto zero_iter;
2798 :
2799 419370 : if (CONST_INT_P (desc->niter_expr))
2800 : {
2801 209349 : uint64_t val = INTVAL (desc->niter_expr);
2802 :
2803 209349 : desc->const_iter = true;
2804 209349 : desc->niter = val & GET_MODE_MASK (desc->mode);
2805 209349 : if (!desc->infinite
2806 209302 : && !desc->assumptions)
2807 209299 : record_niter_bound (loop, desc->niter, false, true);
2808 : }
2809 : else
2810 : {
2811 210021 : max = determine_max_iter (loop, desc, old_niter);
2812 210021 : if (!max)
2813 0 : goto zero_iter_simplify;
2814 210021 : if (!desc->infinite
2815 147642 : && !desc->assumptions)
2816 145468 : record_niter_bound (loop, max, false, true);
2817 :
2818 : /* simplify_using_initial_values does a copy propagation on the registers
2819 : in the expression for the number of iterations. This prolongs life
2820 : ranges of registers and increases register pressure, and usually
2821 : brings no gain (and if it happens to do, the cse pass will take care
2822 : of it anyway). So prevent this behavior, unless it enabled us to
2823 : derive that the number of iterations is a constant. */
2824 210021 : desc->niter_expr = old_niter;
2825 : }
2826 :
2827 : return;
2828 :
2829 0 : zero_iter_simplify:
2830 : /* Simplify the assumptions. */
2831 0 : simplify_using_initial_values (loop, AND, &desc->assumptions);
2832 0 : if (desc->assumptions
2833 0 : && XEXP (desc->assumptions, 0) == const0_rtx)
2834 0 : goto fail;
2835 0 : simplify_using_initial_values (loop, IOR, &desc->infinite);
2836 :
2837 : /* Fallthru. */
2838 0 : zero_iter:
2839 0 : desc->const_iter = true;
2840 0 : desc->niter = 0;
2841 0 : record_niter_bound (loop, 0, true, true);
2842 0 : desc->noloop_assumptions = NULL_RTX;
2843 0 : desc->niter_expr = const0_rtx;
2844 0 : return;
2845 :
2846 325022 : fail:
2847 325022 : desc->simple_p = false;
2848 325022 : return;
2849 : }
2850 :
2851 : /* Checks whether E is a simple exit from LOOP and stores its description
2852 : into DESC. */
2853 :
2854 : static void
2855 1125764 : check_simple_exit (class loop *loop, edge e, class niter_desc *desc)
2856 : {
2857 1125764 : basic_block exit_bb;
2858 1125764 : rtx condition;
2859 1125764 : rtx_insn *at;
2860 1125764 : edge ein;
2861 :
2862 1125764 : exit_bb = e->src;
2863 1125764 : desc->simple_p = false;
2864 :
2865 : /* It must belong directly to the loop. */
2866 1125764 : if (exit_bb->loop_father != loop)
2867 381372 : return;
2868 :
2869 : /* It must be tested (at least) once during any iteration. */
2870 1030712 : if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit_bb))
2871 : return;
2872 :
2873 : /* It must end in a simple conditional jump. */
2874 841282 : if (!any_condjump_p (BB_END (exit_bb)) || !onlyjump_p (BB_END (exit_bb)))
2875 : return;
2876 :
2877 778252 : ein = EDGE_SUCC (exit_bb, 0);
2878 778252 : if (ein == e)
2879 239246 : ein = EDGE_SUCC (exit_bb, 1);
2880 :
2881 778252 : desc->out_edge = e;
2882 778252 : desc->in_edge = ein;
2883 :
2884 : /* Test whether the condition is suitable. */
2885 778252 : if (!(condition = get_condition (BB_END (ein->src), &at, false, false)))
2886 : return;
2887 :
2888 748202 : if (ein->flags & EDGE_FALLTHRU)
2889 : {
2890 186822 : condition = reversed_condition (condition);
2891 186822 : if (!condition)
2892 : return;
2893 : }
2894 :
2895 : /* Check that we are able to determine number of iterations and fill
2896 : in information about it. */
2897 744392 : iv_number_of_iterations (loop, at, condition, desc);
2898 : }
2899 :
2900 : /* Finds a simple exit of LOOP and stores its description into DESC. */
2901 :
2902 : static void
2903 592288 : find_simple_exit (class loop *loop, class niter_desc *desc)
2904 : {
2905 592288 : unsigned i;
2906 592288 : basic_block *body;
2907 592288 : edge e;
2908 592288 : class niter_desc act;
2909 592288 : bool any = false;
2910 592288 : edge_iterator ei;
2911 :
2912 592288 : desc->simple_p = false;
2913 592288 : body = get_loop_body (loop);
2914 :
2915 5020564 : for (i = 0; i < loop->num_nodes; i++)
2916 : {
2917 9817106 : FOR_EACH_EDGE (e, ei, body[i]->succs)
2918 : {
2919 5981118 : if (flow_bb_inside_loop_p (loop, e->dest))
2920 4855354 : continue;
2921 :
2922 1125764 : check_simple_exit (loop, e, &act);
2923 1125764 : if (!act.simple_p)
2924 706394 : continue;
2925 :
2926 419370 : if (!any)
2927 : any = true;
2928 : else
2929 : {
2930 : /* Prefer constant iterations; the less the better. */
2931 10302 : if (!act.const_iter
2932 955 : || (desc->const_iter && act.niter >= desc->niter))
2933 9499 : continue;
2934 :
2935 : /* Also if the actual exit may be infinite, while the old one
2936 : not, prefer the old one. */
2937 803 : if (act.infinite && !desc->infinite)
2938 2 : continue;
2939 : }
2940 :
2941 409869 : *desc = act;
2942 : }
2943 : }
2944 :
2945 592288 : if (dump_file)
2946 : {
2947 103 : if (desc->simple_p)
2948 : {
2949 75 : fprintf (dump_file, "Loop %d is simple:\n", loop->num);
2950 75 : fprintf (dump_file, " simple exit %d -> %d\n",
2951 75 : desc->out_edge->src->index,
2952 75 : desc->out_edge->dest->index);
2953 75 : if (desc->assumptions)
2954 : {
2955 0 : fprintf (dump_file, " assumptions: ");
2956 0 : print_rtl (dump_file, desc->assumptions);
2957 0 : fprintf (dump_file, "\n");
2958 : }
2959 75 : if (desc->noloop_assumptions)
2960 : {
2961 8 : fprintf (dump_file, " does not roll if: ");
2962 8 : print_rtl (dump_file, desc->noloop_assumptions);
2963 8 : fprintf (dump_file, "\n");
2964 : }
2965 75 : if (desc->infinite)
2966 : {
2967 19 : fprintf (dump_file, " infinite if: ");
2968 19 : print_rtl (dump_file, desc->infinite);
2969 19 : fprintf (dump_file, "\n");
2970 : }
2971 :
2972 75 : fprintf (dump_file, " number of iterations: ");
2973 75 : print_rtl (dump_file, desc->niter_expr);
2974 75 : fprintf (dump_file, "\n");
2975 :
2976 75 : fprintf (dump_file, " upper bound: %li\n",
2977 : (long)get_max_loop_iterations_int (loop));
2978 75 : fprintf (dump_file, " likely upper bound: %li\n",
2979 : (long)get_likely_max_loop_iterations_int (loop));
2980 75 : fprintf (dump_file, " realistic bound: %li\n",
2981 : (long)get_estimated_loop_iterations_int (loop));
2982 : }
2983 : else
2984 28 : fprintf (dump_file, "Loop %d is not simple.\n", loop->num);
2985 : }
2986 :
2987 : /* Fix up the finiteness if possible. We can only do it for single exit,
2988 : since the loop is finite, but it's possible that we predicate one loop
2989 : exit to be finite which can not be determined as finite in middle-end as
2990 : well. It results in incorrect predicate information on the exit condition
2991 : expression. For example, if says [(int) _1 + -8, + , -8] != 0 finite,
2992 : it means _1 can exactly divide -8. */
2993 592288 : if (desc->infinite && single_exit (loop) && finite_loop_p (loop))
2994 : {
2995 35505 : desc->infinite = NULL_RTX;
2996 35505 : if (dump_file)
2997 19 : fprintf (dump_file, " infinite updated to finite.\n");
2998 : }
2999 :
3000 592288 : free (body);
3001 592288 : }
3002 :
3003 : /* Creates a simple loop description of LOOP if it was not computed
3004 : already. */
3005 :
3006 : class niter_desc *
3007 1006506 : get_simple_loop_desc (class loop *loop)
3008 : {
3009 1006506 : class niter_desc *desc = simple_loop_desc (loop);
3010 :
3011 1006506 : if (desc)
3012 : return desc;
3013 :
3014 : /* At least desc->infinite is not always initialized by
3015 : find_simple_loop_exit. */
3016 592288 : desc = ggc_cleared_alloc<niter_desc> ();
3017 592288 : iv_analysis_loop_init (loop);
3018 592288 : find_simple_exit (loop, desc);
3019 592288 : loop->simple_loop_desc = desc;
3020 592288 : return desc;
3021 : }
3022 :
3023 : /* Releases simple loop description for LOOP. */
3024 :
3025 : void
3026 6114119 : free_simple_loop_desc (class loop *loop)
3027 : {
3028 6114119 : class niter_desc *desc = simple_loop_desc (loop);
3029 :
3030 6114119 : if (!desc)
3031 : return;
3032 :
3033 592288 : ggc_free (desc);
3034 592288 : loop->simple_loop_desc = NULL;
3035 : }
|