1/* Rtl-level induction variable analysis.
2   Copyright (C) 2004-2015 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it
7under the terms of the GNU General Public License as published by the
8Free Software Foundation; either version 3, or (at your option) any
9later version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT
12ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along 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
96enum 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
116struct biv_entry
117{
118  unsigned regno;	/* The register of the biv.  */
119  struct rtx_iv iv;	/* Value of the biv.  */
120};
121
122static bool clean_slate = true;
123
124static unsigned int iv_ref_table_size = 0;
125
126/* Table of rtx_ivs indexed by the df_ref uid field.  */
127static 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
135static struct loop *current_loop;
136
137/* Hashtable helper.  */
138
139struct 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
149inline hashval_t
150biv_entry_hasher::hash (const value_type *b)
151{
152  return b->regno;
153}
154
155/* Compares biv B and register R.  */
156
157inline bool
158biv_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
165static hash_table<biv_entry_hasher> *bivs;
166
167static bool iv_analyze_op (rtx_insn *, rtx, struct rtx_iv *);
168
169/* Return the RTX code corresponding to the IV extend code EXTEND.  */
170static inline enum rtx_code
171iv_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
187extern void dump_iv_info (FILE *, struct rtx_iv *);
188void
189dump_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
232rtx
233lowpart_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
240static void
241check_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
256static bool
257simple_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
283static void
284clear_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
306void
307iv_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
340static bool
341latch_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
369static enum iv_grd_result
370iv_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
427static bool
428iv_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
447static bool
448iv_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
489static bool
490iv_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
527static bool
528iv_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
550static bool
551iv_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
620static bool
621iv_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
645static bool
646iv_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
672static bool
673get_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
839static bool
840get_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
859static void
860record_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
872static bool
873analyzed_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
884static void
885record_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
899static bool
900iv_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
976bool
977iv_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
1102static bool
1103iv_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
1165static bool
1166iv_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
1223bool
1224iv_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
1248bool
1249iv_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
1264bool
1265biv_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
1288rtx
1289get_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
1323void
1324iv_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
1341static uint64_t
1342inverse (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
1360static bool
1361altered_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
1375static void
1376mark_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
1388static bool
1389simple_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
1436static rtx
1437find_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
1480static void
1481replace_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
1502static bool
1503suitable_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.  */
1532static void
1533replace_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
1544static bool
1545implies_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
1707rtx
1708canon_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
1783static rtx
1784reversed_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
1799void
1800simplify_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
1876static void
1877eliminate_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
1901static void
1902eliminate_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
1915static void
1916simplify_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
2136static void
2137shorten_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
2195static bool
2196canonicalize_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
2311static uint64_t
2312determine_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
2369static void
2370iv_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
2909zero_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.  */
2918zero_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
2926fail:
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
2934static void
2935check_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
2982void
2983find_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
3071struct niter_desc *
3072get_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
3126void
3127free_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