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