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