OSDN Git Service

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