OSDN Git Service

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