Branch data Line data Source code
1 : : /* Rtl-level induction variable analysis.
2 : : Copyright (C) 2004-2025 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 : 106117 : biv_entry_hasher::hash (const biv_entry *b)
125 : : {
126 : 106117 : return b->regno;
127 : : }
128 : :
129 : : /* Compares biv B and register R. */
130 : :
131 : : inline bool
132 : 123742 : biv_entry_hasher::equal (const biv_entry *b, const rtx_def *r)
133 : : {
134 : 123742 : 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 : 1 : iv_extend_to_rtx_code (enum iv_extend_code extend)
146 : : {
147 : 1 : 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 : 2420412 : check_iv_ref_table_size (void)
205 : : {
206 : 2420412 : if (iv_ref_table_size < DF_DEFS_TABLE_SIZE ())
207 : : {
208 : 244723 : unsigned int new_size = DF_DEFS_TABLE_SIZE () + (DF_DEFS_TABLE_SIZE () / 4);
209 : 244723 : iv_ref_table = XRESIZEVEC (class rtx_iv *, iv_ref_table, new_size);
210 : 244723 : memset (&iv_ref_table[iv_ref_table_size], 0,
211 : 244723 : (new_size - iv_ref_table_size) * sizeof (class rtx_iv *));
212 : 244723 : iv_ref_table_size = new_size;
213 : : }
214 : 2420412 : }
215 : :
216 : :
217 : : /* Checks whether REG is a well-behaved register. */
218 : :
219 : : static bool
220 : 3491263 : simple_reg_p (rtx reg)
221 : : {
222 : 3491263 : unsigned r;
223 : :
224 : 3491263 : if (GET_CODE (reg) == SUBREG)
225 : : {
226 : 10897 : if (!subreg_lowpart_p (reg))
227 : : return false;
228 : 10872 : reg = SUBREG_REG (reg);
229 : : }
230 : :
231 : 3491238 : if (!REG_P (reg))
232 : : return false;
233 : :
234 : 3222803 : r = REGNO (reg);
235 : 3222803 : if (HARD_REGISTER_NUM_P (r))
236 : : return false;
237 : :
238 : 3188257 : if (GET_MODE_CLASS (GET_MODE (reg)) != MODE_INT)
239 : : return false;
240 : :
241 : : return true;
242 : : }
243 : :
244 : : /* Clears the information about ivs stored in df. */
245 : :
246 : : static void
247 : 586998 : clear_iv_info (void)
248 : : {
249 : 586998 : unsigned i, n_defs = DF_DEFS_TABLE_SIZE ();
250 : 586998 : class rtx_iv *iv;
251 : :
252 : 586998 : check_iv_ref_table_size ();
253 : 74017169 : for (i = 0; i < n_defs; i++)
254 : : {
255 : 72843173 : iv = iv_ref_table[i];
256 : 72843173 : if (iv)
257 : : {
258 : 619469 : free (iv);
259 : 619469 : iv_ref_table[i] = NULL;
260 : : }
261 : : }
262 : :
263 : 586998 : bivs->empty ();
264 : 586998 : }
265 : :
266 : :
267 : : /* Prepare the data for an induction variable analysis of a LOOP. */
268 : :
269 : : void
270 : 586998 : iv_analysis_loop_init (class loop *loop)
271 : : {
272 : 586998 : current_loop = loop;
273 : :
274 : : /* Clear the information from the analysis of the previous loop. */
275 : 586998 : if (clean_slate)
276 : : {
277 : 174368 : df_set_flags (DF_EQ_NOTES + DF_DEFER_INSN_RESCAN);
278 : 174368 : bivs = new hash_table<biv_entry_hasher> (10);
279 : 174368 : clean_slate = false;
280 : : }
281 : : else
282 : 412630 : clear_iv_info ();
283 : :
284 : : /* Get rid of the ud chains before processing the rescans. Then add
285 : : the problem back. */
286 : 586998 : df_remove_problem (df_chain);
287 : 586998 : df_process_deferred_rescans ();
288 : 586998 : df_set_flags (DF_RD_PRUNE_DEAD_DEFS);
289 : 586998 : df_chain_add_problem (DF_UD_CHAIN);
290 : 586998 : df_note_add_problem ();
291 : 586998 : df_analyze_loop (loop);
292 : 586998 : if (dump_file)
293 : 174 : df_dump_region (dump_file);
294 : :
295 : 586998 : check_iv_ref_table_size ();
296 : 586998 : }
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 : 622817 : latch_dominating_def (rtx reg, df_ref *def)
305 : : {
306 : 622817 : df_ref single_rd = NULL, adef;
307 : 622817 : unsigned regno = REGNO (reg);
308 : 622817 : class df_rd_bb_info *bb_info = DF_RD_BB_INFO (current_loop->latch);
309 : :
310 : 2027721 : for (adef = DF_REG_DEF_CHAIN (regno); adef; adef = DF_REF_NEXT_REG (adef))
311 : : {
312 : 1404927 : if (!bitmap_bit_p (df->blocks_to_analyze, DF_REF_BBNO (adef))
313 : 1404927 : || !bitmap_bit_p (&bb_info->out, DF_REF_ID (adef)))
314 : 800110 : continue;
315 : :
316 : : /* More than one reaching definition. */
317 : 604817 : if (single_rd)
318 : : return false;
319 : :
320 : 604817 : if (!just_once_each_iteration_p (current_loop, DF_REF_BB (adef)))
321 : : return false;
322 : :
323 : : single_rd = adef;
324 : : }
325 : :
326 : 622794 : *def = single_rd;
327 : 622794 : 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 : 1867449 : iv_get_reaching_def (rtx_insn *insn, rtx reg, df_ref *def)
334 : : {
335 : 1867449 : df_ref use, adef;
336 : 1867449 : basic_block def_bb, use_bb;
337 : 1867449 : rtx_insn *def_insn;
338 : 1867449 : bool dom_p;
339 : :
340 : 1867449 : *def = NULL;
341 : 1867449 : if (!simple_reg_p (reg))
342 : : return GRD_INVALID;
343 : 1787314 : if (GET_CODE (reg) == SUBREG)
344 : 0 : reg = SUBREG_REG (reg);
345 : 1787314 : gcc_assert (REG_P (reg));
346 : :
347 : 1787314 : use = df_find_use (insn, reg);
348 : 1787314 : gcc_assert (use != NULL);
349 : :
350 : 1787314 : if (!DF_REF_CHAIN (use))
351 : : return GRD_INVARIANT;
352 : :
353 : : /* More than one reaching def. */
354 : 1526912 : if (DF_REF_CHAIN (use)->next)
355 : : return GRD_INVALID;
356 : :
357 : 1503572 : adef = DF_REF_CHAIN (use)->ref;
358 : :
359 : : /* We do not handle setting only part of the register. */
360 : 1503572 : if (DF_REF_FLAGS (adef) & DF_REF_READ_WRITE)
361 : : return GRD_INVALID;
362 : :
363 : 1503568 : def_insn = DF_REF_INSN (adef);
364 : 1503568 : def_bb = DF_REF_BB (adef);
365 : 1503568 : use_bb = BLOCK_FOR_INSN (insn);
366 : :
367 : 1503568 : if (use_bb == def_bb)
368 : 1399529 : dom_p = (DF_INSN_LUID (def_insn) < DF_INSN_LUID (insn));
369 : : else
370 : 104039 : dom_p = dominated_by_p (CDI_DOMINATORS, use_bb, def_bb);
371 : :
372 : 1503568 : if (dom_p)
373 : : {
374 : 592216 : *def = adef;
375 : 592216 : 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 : 911352 : if (just_once_each_iteration_p (current_loop, def_bb))
382 : : 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 : 838979 : iv_constant (class rtx_iv *iv, scalar_int_mode mode, rtx cst)
392 : : {
393 : 838979 : iv->mode = mode;
394 : 838979 : iv->base = cst;
395 : 838979 : iv->step = const0_rtx;
396 : 838979 : iv->first_special = false;
397 : 838979 : iv->extend = IV_UNKNOWN_EXTEND;
398 : 838979 : iv->extend_mode = iv->mode;
399 : 838979 : iv->delta = const0_rtx;
400 : 838979 : iv->mult = const1_rtx;
401 : :
402 : 838979 : return true;
403 : : }
404 : :
405 : : /* Evaluates application of subreg to MODE on IV. */
406 : :
407 : : static bool
408 : 5062 : iv_subreg (class rtx_iv *iv, scalar_int_mode mode)
409 : : {
410 : : /* If iv is invariant, just calculate the new value. */
411 : 5062 : if (iv->step == const0_rtx
412 : 50 : && !iv->first_special)
413 : : {
414 : 48 : rtx val = get_iv_value (iv, const0_rtx);
415 : 48 : val = lowpart_subreg (mode, val,
416 : 48 : iv->extend == IV_UNKNOWN_EXTEND
417 : : ? iv->mode : iv->extend_mode);
418 : :
419 : 48 : iv->base = val;
420 : 48 : iv->extend = IV_UNKNOWN_EXTEND;
421 : 48 : iv->mode = iv->extend_mode = mode;
422 : 48 : iv->delta = const0_rtx;
423 : 48 : iv->mult = const1_rtx;
424 : 48 : return true;
425 : : }
426 : :
427 : 5014 : if (iv->extend_mode == mode)
428 : : return true;
429 : :
430 : 15042 : if (GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (iv->mode))
431 : : return false;
432 : :
433 : 5014 : iv->extend = IV_UNKNOWN_EXTEND;
434 : 5014 : iv->mode = mode;
435 : :
436 : 5014 : 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 : 5014 : iv->step = simplify_gen_binary (MULT, iv->extend_mode, iv->step, iv->mult);
440 : 5014 : iv->mult = const1_rtx;
441 : 5014 : iv->delta = const0_rtx;
442 : 5014 : iv->first_special = false;
443 : :
444 : 5014 : return true;
445 : : }
446 : :
447 : : /* Evaluates application of EXTEND to MODE on IV. */
448 : :
449 : : static bool
450 : 297 : 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 : 297 : if (iv->step == const0_rtx
454 : 1 : && !iv->first_special)
455 : : {
456 : 1 : rtx val = get_iv_value (iv, const0_rtx);
457 : 1 : if (iv->extend_mode != iv->mode
458 : 0 : && iv->extend != IV_UNKNOWN_EXTEND
459 : 1 : && iv->extend != extend)
460 : 0 : val = lowpart_subreg (iv->mode, val, iv->extend_mode);
461 : 1 : val = simplify_gen_unary (iv_extend_to_rtx_code (extend), mode,
462 : : val,
463 : 1 : iv->extend == extend
464 : : ? iv->extend_mode : iv->mode);
465 : 1 : iv->base = val;
466 : 1 : iv->extend = IV_UNKNOWN_EXTEND;
467 : 1 : iv->mode = iv->extend_mode = mode;
468 : 1 : iv->delta = const0_rtx;
469 : 1 : iv->mult = const1_rtx;
470 : 1 : return true;
471 : : }
472 : :
473 : 296 : if (mode != iv->extend_mode)
474 : : return false;
475 : :
476 : 6 : if (iv->extend != IV_UNKNOWN_EXTEND
477 : 0 : && iv->extend != extend)
478 : : return false;
479 : :
480 : 6 : iv->extend = extend;
481 : :
482 : 6 : return true;
483 : : }
484 : :
485 : : /* Evaluates negation of IV. */
486 : :
487 : : static bool
488 : 86 : iv_neg (class rtx_iv *iv)
489 : : {
490 : 86 : if (iv->extend == IV_UNKNOWN_EXTEND)
491 : : {
492 : 86 : iv->base = simplify_gen_unary (NEG, iv->extend_mode,
493 : : iv->base, iv->extend_mode);
494 : 86 : 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 : 86 : return true;
506 : : }
507 : :
508 : : /* Evaluates addition or subtraction (according to OP) of IV1 to IV0. */
509 : :
510 : : static bool
511 : 414468 : iv_add (class rtx_iv *iv0, class rtx_iv *iv1, enum rtx_code op)
512 : : {
513 : 414468 : scalar_int_mode mode;
514 : 414468 : rtx arg;
515 : :
516 : : /* Extend the constant to extend_mode of the other operand if necessary. */
517 : 414468 : if (iv0->extend == IV_UNKNOWN_EXTEND
518 : 414467 : && iv0->mode == iv0->extend_mode
519 : 413789 : && iv0->step == const0_rtx
520 : 417777 : && GET_MODE_SIZE (iv0->extend_mode) < GET_MODE_SIZE (iv1->extend_mode))
521 : : {
522 : 299 : iv0->extend_mode = iv1->extend_mode;
523 : 299 : iv0->base = simplify_gen_unary (ZERO_EXTEND, iv0->extend_mode,
524 : : iv0->base, iv0->mode);
525 : : }
526 : 414468 : if (iv1->extend == IV_UNKNOWN_EXTEND
527 : 414468 : && iv1->mode == iv1->extend_mode
528 : 414169 : && iv1->step == const0_rtx
529 : 1655259 : && GET_MODE_SIZE (iv1->extend_mode) < GET_MODE_SIZE (iv0->extend_mode))
530 : : {
531 : 678 : iv1->extend_mode = iv0->extend_mode;
532 : 678 : iv1->base = simplify_gen_unary (ZERO_EXTEND, iv1->extend_mode,
533 : : iv1->base, iv1->mode);
534 : : }
535 : :
536 : 414468 : mode = iv0->extend_mode;
537 : 414468 : if (mode != iv1->extend_mode)
538 : : return false;
539 : :
540 : 414468 : if (iv0->extend == IV_UNKNOWN_EXTEND
541 : 414467 : && iv1->extend == IV_UNKNOWN_EXTEND)
542 : : {
543 : 414467 : if (iv0->mode != iv1->mode)
544 : : return false;
545 : :
546 : 414467 : iv0->base = simplify_gen_binary (op, mode, iv0->base, iv1->base);
547 : 414467 : iv0->step = simplify_gen_binary (op, mode, iv0->step, iv1->step);
548 : :
549 : 414467 : 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 : 33 : iv_mult (class rtx_iv *iv, rtx mby)
582 : : {
583 : 33 : scalar_int_mode mode = iv->extend_mode;
584 : :
585 : 33 : if (GET_MODE (mby) != VOIDmode
586 : 33 : && GET_MODE (mby) != mode)
587 : : return false;
588 : :
589 : 33 : if (iv->extend == IV_UNKNOWN_EXTEND)
590 : : {
591 : 33 : iv->base = simplify_gen_binary (MULT, mode, iv->base, mby);
592 : 33 : iv->step = simplify_gen_binary (MULT, mode, iv->step, mby);
593 : : }
594 : : else
595 : : {
596 : 0 : iv->delta = simplify_gen_binary (MULT, mode, iv->delta, mby);
597 : 0 : 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 : 190 : iv_shift (class rtx_iv *iv, rtx mby)
607 : : {
608 : 190 : scalar_int_mode mode = iv->extend_mode;
609 : :
610 : 190 : if (GET_MODE (mby) != VOIDmode
611 : 190 : && GET_MODE (mby) != mode)
612 : : return false;
613 : :
614 : 190 : if (iv->extend == IV_UNKNOWN_EXTEND)
615 : : {
616 : 190 : iv->base = simplify_gen_binary (ASHIFT, mode, iv->base, mby);
617 : 190 : 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 : 489843 : 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 : 489843 : rtx set, rhs, op0 = NULL_RTX, op1 = NULL_RTX;
639 : 489843 : rtx next, nextr;
640 : 489843 : enum rtx_code code, prev_code = UNKNOWN;
641 : 489843 : rtx_insn *insn = DF_REF_INSN (def);
642 : 489843 : df_ref next_def;
643 : 489843 : enum iv_grd_result res;
644 : :
645 : 489843 : set = single_set (insn);
646 : 489843 : if (!set)
647 : : return false;
648 : :
649 : 488502 : rhs = find_reg_equal_equiv_note (insn);
650 : 488502 : if (rhs)
651 : 1918 : rhs = XEXP (rhs, 0);
652 : : else
653 : 486584 : rhs = SET_SRC (set);
654 : :
655 : 488502 : code = GET_CODE (rhs);
656 : 488502 : switch (code)
657 : : {
658 : : case SUBREG:
659 : : case REG:
660 : : next = rhs;
661 : : break;
662 : :
663 : 451670 : case PLUS:
664 : 451670 : case MINUS:
665 : 451670 : op0 = XEXP (rhs, 0);
666 : 451670 : op1 = XEXP (rhs, 1);
667 : :
668 : 451670 : if (code == PLUS && CONSTANT_P (op0))
669 : : std::swap (op0, op1);
670 : :
671 : 451670 : if (!simple_reg_p (op0)
672 : 451670 : || !CONSTANT_P (op1))
673 : : return false;
674 : :
675 : 431985 : 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 : 18 : 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 : 55 : case SIGN_EXTEND:
695 : 55 : case ZERO_EXTEND:
696 : 55 : if (GET_MODE (rhs) != outer_mode)
697 : : return false;
698 : :
699 : 55 : 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 : 55 : 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 : : prev_code = code;
718 : : code = PLUS;
719 : : }
720 : :
721 : 55 : if (!simple_reg_p (op0))
722 : : return false;
723 : :
724 : : next = op0;
725 : : break;
726 : :
727 : : default:
728 : : return false;
729 : : }
730 : :
731 : 452670 : if (GET_CODE (next) == SUBREG)
732 : : {
733 : 771 : if (!subreg_lowpart_p (next))
734 : : return false;
735 : :
736 : 726 : nextr = SUBREG_REG (next);
737 : 726 : if (GET_MODE (nextr) != outer_mode)
738 : : return false;
739 : : }
740 : : else
741 : : nextr = next;
742 : :
743 : 451918 : res = iv_get_reaching_def (insn, nextr, &next_def);
744 : :
745 : 451918 : if (res == GRD_INVALID || res == GRD_INVARIANT)
746 : : return false;
747 : :
748 : 447662 : if (res == GRD_MAYBE_BIV)
749 : : {
750 : 431804 : if (!rtx_equal_p (nextr, reg))
751 : : return false;
752 : :
753 : 431403 : *inner_step = const0_rtx;
754 : 431403 : *extend = IV_UNKNOWN_EXTEND;
755 : 431403 : *inner_mode = outer_mode;
756 : 431403 : *outer_step = const0_rtx;
757 : : }
758 : 15858 : else if (!get_biv_step_1 (next_def, outer_mode, reg,
759 : : inner_step, inner_mode, extend,
760 : : outer_step))
761 : : return false;
762 : :
763 : 438927 : if (GET_CODE (next) == SUBREG)
764 : : {
765 : 14 : scalar_int_mode amode;
766 : 14 : if (!is_a <scalar_int_mode> (GET_MODE (next), &amode)
767 : 28 : || GET_MODE_SIZE (amode) > GET_MODE_SIZE (*inner_mode))
768 : 50916 : return false;
769 : :
770 : 14 : *inner_mode = amode;
771 : 14 : *inner_step = simplify_gen_binary (PLUS, outer_mode,
772 : : *inner_step, *outer_step);
773 : 14 : *outer_step = const0_rtx;
774 : 14 : *extend = IV_UNKNOWN_EXTEND;
775 : : }
776 : :
777 : 438927 : switch (code)
778 : : {
779 : : case REG:
780 : : case SUBREG:
781 : : break;
782 : :
783 : 431400 : case PLUS:
784 : 431400 : case MINUS:
785 : 431400 : if (*inner_mode == outer_mode
786 : : /* See comment in previous switch. */
787 : 431400 : || GET_MODE (rhs) != outer_mode)
788 : 431399 : *inner_step = simplify_gen_binary (code, outer_mode,
789 : : *inner_step, op1);
790 : : else
791 : 1 : *outer_step = simplify_gen_binary (code, outer_mode,
792 : : *outer_step, op1);
793 : :
794 : 431400 : if (prev_code == SIGN_EXTEND)
795 : 0 : *extend = IV_SIGN_EXTEND;
796 : 431400 : else if (prev_code == ZERO_EXTEND)
797 : 0 : *extend = IV_ZERO_EXTEND;
798 : : break;
799 : :
800 : 14 : case SIGN_EXTEND:
801 : 14 : case ZERO_EXTEND:
802 : 14 : gcc_assert (GET_MODE (op0) == *inner_mode
803 : : && *extend == IV_UNKNOWN_EXTEND
804 : : && *outer_step == const0_rtx);
805 : :
806 : 14 : *extend = (code == SIGN_EXTEND) ? IV_SIGN_EXTEND : IV_ZERO_EXTEND;
807 : 14 : break;
808 : :
809 : : default:
810 : : return false;
811 : : }
812 : :
813 : : return true;
814 : : }
815 : :
816 : : /* Gets the operation on register REG inside loop, in shape
817 : :
818 : : OUTER_STEP + EXTEND_{OUTER_MODE} (SUBREG_{INNER_MODE} (REG + INNER_STEP))
819 : :
820 : : If the operation cannot be described in this shape, return false.
821 : : LAST_DEF is the definition of REG that dominates loop latch. */
822 : :
823 : : static bool
824 : 473985 : get_biv_step (df_ref last_def, scalar_int_mode outer_mode, rtx reg,
825 : : rtx *inner_step, scalar_int_mode *inner_mode,
826 : : enum iv_extend_code *extend, rtx *outer_step)
827 : : {
828 : 473985 : if (!get_biv_step_1 (last_def, outer_mode, reg,
829 : : inner_step, inner_mode, extend,
830 : : outer_step))
831 : : return false;
832 : :
833 : 431403 : gcc_assert ((*inner_mode == outer_mode) != (*extend != IV_UNKNOWN_EXTEND));
834 : 431403 : gcc_assert (*inner_mode != outer_mode || *outer_step == const0_rtx);
835 : :
836 : : return true;
837 : : }
838 : :
839 : : /* Records information that DEF is induction variable IV. */
840 : :
841 : : static void
842 : 619469 : record_iv (df_ref def, class rtx_iv *iv)
843 : : {
844 : 619469 : class rtx_iv *recorded_iv = XNEW (class rtx_iv);
845 : :
846 : 619469 : *recorded_iv = *iv;
847 : 619469 : check_iv_ref_table_size ();
848 : 619469 : DF_REF_IV_SET (def, recorded_iv);
849 : 619469 : }
850 : :
851 : : /* If DEF was already analyzed for bivness, store the description of the biv to
852 : : IV and return true. Otherwise return false. */
853 : :
854 : : static bool
855 : 540917 : analyzed_for_bivness_p (rtx def, class rtx_iv *iv)
856 : : {
857 : 540917 : class biv_entry *biv = bivs->find_with_hash (def, REGNO (def));
858 : :
859 : 540917 : if (!biv)
860 : : return false;
861 : :
862 : 66932 : *iv = biv->iv;
863 : 66932 : return true;
864 : : }
865 : :
866 : : static void
867 : 473985 : record_biv (rtx def, class rtx_iv *iv)
868 : : {
869 : 473985 : class biv_entry *biv = XNEW (class biv_entry);
870 : 473985 : biv_entry **slot = bivs->find_slot_with_hash (def, REGNO (def), INSERT);
871 : :
872 : 473985 : biv->regno = REGNO (def);
873 : 473985 : biv->iv = *iv;
874 : 473985 : gcc_assert (!*slot);
875 : 473985 : *slot = biv;
876 : 473985 : }
877 : :
878 : : /* Determines whether DEF is a biv and if so, stores its description
879 : : to *IV. OUTER_MODE is the mode of DEF. */
880 : :
881 : : static bool
882 : 540917 : iv_analyze_biv (scalar_int_mode outer_mode, rtx def, class rtx_iv *iv)
883 : : {
884 : 540917 : rtx inner_step, outer_step;
885 : 540917 : scalar_int_mode inner_mode;
886 : 540917 : enum iv_extend_code extend;
887 : 540917 : df_ref last_def;
888 : :
889 : 540917 : if (dump_file)
890 : : {
891 : 217 : fprintf (dump_file, "Analyzing ");
892 : 217 : print_rtl (dump_file, def);
893 : 217 : fprintf (dump_file, " for bivness.\n");
894 : : }
895 : :
896 : 540917 : if (!REG_P (def))
897 : : {
898 : 0 : if (!CONSTANT_P (def))
899 : : return false;
900 : :
901 : 0 : return iv_constant (iv, outer_mode, def);
902 : : }
903 : :
904 : 540917 : if (!latch_dominating_def (def, &last_def))
905 : : {
906 : 0 : if (dump_file)
907 : 0 : fprintf (dump_file, " not simple.\n");
908 : 0 : return false;
909 : : }
910 : :
911 : 540917 : if (!last_def)
912 : 0 : return iv_constant (iv, outer_mode, def);
913 : :
914 : 540917 : if (analyzed_for_bivness_p (def, iv))
915 : : {
916 : 66932 : if (dump_file)
917 : 71 : fprintf (dump_file, " already analysed.\n");
918 : 66932 : return iv->base != NULL_RTX;
919 : : }
920 : :
921 : 473985 : if (!get_biv_step (last_def, outer_mode, def, &inner_step, &inner_mode,
922 : : &extend, &outer_step))
923 : : {
924 : 42582 : iv->base = NULL_RTX;
925 : 42582 : goto end;
926 : : }
927 : :
928 : : /* Loop transforms base to es (base + inner_step) + outer_step,
929 : : where es means extend of subreg between inner_mode and outer_mode.
930 : : The corresponding induction variable is
931 : :
932 : : es ((base - outer_step) + i * (inner_step + outer_step)) + outer_step */
933 : :
934 : 431403 : iv->base = simplify_gen_binary (MINUS, outer_mode, def, outer_step);
935 : 431403 : iv->step = simplify_gen_binary (PLUS, outer_mode, inner_step, outer_step);
936 : 431403 : iv->mode = inner_mode;
937 : 431403 : iv->extend_mode = outer_mode;
938 : 431403 : iv->extend = extend;
939 : 431403 : iv->mult = const1_rtx;
940 : 431403 : iv->delta = outer_step;
941 : 431403 : iv->first_special = inner_mode != outer_mode;
942 : :
943 : 473985 : end:
944 : 473985 : if (dump_file)
945 : : {
946 : 146 : fprintf (dump_file, " ");
947 : 146 : dump_iv_info (dump_file, iv);
948 : 146 : fprintf (dump_file, "\n");
949 : : }
950 : :
951 : 473985 : record_biv (def, iv);
952 : 473985 : return iv->base != NULL_RTX;
953 : : }
954 : :
955 : : /* Analyzes expression RHS used at INSN and stores the result to *IV.
956 : : The mode of the induction variable is MODE. */
957 : :
958 : : bool
959 : 1500917 : iv_analyze_expr (rtx_insn *insn, scalar_int_mode mode, rtx rhs,
960 : : class rtx_iv *iv)
961 : : {
962 : 1500917 : rtx mby = NULL_RTX;
963 : 1500917 : rtx op0 = NULL_RTX, op1 = NULL_RTX;
964 : 1500917 : class rtx_iv iv0, iv1;
965 : 1500917 : enum rtx_code code = GET_CODE (rhs);
966 : 1500917 : scalar_int_mode omode = mode;
967 : :
968 : 1500917 : iv->base = NULL_RTX;
969 : 1500917 : iv->step = NULL_RTX;
970 : :
971 : 1500917 : gcc_assert (GET_MODE (rhs) == mode || GET_MODE (rhs) == VOIDmode);
972 : :
973 : 1500917 : if (CONSTANT_P (rhs)
974 : 1087495 : || REG_P (rhs)
975 : 590799 : || code == SUBREG)
976 : 911964 : return iv_analyze_op (insn, mode, rhs, iv);
977 : :
978 : 588953 : switch (code)
979 : : {
980 : : case REG:
981 : : op0 = rhs;
982 : : break;
983 : :
984 : 9647 : case SIGN_EXTEND:
985 : 9647 : case ZERO_EXTEND:
986 : 9647 : case NEG:
987 : 9647 : op0 = XEXP (rhs, 0);
988 : : /* We don't know how many bits there are in a sign-extended constant. */
989 : 183816 : if (!is_a <scalar_int_mode> (GET_MODE (op0), &omode))
990 : : return false;
991 : : break;
992 : :
993 : 453595 : case PLUS:
994 : 453595 : case MINUS:
995 : 453595 : op0 = XEXP (rhs, 0);
996 : 453595 : op1 = XEXP (rhs, 1);
997 : 453595 : break;
998 : :
999 : 1693 : case MULT:
1000 : 1693 : op0 = XEXP (rhs, 0);
1001 : 1693 : mby = XEXP (rhs, 1);
1002 : 1693 : if (!CONSTANT_P (mby))
1003 : 1288 : std::swap (op0, mby);
1004 : 1693 : if (!CONSTANT_P (mby))
1005 : : return false;
1006 : : break;
1007 : :
1008 : 2087 : case ASHIFT:
1009 : 2087 : op0 = XEXP (rhs, 0);
1010 : 2087 : mby = XEXP (rhs, 1);
1011 : 2087 : if (!CONSTANT_P (mby))
1012 : : return false;
1013 : : break;
1014 : :
1015 : : default:
1016 : : return false;
1017 : : }
1018 : :
1019 : 465693 : if (op0
1020 : 465693 : && !iv_analyze_expr (insn, omode, op0, &iv0))
1021 : : return false;
1022 : :
1023 : 416361 : if (op1
1024 : 416361 : && !iv_analyze_expr (insn, omode, op1, &iv1))
1025 : : return false;
1026 : :
1027 : 415074 : switch (code)
1028 : : {
1029 : 32 : case SIGN_EXTEND:
1030 : 32 : if (!iv_extend (&iv0, IV_SIGN_EXTEND, mode))
1031 : : return false;
1032 : : break;
1033 : :
1034 : 265 : case ZERO_EXTEND:
1035 : 265 : if (!iv_extend (&iv0, IV_ZERO_EXTEND, mode))
1036 : : return false;
1037 : : break;
1038 : :
1039 : 86 : case NEG:
1040 : 86 : if (!iv_neg (&iv0))
1041 : : return false;
1042 : : break;
1043 : :
1044 : 414468 : case PLUS:
1045 : 414468 : case MINUS:
1046 : 414468 : if (!iv_add (&iv0, &iv1, code))
1047 : : return false;
1048 : : break;
1049 : :
1050 : 33 : case MULT:
1051 : 33 : if (!iv_mult (&iv0, mby))
1052 : : return false;
1053 : : break;
1054 : :
1055 : 190 : case ASHIFT:
1056 : 190 : if (!iv_shift (&iv0, mby))
1057 : : return false;
1058 : : break;
1059 : :
1060 : : default:
1061 : : break;
1062 : : }
1063 : :
1064 : 414784 : *iv = iv0;
1065 : 414784 : return iv->base != NULL_RTX;
1066 : : }
1067 : :
1068 : : /* Analyzes iv DEF and stores the result to *IV. */
1069 : :
1070 : : static bool
1071 : 626947 : iv_analyze_def (df_ref def, class rtx_iv *iv)
1072 : : {
1073 : 626947 : rtx_insn *insn = DF_REF_INSN (def);
1074 : 626947 : rtx reg = DF_REF_REG (def);
1075 : 626947 : rtx set, rhs;
1076 : :
1077 : 626947 : if (dump_file)
1078 : : {
1079 : 203 : fprintf (dump_file, "Analyzing def of ");
1080 : 203 : print_rtl (dump_file, reg);
1081 : 203 : fprintf (dump_file, " in insn ");
1082 : 203 : print_rtl_single (dump_file, insn);
1083 : : }
1084 : :
1085 : 626947 : check_iv_ref_table_size ();
1086 : 626947 : if (DF_REF_IV (def))
1087 : : {
1088 : 7111 : if (dump_file)
1089 : 0 : fprintf (dump_file, " already analysed.\n");
1090 : 7111 : *iv = *DF_REF_IV (def);
1091 : 7111 : return iv->base != NULL_RTX;
1092 : : }
1093 : :
1094 : 619836 : iv->base = NULL_RTX;
1095 : 619836 : iv->step = NULL_RTX;
1096 : :
1097 : 619836 : scalar_int_mode mode;
1098 : 620047 : if (!REG_P (reg) || !is_a <scalar_int_mode> (GET_MODE (reg), &mode))
1099 : : return false;
1100 : :
1101 : 619680 : set = single_set (insn);
1102 : 619680 : if (!set)
1103 : : return false;
1104 : :
1105 : 619469 : if (!REG_P (SET_DEST (set)))
1106 : : return false;
1107 : :
1108 : 619469 : gcc_assert (SET_DEST (set) == reg);
1109 : 619469 : rhs = find_reg_equal_equiv_note (insn);
1110 : 619469 : if (rhs)
1111 : 6824 : rhs = XEXP (rhs, 0);
1112 : : else
1113 : 612645 : rhs = SET_SRC (set);
1114 : :
1115 : 619469 : iv_analyze_expr (insn, mode, rhs, iv);
1116 : 619469 : record_iv (def, iv);
1117 : :
1118 : 619469 : if (dump_file)
1119 : : {
1120 : 203 : print_rtl (dump_file, reg);
1121 : 203 : fprintf (dump_file, " in insn ");
1122 : 203 : print_rtl_single (dump_file, insn);
1123 : 203 : fprintf (dump_file, " is ");
1124 : 203 : dump_iv_info (dump_file, iv);
1125 : 203 : fprintf (dump_file, "\n");
1126 : : }
1127 : :
1128 : 619469 : return iv->base != NULL_RTX;
1129 : : }
1130 : :
1131 : : /* Analyzes operand OP of INSN and stores the result to *IV. MODE is the
1132 : : mode of OP. */
1133 : :
1134 : : static bool
1135 : 2010303 : iv_analyze_op (rtx_insn *insn, scalar_int_mode mode, rtx op, class rtx_iv *iv)
1136 : : {
1137 : 2010303 : df_ref def = NULL;
1138 : 2010303 : enum iv_grd_result res;
1139 : :
1140 : 2010303 : if (dump_file)
1141 : : {
1142 : 513 : fprintf (dump_file, "Analyzing operand ");
1143 : 513 : print_rtl (dump_file, op);
1144 : 513 : fprintf (dump_file, " of insn ");
1145 : 513 : print_rtl_single (dump_file, insn);
1146 : : }
1147 : :
1148 : 2010303 : if (function_invariant_p (op))
1149 : : res = GRD_INVARIANT;
1150 : 1428254 : else if (GET_CODE (op) == SUBREG)
1151 : : {
1152 : 12723 : scalar_int_mode inner_mode;
1153 : 12723 : if (!subreg_lowpart_p (op)
1154 : 19893 : || !is_a <scalar_int_mode> (GET_MODE (SUBREG_REG (op)), &inner_mode))
1155 : : return false;
1156 : :
1157 : 12232 : if (!iv_analyze_op (insn, inner_mode, SUBREG_REG (op), iv))
1158 : : return false;
1159 : :
1160 : 5062 : return iv_subreg (iv, mode);
1161 : : }
1162 : : else
1163 : : {
1164 : 1415531 : res = iv_get_reaching_def (insn, op, &def);
1165 : 1415531 : if (res == GRD_INVALID)
1166 : : {
1167 : 105190 : if (dump_file)
1168 : 6 : fprintf (dump_file, " not simple.\n");
1169 : 105190 : return false;
1170 : : }
1171 : : }
1172 : :
1173 : 1310341 : if (res == GRD_INVARIANT)
1174 : : {
1175 : 838979 : iv_constant (iv, mode, op);
1176 : :
1177 : 838979 : if (dump_file)
1178 : : {
1179 : 221 : fprintf (dump_file, " ");
1180 : 221 : dump_iv_info (dump_file, iv);
1181 : 221 : fprintf (dump_file, "\n");
1182 : : }
1183 : 838979 : return true;
1184 : : }
1185 : :
1186 : 1053411 : if (res == GRD_MAYBE_BIV)
1187 : 477053 : return iv_analyze_biv (mode, op, iv);
1188 : :
1189 : 576358 : return iv_analyze_def (def, iv);
1190 : : }
1191 : :
1192 : : /* Analyzes value VAL at INSN and stores the result to *IV. MODE is the
1193 : : mode of VAL. */
1194 : :
1195 : : bool
1196 : 1086107 : iv_analyze (rtx_insn *insn, scalar_int_mode mode, rtx val, class rtx_iv *iv)
1197 : : {
1198 : 1086107 : rtx reg;
1199 : :
1200 : : /* We must find the insn in that val is used, so that we get to UD chains.
1201 : : Since the function is sometimes called on result of get_condition,
1202 : : this does not necessarily have to be directly INSN; scan also the
1203 : : following insns. */
1204 : 1086107 : if (simple_reg_p (val))
1205 : : {
1206 : 867359 : if (GET_CODE (val) == SUBREG)
1207 : 10851 : reg = SUBREG_REG (val);
1208 : : else
1209 : 867359 : reg = val;
1210 : :
1211 : 867359 : while (!df_find_use (insn, reg))
1212 : 0 : insn = NEXT_INSN (insn);
1213 : : }
1214 : :
1215 : 1086107 : return iv_analyze_op (insn, mode, val, iv);
1216 : : }
1217 : :
1218 : : /* Analyzes definition of DEF in INSN and stores the result to IV. */
1219 : :
1220 : : bool
1221 : 50589 : iv_analyze_result (rtx_insn *insn, rtx def, class rtx_iv *iv)
1222 : : {
1223 : 50589 : df_ref adef;
1224 : :
1225 : 50589 : adef = df_find_def (insn, def);
1226 : 50589 : if (!adef)
1227 : : return false;
1228 : :
1229 : 50589 : return iv_analyze_def (adef, iv);
1230 : : }
1231 : :
1232 : : /* Checks whether definition of register REG in INSN is a basic induction
1233 : : variable. MODE is the mode of REG.
1234 : :
1235 : : IV analysis must have been initialized (via a call to
1236 : : iv_analysis_loop_init) for this function to produce a result. */
1237 : :
1238 : : bool
1239 : 85982 : biv_p (rtx_insn *insn, scalar_int_mode mode, rtx reg)
1240 : : {
1241 : 85982 : class rtx_iv iv;
1242 : 85982 : df_ref def, last_def;
1243 : :
1244 : 85982 : if (!simple_reg_p (reg))
1245 : : return false;
1246 : :
1247 : 81900 : def = df_find_def (insn, reg);
1248 : 81900 : gcc_assert (def != NULL);
1249 : 81900 : if (!latch_dominating_def (reg, &last_def))
1250 : : return false;
1251 : 81877 : if (last_def != def)
1252 : : return false;
1253 : :
1254 : 63864 : if (!iv_analyze_biv (mode, reg, &iv))
1255 : : return false;
1256 : :
1257 : 50590 : return iv.step != const0_rtx;
1258 : : }
1259 : :
1260 : : /* Calculates value of IV at ITERATION-th iteration. */
1261 : :
1262 : : rtx
1263 : 49 : get_iv_value (class rtx_iv *iv, rtx iteration)
1264 : : {
1265 : 49 : rtx val;
1266 : :
1267 : : /* We would need to generate some if_then_else patterns, and so far
1268 : : it is not needed anywhere. */
1269 : 49 : gcc_assert (!iv->first_special);
1270 : :
1271 : 49 : if (iv->step != const0_rtx && iteration != const0_rtx)
1272 : 0 : val = simplify_gen_binary (PLUS, iv->extend_mode, iv->base,
1273 : : simplify_gen_binary (MULT, iv->extend_mode,
1274 : : iv->step, iteration));
1275 : : else
1276 : 49 : val = iv->base;
1277 : :
1278 : 49 : if (iv->extend_mode == iv->mode)
1279 : : return val;
1280 : :
1281 : 0 : val = lowpart_subreg (iv->mode, val, iv->extend_mode);
1282 : :
1283 : 0 : if (iv->extend == IV_UNKNOWN_EXTEND)
1284 : : return val;
1285 : :
1286 : 0 : val = simplify_gen_unary (iv_extend_to_rtx_code (iv->extend),
1287 : : iv->extend_mode, val, iv->mode);
1288 : 0 : val = simplify_gen_binary (PLUS, iv->extend_mode, iv->delta,
1289 : : simplify_gen_binary (MULT, iv->extend_mode,
1290 : : iv->mult, val));
1291 : :
1292 : 0 : return val;
1293 : : }
1294 : :
1295 : : /* Free the data for an induction variable analysis. */
1296 : :
1297 : : void
1298 : 205556 : iv_analysis_done (void)
1299 : : {
1300 : 205556 : if (!clean_slate)
1301 : : {
1302 : 174368 : clear_iv_info ();
1303 : 174368 : clean_slate = true;
1304 : 174368 : df_finish_pass (true);
1305 : 174368 : delete bivs;
1306 : 174368 : bivs = NULL;
1307 : 174368 : free (iv_ref_table);
1308 : 174368 : iv_ref_table = NULL;
1309 : 174368 : iv_ref_table_size = 0;
1310 : : }
1311 : 205556 : }
1312 : :
1313 : : /* Computes inverse to X modulo (1 << MOD). */
1314 : :
1315 : : static uint64_t
1316 : 363742 : inverse (uint64_t x, int mod)
1317 : : {
1318 : 363742 : uint64_t mask =
1319 : 363742 : ((uint64_t) 1 << (mod - 1) << 1) - 1;
1320 : 363742 : uint64_t rslt = 1;
1321 : 363742 : int i;
1322 : :
1323 : 20189680 : for (i = 0; i < mod - 1; i++)
1324 : : {
1325 : 19825938 : rslt = (rslt * x) & mask;
1326 : 19825938 : x = (x * x) & mask;
1327 : : }
1328 : :
1329 : 363742 : return rslt;
1330 : : }
1331 : :
1332 : : /* Checks whether any register in X is in set ALT. */
1333 : :
1334 : : static bool
1335 : 36949186 : altered_reg_used (const_rtx x, bitmap alt)
1336 : : {
1337 : 36949186 : subrtx_iterator::array_type array;
1338 : 223587494 : FOR_EACH_SUBRTX (iter, array, x, NONCONST)
1339 : : {
1340 : 187280209 : const_rtx x = *iter;
1341 : 187280209 : if (REG_P (x) && REGNO_REG_SET_P (alt, REGNO (x)))
1342 : 641901 : return true;
1343 : : }
1344 : 36307285 : return false;
1345 : 36949186 : }
1346 : :
1347 : : /* Marks registers altered by EXPR in set ALT. */
1348 : :
1349 : : static void
1350 : 9519645 : mark_altered (rtx expr, const_rtx by ATTRIBUTE_UNUSED, void *alt)
1351 : : {
1352 : 9519645 : if (GET_CODE (expr) == SUBREG)
1353 : 0 : expr = SUBREG_REG (expr);
1354 : 9519645 : if (!REG_P (expr))
1355 : : return;
1356 : :
1357 : 8305779 : SET_REGNO_REG_SET ((bitmap) alt, REGNO (expr));
1358 : : }
1359 : :
1360 : : /* Checks whether RHS is simple enough to process. */
1361 : :
1362 : : static bool
1363 : 6257460 : simple_rhs_p (rtx rhs)
1364 : : {
1365 : 6257460 : rtx op0, op1;
1366 : :
1367 : 6257460 : if (function_invariant_p (rhs)
1368 : 6257460 : || (REG_P (rhs) && !HARD_REGISTER_P (rhs)))
1369 : : return true;
1370 : :
1371 : 4105785 : switch (GET_CODE (rhs))
1372 : : {
1373 : 1287676 : case PLUS:
1374 : 1287676 : case MINUS:
1375 : 1287676 : case AND:
1376 : 1287676 : op0 = XEXP (rhs, 0);
1377 : 1287676 : op1 = XEXP (rhs, 1);
1378 : : /* Allow reg OP const and reg OP reg. */
1379 : 1194097 : if (!(REG_P (op0) && !HARD_REGISTER_P (op0))
1380 : 1357045 : && !function_invariant_p (op0))
1381 : : return false;
1382 : 571126 : if (!(REG_P (op1) && !HARD_REGISTER_P (op1))
1383 : 1132852 : && !function_invariant_p (op1))
1384 : : return false;
1385 : :
1386 : : return true;
1387 : :
1388 : 586697 : case ASHIFT:
1389 : 586697 : case ASHIFTRT:
1390 : 586697 : case LSHIFTRT:
1391 : 586697 : case MULT:
1392 : 586697 : op0 = XEXP (rhs, 0);
1393 : 586697 : op1 = XEXP (rhs, 1);
1394 : : /* Allow reg OP const. */
1395 : 586697 : if (!(REG_P (op0) && !HARD_REGISTER_P (op0)))
1396 : : return false;
1397 : 570974 : if (!function_invariant_p (op1))
1398 : : return false;
1399 : :
1400 : : return true;
1401 : :
1402 : : default:
1403 : : return false;
1404 : : }
1405 : : }
1406 : :
1407 : : /* If any registers in *EXPR that have a single definition, try to replace
1408 : : them with the known-equivalent values. */
1409 : :
1410 : : static void
1411 : 2189562 : replace_single_def_regs (rtx *expr)
1412 : : {
1413 : 2189562 : subrtx_var_iterator::array_type array;
1414 : 2254491 : repeat:
1415 : 13818059 : FOR_EACH_SUBRTX_VAR (iter, array, *expr, NONCONST)
1416 : : {
1417 : 11628497 : rtx x = *iter;
1418 : 11628497 : if (REG_P (x))
1419 : 3297133 : if (rtx new_x = df_find_single_def_src (x))
1420 : : {
1421 : 64929 : *expr = simplify_replace_rtx (*expr, x, new_x);
1422 : 64929 : goto repeat;
1423 : : }
1424 : : }
1425 : 2189562 : }
1426 : :
1427 : : /* A subroutine of simplify_using_initial_values, this function examines INSN
1428 : : to see if it contains a suitable set that we can use to make a replacement.
1429 : : If it is suitable, return true and set DEST and SRC to the lhs and rhs of
1430 : : the set; return false otherwise. */
1431 : :
1432 : : static bool
1433 : 13641191 : suitable_set_for_replacement (rtx_insn *insn, rtx *dest, rtx *src)
1434 : : {
1435 : 13641191 : rtx set = single_set (insn);
1436 : 13641191 : rtx lhs = NULL_RTX, rhs;
1437 : :
1438 : 13641191 : if (!set)
1439 : : return false;
1440 : :
1441 : 7470369 : lhs = SET_DEST (set);
1442 : 7470369 : if (!REG_P (lhs))
1443 : : return false;
1444 : :
1445 : 6257460 : rhs = find_reg_equal_equiv_note (insn);
1446 : 6257460 : if (rhs)
1447 : 387201 : rhs = XEXP (rhs, 0);
1448 : : else
1449 : 5870259 : rhs = SET_SRC (set);
1450 : :
1451 : 6257460 : if (!simple_rhs_p (rhs))
1452 : : return false;
1453 : :
1454 : 3764500 : *dest = lhs;
1455 : 3764500 : *src = rhs;
1456 : 3764500 : return true;
1457 : : }
1458 : :
1459 : : /* Using the data returned by suitable_set_for_replacement, replace DEST
1460 : : with SRC in *EXPR and return the new expression. Also call
1461 : : replace_single_def_regs if the replacement changed something. */
1462 : : static void
1463 : 5095744 : replace_in_expr (rtx *expr, rtx dest, rtx src)
1464 : : {
1465 : 5095744 : rtx old = *expr;
1466 : 5095744 : *expr = simplify_replace_rtx (*expr, dest, src);
1467 : 5095744 : if (old == *expr)
1468 : : return;
1469 : 1112139 : replace_single_def_regs (expr);
1470 : : }
1471 : :
1472 : : /* Checks whether A implies B. */
1473 : :
1474 : : static bool
1475 : 2021244 : implies_p (rtx a, rtx b)
1476 : : {
1477 : 2021244 : rtx op0, op1, opb0, opb1;
1478 : 2021244 : machine_mode mode;
1479 : :
1480 : 2021244 : if (rtx_equal_p (a, b))
1481 : : return true;
1482 : :
1483 : 2018521 : if (GET_CODE (a) == EQ)
1484 : : {
1485 : 349657 : op0 = XEXP (a, 0);
1486 : 349657 : op1 = XEXP (a, 1);
1487 : :
1488 : 349657 : if (REG_P (op0)
1489 : 184884 : || (GET_CODE (op0) == SUBREG
1490 : 3418 : && REG_P (SUBREG_REG (op0))))
1491 : : {
1492 : 167593 : rtx r = simplify_replace_rtx (b, op0, op1);
1493 : 167593 : if (r == const_true_rtx)
1494 : : return true;
1495 : : }
1496 : :
1497 : 333775 : if (REG_P (op1)
1498 : 255896 : || (GET_CODE (op1) == SUBREG
1499 : 1454 : && REG_P (SUBREG_REG (op1))))
1500 : : {
1501 : 79333 : rtx r = simplify_replace_rtx (b, op1, op0);
1502 : 79333 : if (r == const_true_rtx)
1503 : : return true;
1504 : : }
1505 : : }
1506 : :
1507 : 2002631 : if (b == const_true_rtx)
1508 : : return true;
1509 : :
1510 : 2002631 : if ((GET_RTX_CLASS (GET_CODE (a)) != RTX_COMM_COMPARE
1511 : : && GET_RTX_CLASS (GET_CODE (a)) != RTX_COMPARE)
1512 : 1994161 : || (GET_RTX_CLASS (GET_CODE (b)) != RTX_COMM_COMPARE
1513 : : && GET_RTX_CLASS (GET_CODE (b)) != RTX_COMPARE))
1514 : : return false;
1515 : :
1516 : 1973306 : op0 = XEXP (a, 0);
1517 : 1973306 : op1 = XEXP (a, 1);
1518 : 1973306 : opb0 = XEXP (b, 0);
1519 : 1973306 : opb1 = XEXP (b, 1);
1520 : :
1521 : 1973306 : mode = GET_MODE (op0);
1522 : 1973306 : if (mode != GET_MODE (opb0))
1523 : : mode = VOIDmode;
1524 : 1725692 : else if (mode == VOIDmode)
1525 : : {
1526 : 0 : mode = GET_MODE (op1);
1527 : 0 : if (mode != GET_MODE (opb1))
1528 : 247614 : mode = VOIDmode;
1529 : : }
1530 : :
1531 : : /* A < B implies A + 1 <= B. */
1532 : 1973306 : if ((GET_CODE (a) == GT || GET_CODE (a) == LT)
1533 : 502088 : && (GET_CODE (b) == GE || GET_CODE (b) == LE))
1534 : : {
1535 : :
1536 : 32676 : if (GET_CODE (a) == GT)
1537 : 20423 : std::swap (op0, op1);
1538 : :
1539 : 32676 : if (GET_CODE (b) == GE)
1540 : 12531 : std::swap (opb0, opb1);
1541 : :
1542 : 32676 : if (SCALAR_INT_MODE_P (mode)
1543 : 32089 : && rtx_equal_p (op1, opb1)
1544 : 35142 : && simplify_gen_binary (MINUS, mode, opb0, op0) == const1_rtx)
1545 : : return true;
1546 : 32431 : return false;
1547 : : }
1548 : :
1549 : : /* A < B or A > B imply A != B. TODO: Likewise
1550 : : A + n < B implies A != B + n if neither wraps. */
1551 : 1940630 : if (GET_CODE (b) == NE
1552 : : && (GET_CODE (a) == GT || GET_CODE (a) == GTU
1553 : : || GET_CODE (a) == LT || GET_CODE (a) == LTU))
1554 : : {
1555 : 148818 : if (rtx_equal_p (op0, opb0)
1556 : 148818 : && rtx_equal_p (op1, opb1))
1557 : : return true;
1558 : : }
1559 : :
1560 : : /* For unsigned comparisons, A != 0 implies A > 0 and A >= 1. */
1561 : 1913929 : if (GET_CODE (a) == NE
1562 : 495436 : && op1 == const0_rtx)
1563 : : {
1564 : 250349 : if ((GET_CODE (b) == GTU
1565 : 19508 : && opb1 == const0_rtx)
1566 : 250349 : || (GET_CODE (b) == GEU
1567 : 5692 : && opb1 == const1_rtx))
1568 : 0 : return rtx_equal_p (op0, opb0);
1569 : : }
1570 : :
1571 : : /* A != N is equivalent to A - (N + 1) <u -1. */
1572 : 1913929 : if (GET_CODE (a) == NE
1573 : 495436 : && CONST_INT_P (op1)
1574 : 382316 : && GET_CODE (b) == LTU
1575 : 50701 : && opb1 == constm1_rtx
1576 : 14698 : && GET_CODE (opb0) == PLUS
1577 : 5639 : && CONST_INT_P (XEXP (opb0, 1))
1578 : : /* Avoid overflows. */
1579 : 367 : && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (opb0, 1))
1580 : : != (HOST_WIDE_INT_1U
1581 : : << (HOST_BITS_PER_WIDE_INT - 1)) - 1)
1582 : 367 : && INTVAL (XEXP (opb0, 1)) + 1 == -INTVAL (op1))
1583 : 169 : return rtx_equal_p (op0, XEXP (opb0, 0));
1584 : :
1585 : : /* Likewise, A != N implies A - N > 0. */
1586 : 1913760 : if (GET_CODE (a) == NE
1587 : 495267 : && CONST_INT_P (op1))
1588 : : {
1589 : 382147 : if (GET_CODE (b) == GTU
1590 : 24908 : && GET_CODE (opb0) == PLUS
1591 : 13619 : && opb1 == const0_rtx
1592 : 0 : && CONST_INT_P (XEXP (opb0, 1))
1593 : : /* Avoid overflows. */
1594 : 0 : && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (opb0, 1))
1595 : : != (HOST_WIDE_INT_1U << (HOST_BITS_PER_WIDE_INT - 1)))
1596 : 382147 : && rtx_equal_p (XEXP (opb0, 0), op0))
1597 : 0 : return INTVAL (op1) == -INTVAL (XEXP (opb0, 1));
1598 : 382147 : if (GET_CODE (b) == GEU
1599 : 8046 : && GET_CODE (opb0) == PLUS
1600 : 2702 : && opb1 == const1_rtx
1601 : 0 : && CONST_INT_P (XEXP (opb0, 1))
1602 : : /* Avoid overflows. */
1603 : 0 : && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (opb0, 1))
1604 : : != (HOST_WIDE_INT_1U << (HOST_BITS_PER_WIDE_INT - 1)))
1605 : 382147 : && rtx_equal_p (XEXP (opb0, 0), op0))
1606 : 0 : return INTVAL (op1) == -INTVAL (XEXP (opb0, 1));
1607 : : }
1608 : :
1609 : : /* A >s X, where X is positive, implies A <u Y, if Y is negative. */
1610 : 1913760 : if ((GET_CODE (a) == GT || GET_CODE (a) == GE)
1611 : 304833 : && CONST_INT_P (op1)
1612 : 233232 : && ((GET_CODE (a) == GT && op1 == constm1_rtx)
1613 : 208054 : || INTVAL (op1) >= 0)
1614 : 222760 : && GET_CODE (b) == LTU
1615 : 13201 : && CONST_INT_P (opb1)
1616 : 1926579 : && rtx_equal_p (op0, opb0))
1617 : 1038 : return INTVAL (opb1) < 0;
1618 : :
1619 : : return false;
1620 : : }
1621 : :
1622 : : /* Canonicalizes COND so that
1623 : :
1624 : : (1) Ensure that operands are ordered according to
1625 : : swap_commutative_operands_p.
1626 : : (2) (LE x const) will be replaced with (LT x <const+1>) and similarly
1627 : : for GE, GEU, and LEU. */
1628 : :
1629 : : rtx
1630 : 1984402 : canon_condition (rtx cond)
1631 : : {
1632 : 1984402 : rtx op0, op1;
1633 : 1984402 : enum rtx_code code;
1634 : 1984402 : machine_mode mode;
1635 : :
1636 : 1984402 : code = GET_CODE (cond);
1637 : 1984402 : op0 = XEXP (cond, 0);
1638 : 1984402 : op1 = XEXP (cond, 1);
1639 : :
1640 : 1984402 : if (swap_commutative_operands_p (op0, op1))
1641 : : {
1642 : 210355 : code = swap_condition (code);
1643 : 210355 : std::swap (op0, op1);
1644 : : }
1645 : :
1646 : 1984402 : mode = GET_MODE (op0);
1647 : 1984402 : if (mode == VOIDmode)
1648 : 0 : mode = GET_MODE (op1);
1649 : 1984402 : gcc_assert (mode != VOIDmode);
1650 : :
1651 : 1984402 : if (CONST_SCALAR_INT_P (op1) && GET_MODE_CLASS (mode) != MODE_CC)
1652 : : {
1653 : 1464410 : rtx_mode_t const_val (op1, mode);
1654 : :
1655 : 1464410 : switch (code)
1656 : : {
1657 : 94454 : case LE:
1658 : 94454 : if (wi::ne_p (const_val, wi::max_value (mode, SIGNED)))
1659 : : {
1660 : 94454 : code = LT;
1661 : 94454 : op1 = immed_wide_int_const (wi::add (const_val, 1), mode);
1662 : : }
1663 : : break;
1664 : :
1665 : 125909 : case GE:
1666 : 125909 : if (wi::ne_p (const_val, wi::min_value (mode, SIGNED)))
1667 : : {
1668 : 125909 : code = GT;
1669 : 125909 : op1 = immed_wide_int_const (wi::sub (const_val, 1), mode);
1670 : : }
1671 : : break;
1672 : :
1673 : 33903 : case LEU:
1674 : 33903 : if (wi::ne_p (const_val, -1))
1675 : : {
1676 : 33903 : code = LTU;
1677 : 33903 : op1 = immed_wide_int_const (wi::add (const_val, 1), mode);
1678 : : }
1679 : : break;
1680 : :
1681 : 146732 : case GEU:
1682 : 146732 : if (wi::ne_p (const_val, 0))
1683 : : {
1684 : 146732 : code = GTU;
1685 : 146732 : op1 = immed_wide_int_const (wi::sub (const_val, 1), mode);
1686 : : }
1687 : : break;
1688 : :
1689 : : default:
1690 : : break;
1691 : : }
1692 : : }
1693 : :
1694 : 1984402 : if (op0 != XEXP (cond, 0)
1695 : 1774047 : || op1 != XEXP (cond, 1)
1696 : 1440434 : || code != GET_CODE (cond)
1697 : 1440434 : || GET_MODE (cond) != SImode)
1698 : 1514265 : cond = gen_rtx_fmt_ee (code, SImode, op0, op1);
1699 : :
1700 : 1984402 : return cond;
1701 : : }
1702 : :
1703 : : /* Reverses CONDition; returns NULL if we cannot. */
1704 : :
1705 : : static rtx
1706 : 1716568 : reversed_condition (rtx cond)
1707 : : {
1708 : 1716568 : enum rtx_code reversed;
1709 : 1716568 : reversed = reversed_comparison_code (cond, NULL);
1710 : 1716568 : if (reversed == UNKNOWN)
1711 : : return NULL_RTX;
1712 : : else
1713 : 1708929 : return gen_rtx_fmt_ee (reversed,
1714 : : GET_MODE (cond), XEXP (cond, 0),
1715 : : XEXP (cond, 1));
1716 : : }
1717 : :
1718 : : /* Tries to use the fact that COND holds to simplify EXPR. ALTERED is the
1719 : : set of altered regs. */
1720 : :
1721 : : void
1722 : 1123857 : simplify_using_condition (rtx cond, rtx *expr, regset altered)
1723 : : {
1724 : 1123857 : rtx rev, reve, exp = *expr;
1725 : :
1726 : : /* If some register gets altered later, we do not really speak about its
1727 : : value at the time of comparison. */
1728 : 1123857 : if (altered && altered_reg_used (cond, altered))
1729 : : return;
1730 : :
1731 : 1109741 : if (GET_CODE (cond) == EQ
1732 : 188484 : && REG_P (XEXP (cond, 0)) && CONSTANT_P (XEXP (cond, 1)))
1733 : : {
1734 : 62024 : *expr = simplify_replace_rtx (*expr, XEXP (cond, 0), XEXP (cond, 1));
1735 : 62024 : return;
1736 : : }
1737 : :
1738 : 1047717 : if (!COMPARISON_P (exp))
1739 : : return;
1740 : :
1741 : 496447 : rev = reversed_condition (cond);
1742 : 496447 : reve = reversed_condition (exp);
1743 : :
1744 : 496447 : cond = canon_condition (cond);
1745 : 496447 : exp = canon_condition (exp);
1746 : 496447 : if (rev)
1747 : 495061 : rev = canon_condition (rev);
1748 : 496447 : if (reve)
1749 : 496447 : reve = canon_condition (reve);
1750 : :
1751 : 496447 : if (rtx_equal_p (exp, cond))
1752 : : {
1753 : 5427 : *expr = const_true_rtx;
1754 : 5427 : return;
1755 : : }
1756 : :
1757 : 491020 : if (rev && rtx_equal_p (exp, rev))
1758 : : {
1759 : 1009 : *expr = const0_rtx;
1760 : 1009 : return;
1761 : : }
1762 : :
1763 : 490011 : if (implies_p (cond, exp))
1764 : : {
1765 : 27856 : *expr = const_true_rtx;
1766 : 27856 : return;
1767 : : }
1768 : :
1769 : 462155 : if (reve && implies_p (cond, reve))
1770 : : {
1771 : 269 : *expr = const0_rtx;
1772 : 269 : return;
1773 : : }
1774 : :
1775 : : /* A proof by contradiction. If *EXPR implies (not cond), *EXPR must
1776 : : be false. */
1777 : 461886 : if (rev && implies_p (exp, rev))
1778 : : {
1779 : 4960 : *expr = const0_rtx;
1780 : 4960 : return;
1781 : : }
1782 : :
1783 : : /* Similarly, If (not *EXPR) implies (not cond), *EXPR must be true. */
1784 : 456926 : if (rev && reve && implies_p (reve, rev))
1785 : : {
1786 : 1291 : *expr = const_true_rtx;
1787 : 1291 : return;
1788 : : }
1789 : :
1790 : : /* We would like to have some other tests here. TODO. */
1791 : :
1792 : : return;
1793 : : }
1794 : :
1795 : : /* Use relationship between A and *B to eventually eliminate *B.
1796 : : OP is the operation we consider. */
1797 : :
1798 : : static void
1799 : 153038 : eliminate_implied_condition (enum rtx_code op, rtx a, rtx *b)
1800 : : {
1801 : 153038 : switch (op)
1802 : : {
1803 : 0 : case AND:
1804 : : /* If A implies *B, we may replace *B by true. */
1805 : 0 : if (implies_p (a, *b))
1806 : 0 : *b = const_true_rtx;
1807 : : break;
1808 : :
1809 : 153038 : case IOR:
1810 : : /* If *B implies A, we may replace *B by false. */
1811 : 153038 : if (implies_p (*b, a))
1812 : 12385 : *b = const0_rtx;
1813 : : break;
1814 : :
1815 : 0 : default:
1816 : 0 : gcc_unreachable ();
1817 : : }
1818 : 153038 : }
1819 : :
1820 : : /* Eliminates the conditions in TAIL that are implied by HEAD. OP is the
1821 : : operation we consider. */
1822 : :
1823 : : static void
1824 : 620647 : eliminate_implied_conditions (enum rtx_code op, rtx *head, rtx tail)
1825 : : {
1826 : 620647 : rtx elt;
1827 : :
1828 : 697166 : for (elt = tail; elt; elt = XEXP (elt, 1))
1829 : 76519 : eliminate_implied_condition (op, *head, &XEXP (elt, 0));
1830 : 697166 : for (elt = tail; elt; elt = XEXP (elt, 1))
1831 : 76519 : eliminate_implied_condition (op, XEXP (elt, 0), head);
1832 : 620647 : }
1833 : :
1834 : : /* Simplifies *EXPR using initial values at the start of the LOOP. If *EXPR
1835 : : is a list, its elements are assumed to be combined using OP. */
1836 : :
1837 : : static void
1838 : 4500421 : simplify_using_initial_values (class loop *loop, enum rtx_code op, rtx *expr)
1839 : : {
1840 : 4500421 : bool expression_valid;
1841 : 4500421 : rtx head, tail, last_valid_expr;
1842 : 4500421 : rtx_expr_list *cond_list;
1843 : 4500421 : rtx_insn *insn;
1844 : 4500421 : rtx neutral, aggr;
1845 : 4500421 : regset altered, this_altered;
1846 : 4500421 : edge e;
1847 : :
1848 : 4500421 : if (!*expr)
1849 : 3422998 : return;
1850 : :
1851 : 2201703 : if (CONSTANT_P (*expr))
1852 : : return;
1853 : :
1854 : 1698070 : if (GET_CODE (*expr) == EXPR_LIST)
1855 : : {
1856 : 620647 : head = XEXP (*expr, 0);
1857 : 620647 : tail = XEXP (*expr, 1);
1858 : :
1859 : 620647 : eliminate_implied_conditions (op, &head, tail);
1860 : :
1861 : 620647 : switch (op)
1862 : : {
1863 : 4783 : case AND:
1864 : 4783 : neutral = const_true_rtx;
1865 : 4783 : aggr = const0_rtx;
1866 : 4783 : break;
1867 : :
1868 : 615864 : case IOR:
1869 : 615864 : neutral = const0_rtx;
1870 : 615864 : aggr = const_true_rtx;
1871 : 615864 : break;
1872 : :
1873 : 0 : default:
1874 : 0 : gcc_unreachable ();
1875 : : }
1876 : :
1877 : 620647 : simplify_using_initial_values (loop, UNKNOWN, &head);
1878 : 620647 : if (head == aggr)
1879 : : {
1880 : 12 : XEXP (*expr, 0) = aggr;
1881 : 12 : XEXP (*expr, 1) = NULL_RTX;
1882 : 12 : return;
1883 : : }
1884 : 620635 : else if (head == neutral)
1885 : : {
1886 : 350656 : *expr = tail;
1887 : 350656 : simplify_using_initial_values (loop, op, expr);
1888 : 350656 : return;
1889 : : }
1890 : 269979 : simplify_using_initial_values (loop, op, &tail);
1891 : :
1892 : 269979 : if (tail && XEXP (tail, 0) == aggr)
1893 : : {
1894 : 0 : *expr = tail;
1895 : 0 : return;
1896 : : }
1897 : :
1898 : 269979 : XEXP (*expr, 0) = head;
1899 : 269979 : XEXP (*expr, 1) = tail;
1900 : 269979 : return;
1901 : : }
1902 : :
1903 : 1077423 : gcc_assert (op == UNKNOWN);
1904 : :
1905 : 1077423 : replace_single_def_regs (expr);
1906 : 1077423 : if (CONSTANT_P (*expr))
1907 : : return;
1908 : :
1909 : 1077423 : e = loop_preheader_edge (loop);
1910 : 1077423 : if (e->src == ENTRY_BLOCK_PTR_FOR_FN (cfun))
1911 : : return;
1912 : :
1913 : 1077423 : altered = ALLOC_REG_SET (®_obstack);
1914 : 1077423 : this_altered = ALLOC_REG_SET (®_obstack);
1915 : :
1916 : 1077423 : expression_valid = true;
1917 : 1077423 : last_valid_expr = *expr;
1918 : 1077423 : cond_list = NULL;
1919 : 1939746 : while (1)
1920 : : {
1921 : 1939746 : insn = BB_END (e->src);
1922 : 1939746 : if (any_condjump_p (insn) && onlyjump_p (insn))
1923 : : {
1924 : 832561 : rtx cond = get_condition (BB_END (e->src), NULL, false, true);
1925 : :
1926 : 832561 : if (cond && (e->flags & EDGE_FALLTHRU))
1927 : 557689 : cond = reversed_condition (cond);
1928 : 824759 : if (cond)
1929 : : {
1930 : 821926 : rtx old = *expr;
1931 : 821926 : simplify_using_condition (cond, expr, altered);
1932 : 821926 : if (old != *expr)
1933 : : {
1934 : 34686 : rtx note;
1935 : 34686 : if (CONSTANT_P (*expr))
1936 : 34134 : goto out;
1937 : 925 : for (note = cond_list; note; note = XEXP (note, 1))
1938 : : {
1939 : 510 : simplify_using_condition (XEXP (note, 0), expr, altered);
1940 : 510 : if (CONSTANT_P (*expr))
1941 : 137 : goto out;
1942 : : }
1943 : : }
1944 : 787655 : cond_list = alloc_EXPR_LIST (0, cond, cond_list);
1945 : : }
1946 : : }
1947 : :
1948 : 16832602 : FOR_BB_INSNS_REVERSE (e->src, insn)
1949 : : {
1950 : 15582894 : rtx src, dest;
1951 : 15582894 : rtx old = *expr;
1952 : :
1953 : 15582894 : if (!INSN_P (insn))
1954 : 1941703 : continue;
1955 : :
1956 : 13641191 : CLEAR_REG_SET (this_altered);
1957 : 13641191 : note_stores (insn, mark_altered, this_altered);
1958 : 13641191 : if (CALL_P (insn))
1959 : : {
1960 : : /* Kill all registers that might be clobbered by the call.
1961 : : We don't track modes of hard registers, so we need to be
1962 : : conservative and assume that partial kills are full kills. */
1963 : 118848 : function_abi callee_abi = insn_callee_abi (insn);
1964 : 118848 : IOR_REG_SET_HRS (this_altered,
1965 : : callee_abi.full_and_partial_reg_clobbers ());
1966 : : }
1967 : :
1968 : 13641191 : if (suitable_set_for_replacement (insn, &dest, &src))
1969 : : {
1970 : 3764500 : rtx_expr_list **pnote, **pnote_next;
1971 : :
1972 : 3764500 : replace_in_expr (expr, dest, src);
1973 : 3764500 : if (CONSTANT_P (*expr))
1974 : 655767 : goto out;
1975 : :
1976 : 4806678 : for (pnote = &cond_list; *pnote; pnote = pnote_next)
1977 : : {
1978 : 1331244 : rtx_expr_list *note = *pnote;
1979 : 1331244 : rtx old_cond = XEXP (note, 0);
1980 : :
1981 : 1331244 : pnote_next = (rtx_expr_list **)&XEXP (note, 1);
1982 : 1331244 : replace_in_expr (&XEXP (note, 0), dest, src);
1983 : :
1984 : : /* We can no longer use a condition that has been simplified
1985 : : to a constant, and simplify_using_condition will abort if
1986 : : we try. */
1987 : 1331244 : if (CONSTANT_P (XEXP (note, 0)))
1988 : : {
1989 : 12 : *pnote = *pnote_next;
1990 : 12 : pnote_next = pnote;
1991 : 12 : free_EXPR_LIST_node (note);
1992 : : }
1993 : : /* Retry simplifications with this condition if either the
1994 : : expression or the condition changed. */
1995 : 1331232 : else if (old_cond != XEXP (note, 0) || old != *expr)
1996 : 301421 : simplify_using_condition (XEXP (note, 0), expr, altered);
1997 : : }
1998 : : }
1999 : : else
2000 : : {
2001 : 9876691 : rtx_expr_list **pnote, **pnote_next;
2002 : :
2003 : : /* If we did not use this insn to make a replacement, any overlap
2004 : : between stores in this insn and our expression will cause the
2005 : : expression to become invalid. */
2006 : 9876691 : if (altered_reg_used (*expr, this_altered))
2007 : 359420 : goto out;
2008 : :
2009 : : /* Likewise for the conditions. */
2010 : 22480485 : for (pnote = &cond_list; *pnote; pnote = pnote_next)
2011 : : {
2012 : 12963214 : rtx_expr_list *note = *pnote;
2013 : 12963214 : rtx old_cond = XEXP (note, 0);
2014 : :
2015 : 12963214 : pnote_next = (rtx_expr_list **)&XEXP (note, 1);
2016 : 12963214 : if (altered_reg_used (old_cond, this_altered))
2017 : : {
2018 : 166626 : *pnote = *pnote_next;
2019 : 166626 : pnote_next = pnote;
2020 : 166626 : free_EXPR_LIST_node (note);
2021 : : }
2022 : : }
2023 : : }
2024 : :
2025 : 12992705 : if (CONSTANT_P (*expr))
2026 : 7281 : goto out;
2027 : :
2028 : 12985424 : IOR_REG_SET (altered, this_altered);
2029 : :
2030 : : /* If the expression now contains regs that have been altered, we
2031 : : can't return it to the caller. However, it is still valid for
2032 : : further simplification, so keep searching to see if we can
2033 : : eventually turn it into a constant. */
2034 : 12985424 : if (altered_reg_used (*expr, altered))
2035 : : expression_valid = false;
2036 : 12883685 : if (expression_valid)
2037 : 12864710 : last_valid_expr = *expr;
2038 : : }
2039 : :
2040 : 1249708 : if (!single_pred_p (e->src)
2041 : 1249708 : || single_pred (e->src) == ENTRY_BLOCK_PTR_FOR_FN (cfun))
2042 : : break;
2043 : : e = single_pred_edge (e->src);
2044 : : }
2045 : :
2046 : 1077423 : out:
2047 : 1077423 : free_EXPR_LIST_list (&cond_list);
2048 : 1077423 : if (!CONSTANT_P (*expr))
2049 : 746805 : *expr = last_valid_expr;
2050 : 1077423 : FREE_REG_SET (altered);
2051 : 1077423 : FREE_REG_SET (this_altered);
2052 : : }
2053 : :
2054 : : /* Transforms invariant IV into MODE. Adds assumptions based on the fact
2055 : : that IV occurs as left operands of comparison COND and its signedness
2056 : : is SIGNED_P to DESC. */
2057 : :
2058 : : static void
2059 : 1 : shorten_into_mode (class rtx_iv *iv, scalar_int_mode mode,
2060 : : enum rtx_code cond, bool signed_p, class niter_desc *desc)
2061 : : {
2062 : 1 : rtx mmin, mmax, cond_over, cond_under;
2063 : :
2064 : 1 : get_mode_bounds (mode, signed_p, iv->extend_mode, &mmin, &mmax);
2065 : 1 : cond_under = simplify_gen_relational (LT, SImode, iv->extend_mode,
2066 : : iv->base, mmin);
2067 : 1 : cond_over = simplify_gen_relational (GT, SImode, iv->extend_mode,
2068 : : iv->base, mmax);
2069 : :
2070 : 1 : switch (cond)
2071 : : {
2072 : 0 : case LE:
2073 : 0 : case LT:
2074 : 0 : case LEU:
2075 : 0 : case LTU:
2076 : 0 : if (cond_under != const0_rtx)
2077 : 0 : desc->infinite =
2078 : 0 : alloc_EXPR_LIST (0, cond_under, desc->infinite);
2079 : 0 : if (cond_over != const0_rtx)
2080 : 0 : desc->noloop_assumptions =
2081 : 0 : alloc_EXPR_LIST (0, cond_over, desc->noloop_assumptions);
2082 : : break;
2083 : :
2084 : 1 : case GE:
2085 : 1 : case GT:
2086 : 1 : case GEU:
2087 : 1 : case GTU:
2088 : 1 : if (cond_over != const0_rtx)
2089 : 1 : desc->infinite =
2090 : 1 : alloc_EXPR_LIST (0, cond_over, desc->infinite);
2091 : 1 : if (cond_under != const0_rtx)
2092 : 1 : desc->noloop_assumptions =
2093 : 1 : alloc_EXPR_LIST (0, cond_under, desc->noloop_assumptions);
2094 : : break;
2095 : :
2096 : 0 : case NE:
2097 : 0 : if (cond_over != const0_rtx)
2098 : 0 : desc->infinite =
2099 : 0 : alloc_EXPR_LIST (0, cond_over, desc->infinite);
2100 : 0 : if (cond_under != const0_rtx)
2101 : 0 : desc->infinite =
2102 : 0 : alloc_EXPR_LIST (0, cond_under, desc->infinite);
2103 : : break;
2104 : :
2105 : 0 : default:
2106 : 0 : gcc_unreachable ();
2107 : : }
2108 : :
2109 : 1 : iv->mode = mode;
2110 : 1 : iv->extend = signed_p ? IV_SIGN_EXTEND : IV_ZERO_EXTEND;
2111 : 1 : }
2112 : :
2113 : : /* Transforms IV0 and IV1 compared by COND so that they are both compared as
2114 : : subregs of the same mode if possible (sometimes it is necessary to add
2115 : : some assumptions to DESC). */
2116 : :
2117 : : static bool
2118 : 391238 : canonicalize_iv_subregs (class rtx_iv *iv0, class rtx_iv *iv1,
2119 : : enum rtx_code cond, class niter_desc *desc)
2120 : : {
2121 : 391238 : scalar_int_mode comp_mode;
2122 : 391238 : bool signed_p;
2123 : :
2124 : : /* If the ivs behave specially in the first iteration, or are
2125 : : added/multiplied after extending, we ignore them. */
2126 : 391238 : if (iv0->first_special || iv0->mult != const1_rtx || iv0->delta != const0_rtx)
2127 : : return false;
2128 : 391237 : if (iv1->first_special || iv1->mult != const1_rtx || iv1->delta != const0_rtx)
2129 : : return false;
2130 : :
2131 : : /* If there is some extend, it must match signedness of the comparison. */
2132 : 391237 : switch (cond)
2133 : : {
2134 : 31784 : case LE:
2135 : 31784 : case LT:
2136 : 31784 : if (iv0->extend == IV_ZERO_EXTEND
2137 : 31784 : || iv1->extend == IV_ZERO_EXTEND)
2138 : : return false;
2139 : : signed_p = true;
2140 : : break;
2141 : :
2142 : 26412 : case LEU:
2143 : 26412 : case LTU:
2144 : 26412 : if (iv0->extend == IV_SIGN_EXTEND
2145 : 26412 : || iv1->extend == IV_SIGN_EXTEND)
2146 : : return false;
2147 : : signed_p = false;
2148 : : break;
2149 : :
2150 : 333041 : case NE:
2151 : 333041 : if (iv0->extend != IV_UNKNOWN_EXTEND
2152 : 0 : && iv1->extend != IV_UNKNOWN_EXTEND
2153 : 0 : && iv0->extend != iv1->extend)
2154 : : return false;
2155 : :
2156 : 333041 : signed_p = false;
2157 : 333041 : if (iv0->extend != IV_UNKNOWN_EXTEND)
2158 : 0 : signed_p = iv0->extend == IV_SIGN_EXTEND;
2159 : 333041 : if (iv1->extend != IV_UNKNOWN_EXTEND)
2160 : 0 : signed_p = iv1->extend == IV_SIGN_EXTEND;
2161 : : break;
2162 : :
2163 : 0 : default:
2164 : 0 : gcc_unreachable ();
2165 : : }
2166 : :
2167 : : /* Values of both variables should be computed in the same mode. These
2168 : : might indeed be different, if we have comparison like
2169 : :
2170 : : (compare (subreg:SI (iv0)) (subreg:SI (iv1)))
2171 : :
2172 : : and iv0 and iv1 are both ivs iterating in SI mode, but calculated
2173 : : in different modes. This does not seem impossible to handle, but
2174 : : it hardly ever occurs in practice.
2175 : :
2176 : : The only exception is the case when one of operands is invariant.
2177 : : For example pentium 3 generates comparisons like
2178 : : (lt (subreg:HI (reg:SI)) 100). Here we assign HImode to 100, but we
2179 : : definitely do not want this prevent the optimization. */
2180 : 391237 : comp_mode = iv0->extend_mode;
2181 : 1173711 : if (GET_MODE_BITSIZE (comp_mode) < GET_MODE_BITSIZE (iv1->extend_mode))
2182 : 391237 : comp_mode = iv1->extend_mode;
2183 : :
2184 : 391237 : if (iv0->extend_mode != comp_mode)
2185 : : {
2186 : 271 : if (iv0->mode != iv0->extend_mode
2187 : 271 : || iv0->step != const0_rtx)
2188 : : return false;
2189 : :
2190 : 271 : iv0->base = simplify_gen_unary (signed_p ? SIGN_EXTEND : ZERO_EXTEND,
2191 : : comp_mode, iv0->base, iv0->mode);
2192 : 271 : iv0->extend_mode = comp_mode;
2193 : : }
2194 : :
2195 : 391237 : if (iv1->extend_mode != comp_mode)
2196 : : {
2197 : 4754 : if (iv1->mode != iv1->extend_mode
2198 : 4754 : || iv1->step != const0_rtx)
2199 : : return false;
2200 : :
2201 : 4750 : iv1->base = simplify_gen_unary (signed_p ? SIGN_EXTEND : ZERO_EXTEND,
2202 : : comp_mode, iv1->base, iv1->mode);
2203 : 4750 : iv1->extend_mode = comp_mode;
2204 : : }
2205 : :
2206 : : /* Check that both ivs belong to a range of a single mode. If one of the
2207 : : operands is an invariant, we may need to shorten it into the common
2208 : : mode. */
2209 : 391233 : if (iv0->mode == iv0->extend_mode
2210 : 386211 : && iv0->step == const0_rtx
2211 : 506112 : && iv0->mode != iv1->mode)
2212 : 0 : shorten_into_mode (iv0, iv1->mode, cond, signed_p, desc);
2213 : :
2214 : 391233 : if (iv1->mode == iv1->extend_mode
2215 : 386212 : && iv1->step == const0_rtx
2216 : 667688 : && iv0->mode != iv1->mode)
2217 : 1 : shorten_into_mode (iv1, iv0->mode, swap_condition (cond), signed_p, desc);
2218 : :
2219 : 391233 : if (iv0->mode != iv1->mode)
2220 : : return false;
2221 : :
2222 : 391233 : desc->mode = iv0->mode;
2223 : 391233 : desc->signed_p = signed_p;
2224 : :
2225 : 391233 : return true;
2226 : : }
2227 : :
2228 : : /* Tries to estimate the maximum number of iterations in LOOP, and return the
2229 : : result. This function is called from iv_number_of_iterations with
2230 : : a number of fields in DESC already filled in. OLD_NITER is the original
2231 : : expression for the number of iterations, before we tried to simplify it. */
2232 : :
2233 : : static uint64_t
2234 : 194167 : determine_max_iter (class loop *loop, class niter_desc *desc, rtx old_niter)
2235 : : {
2236 : 194167 : rtx niter = desc->niter_expr;
2237 : 194167 : rtx mmin, mmax, cmp;
2238 : 194167 : uint64_t nmax, inc;
2239 : 194167 : uint64_t andmax = 0;
2240 : :
2241 : : /* We used to look for constant operand 0 of AND,
2242 : : but canonicalization should always make this impossible. */
2243 : 194167 : gcc_checking_assert (GET_CODE (niter) != AND
2244 : : || !CONST_INT_P (XEXP (niter, 0)));
2245 : :
2246 : 194167 : if (GET_CODE (niter) == AND
2247 : 8936 : && CONST_INT_P (XEXP (niter, 1)))
2248 : : {
2249 : 8936 : andmax = UINTVAL (XEXP (niter, 1));
2250 : 8936 : niter = XEXP (niter, 0);
2251 : : }
2252 : :
2253 : 194167 : get_mode_bounds (desc->mode, desc->signed_p, desc->mode, &mmin, &mmax);
2254 : 194167 : nmax = UINTVAL (mmax) - UINTVAL (mmin);
2255 : :
2256 : 194167 : if (GET_CODE (niter) == UDIV)
2257 : : {
2258 : 2682 : if (!CONST_INT_P (XEXP (niter, 1)))
2259 : : return nmax;
2260 : 2682 : inc = INTVAL (XEXP (niter, 1));
2261 : 2682 : niter = XEXP (niter, 0);
2262 : : }
2263 : : else
2264 : : inc = 1;
2265 : :
2266 : : /* We could use a binary search here, but for now improving the upper
2267 : : bound by just one eliminates one important corner case. */
2268 : 194167 : cmp = simplify_gen_relational (desc->signed_p ? LT : LTU, VOIDmode,
2269 : : desc->mode, old_niter, mmax);
2270 : 194167 : simplify_using_initial_values (loop, UNKNOWN, &cmp);
2271 : 194167 : if (cmp == const_true_rtx)
2272 : : {
2273 : 105675 : nmax--;
2274 : :
2275 : 105675 : if (dump_file)
2276 : 15 : fprintf (dump_file, ";; improved upper bound by one.\n");
2277 : : }
2278 : 194167 : nmax /= inc;
2279 : 194167 : if (andmax)
2280 : 8936 : nmax = MIN (nmax, andmax);
2281 : 194167 : if (dump_file)
2282 : 24 : fprintf (dump_file, ";; Determined upper bound %" PRId64".\n",
2283 : : nmax);
2284 : : return nmax;
2285 : : }
2286 : :
2287 : : /* Computes number of iterations of the CONDITION in INSN in LOOP and stores
2288 : : the result into DESC. Very similar to determine_number_of_iterations
2289 : : (basically its rtl version), complicated by things like subregs. */
2290 : :
2291 : : static void
2292 : 663506 : iv_number_of_iterations (class loop *loop, rtx_insn *insn, rtx condition,
2293 : : class niter_desc *desc)
2294 : : {
2295 : 663506 : rtx op0, op1, delta, step, bound, may_xform, tmp, tmp0, tmp1;
2296 : 663506 : class rtx_iv iv0, iv1;
2297 : 663506 : rtx assumption, may_not_xform;
2298 : 663506 : enum rtx_code cond;
2299 : 663506 : machine_mode nonvoid_mode;
2300 : 663506 : scalar_int_mode comp_mode;
2301 : 663506 : rtx mmin, mmax, mode_mmin, mode_mmax;
2302 : 663506 : uint64_t s, size, d, inv, max, up, down;
2303 : 663506 : int64_t inc, step_val;
2304 : 663506 : int was_sharp = false;
2305 : 663506 : rtx old_niter;
2306 : 663506 : bool step_is_pow2;
2307 : :
2308 : : /* The meaning of these assumptions is this:
2309 : : if !assumptions
2310 : : then the rest of information does not have to be valid
2311 : : if noloop_assumptions then the loop does not roll
2312 : : if infinite then this exit is never used */
2313 : :
2314 : 663506 : desc->assumptions = NULL_RTX;
2315 : 663506 : desc->noloop_assumptions = NULL_RTX;
2316 : 663506 : desc->infinite = NULL_RTX;
2317 : 663506 : desc->simple_p = true;
2318 : :
2319 : 663506 : desc->const_iter = false;
2320 : 663506 : desc->niter_expr = NULL_RTX;
2321 : :
2322 : 663506 : cond = GET_CODE (condition);
2323 : 663506 : gcc_assert (COMPARISON_P (condition));
2324 : :
2325 : 663506 : nonvoid_mode = GET_MODE (XEXP (condition, 0));
2326 : 663506 : if (nonvoid_mode == VOIDmode)
2327 : 0 : nonvoid_mode = GET_MODE (XEXP (condition, 1));
2328 : : /* The constant comparisons should be folded. */
2329 : 663506 : gcc_assert (nonvoid_mode != VOIDmode);
2330 : :
2331 : : /* We only handle integers or pointers. */
2332 : 663506 : scalar_int_mode mode;
2333 : 663506 : if (!is_a <scalar_int_mode> (nonvoid_mode, &mode))
2334 : 460 : goto fail;
2335 : :
2336 : 663046 : op0 = XEXP (condition, 0);
2337 : 663046 : if (!iv_analyze (insn, mode, op0, &iv0))
2338 : 239985 : goto fail;
2339 : :
2340 : 423061 : op1 = XEXP (condition, 1);
2341 : 423061 : if (!iv_analyze (insn, mode, op1, &iv1))
2342 : 29155 : goto fail;
2343 : :
2344 : 787609 : if (GET_MODE_BITSIZE (iv0.extend_mode) > HOST_BITS_PER_WIDE_INT
2345 : 787609 : || GET_MODE_BITSIZE (iv1.extend_mode) > HOST_BITS_PER_WIDE_INT)
2346 : 205 : goto fail;
2347 : :
2348 : : /* Check condition and normalize it. */
2349 : :
2350 : 393701 : switch (cond)
2351 : : {
2352 : 23681 : case GE:
2353 : 23681 : case GT:
2354 : 23681 : case GEU:
2355 : 23681 : case GTU:
2356 : 23681 : std::swap (iv0, iv1);
2357 : 23681 : cond = swap_condition (cond);
2358 : 23681 : break;
2359 : : case NE:
2360 : : case LE:
2361 : : case LEU:
2362 : : case LT:
2363 : : case LTU:
2364 : : break;
2365 : 2463 : default:
2366 : 2463 : goto fail;
2367 : : }
2368 : :
2369 : : /* Handle extends. This is relatively nontrivial, so we only try in some
2370 : : easy cases, when we can canonicalize the ivs (possibly by adding some
2371 : : assumptions) to shape subreg (base + i * step). This function also fills
2372 : : in desc->mode and desc->signed_p. */
2373 : :
2374 : 391238 : if (!canonicalize_iv_subregs (&iv0, &iv1, cond, desc))
2375 : 5 : goto fail;
2376 : :
2377 : 391233 : comp_mode = iv0.extend_mode;
2378 : 391233 : mode = iv0.mode;
2379 : 391233 : size = GET_MODE_PRECISION (mode);
2380 : 391233 : get_mode_bounds (mode, (cond == LE || cond == LT), comp_mode, &mmin, &mmax);
2381 : 391233 : mode_mmin = lowpart_subreg (mode, mmin, comp_mode);
2382 : 391233 : mode_mmax = lowpart_subreg (mode, mmax, comp_mode);
2383 : :
2384 : 391233 : if (!CONST_INT_P (iv0.step) || !CONST_INT_P (iv1.step))
2385 : 0 : goto fail;
2386 : :
2387 : : /* We can take care of the case of two induction variables chasing each other
2388 : : if the test is NE. I have never seen a loop using it, but still it is
2389 : : cool. */
2390 : 391233 : if (iv0.step != const0_rtx && iv1.step != const0_rtx)
2391 : : {
2392 : 313 : if (cond != NE)
2393 : 177 : goto fail;
2394 : :
2395 : 136 : iv0.step = simplify_gen_binary (MINUS, comp_mode, iv0.step, iv1.step);
2396 : 136 : iv1.step = const0_rtx;
2397 : : }
2398 : :
2399 : 391056 : iv0.step = lowpart_subreg (mode, iv0.step, comp_mode);
2400 : 391056 : iv1.step = lowpart_subreg (mode, iv1.step, comp_mode);
2401 : :
2402 : : /* This is either infinite loop or the one that ends immediately, depending
2403 : : on initial values. Unswitching should remove this kind of conditions. */
2404 : 391056 : if (iv0.step == const0_rtx && iv1.step == const0_rtx)
2405 : 5547 : goto fail;
2406 : :
2407 : 385509 : if (cond != NE)
2408 : : {
2409 : 53618 : if (iv0.step == const0_rtx)
2410 : 4995 : step_val = -INTVAL (iv1.step);
2411 : : else
2412 : 48623 : step_val = INTVAL (iv0.step);
2413 : :
2414 : : /* Ignore loops of while (i-- < 10) type. */
2415 : 53618 : if (step_val < 0)
2416 : 2384 : goto fail;
2417 : :
2418 : 51234 : step_is_pow2 = !(step_val & (step_val - 1));
2419 : : }
2420 : : else
2421 : : {
2422 : : /* We do not care about whether the step is power of two in this
2423 : : case. */
2424 : : step_is_pow2 = false;
2425 : 395203 : step_val = 0;
2426 : : }
2427 : :
2428 : : /* Some more condition normalization. We must record some assumptions
2429 : : due to overflows. */
2430 : 51234 : switch (cond)
2431 : : {
2432 : 39156 : case LT:
2433 : 39156 : case LTU:
2434 : : /* We want to take care only of non-sharp relationals; this is easy,
2435 : : as in cases the overflow would make the transformation unsafe
2436 : : the loop does not roll. Seemingly it would make more sense to want
2437 : : to take care of sharp relationals instead, as NE is more similar to
2438 : : them, but the problem is that here the transformation would be more
2439 : : difficult due to possibly infinite loops. */
2440 : 39156 : if (iv0.step == const0_rtx)
2441 : : {
2442 : 3456 : tmp = lowpart_subreg (mode, iv0.base, comp_mode);
2443 : 3456 : assumption = simplify_gen_relational (EQ, SImode, mode, tmp,
2444 : : mode_mmax);
2445 : 3456 : if (assumption == const_true_rtx)
2446 : 0 : goto zero_iter_simplify;
2447 : 3456 : iv0.base = simplify_gen_binary (PLUS, comp_mode,
2448 : : iv0.base, const1_rtx);
2449 : : }
2450 : : else
2451 : : {
2452 : 35700 : tmp = lowpart_subreg (mode, iv1.base, comp_mode);
2453 : 35700 : assumption = simplify_gen_relational (EQ, SImode, mode, tmp,
2454 : : mode_mmin);
2455 : 35700 : if (assumption == const_true_rtx)
2456 : 0 : goto zero_iter_simplify;
2457 : 35700 : iv1.base = simplify_gen_binary (PLUS, comp_mode,
2458 : : iv1.base, constm1_rtx);
2459 : : }
2460 : :
2461 : 39156 : if (assumption != const0_rtx)
2462 : 36788 : desc->noloop_assumptions =
2463 : 36788 : alloc_EXPR_LIST (0, assumption, desc->noloop_assumptions);
2464 : 39156 : cond = (cond == LT) ? LE : LEU;
2465 : :
2466 : : /* It will be useful to be able to tell the difference once more in
2467 : : LE -> NE reduction. */
2468 : : was_sharp = true;
2469 : : break;
2470 : 343969 : default: ;
2471 : : }
2472 : :
2473 : : /* Take care of trivially infinite loops. */
2474 : 343969 : if (cond != NE)
2475 : : {
2476 : 51234 : if (iv0.step == const0_rtx)
2477 : : {
2478 : 4325 : tmp = lowpart_subreg (mode, iv0.base, comp_mode);
2479 : 4325 : if (rtx_equal_p (tmp, mode_mmin))
2480 : : {
2481 : 0 : desc->infinite =
2482 : 0 : alloc_EXPR_LIST (0, const_true_rtx, NULL_RTX);
2483 : : /* Fill in the remaining fields somehow. */
2484 : 0 : goto zero_iter_simplify;
2485 : : }
2486 : : }
2487 : : else
2488 : : {
2489 : 46909 : tmp = lowpart_subreg (mode, iv1.base, comp_mode);
2490 : 46909 : if (rtx_equal_p (tmp, mode_mmax))
2491 : : {
2492 : 0 : desc->infinite =
2493 : 0 : alloc_EXPR_LIST (0, const_true_rtx, NULL_RTX);
2494 : : /* Fill in the remaining fields somehow. */
2495 : 0 : goto zero_iter_simplify;
2496 : : }
2497 : : }
2498 : : }
2499 : :
2500 : : /* If we can we want to take care of NE conditions instead of size
2501 : : comparisons, as they are much more friendly (most importantly
2502 : : this takes care of special handling of loops with step 1). We can
2503 : : do it if we first check that upper bound is greater or equal to
2504 : : lower bound, their difference is constant c modulo step and that
2505 : : there is not an overflow. */
2506 : 51234 : if (cond != NE)
2507 : : {
2508 : 51234 : if (iv0.step == const0_rtx)
2509 : 4325 : step = simplify_gen_unary (NEG, comp_mode, iv1.step, comp_mode);
2510 : : else
2511 : : step = iv0.step;
2512 : 51234 : step = lowpart_subreg (mode, step, comp_mode);
2513 : 51234 : delta = simplify_gen_binary (MINUS, comp_mode, iv1.base, iv0.base);
2514 : 51234 : delta = lowpart_subreg (mode, delta, comp_mode);
2515 : 51234 : delta = simplify_gen_binary (UMOD, mode, delta, step);
2516 : 51234 : may_xform = const0_rtx;
2517 : 51234 : may_not_xform = const_true_rtx;
2518 : :
2519 : 51234 : if (CONST_INT_P (delta))
2520 : : {
2521 : 31851 : if (was_sharp && INTVAL (delta) == INTVAL (step) - 1)
2522 : : {
2523 : : /* A special case. We have transformed condition of type
2524 : : for (i = 0; i < 4; i += 4)
2525 : : into
2526 : : for (i = 0; i <= 3; i += 4)
2527 : : obviously if the test for overflow during that transformation
2528 : : passed, we cannot overflow here. Most importantly any
2529 : : loop with sharp end condition and step 1 falls into this
2530 : : category, so handling this case specially is definitely
2531 : : worth the troubles. */
2532 : : may_xform = const_true_rtx;
2533 : : }
2534 : 8618 : else if (iv0.step == const0_rtx)
2535 : : {
2536 : 654 : bound = simplify_gen_binary (PLUS, comp_mode, mmin, step);
2537 : 654 : bound = simplify_gen_binary (MINUS, comp_mode, bound, delta);
2538 : 654 : bound = lowpart_subreg (mode, bound, comp_mode);
2539 : 654 : tmp = lowpart_subreg (mode, iv0.base, comp_mode);
2540 : 654 : may_xform = simplify_gen_relational (cond, SImode, mode,
2541 : : bound, tmp);
2542 : 654 : may_not_xform = simplify_gen_relational (reverse_condition (cond),
2543 : : SImode, mode,
2544 : : bound, tmp);
2545 : : }
2546 : : else
2547 : : {
2548 : 7964 : bound = simplify_gen_binary (MINUS, comp_mode, mmax, step);
2549 : 7964 : bound = simplify_gen_binary (PLUS, comp_mode, bound, delta);
2550 : 7964 : bound = lowpart_subreg (mode, bound, comp_mode);
2551 : 7964 : tmp = lowpart_subreg (mode, iv1.base, comp_mode);
2552 : 7964 : may_xform = simplify_gen_relational (cond, SImode, mode,
2553 : : tmp, bound);
2554 : 7964 : may_not_xform = simplify_gen_relational (reverse_condition (cond),
2555 : : SImode, mode,
2556 : : tmp, bound);
2557 : : }
2558 : : }
2559 : :
2560 : 51234 : if (may_xform != const0_rtx)
2561 : : {
2562 : : /* We perform the transformation always provided that it is not
2563 : : completely senseless. This is OK, as we would need this assumption
2564 : : to determine the number of iterations anyway. */
2565 : 31851 : if (may_xform != const_true_rtx)
2566 : : {
2567 : : /* If the step is a power of two and the final value we have
2568 : : computed overflows, the cycle is infinite. Otherwise it
2569 : : is nontrivial to compute the number of iterations. */
2570 : 8468 : if (step_is_pow2)
2571 : 8468 : desc->infinite = alloc_EXPR_LIST (0, may_not_xform,
2572 : : desc->infinite);
2573 : : else
2574 : 0 : desc->assumptions = alloc_EXPR_LIST (0, may_xform,
2575 : : desc->assumptions);
2576 : : }
2577 : :
2578 : : /* We are going to lose some information about upper bound on
2579 : : number of iterations in this step, so record the information
2580 : : here. */
2581 : 31851 : inc = INTVAL (iv0.step) - INTVAL (iv1.step);
2582 : 31851 : if (CONST_INT_P (iv1.base))
2583 : 464 : up = INTVAL (iv1.base);
2584 : : else
2585 : 31387 : up = INTVAL (mode_mmax) - inc;
2586 : 31851 : down = INTVAL (CONST_INT_P (iv0.base)
2587 : : ? iv0.base
2588 : : : mode_mmin);
2589 : 31851 : max = (up - down) / inc + 1;
2590 : 31851 : if (!desc->infinite
2591 : 23383 : && !desc->assumptions)
2592 : 23383 : record_niter_bound (loop, max, false, true);
2593 : :
2594 : 31851 : if (iv0.step == const0_rtx)
2595 : : {
2596 : 1698 : iv0.base = simplify_gen_binary (PLUS, comp_mode, iv0.base, delta);
2597 : 1698 : iv0.base = simplify_gen_binary (MINUS, comp_mode, iv0.base, step);
2598 : : }
2599 : : else
2600 : : {
2601 : 30153 : iv1.base = simplify_gen_binary (MINUS, comp_mode, iv1.base, delta);
2602 : 30153 : iv1.base = simplify_gen_binary (PLUS, comp_mode, iv1.base, step);
2603 : : }
2604 : :
2605 : 31851 : tmp0 = lowpart_subreg (mode, iv0.base, comp_mode);
2606 : 31851 : tmp1 = lowpart_subreg (mode, iv1.base, comp_mode);
2607 : 31851 : assumption = simplify_gen_relational (reverse_condition (cond),
2608 : : SImode, mode, tmp0, tmp1);
2609 : 31851 : if (assumption == const_true_rtx)
2610 : 0 : goto zero_iter_simplify;
2611 : 31851 : else if (assumption != const0_rtx)
2612 : 31851 : desc->noloop_assumptions =
2613 : 31851 : alloc_EXPR_LIST (0, assumption, desc->noloop_assumptions);
2614 : : cond = NE;
2615 : : }
2616 : : }
2617 : :
2618 : : /* Count the number of iterations. */
2619 : 19383 : if (cond == NE)
2620 : : {
2621 : : /* Everything we do here is just arithmetics modulo size of mode. This
2622 : : makes us able to do more involved computations of number of iterations
2623 : : than in other cases. First transform the condition into shape
2624 : : s * i <> c, with s positive. */
2625 : 363742 : iv1.base = simplify_gen_binary (MINUS, comp_mode, iv1.base, iv0.base);
2626 : 363742 : iv0.base = const0_rtx;
2627 : 363742 : iv0.step = simplify_gen_binary (MINUS, comp_mode, iv0.step, iv1.step);
2628 : 363742 : iv1.step = const0_rtx;
2629 : 363742 : if (INTVAL (iv0.step) < 0)
2630 : : {
2631 : 122435 : iv0.step = simplify_gen_unary (NEG, comp_mode, iv0.step, comp_mode);
2632 : 122435 : iv1.base = simplify_gen_unary (NEG, comp_mode, iv1.base, comp_mode);
2633 : : }
2634 : 363742 : iv0.step = lowpart_subreg (mode, iv0.step, comp_mode);
2635 : :
2636 : : /* Let nsd (s, size of mode) = d. If d does not divide c, the loop
2637 : : is infinite. Otherwise, the number of iterations is
2638 : : (inverse(s/d) * (c/d)) mod (size of mode/d). */
2639 : 363742 : s = INTVAL (iv0.step); d = 1;
2640 : 825774 : while (s % 2 != 1)
2641 : : {
2642 : 462032 : s /= 2;
2643 : 462032 : d *= 2;
2644 : 462032 : size--;
2645 : : }
2646 : 363742 : bound = gen_int_mode (((uint64_t) 1 << (size - 1) << 1) - 1, mode);
2647 : :
2648 : 363742 : tmp1 = lowpart_subreg (mode, iv1.base, comp_mode);
2649 : 363742 : tmp = simplify_gen_binary (UMOD, mode, tmp1, gen_int_mode (d, mode));
2650 : 363742 : assumption = simplify_gen_relational (NE, SImode, mode, tmp, const0_rtx);
2651 : 363742 : desc->infinite = alloc_EXPR_LIST (0, assumption, desc->infinite);
2652 : :
2653 : 363742 : tmp = simplify_gen_binary (UDIV, mode, tmp1, gen_int_mode (d, mode));
2654 : 363742 : inv = inverse (s, size);
2655 : 363742 : tmp = simplify_gen_binary (MULT, mode, tmp, gen_int_mode (inv, mode));
2656 : 363742 : desc->niter_expr = simplify_gen_binary (AND, mode, tmp, bound);
2657 : : }
2658 : : else
2659 : : {
2660 : 19383 : if (iv1.step == const0_rtx)
2661 : : /* Condition in shape a + s * i <= b
2662 : : We must know that b + s does not overflow and a <= b + s and then we
2663 : : can compute number of iterations as (b + s - a) / s. (It might
2664 : : seem that we in fact could be more clever about testing the b + s
2665 : : overflow condition using some information about b - a mod s,
2666 : : but it was already taken into account during LE -> NE transform). */
2667 : : {
2668 : 16756 : step = iv0.step;
2669 : 16756 : tmp0 = lowpart_subreg (mode, iv0.base, comp_mode);
2670 : 16756 : tmp1 = lowpart_subreg (mode, iv1.base, comp_mode);
2671 : :
2672 : 16756 : bound = simplify_gen_binary (MINUS, mode, mode_mmax,
2673 : : lowpart_subreg (mode, step,
2674 : : comp_mode));
2675 : 16756 : if (step_is_pow2)
2676 : : {
2677 : 15031 : rtx t0, t1;
2678 : :
2679 : : /* If s is power of 2, we know that the loop is infinite if
2680 : : a % s <= b % s and b + s overflows. */
2681 : 15031 : assumption = simplify_gen_relational (reverse_condition (cond),
2682 : : SImode, mode,
2683 : : tmp1, bound);
2684 : :
2685 : 15031 : t0 = simplify_gen_binary (UMOD, mode, copy_rtx (tmp0), step);
2686 : 15031 : t1 = simplify_gen_binary (UMOD, mode, copy_rtx (tmp1), step);
2687 : 15031 : tmp = simplify_gen_relational (cond, SImode, mode, t0, t1);
2688 : 15031 : assumption = simplify_gen_binary (AND, SImode, assumption, tmp);
2689 : 15031 : desc->infinite =
2690 : 15031 : alloc_EXPR_LIST (0, assumption, desc->infinite);
2691 : : }
2692 : : else
2693 : : {
2694 : 1725 : assumption = simplify_gen_relational (cond, SImode, mode,
2695 : : tmp1, bound);
2696 : 1725 : desc->assumptions =
2697 : 1725 : alloc_EXPR_LIST (0, assumption, desc->assumptions);
2698 : : }
2699 : :
2700 : 16756 : tmp = simplify_gen_binary (PLUS, comp_mode, iv1.base, iv0.step);
2701 : 16756 : tmp = lowpart_subreg (mode, tmp, comp_mode);
2702 : 16756 : assumption = simplify_gen_relational (reverse_condition (cond),
2703 : : SImode, mode, tmp0, tmp);
2704 : :
2705 : 16756 : delta = simplify_gen_binary (PLUS, mode, tmp1, step);
2706 : 16756 : delta = simplify_gen_binary (MINUS, mode, delta, tmp0);
2707 : : }
2708 : : else
2709 : : {
2710 : : /* Condition in shape a <= b - s * i
2711 : : We must know that a - s does not overflow and a - s <= b and then
2712 : : we can again compute number of iterations as (b - (a - s)) / s. */
2713 : 2627 : step = simplify_gen_unary (NEG, mode, iv1.step, mode);
2714 : 2627 : tmp0 = lowpart_subreg (mode, iv0.base, comp_mode);
2715 : 2627 : tmp1 = lowpart_subreg (mode, iv1.base, comp_mode);
2716 : :
2717 : 2627 : bound = simplify_gen_binary (PLUS, mode, mode_mmin,
2718 : : lowpart_subreg (mode, step, comp_mode));
2719 : 2627 : if (step_is_pow2)
2720 : : {
2721 : 1666 : rtx t0, t1;
2722 : :
2723 : : /* If s is power of 2, we know that the loop is infinite if
2724 : : a % s <= b % s and a - s overflows. */
2725 : 1666 : assumption = simplify_gen_relational (reverse_condition (cond),
2726 : : SImode, mode,
2727 : : bound, tmp0);
2728 : :
2729 : 1666 : t0 = simplify_gen_binary (UMOD, mode, copy_rtx (tmp0), step);
2730 : 1666 : t1 = simplify_gen_binary (UMOD, mode, copy_rtx (tmp1), step);
2731 : 1666 : tmp = simplify_gen_relational (cond, SImode, mode, t0, t1);
2732 : 1666 : assumption = simplify_gen_binary (AND, SImode, assumption, tmp);
2733 : 1666 : desc->infinite =
2734 : 1666 : alloc_EXPR_LIST (0, assumption, desc->infinite);
2735 : : }
2736 : : else
2737 : : {
2738 : 961 : assumption = simplify_gen_relational (cond, SImode, mode,
2739 : : bound, tmp0);
2740 : 961 : desc->assumptions =
2741 : 961 : alloc_EXPR_LIST (0, assumption, desc->assumptions);
2742 : : }
2743 : :
2744 : 2627 : tmp = simplify_gen_binary (PLUS, comp_mode, iv0.base, iv1.step);
2745 : 2627 : tmp = lowpart_subreg (mode, tmp, comp_mode);
2746 : 2627 : assumption = simplify_gen_relational (reverse_condition (cond),
2747 : : SImode, mode,
2748 : : tmp, tmp1);
2749 : 2627 : delta = simplify_gen_binary (MINUS, mode, tmp0, step);
2750 : 2627 : delta = simplify_gen_binary (MINUS, mode, tmp1, delta);
2751 : : }
2752 : 19383 : if (assumption == const_true_rtx)
2753 : 0 : goto zero_iter_simplify;
2754 : 19383 : else if (assumption != const0_rtx)
2755 : 19231 : desc->noloop_assumptions =
2756 : 19231 : alloc_EXPR_LIST (0, assumption, desc->noloop_assumptions);
2757 : 19383 : delta = simplify_gen_binary (UDIV, mode, delta, step);
2758 : 19383 : desc->niter_expr = delta;
2759 : : }
2760 : :
2761 : 383125 : old_niter = desc->niter_expr;
2762 : :
2763 : 383125 : simplify_using_initial_values (loop, AND, &desc->assumptions);
2764 : 383125 : if (desc->assumptions
2765 : 2101 : && XEXP (desc->assumptions, 0) == const0_rtx)
2766 : 4 : goto fail;
2767 : 383121 : simplify_using_initial_values (loop, IOR, &desc->noloop_assumptions);
2768 : 383121 : simplify_using_initial_values (loop, IOR, &desc->infinite);
2769 : 383121 : simplify_using_initial_values (loop, UNKNOWN, &desc->niter_expr);
2770 : :
2771 : : /* Rerun the simplification. Consider code (created by copying loop headers)
2772 : :
2773 : : i = 0;
2774 : :
2775 : : if (0 < n)
2776 : : {
2777 : : do
2778 : : {
2779 : : i++;
2780 : : } while (i < n);
2781 : : }
2782 : :
2783 : : The first pass determines that i = 0, the second pass uses it to eliminate
2784 : : noloop assumption. */
2785 : :
2786 : 383121 : simplify_using_initial_values (loop, AND, &desc->assumptions);
2787 : 383121 : if (desc->assumptions
2788 : 2097 : && XEXP (desc->assumptions, 0) == const0_rtx)
2789 : 0 : goto fail;
2790 : 383121 : simplify_using_initial_values (loop, IOR, &desc->noloop_assumptions);
2791 : 383121 : simplify_using_initial_values (loop, IOR, &desc->infinite);
2792 : 383121 : simplify_using_initial_values (loop, UNKNOWN, &desc->niter_expr);
2793 : :
2794 : 383121 : if (desc->noloop_assumptions
2795 : 49671 : && XEXP (desc->noloop_assumptions, 0) == const_true_rtx)
2796 : 0 : goto zero_iter;
2797 : :
2798 : 383121 : if (CONST_INT_P (desc->niter_expr))
2799 : : {
2800 : 188954 : uint64_t val = INTVAL (desc->niter_expr);
2801 : :
2802 : 188954 : desc->const_iter = true;
2803 : 188954 : desc->niter = val & GET_MODE_MASK (desc->mode);
2804 : 188954 : if (!desc->infinite
2805 : 188920 : && !desc->assumptions)
2806 : 188920 : record_niter_bound (loop, desc->niter, false, true);
2807 : : }
2808 : : else
2809 : : {
2810 : 194167 : max = determine_max_iter (loop, desc, old_niter);
2811 : 194167 : if (!max)
2812 : 0 : goto zero_iter_simplify;
2813 : 194167 : if (!desc->infinite
2814 : 136042 : && !desc->assumptions)
2815 : 133945 : record_niter_bound (loop, max, false, true);
2816 : :
2817 : : /* simplify_using_initial_values does a copy propagation on the registers
2818 : : in the expression for the number of iterations. This prolongs life
2819 : : ranges of registers and increases register pressure, and usually
2820 : : brings no gain (and if it happens to do, the cse pass will take care
2821 : : of it anyway). So prevent this behavior, unless it enabled us to
2822 : : derive that the number of iterations is a constant. */
2823 : 194167 : desc->niter_expr = old_niter;
2824 : : }
2825 : :
2826 : : return;
2827 : :
2828 : 0 : zero_iter_simplify:
2829 : : /* Simplify the assumptions. */
2830 : 0 : simplify_using_initial_values (loop, AND, &desc->assumptions);
2831 : 0 : if (desc->assumptions
2832 : 0 : && XEXP (desc->assumptions, 0) == const0_rtx)
2833 : 0 : goto fail;
2834 : 0 : simplify_using_initial_values (loop, IOR, &desc->infinite);
2835 : :
2836 : : /* Fallthru. */
2837 : 0 : zero_iter:
2838 : 0 : desc->const_iter = true;
2839 : 0 : desc->niter = 0;
2840 : 0 : record_niter_bound (loop, 0, true, true);
2841 : 0 : desc->noloop_assumptions = NULL_RTX;
2842 : 0 : desc->niter_expr = const0_rtx;
2843 : 0 : return;
2844 : :
2845 : 280385 : fail:
2846 : 280385 : desc->simple_p = false;
2847 : 280385 : return;
2848 : : }
2849 : :
2850 : : /* Checks whether E is a simple exit from LOOP and stores its description
2851 : : into DESC. */
2852 : :
2853 : : static void
2854 : 1055313 : check_simple_exit (class loop *loop, edge e, class niter_desc *desc)
2855 : : {
2856 : 1055313 : basic_block exit_bb;
2857 : 1055313 : rtx condition;
2858 : 1055313 : rtx_insn *at;
2859 : 1055313 : edge ein;
2860 : :
2861 : 1055313 : exit_bb = e->src;
2862 : 1055313 : desc->simple_p = false;
2863 : :
2864 : : /* It must belong directly to the loop. */
2865 : 1055313 : if (exit_bb->loop_father != loop)
2866 : 391807 : return;
2867 : :
2868 : : /* It must be tested (at least) once during any iteration. */
2869 : 969234 : if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit_bb))
2870 : : return;
2871 : :
2872 : : /* It must end in a simple conditional jump. */
2873 : 759766 : if (!any_condjump_p (BB_END (exit_bb)) || !onlyjump_p (BB_END (exit_bb)))
2874 : 62973 : return;
2875 : :
2876 : 696793 : ein = EDGE_SUCC (exit_bb, 0);
2877 : 696793 : if (ein == e)
2878 : 223074 : ein = EDGE_SUCC (exit_bb, 1);
2879 : :
2880 : 696793 : desc->out_edge = e;
2881 : 696793 : desc->in_edge = ein;
2882 : :
2883 : : /* Test whether the condition is suitable. */
2884 : 696793 : if (!(condition = get_condition (BB_END (ein->src), &at, false, false)))
2885 : : return;
2886 : :
2887 : 666926 : if (ein->flags & EDGE_FALLTHRU)
2888 : : {
2889 : 165985 : condition = reversed_condition (condition);
2890 : 165985 : if (!condition)
2891 : : return;
2892 : : }
2893 : :
2894 : : /* Check that we are able to determine number of iterations and fill
2895 : : in information about it. */
2896 : 663506 : iv_number_of_iterations (loop, at, condition, desc);
2897 : : }
2898 : :
2899 : : /* Finds a simple exit of LOOP and stores its description into DESC. */
2900 : :
2901 : : static void
2902 : 538988 : find_simple_exit (class loop *loop, class niter_desc *desc)
2903 : : {
2904 : 538988 : unsigned i;
2905 : 538988 : basic_block *body;
2906 : 538988 : edge e;
2907 : 538988 : class niter_desc act;
2908 : 538988 : bool any = false;
2909 : 538988 : edge_iterator ei;
2910 : :
2911 : 538988 : desc->simple_p = false;
2912 : 538988 : body = get_loop_body (loop);
2913 : :
2914 : 4514530 : for (i = 0; i < loop->num_nodes; i++)
2915 : : {
2916 : 8815922 : FOR_EACH_EDGE (e, ei, body[i]->succs)
2917 : : {
2918 : 5379368 : if (flow_bb_inside_loop_p (loop, e->dest))
2919 : 4324055 : continue;
2920 : :
2921 : 1055313 : check_simple_exit (loop, e, &act);
2922 : 1055313 : if (!act.simple_p)
2923 : 672192 : continue;
2924 : :
2925 : 383121 : if (!any)
2926 : : any = true;
2927 : : else
2928 : : {
2929 : : /* Prefer constant iterations; the less the better. */
2930 : 9105 : if (!act.const_iter
2931 : 881 : || (desc->const_iter && act.niter >= desc->niter))
2932 : 8491 : continue;
2933 : :
2934 : : /* Also if the actual exit may be infinite, while the old one
2935 : : not, prefer the old one. */
2936 : 614 : if (act.infinite && !desc->infinite)
2937 : 1 : continue;
2938 : : }
2939 : :
2940 : 374629 : *desc = act;
2941 : : }
2942 : : }
2943 : :
2944 : 538988 : if (dump_file)
2945 : : {
2946 : 103 : if (desc->simple_p)
2947 : : {
2948 : 75 : fprintf (dump_file, "Loop %d is simple:\n", loop->num);
2949 : 75 : fprintf (dump_file, " simple exit %d -> %d\n",
2950 : 75 : desc->out_edge->src->index,
2951 : 75 : desc->out_edge->dest->index);
2952 : 75 : if (desc->assumptions)
2953 : : {
2954 : 0 : fprintf (dump_file, " assumptions: ");
2955 : 0 : print_rtl (dump_file, desc->assumptions);
2956 : 0 : fprintf (dump_file, "\n");
2957 : : }
2958 : 75 : if (desc->noloop_assumptions)
2959 : : {
2960 : 8 : fprintf (dump_file, " does not roll if: ");
2961 : 8 : print_rtl (dump_file, desc->noloop_assumptions);
2962 : 8 : fprintf (dump_file, "\n");
2963 : : }
2964 : 75 : if (desc->infinite)
2965 : : {
2966 : 19 : fprintf (dump_file, " infinite if: ");
2967 : 19 : print_rtl (dump_file, desc->infinite);
2968 : 19 : fprintf (dump_file, "\n");
2969 : : }
2970 : :
2971 : 75 : fprintf (dump_file, " number of iterations: ");
2972 : 75 : print_rtl (dump_file, desc->niter_expr);
2973 : 75 : fprintf (dump_file, "\n");
2974 : :
2975 : 75 : fprintf (dump_file, " upper bound: %li\n",
2976 : : (long)get_max_loop_iterations_int (loop));
2977 : 75 : fprintf (dump_file, " likely upper bound: %li\n",
2978 : : (long)get_likely_max_loop_iterations_int (loop));
2979 : 75 : fprintf (dump_file, " realistic bound: %li\n",
2980 : : (long)get_estimated_loop_iterations_int (loop));
2981 : : }
2982 : : else
2983 : 28 : fprintf (dump_file, "Loop %d is not simple.\n", loop->num);
2984 : : }
2985 : :
2986 : : /* Fix up the finiteness if possible. We can only do it for single exit,
2987 : : since the loop is finite, but it's possible that we predicate one loop
2988 : : exit to be finite which can not be determined as finite in middle-end as
2989 : : well. It results in incorrect predicate information on the exit condition
2990 : : expression. For example, if says [(int) _1 + -8, + , -8] != 0 finite,
2991 : : it means _1 can exactly divide -8. */
2992 : 538988 : if (desc->infinite && single_exit (loop) && finite_loop_p (loop))
2993 : : {
2994 : 30116 : desc->infinite = NULL_RTX;
2995 : 30116 : if (dump_file)
2996 : 19 : fprintf (dump_file, " infinite updated to finite.\n");
2997 : : }
2998 : :
2999 : 538988 : free (body);
3000 : 538988 : }
3001 : :
3002 : : /* Creates a simple loop description of LOOP if it was not computed
3003 : : already. */
3004 : :
3005 : : class niter_desc *
3006 : 920079 : get_simple_loop_desc (class loop *loop)
3007 : : {
3008 : 920079 : class niter_desc *desc = simple_loop_desc (loop);
3009 : :
3010 : 920079 : if (desc)
3011 : : return desc;
3012 : :
3013 : : /* At least desc->infinite is not always initialized by
3014 : : find_simple_loop_exit. */
3015 : 538988 : desc = ggc_cleared_alloc<niter_desc> ();
3016 : 538988 : iv_analysis_loop_init (loop);
3017 : 538988 : find_simple_exit (loop, desc);
3018 : 538988 : loop->simple_loop_desc = desc;
3019 : 538988 : return desc;
3020 : : }
3021 : :
3022 : : /* Releases simple loop description for LOOP. */
3023 : :
3024 : : void
3025 : 5450498 : free_simple_loop_desc (class loop *loop)
3026 : : {
3027 : 5450498 : class niter_desc *desc = simple_loop_desc (loop);
3028 : :
3029 : 5450498 : if (!desc)
3030 : : return;
3031 : :
3032 : 538988 : ggc_free (desc);
3033 : 538988 : loop->simple_loop_desc = NULL;
3034 : : }
|