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