OSDN Git Service

Fix linux make profiledbootstrap.
[pf3gnuchains/gcc-fork.git] / gcc / tree-scalar-evolution.c
1 /* Scalar evolution detector.
2    Copyright (C) 2003, 2004 Free Software Foundation, Inc.
3    Contributed by Sebastian Pop <s.pop@laposte.net>
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.  */
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 MODIFY_EXPR: 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 ({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 2: 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 3: Higher degree polynomials.
159      
160    | loop_1
161    |   a = phi (2, b)
162    |   c = phi (5, d)
163    |   b = a + 1
164    |   d = c + a
165    | endloop
166      
167    a -> {2, +, 1}_1
168    b -> {3, +, 1}_1
169    c -> {5, +, a}_1
170    d -> {5 + a, +, a}_1
171      
172    instantiate_parameters ({5, +, a}_1) -> {5, +, 2, +, 1}_1
173    instantiate_parameters ({5 + a, +, a}_1) -> {7, +, 3, +, 1}_1
174      
175    Example 4: Lucas, Fibonacci, or mixers in general.
176      
177    | loop_1
178    |   a = phi (1, b)
179    |   c = phi (3, d)
180    |   b = c
181    |   d = c + a
182    | endloop
183      
184    a -> (1, c)_1
185    c -> {3, +, a}_1
186      
187    The syntax "(1, c)_1" stands for a PEELED_CHREC that has the
188    following semantics: during the first iteration of the loop_1, the
189    variable contains the value 1, and then it contains the value "c".
190    Note that this syntax is close to the syntax of the loop-phi-node:
191    "a -> (1, c)_1" vs. "a = phi (1, c)".
192      
193    The symbolic chrec representation contains all the semantics of the
194    original code.  What is more difficult is to use this information.
195      
196    Example 5: Flip-flops, or exchangers.
197      
198    | loop_1
199    |   a = phi (1, b)
200    |   c = phi (3, d)
201    |   b = c
202    |   d = a
203    | endloop
204      
205    a -> (1, c)_1
206    c -> (3, a)_1
207      
208    Based on these symbolic chrecs, it is possible to refine this
209    information into the more precise PERIODIC_CHRECs: 
210      
211    a -> |1, 3|_1
212    c -> |3, 1|_1
213      
214    This transformation is not yet implemented.
215      
216    Further readings:
217    
218    You can find a more detailed description of the algorithm in:
219    http://icps.u-strasbg.fr/~pop/DEA_03_Pop.pdf
220    http://icps.u-strasbg.fr/~pop/DEA_03_Pop.ps.gz.  But note that
221    this is a preliminary report and some of the details of the
222    algorithm have changed.  I'm working on a research report that
223    updates the description of the algorithms to reflect the design
224    choices used in this implementation.
225      
226    A set of slides show a high level overview of the algorithm and run
227    an example through the scalar evolution analyzer:
228    http://cri.ensmp.fr/~pop/gcc/mar04/slides.pdf
229
230    The slides that I have presented at the GCC Summit'04 are available
231    at: http://cri.ensmp.fr/~pop/gcc/20040604/gccsummit-lno-spop.pdf
232 */
233
234 #include "config.h"
235 #include "system.h"
236 #include "coretypes.h"
237 #include "tm.h"
238 #include "errors.h"
239 #include "ggc.h"
240 #include "tree.h"
241
242 /* These RTL headers are needed for basic-block.h.  */
243 #include "rtl.h"
244 #include "basic-block.h"
245 #include "diagnostic.h"
246 #include "tree-flow.h"
247 #include "tree-dump.h"
248 #include "timevar.h"
249 #include "cfgloop.h"
250 #include "tree-chrec.h"
251 #include "tree-scalar-evolution.h"
252 #include "tree-pass.h"
253 #include "flags.h"
254
255 static tree analyze_scalar_evolution_1 (struct loop *, tree, tree);
256 static tree resolve_mixers (struct loop *, tree);
257
258 /* The cached information about a ssa name VAR, claiming that inside LOOP,
259    the value of VAR can be expressed as CHREC.  */
260
261 struct scev_info_str
262 {
263   tree var;
264   tree chrec;
265 };
266
267 /* Counters for the scev database.  */
268 static unsigned nb_set_scev = 0;
269 static unsigned nb_get_scev = 0;
270
271 /* The following trees are unique elements.  Thus the comparison of
272    another element to these elements should be done on the pointer to
273    these trees, and not on their value.  */
274
275 /* The SSA_NAMEs that are not yet analyzed are qualified with NULL_TREE.  */
276 tree chrec_not_analyzed_yet;
277
278 /* Reserved to the cases where the analyzer has detected an
279    undecidable property at compile time.  */
280 tree chrec_dont_know;
281
282 /* When the analyzer has detected that a property will never
283    happen, then it qualifies it with chrec_known.  */
284 tree chrec_known;
285
286 static bitmap already_instantiated;
287
288 static htab_t scalar_evolution_info;
289
290 \f
291 /* Constructs a new SCEV_INFO_STR structure.  */
292
293 static inline struct scev_info_str *
294 new_scev_info_str (tree var)
295 {
296   struct scev_info_str *res;
297   
298   res = xmalloc (sizeof (struct scev_info_str));
299   res->var = var;
300   res->chrec = chrec_not_analyzed_yet;
301   
302   return res;
303 }
304
305 /* Computes a hash function for database element ELT.  */
306
307 static hashval_t
308 hash_scev_info (const void *elt)
309 {
310   return SSA_NAME_VERSION (((struct scev_info_str *) elt)->var);
311 }
312
313 /* Compares database elements E1 and E2.  */
314
315 static int
316 eq_scev_info (const void *e1, const void *e2)
317 {
318   const struct scev_info_str *elt1 = e1;
319   const struct scev_info_str *elt2 = e2;
320
321   return elt1->var == elt2->var;
322 }
323
324 /* Deletes database element E.  */
325
326 static void
327 del_scev_info (void *e)
328 {
329   free (e);
330 }
331
332 /* Get the index corresponding to VAR in the current LOOP.  If
333    it's the first time we ask for this VAR, then we return
334    chrec_not_analysed_yet for this VAR and return its index.  */
335
336 static tree *
337 find_var_scev_info (tree var)
338 {
339   struct scev_info_str *res;
340   struct scev_info_str tmp;
341   PTR *slot;
342
343   tmp.var = var;
344   slot = htab_find_slot (scalar_evolution_info, &tmp, INSERT);
345
346   if (!*slot)
347     *slot = new_scev_info_str (var);
348   res = *slot;
349
350   return &res->chrec;
351 }
352
353 /* Tries to express CHREC in wider type TYPE.  */
354
355 tree
356 count_ev_in_wider_type (tree type, tree chrec)
357 {
358   tree base, step;
359   struct loop *loop;
360
361   if (!evolution_function_is_affine_p (chrec))
362     return fold_convert (type, chrec);
363
364   base = CHREC_LEFT (chrec);
365   step = CHREC_RIGHT (chrec);
366   loop = current_loops->parray[CHREC_VARIABLE (chrec)];
367
368   /* TODO -- if we knew the statement at that the conversion occurs,
369      we could pass it to can_count_iv_in_wider_type and get a better
370      result.  */
371   step = can_count_iv_in_wider_type (loop, type, base, step, NULL_TREE);
372   if (!step)
373     return fold_convert (type, chrec);
374   base = chrec_convert (type, base);
375
376   return build_polynomial_chrec (CHREC_VARIABLE (chrec),
377                                  base, step);
378 }
379
380 /* Return true when CHREC contains symbolic names defined in
381    LOOP_NB.  */
382
383 bool 
384 chrec_contains_symbols_defined_in_loop (tree chrec, unsigned loop_nb)
385 {
386   if (chrec == NULL_TREE)
387     return false;
388
389   if (TREE_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       tree def = SSA_NAME_DEF_STMT (chrec);
403       struct loop *def_loop = loop_containing_stmt (def);
404       struct loop *loop = current_loops->parray[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   switch (TREE_CODE_LENGTH (TREE_CODE (chrec)))
416     {
417     case 3:
418       if (chrec_contains_symbols_defined_in_loop (TREE_OPERAND (chrec, 2), 
419                                                   loop_nb))
420         return true;
421
422     case 2:
423       if (chrec_contains_symbols_defined_in_loop (TREE_OPERAND (chrec, 1), 
424                                                   loop_nb))
425         return true;
426
427     case 1:
428       if (chrec_contains_symbols_defined_in_loop (TREE_OPERAND (chrec, 0), 
429                                                   loop_nb))
430         return true;
431
432     default:
433       return false;
434     }
435 }
436
437 /* Return true when PHI is a loop-phi-node.  */
438
439 static bool
440 loop_phi_node_p (tree phi)
441 {
442   /* The implementation of this function is based on the following
443      property: "all the loop-phi-nodes of a loop are contained in the
444      loop's header basic block".  */
445
446   return loop_containing_stmt (phi)->header == bb_for_stmt (phi);
447 }
448
449 /* Compute the scalar evolution for EVOLUTION_FN after crossing LOOP.
450    In general, in the case of multivariate evolutions we want to get
451    the evolution in different loops.  LOOP specifies the level for
452    which to get the evolution.
453    
454    Example:
455    
456    | for (j = 0; j < 100; j++)
457    |   {
458    |     for (k = 0; k < 100; k++)
459    |       {
460    |         i = k + j;   - Here the value of i is a function of j, k. 
461    |       }
462    |      ... = i         - Here the value of i is a function of j. 
463    |   }
464    | ... = i              - Here the value of i is a scalar.  
465    
466    Example:  
467    
468    | i_0 = ...
469    | loop_1 10 times
470    |   i_1 = phi (i_0, i_2)
471    |   i_2 = i_1 + 2
472    | endloop
473     
474    This loop has the same effect as:
475    LOOP_1 has the same effect as:
476     
477    | i_1 = i_0 + 20
478    
479    The overall effect of the loop, "i_0 + 20" in the previous example, 
480    is obtained by passing in the parameters: LOOP = 1, 
481    EVOLUTION_FN = {i_0, +, 2}_1.
482 */
483  
484 static tree 
485 compute_overall_effect_of_inner_loop (struct loop *loop, tree evolution_fn)
486 {
487   bool val = false;
488
489   if (evolution_fn == chrec_dont_know)
490     return chrec_dont_know;
491
492   else if (TREE_CODE (evolution_fn) == POLYNOMIAL_CHREC)
493     {
494       if (CHREC_VARIABLE (evolution_fn) >= (unsigned) loop->num)
495         {
496           struct loop *inner_loop = 
497             current_loops->parray[CHREC_VARIABLE (evolution_fn)];
498           tree nb_iter = number_of_iterations_in_loop (inner_loop);
499
500           if (nb_iter == chrec_dont_know)
501             return chrec_dont_know;
502           else
503             {
504               tree res;
505
506               /* Number of iterations is off by one (the ssa name we
507                  analyze must be defined before the exit).  */
508               nb_iter = chrec_fold_minus (chrec_type (nb_iter),
509                                           nb_iter,
510                                           fold_convert (chrec_type (nb_iter),
511                                                         integer_one_node));
512               
513               /* evolution_fn is the evolution function in LOOP.  Get
514                  its value in the nb_iter-th iteration.  */
515               res = chrec_apply (inner_loop->num, evolution_fn, nb_iter);
516               
517               /* Continue the computation until ending on a parent of LOOP. */
518               return compute_overall_effect_of_inner_loop (loop, res);
519             }
520         }
521       else
522         return evolution_fn;
523      }
524   
525   /* If the evolution function is an invariant, there is nothing to do.  */
526   else if (no_evolution_in_loop_p (evolution_fn, loop->num, &val) && val)
527     return evolution_fn;
528   
529   else
530     return chrec_dont_know;
531 }
532
533 /* Determine whether the CHREC is always positive/negative.  If the expression
534    cannot be statically analyzed, return false, otherwise set the answer into
535    VALUE.  */
536
537 bool
538 chrec_is_positive (tree chrec, bool *value)
539 {
540   bool value0, value1;
541   bool value2;
542   tree end_value;
543   tree nb_iter;
544   
545   switch (TREE_CODE (chrec))
546     {
547     case POLYNOMIAL_CHREC:
548       if (!chrec_is_positive (CHREC_LEFT (chrec), &value0)
549           || !chrec_is_positive (CHREC_RIGHT (chrec), &value1))
550         return false;
551      
552       /* FIXME -- overflows.  */
553       if (value0 == value1)
554         {
555           *value = value0;
556           return true;
557         }
558
559       /* Otherwise the chrec is under the form: "{-197, +, 2}_1",
560          and the proof consists in showing that the sign never
561          changes during the execution of the loop, from 0 to
562          loop->nb_iterations.  */
563       if (!evolution_function_is_affine_p (chrec))
564         return false;
565
566       nb_iter = number_of_iterations_in_loop
567         (current_loops->parray[CHREC_VARIABLE (chrec)]);
568
569       if (chrec_contains_undetermined (nb_iter))
570         return false;
571
572       nb_iter = chrec_fold_minus 
573         (chrec_type (nb_iter), nb_iter,
574          fold_convert (chrec_type (nb_iter), integer_one_node));
575
576 #if 0
577       /* TODO -- If the test is after the exit, we may decrease the number of
578          iterations by one.  */
579       if (after_exit)
580         nb_iter = chrec_fold_minus 
581                 (chrec_type (nb_iter), nb_iter,
582                  fold_convert (chrec_type (nb_iter), integer_one_node));
583 #endif
584
585       end_value = chrec_apply (CHREC_VARIABLE (chrec), chrec, nb_iter);
586               
587       if (!chrec_is_positive (end_value, &value2))
588         return false;
589         
590       *value = value0;
591       return value0 == value1;
592       
593     case INTEGER_CST:
594       *value = (tree_int_cst_sgn (chrec) == 1);
595       return true;
596       
597     default:
598       return false;
599     }
600 }
601
602 /* Associate CHREC to SCALAR.  */
603
604 static void
605 set_scalar_evolution (tree scalar, tree chrec)
606 {
607   tree *scalar_info;
608  
609   if (TREE_CODE (scalar) != SSA_NAME)
610     return;
611
612   scalar_info = find_var_scev_info (scalar);
613   
614   if (dump_file)
615     {
616       if (dump_flags & TDF_DETAILS)
617         {
618           fprintf (dump_file, "(set_scalar_evolution \n");
619           fprintf (dump_file, "  (scalar = ");
620           print_generic_expr (dump_file, scalar, 0);
621           fprintf (dump_file, ")\n  (scalar_evolution = ");
622           print_generic_expr (dump_file, chrec, 0);
623           fprintf (dump_file, "))\n");
624         }
625       if (dump_flags & TDF_STATS)
626         nb_set_scev++;
627     }
628   
629   *scalar_info = chrec;
630 }
631
632 /* Retrieve the chrec associated to SCALAR in the LOOP.  */
633
634 static tree
635 get_scalar_evolution (tree scalar)
636 {
637   tree res;
638   
639   if (dump_file)
640     {
641       if (dump_flags & TDF_DETAILS)
642         {
643           fprintf (dump_file, "(get_scalar_evolution \n");
644           fprintf (dump_file, "  (scalar = ");
645           print_generic_expr (dump_file, scalar, 0);
646           fprintf (dump_file, ")\n");
647         }
648       if (dump_flags & TDF_STATS)
649         nb_get_scev++;
650     }
651   
652   switch (TREE_CODE (scalar))
653     {
654     case SSA_NAME:
655       res = *find_var_scev_info (scalar);
656       break;
657
658     case REAL_CST:
659     case INTEGER_CST:
660       res = scalar;
661       break;
662
663     default:
664       res = chrec_not_analyzed_yet;
665       break;
666     }
667   
668   if (dump_file && (dump_flags & TDF_DETAILS))
669     {
670       fprintf (dump_file, "  (scalar_evolution = ");
671       print_generic_expr (dump_file, res, 0);
672       fprintf (dump_file, "))\n");
673     }
674   
675   return res;
676 }
677
678 /* Helper function for add_to_evolution.  Returns the evolution
679    function for an assignment of the form "a = b + c", where "a" and
680    "b" are on the strongly connected component.  CHREC_BEFORE is the
681    information that we already have collected up to this point.
682    TO_ADD is the evolution of "c".  
683    
684    When CHREC_BEFORE has an evolution part in LOOP_NB, add to this
685    evolution the expression TO_ADD, otherwise construct an evolution
686    part for this loop.  */
687
688 static tree
689 add_to_evolution_1 (unsigned loop_nb, 
690                     tree chrec_before, 
691                     tree to_add)
692 {
693   switch (TREE_CODE (chrec_before))
694     {
695     case POLYNOMIAL_CHREC:
696       if (CHREC_VARIABLE (chrec_before) <= loop_nb)
697         {
698           unsigned var;
699           tree left, right;
700           tree type = chrec_type (chrec_before);
701           
702           /* When there is no evolution part in this loop, build it.  */
703           if (CHREC_VARIABLE (chrec_before) < loop_nb)
704             {
705               var = loop_nb;
706               left = chrec_before;
707               right = fold_convert (type, integer_zero_node);
708             }
709           else
710             {
711               var = CHREC_VARIABLE (chrec_before);
712               left = CHREC_LEFT (chrec_before);
713               right = CHREC_RIGHT (chrec_before);
714             }
715
716           return build_polynomial_chrec 
717             (var, left, chrec_fold_plus (type, right, to_add));
718         }
719       else
720         /* Search the evolution in LOOP_NB.  */
721         return build_polynomial_chrec 
722           (CHREC_VARIABLE (chrec_before),
723            add_to_evolution_1 (loop_nb, CHREC_LEFT (chrec_before), to_add),
724            CHREC_RIGHT (chrec_before));
725       
726     default:
727       /* These nodes do not depend on a loop.  */
728       if (chrec_before == chrec_dont_know)
729         return chrec_dont_know;
730       return build_polynomial_chrec (loop_nb, chrec_before, to_add);
731     }
732 }
733
734 /* Add TO_ADD to the evolution part of CHREC_BEFORE in the dimension
735    of LOOP_NB.  
736    
737    Description (provided for completeness, for those who read code in
738    a plane, and for my poor 62 bytes brain that would have forgotten
739    all this in the next two or three months):
740    
741    The algorithm of translation of programs from the SSA representation
742    into the chrecs syntax is based on a pattern matching.  After having
743    reconstructed the overall tree expression for a loop, there are only
744    two cases that can arise:
745    
746    1. a = loop-phi (init, a + expr)
747    2. a = loop-phi (init, expr)
748    
749    where EXPR is either a scalar constant with respect to the analyzed
750    loop (this is a degree 0 polynomial), or an expression containing
751    other loop-phi definitions (these are higher degree polynomials).
752    
753    Examples:
754    
755    1. 
756    | init = ...
757    | loop_1
758    |   a = phi (init, a + 5)
759    | endloop
760    
761    2. 
762    | inita = ...
763    | initb = ...
764    | loop_1
765    |   a = phi (inita, 2 * b + 3)
766    |   b = phi (initb, b + 1)
767    | endloop
768    
769    For the first case, the semantics of the SSA representation is: 
770    
771    | a (x) = init + \sum_{j = 0}^{x - 1} expr (j)
772    
773    that is, there is a loop index "x" that determines the scalar value
774    of the variable during the loop execution.  During the first
775    iteration, the value is that of the initial condition INIT, while
776    during the subsequent iterations, it is the sum of the initial
777    condition with the sum of all the values of EXPR from the initial
778    iteration to the before last considered iteration.  
779    
780    For the second case, the semantics of the SSA program is:
781    
782    | a (x) = init, if x = 0;
783    |         expr (x - 1), otherwise.
784    
785    The second case corresponds to the PEELED_CHREC, whose syntax is
786    close to the syntax of a loop-phi-node: 
787    
788    | phi (init, expr)  vs.  (init, expr)_x
789    
790    The proof of the translation algorithm for the first case is a
791    proof by structural induction based on the degree of EXPR.  
792    
793    Degree 0:
794    When EXPR is a constant with respect to the analyzed loop, or in
795    other words when EXPR is a polynomial of degree 0, the evolution of
796    the variable A in the loop is an affine function with an initial
797    condition INIT, and a step EXPR.  In order to show this, we start
798    from the semantics of the SSA representation:
799    
800    f (x) = init + \sum_{j = 0}^{x - 1} expr (j)
801    
802    and since "expr (j)" is a constant with respect to "j",
803    
804    f (x) = init + x * expr 
805    
806    Finally, based on the semantics of the pure sum chrecs, by
807    identification we get the corresponding chrecs syntax:
808    
809    f (x) = init * \binom{x}{0} + expr * \binom{x}{1} 
810    f (x) -> {init, +, expr}_x
811    
812    Higher degree:
813    Suppose that EXPR is a polynomial of degree N with respect to the
814    analyzed loop_x for which we have already determined that it is
815    written under the chrecs syntax:
816    
817    | expr (x)  ->  {b_0, +, b_1, +, ..., +, b_{n-1}} (x)
818    
819    We start from the semantics of the SSA program:
820    
821    | f (x) = init + \sum_{j = 0}^{x - 1} expr (j)
822    |
823    | f (x) = init + \sum_{j = 0}^{x - 1} 
824    |                (b_0 * \binom{j}{0} + ... + b_{n-1} * \binom{j}{n-1})
825    |
826    | f (x) = init + \sum_{j = 0}^{x - 1} 
827    |                \sum_{k = 0}^{n - 1} (b_k * \binom{j}{k}) 
828    |
829    | f (x) = init + \sum_{k = 0}^{n - 1} 
830    |                (b_k * \sum_{j = 0}^{x - 1} \binom{j}{k}) 
831    |
832    | f (x) = init + \sum_{k = 0}^{n - 1} 
833    |                (b_k * \binom{x}{k + 1}) 
834    |
835    | f (x) = init + b_0 * \binom{x}{1} + ... 
836    |              + b_{n-1} * \binom{x}{n} 
837    |
838    | f (x) = init * \binom{x}{0} + b_0 * \binom{x}{1} + ... 
839    |                             + b_{n-1} * \binom{x}{n} 
840    |
841    
842    And finally from the definition of the chrecs syntax, we identify:
843    | f (x)  ->  {init, +, b_0, +, ..., +, b_{n-1}}_x 
844    
845    This shows the mechanism that stands behind the add_to_evolution
846    function.  An important point is that the use of symbolic
847    parameters avoids the need of an analysis schedule.
848    
849    Example:
850    
851    | inita = ...
852    | initb = ...
853    | loop_1 
854    |   a = phi (inita, a + 2 + b)
855    |   b = phi (initb, b + 1)
856    | endloop
857    
858    When analyzing "a", the algorithm keeps "b" symbolically:
859    
860    | a  ->  {inita, +, 2 + b}_1
861    
862    Then, after instantiation, the analyzer ends on the evolution:
863    
864    | a  ->  {inita, +, 2 + initb, +, 1}_1
865
866 */
867
868 static tree 
869 add_to_evolution (unsigned loop_nb, 
870                   tree chrec_before,
871                   enum tree_code code,
872                   tree to_add)
873 {
874   tree type = chrec_type (to_add);
875   tree res = NULL_TREE;
876   
877   if (to_add == NULL_TREE)
878     return chrec_before;
879   
880   /* TO_ADD is either a scalar, or a parameter.  TO_ADD is not
881      instantiated at this point.  */
882   if (TREE_CODE (to_add) == POLYNOMIAL_CHREC)
883     /* This should not happen.  */
884     return chrec_dont_know;
885   
886   if (dump_file && (dump_flags & TDF_DETAILS))
887     {
888       fprintf (dump_file, "(add_to_evolution \n");
889       fprintf (dump_file, "  (loop_nb = %d)\n", loop_nb);
890       fprintf (dump_file, "  (chrec_before = ");
891       print_generic_expr (dump_file, chrec_before, 0);
892       fprintf (dump_file, ")\n  (to_add = ");
893       print_generic_expr (dump_file, to_add, 0);
894       fprintf (dump_file, ")\n");
895     }
896
897   if (code == MINUS_EXPR)
898     to_add = chrec_fold_multiply (type, to_add, 
899                                   fold_convert (type, integer_minus_one_node));
900
901   res = add_to_evolution_1 (loop_nb, chrec_before, to_add);
902
903   if (dump_file && (dump_flags & TDF_DETAILS))
904     {
905       fprintf (dump_file, "  (res = ");
906       print_generic_expr (dump_file, res, 0);
907       fprintf (dump_file, "))\n");
908     }
909
910   return res;
911 }
912
913 /* Helper function.  */
914
915 static inline tree
916 set_nb_iterations_in_loop (struct loop *loop, 
917                            tree res)
918 {
919   res = chrec_fold_plus (chrec_type (res), res, integer_one_node);
920   /* FIXME HWI: However we want to store one iteration less than the
921      count of the loop in order to be compatible with the other
922      nb_iter computations in loop-iv.  This also allows the
923      representation of nb_iters that are equal to MAX_INT.  */
924   if ((TREE_CODE (res) == INTEGER_CST && TREE_INT_CST_LOW (res) == 0)
925       || TREE_OVERFLOW (res))
926     res = chrec_dont_know;
927   
928   if (dump_file && (dump_flags & TDF_DETAILS))
929     {
930       fprintf (dump_file, "  (set_nb_iterations_in_loop = ");
931       print_generic_expr (dump_file, res, 0);
932       fprintf (dump_file, "))\n");
933     }
934   
935   loop->nb_iterations = res;
936   return res;
937 }
938
939 \f
940
941 /* This section selects the loops that will be good candidates for the
942    scalar evolution analysis.  For the moment, greedily select all the
943    loop nests we could analyze.  */
944
945 /* Return true when it is possible to analyze the condition expression
946    EXPR.  */
947
948 static bool
949 analyzable_condition (tree expr)
950 {
951   tree condition;
952   
953   if (TREE_CODE (expr) != COND_EXPR)
954     return false;
955   
956   condition = TREE_OPERAND (expr, 0);
957   
958   switch (TREE_CODE (condition))
959     {
960     case SSA_NAME:
961       /* Volatile expressions are not analyzable.  */
962       if (TREE_THIS_VOLATILE (SSA_NAME_VAR (condition)))
963         return false;
964       return true;
965       
966     case LT_EXPR:
967     case LE_EXPR:
968     case GT_EXPR:
969     case GE_EXPR:
970     case EQ_EXPR:
971     case NE_EXPR:
972       {
973         tree opnd0, opnd1;
974         
975         opnd0 = TREE_OPERAND (condition, 0);
976         opnd1 = TREE_OPERAND (condition, 1);
977         
978         if (TREE_CODE (opnd0) == SSA_NAME
979             && TREE_THIS_VOLATILE (SSA_NAME_VAR (opnd0)))
980           return false;
981         
982         if (TREE_CODE (opnd1) == SSA_NAME
983             && TREE_THIS_VOLATILE (SSA_NAME_VAR (opnd1)))
984           return false;
985         
986         return true;
987       }
988       
989     default:
990       return false;
991     }
992   
993   return false;
994 }
995
996 /* For a loop with a single exit edge, return the COND_EXPR that
997    guards the exit edge.  If the expression is too difficult to
998    analyze, then give up.  */
999
1000 tree 
1001 get_loop_exit_condition (struct loop *loop)
1002 {
1003   tree res = NULL_TREE;
1004   edge exit_edge = loop->single_exit;
1005
1006   
1007   if (dump_file && (dump_flags & TDF_DETAILS))
1008     fprintf (dump_file, "(get_loop_exit_condition \n  ");
1009   
1010   if (exit_edge)
1011     {
1012       tree expr;
1013       
1014       expr = last_stmt (exit_edge->src);
1015       if (analyzable_condition (expr))
1016         res = expr;
1017     }
1018   
1019   if (dump_file && (dump_flags & TDF_DETAILS))
1020     {
1021       print_generic_expr (dump_file, res, 0);
1022       fprintf (dump_file, ")\n");
1023     }
1024   
1025   return res;
1026 }
1027
1028 /* Recursively determine and enqueue the exit conditions for a loop.  */
1029
1030 static void 
1031 get_exit_conditions_rec (struct loop *loop, 
1032                          varray_type *exit_conditions)
1033 {
1034   if (!loop)
1035     return;
1036   
1037   /* Recurse on the inner loops, then on the next (sibling) loops.  */
1038   get_exit_conditions_rec (loop->inner, exit_conditions);
1039   get_exit_conditions_rec (loop->next, exit_conditions);
1040   
1041   if (loop->single_exit)
1042     {
1043       tree loop_condition = get_loop_exit_condition (loop);
1044       
1045       if (loop_condition)
1046         VARRAY_PUSH_TREE (*exit_conditions, loop_condition);
1047     }
1048 }
1049
1050 /* Select the candidate loop nests for the analysis.  This function
1051    initializes the EXIT_CONDITIONS array.   */
1052
1053 static void
1054 select_loops_exit_conditions (struct loops *loops, 
1055                               varray_type *exit_conditions)
1056 {
1057   struct loop *function_body = loops->parray[0];
1058   
1059   get_exit_conditions_rec (function_body->inner, exit_conditions);
1060 }
1061
1062 \f
1063 /* Depth first search algorithm.  */
1064
1065 static bool follow_ssa_edge (struct loop *loop, tree, tree, tree *);
1066
1067 /* Follow the ssa edge into the right hand side RHS of an assignment.
1068    Return true if the strongly connected component has been found.  */
1069
1070 static bool
1071 follow_ssa_edge_in_rhs (struct loop *loop,
1072                         tree rhs, 
1073                         tree halting_phi, 
1074                         tree *evolution_of_loop)
1075 {
1076   bool res = false;
1077   tree rhs0, rhs1;
1078   tree type_rhs = TREE_TYPE (rhs);
1079   
1080   /* The RHS is one of the following cases:
1081      - an SSA_NAME, 
1082      - an INTEGER_CST,
1083      - a PLUS_EXPR, 
1084      - a MINUS_EXPR,
1085      - other cases are not yet handled. 
1086   */
1087   switch (TREE_CODE (rhs))
1088     {
1089     case NOP_EXPR:
1090       /* This assignment is under the form "a_1 = (cast) rhs.  */
1091       res = follow_ssa_edge_in_rhs (loop, TREE_OPERAND (rhs, 0), halting_phi, 
1092                                     evolution_of_loop);
1093       *evolution_of_loop = chrec_convert (TREE_TYPE (rhs), *evolution_of_loop);
1094       break;
1095
1096     case INTEGER_CST:
1097       /* This assignment is under the form "a_1 = 7".  */
1098       res = false;
1099       break;
1100       
1101     case SSA_NAME:
1102       /* This assignment is under the form: "a_1 = b_2".  */
1103       res = follow_ssa_edge 
1104         (loop, SSA_NAME_DEF_STMT (rhs), halting_phi, evolution_of_loop);
1105       break;
1106       
1107     case PLUS_EXPR:
1108       /* This case is under the form "rhs0 + rhs1".  */
1109       rhs0 = TREE_OPERAND (rhs, 0);
1110       rhs1 = TREE_OPERAND (rhs, 1);
1111       STRIP_TYPE_NOPS (rhs0);
1112       STRIP_TYPE_NOPS (rhs1);
1113
1114       if (TREE_CODE (rhs0) == SSA_NAME)
1115         {
1116           if (TREE_CODE (rhs1) == SSA_NAME)
1117             {
1118               /* Match an assignment under the form: 
1119                  "a = b + c".  */
1120               res = follow_ssa_edge 
1121                 (loop, SSA_NAME_DEF_STMT (rhs0), halting_phi, 
1122                  evolution_of_loop);
1123               
1124               if (res)
1125                 *evolution_of_loop = add_to_evolution 
1126                   (loop->num, 
1127                    chrec_convert (type_rhs, *evolution_of_loop), 
1128                    PLUS_EXPR, rhs1);
1129               
1130               else
1131                 {
1132                   res = follow_ssa_edge 
1133                     (loop, SSA_NAME_DEF_STMT (rhs1), halting_phi, 
1134                      evolution_of_loop);
1135                   
1136                   if (res)
1137                     *evolution_of_loop = add_to_evolution 
1138                       (loop->num, 
1139                        chrec_convert (type_rhs, *evolution_of_loop), 
1140                        PLUS_EXPR, rhs0);
1141                 }
1142             }
1143           
1144           else
1145             {
1146               /* Match an assignment under the form: 
1147                  "a = b + ...".  */
1148               res = follow_ssa_edge 
1149                 (loop, SSA_NAME_DEF_STMT (rhs0), halting_phi, 
1150                  evolution_of_loop);
1151               if (res)
1152                 *evolution_of_loop = add_to_evolution 
1153                   (loop->num, chrec_convert (type_rhs, *evolution_of_loop), 
1154                    PLUS_EXPR, rhs1);
1155             }
1156         }
1157       
1158       else if (TREE_CODE (rhs1) == SSA_NAME)
1159         {
1160           /* Match an assignment under the form: 
1161              "a = ... + c".  */
1162           res = follow_ssa_edge 
1163             (loop, SSA_NAME_DEF_STMT (rhs1), halting_phi, 
1164              evolution_of_loop);
1165           if (res)
1166             *evolution_of_loop = add_to_evolution 
1167               (loop->num, chrec_convert (type_rhs, *evolution_of_loop), 
1168                PLUS_EXPR, rhs0);
1169         }
1170
1171       else
1172         /* Otherwise, match an assignment under the form: 
1173            "a = ... + ...".  */
1174         /* And there is nothing to do.  */
1175         res = false;
1176       
1177       break;
1178       
1179     case MINUS_EXPR:
1180       /* This case is under the form "opnd0 = rhs0 - rhs1".  */
1181       rhs0 = TREE_OPERAND (rhs, 0);
1182       rhs1 = TREE_OPERAND (rhs, 1);
1183       STRIP_TYPE_NOPS (rhs0);
1184       STRIP_TYPE_NOPS (rhs1);
1185
1186       if (TREE_CODE (rhs0) == SSA_NAME)
1187         {
1188           if (TREE_CODE (rhs1) == SSA_NAME)
1189             {
1190               /* Match an assignment under the form: 
1191                  "a = b - c".  */
1192               res = follow_ssa_edge 
1193                 (loop, SSA_NAME_DEF_STMT (rhs0), halting_phi, 
1194                  evolution_of_loop);
1195               
1196               if (res)
1197                 *evolution_of_loop = add_to_evolution 
1198                   (loop->num, chrec_convert (type_rhs, *evolution_of_loop), 
1199                    MINUS_EXPR, rhs1);
1200               
1201               else
1202                 {
1203                   res = follow_ssa_edge 
1204                     (loop, SSA_NAME_DEF_STMT (rhs1), halting_phi, 
1205                      evolution_of_loop);
1206                   
1207                   if (res)
1208                     *evolution_of_loop = add_to_evolution 
1209                       (loop->num, 
1210                        chrec_fold_multiply (type_rhs, 
1211                                             *evolution_of_loop, 
1212                                             fold_convert (type_rhs,
1213                                                           integer_minus_one_node)),
1214                        PLUS_EXPR, rhs0);
1215                 }
1216             }
1217           
1218           else
1219             {
1220               /* Match an assignment under the form: 
1221                  "a = b - ...".  */
1222               res = follow_ssa_edge 
1223                 (loop, SSA_NAME_DEF_STMT (rhs0), halting_phi, 
1224                  evolution_of_loop);
1225               if (res)
1226                 *evolution_of_loop = add_to_evolution 
1227                   (loop->num, chrec_convert (type_rhs, *evolution_of_loop), 
1228                    MINUS_EXPR, rhs1);
1229             }
1230         }
1231       
1232       else if (TREE_CODE (rhs1) == SSA_NAME)
1233         {
1234           /* Match an assignment under the form: 
1235              "a = ... - c".  */
1236           res = follow_ssa_edge 
1237             (loop, SSA_NAME_DEF_STMT (rhs1), halting_phi, 
1238              evolution_of_loop);
1239           if (res)
1240             *evolution_of_loop = add_to_evolution 
1241               (loop->num, 
1242                chrec_fold_multiply (type_rhs, 
1243                                     *evolution_of_loop, 
1244                                     fold_convert (type_rhs, integer_minus_one_node)),
1245                PLUS_EXPR, rhs0);
1246         }
1247       
1248       else
1249         /* Otherwise, match an assignment under the form: 
1250            "a = ... - ...".  */
1251         /* And there is nothing to do.  */
1252         res = false;
1253       
1254       break;
1255     
1256     case MULT_EXPR:
1257       /* This case is under the form "opnd0 = rhs0 * rhs1".  */
1258       rhs0 = TREE_OPERAND (rhs, 0);
1259       rhs1 = TREE_OPERAND (rhs, 1);
1260       STRIP_TYPE_NOPS (rhs0);
1261       STRIP_TYPE_NOPS (rhs1);
1262
1263       if (TREE_CODE (rhs0) == SSA_NAME)
1264         {
1265           if (TREE_CODE (rhs1) == SSA_NAME)
1266             {
1267               /* Match an assignment under the form: 
1268                  "a = b * c".  */
1269               res = follow_ssa_edge 
1270                 (loop, SSA_NAME_DEF_STMT (rhs0), halting_phi, 
1271                  evolution_of_loop);
1272               
1273               if (res)
1274                 *evolution_of_loop = chrec_dont_know;
1275               
1276               else
1277                 {
1278                   res = follow_ssa_edge 
1279                     (loop, SSA_NAME_DEF_STMT (rhs1), halting_phi, 
1280                      evolution_of_loop);
1281                   
1282                   if (res)
1283                     *evolution_of_loop = chrec_dont_know;
1284                 }
1285             }
1286           
1287           else
1288             {
1289               /* Match an assignment under the form: 
1290                  "a = b * ...".  */
1291               res = follow_ssa_edge 
1292                 (loop, SSA_NAME_DEF_STMT (rhs0), halting_phi, 
1293                  evolution_of_loop);
1294               if (res)
1295                 *evolution_of_loop = chrec_dont_know;
1296             }
1297         }
1298       
1299       else if (TREE_CODE (rhs1) == SSA_NAME)
1300         {
1301           /* Match an assignment under the form: 
1302              "a = ... * c".  */
1303           res = follow_ssa_edge 
1304             (loop, SSA_NAME_DEF_STMT (rhs1), halting_phi, 
1305              evolution_of_loop);
1306           if (res)
1307             *evolution_of_loop = chrec_dont_know;
1308         }
1309       
1310       else
1311         /* Otherwise, match an assignment under the form: 
1312            "a = ... * ...".  */
1313         /* And there is nothing to do.  */
1314         res = false;
1315       
1316       break;
1317
1318     default:
1319       res = false;
1320       break;
1321     }
1322   
1323   return res;
1324 }
1325
1326 /* Checks whether the I-th argument of a PHI comes from a backedge.  */
1327
1328 static bool
1329 backedge_phi_arg_p (tree phi, int i)
1330 {
1331   edge e = PHI_ARG_EDGE (phi, i);
1332
1333   /* We would in fact like to test EDGE_DFS_BACK here, but we do not care
1334      about updating it anywhere, and this should work as well most of the
1335      time.  */
1336   if (e->flags & EDGE_IRREDUCIBLE_LOOP)
1337     return true;
1338
1339   return false;
1340 }
1341
1342 /* Helper function for one branch of the condition-phi-node.  Return
1343    true if the strongly connected component has been found following
1344    this path.  */
1345
1346 static inline bool
1347 follow_ssa_edge_in_condition_phi_branch (int i,
1348                                          struct loop *loop, 
1349                                          tree condition_phi, 
1350                                          tree halting_phi,
1351                                          tree *evolution_of_branch,
1352                                          tree init_cond)
1353 {
1354   tree branch = PHI_ARG_DEF (condition_phi, i);
1355   *evolution_of_branch = chrec_dont_know;
1356
1357   /* Do not follow back edges (they must belong to an irreducible loop, which
1358      we really do not want to worry about).  */
1359   if (backedge_phi_arg_p (condition_phi, i))
1360     return false;
1361
1362   if (TREE_CODE (branch) == SSA_NAME)
1363     {
1364       *evolution_of_branch = init_cond;
1365       return follow_ssa_edge (loop, SSA_NAME_DEF_STMT (branch), halting_phi, 
1366                               evolution_of_branch);
1367     }
1368
1369   /* This case occurs when one of the condition branches sets 
1370      the variable to a constant: ie. a phi-node like
1371      "a_2 = PHI <a_7(5), 2(6)>;".  
1372          
1373      FIXME:  This case have to be refined correctly: 
1374      in some cases it is possible to say something better than
1375      chrec_dont_know, for example using a wrap-around notation.  */
1376   return false;
1377 }
1378
1379 /* This function merges the branches of a condition-phi-node in a
1380    loop.  */
1381
1382 static bool
1383 follow_ssa_edge_in_condition_phi (struct loop *loop,
1384                                   tree condition_phi, 
1385                                   tree halting_phi, 
1386                                   tree *evolution_of_loop)
1387 {
1388   int i;
1389   tree init = *evolution_of_loop;
1390   tree evolution_of_branch;
1391
1392   if (!follow_ssa_edge_in_condition_phi_branch (0, loop, condition_phi,
1393                                                 halting_phi,
1394                                                 &evolution_of_branch,
1395                                                 init))
1396     return false;
1397   *evolution_of_loop = evolution_of_branch;
1398
1399   for (i = 1; i < PHI_NUM_ARGS (condition_phi); i++)
1400     {
1401       if (!follow_ssa_edge_in_condition_phi_branch (i, loop, condition_phi,
1402                                                     halting_phi,
1403                                                     &evolution_of_branch,
1404                                                     init))
1405         return false;
1406
1407       *evolution_of_loop = chrec_merge (*evolution_of_loop,
1408                                         evolution_of_branch);
1409     }
1410   
1411   return true;
1412 }
1413
1414 /* Follow an SSA edge in an inner loop.  It computes the overall
1415    effect of the loop, and following the symbolic initial conditions,
1416    it follows the edges in the parent loop.  The inner loop is
1417    considered as a single statement.  */
1418
1419 static bool
1420 follow_ssa_edge_inner_loop_phi (struct loop *outer_loop,
1421                                 tree loop_phi_node, 
1422                                 tree halting_phi,
1423                                 tree *evolution_of_loop)
1424 {
1425   struct loop *loop = loop_containing_stmt (loop_phi_node);
1426   tree ev = analyze_scalar_evolution (loop, PHI_RESULT (loop_phi_node));
1427
1428   /* Sometimes, the inner loop is too difficult to analyze, and the
1429      result of the analysis is a symbolic parameter.  */
1430   if (ev == PHI_RESULT (loop_phi_node))
1431     {
1432       bool res = false;
1433       int i;
1434
1435       for (i = 0; i < PHI_NUM_ARGS (loop_phi_node); i++)
1436         {
1437           tree arg = PHI_ARG_DEF (loop_phi_node, i);
1438           basic_block bb;
1439
1440           /* Follow the edges that exit the inner loop.  */
1441           bb = PHI_ARG_EDGE (loop_phi_node, i)->src;
1442           if (!flow_bb_inside_loop_p (loop, bb))
1443             res = res || follow_ssa_edge_in_rhs (outer_loop, arg, halting_phi,
1444                                                  evolution_of_loop);
1445         }
1446
1447       /* If the path crosses this loop-phi, give up.  */
1448       if (res == true)
1449         *evolution_of_loop = chrec_dont_know;
1450
1451       return res;
1452     }
1453
1454   /* Otherwise, compute the overall effect of the inner loop.  */
1455   ev = compute_overall_effect_of_inner_loop (loop, ev);
1456   return follow_ssa_edge_in_rhs (outer_loop, ev, halting_phi,
1457                                  evolution_of_loop);
1458 }
1459
1460 /* Follow an SSA edge from a loop-phi-node to itself, constructing a
1461    path that is analyzed on the return walk.  */
1462
1463 static bool
1464 follow_ssa_edge (struct loop *loop, 
1465                  tree def, 
1466                  tree halting_phi,
1467                  tree *evolution_of_loop)
1468 {
1469   struct loop *def_loop;
1470   
1471   if (TREE_CODE (def) == NOP_EXPR)
1472     return false;
1473   
1474   def_loop = loop_containing_stmt (def);
1475   
1476   switch (TREE_CODE (def))
1477     {
1478     case PHI_NODE:
1479       if (!loop_phi_node_p (def))
1480         /* DEF is a condition-phi-node.  Follow the branches, and
1481            record their evolutions.  Finally, merge the collected
1482            information and set the approximation to the main
1483            variable.  */
1484         return follow_ssa_edge_in_condition_phi 
1485           (loop, def, halting_phi, evolution_of_loop);
1486
1487       /* When the analyzed phi is the halting_phi, the
1488          depth-first search is over: we have found a path from
1489          the halting_phi to itself in the loop.  */
1490       if (def == halting_phi)
1491         return true;
1492           
1493       /* Otherwise, the evolution of the HALTING_PHI depends
1494          on the evolution of another loop-phi-node, ie. the
1495          evolution function is a higher degree polynomial.  */
1496       if (def_loop == loop)
1497         return false;
1498           
1499       /* Inner loop.  */
1500       if (flow_loop_nested_p (loop, def_loop))
1501         return follow_ssa_edge_inner_loop_phi 
1502           (loop, def, halting_phi, evolution_of_loop);
1503
1504       /* Outer loop.  */
1505       return false;
1506
1507     case MODIFY_EXPR:
1508       return follow_ssa_edge_in_rhs (loop,
1509                                      TREE_OPERAND (def, 1), 
1510                                      halting_phi, 
1511                                      evolution_of_loop);
1512       
1513     default:
1514       /* At this level of abstraction, the program is just a set
1515          of MODIFY_EXPRs and PHI_NODEs.  In principle there is no
1516          other node to be handled.  */
1517       return false;
1518     }
1519 }
1520
1521 \f
1522
1523 /* Given a LOOP_PHI_NODE, this function determines the evolution
1524    function from LOOP_PHI_NODE to LOOP_PHI_NODE in the loop.  */
1525
1526 static tree
1527 analyze_evolution_in_loop (tree loop_phi_node, 
1528                            tree init_cond)
1529 {
1530   int i;
1531   tree evolution_function = chrec_not_analyzed_yet;
1532   struct loop *loop = loop_containing_stmt (loop_phi_node);
1533   basic_block bb;
1534   
1535   if (dump_file && (dump_flags & TDF_DETAILS))
1536     {
1537       fprintf (dump_file, "(analyze_evolution_in_loop \n");
1538       fprintf (dump_file, "  (loop_phi_node = ");
1539       print_generic_expr (dump_file, loop_phi_node, 0);
1540       fprintf (dump_file, ")\n");
1541     }
1542   
1543   for (i = 0; i < PHI_NUM_ARGS (loop_phi_node); i++)
1544     {
1545       tree arg = PHI_ARG_DEF (loop_phi_node, i);
1546       tree ssa_chain, ev_fn;
1547       bool res;
1548
1549       /* Select the edges that enter the loop body.  */
1550       bb = PHI_ARG_EDGE (loop_phi_node, i)->src;
1551       if (!flow_bb_inside_loop_p (loop, bb))
1552         continue;
1553       
1554       if (TREE_CODE (arg) == SSA_NAME)
1555         {
1556           ssa_chain = SSA_NAME_DEF_STMT (arg);
1557
1558           /* Pass in the initial condition to the follow edge function.  */
1559           ev_fn = init_cond;
1560           res = follow_ssa_edge (loop, ssa_chain, loop_phi_node, &ev_fn);
1561         }
1562       else
1563         res = false;
1564               
1565       /* When it is impossible to go back on the same
1566          loop_phi_node by following the ssa edges, the
1567          evolution is represented by a peeled chrec, ie. the
1568          first iteration, EV_FN has the value INIT_COND, then
1569          all the other iterations it has the value of ARG.  
1570          For the moment, PEELED_CHREC nodes are not built.  */
1571       if (!res)
1572         ev_fn = chrec_dont_know;
1573       
1574       /* When there are multiple back edges of the loop (which in fact never
1575          happens currently, but nevertheless), merge their evolutions. */
1576       evolution_function = chrec_merge (evolution_function, ev_fn);
1577     }
1578   
1579   if (dump_file && (dump_flags & TDF_DETAILS))
1580     {
1581       fprintf (dump_file, "  (evolution_function = ");
1582       print_generic_expr (dump_file, evolution_function, 0);
1583       fprintf (dump_file, "))\n");
1584     }
1585   
1586   return evolution_function;
1587 }
1588
1589 /* Given a loop-phi-node, return the initial conditions of the
1590    variable on entry of the loop.  When the CCP has propagated
1591    constants into the loop-phi-node, the initial condition is
1592    instantiated, otherwise the initial condition is kept symbolic.
1593    This analyzer does not analyze the evolution outside the current
1594    loop, and leaves this task to the on-demand tree reconstructor.  */
1595
1596 static tree 
1597 analyze_initial_condition (tree loop_phi_node)
1598 {
1599   int i;
1600   tree init_cond = chrec_not_analyzed_yet;
1601   struct loop *loop = bb_for_stmt (loop_phi_node)->loop_father;
1602   
1603   if (dump_file && (dump_flags & TDF_DETAILS))
1604     {
1605       fprintf (dump_file, "(analyze_initial_condition \n");
1606       fprintf (dump_file, "  (loop_phi_node = \n");
1607       print_generic_expr (dump_file, loop_phi_node, 0);
1608       fprintf (dump_file, ")\n");
1609     }
1610   
1611   for (i = 0; i < PHI_NUM_ARGS (loop_phi_node); i++)
1612     {
1613       tree branch = PHI_ARG_DEF (loop_phi_node, i);
1614       basic_block bb = PHI_ARG_EDGE (loop_phi_node, i)->src;
1615       
1616       /* When the branch is oriented to the loop's body, it does
1617          not contribute to the initial condition.  */
1618       if (flow_bb_inside_loop_p (loop, bb))
1619         continue;
1620
1621       if (init_cond == chrec_not_analyzed_yet)
1622         {
1623           init_cond = branch;
1624           continue;
1625         }
1626
1627       if (TREE_CODE (branch) == SSA_NAME)
1628         {
1629           init_cond = chrec_dont_know;
1630           break;
1631         }
1632
1633       init_cond = chrec_merge (init_cond, branch);
1634     }
1635
1636   /* Ooops -- a loop without an entry???  */
1637   if (init_cond == chrec_not_analyzed_yet)
1638     init_cond = chrec_dont_know;
1639
1640   if (dump_file && (dump_flags & TDF_DETAILS))
1641     {
1642       fprintf (dump_file, "  (init_cond = ");
1643       print_generic_expr (dump_file, init_cond, 0);
1644       fprintf (dump_file, "))\n");
1645     }
1646   
1647   return init_cond;
1648 }
1649
1650 /* Analyze the scalar evolution for LOOP_PHI_NODE.  */
1651
1652 static tree 
1653 interpret_loop_phi (struct loop *loop, tree loop_phi_node)
1654 {
1655   tree res;
1656   struct loop *phi_loop = loop_containing_stmt (loop_phi_node);
1657   tree init_cond;
1658   
1659   if (phi_loop != loop)
1660     {
1661       struct loop *subloop;
1662       tree evolution_fn = analyze_scalar_evolution
1663         (phi_loop, PHI_RESULT (loop_phi_node));
1664
1665       /* Dive one level deeper.  */
1666       subloop = superloop_at_depth (phi_loop, loop->depth + 1);
1667
1668       /* Interpret the subloop.  */
1669       res = compute_overall_effect_of_inner_loop (subloop, evolution_fn);
1670       return res;
1671     }
1672
1673   /* Otherwise really interpret the loop phi.  */
1674   init_cond = analyze_initial_condition (loop_phi_node);
1675   res = analyze_evolution_in_loop (loop_phi_node, init_cond);
1676
1677   return res;
1678 }
1679
1680 /* This function merges the branches of a condition-phi-node,
1681    contained in the outermost loop, and whose arguments are already
1682    analyzed.  */
1683
1684 static tree
1685 interpret_condition_phi (struct loop *loop, tree condition_phi)
1686 {
1687   int i;
1688   tree res = chrec_not_analyzed_yet;
1689   
1690   for (i = 0; i < PHI_NUM_ARGS (condition_phi); i++)
1691     {
1692       tree branch_chrec;
1693       
1694       if (backedge_phi_arg_p (condition_phi, i))
1695         {
1696           res = chrec_dont_know;
1697           break;
1698         }
1699
1700       branch_chrec = analyze_scalar_evolution
1701         (loop, PHI_ARG_DEF (condition_phi, i));
1702       
1703       res = chrec_merge (res, branch_chrec);
1704     }
1705
1706   return res;
1707 }
1708
1709 /* Interpret the right hand side of a modify_expr OPND1.  If we didn't
1710    analyzed this node before, follow the definitions until ending
1711    either on an analyzed modify_expr, or on a loop-phi-node.  On the
1712    return path, this function propagates evolutions (ala constant copy
1713    propagation).  OPND1 is not a GIMPLE expression because we could
1714    analyze the effect of an inner loop: see interpret_loop_phi.  */
1715
1716 static tree
1717 interpret_rhs_modify_expr (struct loop *loop,
1718                            tree opnd1, tree type)
1719 {
1720   tree res, opnd10, opnd11, chrec10, chrec11;
1721   
1722   if (is_gimple_min_invariant (opnd1))
1723     return chrec_convert (type, opnd1);
1724   
1725   switch (TREE_CODE (opnd1))
1726     {
1727     case PLUS_EXPR:
1728       opnd10 = TREE_OPERAND (opnd1, 0);
1729       opnd11 = TREE_OPERAND (opnd1, 1);
1730       chrec10 = analyze_scalar_evolution (loop, opnd10);
1731       chrec11 = analyze_scalar_evolution (loop, opnd11);
1732       chrec10 = chrec_convert (type, chrec10);
1733       chrec11 = chrec_convert (type, chrec11);
1734       res = chrec_fold_plus (type, chrec10, chrec11);
1735       break;
1736       
1737     case MINUS_EXPR:
1738       opnd10 = TREE_OPERAND (opnd1, 0);
1739       opnd11 = TREE_OPERAND (opnd1, 1);
1740       chrec10 = analyze_scalar_evolution (loop, opnd10);
1741       chrec11 = analyze_scalar_evolution (loop, opnd11);
1742       chrec10 = chrec_convert (type, chrec10);
1743       chrec11 = chrec_convert (type, chrec11);
1744       res = chrec_fold_minus (type, chrec10, chrec11);
1745       break;
1746
1747     case NEGATE_EXPR:
1748       opnd10 = TREE_OPERAND (opnd1, 0);
1749       chrec10 = analyze_scalar_evolution (loop, opnd10);
1750       chrec10 = chrec_convert (type, chrec10);
1751       res = chrec_fold_minus (type, fold_convert (type, integer_zero_node), 
1752                               chrec10);
1753       break;
1754
1755     case MULT_EXPR:
1756       opnd10 = TREE_OPERAND (opnd1, 0);
1757       opnd11 = TREE_OPERAND (opnd1, 1);
1758       chrec10 = analyze_scalar_evolution (loop, opnd10);
1759       chrec11 = analyze_scalar_evolution (loop, opnd11);
1760       chrec10 = chrec_convert (type, chrec10);
1761       chrec11 = chrec_convert (type, chrec11);
1762       res = chrec_fold_multiply (type, chrec10, chrec11);
1763       break;
1764       
1765     case SSA_NAME:
1766       res = chrec_convert (type, analyze_scalar_evolution (loop, opnd1));
1767       break;
1768       
1769     case NOP_EXPR:
1770     case CONVERT_EXPR:
1771       opnd10 = TREE_OPERAND (opnd1, 0);
1772       chrec10 = analyze_scalar_evolution (loop, opnd10);
1773       res = chrec_convert (type, chrec10);
1774       break;
1775       
1776     default:
1777       res = chrec_dont_know;
1778       break;
1779     }
1780   
1781   return res;
1782 }
1783
1784 \f
1785
1786 /* This section contains all the entry points: 
1787    - number_of_iterations_in_loop,
1788    - analyze_scalar_evolution,
1789    - instantiate_parameters.
1790 */
1791
1792 /* Compute and return the evolution function in WRTO_LOOP, the nearest
1793    common ancestor of DEF_LOOP and USE_LOOP.  */
1794
1795 static tree 
1796 compute_scalar_evolution_in_loop (struct loop *wrto_loop, 
1797                                   struct loop *def_loop, 
1798                                   tree ev)
1799 {
1800   tree res;
1801   if (def_loop == wrto_loop)
1802     return ev;
1803
1804   def_loop = superloop_at_depth (def_loop, wrto_loop->depth + 1);
1805   res = compute_overall_effect_of_inner_loop (def_loop, ev);
1806
1807   return analyze_scalar_evolution_1 (wrto_loop, res, chrec_not_analyzed_yet);
1808 }
1809
1810 /* Helper recursive function.  */
1811
1812 static tree
1813 analyze_scalar_evolution_1 (struct loop *loop, tree var, tree res)
1814 {
1815   tree def, type = TREE_TYPE (var);
1816   basic_block bb;
1817   struct loop *def_loop;
1818
1819   if (loop == NULL)
1820     return chrec_dont_know;
1821
1822   if (TREE_CODE (var) != SSA_NAME)
1823     return interpret_rhs_modify_expr (loop, var, type);
1824
1825   def = SSA_NAME_DEF_STMT (var);
1826   bb = bb_for_stmt (def);
1827   def_loop = bb ? bb->loop_father : NULL;
1828
1829   if (bb == NULL
1830       || !flow_bb_inside_loop_p (loop, bb))
1831     {
1832       /* Keep the symbolic form.  */
1833       res = var;
1834       goto set_and_end;
1835     }
1836
1837   if (res != chrec_not_analyzed_yet)
1838     {
1839       if (loop != bb->loop_father)
1840         res = compute_scalar_evolution_in_loop 
1841             (find_common_loop (loop, bb->loop_father), bb->loop_father, res);
1842
1843       goto set_and_end;
1844     }
1845
1846   if (loop != def_loop)
1847     {
1848       res = analyze_scalar_evolution_1 (def_loop, var, chrec_not_analyzed_yet);
1849       res = compute_scalar_evolution_in_loop (loop, def_loop, res);
1850
1851       goto set_and_end;
1852     }
1853
1854   switch (TREE_CODE (def))
1855     {
1856     case MODIFY_EXPR:
1857       res = interpret_rhs_modify_expr (loop, TREE_OPERAND (def, 1), type);
1858       break;
1859
1860     case PHI_NODE:
1861       if (loop_phi_node_p (def))
1862         res = interpret_loop_phi (loop, def);
1863       else
1864         res = interpret_condition_phi (loop, def);
1865       break;
1866
1867     default:
1868       res = chrec_dont_know;
1869       break;
1870     }
1871
1872  set_and_end:
1873
1874   /* Keep the symbolic form.  */
1875   if (res == chrec_dont_know)
1876     res = var;
1877
1878   if (loop == def_loop)
1879     set_scalar_evolution (var, res);
1880
1881   return res;
1882 }
1883
1884 /* Entry point for the scalar evolution analyzer.
1885    Analyzes and returns the scalar evolution of the ssa_name VAR.
1886    LOOP_NB is the identifier number of the loop in which the variable
1887    is used.
1888    
1889    Example of use: having a pointer VAR to a SSA_NAME node, STMT a
1890    pointer to the statement that uses this variable, in order to
1891    determine the evolution function of the variable, use the following
1892    calls:
1893    
1894    unsigned loop_nb = loop_containing_stmt (stmt)->num;
1895    tree chrec_with_symbols = analyze_scalar_evolution (loop_nb, var);
1896    tree chrec_instantiated = instantiate_parameters 
1897    (loop_nb, chrec_with_symbols);
1898 */
1899
1900 tree 
1901 analyze_scalar_evolution (struct loop *loop, tree var)
1902 {
1903   tree res;
1904
1905   if (dump_file && (dump_flags & TDF_DETAILS))
1906     {
1907       fprintf (dump_file, "(analyze_scalar_evolution \n");
1908       fprintf (dump_file, "  (loop_nb = %d)\n", loop->num);
1909       fprintf (dump_file, "  (scalar = ");
1910       print_generic_expr (dump_file, var, 0);
1911       fprintf (dump_file, ")\n");
1912     }
1913
1914   res = analyze_scalar_evolution_1 (loop, var, get_scalar_evolution (var));
1915
1916   if (TREE_CODE (var) == SSA_NAME && res == chrec_dont_know)
1917     res = var;
1918
1919   if (dump_file && (dump_flags & TDF_DETAILS))
1920     fprintf (dump_file, ")\n");
1921
1922   return res;
1923 }
1924
1925 /* Analyze scalar evolution of use of VERSION in USE_LOOP with respect to
1926    WRTO_LOOP (which should be a superloop of both USE_LOOP and definition
1927    of VERSION).  */
1928
1929 static tree
1930 analyze_scalar_evolution_in_loop (struct loop *wrto_loop, struct loop *use_loop,
1931                                   tree version)
1932 {
1933   bool val = false;
1934   tree ev = version;
1935
1936   while (1)
1937     {
1938       ev = analyze_scalar_evolution (use_loop, ev);
1939       ev = resolve_mixers (use_loop, ev);
1940
1941       if (use_loop == wrto_loop)
1942         return ev;
1943
1944       /* If the value of the use changes in the inner loop, we cannot express
1945          its value in the outer loop (we might try to return interval chrec,
1946          but we do not have a user for it anyway)  */
1947       if (!no_evolution_in_loop_p (ev, use_loop->num, &val)
1948           || !val)
1949         return chrec_dont_know;
1950
1951       use_loop = use_loop->outer;
1952     }
1953 }
1954
1955 /* Analyze all the parameters of the chrec that were left under a symbolic form,
1956    with respect to LOOP.  CHREC is the chrec to instantiate.  If
1957    ALLOW_SUPERLOOP_CHRECS is true, replacing loop invariants with
1958    outer loop chrecs is done.  */
1959
1960 static tree
1961 instantiate_parameters_1 (struct loop *loop, tree chrec,
1962                           bool allow_superloop_chrecs)
1963 {
1964   tree res, op0, op1, op2;
1965   basic_block def_bb;
1966   struct loop *def_loop;
1967   
1968   if (chrec == NULL_TREE
1969       || automatically_generated_chrec_p (chrec))
1970     return chrec;
1971  
1972   if (is_gimple_min_invariant (chrec))
1973     return chrec;
1974
1975   switch (TREE_CODE (chrec))
1976     {
1977     case SSA_NAME:
1978       def_bb = bb_for_stmt (SSA_NAME_DEF_STMT (chrec));
1979
1980       /* A parameter (or loop invariant and we do not want to include
1981          evolutions in outer loops), nothing to do.  */
1982       if (!def_bb
1983           || (!allow_superloop_chrecs
1984               && !flow_bb_inside_loop_p (loop, def_bb)))
1985         return chrec;
1986
1987       /* Don't instantiate the SSA_NAME if it is in a mixer
1988          structure.  This is used for avoiding the instantiation of
1989          recursively defined functions, such as: 
1990
1991          | a_2 -> {0, +, 1, +, a_2}_1  */
1992            
1993       if (bitmap_bit_p (already_instantiated, SSA_NAME_VERSION (chrec)))
1994         {
1995           if (!flow_bb_inside_loop_p (loop, def_bb))
1996             {
1997               /* We may keep the loop invariant in symbolic form.  */
1998               return chrec;
1999             }
2000           else
2001             {
2002               /* Something with unknown behavior in LOOP.  */
2003               return chrec_dont_know;
2004             }
2005         }
2006
2007       def_loop = find_common_loop (loop, def_bb->loop_father);
2008
2009       /* If the analysis yields a parametric chrec, instantiate the
2010          result again.  Avoid the cyclic instantiation in mixers.  */
2011       bitmap_set_bit (already_instantiated, SSA_NAME_VERSION (chrec));
2012       res = analyze_scalar_evolution (def_loop, chrec);
2013       res = instantiate_parameters_1 (loop, res, allow_superloop_chrecs);
2014       bitmap_clear_bit (already_instantiated, SSA_NAME_VERSION (chrec));
2015       return res;
2016
2017     case POLYNOMIAL_CHREC:
2018       op0 = instantiate_parameters_1 (loop, CHREC_LEFT (chrec),
2019                                       allow_superloop_chrecs);
2020       op1 = instantiate_parameters_1 (loop, CHREC_RIGHT (chrec),
2021                                       allow_superloop_chrecs);
2022       return build_polynomial_chrec (CHREC_VARIABLE (chrec), op0, op1);
2023
2024     case PLUS_EXPR:
2025       op0 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 0),
2026                                       allow_superloop_chrecs);
2027       op1 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 1),
2028                                       allow_superloop_chrecs);
2029       return chrec_fold_plus (TREE_TYPE (chrec), op0, op1);
2030
2031     case MINUS_EXPR:
2032       op0 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 0),
2033                                       allow_superloop_chrecs);
2034       op1 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 1),
2035                                       allow_superloop_chrecs);
2036       return chrec_fold_minus (TREE_TYPE (chrec), op0, op1);
2037
2038     case MULT_EXPR:
2039       op0 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 0),
2040                                       allow_superloop_chrecs);
2041       op1 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 1),
2042                                       allow_superloop_chrecs);
2043       return chrec_fold_multiply (TREE_TYPE (chrec), op0, op1);
2044
2045     case NOP_EXPR:
2046     case CONVERT_EXPR:
2047     case NON_LVALUE_EXPR:
2048       op0 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 0),
2049                                       allow_superloop_chrecs);
2050       if (op0 == chrec_dont_know)
2051         return chrec_dont_know;
2052
2053       return chrec_convert (TREE_TYPE (chrec), op0);
2054
2055     case SCEV_NOT_KNOWN:
2056       return chrec_dont_know;
2057
2058     case SCEV_KNOWN:
2059       return chrec_known;
2060                                      
2061     default:
2062       break;
2063     }
2064
2065   switch (TREE_CODE_LENGTH (TREE_CODE (chrec)))
2066     {
2067     case 3:
2068       op0 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 0),
2069                                       allow_superloop_chrecs);
2070       op1 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 1),
2071                                       allow_superloop_chrecs);
2072       op2 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 2),
2073                                       allow_superloop_chrecs);
2074       if (op0 == chrec_dont_know
2075           || op1 == chrec_dont_know
2076           || op2 == chrec_dont_know)
2077         return chrec_dont_know;
2078       return fold (build (TREE_CODE (chrec),
2079                           TREE_TYPE (chrec), op0, op1, op2));
2080
2081     case 2:
2082       op0 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 0),
2083                                       allow_superloop_chrecs);
2084       op1 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 1),
2085                                       allow_superloop_chrecs);
2086       if (op0 == chrec_dont_know
2087           || op1 == chrec_dont_know)
2088         return chrec_dont_know;
2089       return fold (build (TREE_CODE (chrec), TREE_TYPE (chrec), op0, op1));
2090             
2091     case 1:
2092       op0 = instantiate_parameters_1 (loop, TREE_OPERAND (chrec, 0),
2093                                       allow_superloop_chrecs);
2094       if (op0 == chrec_dont_know)
2095         return chrec_dont_know;
2096       return fold (build1 (TREE_CODE (chrec), TREE_TYPE (chrec), op0));
2097
2098     case 0:
2099       return chrec;
2100
2101     default:
2102       break;
2103     }
2104
2105   /* Too complicated to handle.  */
2106   return chrec_dont_know;
2107 }
2108
2109 /* Analyze all the parameters of the chrec that were left under a
2110    symbolic form.  LOOP is the loop in which symbolic names have to
2111    be analyzed and instantiated.  */
2112
2113 tree
2114 instantiate_parameters (struct loop *loop,
2115                         tree chrec)
2116 {
2117   tree res;
2118
2119   if (dump_file && (dump_flags & TDF_DETAILS))
2120     {
2121       fprintf (dump_file, "(instantiate_parameters \n");
2122       fprintf (dump_file, "  (loop_nb = %d)\n", loop->num);
2123       fprintf (dump_file, "  (chrec = ");
2124       print_generic_expr (dump_file, chrec, 0);
2125       fprintf (dump_file, ")\n");
2126     }
2127  
2128   res = instantiate_parameters_1 (loop, chrec, true);
2129
2130   if (dump_file && (dump_flags & TDF_DETAILS))
2131     {
2132       fprintf (dump_file, "  (res = ");
2133       print_generic_expr (dump_file, res, 0);
2134       fprintf (dump_file, "))\n");
2135     }
2136   
2137   return res;
2138 }
2139
2140 /* Similar to instantiate_parameters, but does not introduce the
2141    evolutions in outer loops for LOOP invariants in CHREC.  */
2142
2143 static tree
2144 resolve_mixers (struct loop *loop, tree chrec)
2145 {
2146   return instantiate_parameters_1 (loop, chrec, false);
2147 }
2148
2149 /* Entry point for the analysis of the number of iterations pass.  
2150    This function tries to safely approximate the number of iterations
2151    the loop will run.  When this property is not decidable at compile
2152    time, the result is chrec_dont_know.  Otherwise the result is
2153    a scalar or a symbolic parameter.
2154    
2155    Example of analysis: suppose that the loop has an exit condition:
2156    
2157    "if (b > 49) goto end_loop;"
2158    
2159    and that in a previous analysis we have determined that the
2160    variable 'b' has an evolution function:
2161    
2162    "EF = {23, +, 5}_2".  
2163    
2164    When we evaluate the function at the point 5, i.e. the value of the
2165    variable 'b' after 5 iterations in the loop, we have EF (5) = 48,
2166    and EF (6) = 53.  In this case the value of 'b' on exit is '53' and
2167    the loop body has been executed 6 times.  */
2168
2169 tree 
2170 number_of_iterations_in_loop (struct loop *loop)
2171 {
2172   tree res, type;
2173   edge exit;
2174   struct tree_niter_desc niter_desc;
2175
2176   /* Determine whether the number_of_iterations_in_loop has already
2177      been computed.  */
2178   res = loop->nb_iterations;
2179   if (res)
2180     return res;
2181   res = chrec_dont_know;
2182
2183   if (dump_file && (dump_flags & TDF_DETAILS))
2184     fprintf (dump_file, "(number_of_iterations_in_loop\n");
2185   
2186   exit = loop->single_exit;
2187   if (!exit)
2188     goto end;
2189
2190   if (!number_of_iterations_exit (loop, exit, &niter_desc))
2191     goto end;
2192
2193   type = TREE_TYPE (niter_desc.niter);
2194   if (integer_nonzerop (niter_desc.may_be_zero))
2195     res = fold_convert (type, integer_zero_node);
2196   else if (integer_zerop (niter_desc.may_be_zero))
2197     res = niter_desc.niter;
2198   else
2199     res = chrec_dont_know;
2200
2201 end:
2202   return set_nb_iterations_in_loop (loop, res);
2203 }
2204
2205 /* One of the drivers for testing the scalar evolutions analysis.
2206    This function computes the number of iterations for all the loops
2207    from the EXIT_CONDITIONS array.  */
2208
2209 static void 
2210 number_of_iterations_for_all_loops (varray_type exit_conditions)
2211 {
2212   unsigned int i;
2213   unsigned nb_chrec_dont_know_loops = 0;
2214   unsigned nb_static_loops = 0;
2215   
2216   for (i = 0; i < VARRAY_ACTIVE_SIZE (exit_conditions); i++)
2217     {
2218       tree res = number_of_iterations_in_loop 
2219         (loop_containing_stmt (VARRAY_TREE (exit_conditions, i)));
2220       if (chrec_contains_undetermined (res))
2221         nb_chrec_dont_know_loops++;
2222       else
2223         nb_static_loops++;
2224     }
2225   
2226   if (dump_file)
2227     {
2228       fprintf (dump_file, "\n(\n");
2229       fprintf (dump_file, "-----------------------------------------\n");
2230       fprintf (dump_file, "%d\tnb_chrec_dont_know_loops\n", nb_chrec_dont_know_loops);
2231       fprintf (dump_file, "%d\tnb_static_loops\n", nb_static_loops);
2232       fprintf (dump_file, "%d\tnb_total_loops\n", current_loops->num);
2233       fprintf (dump_file, "-----------------------------------------\n");
2234       fprintf (dump_file, ")\n\n");
2235       
2236       print_loop_ir (dump_file);
2237     }
2238 }
2239
2240 \f
2241
2242 /* Counters for the stats.  */
2243
2244 struct chrec_stats 
2245 {
2246   unsigned nb_chrecs;
2247   unsigned nb_affine;
2248   unsigned nb_affine_multivar;
2249   unsigned nb_higher_poly;
2250   unsigned nb_chrec_dont_know;
2251   unsigned nb_undetermined;
2252 };
2253
2254 /* Reset the counters.  */
2255
2256 static inline void
2257 reset_chrecs_counters (struct chrec_stats *stats)
2258 {
2259   stats->nb_chrecs = 0;
2260   stats->nb_affine = 0;
2261   stats->nb_affine_multivar = 0;
2262   stats->nb_higher_poly = 0;
2263   stats->nb_chrec_dont_know = 0;
2264   stats->nb_undetermined = 0;
2265 }
2266
2267 /* Dump the contents of a CHREC_STATS structure.  */
2268
2269 static void
2270 dump_chrecs_stats (FILE *file, struct chrec_stats *stats)
2271 {
2272   fprintf (file, "\n(\n");
2273   fprintf (file, "-----------------------------------------\n");
2274   fprintf (file, "%d\taffine univariate chrecs\n", stats->nb_affine);
2275   fprintf (file, "%d\taffine multivariate chrecs\n", stats->nb_affine_multivar);
2276   fprintf (file, "%d\tdegree greater than 2 polynomials\n", 
2277            stats->nb_higher_poly);
2278   fprintf (file, "%d\tchrec_dont_know chrecs\n", stats->nb_chrec_dont_know);
2279   fprintf (file, "-----------------------------------------\n");
2280   fprintf (file, "%d\ttotal chrecs\n", stats->nb_chrecs);
2281   fprintf (file, "%d\twith undetermined coefficients\n", 
2282            stats->nb_undetermined);
2283   fprintf (file, "-----------------------------------------\n");
2284   fprintf (file, "%d\tchrecs in the scev database\n", 
2285            (int) htab_elements (scalar_evolution_info));
2286   fprintf (file, "%d\tsets in the scev database\n", nb_set_scev);
2287   fprintf (file, "%d\tgets in the scev database\n", nb_get_scev);
2288   fprintf (file, "-----------------------------------------\n");
2289   fprintf (file, ")\n\n");
2290 }
2291
2292 /* Gather statistics about CHREC.  */
2293
2294 static void
2295 gather_chrec_stats (tree chrec, struct chrec_stats *stats)
2296 {
2297   if (dump_file && (dump_flags & TDF_STATS))
2298     {
2299       fprintf (dump_file, "(classify_chrec ");
2300       print_generic_expr (dump_file, chrec, 0);
2301       fprintf (dump_file, "\n");
2302     }
2303   
2304   stats->nb_chrecs++;
2305   
2306   if (chrec == NULL_TREE)
2307     {
2308       stats->nb_undetermined++;
2309       return;
2310     }
2311   
2312   switch (TREE_CODE (chrec))
2313     {
2314     case POLYNOMIAL_CHREC:
2315       if (evolution_function_is_affine_p (chrec))
2316         {
2317           if (dump_file && (dump_flags & TDF_STATS))
2318             fprintf (dump_file, "  affine_univariate\n");
2319           stats->nb_affine++;
2320         }
2321       else if (evolution_function_is_affine_multivariate_p (chrec))
2322         {
2323           if (dump_file && (dump_flags & TDF_STATS))
2324             fprintf (dump_file, "  affine_multivariate\n");
2325           stats->nb_affine_multivar++;
2326         }
2327       else
2328         {
2329           if (dump_file && (dump_flags & TDF_STATS))
2330             fprintf (dump_file, "  higher_degree_polynomial\n");
2331           stats->nb_higher_poly++;
2332         }
2333       
2334       break;
2335
2336     default:
2337       break;
2338     }
2339   
2340   if (chrec_contains_undetermined (chrec))
2341     {
2342       if (dump_file && (dump_flags & TDF_STATS))
2343         fprintf (dump_file, "  undetermined\n");
2344       stats->nb_undetermined++;
2345     }
2346   
2347   if (dump_file && (dump_flags & TDF_STATS))
2348     fprintf (dump_file, ")\n");
2349 }
2350
2351 /* One of the drivers for testing the scalar evolutions analysis.
2352    This function analyzes the scalar evolution of all the scalars
2353    defined as loop phi nodes in one of the loops from the
2354    EXIT_CONDITIONS array.  
2355    
2356    TODO Optimization: A loop is in canonical form if it contains only
2357    a single scalar loop phi node.  All the other scalars that have an
2358    evolution in the loop are rewritten in function of this single
2359    index.  This allows the parallelization of the loop.  */
2360
2361 static void 
2362 analyze_scalar_evolution_for_all_loop_phi_nodes (varray_type exit_conditions)
2363 {
2364   unsigned int i;
2365   struct chrec_stats stats;
2366   
2367   reset_chrecs_counters (&stats);
2368   
2369   for (i = 0; i < VARRAY_ACTIVE_SIZE (exit_conditions); i++)
2370     {
2371       struct loop *loop;
2372       basic_block bb;
2373       tree phi, chrec;
2374       
2375       loop = loop_containing_stmt (VARRAY_TREE (exit_conditions, i));
2376       bb = loop->header;
2377       
2378       for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
2379         if (is_gimple_reg (PHI_RESULT (phi)))
2380           {
2381             chrec = instantiate_parameters 
2382               (loop, 
2383                analyze_scalar_evolution (loop, PHI_RESULT (phi)));
2384             
2385             if (dump_file && (dump_flags & TDF_STATS))
2386               gather_chrec_stats (chrec, &stats);
2387           }
2388     }
2389   
2390   if (dump_file && (dump_flags & TDF_STATS))
2391     dump_chrecs_stats (dump_file, &stats);
2392 }
2393
2394 /* Callback for htab_traverse, gathers information on chrecs in the
2395    hashtable.  */
2396
2397 static int
2398 gather_stats_on_scev_database_1 (void **slot, void *stats)
2399 {
2400   struct scev_info_str *entry = *slot;
2401
2402   gather_chrec_stats (entry->chrec, stats);
2403
2404   return 1;
2405 }
2406
2407 /* Classify the chrecs of the whole database.  */
2408
2409 void 
2410 gather_stats_on_scev_database (void)
2411 {
2412   struct chrec_stats stats;
2413   
2414   if (!dump_file)
2415     return;
2416   
2417   reset_chrecs_counters (&stats);
2418  
2419   htab_traverse (scalar_evolution_info, gather_stats_on_scev_database_1,
2420                  &stats);
2421
2422   dump_chrecs_stats (dump_file, &stats);
2423 }
2424
2425 \f
2426
2427 /* Initializer.  */
2428
2429 static void
2430 initialize_scalar_evolutions_analyzer (void)
2431 {
2432   /* The elements below are unique.  */
2433   if (chrec_dont_know == NULL_TREE)
2434     {
2435       chrec_not_analyzed_yet = NULL_TREE;
2436       chrec_dont_know = make_node (SCEV_NOT_KNOWN);
2437       chrec_known = make_node (SCEV_KNOWN);
2438       TREE_TYPE (chrec_dont_know) = NULL_TREE;
2439       TREE_TYPE (chrec_known) = NULL_TREE;
2440     }
2441 }
2442
2443 /* Initialize the analysis of scalar evolutions for LOOPS.  */
2444
2445 void
2446 scev_initialize (struct loops *loops)
2447 {
2448   unsigned i;
2449   current_loops = loops;
2450
2451   scalar_evolution_info = htab_create (100, hash_scev_info,
2452                                        eq_scev_info, del_scev_info);
2453   already_instantiated = BITMAP_XMALLOC ();
2454   
2455   initialize_scalar_evolutions_analyzer ();
2456
2457   for (i = 1; i < loops->num; i++)
2458     if (loops->parray[i])
2459       loops->parray[i]->nb_iterations = NULL_TREE;
2460 }
2461
2462 /* Cleans up the information cached by the scalar evolutions analysis.  */
2463
2464 void
2465 scev_reset (void)
2466 {
2467   unsigned i;
2468   struct loop *loop;
2469
2470   if (!scalar_evolution_info || !current_loops)
2471     return;
2472
2473   htab_empty (scalar_evolution_info);
2474   for (i = 1; i < current_loops->num; i++)
2475     {
2476       loop = current_loops->parray[i];
2477       if (loop)
2478         loop->nb_iterations = NULL_TREE;
2479     }
2480 }
2481
2482 /* Checks whether OP behaves as a simple affine iv of LOOP in STMT and returns
2483    its BASE and STEP if possible.  */
2484
2485 bool
2486 simple_iv (struct loop *loop, tree stmt, tree op, tree *base, tree *step)
2487 {
2488   basic_block bb = bb_for_stmt (stmt);
2489   tree type, ev;
2490
2491   *base = NULL_TREE;
2492   *step = NULL_TREE;
2493
2494   type = TREE_TYPE (op);
2495   if (TREE_CODE (type) != INTEGER_TYPE
2496       && TREE_CODE (type) != POINTER_TYPE)
2497     return false;
2498
2499   ev = analyze_scalar_evolution_in_loop (loop, bb->loop_father, op);
2500   if (chrec_contains_undetermined (ev))
2501     return false;
2502
2503   if (tree_does_not_contain_chrecs (ev)
2504       && !chrec_contains_symbols_defined_in_loop (ev, loop->num))
2505     {
2506       *base = ev;
2507       return true;
2508     }
2509
2510   if (TREE_CODE (ev) != POLYNOMIAL_CHREC
2511       || CHREC_VARIABLE (ev) != (unsigned) loop->num)
2512     return false;
2513
2514   *step = CHREC_RIGHT (ev);
2515   if (TREE_CODE (*step) != INTEGER_CST)
2516     return false;
2517   *base = CHREC_LEFT (ev);
2518   if (tree_contains_chrecs (*base)
2519       || chrec_contains_symbols_defined_in_loop (*base, loop->num))
2520     return false;
2521
2522   return true;
2523 }
2524
2525 /* Runs the analysis of scalar evolutions.  */
2526
2527 void
2528 scev_analysis (void)
2529 {
2530   varray_type exit_conditions;
2531   
2532   VARRAY_GENERIC_PTR_INIT (exit_conditions, 37, "exit_conditions");
2533   select_loops_exit_conditions (current_loops, &exit_conditions);
2534
2535   if (dump_file && (dump_flags & TDF_STATS))
2536     analyze_scalar_evolution_for_all_loop_phi_nodes (exit_conditions);
2537   
2538   number_of_iterations_for_all_loops (exit_conditions);
2539   VARRAY_CLEAR (exit_conditions);
2540 }
2541
2542 /* Finalize the scalar evolution analysis.  */
2543
2544 void
2545 scev_finalize (void)
2546 {
2547   htab_delete (scalar_evolution_info);
2548   BITMAP_XFREE (already_instantiated);
2549 }
2550