1 /* Scalar evolution detector.
2 Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
3 Contributed by Sebastian Pop <s.pop@laposte.net>
5 This file is part of GCC.
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 3, or (at your option) any later
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
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
24 This pass analyzes the evolution of scalar variables in loop
25 structures. The algorithm is based on the SSA representation,
26 and on the loop hierarchy tree. This algorithm is not based on
27 the notion of versions of a variable, as it was the case for the
28 previous implementations of the scalar evolution algorithm, but
29 it assumes that each defined name is unique.
31 The notation used in this file is called "chains of recurrences",
32 and has been proposed by Eugene Zima, Robert Van Engelen, and
33 others for describing induction variables in programs. For example
34 "b -> {0, +, 2}_1" means that the scalar variable "b" is equal to 0
35 when entering in the loop_1 and has a step 2 in this loop, in other
36 words "for (b = 0; b < N; b+=2);". Note that the coefficients of
37 this chain of recurrence (or chrec [shrek]) can contain the name of
38 other variables, in which case they are called parametric chrecs.
39 For example, "b -> {a, +, 2}_1" means that the initial value of "b"
40 is the value of "a". In most of the cases these parametric chrecs
41 are fully instantiated before their use because symbolic names can
42 hide some difficult cases such as self-references described later
43 (see the Fibonacci example).
45 A short sketch of the algorithm is:
47 Given a scalar variable to be analyzed, follow the SSA edge to
50 - When the definition is a GIMPLE_MODIFY_STMT: if the right hand side
51 (RHS) of the definition cannot be statically analyzed, the answer
52 of the analyzer is: "don't know".
53 Otherwise, for all the variables that are not yet analyzed in the
54 RHS, try to determine their evolution, and finally try to
55 evaluate the operation of the RHS that gives the evolution
56 function of the analyzed variable.
58 - When the definition is a condition-phi-node: determine the
59 evolution function for all the branches of the phi node, and
60 finally merge these evolutions (see chrec_merge).
62 - When the definition is a loop-phi-node: determine its initial
63 condition, that is the SSA edge defined in an outer loop, and
64 keep it symbolic. Then determine the SSA edges that are defined
65 in the body of the loop. Follow the inner edges until ending on
66 another loop-phi-node of the same analyzed loop. If the reached
67 loop-phi-node is not the starting loop-phi-node, then we keep
68 this definition under a symbolic form. If the reached
69 loop-phi-node is the same as the starting one, then we compute a
70 symbolic stride on the return path. The result is then the
71 symbolic chrec {initial_condition, +, symbolic_stride}_loop.
75 Example 1: Illustration of the basic algorithm.
81 | if (c > 10) exit_loop
84 Suppose that we want to know the number of iterations of the
85 loop_1. The exit_loop is controlled by a COND_EXPR (c > 10). We
86 ask the scalar evolution analyzer two questions: what's the
87 scalar evolution (scev) of "c", and what's the scev of "10". For
88 "10" the answer is "10" since it is a scalar constant. For the
89 scalar variable "c", it follows the SSA edge to its definition,
90 "c = b + 1", and then asks again what's the scev of "b".
91 Following the SSA edge, we end on a loop-phi-node "b = phi (a,
92 c)", where the initial condition is "a", and the inner loop edge
93 is "c". The initial condition is kept under a symbolic form (it
94 may be the case that the copy constant propagation has done its
95 work and we end with the constant "3" as one of the edges of the
96 loop-phi-node). The update edge is followed to the end of the
97 loop, and until reaching again the starting loop-phi-node: b -> c
98 -> b. At this point we have drawn a path from "b" to "b" from
99 which we compute the stride in the loop: in this example it is
100 "+1". The resulting scev for "b" is "b -> {a, +, 1}_1". Now
101 that the scev for "b" is known, it is possible to compute the
102 scev for "c", that is "c -> {a + 1, +, 1}_1". In order to
103 determine the number of iterations in the loop_1, we have to
104 instantiate_parameters ({a + 1, +, 1}_1), that gives after some
105 more analysis the scev {4, +, 1}_1, or in other words, this is
106 the function "f (x) = x + 4", where x is the iteration count of
107 the loop_1. Now we have to solve the inequality "x + 4 > 10",
108 and take the smallest iteration number for which the loop is
109 exited: x = 7. This loop runs from x = 0 to x = 7, and in total
110 there are 8 iterations. In terms of loop normalization, we have
111 created a variable that is implicitly defined, "x" or just "_1",
112 and all the other analyzed scalars of the loop are defined in
113 function of this variable:
119 or in terms of a C program:
122 | for (x = 0; x <= 7; x++)
128 Example 2: Illustration of the algorithm on nested loops.
139 For analyzing the scalar evolution of "a", the algorithm follows
140 the SSA edge into the loop's body: "a -> b". "b" is an inner
141 loop-phi-node, and its analysis as in Example 1, gives:
146 Following the SSA edge for the initial condition, we end on "c = a
147 + 2", and then on the starting loop-phi-node "a". From this point,
148 the loop stride is computed: back on "c = a + 2" we get a "+2" in
149 the loop_1, then on the loop-phi-node "b" we compute the overall
150 effect of the inner loop that is "b = c + 30", and we get a "+30"
151 in the loop_1. That means that the overall stride in loop_1 is
152 equal to "+32", and the result is:
157 Example 3: Higher degree polynomials.
171 instantiate_parameters ({5, +, a}_1) -> {5, +, 2, +, 1}_1
172 instantiate_parameters ({5 + a, +, a}_1) -> {7, +, 3, +, 1}_1
174 Example 4: Lucas, Fibonacci, or mixers in general.
186 The syntax "(1, c)_1" stands for a PEELED_CHREC that has the
187 following semantics: during the first iteration of the loop_1, the
188 variable contains the value 1, and then it contains the value "c".
189 Note that this syntax is close to the syntax of the loop-phi-node:
190 "a -> (1, c)_1" vs. "a = phi (1, c)".
192 The symbolic chrec representation contains all the semantics of the
193 original code. What is more difficult is to use this information.
195 Example 5: Flip-flops, or exchangers.
207 Based on these symbolic chrecs, it is possible to refine this
208 information into the more precise PERIODIC_CHRECs:
213 This transformation is not yet implemented.
217 You can find a more detailed description of the algorithm in:
218 http://icps.u-strasbg.fr/~pop/DEA_03_Pop.pdf
219 http://icps.u-strasbg.fr/~pop/DEA_03_Pop.ps.gz. But note that
220 this is a preliminary report and some of the details of the
221 algorithm have changed. I'm working on a research report that
222 updates the description of the algorithms to reflect the design
223 choices used in this implementation.
225 A set of slides show a high level overview of the algorithm and run
226 an example through the scalar evolution analyzer:
227 http://cri.ensmp.fr/~pop/gcc/mar04/slides.pdf
229 The slides that I have presented at the GCC Summit'04 are available
230 at: http://cri.ensmp.fr/~pop/gcc/20040604/gccsummit-lno-spop.pdf
235 #include "coretypes.h"
241 /* These RTL headers are needed for basic-block.h. */
243 #include "basic-block.h"
244 #include "diagnostic.h"
245 #include "tree-flow.h"
246 #include "tree-dump.h"
249 #include "tree-chrec.h"
250 #include "tree-scalar-evolution.h"
251 #include "tree-pass.h"
255 static tree
analyze_scalar_evolution_1 (struct loop
*, tree
, tree
);
257 /* The cached information about a ssa name VAR, claiming that inside LOOP,
258 the value of VAR can be expressed as CHREC. */
260 struct scev_info_str
GTY(())
266 /* Counters for the scev database. */
267 static unsigned nb_set_scev
= 0;
268 static unsigned nb_get_scev
= 0;
270 /* The following trees are unique elements. Thus the comparison of
271 another element to these elements should be done on the pointer to
272 these trees, and not on their value. */
274 /* The SSA_NAMEs that are not yet analyzed are qualified with NULL_TREE. */
275 tree chrec_not_analyzed_yet
;
277 /* Reserved to the cases where the analyzer has detected an
278 undecidable property at compile time. */
279 tree chrec_dont_know
;
281 /* When the analyzer has detected that a property will never
282 happen, then it qualifies it with chrec_known. */
285 static bitmap already_instantiated
;
287 static GTY ((param_is (struct scev_info_str
))) htab_t scalar_evolution_info
;
290 /* Constructs a new SCEV_INFO_STR structure. */
292 static inline struct scev_info_str
*
293 new_scev_info_str (tree var
)
295 struct scev_info_str
*res
;
297 res
= GGC_NEW (struct scev_info_str
);
299 res
->chrec
= chrec_not_analyzed_yet
;
304 /* Computes a hash function for database element ELT. */
307 hash_scev_info (const void *elt
)
309 return SSA_NAME_VERSION (((const struct scev_info_str
*) elt
)->var
);
312 /* Compares database elements E1 and E2. */
315 eq_scev_info (const void *e1
, const void *e2
)
317 const struct scev_info_str
*elt1
= (const struct scev_info_str
*) e1
;
318 const struct scev_info_str
*elt2
= (const struct scev_info_str
*) e2
;
320 return elt1
->var
== elt2
->var
;
323 /* Deletes database element E. */
326 del_scev_info (void *e
)
331 /* Get the index corresponding to VAR in the current LOOP. If
332 it's the first time we ask for this VAR, then we return
333 chrec_not_analyzed_yet for this VAR and return its index. */
336 find_var_scev_info (tree var
)
338 struct scev_info_str
*res
;
339 struct scev_info_str tmp
;
343 slot
= htab_find_slot (scalar_evolution_info
, &tmp
, INSERT
);
346 *slot
= new_scev_info_str (var
);
347 res
= (struct scev_info_str
*) *slot
;
352 /* Return true when CHREC contains symbolic names defined in
356 chrec_contains_symbols_defined_in_loop (const_tree chrec
, unsigned loop_nb
)
360 if (chrec
== NULL_TREE
)
363 if (TREE_INVARIANT (chrec
))
366 if (TREE_CODE (chrec
) == VAR_DECL
367 || TREE_CODE (chrec
) == PARM_DECL
368 || TREE_CODE (chrec
) == FUNCTION_DECL
369 || TREE_CODE (chrec
) == LABEL_DECL
370 || TREE_CODE (chrec
) == RESULT_DECL
371 || TREE_CODE (chrec
) == FIELD_DECL
)
374 if (TREE_CODE (chrec
) == SSA_NAME
)
376 tree def
= SSA_NAME_DEF_STMT (chrec
);
377 struct loop
*def_loop
= loop_containing_stmt (def
);
378 struct loop
*loop
= get_loop (loop_nb
);
380 if (def_loop
== NULL
)
383 if (loop
== def_loop
|| flow_loop_nested_p (loop
, def_loop
))
389 n
= TREE_OPERAND_LENGTH (chrec
);
390 for (i
= 0; i
< n
; i
++)
391 if (chrec_contains_symbols_defined_in_loop (TREE_OPERAND (chrec
, i
),
397 /* Return true when PHI is a loop-phi-node. */
400 loop_phi_node_p (tree phi
)
402 /* The implementation of this function is based on the following
403 property: "all the loop-phi-nodes of a loop are contained in the
404 loop's header basic block". */
406 return loop_containing_stmt (phi
)->header
== bb_for_stmt (phi
);
409 /* Compute the scalar evolution for EVOLUTION_FN after crossing LOOP.
410 In general, in the case of multivariate evolutions we want to get
411 the evolution in different loops. LOOP specifies the level for
412 which to get the evolution.
416 | for (j = 0; j < 100; j++)
418 | for (k = 0; k < 100; k++)
420 | i = k + j; - Here the value of i is a function of j, k.
422 | ... = i - Here the value of i is a function of j.
424 | ... = i - Here the value of i is a scalar.
430 | i_1 = phi (i_0, i_2)
434 This loop has the same effect as:
435 LOOP_1 has the same effect as:
439 The overall effect of the loop, "i_0 + 20" in the previous example,
440 is obtained by passing in the parameters: LOOP = 1,
441 EVOLUTION_FN = {i_0, +, 2}_1.
445 compute_overall_effect_of_inner_loop (struct loop
*loop
, tree evolution_fn
)
449 if (evolution_fn
== chrec_dont_know
)
450 return chrec_dont_know
;
452 else if (TREE_CODE (evolution_fn
) == POLYNOMIAL_CHREC
)
454 struct loop
*inner_loop
= get_chrec_loop (evolution_fn
);
456 if (inner_loop
== loop
457 || flow_loop_nested_p (loop
, inner_loop
))
459 tree nb_iter
= number_of_latch_executions (inner_loop
);
461 if (nb_iter
== chrec_dont_know
)
462 return chrec_dont_know
;
467 /* evolution_fn is the evolution function in LOOP. Get
468 its value in the nb_iter-th iteration. */
469 res
= chrec_apply (inner_loop
->num
, evolution_fn
, nb_iter
);
471 /* Continue the computation until ending on a parent of LOOP. */
472 return compute_overall_effect_of_inner_loop (loop
, res
);
479 /* If the evolution function is an invariant, there is nothing to do. */
480 else if (no_evolution_in_loop_p (evolution_fn
, loop
->num
, &val
) && val
)
484 return chrec_dont_know
;
487 /* Determine whether the CHREC is always positive/negative. If the expression
488 cannot be statically analyzed, return false, otherwise set the answer into
492 chrec_is_positive (tree chrec
, bool *value
)
494 bool value0
, value1
, value2
;
495 tree end_value
, nb_iter
;
497 switch (TREE_CODE (chrec
))
499 case POLYNOMIAL_CHREC
:
500 if (!chrec_is_positive (CHREC_LEFT (chrec
), &value0
)
501 || !chrec_is_positive (CHREC_RIGHT (chrec
), &value1
))
504 /* FIXME -- overflows. */
505 if (value0
== value1
)
511 /* Otherwise the chrec is under the form: "{-197, +, 2}_1",
512 and the proof consists in showing that the sign never
513 changes during the execution of the loop, from 0 to
514 loop->nb_iterations. */
515 if (!evolution_function_is_affine_p (chrec
))
518 nb_iter
= number_of_latch_executions (get_chrec_loop (chrec
));
519 if (chrec_contains_undetermined (nb_iter
))
523 /* TODO -- If the test is after the exit, we may decrease the number of
524 iterations by one. */
526 nb_iter
= chrec_fold_minus (type
, nb_iter
, build_int_cst (type
, 1));
529 end_value
= chrec_apply (CHREC_VARIABLE (chrec
), chrec
, nb_iter
);
531 if (!chrec_is_positive (end_value
, &value2
))
535 return value0
== value1
;
538 *value
= (tree_int_cst_sgn (chrec
) == 1);
546 /* Associate CHREC to SCALAR. */
549 set_scalar_evolution (tree scalar
, tree chrec
)
553 if (TREE_CODE (scalar
) != SSA_NAME
)
556 scalar_info
= find_var_scev_info (scalar
);
560 if (dump_flags
& TDF_DETAILS
)
562 fprintf (dump_file
, "(set_scalar_evolution \n");
563 fprintf (dump_file
, " (scalar = ");
564 print_generic_expr (dump_file
, scalar
, 0);
565 fprintf (dump_file
, ")\n (scalar_evolution = ");
566 print_generic_expr (dump_file
, chrec
, 0);
567 fprintf (dump_file
, "))\n");
569 if (dump_flags
& TDF_STATS
)
573 *scalar_info
= chrec
;
576 /* Retrieve the chrec associated to SCALAR in the LOOP. */
579 get_scalar_evolution (tree scalar
)
585 if (dump_flags
& TDF_DETAILS
)
587 fprintf (dump_file
, "(get_scalar_evolution \n");
588 fprintf (dump_file
, " (scalar = ");
589 print_generic_expr (dump_file
, scalar
, 0);
590 fprintf (dump_file
, ")\n");
592 if (dump_flags
& TDF_STATS
)
596 switch (TREE_CODE (scalar
))
599 res
= *find_var_scev_info (scalar
);
609 res
= chrec_not_analyzed_yet
;
613 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
615 fprintf (dump_file
, " (scalar_evolution = ");
616 print_generic_expr (dump_file
, res
, 0);
617 fprintf (dump_file
, "))\n");
623 /* Helper function for add_to_evolution. Returns the evolution
624 function for an assignment of the form "a = b + c", where "a" and
625 "b" are on the strongly connected component. CHREC_BEFORE is the
626 information that we already have collected up to this point.
627 TO_ADD is the evolution of "c".
629 When CHREC_BEFORE has an evolution part in LOOP_NB, add to this
630 evolution the expression TO_ADD, otherwise construct an evolution
631 part for this loop. */
634 add_to_evolution_1 (unsigned loop_nb
, tree chrec_before
, tree to_add
,
637 tree type
, left
, right
;
638 struct loop
*loop
= get_loop (loop_nb
), *chloop
;
640 switch (TREE_CODE (chrec_before
))
642 case POLYNOMIAL_CHREC
:
643 chloop
= get_chrec_loop (chrec_before
);
645 || flow_loop_nested_p (chloop
, loop
))
649 type
= chrec_type (chrec_before
);
651 /* When there is no evolution part in this loop, build it. */
656 right
= SCALAR_FLOAT_TYPE_P (type
)
657 ? build_real (type
, dconst0
)
658 : build_int_cst (type
, 0);
662 var
= CHREC_VARIABLE (chrec_before
);
663 left
= CHREC_LEFT (chrec_before
);
664 right
= CHREC_RIGHT (chrec_before
);
667 to_add
= chrec_convert (type
, to_add
, at_stmt
);
668 right
= chrec_convert_rhs (type
, right
, at_stmt
);
669 right
= chrec_fold_plus (chrec_type (right
), right
, to_add
);
670 return build_polynomial_chrec (var
, left
, right
);
674 gcc_assert (flow_loop_nested_p (loop
, chloop
));
676 /* Search the evolution in LOOP_NB. */
677 left
= add_to_evolution_1 (loop_nb
, CHREC_LEFT (chrec_before
),
679 right
= CHREC_RIGHT (chrec_before
);
680 right
= chrec_convert_rhs (chrec_type (left
), right
, at_stmt
);
681 return build_polynomial_chrec (CHREC_VARIABLE (chrec_before
),
686 /* These nodes do not depend on a loop. */
687 if (chrec_before
== chrec_dont_know
)
688 return chrec_dont_know
;
691 right
= chrec_convert_rhs (chrec_type (left
), to_add
, at_stmt
);
692 return build_polynomial_chrec (loop_nb
, left
, right
);
696 /* Add TO_ADD to the evolution part of CHREC_BEFORE in the dimension
699 Description (provided for completeness, for those who read code in
700 a plane, and for my poor 62 bytes brain that would have forgotten
701 all this in the next two or three months):
703 The algorithm of translation of programs from the SSA representation
704 into the chrecs syntax is based on a pattern matching. After having
705 reconstructed the overall tree expression for a loop, there are only
706 two cases that can arise:
708 1. a = loop-phi (init, a + expr)
709 2. a = loop-phi (init, expr)
711 where EXPR is either a scalar constant with respect to the analyzed
712 loop (this is a degree 0 polynomial), or an expression containing
713 other loop-phi definitions (these are higher degree polynomials).
720 | a = phi (init, a + 5)
727 | a = phi (inita, 2 * b + 3)
728 | b = phi (initb, b + 1)
731 For the first case, the semantics of the SSA representation is:
733 | a (x) = init + \sum_{j = 0}^{x - 1} expr (j)
735 that is, there is a loop index "x" that determines the scalar value
736 of the variable during the loop execution. During the first
737 iteration, the value is that of the initial condition INIT, while
738 during the subsequent iterations, it is the sum of the initial
739 condition with the sum of all the values of EXPR from the initial
740 iteration to the before last considered iteration.
742 For the second case, the semantics of the SSA program is:
744 | a (x) = init, if x = 0;
745 | expr (x - 1), otherwise.
747 The second case corresponds to the PEELED_CHREC, whose syntax is
748 close to the syntax of a loop-phi-node:
750 | phi (init, expr) vs. (init, expr)_x
752 The proof of the translation algorithm for the first case is a
753 proof by structural induction based on the degree of EXPR.
756 When EXPR is a constant with respect to the analyzed loop, or in
757 other words when EXPR is a polynomial of degree 0, the evolution of
758 the variable A in the loop is an affine function with an initial
759 condition INIT, and a step EXPR. In order to show this, we start
760 from the semantics of the SSA representation:
762 f (x) = init + \sum_{j = 0}^{x - 1} expr (j)
764 and since "expr (j)" is a constant with respect to "j",
766 f (x) = init + x * expr
768 Finally, based on the semantics of the pure sum chrecs, by
769 identification we get the corresponding chrecs syntax:
771 f (x) = init * \binom{x}{0} + expr * \binom{x}{1}
772 f (x) -> {init, +, expr}_x
775 Suppose that EXPR is a polynomial of degree N with respect to the
776 analyzed loop_x for which we have already determined that it is
777 written under the chrecs syntax:
779 | expr (x) -> {b_0, +, b_1, +, ..., +, b_{n-1}} (x)
781 We start from the semantics of the SSA program:
783 | f (x) = init + \sum_{j = 0}^{x - 1} expr (j)
785 | f (x) = init + \sum_{j = 0}^{x - 1}
786 | (b_0 * \binom{j}{0} + ... + b_{n-1} * \binom{j}{n-1})
788 | f (x) = init + \sum_{j = 0}^{x - 1}
789 | \sum_{k = 0}^{n - 1} (b_k * \binom{j}{k})
791 | f (x) = init + \sum_{k = 0}^{n - 1}
792 | (b_k * \sum_{j = 0}^{x - 1} \binom{j}{k})
794 | f (x) = init + \sum_{k = 0}^{n - 1}
795 | (b_k * \binom{x}{k + 1})
797 | f (x) = init + b_0 * \binom{x}{1} + ...
798 | + b_{n-1} * \binom{x}{n}
800 | f (x) = init * \binom{x}{0} + b_0 * \binom{x}{1} + ...
801 | + b_{n-1} * \binom{x}{n}
804 And finally from the definition of the chrecs syntax, we identify:
805 | f (x) -> {init, +, b_0, +, ..., +, b_{n-1}}_x
807 This shows the mechanism that stands behind the add_to_evolution
808 function. An important point is that the use of symbolic
809 parameters avoids the need of an analysis schedule.
816 | a = phi (inita, a + 2 + b)
817 | b = phi (initb, b + 1)
820 When analyzing "a", the algorithm keeps "b" symbolically:
822 | a -> {inita, +, 2 + b}_1
824 Then, after instantiation, the analyzer ends on the evolution:
826 | a -> {inita, +, 2 + initb, +, 1}_1
831 add_to_evolution (unsigned loop_nb
, tree chrec_before
, enum tree_code code
,
832 tree to_add
, tree at_stmt
)
834 tree type
= chrec_type (to_add
);
835 tree res
= NULL_TREE
;
837 if (to_add
== NULL_TREE
)
840 /* TO_ADD is either a scalar, or a parameter. TO_ADD is not
841 instantiated at this point. */
842 if (TREE_CODE (to_add
) == POLYNOMIAL_CHREC
)
843 /* This should not happen. */
844 return chrec_dont_know
;
846 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
848 fprintf (dump_file
, "(add_to_evolution \n");
849 fprintf (dump_file
, " (loop_nb = %d)\n", loop_nb
);
850 fprintf (dump_file
, " (chrec_before = ");
851 print_generic_expr (dump_file
, chrec_before
, 0);
852 fprintf (dump_file
, ")\n (to_add = ");
853 print_generic_expr (dump_file
, to_add
, 0);
854 fprintf (dump_file
, ")\n");
857 if (code
== MINUS_EXPR
)
858 to_add
= chrec_fold_multiply (type
, to_add
, SCALAR_FLOAT_TYPE_P (type
)
859 ? build_real (type
, dconstm1
)
860 : build_int_cst_type (type
, -1));
862 res
= add_to_evolution_1 (loop_nb
, chrec_before
, to_add
, at_stmt
);
864 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
866 fprintf (dump_file
, " (res = ");
867 print_generic_expr (dump_file
, res
, 0);
868 fprintf (dump_file
, "))\n");
874 /* Helper function. */
877 set_nb_iterations_in_loop (struct loop
*loop
,
880 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
882 fprintf (dump_file
, " (set_nb_iterations_in_loop = ");
883 print_generic_expr (dump_file
, res
, 0);
884 fprintf (dump_file
, "))\n");
887 loop
->nb_iterations
= res
;
893 /* This section selects the loops that will be good candidates for the
894 scalar evolution analysis. For the moment, greedily select all the
895 loop nests we could analyze. */
897 /* Return true when it is possible to analyze the condition expression
901 analyzable_condition (const_tree expr
)
905 if (TREE_CODE (expr
) != COND_EXPR
)
908 condition
= TREE_OPERAND (expr
, 0);
910 switch (TREE_CODE (condition
))
930 /* For a loop with a single exit edge, return the COND_EXPR that
931 guards the exit edge. If the expression is too difficult to
932 analyze, then give up. */
935 get_loop_exit_condition (const struct loop
*loop
)
937 tree res
= NULL_TREE
;
938 edge exit_edge
= single_exit (loop
);
940 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
941 fprintf (dump_file
, "(get_loop_exit_condition \n ");
947 expr
= last_stmt (exit_edge
->src
);
948 if (analyzable_condition (expr
))
952 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
954 print_generic_expr (dump_file
, res
, 0);
955 fprintf (dump_file
, ")\n");
961 /* Recursively determine and enqueue the exit conditions for a loop. */
964 get_exit_conditions_rec (struct loop
*loop
,
965 VEC(tree
,heap
) **exit_conditions
)
970 /* Recurse on the inner loops, then on the next (sibling) loops. */
971 get_exit_conditions_rec (loop
->inner
, exit_conditions
);
972 get_exit_conditions_rec (loop
->next
, exit_conditions
);
974 if (single_exit (loop
))
976 tree loop_condition
= get_loop_exit_condition (loop
);
979 VEC_safe_push (tree
, heap
, *exit_conditions
, loop_condition
);
983 /* Select the candidate loop nests for the analysis. This function
984 initializes the EXIT_CONDITIONS array. */
987 select_loops_exit_conditions (VEC(tree
,heap
) **exit_conditions
)
989 struct loop
*function_body
= current_loops
->tree_root
;
991 get_exit_conditions_rec (function_body
->inner
, exit_conditions
);
995 /* Depth first search algorithm. */
997 typedef enum t_bool
{
1004 static t_bool
follow_ssa_edge (struct loop
*loop
, tree
, tree
, tree
*, int);
1006 /* Follow the ssa edge into the right hand side RHS of an assignment.
1007 Return true if the strongly connected component has been found. */
1010 follow_ssa_edge_in_rhs (struct loop
*loop
, tree at_stmt
, tree rhs
,
1011 tree halting_phi
, tree
*evolution_of_loop
, int limit
)
1013 t_bool res
= t_false
;
1015 tree type_rhs
= TREE_TYPE (rhs
);
1017 enum tree_code code
;
1019 /* The RHS is one of the following cases:
1023 - a POINTER_PLUS_EXPR,
1026 - other cases are not yet handled. */
1027 code
= TREE_CODE (rhs
);
1031 /* This assignment is under the form "a_1 = (cast) rhs. */
1032 res
= follow_ssa_edge_in_rhs (loop
, at_stmt
, TREE_OPERAND (rhs
, 0),
1033 halting_phi
, evolution_of_loop
, limit
);
1034 *evolution_of_loop
= chrec_convert (TREE_TYPE (rhs
),
1035 *evolution_of_loop
, at_stmt
);
1039 /* This assignment is under the form "a_1 = 7". */
1044 /* This assignment is under the form: "a_1 = b_2". */
1045 res
= follow_ssa_edge
1046 (loop
, SSA_NAME_DEF_STMT (rhs
), halting_phi
, evolution_of_loop
, limit
);
1049 case POINTER_PLUS_EXPR
:
1051 /* This case is under the form "rhs0 + rhs1". */
1052 rhs0
= TREE_OPERAND (rhs
, 0);
1053 rhs1
= TREE_OPERAND (rhs
, 1);
1054 STRIP_TYPE_NOPS (rhs0
);
1055 STRIP_TYPE_NOPS (rhs1
);
1057 if (TREE_CODE (rhs0
) == SSA_NAME
)
1059 if (TREE_CODE (rhs1
) == SSA_NAME
)
1061 /* Match an assignment under the form:
1064 /* We want only assignments of form "name + name" contribute to
1065 LIMIT, as the other cases do not necessarily contribute to
1066 the complexity of the expression. */
1069 evol
= *evolution_of_loop
;
1070 res
= follow_ssa_edge
1071 (loop
, SSA_NAME_DEF_STMT (rhs0
), halting_phi
,
1075 *evolution_of_loop
= add_to_evolution
1077 chrec_convert (type_rhs
, evol
, at_stmt
),
1078 code
, rhs1
, at_stmt
);
1080 else if (res
== t_false
)
1082 res
= follow_ssa_edge
1083 (loop
, SSA_NAME_DEF_STMT (rhs1
), halting_phi
,
1084 evolution_of_loop
, limit
);
1087 *evolution_of_loop
= add_to_evolution
1089 chrec_convert (type_rhs
, *evolution_of_loop
, at_stmt
),
1090 code
, rhs0
, at_stmt
);
1092 else if (res
== t_dont_know
)
1093 *evolution_of_loop
= chrec_dont_know
;
1096 else if (res
== t_dont_know
)
1097 *evolution_of_loop
= chrec_dont_know
;
1102 /* Match an assignment under the form:
1104 res
= follow_ssa_edge
1105 (loop
, SSA_NAME_DEF_STMT (rhs0
), halting_phi
,
1106 evolution_of_loop
, limit
);
1108 *evolution_of_loop
= add_to_evolution
1109 (loop
->num
, chrec_convert (type_rhs
, *evolution_of_loop
,
1111 code
, rhs1
, at_stmt
);
1113 else if (res
== t_dont_know
)
1114 *evolution_of_loop
= chrec_dont_know
;
1118 else if (TREE_CODE (rhs1
) == SSA_NAME
)
1120 /* Match an assignment under the form:
1122 res
= follow_ssa_edge
1123 (loop
, SSA_NAME_DEF_STMT (rhs1
), halting_phi
,
1124 evolution_of_loop
, limit
);
1126 *evolution_of_loop
= add_to_evolution
1127 (loop
->num
, chrec_convert (type_rhs
, *evolution_of_loop
,
1129 code
, rhs0
, at_stmt
);
1131 else if (res
== t_dont_know
)
1132 *evolution_of_loop
= chrec_dont_know
;
1136 /* Otherwise, match an assignment under the form:
1138 /* And there is nothing to do. */
1144 /* This case is under the form "opnd0 = rhs0 - rhs1". */
1145 rhs0
= TREE_OPERAND (rhs
, 0);
1146 rhs1
= TREE_OPERAND (rhs
, 1);
1147 STRIP_TYPE_NOPS (rhs0
);
1148 STRIP_TYPE_NOPS (rhs1
);
1150 if (TREE_CODE (rhs0
) == SSA_NAME
)
1152 /* Match an assignment under the form:
1155 /* We want only assignments of form "name - name" contribute to
1156 LIMIT, as the other cases do not necessarily contribute to
1157 the complexity of the expression. */
1158 if (TREE_CODE (rhs1
) == SSA_NAME
)
1161 res
= follow_ssa_edge (loop
, SSA_NAME_DEF_STMT (rhs0
), halting_phi
,
1162 evolution_of_loop
, limit
);
1164 *evolution_of_loop
= add_to_evolution
1165 (loop
->num
, chrec_convert (type_rhs
, *evolution_of_loop
, at_stmt
),
1166 MINUS_EXPR
, rhs1
, at_stmt
);
1168 else if (res
== t_dont_know
)
1169 *evolution_of_loop
= chrec_dont_know
;
1172 /* Otherwise, match an assignment under the form:
1174 /* And there is nothing to do. */
1181 /* This assignment is of the form: "a_1 = ASSERT_EXPR <a_2, ...>"
1182 It must be handled as a copy assignment of the form a_1 = a_2. */
1183 tree op0
= ASSERT_EXPR_VAR (rhs
);
1184 if (TREE_CODE (op0
) == SSA_NAME
)
1185 res
= follow_ssa_edge (loop
, SSA_NAME_DEF_STMT (op0
),
1186 halting_phi
, evolution_of_loop
, limit
);
1201 /* Checks whether the I-th argument of a PHI comes from a backedge. */
1204 backedge_phi_arg_p (const_tree phi
, int i
)
1206 const_edge e
= PHI_ARG_EDGE (phi
, i
);
1208 /* We would in fact like to test EDGE_DFS_BACK here, but we do not care
1209 about updating it anywhere, and this should work as well most of the
1211 if (e
->flags
& EDGE_IRREDUCIBLE_LOOP
)
1217 /* Helper function for one branch of the condition-phi-node. Return
1218 true if the strongly connected component has been found following
1221 static inline t_bool
1222 follow_ssa_edge_in_condition_phi_branch (int i
,
1226 tree
*evolution_of_branch
,
1227 tree init_cond
, int limit
)
1229 tree branch
= PHI_ARG_DEF (condition_phi
, i
);
1230 *evolution_of_branch
= chrec_dont_know
;
1232 /* Do not follow back edges (they must belong to an irreducible loop, which
1233 we really do not want to worry about). */
1234 if (backedge_phi_arg_p (condition_phi
, i
))
1237 if (TREE_CODE (branch
) == SSA_NAME
)
1239 *evolution_of_branch
= init_cond
;
1240 return follow_ssa_edge (loop
, SSA_NAME_DEF_STMT (branch
), halting_phi
,
1241 evolution_of_branch
, limit
);
1244 /* This case occurs when one of the condition branches sets
1245 the variable to a constant: i.e. a phi-node like
1246 "a_2 = PHI <a_7(5), 2(6)>;".
1248 FIXME: This case have to be refined correctly:
1249 in some cases it is possible to say something better than
1250 chrec_dont_know, for example using a wrap-around notation. */
1254 /* This function merges the branches of a condition-phi-node in a
1258 follow_ssa_edge_in_condition_phi (struct loop
*loop
,
1261 tree
*evolution_of_loop
, int limit
)
1264 tree init
= *evolution_of_loop
;
1265 tree evolution_of_branch
;
1266 t_bool res
= follow_ssa_edge_in_condition_phi_branch (0, loop
, condition_phi
,
1268 &evolution_of_branch
,
1270 if (res
== t_false
|| res
== t_dont_know
)
1273 *evolution_of_loop
= evolution_of_branch
;
1275 /* If the phi node is just a copy, do not increase the limit. */
1276 if (PHI_NUM_ARGS (condition_phi
) > 1)
1279 for (i
= 1; i
< PHI_NUM_ARGS (condition_phi
); i
++)
1281 /* Quickly give up when the evolution of one of the branches is
1283 if (*evolution_of_loop
== chrec_dont_know
)
1286 res
= follow_ssa_edge_in_condition_phi_branch (i
, loop
, condition_phi
,
1288 &evolution_of_branch
,
1290 if (res
== t_false
|| res
== t_dont_know
)
1293 *evolution_of_loop
= chrec_merge (*evolution_of_loop
,
1294 evolution_of_branch
);
1300 /* Follow an SSA edge in an inner loop. It computes the overall
1301 effect of the loop, and following the symbolic initial conditions,
1302 it follows the edges in the parent loop. The inner loop is
1303 considered as a single statement. */
1306 follow_ssa_edge_inner_loop_phi (struct loop
*outer_loop
,
1309 tree
*evolution_of_loop
, int limit
)
1311 struct loop
*loop
= loop_containing_stmt (loop_phi_node
);
1312 tree ev
= analyze_scalar_evolution (loop
, PHI_RESULT (loop_phi_node
));
1314 /* Sometimes, the inner loop is too difficult to analyze, and the
1315 result of the analysis is a symbolic parameter. */
1316 if (ev
== PHI_RESULT (loop_phi_node
))
1318 t_bool res
= t_false
;
1321 for (i
= 0; i
< PHI_NUM_ARGS (loop_phi_node
); i
++)
1323 tree arg
= PHI_ARG_DEF (loop_phi_node
, i
);
1326 /* Follow the edges that exit the inner loop. */
1327 bb
= PHI_ARG_EDGE (loop_phi_node
, i
)->src
;
1328 if (!flow_bb_inside_loop_p (loop
, bb
))
1329 res
= follow_ssa_edge_in_rhs (outer_loop
, loop_phi_node
,
1331 evolution_of_loop
, limit
);
1336 /* If the path crosses this loop-phi, give up. */
1338 *evolution_of_loop
= chrec_dont_know
;
1343 /* Otherwise, compute the overall effect of the inner loop. */
1344 ev
= compute_overall_effect_of_inner_loop (loop
, ev
);
1345 return follow_ssa_edge_in_rhs (outer_loop
, loop_phi_node
, ev
, halting_phi
,
1346 evolution_of_loop
, limit
);
1349 /* Follow an SSA edge from a loop-phi-node to itself, constructing a
1350 path that is analyzed on the return walk. */
1353 follow_ssa_edge (struct loop
*loop
, tree def
, tree halting_phi
,
1354 tree
*evolution_of_loop
, int limit
)
1356 struct loop
*def_loop
;
1358 if (TREE_CODE (def
) == NOP_EXPR
)
1361 /* Give up if the path is longer than the MAX that we allow. */
1362 if (limit
> PARAM_VALUE (PARAM_SCEV_MAX_EXPR_SIZE
))
1365 def_loop
= loop_containing_stmt (def
);
1367 switch (TREE_CODE (def
))
1370 if (!loop_phi_node_p (def
))
1371 /* DEF is a condition-phi-node. Follow the branches, and
1372 record their evolutions. Finally, merge the collected
1373 information and set the approximation to the main
1375 return follow_ssa_edge_in_condition_phi
1376 (loop
, def
, halting_phi
, evolution_of_loop
, limit
);
1378 /* When the analyzed phi is the halting_phi, the
1379 depth-first search is over: we have found a path from
1380 the halting_phi to itself in the loop. */
1381 if (def
== halting_phi
)
1384 /* Otherwise, the evolution of the HALTING_PHI depends
1385 on the evolution of another loop-phi-node, i.e. the
1386 evolution function is a higher degree polynomial. */
1387 if (def_loop
== loop
)
1391 if (flow_loop_nested_p (loop
, def_loop
))
1392 return follow_ssa_edge_inner_loop_phi
1393 (loop
, def
, halting_phi
, evolution_of_loop
, limit
+ 1);
1398 case GIMPLE_MODIFY_STMT
:
1399 return follow_ssa_edge_in_rhs (loop
, def
,
1400 GIMPLE_STMT_OPERAND (def
, 1),
1402 evolution_of_loop
, limit
);
1405 /* At this level of abstraction, the program is just a set
1406 of GIMPLE_MODIFY_STMTs and PHI_NODEs. In principle there is no
1407 other node to be handled. */
1414 /* Given a LOOP_PHI_NODE, this function determines the evolution
1415 function from LOOP_PHI_NODE to LOOP_PHI_NODE in the loop. */
1418 analyze_evolution_in_loop (tree loop_phi_node
,
1422 tree evolution_function
= chrec_not_analyzed_yet
;
1423 struct loop
*loop
= loop_containing_stmt (loop_phi_node
);
1426 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1428 fprintf (dump_file
, "(analyze_evolution_in_loop \n");
1429 fprintf (dump_file
, " (loop_phi_node = ");
1430 print_generic_expr (dump_file
, loop_phi_node
, 0);
1431 fprintf (dump_file
, ")\n");
1434 for (i
= 0; i
< PHI_NUM_ARGS (loop_phi_node
); i
++)
1436 tree arg
= PHI_ARG_DEF (loop_phi_node
, i
);
1437 tree ssa_chain
, ev_fn
;
1440 /* Select the edges that enter the loop body. */
1441 bb
= PHI_ARG_EDGE (loop_phi_node
, i
)->src
;
1442 if (!flow_bb_inside_loop_p (loop
, bb
))
1445 if (TREE_CODE (arg
) == SSA_NAME
)
1447 ssa_chain
= SSA_NAME_DEF_STMT (arg
);
1449 /* Pass in the initial condition to the follow edge function. */
1451 res
= follow_ssa_edge (loop
, ssa_chain
, loop_phi_node
, &ev_fn
, 0);
1456 /* When it is impossible to go back on the same
1457 loop_phi_node by following the ssa edges, the
1458 evolution is represented by a peeled chrec, i.e. the
1459 first iteration, EV_FN has the value INIT_COND, then
1460 all the other iterations it has the value of ARG.
1461 For the moment, PEELED_CHREC nodes are not built. */
1463 ev_fn
= chrec_dont_know
;
1465 /* When there are multiple back edges of the loop (which in fact never
1466 happens currently, but nevertheless), merge their evolutions. */
1467 evolution_function
= chrec_merge (evolution_function
, ev_fn
);
1470 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1472 fprintf (dump_file
, " (evolution_function = ");
1473 print_generic_expr (dump_file
, evolution_function
, 0);
1474 fprintf (dump_file
, "))\n");
1477 return evolution_function
;
1480 /* Given a loop-phi-node, return the initial conditions of the
1481 variable on entry of the loop. When the CCP has propagated
1482 constants into the loop-phi-node, the initial condition is
1483 instantiated, otherwise the initial condition is kept symbolic.
1484 This analyzer does not analyze the evolution outside the current
1485 loop, and leaves this task to the on-demand tree reconstructor. */
1488 analyze_initial_condition (tree loop_phi_node
)
1491 tree init_cond
= chrec_not_analyzed_yet
;
1492 struct loop
*loop
= bb_for_stmt (loop_phi_node
)->loop_father
;
1494 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1496 fprintf (dump_file
, "(analyze_initial_condition \n");
1497 fprintf (dump_file
, " (loop_phi_node = \n");
1498 print_generic_expr (dump_file
, loop_phi_node
, 0);
1499 fprintf (dump_file
, ")\n");
1502 for (i
= 0; i
< PHI_NUM_ARGS (loop_phi_node
); i
++)
1504 tree branch
= PHI_ARG_DEF (loop_phi_node
, i
);
1505 basic_block bb
= PHI_ARG_EDGE (loop_phi_node
, i
)->src
;
1507 /* When the branch is oriented to the loop's body, it does
1508 not contribute to the initial condition. */
1509 if (flow_bb_inside_loop_p (loop
, bb
))
1512 if (init_cond
== chrec_not_analyzed_yet
)
1518 if (TREE_CODE (branch
) == SSA_NAME
)
1520 init_cond
= chrec_dont_know
;
1524 init_cond
= chrec_merge (init_cond
, branch
);
1527 /* Ooops -- a loop without an entry??? */
1528 if (init_cond
== chrec_not_analyzed_yet
)
1529 init_cond
= chrec_dont_know
;
1531 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1533 fprintf (dump_file
, " (init_cond = ");
1534 print_generic_expr (dump_file
, init_cond
, 0);
1535 fprintf (dump_file
, "))\n");
1541 /* Analyze the scalar evolution for LOOP_PHI_NODE. */
1544 interpret_loop_phi (struct loop
*loop
, tree loop_phi_node
)
1547 struct loop
*phi_loop
= loop_containing_stmt (loop_phi_node
);
1550 if (phi_loop
!= loop
)
1552 struct loop
*subloop
;
1553 tree evolution_fn
= analyze_scalar_evolution
1554 (phi_loop
, PHI_RESULT (loop_phi_node
));
1556 /* Dive one level deeper. */
1557 subloop
= superloop_at_depth (phi_loop
, loop_depth (loop
) + 1);
1559 /* Interpret the subloop. */
1560 res
= compute_overall_effect_of_inner_loop (subloop
, evolution_fn
);
1564 /* Otherwise really interpret the loop phi. */
1565 init_cond
= analyze_initial_condition (loop_phi_node
);
1566 res
= analyze_evolution_in_loop (loop_phi_node
, init_cond
);
1571 /* This function merges the branches of a condition-phi-node,
1572 contained in the outermost loop, and whose arguments are already
1576 interpret_condition_phi (struct loop
*loop
, tree condition_phi
)
1579 tree res
= chrec_not_analyzed_yet
;
1581 for (i
= 0; i
< PHI_NUM_ARGS (condition_phi
); i
++)
1585 if (backedge_phi_arg_p (condition_phi
, i
))
1587 res
= chrec_dont_know
;
1591 branch_chrec
= analyze_scalar_evolution
1592 (loop
, PHI_ARG_DEF (condition_phi
, i
));
1594 res
= chrec_merge (res
, branch_chrec
);
1600 /* Interpret the right hand side of a GIMPLE_MODIFY_STMT OPND1. If we didn't
1601 analyze this node before, follow the definitions until ending
1602 either on an analyzed GIMPLE_MODIFY_STMT, or on a loop-phi-node. On the
1603 return path, this function propagates evolutions (ala constant copy
1604 propagation). OPND1 is not a GIMPLE expression because we could
1605 analyze the effect of an inner loop: see interpret_loop_phi. */
1608 interpret_rhs_modify_stmt (struct loop
*loop
, tree at_stmt
,
1609 tree opnd1
, tree type
)
1611 tree res
, opnd10
, opnd11
, chrec10
, chrec11
;
1613 if (is_gimple_min_invariant (opnd1
))
1614 return chrec_convert (type
, opnd1
, at_stmt
);
1616 switch (TREE_CODE (opnd1
))
1618 case POINTER_PLUS_EXPR
:
1619 opnd10
= TREE_OPERAND (opnd1
, 0);
1620 opnd11
= TREE_OPERAND (opnd1
, 1);
1621 chrec10
= analyze_scalar_evolution (loop
, opnd10
);
1622 chrec11
= analyze_scalar_evolution (loop
, opnd11
);
1623 chrec10
= chrec_convert (type
, chrec10
, at_stmt
);
1624 chrec11
= chrec_convert (sizetype
, chrec11
, at_stmt
);
1625 res
= chrec_fold_plus (type
, chrec10
, chrec11
);
1629 opnd10
= TREE_OPERAND (opnd1
, 0);
1630 opnd11
= TREE_OPERAND (opnd1
, 1);
1631 chrec10
= analyze_scalar_evolution (loop
, opnd10
);
1632 chrec11
= analyze_scalar_evolution (loop
, opnd11
);
1633 chrec10
= chrec_convert (type
, chrec10
, at_stmt
);
1634 chrec11
= chrec_convert (type
, chrec11
, at_stmt
);
1635 res
= chrec_fold_plus (type
, chrec10
, chrec11
);
1639 opnd10
= TREE_OPERAND (opnd1
, 0);
1640 opnd11
= TREE_OPERAND (opnd1
, 1);
1641 chrec10
= analyze_scalar_evolution (loop
, opnd10
);
1642 chrec11
= analyze_scalar_evolution (loop
, opnd11
);
1643 chrec10
= chrec_convert (type
, chrec10
, at_stmt
);
1644 chrec11
= chrec_convert (type
, chrec11
, at_stmt
);
1645 res
= chrec_fold_minus (type
, chrec10
, chrec11
);
1649 opnd10
= TREE_OPERAND (opnd1
, 0);
1650 chrec10
= analyze_scalar_evolution (loop
, opnd10
);
1651 chrec10
= chrec_convert (type
, chrec10
, at_stmt
);
1652 /* TYPE may be integer, real or complex, so use fold_convert. */
1653 res
= chrec_fold_multiply (type
, chrec10
,
1654 fold_convert (type
, integer_minus_one_node
));
1658 opnd10
= TREE_OPERAND (opnd1
, 0);
1659 opnd11
= TREE_OPERAND (opnd1
, 1);
1660 chrec10
= analyze_scalar_evolution (loop
, opnd10
);
1661 chrec11
= analyze_scalar_evolution (loop
, opnd11
);
1662 chrec10
= chrec_convert (type
, chrec10
, at_stmt
);
1663 chrec11
= chrec_convert (type
, chrec11
, at_stmt
);
1664 res
= chrec_fold_multiply (type
, chrec10
, chrec11
);
1668 res
= chrec_convert (type
, analyze_scalar_evolution (loop
, opnd1
),
1673 opnd10
= ASSERT_EXPR_VAR (opnd1
);
1674 res
= chrec_convert (type
, analyze_scalar_evolution (loop
, opnd10
),
1680 opnd10
= TREE_OPERAND (opnd1
, 0);
1681 chrec10
= analyze_scalar_evolution (loop
, opnd10
);
1682 res
= chrec_convert (type
, chrec10
, at_stmt
);
1686 res
= chrec_dont_know
;
1695 /* This section contains all the entry points:
1696 - number_of_iterations_in_loop,
1697 - analyze_scalar_evolution,
1698 - instantiate_parameters.
1701 /* Compute and return the evolution function in WRTO_LOOP, the nearest
1702 common ancestor of DEF_LOOP and USE_LOOP. */
1705 compute_scalar_evolution_in_loop (struct loop
*wrto_loop
,
1706 struct loop
*def_loop
,
1710 if (def_loop
== wrto_loop
)
1713 def_loop
= superloop_at_depth (def_loop
, loop_depth (wrto_loop
) + 1);
1714 res
= compute_overall_effect_of_inner_loop (def_loop
, ev
);
1716 return analyze_scalar_evolution_1 (wrto_loop
, res
, chrec_not_analyzed_yet
);
1719 /* Helper recursive function. */
1722 analyze_scalar_evolution_1 (struct loop
*loop
, tree var
, tree res
)
1724 tree def
, type
= TREE_TYPE (var
);
1726 struct loop
*def_loop
;
1728 if (loop
== NULL
|| TREE_CODE (type
) == VECTOR_TYPE
)
1729 return chrec_dont_know
;
1731 if (TREE_CODE (var
) != SSA_NAME
)
1732 return interpret_rhs_modify_stmt (loop
, NULL_TREE
, var
, type
);
1734 def
= SSA_NAME_DEF_STMT (var
);
1735 bb
= bb_for_stmt (def
);
1736 def_loop
= bb
? bb
->loop_father
: NULL
;
1739 || !flow_bb_inside_loop_p (loop
, bb
))
1741 /* Keep the symbolic form. */
1746 if (res
!= chrec_not_analyzed_yet
)
1748 if (loop
!= bb
->loop_father
)
1749 res
= compute_scalar_evolution_in_loop
1750 (find_common_loop (loop
, bb
->loop_father
), bb
->loop_father
, res
);
1755 if (loop
!= def_loop
)
1757 res
= analyze_scalar_evolution_1 (def_loop
, var
, chrec_not_analyzed_yet
);
1758 res
= compute_scalar_evolution_in_loop (loop
, def_loop
, res
);
1763 switch (TREE_CODE (def
))
1765 case GIMPLE_MODIFY_STMT
:
1766 res
= interpret_rhs_modify_stmt (loop
, def
,
1767 GIMPLE_STMT_OPERAND (def
, 1), type
);
1771 if (loop_phi_node_p (def
))
1772 res
= interpret_loop_phi (loop
, def
);
1774 res
= interpret_condition_phi (loop
, def
);
1778 res
= chrec_dont_know
;
1784 /* Keep the symbolic form. */
1785 if (res
== chrec_dont_know
)
1788 if (loop
== def_loop
)
1789 set_scalar_evolution (var
, res
);
1794 /* Entry point for the scalar evolution analyzer.
1795 Analyzes and returns the scalar evolution of the ssa_name VAR.
1796 LOOP_NB is the identifier number of the loop in which the variable
1799 Example of use: having a pointer VAR to a SSA_NAME node, STMT a
1800 pointer to the statement that uses this variable, in order to
1801 determine the evolution function of the variable, use the following
1804 unsigned loop_nb = loop_containing_stmt (stmt)->num;
1805 tree chrec_with_symbols = analyze_scalar_evolution (loop_nb, var);
1806 tree chrec_instantiated = instantiate_parameters
1807 (loop_nb, chrec_with_symbols);
1811 analyze_scalar_evolution (struct loop
*loop
, tree var
)
1815 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1817 fprintf (dump_file
, "(analyze_scalar_evolution \n");
1818 fprintf (dump_file
, " (loop_nb = %d)\n", loop
->num
);
1819 fprintf (dump_file
, " (scalar = ");
1820 print_generic_expr (dump_file
, var
, 0);
1821 fprintf (dump_file
, ")\n");
1824 res
= analyze_scalar_evolution_1 (loop
, var
, get_scalar_evolution (var
));
1826 if (TREE_CODE (var
) == SSA_NAME
&& res
== chrec_dont_know
)
1829 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1830 fprintf (dump_file
, ")\n");
1835 /* Analyze scalar evolution of use of VERSION in USE_LOOP with respect to
1836 WRTO_LOOP (which should be a superloop of both USE_LOOP and definition
1839 FOLDED_CASTS is set to true if resolve_mixers used
1840 chrec_convert_aggressive (TODO -- not really, we are way too conservative
1841 at the moment in order to keep things simple). */
1844 analyze_scalar_evolution_in_loop (struct loop
*wrto_loop
, struct loop
*use_loop
,
1845 tree version
, bool *folded_casts
)
1848 tree ev
= version
, tmp
;
1851 *folded_casts
= false;
1854 tmp
= analyze_scalar_evolution (use_loop
, ev
);
1855 ev
= resolve_mixers (use_loop
, tmp
);
1857 if (folded_casts
&& tmp
!= ev
)
1858 *folded_casts
= true;
1860 if (use_loop
== wrto_loop
)
1863 /* If the value of the use changes in the inner loop, we cannot express
1864 its value in the outer loop (we might try to return interval chrec,
1865 but we do not have a user for it anyway) */
1866 if (!no_evolution_in_loop_p (ev
, use_loop
->num
, &val
)
1868 return chrec_dont_know
;
1870 use_loop
= loop_outer (use_loop
);
1874 /* Returns instantiated value for VERSION in CACHE. */
1877 get_instantiated_value (htab_t cache
, tree version
)
1879 struct scev_info_str
*info
, pattern
;
1881 pattern
.var
= version
;
1882 info
= (struct scev_info_str
*) htab_find (cache
, &pattern
);
1890 /* Sets instantiated value for VERSION to VAL in CACHE. */
1893 set_instantiated_value (htab_t cache
, tree version
, tree val
)
1895 struct scev_info_str
*info
, pattern
;
1898 pattern
.var
= version
;
1899 slot
= htab_find_slot (cache
, &pattern
, INSERT
);
1902 *slot
= new_scev_info_str (version
);
1903 info
= (struct scev_info_str
*) *slot
;
1907 /* Return the closed_loop_phi node for VAR. If there is none, return
1911 loop_closed_phi_def (tree var
)
1917 if (var
== NULL_TREE
1918 || TREE_CODE (var
) != SSA_NAME
)
1921 loop
= loop_containing_stmt (SSA_NAME_DEF_STMT (var
));
1922 exit
= single_exit (loop
);
1926 for (phi
= phi_nodes (exit
->dest
); phi
; phi
= PHI_CHAIN (phi
))
1927 if (PHI_ARG_DEF_FROM_EDGE (phi
, exit
) == var
)
1928 return PHI_RESULT (phi
);
1933 /* Analyze all the parameters of the chrec that were left under a symbolic form,
1934 with respect to LOOP. CHREC is the chrec to instantiate. CACHE is the cache
1935 of already instantiated values. FLAGS modify the way chrecs are
1936 instantiated. SIZE_EXPR is used for computing the size of the expression to
1937 be instantiated, and to stop if it exceeds some limit. */
1939 /* Values for FLAGS. */
1942 INSERT_SUPERLOOP_CHRECS
= 1, /* Loop invariants are replaced with chrecs
1944 FOLD_CONVERSIONS
= 2 /* The conversions that may wrap in
1945 signed/pointer type are folded, as long as the
1946 value of the chrec is preserved. */
1950 instantiate_parameters_1 (struct loop
*loop
, tree chrec
, int flags
, htab_t cache
,
1953 tree res
, op0
, op1
, op2
;
1955 struct loop
*def_loop
;
1956 tree type
= chrec_type (chrec
);
1958 /* Give up if the expression is larger than the MAX that we allow. */
1959 if (size_expr
++ > PARAM_VALUE (PARAM_SCEV_MAX_EXPR_SIZE
))
1960 return chrec_dont_know
;
1962 if (automatically_generated_chrec_p (chrec
)
1963 || is_gimple_min_invariant (chrec
))
1966 switch (TREE_CODE (chrec
))
1969 def_bb
= bb_for_stmt (SSA_NAME_DEF_STMT (chrec
));
1971 /* A parameter (or loop invariant and we do not want to include
1972 evolutions in outer loops), nothing to do. */
1974 || (!(flags
& INSERT_SUPERLOOP_CHRECS
)
1975 && !flow_bb_inside_loop_p (loop
, def_bb
)))
1978 /* We cache the value of instantiated variable to avoid exponential
1979 time complexity due to reevaluations. We also store the convenient
1980 value in the cache in order to prevent infinite recursion -- we do
1981 not want to instantiate the SSA_NAME if it is in a mixer
1982 structure. This is used for avoiding the instantiation of
1983 recursively defined functions, such as:
1985 | a_2 -> {0, +, 1, +, a_2}_1 */
1987 res
= get_instantiated_value (cache
, chrec
);
1991 /* Store the convenient value for chrec in the structure. If it
1992 is defined outside of the loop, we may just leave it in symbolic
1993 form, otherwise we need to admit that we do not know its behavior
1995 res
= !flow_bb_inside_loop_p (loop
, def_bb
) ? chrec
: chrec_dont_know
;
1996 set_instantiated_value (cache
, chrec
, res
);
1998 /* To make things even more complicated, instantiate_parameters_1
1999 calls analyze_scalar_evolution that may call # of iterations
2000 analysis that may in turn call instantiate_parameters_1 again.
2001 To prevent the infinite recursion, keep also the bitmap of
2002 ssa names that are being instantiated globally. */
2003 if (bitmap_bit_p (already_instantiated
, SSA_NAME_VERSION (chrec
)))
2006 def_loop
= find_common_loop (loop
, def_bb
->loop_father
);
2008 /* If the analysis yields a parametric chrec, instantiate the
2010 bitmap_set_bit (already_instantiated
, SSA_NAME_VERSION (chrec
));
2011 res
= analyze_scalar_evolution (def_loop
, chrec
);
2013 /* Don't instantiate loop-closed-ssa phi nodes. */
2014 if (TREE_CODE (res
) == SSA_NAME
2015 && (loop_containing_stmt (SSA_NAME_DEF_STMT (res
)) == NULL
2016 || (loop_depth (loop_containing_stmt (SSA_NAME_DEF_STMT (res
)))
2017 > loop_depth (def_loop
))))
2020 res
= loop_closed_phi_def (chrec
);
2024 if (res
== NULL_TREE
)
2025 res
= chrec_dont_know
;
2028 else if (res
!= chrec_dont_know
)
2029 res
= instantiate_parameters_1 (loop
, res
, flags
, cache
, size_expr
);
2031 bitmap_clear_bit (already_instantiated
, SSA_NAME_VERSION (chrec
));
2033 /* Store the correct value to the cache. */
2034 set_instantiated_value (cache
, chrec
, res
);
2037 case POLYNOMIAL_CHREC
:
2038 op0
= instantiate_parameters_1 (loop
, CHREC_LEFT (chrec
),
2039 flags
, cache
, size_expr
);
2040 if (op0
== chrec_dont_know
)
2041 return chrec_dont_know
;
2043 op1
= instantiate_parameters_1 (loop
, CHREC_RIGHT (chrec
),
2044 flags
, cache
, size_expr
);
2045 if (op1
== chrec_dont_know
)
2046 return chrec_dont_know
;
2048 if (CHREC_LEFT (chrec
) != op0
2049 || CHREC_RIGHT (chrec
) != op1
)
2051 op1
= chrec_convert_rhs (chrec_type (op0
), op1
, NULL_TREE
);
2052 chrec
= build_polynomial_chrec (CHREC_VARIABLE (chrec
), op0
, op1
);
2056 case POINTER_PLUS_EXPR
:
2058 op0
= instantiate_parameters_1 (loop
, TREE_OPERAND (chrec
, 0),
2059 flags
, cache
, size_expr
);
2060 if (op0
== chrec_dont_know
)
2061 return chrec_dont_know
;
2063 op1
= instantiate_parameters_1 (loop
, TREE_OPERAND (chrec
, 1),
2064 flags
, cache
, size_expr
);
2065 if (op1
== chrec_dont_know
)
2066 return chrec_dont_know
;
2068 if (TREE_OPERAND (chrec
, 0) != op0
2069 || TREE_OPERAND (chrec
, 1) != op1
)
2071 op0
= chrec_convert (type
, op0
, NULL_TREE
);
2072 op1
= chrec_convert_rhs (type
, op1
, NULL_TREE
);
2073 chrec
= chrec_fold_plus (type
, op0
, op1
);
2078 op0
= instantiate_parameters_1 (loop
, TREE_OPERAND (chrec
, 0),
2079 flags
, cache
, size_expr
);
2080 if (op0
== chrec_dont_know
)
2081 return chrec_dont_know
;
2083 op1
= instantiate_parameters_1 (loop
, TREE_OPERAND (chrec
, 1),
2084 flags
, cache
, size_expr
);
2085 if (op1
== chrec_dont_know
)
2086 return chrec_dont_know
;
2088 if (TREE_OPERAND (chrec
, 0) != op0
2089 || TREE_OPERAND (chrec
, 1) != op1
)
2091 op0
= chrec_convert (type
, op0
, NULL_TREE
);
2092 op1
= chrec_convert (type
, op1
, NULL_TREE
);
2093 chrec
= chrec_fold_minus (type
, op0
, op1
);
2098 op0
= instantiate_parameters_1 (loop
, TREE_OPERAND (chrec
, 0),
2099 flags
, cache
, size_expr
);
2100 if (op0
== chrec_dont_know
)
2101 return chrec_dont_know
;
2103 op1
= instantiate_parameters_1 (loop
, TREE_OPERAND (chrec
, 1),
2104 flags
, cache
, size_expr
);
2105 if (op1
== chrec_dont_know
)
2106 return chrec_dont_know
;
2108 if (TREE_OPERAND (chrec
, 0) != op0
2109 || TREE_OPERAND (chrec
, 1) != op1
)
2111 op0
= chrec_convert (type
, op0
, NULL_TREE
);
2112 op1
= chrec_convert (type
, op1
, NULL_TREE
);
2113 chrec
= chrec_fold_multiply (type
, op0
, op1
);
2119 case NON_LVALUE_EXPR
:
2120 op0
= instantiate_parameters_1 (loop
, TREE_OPERAND (chrec
, 0),
2121 flags
, cache
, size_expr
);
2122 if (op0
== chrec_dont_know
)
2123 return chrec_dont_know
;
2125 if (flags
& FOLD_CONVERSIONS
)
2127 tree tmp
= chrec_convert_aggressive (TREE_TYPE (chrec
), op0
);
2132 if (op0
== TREE_OPERAND (chrec
, 0))
2135 /* If we used chrec_convert_aggressive, we can no longer assume that
2136 signed chrecs do not overflow, as chrec_convert does, so avoid
2137 calling it in that case. */
2138 if (flags
& FOLD_CONVERSIONS
)
2139 return fold_convert (TREE_TYPE (chrec
), op0
);
2141 return chrec_convert (TREE_TYPE (chrec
), op0
, NULL_TREE
);
2143 case SCEV_NOT_KNOWN
:
2144 return chrec_dont_know
;
2153 gcc_assert (!VL_EXP_CLASS_P (chrec
));
2154 switch (TREE_CODE_LENGTH (TREE_CODE (chrec
)))
2157 op0
= instantiate_parameters_1 (loop
, TREE_OPERAND (chrec
, 0),
2158 flags
, cache
, size_expr
);
2159 if (op0
== chrec_dont_know
)
2160 return chrec_dont_know
;
2162 op1
= instantiate_parameters_1 (loop
, TREE_OPERAND (chrec
, 1),
2163 flags
, cache
, size_expr
);
2164 if (op1
== chrec_dont_know
)
2165 return chrec_dont_know
;
2167 op2
= instantiate_parameters_1 (loop
, TREE_OPERAND (chrec
, 2),
2168 flags
, cache
, size_expr
);
2169 if (op2
== chrec_dont_know
)
2170 return chrec_dont_know
;
2172 if (op0
== TREE_OPERAND (chrec
, 0)
2173 && op1
== TREE_OPERAND (chrec
, 1)
2174 && op2
== TREE_OPERAND (chrec
, 2))
2177 return fold_build3 (TREE_CODE (chrec
),
2178 TREE_TYPE (chrec
), op0
, op1
, op2
);
2181 op0
= instantiate_parameters_1 (loop
, TREE_OPERAND (chrec
, 0),
2182 flags
, cache
, size_expr
);
2183 if (op0
== chrec_dont_know
)
2184 return chrec_dont_know
;
2186 op1
= instantiate_parameters_1 (loop
, TREE_OPERAND (chrec
, 1),
2187 flags
, cache
, size_expr
);
2188 if (op1
== chrec_dont_know
)
2189 return chrec_dont_know
;
2191 if (op0
== TREE_OPERAND (chrec
, 0)
2192 && op1
== TREE_OPERAND (chrec
, 1))
2194 return fold_build2 (TREE_CODE (chrec
), TREE_TYPE (chrec
), op0
, op1
);
2197 op0
= instantiate_parameters_1 (loop
, TREE_OPERAND (chrec
, 0),
2198 flags
, cache
, size_expr
);
2199 if (op0
== chrec_dont_know
)
2200 return chrec_dont_know
;
2201 if (op0
== TREE_OPERAND (chrec
, 0))
2203 return fold_build1 (TREE_CODE (chrec
), TREE_TYPE (chrec
), op0
);
2212 /* Too complicated to handle. */
2213 return chrec_dont_know
;
2216 /* Analyze all the parameters of the chrec that were left under a
2217 symbolic form. LOOP is the loop in which symbolic names have to
2218 be analyzed and instantiated. */
2221 instantiate_parameters (struct loop
*loop
,
2225 htab_t cache
= htab_create (10, hash_scev_info
, eq_scev_info
, del_scev_info
);
2227 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2229 fprintf (dump_file
, "(instantiate_parameters \n");
2230 fprintf (dump_file
, " (loop_nb = %d)\n", loop
->num
);
2231 fprintf (dump_file
, " (chrec = ");
2232 print_generic_expr (dump_file
, chrec
, 0);
2233 fprintf (dump_file
, ")\n");
2236 res
= instantiate_parameters_1 (loop
, chrec
, INSERT_SUPERLOOP_CHRECS
, cache
,
2239 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2241 fprintf (dump_file
, " (res = ");
2242 print_generic_expr (dump_file
, res
, 0);
2243 fprintf (dump_file
, "))\n");
2246 htab_delete (cache
);
2251 /* Similar to instantiate_parameters, but does not introduce the
2252 evolutions in outer loops for LOOP invariants in CHREC, and does not
2253 care about causing overflows, as long as they do not affect value
2254 of an expression. */
2257 resolve_mixers (struct loop
*loop
, tree chrec
)
2259 htab_t cache
= htab_create (10, hash_scev_info
, eq_scev_info
, del_scev_info
);
2260 tree ret
= instantiate_parameters_1 (loop
, chrec
, FOLD_CONVERSIONS
, cache
, 0);
2261 htab_delete (cache
);
2265 /* Entry point for the analysis of the number of iterations pass.
2266 This function tries to safely approximate the number of iterations
2267 the loop will run. When this property is not decidable at compile
2268 time, the result is chrec_dont_know. Otherwise the result is
2269 a scalar or a symbolic parameter.
2271 Example of analysis: suppose that the loop has an exit condition:
2273 "if (b > 49) goto end_loop;"
2275 and that in a previous analysis we have determined that the
2276 variable 'b' has an evolution function:
2278 "EF = {23, +, 5}_2".
2280 When we evaluate the function at the point 5, i.e. the value of the
2281 variable 'b' after 5 iterations in the loop, we have EF (5) = 48,
2282 and EF (6) = 53. In this case the value of 'b' on exit is '53' and
2283 the loop body has been executed 6 times. */
2286 number_of_latch_executions (struct loop
*loop
)
2290 struct tree_niter_desc niter_desc
;
2292 /* Determine whether the number_of_iterations_in_loop has already
2294 res
= loop
->nb_iterations
;
2297 res
= chrec_dont_know
;
2299 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2300 fprintf (dump_file
, "(number_of_iterations_in_loop\n");
2302 exit
= single_exit (loop
);
2306 if (!number_of_iterations_exit (loop
, exit
, &niter_desc
, false))
2309 type
= TREE_TYPE (niter_desc
.niter
);
2310 if (integer_nonzerop (niter_desc
.may_be_zero
))
2311 res
= build_int_cst (type
, 0);
2312 else if (integer_zerop (niter_desc
.may_be_zero
))
2313 res
= niter_desc
.niter
;
2315 res
= chrec_dont_know
;
2318 return set_nb_iterations_in_loop (loop
, res
);
2321 /* Returns the number of executions of the exit condition of LOOP,
2322 i.e., the number by one higher than number_of_latch_executions.
2323 Note that unline number_of_latch_executions, this number does
2324 not necessarily fit in the unsigned variant of the type of
2325 the control variable -- if the number of iterations is a constant,
2326 we return chrec_dont_know if adding one to number_of_latch_executions
2327 overflows; however, in case the number of iterations is symbolic
2328 expression, the caller is responsible for dealing with this
2329 the possible overflow. */
2332 number_of_exit_cond_executions (struct loop
*loop
)
2334 tree ret
= number_of_latch_executions (loop
);
2335 tree type
= chrec_type (ret
);
2337 if (chrec_contains_undetermined (ret
))
2340 ret
= chrec_fold_plus (type
, ret
, build_int_cst (type
, 1));
2341 if (TREE_CODE (ret
) == INTEGER_CST
2342 && TREE_OVERFLOW (ret
))
2343 return chrec_dont_know
;
2348 /* One of the drivers for testing the scalar evolutions analysis.
2349 This function computes the number of iterations for all the loops
2350 from the EXIT_CONDITIONS array. */
2353 number_of_iterations_for_all_loops (VEC(tree
,heap
) **exit_conditions
)
2356 unsigned nb_chrec_dont_know_loops
= 0;
2357 unsigned nb_static_loops
= 0;
2360 for (i
= 0; VEC_iterate (tree
, *exit_conditions
, i
, cond
); i
++)
2362 tree res
= number_of_latch_executions (loop_containing_stmt (cond
));
2363 if (chrec_contains_undetermined (res
))
2364 nb_chrec_dont_know_loops
++;
2371 fprintf (dump_file
, "\n(\n");
2372 fprintf (dump_file
, "-----------------------------------------\n");
2373 fprintf (dump_file
, "%d\tnb_chrec_dont_know_loops\n", nb_chrec_dont_know_loops
);
2374 fprintf (dump_file
, "%d\tnb_static_loops\n", nb_static_loops
);
2375 fprintf (dump_file
, "%d\tnb_total_loops\n", number_of_loops ());
2376 fprintf (dump_file
, "-----------------------------------------\n");
2377 fprintf (dump_file
, ")\n\n");
2379 print_loops (dump_file
, 3);
2385 /* Counters for the stats. */
2391 unsigned nb_affine_multivar
;
2392 unsigned nb_higher_poly
;
2393 unsigned nb_chrec_dont_know
;
2394 unsigned nb_undetermined
;
2397 /* Reset the counters. */
2400 reset_chrecs_counters (struct chrec_stats
*stats
)
2402 stats
->nb_chrecs
= 0;
2403 stats
->nb_affine
= 0;
2404 stats
->nb_affine_multivar
= 0;
2405 stats
->nb_higher_poly
= 0;
2406 stats
->nb_chrec_dont_know
= 0;
2407 stats
->nb_undetermined
= 0;
2410 /* Dump the contents of a CHREC_STATS structure. */
2413 dump_chrecs_stats (FILE *file
, struct chrec_stats
*stats
)
2415 fprintf (file
, "\n(\n");
2416 fprintf (file
, "-----------------------------------------\n");
2417 fprintf (file
, "%d\taffine univariate chrecs\n", stats
->nb_affine
);
2418 fprintf (file
, "%d\taffine multivariate chrecs\n", stats
->nb_affine_multivar
);
2419 fprintf (file
, "%d\tdegree greater than 2 polynomials\n",
2420 stats
->nb_higher_poly
);
2421 fprintf (file
, "%d\tchrec_dont_know chrecs\n", stats
->nb_chrec_dont_know
);
2422 fprintf (file
, "-----------------------------------------\n");
2423 fprintf (file
, "%d\ttotal chrecs\n", stats
->nb_chrecs
);
2424 fprintf (file
, "%d\twith undetermined coefficients\n",
2425 stats
->nb_undetermined
);
2426 fprintf (file
, "-----------------------------------------\n");
2427 fprintf (file
, "%d\tchrecs in the scev database\n",
2428 (int) htab_elements (scalar_evolution_info
));
2429 fprintf (file
, "%d\tsets in the scev database\n", nb_set_scev
);
2430 fprintf (file
, "%d\tgets in the scev database\n", nb_get_scev
);
2431 fprintf (file
, "-----------------------------------------\n");
2432 fprintf (file
, ")\n\n");
2435 /* Gather statistics about CHREC. */
2438 gather_chrec_stats (tree chrec
, struct chrec_stats
*stats
)
2440 if (dump_file
&& (dump_flags
& TDF_STATS
))
2442 fprintf (dump_file
, "(classify_chrec ");
2443 print_generic_expr (dump_file
, chrec
, 0);
2444 fprintf (dump_file
, "\n");
2449 if (chrec
== NULL_TREE
)
2451 stats
->nb_undetermined
++;
2455 switch (TREE_CODE (chrec
))
2457 case POLYNOMIAL_CHREC
:
2458 if (evolution_function_is_affine_p (chrec
))
2460 if (dump_file
&& (dump_flags
& TDF_STATS
))
2461 fprintf (dump_file
, " affine_univariate\n");
2464 else if (evolution_function_is_affine_multivariate_p (chrec
, 0))
2466 if (dump_file
&& (dump_flags
& TDF_STATS
))
2467 fprintf (dump_file
, " affine_multivariate\n");
2468 stats
->nb_affine_multivar
++;
2472 if (dump_file
&& (dump_flags
& TDF_STATS
))
2473 fprintf (dump_file
, " higher_degree_polynomial\n");
2474 stats
->nb_higher_poly
++;
2483 if (chrec_contains_undetermined (chrec
))
2485 if (dump_file
&& (dump_flags
& TDF_STATS
))
2486 fprintf (dump_file
, " undetermined\n");
2487 stats
->nb_undetermined
++;
2490 if (dump_file
&& (dump_flags
& TDF_STATS
))
2491 fprintf (dump_file
, ")\n");
2494 /* One of the drivers for testing the scalar evolutions analysis.
2495 This function analyzes the scalar evolution of all the scalars
2496 defined as loop phi nodes in one of the loops from the
2497 EXIT_CONDITIONS array.
2499 TODO Optimization: A loop is in canonical form if it contains only
2500 a single scalar loop phi node. All the other scalars that have an
2501 evolution in the loop are rewritten in function of this single
2502 index. This allows the parallelization of the loop. */
2505 analyze_scalar_evolution_for_all_loop_phi_nodes (VEC(tree
,heap
) **exit_conditions
)
2508 struct chrec_stats stats
;
2511 reset_chrecs_counters (&stats
);
2513 for (i
= 0; VEC_iterate (tree
, *exit_conditions
, i
, cond
); i
++)
2519 loop
= loop_containing_stmt (cond
);
2522 for (phi
= phi_nodes (bb
); phi
; phi
= PHI_CHAIN (phi
))
2523 if (is_gimple_reg (PHI_RESULT (phi
)))
2525 chrec
= instantiate_parameters
2527 analyze_scalar_evolution (loop
, PHI_RESULT (phi
)));
2529 if (dump_file
&& (dump_flags
& TDF_STATS
))
2530 gather_chrec_stats (chrec
, &stats
);
2534 if (dump_file
&& (dump_flags
& TDF_STATS
))
2535 dump_chrecs_stats (dump_file
, &stats
);
2538 /* Callback for htab_traverse, gathers information on chrecs in the
2542 gather_stats_on_scev_database_1 (void **slot
, void *stats
)
2544 struct scev_info_str
*entry
= (struct scev_info_str
*) *slot
;
2546 gather_chrec_stats (entry
->chrec
, (struct chrec_stats
*) stats
);
2551 /* Classify the chrecs of the whole database. */
2554 gather_stats_on_scev_database (void)
2556 struct chrec_stats stats
;
2561 reset_chrecs_counters (&stats
);
2563 htab_traverse (scalar_evolution_info
, gather_stats_on_scev_database_1
,
2566 dump_chrecs_stats (dump_file
, &stats
);
2574 initialize_scalar_evolutions_analyzer (void)
2576 /* The elements below are unique. */
2577 if (chrec_dont_know
== NULL_TREE
)
2579 chrec_not_analyzed_yet
= NULL_TREE
;
2580 chrec_dont_know
= make_node (SCEV_NOT_KNOWN
);
2581 chrec_known
= make_node (SCEV_KNOWN
);
2582 TREE_TYPE (chrec_dont_know
) = void_type_node
;
2583 TREE_TYPE (chrec_known
) = void_type_node
;
2587 /* Initialize the analysis of scalar evolutions for LOOPS. */
2590 scev_initialize (void)
2595 scalar_evolution_info
= htab_create_alloc (100,
2601 already_instantiated
= BITMAP_ALLOC (NULL
);
2603 initialize_scalar_evolutions_analyzer ();
2605 FOR_EACH_LOOP (li
, loop
, 0)
2607 loop
->nb_iterations
= NULL_TREE
;
2611 /* Clean the scalar evolution analysis cache, but preserve the cached
2612 numbers of iterations for the loops. */
2615 scev_reset_except_niters (void)
2617 if (scalar_evolution_info
)
2618 htab_empty (scalar_evolution_info
);
2621 /* Cleans up the information cached by the scalar evolutions analysis. */
2629 if (!scalar_evolution_info
|| !current_loops
)
2632 scev_reset_except_niters ();
2634 FOR_EACH_LOOP (li
, loop
, 0)
2636 loop
->nb_iterations
= NULL_TREE
;
2640 /* Checks whether OP behaves as a simple affine iv of LOOP in STMT and returns
2641 its base and step in IV if possible. If ALLOW_NONCONSTANT_STEP is true, we
2642 want step to be invariant in LOOP. Otherwise we require it to be an
2643 integer constant. IV->no_overflow is set to true if we are sure the iv cannot
2644 overflow (e.g. because it is computed in signed arithmetics). */
2647 simple_iv (struct loop
*loop
, tree stmt
, tree op
, affine_iv
*iv
,
2648 bool allow_nonconstant_step
)
2650 basic_block bb
= bb_for_stmt (stmt
);
2654 iv
->base
= NULL_TREE
;
2655 iv
->step
= NULL_TREE
;
2656 iv
->no_overflow
= false;
2658 type
= TREE_TYPE (op
);
2659 if (TREE_CODE (type
) != INTEGER_TYPE
2660 && TREE_CODE (type
) != POINTER_TYPE
)
2663 ev
= analyze_scalar_evolution_in_loop (loop
, bb
->loop_father
, op
,
2665 if (chrec_contains_undetermined (ev
))
2668 if (tree_does_not_contain_chrecs (ev
)
2669 && !chrec_contains_symbols_defined_in_loop (ev
, loop
->num
))
2672 iv
->step
= build_int_cst (TREE_TYPE (ev
), 0);
2673 iv
->no_overflow
= true;
2677 if (TREE_CODE (ev
) != POLYNOMIAL_CHREC
2678 || CHREC_VARIABLE (ev
) != (unsigned) loop
->num
)
2681 iv
->step
= CHREC_RIGHT (ev
);
2682 if (allow_nonconstant_step
)
2684 if (tree_contains_chrecs (iv
->step
, NULL
)
2685 || chrec_contains_symbols_defined_in_loop (iv
->step
, loop
->num
))
2688 else if (TREE_CODE (iv
->step
) != INTEGER_CST
)
2691 iv
->base
= CHREC_LEFT (ev
);
2692 if (tree_contains_chrecs (iv
->base
, NULL
)
2693 || chrec_contains_symbols_defined_in_loop (iv
->base
, loop
->num
))
2696 iv
->no_overflow
= !folded_casts
&& TYPE_OVERFLOW_UNDEFINED (type
);
2701 /* Runs the analysis of scalar evolutions. */
2704 scev_analysis (void)
2706 VEC(tree
,heap
) *exit_conditions
;
2708 exit_conditions
= VEC_alloc (tree
, heap
, 37);
2709 select_loops_exit_conditions (&exit_conditions
);
2711 if (dump_file
&& (dump_flags
& TDF_STATS
))
2712 analyze_scalar_evolution_for_all_loop_phi_nodes (&exit_conditions
);
2714 number_of_iterations_for_all_loops (&exit_conditions
);
2715 VEC_free (tree
, heap
, exit_conditions
);
2718 /* Finalize the scalar evolution analysis. */
2721 scev_finalize (void)
2723 if (!scalar_evolution_info
)
2725 htab_delete (scalar_evolution_info
);
2726 BITMAP_FREE (already_instantiated
);
2727 scalar_evolution_info
= NULL
;
2730 /* Replace ssa names for that scev can prove they are constant by the
2731 appropriate constants. Also perform final value replacement in loops,
2732 in case the replacement expressions are cheap.
2734 We only consider SSA names defined by phi nodes; rest is left to the
2735 ordinary constant propagation pass. */
2738 scev_const_prop (void)
2741 tree name
, phi
, next_phi
, type
, ev
;
2742 struct loop
*loop
, *ex_loop
;
2743 bitmap ssa_names_to_remove
= NULL
;
2747 if (number_of_loops () <= 1)
2752 loop
= bb
->loop_father
;
2754 for (phi
= phi_nodes (bb
); phi
; phi
= PHI_CHAIN (phi
))
2756 name
= PHI_RESULT (phi
);
2758 if (!is_gimple_reg (name
))
2761 type
= TREE_TYPE (name
);
2763 if (!POINTER_TYPE_P (type
)
2764 && !INTEGRAL_TYPE_P (type
))
2767 ev
= resolve_mixers (loop
, analyze_scalar_evolution (loop
, name
));
2768 if (!is_gimple_min_invariant (ev
)
2769 || !may_propagate_copy (name
, ev
))
2772 /* Replace the uses of the name. */
2774 replace_uses_by (name
, ev
);
2776 if (!ssa_names_to_remove
)
2777 ssa_names_to_remove
= BITMAP_ALLOC (NULL
);
2778 bitmap_set_bit (ssa_names_to_remove
, SSA_NAME_VERSION (name
));
2782 /* Remove the ssa names that were replaced by constants. We do not
2783 remove them directly in the previous cycle, since this
2784 invalidates scev cache. */
2785 if (ssa_names_to_remove
)
2789 EXECUTE_IF_SET_IN_BITMAP (ssa_names_to_remove
, 0, i
, bi
)
2791 name
= ssa_name (i
);
2792 phi
= SSA_NAME_DEF_STMT (name
);
2794 gcc_assert (TREE_CODE (phi
) == PHI_NODE
);
2795 remove_phi_node (phi
, NULL
, true);
2798 BITMAP_FREE (ssa_names_to_remove
);
2802 /* Now the regular final value replacement. */
2803 FOR_EACH_LOOP (li
, loop
, LI_FROM_INNERMOST
)
2806 tree def
, rslt
, ass
, niter
;
2807 block_stmt_iterator bsi
;
2809 /* If we do not know exact number of iterations of the loop, we cannot
2810 replace the final value. */
2811 exit
= single_exit (loop
);
2815 niter
= number_of_latch_executions (loop
);
2816 /* We used to check here whether the computation of NITER is expensive,
2817 and avoided final value elimination if that is the case. The problem
2818 is that it is hard to evaluate whether the expression is too
2819 expensive, as we do not know what optimization opportunities the
2820 the elimination of the final value may reveal. Therefore, we now
2821 eliminate the final values of induction variables unconditionally. */
2822 if (niter
== chrec_dont_know
)
2825 /* Ensure that it is possible to insert new statements somewhere. */
2826 if (!single_pred_p (exit
->dest
))
2827 split_loop_exit_edge (exit
);
2828 bsi
= bsi_after_labels (exit
->dest
);
2830 ex_loop
= superloop_at_depth (loop
,
2831 loop_depth (exit
->dest
->loop_father
) + 1);
2833 for (phi
= phi_nodes (exit
->dest
); phi
; phi
= next_phi
)
2835 next_phi
= PHI_CHAIN (phi
);
2836 rslt
= PHI_RESULT (phi
);
2837 def
= PHI_ARG_DEF_FROM_EDGE (phi
, exit
);
2838 if (!is_gimple_reg (def
))
2841 if (!POINTER_TYPE_P (TREE_TYPE (def
))
2842 && !INTEGRAL_TYPE_P (TREE_TYPE (def
)))
2845 def
= analyze_scalar_evolution_in_loop (ex_loop
, loop
, def
, NULL
);
2846 def
= compute_overall_effect_of_inner_loop (ex_loop
, def
);
2847 if (!tree_does_not_contain_chrecs (def
)
2848 || chrec_contains_symbols_defined_in_loop (def
, ex_loop
->num
)
2849 /* Moving the computation from the loop may prolong life range
2850 of some ssa names, which may cause problems if they appear
2851 on abnormal edges. */
2852 || contains_abnormal_ssa_name_p (def
))
2855 /* Eliminate the PHI node and replace it by a computation outside
2857 def
= unshare_expr (def
);
2858 remove_phi_node (phi
, NULL_TREE
, false);
2860 ass
= build_gimple_modify_stmt (rslt
, NULL_TREE
);
2861 SSA_NAME_DEF_STMT (rslt
) = ass
;
2863 block_stmt_iterator dest
= bsi
;
2864 bsi_insert_before (&dest
, ass
, BSI_NEW_STMT
);
2865 def
= force_gimple_operand_bsi (&dest
, def
, false, NULL_TREE
,
2866 true, BSI_SAME_STMT
);
2868 GIMPLE_STMT_OPERAND (ass
, 1) = def
;
2875 #include "gt-tree-scalar-evolution.h"