1 /* Scalar evolution detector.
2    Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
3    Free Software Foundation, Inc.
4    Contributed by Sebastian Pop <s.pop@laposte.net>
5 
6 This file is part of GCC.
7 
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12 
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17 
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21 
22 /*
23    Description:
24 
25    This pass analyzes the evolution of scalar variables in loop
26    structures.  The algorithm is based on the SSA representation,
27    and on the loop hierarchy tree.  This algorithm is not based on
28    the notion of versions of a variable, as it was the case for the
29    previous implementations of the scalar evolution algorithm, but
30    it assumes that each defined name is unique.
31 
32    The notation used in this file is called "chains of recurrences",
33    and has been proposed by Eugene Zima, Robert Van Engelen, and
34    others for describing induction variables in programs.  For example
35    "b -> {0, +, 2}_1" means that the scalar variable "b" is equal to 0
36    when entering in the loop_1 and has a step 2 in this loop, in other
37    words "for (b = 0; b < N; b+=2);".  Note that the coefficients of
38    this chain of recurrence (or chrec [shrek]) can contain the name of
39    other variables, in which case they are called parametric chrecs.
40    For example, "b -> {a, +, 2}_1" means that the initial value of "b"
41    is the value of "a".  In most of the cases these parametric chrecs
42    are fully instantiated before their use because symbolic names can
43    hide some difficult cases such as self-references described later
44    (see the Fibonacci example).
45 
46    A short sketch of the algorithm is:
47 
48    Given a scalar variable to be analyzed, follow the SSA edge to
49    its definition:
50 
51    - When the definition is a GIMPLE_ASSIGN: if the right hand side
52    (RHS) of the definition cannot be statically analyzed, the answer
53    of the analyzer is: "don't know".
54    Otherwise, for all the variables that are not yet analyzed in the
55    RHS, try to determine their evolution, and finally try to
56    evaluate the operation of the RHS that gives the evolution
57    function of the analyzed variable.
58 
59    - When the definition is a condition-phi-node: determine the
60    evolution function for all the branches of the phi node, and
61    finally merge these evolutions (see chrec_merge).
62 
63    - When the definition is a loop-phi-node: determine its initial
64    condition, that is the SSA edge defined in an outer loop, and
65    keep it symbolic.  Then determine the SSA edges that are defined
66    in the body of the loop.  Follow the inner edges until ending on
67    another loop-phi-node of the same analyzed loop.  If the reached
68    loop-phi-node is not the starting loop-phi-node, then we keep
69    this definition under a symbolic form.  If the reached
70    loop-phi-node is the same as the starting one, then we compute a
71    symbolic stride on the return path.  The result is then the
72    symbolic chrec {initial_condition, +, symbolic_stride}_loop.
73 
74    Examples:
75 
76    Example 1: Illustration of the basic algorithm.
77 
78    | a = 3
79    | loop_1
80    |   b = phi (a, c)
81    |   c = b + 1
82    |   if (c > 10) exit_loop
83    | endloop
84 
85    Suppose that we want to know the number of iterations of the
86    loop_1.  The exit_loop is controlled by a COND_EXPR (c > 10).  We
87    ask the scalar evolution analyzer two questions: what's the
88    scalar evolution (scev) of "c", and what's the scev of "10".  For
89    "10" the answer is "10" since it is a scalar constant.  For the
90    scalar variable "c", it follows the SSA edge to its definition,
91    "c = b + 1", and then asks again what's the scev of "b".
92    Following the SSA edge, we end on a loop-phi-node "b = phi (a,
93    c)", where the initial condition is "a", and the inner loop edge
94    is "c".  The initial condition is kept under a symbolic form (it
95    may be the case that the copy constant propagation has done its
96    work and we end with the constant "3" as one of the edges of the
97    loop-phi-node).  The update edge is followed to the end of the
98    loop, and until reaching again the starting loop-phi-node: b -> c
99    -> b.  At this point we have drawn a path from "b" to "b" from
100    which we compute the stride in the loop: in this example it is
101    "+1".  The resulting scev for "b" is "b -> {a, +, 1}_1".  Now
102    that the scev for "b" is known, it is possible to compute the
103    scev for "c", that is "c -> {a + 1, +, 1}_1".  In order to
104    determine the number of iterations in the loop_1, we have to
105    instantiate_parameters (loop_1, {a + 1, +, 1}_1), that gives after some
106    more analysis the scev {4, +, 1}_1, or in other words, this is
107    the function "f (x) = x + 4", where x is the iteration count of
108    the loop_1.  Now we have to solve the inequality "x + 4 > 10",
109    and take the smallest iteration number for which the loop is
110    exited: x = 7.  This loop runs from x = 0 to x = 7, and in total
111    there are 8 iterations.  In terms of loop normalization, we have
112    created a variable that is implicitly defined, "x" or just "_1",
113    and all the other analyzed scalars of the loop are defined in
114    function of this variable:
115 
116    a -> 3
117    b -> {3, +, 1}_1
118    c -> {4, +, 1}_1
119 
120    or in terms of a C program:
121 
122    | a = 3
123    | for (x = 0; x <= 7; x++)
124    |   {
125    |     b = x + 3
126    |     c = x + 4
127    |   }
128 
129    Example 2a: Illustration of the algorithm on nested loops.
130 
131    | loop_1
132    |   a = phi (1, b)
133    |   c = a + 2
134    |   loop_2  10 times
135    |     b = phi (c, d)
136    |     d = b + 3
137    |   endloop
138    | endloop
139 
140    For analyzing the scalar evolution of "a", the algorithm follows
141    the SSA edge into the loop's body: "a -> b".  "b" is an inner
142    loop-phi-node, and its analysis as in Example 1, gives:
143 
144    b -> {c, +, 3}_2
145    d -> {c + 3, +, 3}_2
146 
147    Following the SSA edge for the initial condition, we end on "c = a
148    + 2", and then on the starting loop-phi-node "a".  From this point,
149    the loop stride is computed: back on "c = a + 2" we get a "+2" in
150    the loop_1, then on the loop-phi-node "b" we compute the overall
151    effect of the inner loop that is "b = c + 30", and we get a "+30"
152    in the loop_1.  That means that the overall stride in loop_1 is
153    equal to "+32", and the result is:
154 
155    a -> {1, +, 32}_1
156    c -> {3, +, 32}_1
157 
158    Example 2b: Multivariate chains of recurrences.
159 
160    | loop_1
161    |   k = phi (0, k + 1)
162    |   loop_2  4 times
163    |     j = phi (0, j + 1)
164    |     loop_3 4 times
165    |       i = phi (0, i + 1)
166    |       A[j + k] = ...
167    |     endloop
168    |   endloop
169    | endloop
170 
171    Analyzing the access function of array A with
172    instantiate_parameters (loop_1, "j + k"), we obtain the
173    instantiation and the analysis of the scalar variables "j" and "k"
174    in loop_1.  This leads to the scalar evolution {4, +, 1}_1: the end
175    value of loop_2 for "j" is 4, and the evolution of "k" in loop_1 is
176    {0, +, 1}_1.  To obtain the evolution function in loop_3 and
177    instantiate the scalar variables up to loop_1, one has to use:
178    instantiate_scev (block_before_loop (loop_1), loop_3, "j + k").
179    The result of this call is {{0, +, 1}_1, +, 1}_2.
180 
181    Example 3: Higher degree polynomials.
182 
183    | loop_1
184    |   a = phi (2, b)
185    |   c = phi (5, d)
186    |   b = a + 1
187    |   d = c + a
188    | endloop
189 
190    a -> {2, +, 1}_1
191    b -> {3, +, 1}_1
192    c -> {5, +, a}_1
193    d -> {5 + a, +, a}_1
194 
195    instantiate_parameters (loop_1, {5, +, a}_1) -> {5, +, 2, +, 1}_1
196    instantiate_parameters (loop_1, {5 + a, +, a}_1) -> {7, +, 3, +, 1}_1
197 
198    Example 4: Lucas, Fibonacci, or mixers in general.
199 
200    | loop_1
201    |   a = phi (1, b)
202    |   c = phi (3, d)
203    |   b = c
204    |   d = c + a
205    | endloop
206 
207    a -> (1, c)_1
208    c -> {3, +, a}_1
209 
210    The syntax "(1, c)_1" stands for a PEELED_CHREC that has the
211    following semantics: during the first iteration of the loop_1, the
212    variable contains the value 1, and then it contains the value "c".
213    Note that this syntax is close to the syntax of the loop-phi-node:
214    "a -> (1, c)_1" vs. "a = phi (1, c)".
215 
216    The symbolic chrec representation contains all the semantics of the
217    original code.  What is more difficult is to use this information.
218 
219    Example 5: Flip-flops, or exchangers.
220 
221    | loop_1
222    |   a = phi (1, b)
223    |   c = phi (3, d)
224    |   b = c
225    |   d = a
226    | endloop
227 
228    a -> (1, c)_1
229    c -> (3, a)_1
230 
231    Based on these symbolic chrecs, it is possible to refine this
232    information into the more precise PERIODIC_CHRECs:
233 
234    a -> |1, 3|_1
235    c -> |3, 1|_1
236 
237    This transformation is not yet implemented.
238 
239    Further readings:
240 
241    You can find a more detailed description of the algorithm in:
242    http://icps.u-strasbg.fr/~pop/DEA_03_Pop.pdf
243    http://icps.u-strasbg.fr/~pop/DEA_03_Pop.ps.gz.  But note that
244    this is a preliminary report and some of the details of the
245    algorithm have changed.  I'm working on a research report that
246    updates the description of the algorithms to reflect the design
247    choices used in this implementation.
248 
249    A set of slides show a high level overview of the algorithm and run
250    an example through the scalar evolution analyzer:
251    http://cri.ensmp.fr/~pop/gcc/mar04/slides.pdf
252 
253    The slides that I have presented at the GCC Summit'04 are available
254    at: http://cri.ensmp.fr/~pop/gcc/20040604/gccsummit-lno-spop.pdf
255 */
256 
257 #include "config.h"
258 #include "system.h"
259 #include "coretypes.h"
260 #include "gimple-pretty-print.h"
261 #include "tree-flow.h"
262 #include "cfgloop.h"
263 #include "tree-chrec.h"
264 #include "tree-scalar-evolution.h"
265 #include "tree-pass.h"
266 #include "params.h"
267 
268 static tree analyze_scalar_evolution_1 (struct loop *, tree, tree);
269 
270 /* The cached information about an SSA name VAR, claiming that below
271    basic block INSTANTIATED_BELOW, the value of VAR can be expressed
272    as CHREC.  */
273 
274 struct GTY(()) scev_info_str {
275   basic_block instantiated_below;
276   tree var;
277   tree chrec;
278 };
279 
280 /* Counters for the scev database.  */
281 static unsigned nb_set_scev = 0;
282 static unsigned nb_get_scev = 0;
283 
284 /* The following trees are unique elements.  Thus the comparison of
285    another element to these elements should be done on the pointer to
286    these trees, and not on their value.  */
287 
288 /* The SSA_NAMEs that are not yet analyzed are qualified with NULL_TREE.  */
289 tree chrec_not_analyzed_yet;
290 
291 /* Reserved to the cases where the analyzer has detected an
292    undecidable property at compile time.  */
293 tree chrec_dont_know;
294 
295 /* When the analyzer has detected that a property will never
296    happen, then it qualifies it with chrec_known.  */
297 tree chrec_known;
298 
299 static GTY ((param_is (struct scev_info_str))) htab_t scalar_evolution_info;
300 
301 
302 /* Constructs a new SCEV_INFO_STR structure for VAR and INSTANTIATED_BELOW.  */
303 
304 static inline struct scev_info_str *
305 new_scev_info_str (basic_block instantiated_below, tree var)
306 {
307   struct scev_info_str *res;
308 
309   res = ggc_alloc_scev_info_str ();
310   res->var = var;
311   res->chrec = chrec_not_analyzed_yet;
312   res->instantiated_below = instantiated_below;
313 
314   return res;
315 }
316 
317 /* Computes a hash function for database element ELT.  */
318 
319 static hashval_t
320 hash_scev_info (const void *elt)
321 {
322   return SSA_NAME_VERSION (((const struct scev_info_str *) elt)->var);
323 }
324 
325 /* Compares database elements E1 and E2.  */
326 
327 static int
328 eq_scev_info (const void *e1, const void *e2)
329 {
330   const struct scev_info_str *elt1 = (const struct scev_info_str *) e1;
331   const struct scev_info_str *elt2 = (const struct scev_info_str *) e2;
332 
333   return (elt1->var == elt2->var
334 	  && elt1->instantiated_below == elt2->instantiated_below);
335 }
336 
337 /* Deletes database element E.  */
338 
339 static void
340 del_scev_info (void *e)
341 {
342   ggc_free (e);
343 }
344 
345 /* Get the scalar evolution of VAR for INSTANTIATED_BELOW basic block.
346    A first query on VAR returns chrec_not_analyzed_yet.  */
347 
348 static tree *
349 find_var_scev_info (basic_block instantiated_below, tree var)
350 {
351   struct scev_info_str *res;
352   struct scev_info_str tmp;
353   PTR *slot;
354 
355   tmp.var = var;
356   tmp.instantiated_below = instantiated_below;
357   slot = htab_find_slot (scalar_evolution_info, &tmp, INSERT);
358 
359   if (!*slot)
360     *slot = new_scev_info_str (instantiated_below, var);
361   res = (struct scev_info_str *) *slot;
362 
363   return &res->chrec;
364 }
365 
366 /* Return true when CHREC contains symbolic names defined in
367    LOOP_NB.  */
368 
369 bool
370 chrec_contains_symbols_defined_in_loop (const_tree chrec, unsigned loop_nb)
371 {
372   int i, n;
373 
374   if (chrec == NULL_TREE)
375     return false;
376 
377   if (is_gimple_min_invariant (chrec))
378     return false;
379 
380   if (TREE_CODE (chrec) == SSA_NAME)
381     {
382       gimple def;
383       loop_p def_loop, loop;
384 
385       if (SSA_NAME_IS_DEFAULT_DEF (chrec))
386 	return false;
387 
388       def = SSA_NAME_DEF_STMT (chrec);
389       def_loop = loop_containing_stmt (def);
390       loop = get_loop (loop_nb);
391 
392       if (def_loop == NULL)
393 	return false;
394 
395       if (loop == def_loop || flow_loop_nested_p (loop, def_loop))
396 	return true;
397 
398       return false;
399     }
400 
401   n = TREE_OPERAND_LENGTH (chrec);
402   for (i = 0; i < n; i++)
403     if (chrec_contains_symbols_defined_in_loop (TREE_OPERAND (chrec, i),
404 						loop_nb))
405       return true;
406   return false;
407 }
408 
409 /* Return true when PHI is a loop-phi-node.  */
410 
411 static bool
412 loop_phi_node_p (gimple phi)
413 {
414   /* The implementation of this function is based on the following
415      property: "all the loop-phi-nodes of a loop are contained in the
416      loop's header basic block".  */
417 
418   return loop_containing_stmt (phi)->header == gimple_bb (phi);
419 }
420 
421 /* Compute the scalar evolution for EVOLUTION_FN after crossing LOOP.
422    In general, in the case of multivariate evolutions we want to get
423    the evolution in different loops.  LOOP specifies the level for
424    which to get the evolution.
425 
426    Example:
427 
428    | for (j = 0; j < 100; j++)
429    |   {
430    |     for (k = 0; k < 100; k++)
431    |       {
432    |         i = k + j;   - Here the value of i is a function of j, k.
433    |       }
434    |      ... = i         - Here the value of i is a function of j.
435    |   }
436    | ... = i              - Here the value of i is a scalar.
437 
438    Example:
439 
440    | i_0 = ...
441    | loop_1 10 times
442    |   i_1 = phi (i_0, i_2)
443    |   i_2 = i_1 + 2
444    | endloop
445 
446    This loop has the same effect as:
447    LOOP_1 has the same effect as:
448 
449    | i_1 = i_0 + 20
450 
451    The overall effect of the loop, "i_0 + 20" in the previous example,
452    is obtained by passing in the parameters: LOOP = 1,
453    EVOLUTION_FN = {i_0, +, 2}_1.
454 */
455 
456 tree
457 compute_overall_effect_of_inner_loop (struct loop *loop, tree evolution_fn)
458 {
459   bool val = false;
460 
461   if (evolution_fn == chrec_dont_know)
462     return chrec_dont_know;
463 
464   else if (TREE_CODE (evolution_fn) == POLYNOMIAL_CHREC)
465     {
466       struct loop *inner_loop = get_chrec_loop (evolution_fn);
467 
468       if (inner_loop == loop
469 	  || flow_loop_nested_p (loop, inner_loop))
470 	{
471 	  tree nb_iter = number_of_latch_executions (inner_loop);
472 
473 	  if (nb_iter == chrec_dont_know)
474 	    return chrec_dont_know;
475 	  else
476 	    {
477 	      tree res;
478 
479 	      /* evolution_fn is the evolution function in LOOP.  Get
480 		 its value in the nb_iter-th iteration.  */
481 	      res = chrec_apply (inner_loop->num, evolution_fn, nb_iter);
482 
483 	      if (chrec_contains_symbols_defined_in_loop (res, loop->num))
484 		res = instantiate_parameters (loop, res);
485 
486 	      /* Continue the computation until ending on a parent of LOOP.  */
487 	      return compute_overall_effect_of_inner_loop (loop, res);
488 	    }
489 	}
490       else
491 	return evolution_fn;
492      }
493 
494   /* If the evolution function is an invariant, there is nothing to do.  */
495   else if (no_evolution_in_loop_p (evolution_fn, loop->num, &val) && val)
496     return evolution_fn;
497 
498   else
499     return chrec_dont_know;
500 }
501 
502 /* Associate CHREC to SCALAR.  */
503 
504 static void
505 set_scalar_evolution (basic_block instantiated_below, tree scalar, tree chrec)
506 {
507   tree *scalar_info;
508 
509   if (TREE_CODE (scalar) != SSA_NAME)
510     return;
511 
512   scalar_info = find_var_scev_info (instantiated_below, scalar);
513 
514   if (dump_file)
515     {
516       if (dump_flags & TDF_SCEV)
517 	{
518 	  fprintf (dump_file, "(set_scalar_evolution \n");
519 	  fprintf (dump_file, "  instantiated_below = %d \n",
520 		   instantiated_below->index);
521 	  fprintf (dump_file, "  (scalar = ");
522 	  print_generic_expr (dump_file, scalar, 0);
523 	  fprintf (dump_file, ")\n  (scalar_evolution = ");
524 	  print_generic_expr (dump_file, chrec, 0);
525 	  fprintf (dump_file, "))\n");
526 	}
527       if (dump_flags & TDF_STATS)
528 	nb_set_scev++;
529     }
530 
531   *scalar_info = chrec;
532 }
533 
534 /* Retrieve the chrec associated to SCALAR instantiated below
535    INSTANTIATED_BELOW block.  */
536 
537 static tree
538 get_scalar_evolution (basic_block instantiated_below, tree scalar)
539 {
540   tree res;
541 
542   if (dump_file)
543     {
544       if (dump_flags & TDF_SCEV)
545 	{
546 	  fprintf (dump_file, "(get_scalar_evolution \n");
547 	  fprintf (dump_file, "  (scalar = ");
548 	  print_generic_expr (dump_file, scalar, 0);
549 	  fprintf (dump_file, ")\n");
550 	}
551       if (dump_flags & TDF_STATS)
552 	nb_get_scev++;
553     }
554 
555   switch (TREE_CODE (scalar))
556     {
557     case SSA_NAME:
558       res = *find_var_scev_info (instantiated_below, scalar);
559       break;
560 
561     case REAL_CST:
562     case FIXED_CST:
563     case INTEGER_CST:
564       res = scalar;
565       break;
566 
567     default:
568       res = chrec_not_analyzed_yet;
569       break;
570     }
571 
572   if (dump_file && (dump_flags & TDF_SCEV))
573     {
574       fprintf (dump_file, "  (scalar_evolution = ");
575       print_generic_expr (dump_file, res, 0);
576       fprintf (dump_file, "))\n");
577     }
578 
579   return res;
580 }
581 
582 /* Helper function for add_to_evolution.  Returns the evolution
583    function for an assignment of the form "a = b + c", where "a" and
584    "b" are on the strongly connected component.  CHREC_BEFORE is the
585    information that we already have collected up to this point.
586    TO_ADD is the evolution of "c".
587 
588    When CHREC_BEFORE has an evolution part in LOOP_NB, add to this
589    evolution the expression TO_ADD, otherwise construct an evolution
590    part for this loop.  */
591 
592 static tree
593 add_to_evolution_1 (unsigned loop_nb, tree chrec_before, tree to_add,
594 		    gimple at_stmt)
595 {
596   tree type, left, right;
597   struct loop *loop = get_loop (loop_nb), *chloop;
598 
599   switch (TREE_CODE (chrec_before))
600     {
601     case POLYNOMIAL_CHREC:
602       chloop = get_chrec_loop (chrec_before);
603       if (chloop == loop
604 	  || flow_loop_nested_p (chloop, loop))
605 	{
606 	  unsigned var;
607 
608 	  type = chrec_type (chrec_before);
609 
610 	  /* When there is no evolution part in this loop, build it.  */
611 	  if (chloop != loop)
612 	    {
613 	      var = loop_nb;
614 	      left = chrec_before;
615 	      right = SCALAR_FLOAT_TYPE_P (type)
616 		? build_real (type, dconst0)
617 		: build_int_cst (type, 0);
618 	    }
619 	  else
620 	    {
621 	      var = CHREC_VARIABLE (chrec_before);
622 	      left = CHREC_LEFT (chrec_before);
623 	      right = CHREC_RIGHT (chrec_before);
624 	    }
625 
626 	  to_add = chrec_convert (type, to_add, at_stmt);
627 	  right = chrec_convert_rhs (type, right, at_stmt);
628 	  right = chrec_fold_plus (chrec_type (right), right, to_add);
629 	  return build_polynomial_chrec (var, left, right);
630 	}
631       else
632 	{
633 	  gcc_assert (flow_loop_nested_p (loop, chloop));
634 
635 	  /* Search the evolution in LOOP_NB.  */
636 	  left = add_to_evolution_1 (loop_nb, CHREC_LEFT (chrec_before),
637 				     to_add, at_stmt);
638 	  right = CHREC_RIGHT (chrec_before);
639 	  right = chrec_convert_rhs (chrec_type (left), right, at_stmt);
640 	  return build_polynomial_chrec (CHREC_VARIABLE (chrec_before),
641 					 left, right);
642 	}
643 
644     default:
645       /* These nodes do not depend on a loop.  */
646       if (chrec_before == chrec_dont_know)
647 	return chrec_dont_know;
648 
649       left = chrec_before;
650       right = chrec_convert_rhs (chrec_type (left), to_add, at_stmt);
651       return build_polynomial_chrec (loop_nb, left, right);
652     }
653 }
654 
655 /* Add TO_ADD to the evolution part of CHREC_BEFORE in the dimension
656    of LOOP_NB.
657 
658    Description (provided for completeness, for those who read code in
659    a plane, and for my poor 62 bytes brain that would have forgotten
660    all this in the next two or three months):
661 
662    The algorithm of translation of programs from the SSA representation
663    into the chrecs syntax is based on a pattern matching.  After having
664    reconstructed the overall tree expression for a loop, there are only
665    two cases that can arise:
666 
667    1. a = loop-phi (init, a + expr)
668    2. a = loop-phi (init, expr)
669 
670    where EXPR is either a scalar constant with respect to the analyzed
671    loop (this is a degree 0 polynomial), or an expression containing
672    other loop-phi definitions (these are higher degree polynomials).
673 
674    Examples:
675 
676    1.
677    | init = ...
678    | loop_1
679    |   a = phi (init, a + 5)
680    | endloop
681 
682    2.
683    | inita = ...
684    | initb = ...
685    | loop_1
686    |   a = phi (inita, 2 * b + 3)
687    |   b = phi (initb, b + 1)
688    | endloop
689 
690    For the first case, the semantics of the SSA representation is:
691 
692    | a (x) = init + \sum_{j = 0}^{x - 1} expr (j)
693 
694    that is, there is a loop index "x" that determines the scalar value
695    of the variable during the loop execution.  During the first
696    iteration, the value is that of the initial condition INIT, while
697    during the subsequent iterations, it is the sum of the initial
698    condition with the sum of all the values of EXPR from the initial
699    iteration to the before last considered iteration.
700 
701    For the second case, the semantics of the SSA program is:
702 
703    | a (x) = init, if x = 0;
704    |         expr (x - 1), otherwise.
705 
706    The second case corresponds to the PEELED_CHREC, whose syntax is
707    close to the syntax of a loop-phi-node:
708 
709    | phi (init, expr)  vs.  (init, expr)_x
710 
711    The proof of the translation algorithm for the first case is a
712    proof by structural induction based on the degree of EXPR.
713 
714    Degree 0:
715    When EXPR is a constant with respect to the analyzed loop, or in
716    other words when EXPR is a polynomial of degree 0, the evolution of
717    the variable A in the loop is an affine function with an initial
718    condition INIT, and a step EXPR.  In order to show this, we start
719    from the semantics of the SSA representation:
720 
721    f (x) = init + \sum_{j = 0}^{x - 1} expr (j)
722 
723    and since "expr (j)" is a constant with respect to "j",
724 
725    f (x) = init + x * expr
726 
727    Finally, based on the semantics of the pure sum chrecs, by
728    identification we get the corresponding chrecs syntax:
729 
730    f (x) = init * \binom{x}{0} + expr * \binom{x}{1}
731    f (x) -> {init, +, expr}_x
732 
733    Higher degree:
734    Suppose that EXPR is a polynomial of degree N with respect to the
735    analyzed loop_x for which we have already determined that it is
736    written under the chrecs syntax:
737 
738    | expr (x)  ->  {b_0, +, b_1, +, ..., +, b_{n-1}} (x)
739 
740    We start from the semantics of the SSA program:
741 
742    | f (x) = init + \sum_{j = 0}^{x - 1} expr (j)
743    |
744    | f (x) = init + \sum_{j = 0}^{x - 1}
745    |                (b_0 * \binom{j}{0} + ... + b_{n-1} * \binom{j}{n-1})
746    |
747    | f (x) = init + \sum_{j = 0}^{x - 1}
748    |                \sum_{k = 0}^{n - 1} (b_k * \binom{j}{k})
749    |
750    | f (x) = init + \sum_{k = 0}^{n - 1}
751    |                (b_k * \sum_{j = 0}^{x - 1} \binom{j}{k})
752    |
753    | f (x) = init + \sum_{k = 0}^{n - 1}
754    |                (b_k * \binom{x}{k + 1})
755    |
756    | f (x) = init + b_0 * \binom{x}{1} + ...
757    |              + b_{n-1} * \binom{x}{n}
758    |
759    | f (x) = init * \binom{x}{0} + b_0 * \binom{x}{1} + ...
760    |                             + b_{n-1} * \binom{x}{n}
761    |
762 
763    And finally from the definition of the chrecs syntax, we identify:
764    | f (x)  ->  {init, +, b_0, +, ..., +, b_{n-1}}_x
765 
766    This shows the mechanism that stands behind the add_to_evolution
767    function.  An important point is that the use of symbolic
768    parameters avoids the need of an analysis schedule.
769 
770    Example:
771 
772    | inita = ...
773    | initb = ...
774    | loop_1
775    |   a = phi (inita, a + 2 + b)
776    |   b = phi (initb, b + 1)
777    | endloop
778 
779    When analyzing "a", the algorithm keeps "b" symbolically:
780 
781    | a  ->  {inita, +, 2 + b}_1
782 
783    Then, after instantiation, the analyzer ends on the evolution:
784 
785    | a  ->  {inita, +, 2 + initb, +, 1}_1
786 
787 */
788 
789 static tree
790 add_to_evolution (unsigned loop_nb, tree chrec_before, enum tree_code code,
791 		  tree to_add, gimple at_stmt)
792 {
793   tree type = chrec_type (to_add);
794   tree res = NULL_TREE;
795 
796   if (to_add == NULL_TREE)
797     return chrec_before;
798 
799   /* TO_ADD is either a scalar, or a parameter.  TO_ADD is not
800      instantiated at this point.  */
801   if (TREE_CODE (to_add) == POLYNOMIAL_CHREC)
802     /* This should not happen.  */
803     return chrec_dont_know;
804 
805   if (dump_file && (dump_flags & TDF_SCEV))
806     {
807       fprintf (dump_file, "(add_to_evolution \n");
808       fprintf (dump_file, "  (loop_nb = %d)\n", loop_nb);
809       fprintf (dump_file, "  (chrec_before = ");
810       print_generic_expr (dump_file, chrec_before, 0);
811       fprintf (dump_file, ")\n  (to_add = ");
812       print_generic_expr (dump_file, to_add, 0);
813       fprintf (dump_file, ")\n");
814     }
815 
816   if (code == MINUS_EXPR)
817     to_add = chrec_fold_multiply (type, to_add, SCALAR_FLOAT_TYPE_P (type)
818 				  ? build_real (type, dconstm1)
819 				  : build_int_cst_type (type, -1));
820 
821   res = add_to_evolution_1 (loop_nb, chrec_before, to_add, at_stmt);
822 
823   if (dump_file && (dump_flags & TDF_SCEV))
824     {
825       fprintf (dump_file, "  (res = ");
826       print_generic_expr (dump_file, res, 0);
827       fprintf (dump_file, "))\n");
828     }
829 
830   return res;
831 }
832 
833 
834 
835 /* This section selects the loops that will be good candidates for the
836    scalar evolution analysis.  For the moment, greedily select all the
837    loop nests we could analyze.  */
838 
839 /* For a loop with a single exit edge, return the COND_EXPR that
840    guards the exit edge.  If the expression is too difficult to
841    analyze, then give up.  */
842 
843 gimple
844 get_loop_exit_condition (const struct loop *loop)
845 {
846   gimple res = NULL;
847   edge exit_edge = single_exit (loop);
848 
849   if (dump_file && (dump_flags & TDF_SCEV))
850     fprintf (dump_file, "(get_loop_exit_condition \n  ");
851 
852   if (exit_edge)
853     {
854       gimple stmt;
855 
856       stmt = last_stmt (exit_edge->src);
857       if (gimple_code (stmt) == GIMPLE_COND)
858 	res = stmt;
859     }
860 
861   if (dump_file && (dump_flags & TDF_SCEV))
862     {
863       print_gimple_stmt (dump_file, res, 0, 0);
864       fprintf (dump_file, ")\n");
865     }
866 
867   return res;
868 }
869 
870 /* Recursively determine and enqueue the exit conditions for a loop.  */
871 
872 static void
873 get_exit_conditions_rec (struct loop *loop,
874 			 VEC(gimple,heap) **exit_conditions)
875 {
876   if (!loop)
877     return;
878 
879   /* Recurse on the inner loops, then on the next (sibling) loops.  */
880   get_exit_conditions_rec (loop->inner, exit_conditions);
881   get_exit_conditions_rec (loop->next, exit_conditions);
882 
883   if (single_exit (loop))
884     {
885       gimple loop_condition = get_loop_exit_condition (loop);
886 
887       if (loop_condition)
888 	VEC_safe_push (gimple, heap, *exit_conditions, loop_condition);
889     }
890 }
891 
892 /* Select the candidate loop nests for the analysis.  This function
893    initializes the EXIT_CONDITIONS array.  */
894 
895 static void
896 select_loops_exit_conditions (VEC(gimple,heap) **exit_conditions)
897 {
898   struct loop *function_body = current_loops->tree_root;
899 
900   get_exit_conditions_rec (function_body->inner, exit_conditions);
901 }
902 
903 
904 /* Depth first search algorithm.  */
905 
906 typedef enum t_bool {
907   t_false,
908   t_true,
909   t_dont_know
910 } t_bool;
911 
912 
913 static t_bool follow_ssa_edge (struct loop *loop, gimple, gimple, tree *, int);
914 
915 /* Follow the ssa edge into the binary expression RHS0 CODE RHS1.
916    Return true if the strongly connected component has been found.  */
917 
918 static t_bool
919 follow_ssa_edge_binary (struct loop *loop, gimple at_stmt,
920 			tree type, tree rhs0, enum tree_code code, tree rhs1,
921 			gimple halting_phi, tree *evolution_of_loop, int limit)
922 {
923   t_bool res = t_false;
924   tree evol;
925 
926   switch (code)
927     {
928     case POINTER_PLUS_EXPR:
929     case PLUS_EXPR:
930       if (TREE_CODE (rhs0) == SSA_NAME)
931 	{
932 	  if (TREE_CODE (rhs1) == SSA_NAME)
933 	    {
934 	      /* Match an assignment under the form:
935 		 "a = b + c".  */
936 
937 	      /* We want only assignments of form "name + name" contribute to
938 		 LIMIT, as the other cases do not necessarily contribute to
939 		 the complexity of the expression.  */
940 	      limit++;
941 
942 	      evol = *evolution_of_loop;
943 	      res = follow_ssa_edge
944 		(loop, SSA_NAME_DEF_STMT (rhs0), halting_phi, &evol, limit);
945 
946 	      if (res == t_true)
947 		*evolution_of_loop = add_to_evolution
948 		  (loop->num,
949 		   chrec_convert (type, evol, at_stmt),
950 		   code, rhs1, at_stmt);
951 
952 	      else if (res == t_false)
953 		{
954 		  res = follow_ssa_edge
955 		    (loop, SSA_NAME_DEF_STMT (rhs1), halting_phi,
956 		     evolution_of_loop, limit);
957 
958 		  if (res == t_true)
959 		    *evolution_of_loop = add_to_evolution
960 		      (loop->num,
961 		       chrec_convert (type, *evolution_of_loop, at_stmt),
962 		       code, rhs0, at_stmt);
963 
964 		  else if (res == t_dont_know)
965 		    *evolution_of_loop = chrec_dont_know;
966 		}
967 
968 	      else if (res == t_dont_know)
969 		*evolution_of_loop = chrec_dont_know;
970 	    }
971 
972 	  else
973 	    {
974 	      /* Match an assignment under the form:
975 		 "a = b + ...".  */
976 	      res = follow_ssa_edge
977 		(loop, SSA_NAME_DEF_STMT (rhs0), halting_phi,
978 		 evolution_of_loop, limit);
979 	      if (res == t_true)
980 		*evolution_of_loop = add_to_evolution
981 		  (loop->num, chrec_convert (type, *evolution_of_loop,
982 					     at_stmt),
983 		   code, rhs1, at_stmt);
984 
985 	      else if (res == t_dont_know)
986 		*evolution_of_loop = chrec_dont_know;
987 	    }
988 	}
989 
990       else if (TREE_CODE (rhs1) == SSA_NAME)
991 	{
992 	  /* Match an assignment under the form:
993 	     "a = ... + c".  */
994 	  res = follow_ssa_edge
995 	    (loop, SSA_NAME_DEF_STMT (rhs1), halting_phi,
996 	     evolution_of_loop, limit);
997 	  if (res == t_true)
998 	    *evolution_of_loop = add_to_evolution
999 	      (loop->num, chrec_convert (type, *evolution_of_loop,
1000 					 at_stmt),
1001 	       code, rhs0, at_stmt);
1002 
1003 	  else if (res == t_dont_know)
1004 	    *evolution_of_loop = chrec_dont_know;
1005 	}
1006 
1007       else
1008 	/* Otherwise, match an assignment under the form:
1009 	   "a = ... + ...".  */
1010 	/* And there is nothing to do.  */
1011 	res = t_false;
1012       break;
1013 
1014     case MINUS_EXPR:
1015       /* This case is under the form "opnd0 = rhs0 - rhs1".  */
1016       if (TREE_CODE (rhs0) == SSA_NAME)
1017 	{
1018 	  /* Match an assignment under the form:
1019 	     "a = b - ...".  */
1020 
1021 	  /* We want only assignments of form "name - name" contribute to
1022 	     LIMIT, as the other cases do not necessarily contribute to
1023 	     the complexity of the expression.  */
1024 	  if (TREE_CODE (rhs1) == SSA_NAME)
1025 	    limit++;
1026 
1027 	  res = follow_ssa_edge (loop, SSA_NAME_DEF_STMT (rhs0), halting_phi,
1028 				 evolution_of_loop, limit);
1029 	  if (res == t_true)
1030 	    *evolution_of_loop = add_to_evolution
1031 	      (loop->num, chrec_convert (type, *evolution_of_loop, at_stmt),
1032 	       MINUS_EXPR, rhs1, at_stmt);
1033 
1034 	  else if (res == t_dont_know)
1035 	    *evolution_of_loop = chrec_dont_know;
1036 	}
1037       else
1038 	/* Otherwise, match an assignment under the form:
1039 	   "a = ... - ...".  */
1040 	/* And there is nothing to do.  */
1041 	res = t_false;
1042       break;
1043 
1044     default:
1045       res = t_false;
1046     }
1047 
1048   return res;
1049 }
1050 
1051 /* Follow the ssa edge into the expression EXPR.
1052    Return true if the strongly connected component has been found.  */
1053 
1054 static t_bool
1055 follow_ssa_edge_expr (struct loop *loop, gimple at_stmt, tree expr,
1056 		      gimple halting_phi, tree *evolution_of_loop, int limit)
1057 {
1058   enum tree_code code = TREE_CODE (expr);
1059   tree type = TREE_TYPE (expr), rhs0, rhs1;
1060   t_bool res;
1061 
1062   /* The EXPR is one of the following cases:
1063      - an SSA_NAME,
1064      - an INTEGER_CST,
1065      - a PLUS_EXPR,
1066      - a POINTER_PLUS_EXPR,
1067      - a MINUS_EXPR,
1068      - an ASSERT_EXPR,
1069      - other cases are not yet handled.  */
1070 
1071   switch (code)
1072     {
1073     CASE_CONVERT:
1074       /* This assignment is under the form "a_1 = (cast) rhs.  */
1075       res = follow_ssa_edge_expr (loop, at_stmt, TREE_OPERAND (expr, 0),
1076 				  halting_phi, evolution_of_loop, limit);
1077       *evolution_of_loop = chrec_convert (type, *evolution_of_loop, at_stmt);
1078       break;
1079 
1080     case INTEGER_CST:
1081       /* This assignment is under the form "a_1 = 7".  */
1082       res = t_false;
1083       break;
1084 
1085     case SSA_NAME:
1086       /* This assignment is under the form: "a_1 = b_2".  */
1087       res = follow_ssa_edge
1088 	(loop, SSA_NAME_DEF_STMT (expr), halting_phi, evolution_of_loop, limit);
1089       break;
1090 
1091     case POINTER_PLUS_EXPR:
1092     case PLUS_EXPR:
1093     case MINUS_EXPR:
1094       /* This case is under the form "rhs0 +- rhs1".  */
1095       rhs0 = TREE_OPERAND (expr, 0);
1096       rhs1 = TREE_OPERAND (expr, 1);
1097       type = TREE_TYPE (rhs0);
1098       STRIP_USELESS_TYPE_CONVERSION (rhs0);
1099       STRIP_USELESS_TYPE_CONVERSION (rhs1);
1100       res = follow_ssa_edge_binary (loop, at_stmt, type, rhs0, code, rhs1,
1101 				    halting_phi, evolution_of_loop, limit);
1102       break;
1103 
1104     case ADDR_EXPR:
1105       /* Handle &MEM[ptr + CST] which is equivalent to POINTER_PLUS_EXPR.  */
1106       if (TREE_CODE (TREE_OPERAND (expr, 0)) == MEM_REF)
1107 	{
1108 	  expr = TREE_OPERAND (expr, 0);
1109 	  rhs0 = TREE_OPERAND (expr, 0);
1110 	  rhs1 = TREE_OPERAND (expr, 1);
1111 	  type = TREE_TYPE (rhs0);
1112 	  STRIP_USELESS_TYPE_CONVERSION (rhs0);
1113 	  STRIP_USELESS_TYPE_CONVERSION (rhs1);
1114 	  res = follow_ssa_edge_binary (loop, at_stmt, type,
1115 					rhs0, POINTER_PLUS_EXPR, rhs1,
1116 					halting_phi, evolution_of_loop, limit);
1117 	}
1118       else
1119 	res = t_false;
1120       break;
1121 
1122     case ASSERT_EXPR:
1123       /* This assignment is of the form: "a_1 = ASSERT_EXPR <a_2, ...>"
1124 	 It must be handled as a copy assignment of the form a_1 = a_2.  */
1125       rhs0 = ASSERT_EXPR_VAR (expr);
1126       if (TREE_CODE (rhs0) == SSA_NAME)
1127 	res = follow_ssa_edge (loop, SSA_NAME_DEF_STMT (rhs0),
1128 			       halting_phi, evolution_of_loop, limit);
1129       else
1130 	res = t_false;
1131       break;
1132 
1133     default:
1134       res = t_false;
1135       break;
1136     }
1137 
1138   return res;
1139 }
1140 
1141 /* Follow the ssa edge into the right hand side of an assignment STMT.
1142    Return true if the strongly connected component has been found.  */
1143 
1144 static t_bool
1145 follow_ssa_edge_in_rhs (struct loop *loop, gimple stmt,
1146 			gimple halting_phi, tree *evolution_of_loop, int limit)
1147 {
1148   enum tree_code code = gimple_assign_rhs_code (stmt);
1149   tree type = gimple_expr_type (stmt), rhs1, rhs2;
1150   t_bool res;
1151 
1152   switch (code)
1153     {
1154     CASE_CONVERT:
1155       /* This assignment is under the form "a_1 = (cast) rhs.  */
1156       res = follow_ssa_edge_expr (loop, stmt, gimple_assign_rhs1 (stmt),
1157 				  halting_phi, evolution_of_loop, limit);
1158       *evolution_of_loop = chrec_convert (type, *evolution_of_loop, stmt);
1159       break;
1160 
1161     case POINTER_PLUS_EXPR:
1162     case PLUS_EXPR:
1163     case MINUS_EXPR:
1164       rhs1 = gimple_assign_rhs1 (stmt);
1165       rhs2 = gimple_assign_rhs2 (stmt);
1166       type = TREE_TYPE (rhs1);
1167       res = follow_ssa_edge_binary (loop, stmt, type, rhs1, code, rhs2,
1168 				    halting_phi, evolution_of_loop, limit);
1169       break;
1170 
1171     default:
1172       if (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS)
1173 	res = follow_ssa_edge_expr (loop, stmt, gimple_assign_rhs1 (stmt),
1174 				    halting_phi, evolution_of_loop, limit);
1175       else
1176 	res = t_false;
1177       break;
1178     }
1179 
1180   return res;
1181 }
1182 
1183 /* Checks whether the I-th argument of a PHI comes from a backedge.  */
1184 
1185 static bool
1186 backedge_phi_arg_p (gimple phi, int i)
1187 {
1188   const_edge e = gimple_phi_arg_edge (phi, i);
1189 
1190   /* We would in fact like to test EDGE_DFS_BACK here, but we do not care
1191      about updating it anywhere, and this should work as well most of the
1192      time.  */
1193   if (e->flags & EDGE_IRREDUCIBLE_LOOP)
1194     return true;
1195 
1196   return false;
1197 }
1198 
1199 /* Helper function for one branch of the condition-phi-node.  Return
1200    true if the strongly connected component has been found following
1201    this path.  */
1202 
1203 static inline t_bool
1204 follow_ssa_edge_in_condition_phi_branch (int i,
1205 					 struct loop *loop,
1206 					 gimple condition_phi,
1207 					 gimple halting_phi,
1208 					 tree *evolution_of_branch,
1209 					 tree init_cond, int limit)
1210 {
1211   tree branch = PHI_ARG_DEF (condition_phi, i);
1212   *evolution_of_branch = chrec_dont_know;
1213 
1214   /* Do not follow back edges (they must belong to an irreducible loop, which
1215      we really do not want to worry about).  */
1216   if (backedge_phi_arg_p (condition_phi, i))
1217     return t_false;
1218 
1219   if (TREE_CODE (branch) == SSA_NAME)
1220     {
1221       *evolution_of_branch = init_cond;
1222       return follow_ssa_edge (loop, SSA_NAME_DEF_STMT (branch), halting_phi,
1223 			      evolution_of_branch, limit);
1224     }
1225 
1226   /* This case occurs when one of the condition branches sets
1227      the variable to a constant: i.e. a phi-node like
1228      "a_2 = PHI <a_7(5), 2(6)>;".
1229 
1230      FIXME:  This case have to be refined correctly:
1231      in some cases it is possible to say something better than
1232      chrec_dont_know, for example using a wrap-around notation.  */
1233   return t_false;
1234 }
1235 
1236 /* This function merges the branches of a condition-phi-node in a
1237    loop.  */
1238 
1239 static t_bool
1240 follow_ssa_edge_in_condition_phi (struct loop *loop,
1241 				  gimple condition_phi,
1242 				  gimple halting_phi,
1243 				  tree *evolution_of_loop, int limit)
1244 {
1245   int i, n;
1246   tree init = *evolution_of_loop;
1247   tree evolution_of_branch;
1248   t_bool res = follow_ssa_edge_in_condition_phi_branch (0, loop, condition_phi,
1249 							halting_phi,
1250 							&evolution_of_branch,
1251 							init, limit);
1252   if (res == t_false || res == t_dont_know)
1253     return res;
1254 
1255   *evolution_of_loop = evolution_of_branch;
1256 
1257   n = gimple_phi_num_args (condition_phi);
1258   for (i = 1; i < n; i++)
1259     {
1260       /* Quickly give up when the evolution of one of the branches is
1261 	 not known.  */
1262       if (*evolution_of_loop == chrec_dont_know)
1263 	return t_true;
1264 
1265       /* Increase the limit by the PHI argument number to avoid exponential
1266 	 time and memory complexity.  */
1267       res = follow_ssa_edge_in_condition_phi_branch (i, loop, condition_phi,
1268 						     halting_phi,
1269 						     &evolution_of_branch,
1270 						     init, limit + i);
1271       if (res == t_false || res == t_dont_know)
1272 	return res;
1273 
1274       *evolution_of_loop = chrec_merge (*evolution_of_loop,
1275 					evolution_of_branch);
1276     }
1277 
1278   return t_true;
1279 }
1280 
1281 /* Follow an SSA edge in an inner loop.  It computes the overall
1282    effect of the loop, and following the symbolic initial conditions,
1283    it follows the edges in the parent loop.  The inner loop is
1284    considered as a single statement.  */
1285 
1286 static t_bool
1287 follow_ssa_edge_inner_loop_phi (struct loop *outer_loop,
1288 				gimple loop_phi_node,
1289 				gimple halting_phi,
1290 				tree *evolution_of_loop, int limit)
1291 {
1292   struct loop *loop = loop_containing_stmt (loop_phi_node);
1293   tree ev = analyze_scalar_evolution (loop, PHI_RESULT (loop_phi_node));
1294 
1295   /* Sometimes, the inner loop is too difficult to analyze, and the
1296      result of the analysis is a symbolic parameter.  */
1297   if (ev == PHI_RESULT (loop_phi_node))
1298     {
1299       t_bool res = t_false;
1300       int i, n = gimple_phi_num_args (loop_phi_node);
1301 
1302       for (i = 0; i < n; i++)
1303 	{
1304 	  tree arg = PHI_ARG_DEF (loop_phi_node, i);
1305 	  basic_block bb;
1306 
1307 	  /* Follow the edges that exit the inner loop.  */
1308 	  bb = gimple_phi_arg_edge (loop_phi_node, i)->src;
1309 	  if (!flow_bb_inside_loop_p (loop, bb))
1310 	    res = follow_ssa_edge_expr (outer_loop, loop_phi_node,
1311 					arg, halting_phi,
1312 					evolution_of_loop, limit);
1313 	  if (res == t_true)
1314 	    break;
1315 	}
1316 
1317       /* If the path crosses this loop-phi, give up.  */
1318       if (res == t_true)
1319 	*evolution_of_loop = chrec_dont_know;
1320 
1321       return res;
1322     }
1323 
1324   /* Otherwise, compute the overall effect of the inner loop.  */
1325   ev = compute_overall_effect_of_inner_loop (loop, ev);
1326   return follow_ssa_edge_expr (outer_loop, loop_phi_node, ev, halting_phi,
1327 			       evolution_of_loop, limit);
1328 }
1329 
1330 /* Follow an SSA edge from a loop-phi-node to itself, constructing a
1331    path that is analyzed on the return walk.  */
1332 
1333 static t_bool
1334 follow_ssa_edge (struct loop *loop, gimple def, gimple halting_phi,
1335 		 tree *evolution_of_loop, int limit)
1336 {
1337   struct loop *def_loop;
1338 
1339   if (gimple_nop_p (def))
1340     return t_false;
1341 
1342   /* Give up if the path is longer than the MAX that we allow.  */
1343   if (limit > PARAM_VALUE (PARAM_SCEV_MAX_EXPR_COMPLEXITY))
1344     return t_dont_know;
1345 
1346   def_loop = loop_containing_stmt (def);
1347 
1348   switch (gimple_code (def))
1349     {
1350     case GIMPLE_PHI:
1351       if (!loop_phi_node_p (def))
1352 	/* DEF is a condition-phi-node.  Follow the branches, and
1353 	   record their evolutions.  Finally, merge the collected
1354 	   information and set the approximation to the main
1355 	   variable.  */
1356 	return follow_ssa_edge_in_condition_phi
1357 	  (loop, def, halting_phi, evolution_of_loop, limit);
1358 
1359       /* When the analyzed phi is the halting_phi, the
1360 	 depth-first search is over: we have found a path from
1361 	 the halting_phi to itself in the loop.  */
1362       if (def == halting_phi)
1363 	return t_true;
1364 
1365       /* Otherwise, the evolution of the HALTING_PHI depends
1366 	 on the evolution of another loop-phi-node, i.e. the
1367 	 evolution function is a higher degree polynomial.  */
1368       if (def_loop == loop)
1369 	return t_false;
1370 
1371       /* Inner loop.  */
1372       if (flow_loop_nested_p (loop, def_loop))
1373 	return follow_ssa_edge_inner_loop_phi
1374 	  (loop, def, halting_phi, evolution_of_loop, limit + 1);
1375 
1376       /* Outer loop.  */
1377       return t_false;
1378 
1379     case GIMPLE_ASSIGN:
1380       return follow_ssa_edge_in_rhs (loop, def, halting_phi,
1381 				     evolution_of_loop, limit);
1382 
1383     default:
1384       /* At this level of abstraction, the program is just a set
1385 	 of GIMPLE_ASSIGNs and PHI_NODEs.  In principle there is no
1386 	 other node to be handled.  */
1387       return t_false;
1388     }
1389 }
1390 
1391 
1392 
1393 /* Given a LOOP_PHI_NODE, this function determines the evolution
1394    function from LOOP_PHI_NODE to LOOP_PHI_NODE in the loop.  */
1395 
1396 static tree
1397 analyze_evolution_in_loop (gimple loop_phi_node,
1398 			   tree init_cond)
1399 {
1400   int i, n = gimple_phi_num_args (loop_phi_node);
1401   tree evolution_function = chrec_not_analyzed_yet;
1402   struct loop *loop = loop_containing_stmt (loop_phi_node);
1403   basic_block bb;
1404 
1405   if (dump_file && (dump_flags & TDF_SCEV))
1406     {
1407       fprintf (dump_file, "(analyze_evolution_in_loop \n");
1408       fprintf (dump_file, "  (loop_phi_node = ");
1409       print_gimple_stmt (dump_file, loop_phi_node, 0, 0);
1410       fprintf (dump_file, ")\n");
1411     }
1412 
1413   for (i = 0; i < n; i++)
1414     {
1415       tree arg = PHI_ARG_DEF (loop_phi_node, i);
1416       gimple ssa_chain;
1417       tree ev_fn;
1418       t_bool res;
1419 
1420       /* Select the edges that enter the loop body.  */
1421       bb = gimple_phi_arg_edge (loop_phi_node, i)->src;
1422       if (!flow_bb_inside_loop_p (loop, bb))
1423 	continue;
1424 
1425       if (TREE_CODE (arg) == SSA_NAME)
1426 	{
1427 	  bool val = false;
1428 
1429 	  ssa_chain = SSA_NAME_DEF_STMT (arg);
1430 
1431 	  /* Pass in the initial condition to the follow edge function.  */
1432 	  ev_fn = init_cond;
1433 	  res = follow_ssa_edge (loop, ssa_chain, loop_phi_node, &ev_fn, 0);
1434 
1435 	  /* If ev_fn has no evolution in the inner loop, and the
1436 	     init_cond is not equal to ev_fn, then we have an
1437 	     ambiguity between two possible values, as we cannot know
1438 	     the number of iterations at this point.  */
1439 	  if (TREE_CODE (ev_fn) != POLYNOMIAL_CHREC
1440 	      && no_evolution_in_loop_p (ev_fn, loop->num, &val) && val
1441 	      && !operand_equal_p (init_cond, ev_fn, 0))
1442 	    ev_fn = chrec_dont_know;
1443 	}
1444       else
1445 	res = t_false;
1446 
1447       /* When it is impossible to go back on the same
1448 	 loop_phi_node by following the ssa edges, the
1449 	 evolution is represented by a peeled chrec, i.e. the
1450 	 first iteration, EV_FN has the value INIT_COND, then
1451 	 all the other iterations it has the value of ARG.
1452 	 For the moment, PEELED_CHREC nodes are not built.  */
1453       if (res != t_true)
1454 	ev_fn = chrec_dont_know;
1455 
1456       /* When there are multiple back edges of the loop (which in fact never
1457 	 happens currently, but nevertheless), merge their evolutions.  */
1458       evolution_function = chrec_merge (evolution_function, ev_fn);
1459     }
1460 
1461   if (dump_file && (dump_flags & TDF_SCEV))
1462     {
1463       fprintf (dump_file, "  (evolution_function = ");
1464       print_generic_expr (dump_file, evolution_function, 0);
1465       fprintf (dump_file, "))\n");
1466     }
1467 
1468   return evolution_function;
1469 }
1470 
1471 /* Given a loop-phi-node, return the initial conditions of the
1472    variable on entry of the loop.  When the CCP has propagated
1473    constants into the loop-phi-node, the initial condition is
1474    instantiated, otherwise the initial condition is kept symbolic.
1475    This analyzer does not analyze the evolution outside the current
1476    loop, and leaves this task to the on-demand tree reconstructor.  */
1477 
1478 static tree
1479 analyze_initial_condition (gimple loop_phi_node)
1480 {
1481   int i, n;
1482   tree init_cond = chrec_not_analyzed_yet;
1483   struct loop *loop = loop_containing_stmt (loop_phi_node);
1484 
1485   if (dump_file && (dump_flags & TDF_SCEV))
1486     {
1487       fprintf (dump_file, "(analyze_initial_condition \n");
1488       fprintf (dump_file, "  (loop_phi_node = \n");
1489       print_gimple_stmt (dump_file, loop_phi_node, 0, 0);
1490       fprintf (dump_file, ")\n");
1491     }
1492 
1493   n = gimple_phi_num_args (loop_phi_node);
1494   for (i = 0; i < n; i++)
1495     {
1496       tree branch = PHI_ARG_DEF (loop_phi_node, i);
1497       basic_block bb = gimple_phi_arg_edge (loop_phi_node, i)->src;
1498 
1499       /* When the branch is oriented to the loop's body, it does
1500      	 not contribute to the initial condition.  */
1501       if (flow_bb_inside_loop_p (loop, bb))
1502        	continue;
1503 
1504       if (init_cond == chrec_not_analyzed_yet)
1505 	{
1506 	  init_cond = branch;
1507 	  continue;
1508 	}
1509 
1510       if (TREE_CODE (branch) == SSA_NAME)
1511 	{
1512 	  init_cond = chrec_dont_know;
1513       	  break;
1514 	}
1515 
1516       init_cond = chrec_merge (init_cond, branch);
1517     }
1518 
1519   /* Ooops -- a loop without an entry???  */
1520   if (init_cond == chrec_not_analyzed_yet)
1521     init_cond = chrec_dont_know;
1522 
1523   /* During early loop unrolling we do not have fully constant propagated IL.
1524      Handle degenerate PHIs here to not miss important unrollings.  */
1525   if (TREE_CODE (init_cond) == SSA_NAME)
1526     {
1527       gimple def = SSA_NAME_DEF_STMT (init_cond);
1528       tree res;
1529       if (gimple_code (def) == GIMPLE_PHI
1530 	  && (res = degenerate_phi_result (def)) != NULL_TREE
1531 	  /* Only allow invariants here, otherwise we may break
1532 	     loop-closed SSA form.  */
1533 	  && is_gimple_min_invariant (res))
1534 	init_cond = res;
1535     }
1536 
1537   if (dump_file && (dump_flags & TDF_SCEV))
1538     {
1539       fprintf (dump_file, "  (init_cond = ");
1540       print_generic_expr (dump_file, init_cond, 0);
1541       fprintf (dump_file, "))\n");
1542     }
1543 
1544   return init_cond;
1545 }
1546 
1547 /* Analyze the scalar evolution for LOOP_PHI_NODE.  */
1548 
1549 static tree
1550 interpret_loop_phi (struct loop *loop, gimple loop_phi_node)
1551 {
1552   tree res;
1553   struct loop *phi_loop = loop_containing_stmt (loop_phi_node);
1554   tree init_cond;
1555 
1556   if (phi_loop != loop)
1557     {
1558       struct loop *subloop;
1559       tree evolution_fn = analyze_scalar_evolution
1560 	(phi_loop, PHI_RESULT (loop_phi_node));
1561 
1562       /* Dive one level deeper.  */
1563       subloop = superloop_at_depth (phi_loop, loop_depth (loop) + 1);
1564 
1565       /* Interpret the subloop.  */
1566       res = compute_overall_effect_of_inner_loop (subloop, evolution_fn);
1567       return res;
1568     }
1569 
1570   /* Otherwise really interpret the loop phi.  */
1571   init_cond = analyze_initial_condition (loop_phi_node);
1572   res = analyze_evolution_in_loop (loop_phi_node, init_cond);
1573 
1574   /* Verify we maintained the correct initial condition throughout
1575      possible conversions in the SSA chain.  */
1576   if (res != chrec_dont_know)
1577     {
1578       tree new_init = res;
1579       if (CONVERT_EXPR_P (res)
1580 	  && TREE_CODE (TREE_OPERAND (res, 0)) == POLYNOMIAL_CHREC)
1581 	new_init = fold_convert (TREE_TYPE (res),
1582 				 CHREC_LEFT (TREE_OPERAND (res, 0)));
1583       else if (TREE_CODE (res) == POLYNOMIAL_CHREC)
1584 	new_init = CHREC_LEFT (res);
1585       STRIP_USELESS_TYPE_CONVERSION (new_init);
1586       if (TREE_CODE (new_init) == POLYNOMIAL_CHREC
1587 	  || !operand_equal_p (init_cond, new_init, 0))
1588 	return chrec_dont_know;
1589     }
1590 
1591   return res;
1592 }
1593 
1594 /* This function merges the branches of a condition-phi-node,
1595    contained in the outermost loop, and whose arguments are already
1596    analyzed.  */
1597 
1598 static tree
1599 interpret_condition_phi (struct loop *loop, gimple condition_phi)
1600 {
1601   int i, n = gimple_phi_num_args (condition_phi);
1602   tree res = chrec_not_analyzed_yet;
1603 
1604   for (i = 0; i < n; i++)
1605     {
1606       tree branch_chrec;
1607 
1608       if (backedge_phi_arg_p (condition_phi, i))
1609 	{
1610 	  res = chrec_dont_know;
1611 	  break;
1612 	}
1613 
1614       branch_chrec = analyze_scalar_evolution
1615 	(loop, PHI_ARG_DEF (condition_phi, i));
1616 
1617       res = chrec_merge (res, branch_chrec);
1618     }
1619 
1620   return res;
1621 }
1622 
1623 /* Interpret the operation RHS1 OP RHS2.  If we didn't
1624    analyze this node before, follow the definitions until ending
1625    either on an analyzed GIMPLE_ASSIGN, or on a loop-phi-node.  On the
1626    return path, this function propagates evolutions (ala constant copy
1627    propagation).  OPND1 is not a GIMPLE expression because we could
1628    analyze the effect of an inner loop: see interpret_loop_phi.  */
1629 
1630 static tree
1631 interpret_rhs_expr (struct loop *loop, gimple at_stmt,
1632 		    tree type, tree rhs1, enum tree_code code, tree rhs2)
1633 {
1634   tree res, chrec1, chrec2;
1635 
1636   if (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS)
1637     {
1638       if (is_gimple_min_invariant (rhs1))
1639 	return chrec_convert (type, rhs1, at_stmt);
1640 
1641       if (code == SSA_NAME)
1642 	return chrec_convert (type, analyze_scalar_evolution (loop, rhs1),
1643 			      at_stmt);
1644 
1645       if (code == ASSERT_EXPR)
1646 	{
1647 	  rhs1 = ASSERT_EXPR_VAR (rhs1);
1648 	  return chrec_convert (type, analyze_scalar_evolution (loop, rhs1),
1649 				at_stmt);
1650 	}
1651     }
1652 
1653   switch (code)
1654     {
1655     case ADDR_EXPR:
1656       /* Handle &MEM[ptr + CST] which is equivalent to POINTER_PLUS_EXPR.  */
1657       if (TREE_CODE (TREE_OPERAND (rhs1, 0)) != MEM_REF)
1658 	{
1659 	  res = chrec_dont_know;
1660 	  break;
1661 	}
1662 
1663       rhs2 = TREE_OPERAND (TREE_OPERAND (rhs1, 0), 1);
1664       rhs1 = TREE_OPERAND (TREE_OPERAND (rhs1, 0), 0);
1665       /* Fall through.  */
1666 
1667     case POINTER_PLUS_EXPR:
1668       chrec1 = analyze_scalar_evolution (loop, rhs1);
1669       chrec2 = analyze_scalar_evolution (loop, rhs2);
1670       chrec1 = chrec_convert (type, chrec1, at_stmt);
1671       chrec2 = chrec_convert (TREE_TYPE (rhs2), chrec2, at_stmt);
1672       res = chrec_fold_plus (type, chrec1, chrec2);
1673       break;
1674 
1675     case PLUS_EXPR:
1676       chrec1 = analyze_scalar_evolution (loop, rhs1);
1677       chrec2 = analyze_scalar_evolution (loop, rhs2);
1678       chrec1 = chrec_convert (type, chrec1, at_stmt);
1679       chrec2 = chrec_convert (type, chrec2, at_stmt);
1680       res = chrec_fold_plus (type, chrec1, chrec2);
1681       break;
1682 
1683     case MINUS_EXPR:
1684       chrec1 = analyze_scalar_evolution (loop, rhs1);
1685       chrec2 = analyze_scalar_evolution (loop, rhs2);
1686       chrec1 = chrec_convert (type, chrec1, at_stmt);
1687       chrec2 = chrec_convert (type, chrec2, at_stmt);
1688       res = chrec_fold_minus (type, chrec1, chrec2);
1689       break;
1690 
1691     case NEGATE_EXPR:
1692       chrec1 = analyze_scalar_evolution (loop, rhs1);
1693       chrec1 = chrec_convert (type, chrec1, at_stmt);
1694       /* TYPE may be integer, real or complex, so use fold_convert.  */
1695       res = chrec_fold_multiply (type, chrec1,
1696 				 fold_convert (type, integer_minus_one_node));
1697       break;
1698 
1699     case BIT_NOT_EXPR:
1700       /* Handle ~X as -1 - X.  */
1701       chrec1 = analyze_scalar_evolution (loop, rhs1);
1702       chrec1 = chrec_convert (type, chrec1, at_stmt);
1703       res = chrec_fold_minus (type,
1704 			      fold_convert (type, integer_minus_one_node),
1705 			      chrec1);
1706       break;
1707 
1708     case MULT_EXPR:
1709       chrec1 = analyze_scalar_evolution (loop, rhs1);
1710       chrec2 = analyze_scalar_evolution (loop, rhs2);
1711       chrec1 = chrec_convert (type, chrec1, at_stmt);
1712       chrec2 = chrec_convert (type, chrec2, at_stmt);
1713       res = chrec_fold_multiply (type, chrec1, chrec2);
1714       break;
1715 
1716     CASE_CONVERT:
1717       chrec1 = analyze_scalar_evolution (loop, rhs1);
1718       res = chrec_convert (type, chrec1, at_stmt);
1719       break;
1720 
1721     default:
1722       res = chrec_dont_know;
1723       break;
1724     }
1725 
1726   return res;
1727 }
1728 
1729 /* Interpret the expression EXPR.  */
1730 
1731 static tree
1732 interpret_expr (struct loop *loop, gimple at_stmt, tree expr)
1733 {
1734   enum tree_code code;
1735   tree type = TREE_TYPE (expr), op0, op1;
1736 
1737   if (automatically_generated_chrec_p (expr))
1738     return expr;
1739 
1740   if (TREE_CODE (expr) == POLYNOMIAL_CHREC
1741       || get_gimple_rhs_class (TREE_CODE (expr)) == GIMPLE_TERNARY_RHS)
1742     return chrec_dont_know;
1743 
1744   extract_ops_from_tree (expr, &code, &op0, &op1);
1745 
1746   return interpret_rhs_expr (loop, at_stmt, type,
1747 			     op0, code, op1);
1748 }
1749 
1750 /* Interpret the rhs of the assignment STMT.  */
1751 
1752 static tree
1753 interpret_gimple_assign (struct loop *loop, gimple stmt)
1754 {
1755   tree type = TREE_TYPE (gimple_assign_lhs (stmt));
1756   enum tree_code code = gimple_assign_rhs_code (stmt);
1757 
1758   return interpret_rhs_expr (loop, stmt, type,
1759 			     gimple_assign_rhs1 (stmt), code,
1760 			     gimple_assign_rhs2 (stmt));
1761 }
1762 
1763 
1764 
1765 /* This section contains all the entry points:
1766    - number_of_iterations_in_loop,
1767    - analyze_scalar_evolution,
1768    - instantiate_parameters.
1769 */
1770 
1771 /* Compute and return the evolution function in WRTO_LOOP, the nearest
1772    common ancestor of DEF_LOOP and USE_LOOP.  */
1773 
1774 static tree
1775 compute_scalar_evolution_in_loop (struct loop *wrto_loop,
1776 				  struct loop *def_loop,
1777 				  tree ev)
1778 {
1779   bool val;
1780   tree res;
1781 
1782   if (def_loop == wrto_loop)
1783     return ev;
1784 
1785   def_loop = superloop_at_depth (def_loop, loop_depth (wrto_loop) + 1);
1786   res = compute_overall_effect_of_inner_loop (def_loop, ev);
1787 
1788   if (no_evolution_in_loop_p (res, wrto_loop->num, &val) && val)
1789     return res;
1790 
1791   return analyze_scalar_evolution_1 (wrto_loop, res, chrec_not_analyzed_yet);
1792 }
1793 
1794 /* Helper recursive function.  */
1795 
1796 static tree
1797 analyze_scalar_evolution_1 (struct loop *loop, tree var, tree res)
1798 {
1799   tree type = TREE_TYPE (var);
1800   gimple def;
1801   basic_block bb;
1802   struct loop *def_loop;
1803 
1804   if (loop == NULL || TREE_CODE (type) == VECTOR_TYPE)
1805     return chrec_dont_know;
1806 
1807   if (TREE_CODE (var) != SSA_NAME)
1808     return interpret_expr (loop, NULL, var);
1809 
1810   def = SSA_NAME_DEF_STMT (var);
1811   bb = gimple_bb (def);
1812   def_loop = bb ? bb->loop_father : NULL;
1813 
1814   if (bb == NULL
1815       || !flow_bb_inside_loop_p (loop, bb))
1816     {
1817       /* Keep the symbolic form.  */
1818       res = var;
1819       goto set_and_end;
1820     }
1821 
1822   if (res != chrec_not_analyzed_yet)
1823     {
1824       if (loop != bb->loop_father)
1825 	res = compute_scalar_evolution_in_loop
1826 	    (find_common_loop (loop, bb->loop_father), bb->loop_father, res);
1827 
1828       goto set_and_end;
1829     }
1830 
1831   if (loop != def_loop)
1832     {
1833       res = analyze_scalar_evolution_1 (def_loop, var, chrec_not_analyzed_yet);
1834       res = compute_scalar_evolution_in_loop (loop, def_loop, res);
1835 
1836       goto set_and_end;
1837     }
1838 
1839   switch (gimple_code (def))
1840     {
1841     case GIMPLE_ASSIGN:
1842       res = interpret_gimple_assign (loop, def);
1843       break;
1844 
1845     case GIMPLE_PHI:
1846       if (loop_phi_node_p (def))
1847 	res = interpret_loop_phi (loop, def);
1848       else
1849 	res = interpret_condition_phi (loop, def);
1850       break;
1851 
1852     default:
1853       res = chrec_dont_know;
1854       break;
1855     }
1856 
1857  set_and_end:
1858 
1859   /* Keep the symbolic form.  */
1860   if (res == chrec_dont_know)
1861     res = var;
1862 
1863   if (loop == def_loop)
1864     set_scalar_evolution (block_before_loop (loop), var, res);
1865 
1866   return res;
1867 }
1868 
1869 /* Analyzes and returns the scalar evolution of the ssa_name VAR in
1870    LOOP.  LOOP is the loop in which the variable is used.
1871 
1872    Example of use: having a pointer VAR to a SSA_NAME node, STMT a
1873    pointer to the statement that uses this variable, in order to
1874    determine the evolution function of the variable, use the following
1875    calls:
1876 
1877    loop_p loop = loop_containing_stmt (stmt);
1878    tree chrec_with_symbols = analyze_scalar_evolution (loop, var);
1879    tree chrec_instantiated = instantiate_parameters (loop, chrec_with_symbols);
1880 */
1881 
1882 tree
1883 analyze_scalar_evolution (struct loop *loop, tree var)
1884 {
1885   tree res;
1886 
1887   if (dump_file && (dump_flags & TDF_SCEV))
1888     {
1889       fprintf (dump_file, "(analyze_scalar_evolution \n");
1890       fprintf (dump_file, "  (loop_nb = %d)\n", loop->num);
1891       fprintf (dump_file, "  (scalar = ");
1892       print_generic_expr (dump_file, var, 0);
1893       fprintf (dump_file, ")\n");
1894     }
1895 
1896   res = get_scalar_evolution (block_before_loop (loop), var);
1897   res = analyze_scalar_evolution_1 (loop, var, res);
1898 
1899   if (dump_file && (dump_flags & TDF_SCEV))
1900     fprintf (dump_file, ")\n");
1901 
1902   return res;
1903 }
1904 
1905 /* Analyze scalar evolution of use of VERSION in USE_LOOP with respect to
1906    WRTO_LOOP (which should be a superloop of USE_LOOP)
1907 
1908    FOLDED_CASTS is set to true if resolve_mixers used
1909    chrec_convert_aggressive (TODO -- not really, we are way too conservative
1910    at the moment in order to keep things simple).
1911 
1912    To illustrate the meaning of USE_LOOP and WRTO_LOOP, consider the following
1913    example:
1914 
1915    for (i = 0; i < 100; i++)			-- loop 1
1916      {
1917        for (j = 0; j < 100; j++)		-- loop 2
1918          {
1919 	   k1 = i;
1920 	   k2 = j;
1921 
1922 	   use2 (k1, k2);
1923 
1924 	   for (t = 0; t < 100; t++)		-- loop 3
1925 	     use3 (k1, k2);
1926 
1927 	 }
1928        use1 (k1, k2);
1929      }
1930 
1931    Both k1 and k2 are invariants in loop3, thus
1932      analyze_scalar_evolution_in_loop (loop3, loop3, k1) = k1
1933      analyze_scalar_evolution_in_loop (loop3, loop3, k2) = k2
1934 
1935    As they are invariant, it does not matter whether we consider their
1936    usage in loop 3 or loop 2, hence
1937      analyze_scalar_evolution_in_loop (loop2, loop3, k1) =
1938        analyze_scalar_evolution_in_loop (loop2, loop2, k1) = i
1939      analyze_scalar_evolution_in_loop (loop2, loop3, k2) =
1940        analyze_scalar_evolution_in_loop (loop2, loop2, k2) = [0,+,1]_2
1941 
1942    Similarly for their evolutions with respect to loop 1.  The values of K2
1943    in the use in loop 2 vary independently on loop 1, thus we cannot express
1944    the evolution with respect to loop 1:
1945      analyze_scalar_evolution_in_loop (loop1, loop3, k1) =
1946        analyze_scalar_evolution_in_loop (loop1, loop2, k1) = [0,+,1]_1
1947      analyze_scalar_evolution_in_loop (loop1, loop3, k2) =
1948        analyze_scalar_evolution_in_loop (loop1, loop2, k2) = dont_know
1949 
1950    The value of k2 in the use in loop 1 is known, though:
1951      analyze_scalar_evolution_in_loop (loop1, loop1, k1) = [0,+,1]_1
1952      analyze_scalar_evolution_in_loop (loop1, loop1, k2) = 100
1953    */
1954 
1955 static tree
1956 analyze_scalar_evolution_in_loop (struct loop *wrto_loop, struct loop *use_loop,
1957 				  tree version, bool *folded_casts)
1958 {
1959   bool val = false;
1960   tree ev = version, tmp;
1961 
1962   /* We cannot just do
1963 
1964      tmp = analyze_scalar_evolution (use_loop, version);
1965      ev = resolve_mixers (wrto_loop, tmp);
1966 
1967      as resolve_mixers would query the scalar evolution with respect to
1968      wrto_loop.  For example, in the situation described in the function
1969      comment, suppose that wrto_loop = loop1, use_loop = loop3 and
1970      version = k2.  Then
1971 
1972      analyze_scalar_evolution (use_loop, version) = k2
1973 
1974      and resolve_mixers (loop1, k2) finds that the value of k2 in loop 1
1975      is 100, which is a wrong result, since we are interested in the
1976      value in loop 3.
1977 
1978      Instead, we need to proceed from use_loop to wrto_loop loop by loop,
1979      each time checking that there is no evolution in the inner loop.  */
1980 
1981   if (folded_casts)
1982     *folded_casts = false;
1983   while (1)
1984     {
1985       tmp = analyze_scalar_evolution (use_loop, ev);
1986       ev = resolve_mixers (use_loop, tmp);
1987 
1988       if (folded_casts && tmp != ev)
1989 	*folded_casts = true;
1990 
1991       if (use_loop == wrto_loop)
1992 	return ev;
1993 
1994       /* If the value of the use changes in the inner loop, we cannot express
1995 	 its value in the outer loop (we might try to return interval chrec,
1996 	 but we do not have a user for it anyway)  */
1997       if (!no_evolution_in_loop_p (ev, use_loop->num, &val)
1998 	  || !val)
1999 	return chrec_dont_know;
2000 
2001       use_loop = loop_outer (use_loop);
2002     }
2003 }
2004 
2005 /* Returns from CACHE the value for VERSION instantiated below
2006    INSTANTIATED_BELOW block.  */
2007 
2008 static tree
2009 get_instantiated_value (htab_t cache, basic_block instantiated_below,
2010 			tree version)
2011 {
2012   struct scev_info_str *info, pattern;
2013 
2014   pattern.var = version;
2015   pattern.instantiated_below = instantiated_below;
2016   info = (struct scev_info_str *) htab_find (cache, &pattern);
2017 
2018   if (info)
2019     return info->chrec;
2020   else
2021     return NULL_TREE;
2022 }
2023 
2024 /* Sets in CACHE the value of VERSION instantiated below basic block
2025    INSTANTIATED_BELOW to VAL.  */
2026 
2027 static void
2028 set_instantiated_value (htab_t cache, basic_block instantiated_below,
2029 			tree version, tree val)
2030 {
2031   struct scev_info_str *info, pattern;
2032   PTR *slot;
2033 
2034   pattern.var = version;
2035   pattern.instantiated_below = instantiated_below;
2036   slot = htab_find_slot (cache, &pattern, INSERT);
2037 
2038   if (!*slot)
2039     *slot = new_scev_info_str (instantiated_below, version);
2040   info = (struct scev_info_str *) *slot;
2041   info->chrec = val;
2042 }
2043 
2044 /* Return the closed_loop_phi node for VAR.  If there is none, return
2045    NULL_TREE.  */
2046 
2047 static tree
2048 loop_closed_phi_def (tree var)
2049 {
2050   struct loop *loop;
2051   edge exit;
2052   gimple phi;
2053   gimple_stmt_iterator psi;
2054 
2055   if (var == NULL_TREE
2056       || TREE_CODE (var) != SSA_NAME)
2057     return NULL_TREE;
2058 
2059   loop = loop_containing_stmt (SSA_NAME_DEF_STMT (var));
2060   exit = single_exit (loop);
2061   if (!exit)
2062     return NULL_TREE;
2063 
2064   for (psi = gsi_start_phis (exit->dest); !gsi_end_p (psi); gsi_next (&psi))
2065     {
2066       phi = gsi_stmt (psi);
2067       if (PHI_ARG_DEF_FROM_EDGE (phi, exit) == var)
2068 	return PHI_RESULT (phi);
2069     }
2070 
2071   return NULL_TREE;
2072 }
2073 
2074 static tree instantiate_scev_r (basic_block, struct loop *, tree, bool,
2075 				htab_t, int);
2076 
2077 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2078    and EVOLUTION_LOOP, that were left under a symbolic form.
2079 
2080    CHREC is an SSA_NAME to be instantiated.
2081 
2082    CACHE is the cache of already instantiated values.
2083 
2084    FOLD_CONVERSIONS should be set to true when the conversions that
2085    may wrap in signed/pointer type are folded, as long as the value of
2086    the chrec is preserved.
2087 
2088    SIZE_EXPR is used for computing the size of the expression to be
2089    instantiated, and to stop if it exceeds some limit.  */
2090 
2091 static tree
2092 instantiate_scev_name (basic_block instantiate_below,
2093 		       struct loop *evolution_loop, tree chrec,
2094 		       bool fold_conversions, htab_t cache, int size_expr)
2095 {
2096   tree res;
2097   struct loop *def_loop;
2098   basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (chrec));
2099 
2100   /* A parameter (or loop invariant and we do not want to include
2101      evolutions in outer loops), nothing to do.  */
2102   if (!def_bb
2103       || loop_depth (def_bb->loop_father) == 0
2104       || dominated_by_p (CDI_DOMINATORS, instantiate_below, def_bb))
2105     return chrec;
2106 
2107   /* We cache the value of instantiated variable to avoid exponential
2108      time complexity due to reevaluations.  We also store the convenient
2109      value in the cache in order to prevent infinite recursion -- we do
2110      not want to instantiate the SSA_NAME if it is in a mixer
2111      structure.  This is used for avoiding the instantiation of
2112      recursively defined functions, such as:
2113 
2114      | a_2 -> {0, +, 1, +, a_2}_1  */
2115 
2116   res = get_instantiated_value (cache, instantiate_below, chrec);
2117   if (res)
2118     return res;
2119 
2120   res = chrec_dont_know;
2121   set_instantiated_value (cache, instantiate_below, chrec, res);
2122 
2123   def_loop = find_common_loop (evolution_loop, def_bb->loop_father);
2124 
2125   /* If the analysis yields a parametric chrec, instantiate the
2126      result again.  */
2127   res = analyze_scalar_evolution (def_loop, chrec);
2128 
2129   /* Don't instantiate default definitions.  */
2130   if (TREE_CODE (res) == SSA_NAME
2131       && SSA_NAME_IS_DEFAULT_DEF (res))
2132     ;
2133 
2134   /* Don't instantiate loop-closed-ssa phi nodes.  */
2135   else if (TREE_CODE (res) == SSA_NAME
2136 	   && loop_depth (loop_containing_stmt (SSA_NAME_DEF_STMT (res)))
2137 	   > loop_depth (def_loop))
2138     {
2139       if (res == chrec)
2140 	res = loop_closed_phi_def (chrec);
2141       else
2142 	res = chrec;
2143 
2144       /* When there is no loop_closed_phi_def, it means that the
2145 	 variable is not used after the loop: try to still compute the
2146 	 value of the variable when exiting the loop.  */
2147       if (res == NULL_TREE)
2148 	{
2149 	  loop_p loop = loop_containing_stmt (SSA_NAME_DEF_STMT (chrec));
2150 	  res = analyze_scalar_evolution (loop, chrec);
2151 	  res = compute_overall_effect_of_inner_loop (loop, res);
2152 	  res = instantiate_scev_r (instantiate_below, evolution_loop, res,
2153 				    fold_conversions, cache, size_expr);
2154 	}
2155       else if (!dominated_by_p (CDI_DOMINATORS, instantiate_below,
2156 				gimple_bb (SSA_NAME_DEF_STMT (res))))
2157 	res = chrec_dont_know;
2158     }
2159 
2160   else if (res != chrec_dont_know)
2161     res = instantiate_scev_r (instantiate_below, evolution_loop, res,
2162 			      fold_conversions, cache, size_expr);
2163 
2164   /* Store the correct value to the cache.  */
2165   set_instantiated_value (cache, instantiate_below, chrec, res);
2166   return res;
2167 }
2168 
2169 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2170    and EVOLUTION_LOOP, that were left under a symbolic form.
2171 
2172    CHREC is a polynomial chain of recurrence to be instantiated.
2173 
2174    CACHE is the cache of already instantiated values.
2175 
2176    FOLD_CONVERSIONS should be set to true when the conversions that
2177    may wrap in signed/pointer type are folded, as long as the value of
2178    the chrec is preserved.
2179 
2180    SIZE_EXPR is used for computing the size of the expression to be
2181    instantiated, and to stop if it exceeds some limit.  */
2182 
2183 static tree
2184 instantiate_scev_poly (basic_block instantiate_below,
2185 		       struct loop *evolution_loop, tree chrec,
2186 		       bool fold_conversions, htab_t cache, int size_expr)
2187 {
2188   tree op1;
2189   tree op0 = instantiate_scev_r (instantiate_below, evolution_loop,
2190 				 CHREC_LEFT (chrec), fold_conversions, cache,
2191 				 size_expr);
2192   if (op0 == chrec_dont_know)
2193     return chrec_dont_know;
2194 
2195   op1 = instantiate_scev_r (instantiate_below, evolution_loop,
2196 			    CHREC_RIGHT (chrec), fold_conversions, cache,
2197 			    size_expr);
2198   if (op1 == chrec_dont_know)
2199     return chrec_dont_know;
2200 
2201   if (CHREC_LEFT (chrec) != op0
2202       || CHREC_RIGHT (chrec) != op1)
2203     {
2204       unsigned var = CHREC_VARIABLE (chrec);
2205 
2206       /* When the instantiated stride or base has an evolution in an
2207 	 innermost loop, return chrec_dont_know, as this is not a
2208 	 valid SCEV representation.  In the reduced testcase for
2209 	 PR40281 we would have {0, +, {1, +, 1}_2}_1 that has no
2210 	 meaning.  */
2211       if ((tree_is_chrec (op0) && CHREC_VARIABLE (op0) > var)
2212 	  || (tree_is_chrec (op1) && CHREC_VARIABLE (op1) > var))
2213 	return chrec_dont_know;
2214 
2215       op1 = chrec_convert_rhs (chrec_type (op0), op1, NULL);
2216       chrec = build_polynomial_chrec (var, op0, op1);
2217     }
2218 
2219   return chrec;
2220 }
2221 
2222 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2223    and EVOLUTION_LOOP, that were left under a symbolic form.
2224 
2225    "C0 CODE C1" is a binary expression of type TYPE to be instantiated.
2226 
2227    CACHE is the cache of already instantiated values.
2228 
2229    FOLD_CONVERSIONS should be set to true when the conversions that
2230    may wrap in signed/pointer type are folded, as long as the value of
2231    the chrec is preserved.
2232 
2233    SIZE_EXPR is used for computing the size of the expression to be
2234    instantiated, and to stop if it exceeds some limit.  */
2235 
2236 static tree
2237 instantiate_scev_binary (basic_block instantiate_below,
2238 			 struct loop *evolution_loop, tree chrec, enum tree_code code,
2239 			 tree type, tree c0, tree c1,
2240 			 bool fold_conversions, htab_t cache, int size_expr)
2241 {
2242   tree op1;
2243   tree op0 = instantiate_scev_r (instantiate_below, evolution_loop,
2244 				 c0, fold_conversions, cache,
2245 				 size_expr);
2246   if (op0 == chrec_dont_know)
2247     return chrec_dont_know;
2248 
2249   op1 = instantiate_scev_r (instantiate_below, evolution_loop,
2250 			    c1, fold_conversions, cache,
2251 			    size_expr);
2252   if (op1 == chrec_dont_know)
2253     return chrec_dont_know;
2254 
2255   if (c0 != op0
2256       || c1 != op1)
2257     {
2258       op0 = chrec_convert (type, op0, NULL);
2259       op1 = chrec_convert_rhs (type, op1, NULL);
2260 
2261       switch (code)
2262 	{
2263 	case POINTER_PLUS_EXPR:
2264 	case PLUS_EXPR:
2265 	  return chrec_fold_plus (type, op0, op1);
2266 
2267 	case MINUS_EXPR:
2268 	  return chrec_fold_minus (type, op0, op1);
2269 
2270 	case MULT_EXPR:
2271 	  return chrec_fold_multiply (type, op0, op1);
2272 
2273 	default:
2274 	  gcc_unreachable ();
2275 	}
2276     }
2277 
2278   return chrec ? chrec : fold_build2 (code, type, c0, c1);
2279 }
2280 
2281 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2282    and EVOLUTION_LOOP, that were left under a symbolic form.
2283 
2284    "CHREC" is an array reference to be instantiated.
2285 
2286    CACHE is the cache of already instantiated values.
2287 
2288    FOLD_CONVERSIONS should be set to true when the conversions that
2289    may wrap in signed/pointer type are folded, as long as the value of
2290    the chrec is preserved.
2291 
2292    SIZE_EXPR is used for computing the size of the expression to be
2293    instantiated, and to stop if it exceeds some limit.  */
2294 
2295 static tree
2296 instantiate_array_ref (basic_block instantiate_below,
2297 		       struct loop *evolution_loop, tree chrec,
2298 		       bool fold_conversions, htab_t cache, int size_expr)
2299 {
2300   tree res;
2301   tree index = TREE_OPERAND (chrec, 1);
2302   tree op1 = instantiate_scev_r (instantiate_below, evolution_loop, index,
2303 				 fold_conversions, cache, size_expr);
2304 
2305   if (op1 == chrec_dont_know)
2306     return chrec_dont_know;
2307 
2308   if (chrec && op1 == index)
2309     return chrec;
2310 
2311   res = unshare_expr (chrec);
2312   TREE_OPERAND (res, 1) = op1;
2313   return res;
2314 }
2315 
2316 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2317    and EVOLUTION_LOOP, that were left under a symbolic form.
2318 
2319    "CHREC" that stands for a convert expression "(TYPE) OP" is to be
2320    instantiated.
2321 
2322    CACHE is the cache of already instantiated values.
2323 
2324    FOLD_CONVERSIONS should be set to true when the conversions that
2325    may wrap in signed/pointer type are folded, as long as the value of
2326    the chrec is preserved.
2327 
2328    SIZE_EXPR is used for computing the size of the expression to be
2329    instantiated, and to stop if it exceeds some limit.  */
2330 
2331 static tree
2332 instantiate_scev_convert (basic_block instantiate_below,
2333 			  struct loop *evolution_loop, tree chrec,
2334 			  tree type, tree op,
2335 			  bool fold_conversions, htab_t cache, int size_expr)
2336 {
2337   tree op0 = instantiate_scev_r (instantiate_below, evolution_loop, op,
2338 				 fold_conversions, cache, size_expr);
2339 
2340   if (op0 == chrec_dont_know)
2341     return chrec_dont_know;
2342 
2343   if (fold_conversions)
2344     {
2345       tree tmp = chrec_convert_aggressive (type, op0);
2346       if (tmp)
2347 	return tmp;
2348     }
2349 
2350   if (chrec && op0 == op)
2351     return chrec;
2352 
2353   /* If we used chrec_convert_aggressive, we can no longer assume that
2354      signed chrecs do not overflow, as chrec_convert does, so avoid
2355      calling it in that case.  */
2356   if (fold_conversions)
2357     return fold_convert (type, op0);
2358 
2359   return chrec_convert (type, op0, NULL);
2360 }
2361 
2362 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2363    and EVOLUTION_LOOP, that were left under a symbolic form.
2364 
2365    CHREC is a BIT_NOT_EXPR or a NEGATE_EXPR expression to be instantiated.
2366    Handle ~X as -1 - X.
2367    Handle -X as -1 * X.
2368 
2369    CACHE is the cache of already instantiated values.
2370 
2371    FOLD_CONVERSIONS should be set to true when the conversions that
2372    may wrap in signed/pointer type are folded, as long as the value of
2373    the chrec is preserved.
2374 
2375    SIZE_EXPR is used for computing the size of the expression to be
2376    instantiated, and to stop if it exceeds some limit.  */
2377 
2378 static tree
2379 instantiate_scev_not (basic_block instantiate_below,
2380 		      struct loop *evolution_loop, tree chrec,
2381 		      enum tree_code code, tree type, tree op,
2382 		      bool fold_conversions, htab_t cache, int size_expr)
2383 {
2384   tree op0 = instantiate_scev_r (instantiate_below, evolution_loop, op,
2385 				 fold_conversions, cache, size_expr);
2386 
2387   if (op0 == chrec_dont_know)
2388     return chrec_dont_know;
2389 
2390   if (op != op0)
2391     {
2392       op0 = chrec_convert (type, op0, NULL);
2393 
2394       switch (code)
2395 	{
2396 	case BIT_NOT_EXPR:
2397 	  return chrec_fold_minus
2398 	    (type, fold_convert (type, integer_minus_one_node), op0);
2399 
2400 	case NEGATE_EXPR:
2401 	  return chrec_fold_multiply
2402 	    (type, fold_convert (type, integer_minus_one_node), op0);
2403 
2404 	default:
2405 	  gcc_unreachable ();
2406 	}
2407     }
2408 
2409   return chrec ? chrec : fold_build1 (code, type, op0);
2410 }
2411 
2412 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2413    and EVOLUTION_LOOP, that were left under a symbolic form.
2414 
2415    CHREC is an expression with 3 operands to be instantiated.
2416 
2417    CACHE is the cache of already instantiated values.
2418 
2419    FOLD_CONVERSIONS should be set to true when the conversions that
2420    may wrap in signed/pointer type are folded, as long as the value of
2421    the chrec is preserved.
2422 
2423    SIZE_EXPR is used for computing the size of the expression to be
2424    instantiated, and to stop if it exceeds some limit.  */
2425 
2426 static tree
2427 instantiate_scev_3 (basic_block instantiate_below,
2428 		    struct loop *evolution_loop, tree chrec,
2429 		    bool fold_conversions, htab_t cache, int size_expr)
2430 {
2431   tree op1, op2;
2432   tree op0 = instantiate_scev_r (instantiate_below, evolution_loop,
2433 				 TREE_OPERAND (chrec, 0),
2434 				 fold_conversions, cache, size_expr);
2435   if (op0 == chrec_dont_know)
2436     return chrec_dont_know;
2437 
2438   op1 = instantiate_scev_r (instantiate_below, evolution_loop,
2439 			    TREE_OPERAND (chrec, 1),
2440 			    fold_conversions, cache, size_expr);
2441   if (op1 == chrec_dont_know)
2442     return chrec_dont_know;
2443 
2444   op2 = instantiate_scev_r (instantiate_below, evolution_loop,
2445 			    TREE_OPERAND (chrec, 2),
2446 			    fold_conversions, cache, size_expr);
2447   if (op2 == chrec_dont_know)
2448     return chrec_dont_know;
2449 
2450   if (op0 == TREE_OPERAND (chrec, 0)
2451       && op1 == TREE_OPERAND (chrec, 1)
2452       && op2 == TREE_OPERAND (chrec, 2))
2453     return chrec;
2454 
2455   return fold_build3 (TREE_CODE (chrec),
2456 		      TREE_TYPE (chrec), op0, op1, op2);
2457 }
2458 
2459 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2460    and EVOLUTION_LOOP, that were left under a symbolic form.
2461 
2462    CHREC is an expression with 2 operands to be instantiated.
2463 
2464    CACHE is the cache of already instantiated values.
2465 
2466    FOLD_CONVERSIONS should be set to true when the conversions that
2467    may wrap in signed/pointer type are folded, as long as the value of
2468    the chrec is preserved.
2469 
2470    SIZE_EXPR is used for computing the size of the expression to be
2471    instantiated, and to stop if it exceeds some limit.  */
2472 
2473 static tree
2474 instantiate_scev_2 (basic_block instantiate_below,
2475 		    struct loop *evolution_loop, tree chrec,
2476 		    bool fold_conversions, htab_t cache, int size_expr)
2477 {
2478   tree op1;
2479   tree op0 = instantiate_scev_r (instantiate_below, evolution_loop,
2480 				 TREE_OPERAND (chrec, 0),
2481 				 fold_conversions, cache, size_expr);
2482   if (op0 == chrec_dont_know)
2483     return chrec_dont_know;
2484 
2485   op1 = instantiate_scev_r (instantiate_below, evolution_loop,
2486 			    TREE_OPERAND (chrec, 1),
2487 			    fold_conversions, cache, size_expr);
2488   if (op1 == chrec_dont_know)
2489     return chrec_dont_know;
2490 
2491   if (op0 == TREE_OPERAND (chrec, 0)
2492       && op1 == TREE_OPERAND (chrec, 1))
2493     return chrec;
2494 
2495   return fold_build2 (TREE_CODE (chrec), TREE_TYPE (chrec), op0, op1);
2496 }
2497 
2498 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2499    and EVOLUTION_LOOP, that were left under a symbolic form.
2500 
2501    CHREC is an expression with 2 operands to be instantiated.
2502 
2503    CACHE is the cache of already instantiated values.
2504 
2505    FOLD_CONVERSIONS should be set to true when the conversions that
2506    may wrap in signed/pointer type are folded, as long as the value of
2507    the chrec is preserved.
2508 
2509    SIZE_EXPR is used for computing the size of the expression to be
2510    instantiated, and to stop if it exceeds some limit.  */
2511 
2512 static tree
2513 instantiate_scev_1 (basic_block instantiate_below,
2514 		    struct loop *evolution_loop, tree chrec,
2515 		    bool fold_conversions, htab_t cache, int size_expr)
2516 {
2517   tree op0 = instantiate_scev_r (instantiate_below, evolution_loop,
2518 				 TREE_OPERAND (chrec, 0),
2519 				 fold_conversions, cache, size_expr);
2520 
2521   if (op0 == chrec_dont_know)
2522     return chrec_dont_know;
2523 
2524   if (op0 == TREE_OPERAND (chrec, 0))
2525     return chrec;
2526 
2527   return fold_build1 (TREE_CODE (chrec), TREE_TYPE (chrec), op0);
2528 }
2529 
2530 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2531    and EVOLUTION_LOOP, that were left under a symbolic form.
2532 
2533    CHREC is the scalar evolution to instantiate.
2534 
2535    CACHE is the cache of already instantiated values.
2536 
2537    FOLD_CONVERSIONS should be set to true when the conversions that
2538    may wrap in signed/pointer type are folded, as long as the value of
2539    the chrec is preserved.
2540 
2541    SIZE_EXPR is used for computing the size of the expression to be
2542    instantiated, and to stop if it exceeds some limit.  */
2543 
2544 static tree
2545 instantiate_scev_r (basic_block instantiate_below,
2546 		    struct loop *evolution_loop, tree chrec,
2547 		    bool fold_conversions, htab_t cache, int size_expr)
2548 {
2549   /* Give up if the expression is larger than the MAX that we allow.  */
2550   if (size_expr++ > PARAM_VALUE (PARAM_SCEV_MAX_EXPR_SIZE))
2551     return chrec_dont_know;
2552 
2553   if (chrec == NULL_TREE
2554       || automatically_generated_chrec_p (chrec)
2555       || is_gimple_min_invariant (chrec))
2556     return chrec;
2557 
2558   switch (TREE_CODE (chrec))
2559     {
2560     case SSA_NAME:
2561       return instantiate_scev_name (instantiate_below, evolution_loop, chrec,
2562 				    fold_conversions, cache, size_expr);
2563 
2564     case POLYNOMIAL_CHREC:
2565       return instantiate_scev_poly (instantiate_below, evolution_loop, chrec,
2566 				    fold_conversions, cache, size_expr);
2567 
2568     case POINTER_PLUS_EXPR:
2569     case PLUS_EXPR:
2570     case MINUS_EXPR:
2571     case MULT_EXPR:
2572       return instantiate_scev_binary (instantiate_below, evolution_loop, chrec,
2573 				      TREE_CODE (chrec), chrec_type (chrec),
2574 				      TREE_OPERAND (chrec, 0),
2575 				      TREE_OPERAND (chrec, 1),
2576 				      fold_conversions, cache, size_expr);
2577 
2578     CASE_CONVERT:
2579       return instantiate_scev_convert (instantiate_below, evolution_loop, chrec,
2580 				       TREE_TYPE (chrec), TREE_OPERAND (chrec, 0),
2581 				       fold_conversions, cache, size_expr);
2582 
2583     case NEGATE_EXPR:
2584     case BIT_NOT_EXPR:
2585       return instantiate_scev_not (instantiate_below, evolution_loop, chrec,
2586 				   TREE_CODE (chrec), TREE_TYPE (chrec),
2587 				   TREE_OPERAND (chrec, 0),
2588 				   fold_conversions, cache, size_expr);
2589 
2590     case ADDR_EXPR:
2591     case SCEV_NOT_KNOWN:
2592       return chrec_dont_know;
2593 
2594     case SCEV_KNOWN:
2595       return chrec_known;
2596 
2597     case ARRAY_REF:
2598       return instantiate_array_ref (instantiate_below, evolution_loop, chrec,
2599 				    fold_conversions, cache, size_expr);
2600 
2601     default:
2602       break;
2603     }
2604 
2605   if (VL_EXP_CLASS_P (chrec))
2606     return chrec_dont_know;
2607 
2608   switch (TREE_CODE_LENGTH (TREE_CODE (chrec)))
2609     {
2610     case 3:
2611       return instantiate_scev_3 (instantiate_below, evolution_loop, chrec,
2612 				 fold_conversions, cache, size_expr);
2613 
2614     case 2:
2615       return instantiate_scev_2 (instantiate_below, evolution_loop, chrec,
2616 				 fold_conversions, cache, size_expr);
2617 
2618     case 1:
2619       return instantiate_scev_1 (instantiate_below, evolution_loop, chrec,
2620 				 fold_conversions, cache, size_expr);
2621 
2622     case 0:
2623       return chrec;
2624 
2625     default:
2626       break;
2627     }
2628 
2629   /* Too complicated to handle.  */
2630   return chrec_dont_know;
2631 }
2632 
2633 /* Analyze all the parameters of the chrec that were left under a
2634    symbolic form.  INSTANTIATE_BELOW is the basic block that stops the
2635    recursive instantiation of parameters: a parameter is a variable
2636    that is defined in a basic block that dominates INSTANTIATE_BELOW or
2637    a function parameter.  */
2638 
2639 tree
2640 instantiate_scev (basic_block instantiate_below, struct loop *evolution_loop,
2641 		  tree chrec)
2642 {
2643   tree res;
2644   htab_t cache = htab_create (10, hash_scev_info, eq_scev_info, del_scev_info);
2645 
2646   if (dump_file && (dump_flags & TDF_SCEV))
2647     {
2648       fprintf (dump_file, "(instantiate_scev \n");
2649       fprintf (dump_file, "  (instantiate_below = %d)\n", instantiate_below->index);
2650       fprintf (dump_file, "  (evolution_loop = %d)\n", evolution_loop->num);
2651       fprintf (dump_file, "  (chrec = ");
2652       print_generic_expr (dump_file, chrec, 0);
2653       fprintf (dump_file, ")\n");
2654     }
2655 
2656   res = instantiate_scev_r (instantiate_below, evolution_loop, chrec, false,
2657 			    cache, 0);
2658 
2659   if (dump_file && (dump_flags & TDF_SCEV))
2660     {
2661       fprintf (dump_file, "  (res = ");
2662       print_generic_expr (dump_file, res, 0);
2663       fprintf (dump_file, "))\n");
2664     }
2665 
2666   htab_delete (cache);
2667 
2668   return res;
2669 }
2670 
2671 /* Similar to instantiate_parameters, but does not introduce the
2672    evolutions in outer loops for LOOP invariants in CHREC, and does not
2673    care about causing overflows, as long as they do not affect value
2674    of an expression.  */
2675 
2676 tree
2677 resolve_mixers (struct loop *loop, tree chrec)
2678 {
2679   htab_t cache = htab_create (10, hash_scev_info, eq_scev_info, del_scev_info);
2680   tree ret = instantiate_scev_r (block_before_loop (loop), loop, chrec, true,
2681 				 cache, 0);
2682   htab_delete (cache);
2683   return ret;
2684 }
2685 
2686 /* Entry point for the analysis of the number of iterations pass.
2687    This function tries to safely approximate the number of iterations
2688    the loop will run.  When this property is not decidable at compile
2689    time, the result is chrec_dont_know.  Otherwise the result is a
2690    scalar or a symbolic parameter.  When the number of iterations may
2691    be equal to zero and the property cannot be determined at compile
2692    time, the result is a COND_EXPR that represents in a symbolic form
2693    the conditions under which the number of iterations is not zero.
2694 
2695    Example of analysis: suppose that the loop has an exit condition:
2696 
2697    "if (b > 49) goto end_loop;"
2698 
2699    and that in a previous analysis we have determined that the
2700    variable 'b' has an evolution function:
2701 
2702    "EF = {23, +, 5}_2".
2703 
2704    When we evaluate the function at the point 5, i.e. the value of the
2705    variable 'b' after 5 iterations in the loop, we have EF (5) = 48,
2706    and EF (6) = 53.  In this case the value of 'b' on exit is '53' and
2707    the loop body has been executed 6 times.  */
2708 
2709 tree
2710 number_of_latch_executions (struct loop *loop)
2711 {
2712   edge exit;
2713   struct tree_niter_desc niter_desc;
2714   tree may_be_zero;
2715   tree res;
2716 
2717   /* Determine whether the number of iterations in loop has already
2718      been computed.  */
2719   res = loop->nb_iterations;
2720   if (res)
2721     return res;
2722 
2723   may_be_zero = NULL_TREE;
2724 
2725   if (dump_file && (dump_flags & TDF_SCEV))
2726     fprintf (dump_file, "(number_of_iterations_in_loop = \n");
2727 
2728   res = chrec_dont_know;
2729   exit = single_exit (loop);
2730 
2731   if (exit && number_of_iterations_exit (loop, exit, &niter_desc, false))
2732     {
2733       may_be_zero = niter_desc.may_be_zero;
2734       res = niter_desc.niter;
2735     }
2736 
2737   if (res == chrec_dont_know
2738       || !may_be_zero
2739       || integer_zerop (may_be_zero))
2740     ;
2741   else if (integer_nonzerop (may_be_zero))
2742     res = build_int_cst (TREE_TYPE (res), 0);
2743 
2744   else if (COMPARISON_CLASS_P (may_be_zero))
2745     res = fold_build3 (COND_EXPR, TREE_TYPE (res), may_be_zero,
2746 		       build_int_cst (TREE_TYPE (res), 0), res);
2747   else
2748     res = chrec_dont_know;
2749 
2750   if (dump_file && (dump_flags & TDF_SCEV))
2751     {
2752       fprintf (dump_file, "  (set_nb_iterations_in_loop = ");
2753       print_generic_expr (dump_file, res, 0);
2754       fprintf (dump_file, "))\n");
2755     }
2756 
2757   loop->nb_iterations = res;
2758   return res;
2759 }
2760 
2761 /* Returns the number of executions of the exit condition of LOOP,
2762    i.e., the number by one higher than number_of_latch_executions.
2763    Note that unlike number_of_latch_executions, this number does
2764    not necessarily fit in the unsigned variant of the type of
2765    the control variable -- if the number of iterations is a constant,
2766    we return chrec_dont_know if adding one to number_of_latch_executions
2767    overflows; however, in case the number of iterations is symbolic
2768    expression, the caller is responsible for dealing with this
2769    the possible overflow.  */
2770 
2771 tree
2772 number_of_exit_cond_executions (struct loop *loop)
2773 {
2774   tree ret = number_of_latch_executions (loop);
2775   tree type = chrec_type (ret);
2776 
2777   if (chrec_contains_undetermined (ret))
2778     return ret;
2779 
2780   ret = chrec_fold_plus (type, ret, build_int_cst (type, 1));
2781   if (TREE_CODE (ret) == INTEGER_CST
2782       && TREE_OVERFLOW (ret))
2783     return chrec_dont_know;
2784 
2785   return ret;
2786 }
2787 
2788 /* One of the drivers for testing the scalar evolutions analysis.
2789    This function computes the number of iterations for all the loops
2790    from the EXIT_CONDITIONS array.  */
2791 
2792 static void
2793 number_of_iterations_for_all_loops (VEC(gimple,heap) **exit_conditions)
2794 {
2795   unsigned int i;
2796   unsigned nb_chrec_dont_know_loops = 0;
2797   unsigned nb_static_loops = 0;
2798   gimple cond;
2799 
2800   FOR_EACH_VEC_ELT (gimple, *exit_conditions, i, cond)
2801     {
2802       tree res = number_of_latch_executions (loop_containing_stmt (cond));
2803       if (chrec_contains_undetermined (res))
2804 	nb_chrec_dont_know_loops++;
2805       else
2806 	nb_static_loops++;
2807     }
2808 
2809   if (dump_file)
2810     {
2811       fprintf (dump_file, "\n(\n");
2812       fprintf (dump_file, "-----------------------------------------\n");
2813       fprintf (dump_file, "%d\tnb_chrec_dont_know_loops\n", nb_chrec_dont_know_loops);
2814       fprintf (dump_file, "%d\tnb_static_loops\n", nb_static_loops);
2815       fprintf (dump_file, "%d\tnb_total_loops\n", number_of_loops ());
2816       fprintf (dump_file, "-----------------------------------------\n");
2817       fprintf (dump_file, ")\n\n");
2818 
2819       print_loops (dump_file, 3);
2820     }
2821 }
2822 
2823 
2824 
2825 /* Counters for the stats.  */
2826 
2827 struct chrec_stats
2828 {
2829   unsigned nb_chrecs;
2830   unsigned nb_affine;
2831   unsigned nb_affine_multivar;
2832   unsigned nb_higher_poly;
2833   unsigned nb_chrec_dont_know;
2834   unsigned nb_undetermined;
2835 };
2836 
2837 /* Reset the counters.  */
2838 
2839 static inline void
2840 reset_chrecs_counters (struct chrec_stats *stats)
2841 {
2842   stats->nb_chrecs = 0;
2843   stats->nb_affine = 0;
2844   stats->nb_affine_multivar = 0;
2845   stats->nb_higher_poly = 0;
2846   stats->nb_chrec_dont_know = 0;
2847   stats->nb_undetermined = 0;
2848 }
2849 
2850 /* Dump the contents of a CHREC_STATS structure.  */
2851 
2852 static void
2853 dump_chrecs_stats (FILE *file, struct chrec_stats *stats)
2854 {
2855   fprintf (file, "\n(\n");
2856   fprintf (file, "-----------------------------------------\n");
2857   fprintf (file, "%d\taffine univariate chrecs\n", stats->nb_affine);
2858   fprintf (file, "%d\taffine multivariate chrecs\n", stats->nb_affine_multivar);
2859   fprintf (file, "%d\tdegree greater than 2 polynomials\n",
2860 	   stats->nb_higher_poly);
2861   fprintf (file, "%d\tchrec_dont_know chrecs\n", stats->nb_chrec_dont_know);
2862   fprintf (file, "-----------------------------------------\n");
2863   fprintf (file, "%d\ttotal chrecs\n", stats->nb_chrecs);
2864   fprintf (file, "%d\twith undetermined coefficients\n",
2865 	   stats->nb_undetermined);
2866   fprintf (file, "-----------------------------------------\n");
2867   fprintf (file, "%d\tchrecs in the scev database\n",
2868 	   (int) htab_elements (scalar_evolution_info));
2869   fprintf (file, "%d\tsets in the scev database\n", nb_set_scev);
2870   fprintf (file, "%d\tgets in the scev database\n", nb_get_scev);
2871   fprintf (file, "-----------------------------------------\n");
2872   fprintf (file, ")\n\n");
2873 }
2874 
2875 /* Gather statistics about CHREC.  */
2876 
2877 static void
2878 gather_chrec_stats (tree chrec, struct chrec_stats *stats)
2879 {
2880   if (dump_file && (dump_flags & TDF_STATS))
2881     {
2882       fprintf (dump_file, "(classify_chrec ");
2883       print_generic_expr (dump_file, chrec, 0);
2884       fprintf (dump_file, "\n");
2885     }
2886 
2887   stats->nb_chrecs++;
2888 
2889   if (chrec == NULL_TREE)
2890     {
2891       stats->nb_undetermined++;
2892       return;
2893     }
2894 
2895   switch (TREE_CODE (chrec))
2896     {
2897     case POLYNOMIAL_CHREC:
2898       if (evolution_function_is_affine_p (chrec))
2899 	{
2900 	  if (dump_file && (dump_flags & TDF_STATS))
2901 	    fprintf (dump_file, "  affine_univariate\n");
2902 	  stats->nb_affine++;
2903 	}
2904       else if (evolution_function_is_affine_multivariate_p (chrec, 0))
2905 	{
2906 	  if (dump_file && (dump_flags & TDF_STATS))
2907 	    fprintf (dump_file, "  affine_multivariate\n");
2908 	  stats->nb_affine_multivar++;
2909 	}
2910       else
2911 	{
2912 	  if (dump_file && (dump_flags & TDF_STATS))
2913 	    fprintf (dump_file, "  higher_degree_polynomial\n");
2914 	  stats->nb_higher_poly++;
2915 	}
2916 
2917       break;
2918 
2919     default:
2920       break;
2921     }
2922 
2923   if (chrec_contains_undetermined (chrec))
2924     {
2925       if (dump_file && (dump_flags & TDF_STATS))
2926 	fprintf (dump_file, "  undetermined\n");
2927       stats->nb_undetermined++;
2928     }
2929 
2930   if (dump_file && (dump_flags & TDF_STATS))
2931     fprintf (dump_file, ")\n");
2932 }
2933 
2934 /* One of the drivers for testing the scalar evolutions analysis.
2935    This function analyzes the scalar evolution of all the scalars
2936    defined as loop phi nodes in one of the loops from the
2937    EXIT_CONDITIONS array.
2938 
2939    TODO Optimization: A loop is in canonical form if it contains only
2940    a single scalar loop phi node.  All the other scalars that have an
2941    evolution in the loop are rewritten in function of this single
2942    index.  This allows the parallelization of the loop.  */
2943 
2944 static void
2945 analyze_scalar_evolution_for_all_loop_phi_nodes (VEC(gimple,heap) **exit_conditions)
2946 {
2947   unsigned int i;
2948   struct chrec_stats stats;
2949   gimple cond, phi;
2950   gimple_stmt_iterator psi;
2951 
2952   reset_chrecs_counters (&stats);
2953 
2954   FOR_EACH_VEC_ELT (gimple, *exit_conditions, i, cond)
2955     {
2956       struct loop *loop;
2957       basic_block bb;
2958       tree chrec;
2959 
2960       loop = loop_containing_stmt (cond);
2961       bb = loop->header;
2962 
2963       for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi))
2964 	{
2965 	  phi = gsi_stmt (psi);
2966 	  if (is_gimple_reg (PHI_RESULT (phi)))
2967 	    {
2968 	      chrec = instantiate_parameters
2969 		        (loop,
2970 			 analyze_scalar_evolution (loop, PHI_RESULT (phi)));
2971 
2972 	      if (dump_file && (dump_flags & TDF_STATS))
2973 		gather_chrec_stats (chrec, &stats);
2974 	    }
2975 	}
2976     }
2977 
2978   if (dump_file && (dump_flags & TDF_STATS))
2979     dump_chrecs_stats (dump_file, &stats);
2980 }
2981 
2982 /* Callback for htab_traverse, gathers information on chrecs in the
2983    hashtable.  */
2984 
2985 static int
2986 gather_stats_on_scev_database_1 (void **slot, void *stats)
2987 {
2988   struct scev_info_str *entry = (struct scev_info_str *) *slot;
2989 
2990   gather_chrec_stats (entry->chrec, (struct chrec_stats *) stats);
2991 
2992   return 1;
2993 }
2994 
2995 /* Classify the chrecs of the whole database.  */
2996 
2997 void
2998 gather_stats_on_scev_database (void)
2999 {
3000   struct chrec_stats stats;
3001 
3002   if (!dump_file)
3003     return;
3004 
3005   reset_chrecs_counters (&stats);
3006 
3007   htab_traverse (scalar_evolution_info, gather_stats_on_scev_database_1,
3008 		 &stats);
3009 
3010   dump_chrecs_stats (dump_file, &stats);
3011 }
3012 
3013 
3014 
3015 /* Initializer.  */
3016 
3017 static void
3018 initialize_scalar_evolutions_analyzer (void)
3019 {
3020   /* The elements below are unique.  */
3021   if (chrec_dont_know == NULL_TREE)
3022     {
3023       chrec_not_analyzed_yet = NULL_TREE;
3024       chrec_dont_know = make_node (SCEV_NOT_KNOWN);
3025       chrec_known = make_node (SCEV_KNOWN);
3026       TREE_TYPE (chrec_dont_know) = void_type_node;
3027       TREE_TYPE (chrec_known) = void_type_node;
3028     }
3029 }
3030 
3031 /* Initialize the analysis of scalar evolutions for LOOPS.  */
3032 
3033 void
3034 scev_initialize (void)
3035 {
3036   loop_iterator li;
3037   struct loop *loop;
3038 
3039 
3040   scalar_evolution_info = htab_create_ggc (100, hash_scev_info, eq_scev_info,
3041 					   del_scev_info);
3042 
3043   initialize_scalar_evolutions_analyzer ();
3044 
3045   FOR_EACH_LOOP (li, loop, 0)
3046     {
3047       loop->nb_iterations = NULL_TREE;
3048     }
3049 }
3050 
3051 /* Cleans up the information cached by the scalar evolutions analysis
3052    in the hash table.  */
3053 
3054 void
3055 scev_reset_htab (void)
3056 {
3057   if (!scalar_evolution_info)
3058     return;
3059 
3060   htab_empty (scalar_evolution_info);
3061 }
3062 
3063 /* Cleans up the information cached by the scalar evolutions analysis
3064    in the hash table and in the loop->nb_iterations.  */
3065 
3066 void
3067 scev_reset (void)
3068 {
3069   loop_iterator li;
3070   struct loop *loop;
3071 
3072   scev_reset_htab ();
3073 
3074   if (!current_loops)
3075     return;
3076 
3077   FOR_EACH_LOOP (li, loop, 0)
3078     {
3079       loop->nb_iterations = NULL_TREE;
3080     }
3081 }
3082 
3083 /* Checks whether use of OP in USE_LOOP behaves as a simple affine iv with
3084    respect to WRTO_LOOP and returns its base and step in IV if possible
3085    (see analyze_scalar_evolution_in_loop for more details on USE_LOOP
3086    and WRTO_LOOP).  If ALLOW_NONCONSTANT_STEP is true, we want step to be
3087    invariant in LOOP.  Otherwise we require it to be an integer constant.
3088 
3089    IV->no_overflow is set to true if we are sure the iv cannot overflow (e.g.
3090    because it is computed in signed arithmetics).  Consequently, adding an
3091    induction variable
3092 
3093    for (i = IV->base; ; i += IV->step)
3094 
3095    is only safe if IV->no_overflow is false, or TYPE_OVERFLOW_UNDEFINED is
3096    false for the type of the induction variable, or you can prove that i does
3097    not wrap by some other argument.  Otherwise, this might introduce undefined
3098    behavior, and
3099 
3100    for (i = iv->base; ; i = (type) ((unsigned type) i + (unsigned type) iv->step))
3101 
3102    must be used instead.  */
3103 
3104 bool
3105 simple_iv (struct loop *wrto_loop, struct loop *use_loop, tree op,
3106 	   affine_iv *iv, bool allow_nonconstant_step)
3107 {
3108   tree type, ev;
3109   bool folded_casts;
3110 
3111   iv->base = NULL_TREE;
3112   iv->step = NULL_TREE;
3113   iv->no_overflow = false;
3114 
3115   type = TREE_TYPE (op);
3116   if (!POINTER_TYPE_P (type)
3117       && !INTEGRAL_TYPE_P (type))
3118     return false;
3119 
3120   ev = analyze_scalar_evolution_in_loop (wrto_loop, use_loop, op,
3121 					 &folded_casts);
3122   if (chrec_contains_undetermined (ev)
3123       || chrec_contains_symbols_defined_in_loop (ev, wrto_loop->num))
3124     return false;
3125 
3126   if (tree_does_not_contain_chrecs (ev))
3127     {
3128       iv->base = ev;
3129       iv->step = build_int_cst (TREE_TYPE (ev), 0);
3130       iv->no_overflow = true;
3131       return true;
3132     }
3133 
3134   if (TREE_CODE (ev) != POLYNOMIAL_CHREC
3135       || CHREC_VARIABLE (ev) != (unsigned) wrto_loop->num)
3136     return false;
3137 
3138   iv->step = CHREC_RIGHT (ev);
3139   if ((!allow_nonconstant_step && TREE_CODE (iv->step) != INTEGER_CST)
3140       || tree_contains_chrecs (iv->step, NULL))
3141     return false;
3142 
3143   iv->base = CHREC_LEFT (ev);
3144   if (tree_contains_chrecs (iv->base, NULL))
3145     return false;
3146 
3147   iv->no_overflow = !folded_casts && TYPE_OVERFLOW_UNDEFINED (type);
3148 
3149   return true;
3150 }
3151 
3152 /* Runs the analysis of scalar evolutions.  */
3153 
3154 void
3155 scev_analysis (void)
3156 {
3157   VEC(gimple,heap) *exit_conditions;
3158 
3159   exit_conditions = VEC_alloc (gimple, heap, 37);
3160   select_loops_exit_conditions (&exit_conditions);
3161 
3162   if (dump_file && (dump_flags & TDF_STATS))
3163     analyze_scalar_evolution_for_all_loop_phi_nodes (&exit_conditions);
3164 
3165   number_of_iterations_for_all_loops (&exit_conditions);
3166   VEC_free (gimple, heap, exit_conditions);
3167 }
3168 
3169 /* Finalize the scalar evolution analysis.  */
3170 
3171 void
3172 scev_finalize (void)
3173 {
3174   if (!scalar_evolution_info)
3175     return;
3176   htab_delete (scalar_evolution_info);
3177   scalar_evolution_info = NULL;
3178 }
3179 
3180 /* Returns true if the expression EXPR is considered to be too expensive
3181    for scev_const_prop.  */
3182 
3183 bool
3184 expression_expensive_p (tree expr)
3185 {
3186   enum tree_code code;
3187 
3188   if (is_gimple_val (expr))
3189     return false;
3190 
3191   code = TREE_CODE (expr);
3192   if (code == TRUNC_DIV_EXPR
3193       || code == CEIL_DIV_EXPR
3194       || code == FLOOR_DIV_EXPR
3195       || code == ROUND_DIV_EXPR
3196       || code == TRUNC_MOD_EXPR
3197       || code == CEIL_MOD_EXPR
3198       || code == FLOOR_MOD_EXPR
3199       || code == ROUND_MOD_EXPR
3200       || code == EXACT_DIV_EXPR)
3201     {
3202       /* Division by power of two is usually cheap, so we allow it.
3203 	 Forbid anything else.  */
3204       if (!integer_pow2p (TREE_OPERAND (expr, 1)))
3205 	return true;
3206     }
3207 
3208   switch (TREE_CODE_CLASS (code))
3209     {
3210     case tcc_binary:
3211     case tcc_comparison:
3212       if (expression_expensive_p (TREE_OPERAND (expr, 1)))
3213 	return true;
3214 
3215       /* Fallthru.  */
3216     case tcc_unary:
3217       return expression_expensive_p (TREE_OPERAND (expr, 0));
3218 
3219     default:
3220       return true;
3221     }
3222 }
3223 
3224 /* Replace ssa names for that scev can prove they are constant by the
3225    appropriate constants.  Also perform final value replacement in loops,
3226    in case the replacement expressions are cheap.
3227 
3228    We only consider SSA names defined by phi nodes; rest is left to the
3229    ordinary constant propagation pass.  */
3230 
3231 unsigned int
3232 scev_const_prop (void)
3233 {
3234   basic_block bb;
3235   tree name, type, ev;
3236   gimple phi, ass;
3237   struct loop *loop, *ex_loop;
3238   bitmap ssa_names_to_remove = NULL;
3239   unsigned i;
3240   loop_iterator li;
3241   gimple_stmt_iterator psi;
3242 
3243   if (number_of_loops () <= 1)
3244     return 0;
3245 
3246   FOR_EACH_BB (bb)
3247     {
3248       loop = bb->loop_father;
3249 
3250       for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi))
3251 	{
3252 	  phi = gsi_stmt (psi);
3253 	  name = PHI_RESULT (phi);
3254 
3255 	  if (!is_gimple_reg (name))
3256 	    continue;
3257 
3258 	  type = TREE_TYPE (name);
3259 
3260 	  if (!POINTER_TYPE_P (type)
3261 	      && !INTEGRAL_TYPE_P (type))
3262 	    continue;
3263 
3264 	  ev = resolve_mixers (loop, analyze_scalar_evolution (loop, name));
3265 	  if (!is_gimple_min_invariant (ev)
3266 	      || !may_propagate_copy (name, ev))
3267 	    continue;
3268 
3269 	  /* Replace the uses of the name.  */
3270 	  if (name != ev)
3271 	    replace_uses_by (name, ev);
3272 
3273 	  if (!ssa_names_to_remove)
3274 	    ssa_names_to_remove = BITMAP_ALLOC (NULL);
3275 	  bitmap_set_bit (ssa_names_to_remove, SSA_NAME_VERSION (name));
3276 	}
3277     }
3278 
3279   /* Remove the ssa names that were replaced by constants.  We do not
3280      remove them directly in the previous cycle, since this
3281      invalidates scev cache.  */
3282   if (ssa_names_to_remove)
3283     {
3284       bitmap_iterator bi;
3285 
3286       EXECUTE_IF_SET_IN_BITMAP (ssa_names_to_remove, 0, i, bi)
3287 	{
3288 	  gimple_stmt_iterator psi;
3289 	  name = ssa_name (i);
3290 	  phi = SSA_NAME_DEF_STMT (name);
3291 
3292 	  gcc_assert (gimple_code (phi) == GIMPLE_PHI);
3293 	  psi = gsi_for_stmt (phi);
3294 	  remove_phi_node (&psi, true);
3295 	}
3296 
3297       BITMAP_FREE (ssa_names_to_remove);
3298       scev_reset ();
3299     }
3300 
3301   /* Now the regular final value replacement.  */
3302   FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
3303     {
3304       edge exit;
3305       tree def, rslt, niter;
3306       gimple_stmt_iterator bsi;
3307 
3308       /* If we do not know exact number of iterations of the loop, we cannot
3309 	 replace the final value.  */
3310       exit = single_exit (loop);
3311       if (!exit)
3312 	continue;
3313 
3314       niter = number_of_latch_executions (loop);
3315       if (niter == chrec_dont_know)
3316 	continue;
3317 
3318       /* Ensure that it is possible to insert new statements somewhere.  */
3319       if (!single_pred_p (exit->dest))
3320 	split_loop_exit_edge (exit);
3321       bsi = gsi_after_labels (exit->dest);
3322 
3323       ex_loop = superloop_at_depth (loop,
3324 				    loop_depth (exit->dest->loop_father) + 1);
3325 
3326       for (psi = gsi_start_phis (exit->dest); !gsi_end_p (psi); )
3327 	{
3328 	  phi = gsi_stmt (psi);
3329 	  rslt = PHI_RESULT (phi);
3330 	  def = PHI_ARG_DEF_FROM_EDGE (phi, exit);
3331 	  if (!is_gimple_reg (def))
3332 	    {
3333 	      gsi_next (&psi);
3334 	      continue;
3335 	    }
3336 
3337 	  if (!POINTER_TYPE_P (TREE_TYPE (def))
3338 	      && !INTEGRAL_TYPE_P (TREE_TYPE (def)))
3339 	    {
3340 	      gsi_next (&psi);
3341 	      continue;
3342 	    }
3343 
3344 	  def = analyze_scalar_evolution_in_loop (ex_loop, loop, def, NULL);
3345 	  def = compute_overall_effect_of_inner_loop (ex_loop, def);
3346 	  if (!tree_does_not_contain_chrecs (def)
3347 	      || chrec_contains_symbols_defined_in_loop (def, ex_loop->num)
3348 	      /* Moving the computation from the loop may prolong life range
3349 		 of some ssa names, which may cause problems if they appear
3350 		 on abnormal edges.  */
3351 	      || contains_abnormal_ssa_name_p (def)
3352 	      /* Do not emit expensive expressions.  The rationale is that
3353 		 when someone writes a code like
3354 
3355 		 while (n > 45) n -= 45;
3356 
3357 		 he probably knows that n is not large, and does not want it
3358 		 to be turned into n %= 45.  */
3359 	      || expression_expensive_p (def))
3360 	    {
3361 	      gsi_next (&psi);
3362 	      continue;
3363 	    }
3364 
3365 	  /* Eliminate the PHI node and replace it by a computation outside
3366 	     the loop.  */
3367 	  def = unshare_expr (def);
3368 	  remove_phi_node (&psi, false);
3369 
3370 	  def = force_gimple_operand_gsi (&bsi, def, false, NULL_TREE,
3371       					  true, GSI_SAME_STMT);
3372 	  ass = gimple_build_assign (rslt, def);
3373 	  gsi_insert_before (&bsi, ass, GSI_SAME_STMT);
3374 	}
3375     }
3376   return 0;
3377 }
3378 
3379 #include "gt-tree-scalar-evolution.h"
3380