1 /* Scalar evolution detector.
2 Copyright (C) 2003-2013 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_ASSIGN: 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 (loop_1, {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 2a: 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 2b: Multivariate chains of recurrences.
170 Analyzing the access function of array A with
171 instantiate_parameters (loop_1, "j + k"), we obtain the
172 instantiation and the analysis of the scalar variables "j" and "k"
173 in loop_1. This leads to the scalar evolution {4, +, 1}_1: the end
174 value of loop_2 for "j" is 4, and the evolution of "k" in loop_1 is
175 {0, +, 1}_1. To obtain the evolution function in loop_3 and
176 instantiate the scalar variables up to loop_1, one has to use:
177 instantiate_scev (block_before_loop (loop_1), loop_3, "j + k").
178 The result of this call is {{0, +, 1}_1, +, 1}_2.
180 Example 3: Higher degree polynomials.
194 instantiate_parameters (loop_1, {5, +, a}_1) -> {5, +, 2, +, 1}_1
195 instantiate_parameters (loop_1, {5 + a, +, a}_1) -> {7, +, 3, +, 1}_1
197 Example 4: Lucas, Fibonacci, or mixers in general.
209 The syntax "(1, c)_1" stands for a PEELED_CHREC that has the
210 following semantics: during the first iteration of the loop_1, the
211 variable contains the value 1, and then it contains the value "c".
212 Note that this syntax is close to the syntax of the loop-phi-node:
213 "a -> (1, c)_1" vs. "a = phi (1, c)".
215 The symbolic chrec representation contains all the semantics of the
216 original code. What is more difficult is to use this information.
218 Example 5: Flip-flops, or exchangers.
230 Based on these symbolic chrecs, it is possible to refine this
231 information into the more precise PERIODIC_CHRECs:
236 This transformation is not yet implemented.
240 You can find a more detailed description of the algorithm in:
241 http://icps.u-strasbg.fr/~pop/DEA_03_Pop.pdf
242 http://icps.u-strasbg.fr/~pop/DEA_03_Pop.ps.gz. But note that
243 this is a preliminary report and some of the details of the
244 algorithm have changed. I'm working on a research report that
245 updates the description of the algorithms to reflect the design
246 choices used in this implementation.
248 A set of slides show a high level overview of the algorithm and run
249 an example through the scalar evolution analyzer:
250 http://cri.ensmp.fr/~pop/gcc/mar04/slides.pdf
252 The slides that I have presented at the GCC Summit'04 are available
253 at: http://cri.ensmp.fr/~pop/gcc/20040604/gccsummit-lno-spop.pdf
258 #include "coretypes.h"
259 #include "gimple-pretty-print.h"
260 #include "tree-flow.h"
262 #include "tree-chrec.h"
263 #include "tree-scalar-evolution.h"
264 #include "dumpfile.h"
267 static tree
analyze_scalar_evolution_1 (struct loop
*, tree
, tree
);
268 static tree
analyze_scalar_evolution_for_address_of (struct loop
*loop
,
271 /* The cached information about an SSA name VAR, claiming that below
272 basic block INSTANTIATED_BELOW, the value of VAR can be expressed
275 struct GTY(()) scev_info_str
{
276 basic_block instantiated_below
;
281 /* Counters for the scev database. */
282 static unsigned nb_set_scev
= 0;
283 static unsigned nb_get_scev
= 0;
285 /* The following trees are unique elements. Thus the comparison of
286 another element to these elements should be done on the pointer to
287 these trees, and not on their value. */
289 /* The SSA_NAMEs that are not yet analyzed are qualified with NULL_TREE. */
290 tree chrec_not_analyzed_yet
;
292 /* Reserved to the cases where the analyzer has detected an
293 undecidable property at compile time. */
294 tree chrec_dont_know
;
296 /* When the analyzer has detected that a property will never
297 happen, then it qualifies it with chrec_known. */
300 static GTY ((param_is (struct scev_info_str
))) htab_t scalar_evolution_info
;
303 /* Constructs a new SCEV_INFO_STR structure for VAR and INSTANTIATED_BELOW. */
305 static inline struct scev_info_str
*
306 new_scev_info_str (basic_block instantiated_below
, tree var
)
308 struct scev_info_str
*res
;
310 res
= ggc_alloc_scev_info_str ();
312 res
->chrec
= chrec_not_analyzed_yet
;
313 res
->instantiated_below
= instantiated_below
;
318 /* Computes a hash function for database element ELT. */
321 hash_scev_info (const void *elt
)
323 return SSA_NAME_VERSION (((const struct scev_info_str
*) elt
)->var
);
326 /* Compares database elements E1 and E2. */
329 eq_scev_info (const void *e1
, const void *e2
)
331 const struct scev_info_str
*elt1
= (const struct scev_info_str
*) e1
;
332 const struct scev_info_str
*elt2
= (const struct scev_info_str
*) e2
;
334 return (elt1
->var
== elt2
->var
335 && elt1
->instantiated_below
== elt2
->instantiated_below
);
338 /* Deletes database element E. */
341 del_scev_info (void *e
)
346 /* Get the scalar evolution of VAR for INSTANTIATED_BELOW basic block.
347 A first query on VAR returns chrec_not_analyzed_yet. */
350 find_var_scev_info (basic_block instantiated_below
, tree var
)
352 struct scev_info_str
*res
;
353 struct scev_info_str tmp
;
357 tmp
.instantiated_below
= instantiated_below
;
358 slot
= htab_find_slot (scalar_evolution_info
, &tmp
, INSERT
);
361 *slot
= new_scev_info_str (instantiated_below
, var
);
362 res
= (struct scev_info_str
*) *slot
;
367 /* Return true when CHREC contains symbolic names defined in
371 chrec_contains_symbols_defined_in_loop (const_tree chrec
, unsigned loop_nb
)
375 if (chrec
== NULL_TREE
)
378 if (is_gimple_min_invariant (chrec
))
381 if (TREE_CODE (chrec
) == SSA_NAME
)
384 loop_p def_loop
, loop
;
386 if (SSA_NAME_IS_DEFAULT_DEF (chrec
))
389 def
= SSA_NAME_DEF_STMT (chrec
);
390 def_loop
= loop_containing_stmt (def
);
391 loop
= get_loop (loop_nb
);
393 if (def_loop
== NULL
)
396 if (loop
== def_loop
|| flow_loop_nested_p (loop
, def_loop
))
402 n
= TREE_OPERAND_LENGTH (chrec
);
403 for (i
= 0; i
< n
; i
++)
404 if (chrec_contains_symbols_defined_in_loop (TREE_OPERAND (chrec
, i
),
410 /* Return true when PHI is a loop-phi-node. */
413 loop_phi_node_p (gimple phi
)
415 /* The implementation of this function is based on the following
416 property: "all the loop-phi-nodes of a loop are contained in the
417 loop's header basic block". */
419 return loop_containing_stmt (phi
)->header
== gimple_bb (phi
);
422 /* Compute the scalar evolution for EVOLUTION_FN after crossing LOOP.
423 In general, in the case of multivariate evolutions we want to get
424 the evolution in different loops. LOOP specifies the level for
425 which to get the evolution.
429 | for (j = 0; j < 100; j++)
431 | for (k = 0; k < 100; k++)
433 | i = k + j; - Here the value of i is a function of j, k.
435 | ... = i - Here the value of i is a function of j.
437 | ... = i - Here the value of i is a scalar.
443 | i_1 = phi (i_0, i_2)
447 This loop has the same effect as:
448 LOOP_1 has the same effect as:
452 The overall effect of the loop, "i_0 + 20" in the previous example,
453 is obtained by passing in the parameters: LOOP = 1,
454 EVOLUTION_FN = {i_0, +, 2}_1.
458 compute_overall_effect_of_inner_loop (struct loop
*loop
, tree evolution_fn
)
462 if (evolution_fn
== chrec_dont_know
)
463 return chrec_dont_know
;
465 else if (TREE_CODE (evolution_fn
) == POLYNOMIAL_CHREC
)
467 struct loop
*inner_loop
= get_chrec_loop (evolution_fn
);
469 if (inner_loop
== loop
470 || flow_loop_nested_p (loop
, inner_loop
))
472 tree nb_iter
= number_of_latch_executions (inner_loop
);
474 if (nb_iter
== chrec_dont_know
)
475 return chrec_dont_know
;
480 /* evolution_fn is the evolution function in LOOP. Get
481 its value in the nb_iter-th iteration. */
482 res
= chrec_apply (inner_loop
->num
, evolution_fn
, nb_iter
);
484 if (chrec_contains_symbols_defined_in_loop (res
, loop
->num
))
485 res
= instantiate_parameters (loop
, res
);
487 /* Continue the computation until ending on a parent of LOOP. */
488 return compute_overall_effect_of_inner_loop (loop
, res
);
495 /* If the evolution function is an invariant, there is nothing to do. */
496 else if (no_evolution_in_loop_p (evolution_fn
, loop
->num
, &val
) && val
)
500 return chrec_dont_know
;
503 /* Associate CHREC to SCALAR. */
506 set_scalar_evolution (basic_block instantiated_below
, tree scalar
, tree chrec
)
510 if (TREE_CODE (scalar
) != SSA_NAME
)
513 scalar_info
= find_var_scev_info (instantiated_below
, scalar
);
517 if (dump_flags
& TDF_SCEV
)
519 fprintf (dump_file
, "(set_scalar_evolution \n");
520 fprintf (dump_file
, " instantiated_below = %d \n",
521 instantiated_below
->index
);
522 fprintf (dump_file
, " (scalar = ");
523 print_generic_expr (dump_file
, scalar
, 0);
524 fprintf (dump_file
, ")\n (scalar_evolution = ");
525 print_generic_expr (dump_file
, chrec
, 0);
526 fprintf (dump_file
, "))\n");
528 if (dump_flags
& TDF_STATS
)
532 *scalar_info
= chrec
;
535 /* Retrieve the chrec associated to SCALAR instantiated below
536 INSTANTIATED_BELOW block. */
539 get_scalar_evolution (basic_block instantiated_below
, tree scalar
)
545 if (dump_flags
& TDF_SCEV
)
547 fprintf (dump_file
, "(get_scalar_evolution \n");
548 fprintf (dump_file
, " (scalar = ");
549 print_generic_expr (dump_file
, scalar
, 0);
550 fprintf (dump_file
, ")\n");
552 if (dump_flags
& TDF_STATS
)
556 switch (TREE_CODE (scalar
))
559 res
= *find_var_scev_info (instantiated_below
, scalar
);
569 res
= chrec_not_analyzed_yet
;
573 if (dump_file
&& (dump_flags
& TDF_SCEV
))
575 fprintf (dump_file
, " (scalar_evolution = ");
576 print_generic_expr (dump_file
, res
, 0);
577 fprintf (dump_file
, "))\n");
583 /* Helper function for add_to_evolution. Returns the evolution
584 function for an assignment of the form "a = b + c", where "a" and
585 "b" are on the strongly connected component. CHREC_BEFORE is the
586 information that we already have collected up to this point.
587 TO_ADD is the evolution of "c".
589 When CHREC_BEFORE has an evolution part in LOOP_NB, add to this
590 evolution the expression TO_ADD, otherwise construct an evolution
591 part for this loop. */
594 add_to_evolution_1 (unsigned loop_nb
, tree chrec_before
, tree to_add
,
597 tree type
, left
, right
;
598 struct loop
*loop
= get_loop (loop_nb
), *chloop
;
600 switch (TREE_CODE (chrec_before
))
602 case POLYNOMIAL_CHREC
:
603 chloop
= get_chrec_loop (chrec_before
);
605 || flow_loop_nested_p (chloop
, loop
))
609 type
= chrec_type (chrec_before
);
611 /* When there is no evolution part in this loop, build it. */
616 right
= SCALAR_FLOAT_TYPE_P (type
)
617 ? build_real (type
, dconst0
)
618 : build_int_cst (type
, 0);
622 var
= CHREC_VARIABLE (chrec_before
);
623 left
= CHREC_LEFT (chrec_before
);
624 right
= CHREC_RIGHT (chrec_before
);
627 to_add
= chrec_convert (type
, to_add
, at_stmt
);
628 right
= chrec_convert_rhs (type
, right
, at_stmt
);
629 right
= chrec_fold_plus (chrec_type (right
), right
, to_add
);
630 return build_polynomial_chrec (var
, left
, right
);
634 gcc_assert (flow_loop_nested_p (loop
, chloop
));
636 /* Search the evolution in LOOP_NB. */
637 left
= add_to_evolution_1 (loop_nb
, CHREC_LEFT (chrec_before
),
639 right
= CHREC_RIGHT (chrec_before
);
640 right
= chrec_convert_rhs (chrec_type (left
), right
, at_stmt
);
641 return build_polynomial_chrec (CHREC_VARIABLE (chrec_before
),
646 /* These nodes do not depend on a loop. */
647 if (chrec_before
== chrec_dont_know
)
648 return chrec_dont_know
;
651 right
= chrec_convert_rhs (chrec_type (left
), to_add
, at_stmt
);
652 return build_polynomial_chrec (loop_nb
, left
, right
);
656 /* Add TO_ADD to the evolution part of CHREC_BEFORE in the dimension
659 Description (provided for completeness, for those who read code in
660 a plane, and for my poor 62 bytes brain that would have forgotten
661 all this in the next two or three months):
663 The algorithm of translation of programs from the SSA representation
664 into the chrecs syntax is based on a pattern matching. After having
665 reconstructed the overall tree expression for a loop, there are only
666 two cases that can arise:
668 1. a = loop-phi (init, a + expr)
669 2. a = loop-phi (init, expr)
671 where EXPR is either a scalar constant with respect to the analyzed
672 loop (this is a degree 0 polynomial), or an expression containing
673 other loop-phi definitions (these are higher degree polynomials).
680 | a = phi (init, a + 5)
687 | a = phi (inita, 2 * b + 3)
688 | b = phi (initb, b + 1)
691 For the first case, the semantics of the SSA representation is:
693 | a (x) = init + \sum_{j = 0}^{x - 1} expr (j)
695 that is, there is a loop index "x" that determines the scalar value
696 of the variable during the loop execution. During the first
697 iteration, the value is that of the initial condition INIT, while
698 during the subsequent iterations, it is the sum of the initial
699 condition with the sum of all the values of EXPR from the initial
700 iteration to the before last considered iteration.
702 For the second case, the semantics of the SSA program is:
704 | a (x) = init, if x = 0;
705 | expr (x - 1), otherwise.
707 The second case corresponds to the PEELED_CHREC, whose syntax is
708 close to the syntax of a loop-phi-node:
710 | phi (init, expr) vs. (init, expr)_x
712 The proof of the translation algorithm for the first case is a
713 proof by structural induction based on the degree of EXPR.
716 When EXPR is a constant with respect to the analyzed loop, or in
717 other words when EXPR is a polynomial of degree 0, the evolution of
718 the variable A in the loop is an affine function with an initial
719 condition INIT, and a step EXPR. In order to show this, we start
720 from the semantics of the SSA representation:
722 f (x) = init + \sum_{j = 0}^{x - 1} expr (j)
724 and since "expr (j)" is a constant with respect to "j",
726 f (x) = init + x * expr
728 Finally, based on the semantics of the pure sum chrecs, by
729 identification we get the corresponding chrecs syntax:
731 f (x) = init * \binom{x}{0} + expr * \binom{x}{1}
732 f (x) -> {init, +, expr}_x
735 Suppose that EXPR is a polynomial of degree N with respect to the
736 analyzed loop_x for which we have already determined that it is
737 written under the chrecs syntax:
739 | expr (x) -> {b_0, +, b_1, +, ..., +, b_{n-1}} (x)
741 We start from the semantics of the SSA program:
743 | f (x) = init + \sum_{j = 0}^{x - 1} expr (j)
745 | f (x) = init + \sum_{j = 0}^{x - 1}
746 | (b_0 * \binom{j}{0} + ... + b_{n-1} * \binom{j}{n-1})
748 | f (x) = init + \sum_{j = 0}^{x - 1}
749 | \sum_{k = 0}^{n - 1} (b_k * \binom{j}{k})
751 | f (x) = init + \sum_{k = 0}^{n - 1}
752 | (b_k * \sum_{j = 0}^{x - 1} \binom{j}{k})
754 | f (x) = init + \sum_{k = 0}^{n - 1}
755 | (b_k * \binom{x}{k + 1})
757 | f (x) = init + b_0 * \binom{x}{1} + ...
758 | + b_{n-1} * \binom{x}{n}
760 | f (x) = init * \binom{x}{0} + b_0 * \binom{x}{1} + ...
761 | + b_{n-1} * \binom{x}{n}
764 And finally from the definition of the chrecs syntax, we identify:
765 | f (x) -> {init, +, b_0, +, ..., +, b_{n-1}}_x
767 This shows the mechanism that stands behind the add_to_evolution
768 function. An important point is that the use of symbolic
769 parameters avoids the need of an analysis schedule.
776 | a = phi (inita, a + 2 + b)
777 | b = phi (initb, b + 1)
780 When analyzing "a", the algorithm keeps "b" symbolically:
782 | a -> {inita, +, 2 + b}_1
784 Then, after instantiation, the analyzer ends on the evolution:
786 | a -> {inita, +, 2 + initb, +, 1}_1
791 add_to_evolution (unsigned loop_nb
, tree chrec_before
, enum tree_code code
,
792 tree to_add
, gimple at_stmt
)
794 tree type
= chrec_type (to_add
);
795 tree res
= NULL_TREE
;
797 if (to_add
== NULL_TREE
)
800 /* TO_ADD is either a scalar, or a parameter. TO_ADD is not
801 instantiated at this point. */
802 if (TREE_CODE (to_add
) == POLYNOMIAL_CHREC
)
803 /* This should not happen. */
804 return chrec_dont_know
;
806 if (dump_file
&& (dump_flags
& TDF_SCEV
))
808 fprintf (dump_file
, "(add_to_evolution \n");
809 fprintf (dump_file
, " (loop_nb = %d)\n", loop_nb
);
810 fprintf (dump_file
, " (chrec_before = ");
811 print_generic_expr (dump_file
, chrec_before
, 0);
812 fprintf (dump_file
, ")\n (to_add = ");
813 print_generic_expr (dump_file
, to_add
, 0);
814 fprintf (dump_file
, ")\n");
817 if (code
== MINUS_EXPR
)
818 to_add
= chrec_fold_multiply (type
, to_add
, SCALAR_FLOAT_TYPE_P (type
)
819 ? build_real (type
, dconstm1
)
820 : build_int_cst_type (type
, -1));
822 res
= add_to_evolution_1 (loop_nb
, chrec_before
, to_add
, at_stmt
);
824 if (dump_file
&& (dump_flags
& TDF_SCEV
))
826 fprintf (dump_file
, " (res = ");
827 print_generic_expr (dump_file
, res
, 0);
828 fprintf (dump_file
, "))\n");
836 /* This section selects the loops that will be good candidates for the
837 scalar evolution analysis. For the moment, greedily select all the
838 loop nests we could analyze. */
840 /* For a loop with a single exit edge, return the COND_EXPR that
841 guards the exit edge. If the expression is too difficult to
842 analyze, then give up. */
845 get_loop_exit_condition (const struct loop
*loop
)
848 edge exit_edge
= single_exit (loop
);
850 if (dump_file
&& (dump_flags
& TDF_SCEV
))
851 fprintf (dump_file
, "(get_loop_exit_condition \n ");
857 stmt
= last_stmt (exit_edge
->src
);
858 if (gimple_code (stmt
) == GIMPLE_COND
)
862 if (dump_file
&& (dump_flags
& TDF_SCEV
))
864 print_gimple_stmt (dump_file
, res
, 0, 0);
865 fprintf (dump_file
, ")\n");
871 /* Recursively determine and enqueue the exit conditions for a loop. */
874 get_exit_conditions_rec (struct loop
*loop
,
875 vec
<gimple
> *exit_conditions
)
880 /* Recurse on the inner loops, then on the next (sibling) loops. */
881 get_exit_conditions_rec (loop
->inner
, exit_conditions
);
882 get_exit_conditions_rec (loop
->next
, exit_conditions
);
884 if (single_exit (loop
))
886 gimple loop_condition
= get_loop_exit_condition (loop
);
889 exit_conditions
->safe_push (loop_condition
);
893 /* Select the candidate loop nests for the analysis. This function
894 initializes the EXIT_CONDITIONS array. */
897 select_loops_exit_conditions (vec
<gimple
> *exit_conditions
)
899 struct loop
*function_body
= current_loops
->tree_root
;
901 get_exit_conditions_rec (function_body
->inner
, exit_conditions
);
905 /* Depth first search algorithm. */
907 typedef enum t_bool
{
914 static t_bool
follow_ssa_edge (struct loop
*loop
, gimple
, gimple
, tree
*, int);
916 /* Follow the ssa edge into the binary expression RHS0 CODE RHS1.
917 Return true if the strongly connected component has been found. */
920 follow_ssa_edge_binary (struct loop
*loop
, gimple at_stmt
,
921 tree type
, tree rhs0
, enum tree_code code
, tree rhs1
,
922 gimple halting_phi
, tree
*evolution_of_loop
, int limit
)
924 t_bool res
= t_false
;
929 case POINTER_PLUS_EXPR
:
931 if (TREE_CODE (rhs0
) == SSA_NAME
)
933 if (TREE_CODE (rhs1
) == SSA_NAME
)
935 /* Match an assignment under the form:
938 /* We want only assignments of form "name + name" contribute to
939 LIMIT, as the other cases do not necessarily contribute to
940 the complexity of the expression. */
943 evol
= *evolution_of_loop
;
944 res
= follow_ssa_edge
945 (loop
, SSA_NAME_DEF_STMT (rhs0
), halting_phi
, &evol
, limit
);
948 *evolution_of_loop
= add_to_evolution
950 chrec_convert (type
, evol
, at_stmt
),
951 code
, rhs1
, at_stmt
);
953 else if (res
== t_false
)
955 res
= follow_ssa_edge
956 (loop
, SSA_NAME_DEF_STMT (rhs1
), halting_phi
,
957 evolution_of_loop
, limit
);
960 *evolution_of_loop
= add_to_evolution
962 chrec_convert (type
, *evolution_of_loop
, at_stmt
),
963 code
, rhs0
, at_stmt
);
965 else if (res
== t_dont_know
)
966 *evolution_of_loop
= chrec_dont_know
;
969 else if (res
== t_dont_know
)
970 *evolution_of_loop
= chrec_dont_know
;
975 /* Match an assignment under the form:
977 res
= follow_ssa_edge
978 (loop
, SSA_NAME_DEF_STMT (rhs0
), halting_phi
,
979 evolution_of_loop
, limit
);
981 *evolution_of_loop
= add_to_evolution
982 (loop
->num
, chrec_convert (type
, *evolution_of_loop
,
984 code
, rhs1
, at_stmt
);
986 else if (res
== t_dont_know
)
987 *evolution_of_loop
= chrec_dont_know
;
991 else if (TREE_CODE (rhs1
) == SSA_NAME
)
993 /* Match an assignment under the form:
995 res
= follow_ssa_edge
996 (loop
, SSA_NAME_DEF_STMT (rhs1
), halting_phi
,
997 evolution_of_loop
, limit
);
999 *evolution_of_loop
= add_to_evolution
1000 (loop
->num
, chrec_convert (type
, *evolution_of_loop
,
1002 code
, rhs0
, at_stmt
);
1004 else if (res
== t_dont_know
)
1005 *evolution_of_loop
= chrec_dont_know
;
1009 /* Otherwise, match an assignment under the form:
1011 /* And there is nothing to do. */
1016 /* This case is under the form "opnd0 = rhs0 - rhs1". */
1017 if (TREE_CODE (rhs0
) == SSA_NAME
)
1019 /* Match an assignment under the form:
1022 /* We want only assignments of form "name - name" contribute to
1023 LIMIT, as the other cases do not necessarily contribute to
1024 the complexity of the expression. */
1025 if (TREE_CODE (rhs1
) == SSA_NAME
)
1028 res
= follow_ssa_edge (loop
, SSA_NAME_DEF_STMT (rhs0
), halting_phi
,
1029 evolution_of_loop
, limit
);
1031 *evolution_of_loop
= add_to_evolution
1032 (loop
->num
, chrec_convert (type
, *evolution_of_loop
, at_stmt
),
1033 MINUS_EXPR
, rhs1
, at_stmt
);
1035 else if (res
== t_dont_know
)
1036 *evolution_of_loop
= chrec_dont_know
;
1039 /* Otherwise, match an assignment under the form:
1041 /* And there is nothing to do. */
1052 /* Follow the ssa edge into the expression EXPR.
1053 Return true if the strongly connected component has been found. */
1056 follow_ssa_edge_expr (struct loop
*loop
, gimple at_stmt
, tree expr
,
1057 gimple halting_phi
, tree
*evolution_of_loop
, int limit
)
1059 enum tree_code code
= TREE_CODE (expr
);
1060 tree type
= TREE_TYPE (expr
), rhs0
, rhs1
;
1063 /* The EXPR is one of the following cases:
1067 - a POINTER_PLUS_EXPR,
1070 - other cases are not yet handled. */
1075 /* This assignment is under the form "a_1 = (cast) rhs. */
1076 res
= follow_ssa_edge_expr (loop
, at_stmt
, TREE_OPERAND (expr
, 0),
1077 halting_phi
, evolution_of_loop
, limit
);
1078 *evolution_of_loop
= chrec_convert (type
, *evolution_of_loop
, at_stmt
);
1082 /* This assignment is under the form "a_1 = 7". */
1087 /* This assignment is under the form: "a_1 = b_2". */
1088 res
= follow_ssa_edge
1089 (loop
, SSA_NAME_DEF_STMT (expr
), halting_phi
, evolution_of_loop
, limit
);
1092 case POINTER_PLUS_EXPR
:
1095 /* This case is under the form "rhs0 +- rhs1". */
1096 rhs0
= TREE_OPERAND (expr
, 0);
1097 rhs1
= TREE_OPERAND (expr
, 1);
1098 type
= TREE_TYPE (rhs0
);
1099 STRIP_USELESS_TYPE_CONVERSION (rhs0
);
1100 STRIP_USELESS_TYPE_CONVERSION (rhs1
);
1101 res
= follow_ssa_edge_binary (loop
, at_stmt
, type
, rhs0
, code
, rhs1
,
1102 halting_phi
, evolution_of_loop
, limit
);
1106 /* Handle &MEM[ptr + CST] which is equivalent to POINTER_PLUS_EXPR. */
1107 if (TREE_CODE (TREE_OPERAND (expr
, 0)) == MEM_REF
)
1109 expr
= TREE_OPERAND (expr
, 0);
1110 rhs0
= TREE_OPERAND (expr
, 0);
1111 rhs1
= TREE_OPERAND (expr
, 1);
1112 type
= TREE_TYPE (rhs0
);
1113 STRIP_USELESS_TYPE_CONVERSION (rhs0
);
1114 STRIP_USELESS_TYPE_CONVERSION (rhs1
);
1115 res
= follow_ssa_edge_binary (loop
, at_stmt
, type
,
1116 rhs0
, POINTER_PLUS_EXPR
, rhs1
,
1117 halting_phi
, evolution_of_loop
, limit
);
1124 /* This assignment is of the form: "a_1 = ASSERT_EXPR <a_2, ...>"
1125 It must be handled as a copy assignment of the form a_1 = a_2. */
1126 rhs0
= ASSERT_EXPR_VAR (expr
);
1127 if (TREE_CODE (rhs0
) == SSA_NAME
)
1128 res
= follow_ssa_edge (loop
, SSA_NAME_DEF_STMT (rhs0
),
1129 halting_phi
, evolution_of_loop
, limit
);
1142 /* Follow the ssa edge into the right hand side of an assignment STMT.
1143 Return true if the strongly connected component has been found. */
1146 follow_ssa_edge_in_rhs (struct loop
*loop
, gimple stmt
,
1147 gimple halting_phi
, tree
*evolution_of_loop
, int limit
)
1149 enum tree_code code
= gimple_assign_rhs_code (stmt
);
1150 tree type
= gimple_expr_type (stmt
), rhs1
, rhs2
;
1156 /* This assignment is under the form "a_1 = (cast) rhs. */
1157 res
= follow_ssa_edge_expr (loop
, stmt
, gimple_assign_rhs1 (stmt
),
1158 halting_phi
, evolution_of_loop
, limit
);
1159 *evolution_of_loop
= chrec_convert (type
, *evolution_of_loop
, stmt
);
1162 case POINTER_PLUS_EXPR
:
1165 rhs1
= gimple_assign_rhs1 (stmt
);
1166 rhs2
= gimple_assign_rhs2 (stmt
);
1167 type
= TREE_TYPE (rhs1
);
1168 res
= follow_ssa_edge_binary (loop
, stmt
, type
, rhs1
, code
, rhs2
,
1169 halting_phi
, evolution_of_loop
, limit
);
1173 if (get_gimple_rhs_class (code
) == GIMPLE_SINGLE_RHS
)
1174 res
= follow_ssa_edge_expr (loop
, stmt
, gimple_assign_rhs1 (stmt
),
1175 halting_phi
, evolution_of_loop
, limit
);
1184 /* Checks whether the I-th argument of a PHI comes from a backedge. */
1187 backedge_phi_arg_p (gimple phi
, int i
)
1189 const_edge e
= gimple_phi_arg_edge (phi
, i
);
1191 /* We would in fact like to test EDGE_DFS_BACK here, but we do not care
1192 about updating it anywhere, and this should work as well most of the
1194 if (e
->flags
& EDGE_IRREDUCIBLE_LOOP
)
1200 /* Helper function for one branch of the condition-phi-node. Return
1201 true if the strongly connected component has been found following
1204 static inline t_bool
1205 follow_ssa_edge_in_condition_phi_branch (int i
,
1207 gimple condition_phi
,
1209 tree
*evolution_of_branch
,
1210 tree init_cond
, int limit
)
1212 tree branch
= PHI_ARG_DEF (condition_phi
, i
);
1213 *evolution_of_branch
= chrec_dont_know
;
1215 /* Do not follow back edges (they must belong to an irreducible loop, which
1216 we really do not want to worry about). */
1217 if (backedge_phi_arg_p (condition_phi
, i
))
1220 if (TREE_CODE (branch
) == SSA_NAME
)
1222 *evolution_of_branch
= init_cond
;
1223 return follow_ssa_edge (loop
, SSA_NAME_DEF_STMT (branch
), halting_phi
,
1224 evolution_of_branch
, limit
);
1227 /* This case occurs when one of the condition branches sets
1228 the variable to a constant: i.e. a phi-node like
1229 "a_2 = PHI <a_7(5), 2(6)>;".
1231 FIXME: This case have to be refined correctly:
1232 in some cases it is possible to say something better than
1233 chrec_dont_know, for example using a wrap-around notation. */
1237 /* This function merges the branches of a condition-phi-node in a
1241 follow_ssa_edge_in_condition_phi (struct loop
*loop
,
1242 gimple condition_phi
,
1244 tree
*evolution_of_loop
, int limit
)
1247 tree init
= *evolution_of_loop
;
1248 tree evolution_of_branch
;
1249 t_bool res
= follow_ssa_edge_in_condition_phi_branch (0, loop
, condition_phi
,
1251 &evolution_of_branch
,
1253 if (res
== t_false
|| res
== t_dont_know
)
1256 *evolution_of_loop
= evolution_of_branch
;
1258 n
= gimple_phi_num_args (condition_phi
);
1259 for (i
= 1; i
< n
; i
++)
1261 /* Quickly give up when the evolution of one of the branches is
1263 if (*evolution_of_loop
== chrec_dont_know
)
1266 /* Increase the limit by the PHI argument number to avoid exponential
1267 time and memory complexity. */
1268 res
= follow_ssa_edge_in_condition_phi_branch (i
, loop
, condition_phi
,
1270 &evolution_of_branch
,
1272 if (res
== t_false
|| res
== t_dont_know
)
1275 *evolution_of_loop
= chrec_merge (*evolution_of_loop
,
1276 evolution_of_branch
);
1282 /* Follow an SSA edge in an inner loop. It computes the overall
1283 effect of the loop, and following the symbolic initial conditions,
1284 it follows the edges in the parent loop. The inner loop is
1285 considered as a single statement. */
1288 follow_ssa_edge_inner_loop_phi (struct loop
*outer_loop
,
1289 gimple loop_phi_node
,
1291 tree
*evolution_of_loop
, int limit
)
1293 struct loop
*loop
= loop_containing_stmt (loop_phi_node
);
1294 tree ev
= analyze_scalar_evolution (loop
, PHI_RESULT (loop_phi_node
));
1296 /* Sometimes, the inner loop is too difficult to analyze, and the
1297 result of the analysis is a symbolic parameter. */
1298 if (ev
== PHI_RESULT (loop_phi_node
))
1300 t_bool res
= t_false
;
1301 int i
, n
= gimple_phi_num_args (loop_phi_node
);
1303 for (i
= 0; i
< n
; i
++)
1305 tree arg
= PHI_ARG_DEF (loop_phi_node
, i
);
1308 /* Follow the edges that exit the inner loop. */
1309 bb
= gimple_phi_arg_edge (loop_phi_node
, i
)->src
;
1310 if (!flow_bb_inside_loop_p (loop
, bb
))
1311 res
= follow_ssa_edge_expr (outer_loop
, loop_phi_node
,
1313 evolution_of_loop
, limit
);
1318 /* If the path crosses this loop-phi, give up. */
1320 *evolution_of_loop
= chrec_dont_know
;
1325 /* Otherwise, compute the overall effect of the inner loop. */
1326 ev
= compute_overall_effect_of_inner_loop (loop
, ev
);
1327 return follow_ssa_edge_expr (outer_loop
, loop_phi_node
, ev
, halting_phi
,
1328 evolution_of_loop
, limit
);
1331 /* Follow an SSA edge from a loop-phi-node to itself, constructing a
1332 path that is analyzed on the return walk. */
1335 follow_ssa_edge (struct loop
*loop
, gimple def
, gimple halting_phi
,
1336 tree
*evolution_of_loop
, int limit
)
1338 struct loop
*def_loop
;
1340 if (gimple_nop_p (def
))
1343 /* Give up if the path is longer than the MAX that we allow. */
1344 if (limit
> PARAM_VALUE (PARAM_SCEV_MAX_EXPR_COMPLEXITY
))
1347 def_loop
= loop_containing_stmt (def
);
1349 switch (gimple_code (def
))
1352 if (!loop_phi_node_p (def
))
1353 /* DEF is a condition-phi-node. Follow the branches, and
1354 record their evolutions. Finally, merge the collected
1355 information and set the approximation to the main
1357 return follow_ssa_edge_in_condition_phi
1358 (loop
, def
, halting_phi
, evolution_of_loop
, limit
);
1360 /* When the analyzed phi is the halting_phi, the
1361 depth-first search is over: we have found a path from
1362 the halting_phi to itself in the loop. */
1363 if (def
== halting_phi
)
1366 /* Otherwise, the evolution of the HALTING_PHI depends
1367 on the evolution of another loop-phi-node, i.e. the
1368 evolution function is a higher degree polynomial. */
1369 if (def_loop
== loop
)
1373 if (flow_loop_nested_p (loop
, def_loop
))
1374 return follow_ssa_edge_inner_loop_phi
1375 (loop
, def
, halting_phi
, evolution_of_loop
, limit
+ 1);
1381 return follow_ssa_edge_in_rhs (loop
, def
, halting_phi
,
1382 evolution_of_loop
, limit
);
1385 /* At this level of abstraction, the program is just a set
1386 of GIMPLE_ASSIGNs and PHI_NODEs. In principle there is no
1387 other node to be handled. */
1394 /* Given a LOOP_PHI_NODE, this function determines the evolution
1395 function from LOOP_PHI_NODE to LOOP_PHI_NODE in the loop. */
1398 analyze_evolution_in_loop (gimple loop_phi_node
,
1401 int i
, n
= gimple_phi_num_args (loop_phi_node
);
1402 tree evolution_function
= chrec_not_analyzed_yet
;
1403 struct loop
*loop
= loop_containing_stmt (loop_phi_node
);
1406 if (dump_file
&& (dump_flags
& TDF_SCEV
))
1408 fprintf (dump_file
, "(analyze_evolution_in_loop \n");
1409 fprintf (dump_file
, " (loop_phi_node = ");
1410 print_gimple_stmt (dump_file
, loop_phi_node
, 0, 0);
1411 fprintf (dump_file
, ")\n");
1414 for (i
= 0; i
< n
; i
++)
1416 tree arg
= PHI_ARG_DEF (loop_phi_node
, i
);
1421 /* Select the edges that enter the loop body. */
1422 bb
= gimple_phi_arg_edge (loop_phi_node
, i
)->src
;
1423 if (!flow_bb_inside_loop_p (loop
, bb
))
1426 if (TREE_CODE (arg
) == SSA_NAME
)
1430 ssa_chain
= SSA_NAME_DEF_STMT (arg
);
1432 /* Pass in the initial condition to the follow edge function. */
1434 res
= follow_ssa_edge (loop
, ssa_chain
, loop_phi_node
, &ev_fn
, 0);
1436 /* If ev_fn has no evolution in the inner loop, and the
1437 init_cond is not equal to ev_fn, then we have an
1438 ambiguity between two possible values, as we cannot know
1439 the number of iterations at this point. */
1440 if (TREE_CODE (ev_fn
) != POLYNOMIAL_CHREC
1441 && no_evolution_in_loop_p (ev_fn
, loop
->num
, &val
) && val
1442 && !operand_equal_p (init_cond
, ev_fn
, 0))
1443 ev_fn
= chrec_dont_know
;
1448 /* When it is impossible to go back on the same
1449 loop_phi_node by following the ssa edges, the
1450 evolution is represented by a peeled chrec, i.e. the
1451 first iteration, EV_FN has the value INIT_COND, then
1452 all the other iterations it has the value of ARG.
1453 For the moment, PEELED_CHREC nodes are not built. */
1455 ev_fn
= chrec_dont_know
;
1457 /* When there are multiple back edges of the loop (which in fact never
1458 happens currently, but nevertheless), merge their evolutions. */
1459 evolution_function
= chrec_merge (evolution_function
, ev_fn
);
1462 if (dump_file
&& (dump_flags
& TDF_SCEV
))
1464 fprintf (dump_file
, " (evolution_function = ");
1465 print_generic_expr (dump_file
, evolution_function
, 0);
1466 fprintf (dump_file
, "))\n");
1469 return evolution_function
;
1472 /* Given a loop-phi-node, return the initial conditions of the
1473 variable on entry of the loop. When the CCP has propagated
1474 constants into the loop-phi-node, the initial condition is
1475 instantiated, otherwise the initial condition is kept symbolic.
1476 This analyzer does not analyze the evolution outside the current
1477 loop, and leaves this task to the on-demand tree reconstructor. */
1480 analyze_initial_condition (gimple loop_phi_node
)
1483 tree init_cond
= chrec_not_analyzed_yet
;
1484 struct loop
*loop
= loop_containing_stmt (loop_phi_node
);
1486 if (dump_file
&& (dump_flags
& TDF_SCEV
))
1488 fprintf (dump_file
, "(analyze_initial_condition \n");
1489 fprintf (dump_file
, " (loop_phi_node = \n");
1490 print_gimple_stmt (dump_file
, loop_phi_node
, 0, 0);
1491 fprintf (dump_file
, ")\n");
1494 n
= gimple_phi_num_args (loop_phi_node
);
1495 for (i
= 0; i
< n
; i
++)
1497 tree branch
= PHI_ARG_DEF (loop_phi_node
, i
);
1498 basic_block bb
= gimple_phi_arg_edge (loop_phi_node
, i
)->src
;
1500 /* When the branch is oriented to the loop's body, it does
1501 not contribute to the initial condition. */
1502 if (flow_bb_inside_loop_p (loop
, bb
))
1505 if (init_cond
== chrec_not_analyzed_yet
)
1511 if (TREE_CODE (branch
) == SSA_NAME
)
1513 init_cond
= chrec_dont_know
;
1517 init_cond
= chrec_merge (init_cond
, branch
);
1520 /* Ooops -- a loop without an entry??? */
1521 if (init_cond
== chrec_not_analyzed_yet
)
1522 init_cond
= chrec_dont_know
;
1524 /* During early loop unrolling we do not have fully constant propagated IL.
1525 Handle degenerate PHIs here to not miss important unrollings. */
1526 if (TREE_CODE (init_cond
) == SSA_NAME
)
1528 gimple def
= SSA_NAME_DEF_STMT (init_cond
);
1530 if (gimple_code (def
) == GIMPLE_PHI
1531 && (res
= degenerate_phi_result (def
)) != NULL_TREE
1532 /* Only allow invariants here, otherwise we may break
1533 loop-closed SSA form. */
1534 && is_gimple_min_invariant (res
))
1538 if (dump_file
&& (dump_flags
& TDF_SCEV
))
1540 fprintf (dump_file
, " (init_cond = ");
1541 print_generic_expr (dump_file
, init_cond
, 0);
1542 fprintf (dump_file
, "))\n");
1548 /* Analyze the scalar evolution for LOOP_PHI_NODE. */
1551 interpret_loop_phi (struct loop
*loop
, gimple loop_phi_node
)
1554 struct loop
*phi_loop
= loop_containing_stmt (loop_phi_node
);
1557 if (phi_loop
!= loop
)
1559 struct loop
*subloop
;
1560 tree evolution_fn
= analyze_scalar_evolution
1561 (phi_loop
, PHI_RESULT (loop_phi_node
));
1563 /* Dive one level deeper. */
1564 subloop
= superloop_at_depth (phi_loop
, loop_depth (loop
) + 1);
1566 /* Interpret the subloop. */
1567 res
= compute_overall_effect_of_inner_loop (subloop
, evolution_fn
);
1571 /* Otherwise really interpret the loop phi. */
1572 init_cond
= analyze_initial_condition (loop_phi_node
);
1573 res
= analyze_evolution_in_loop (loop_phi_node
, init_cond
);
1575 /* Verify we maintained the correct initial condition throughout
1576 possible conversions in the SSA chain. */
1577 if (res
!= chrec_dont_know
)
1579 tree new_init
= res
;
1580 if (CONVERT_EXPR_P (res
)
1581 && TREE_CODE (TREE_OPERAND (res
, 0)) == POLYNOMIAL_CHREC
)
1582 new_init
= fold_convert (TREE_TYPE (res
),
1583 CHREC_LEFT (TREE_OPERAND (res
, 0)));
1584 else if (TREE_CODE (res
) == POLYNOMIAL_CHREC
)
1585 new_init
= CHREC_LEFT (res
);
1586 STRIP_USELESS_TYPE_CONVERSION (new_init
);
1587 if (TREE_CODE (new_init
) == POLYNOMIAL_CHREC
1588 || !operand_equal_p (init_cond
, new_init
, 0))
1589 return chrec_dont_know
;
1595 /* This function merges the branches of a condition-phi-node,
1596 contained in the outermost loop, and whose arguments are already
1600 interpret_condition_phi (struct loop
*loop
, gimple condition_phi
)
1602 int i
, n
= gimple_phi_num_args (condition_phi
);
1603 tree res
= chrec_not_analyzed_yet
;
1605 for (i
= 0; i
< n
; i
++)
1609 if (backedge_phi_arg_p (condition_phi
, i
))
1611 res
= chrec_dont_know
;
1615 branch_chrec
= analyze_scalar_evolution
1616 (loop
, PHI_ARG_DEF (condition_phi
, i
));
1618 res
= chrec_merge (res
, branch_chrec
);
1624 /* Interpret the operation RHS1 OP RHS2. If we didn't
1625 analyze this node before, follow the definitions until ending
1626 either on an analyzed GIMPLE_ASSIGN, or on a loop-phi-node. On the
1627 return path, this function propagates evolutions (ala constant copy
1628 propagation). OPND1 is not a GIMPLE expression because we could
1629 analyze the effect of an inner loop: see interpret_loop_phi. */
1632 interpret_rhs_expr (struct loop
*loop
, gimple at_stmt
,
1633 tree type
, tree rhs1
, enum tree_code code
, tree rhs2
)
1635 tree res
, chrec1
, chrec2
;
1638 if (get_gimple_rhs_class (code
) == GIMPLE_SINGLE_RHS
)
1640 if (is_gimple_min_invariant (rhs1
))
1641 return chrec_convert (type
, rhs1
, at_stmt
);
1643 if (code
== SSA_NAME
)
1644 return chrec_convert (type
, analyze_scalar_evolution (loop
, rhs1
),
1647 if (code
== ASSERT_EXPR
)
1649 rhs1
= ASSERT_EXPR_VAR (rhs1
);
1650 return chrec_convert (type
, analyze_scalar_evolution (loop
, rhs1
),
1658 if (TREE_CODE (TREE_OPERAND (rhs1
, 0)) == MEM_REF
1659 || handled_component_p (TREE_OPERAND (rhs1
, 0)))
1661 enum machine_mode mode
;
1662 HOST_WIDE_INT bitsize
, bitpos
;
1669 base
= get_inner_reference (TREE_OPERAND (rhs1
, 0),
1670 &bitsize
, &bitpos
, &offset
,
1671 &mode
, &unsignedp
, &volatilep
, false);
1673 if (TREE_CODE (base
) == MEM_REF
)
1675 rhs2
= TREE_OPERAND (base
, 1);
1676 rhs1
= TREE_OPERAND (base
, 0);
1678 chrec1
= analyze_scalar_evolution (loop
, rhs1
);
1679 chrec2
= analyze_scalar_evolution (loop
, rhs2
);
1680 chrec1
= chrec_convert (type
, chrec1
, at_stmt
);
1681 chrec2
= chrec_convert (TREE_TYPE (rhs2
), chrec2
, at_stmt
);
1682 res
= chrec_fold_plus (type
, chrec1
, chrec2
);
1686 chrec1
= analyze_scalar_evolution_for_address_of (loop
, base
);
1687 chrec1
= chrec_convert (type
, chrec1
, at_stmt
);
1691 if (offset
!= NULL_TREE
)
1693 chrec2
= analyze_scalar_evolution (loop
, offset
);
1694 chrec2
= chrec_convert (TREE_TYPE (offset
), chrec2
, at_stmt
);
1695 res
= chrec_fold_plus (type
, res
, chrec2
);
1700 gcc_assert ((bitpos
% BITS_PER_UNIT
) == 0);
1702 unitpos
= size_int (bitpos
/ BITS_PER_UNIT
);
1703 chrec3
= analyze_scalar_evolution (loop
, unitpos
);
1704 chrec3
= chrec_convert (TREE_TYPE (unitpos
), chrec3
, at_stmt
);
1705 res
= chrec_fold_plus (type
, res
, chrec3
);
1709 res
= chrec_dont_know
;
1712 case POINTER_PLUS_EXPR
:
1713 chrec1
= analyze_scalar_evolution (loop
, rhs1
);
1714 chrec2
= analyze_scalar_evolution (loop
, rhs2
);
1715 chrec1
= chrec_convert (type
, chrec1
, at_stmt
);
1716 chrec2
= chrec_convert (TREE_TYPE (rhs2
), chrec2
, at_stmt
);
1717 res
= chrec_fold_plus (type
, chrec1
, chrec2
);
1721 chrec1
= analyze_scalar_evolution (loop
, rhs1
);
1722 chrec2
= analyze_scalar_evolution (loop
, rhs2
);
1723 chrec1
= chrec_convert (type
, chrec1
, at_stmt
);
1724 chrec2
= chrec_convert (type
, chrec2
, at_stmt
);
1725 res
= chrec_fold_plus (type
, chrec1
, chrec2
);
1729 chrec1
= analyze_scalar_evolution (loop
, rhs1
);
1730 chrec2
= analyze_scalar_evolution (loop
, rhs2
);
1731 chrec1
= chrec_convert (type
, chrec1
, at_stmt
);
1732 chrec2
= chrec_convert (type
, chrec2
, at_stmt
);
1733 res
= chrec_fold_minus (type
, chrec1
, chrec2
);
1737 chrec1
= analyze_scalar_evolution (loop
, rhs1
);
1738 chrec1
= chrec_convert (type
, chrec1
, at_stmt
);
1739 /* TYPE may be integer, real or complex, so use fold_convert. */
1740 res
= chrec_fold_multiply (type
, chrec1
,
1741 fold_convert (type
, integer_minus_one_node
));
1745 /* Handle ~X as -1 - X. */
1746 chrec1
= analyze_scalar_evolution (loop
, rhs1
);
1747 chrec1
= chrec_convert (type
, chrec1
, at_stmt
);
1748 res
= chrec_fold_minus (type
,
1749 fold_convert (type
, integer_minus_one_node
),
1754 chrec1
= analyze_scalar_evolution (loop
, rhs1
);
1755 chrec2
= analyze_scalar_evolution (loop
, rhs2
);
1756 chrec1
= chrec_convert (type
, chrec1
, at_stmt
);
1757 chrec2
= chrec_convert (type
, chrec2
, at_stmt
);
1758 res
= chrec_fold_multiply (type
, chrec1
, chrec2
);
1762 /* In case we have a truncation of a widened operation that in
1763 the truncated type has undefined overflow behavior analyze
1764 the operation done in an unsigned type of the same precision
1765 as the final truncation. We cannot derive a scalar evolution
1766 for the widened operation but for the truncated result. */
1767 if (TREE_CODE (type
) == INTEGER_TYPE
1768 && TREE_CODE (TREE_TYPE (rhs1
)) == INTEGER_TYPE
1769 && TYPE_PRECISION (type
) < TYPE_PRECISION (TREE_TYPE (rhs1
))
1770 && TYPE_OVERFLOW_UNDEFINED (type
)
1771 && TREE_CODE (rhs1
) == SSA_NAME
1772 && (def
= SSA_NAME_DEF_STMT (rhs1
))
1773 && is_gimple_assign (def
)
1774 && TREE_CODE_CLASS (gimple_assign_rhs_code (def
)) == tcc_binary
1775 && TREE_CODE (gimple_assign_rhs2 (def
)) == INTEGER_CST
)
1777 tree utype
= unsigned_type_for (type
);
1778 chrec1
= interpret_rhs_expr (loop
, at_stmt
, utype
,
1779 gimple_assign_rhs1 (def
),
1780 gimple_assign_rhs_code (def
),
1781 gimple_assign_rhs2 (def
));
1784 chrec1
= analyze_scalar_evolution (loop
, rhs1
);
1785 res
= chrec_convert (type
, chrec1
, at_stmt
);
1789 res
= chrec_dont_know
;
1796 /* Interpret the expression EXPR. */
1799 interpret_expr (struct loop
*loop
, gimple at_stmt
, tree expr
)
1801 enum tree_code code
;
1802 tree type
= TREE_TYPE (expr
), op0
, op1
;
1804 if (automatically_generated_chrec_p (expr
))
1807 if (TREE_CODE (expr
) == POLYNOMIAL_CHREC
1808 || get_gimple_rhs_class (TREE_CODE (expr
)) == GIMPLE_TERNARY_RHS
)
1809 return chrec_dont_know
;
1811 extract_ops_from_tree (expr
, &code
, &op0
, &op1
);
1813 return interpret_rhs_expr (loop
, at_stmt
, type
,
1817 /* Interpret the rhs of the assignment STMT. */
1820 interpret_gimple_assign (struct loop
*loop
, gimple stmt
)
1822 tree type
= TREE_TYPE (gimple_assign_lhs (stmt
));
1823 enum tree_code code
= gimple_assign_rhs_code (stmt
);
1825 return interpret_rhs_expr (loop
, stmt
, type
,
1826 gimple_assign_rhs1 (stmt
), code
,
1827 gimple_assign_rhs2 (stmt
));
1832 /* This section contains all the entry points:
1833 - number_of_iterations_in_loop,
1834 - analyze_scalar_evolution,
1835 - instantiate_parameters.
1838 /* Compute and return the evolution function in WRTO_LOOP, the nearest
1839 common ancestor of DEF_LOOP and USE_LOOP. */
1842 compute_scalar_evolution_in_loop (struct loop
*wrto_loop
,
1843 struct loop
*def_loop
,
1849 if (def_loop
== wrto_loop
)
1852 def_loop
= superloop_at_depth (def_loop
, loop_depth (wrto_loop
) + 1);
1853 res
= compute_overall_effect_of_inner_loop (def_loop
, ev
);
1855 if (no_evolution_in_loop_p (res
, wrto_loop
->num
, &val
) && val
)
1858 return analyze_scalar_evolution_1 (wrto_loop
, res
, chrec_not_analyzed_yet
);
1861 /* Helper recursive function. */
1864 analyze_scalar_evolution_1 (struct loop
*loop
, tree var
, tree res
)
1866 tree type
= TREE_TYPE (var
);
1869 struct loop
*def_loop
;
1871 if (loop
== NULL
|| TREE_CODE (type
) == VECTOR_TYPE
)
1872 return chrec_dont_know
;
1874 if (TREE_CODE (var
) != SSA_NAME
)
1875 return interpret_expr (loop
, NULL
, var
);
1877 def
= SSA_NAME_DEF_STMT (var
);
1878 bb
= gimple_bb (def
);
1879 def_loop
= bb
? bb
->loop_father
: NULL
;
1882 || !flow_bb_inside_loop_p (loop
, bb
))
1884 /* Keep the symbolic form. */
1889 if (res
!= chrec_not_analyzed_yet
)
1891 if (loop
!= bb
->loop_father
)
1892 res
= compute_scalar_evolution_in_loop
1893 (find_common_loop (loop
, bb
->loop_father
), bb
->loop_father
, res
);
1898 if (loop
!= def_loop
)
1900 res
= analyze_scalar_evolution_1 (def_loop
, var
, chrec_not_analyzed_yet
);
1901 res
= compute_scalar_evolution_in_loop (loop
, def_loop
, res
);
1906 switch (gimple_code (def
))
1909 res
= interpret_gimple_assign (loop
, def
);
1913 if (loop_phi_node_p (def
))
1914 res
= interpret_loop_phi (loop
, def
);
1916 res
= interpret_condition_phi (loop
, def
);
1920 res
= chrec_dont_know
;
1926 /* Keep the symbolic form. */
1927 if (res
== chrec_dont_know
)
1930 if (loop
== def_loop
)
1931 set_scalar_evolution (block_before_loop (loop
), var
, res
);
1936 /* Analyzes and returns the scalar evolution of the ssa_name VAR in
1937 LOOP. LOOP is the loop in which the variable is used.
1939 Example of use: having a pointer VAR to a SSA_NAME node, STMT a
1940 pointer to the statement that uses this variable, in order to
1941 determine the evolution function of the variable, use the following
1944 loop_p loop = loop_containing_stmt (stmt);
1945 tree chrec_with_symbols = analyze_scalar_evolution (loop, var);
1946 tree chrec_instantiated = instantiate_parameters (loop, chrec_with_symbols);
1950 analyze_scalar_evolution (struct loop
*loop
, tree var
)
1954 if (dump_file
&& (dump_flags
& TDF_SCEV
))
1956 fprintf (dump_file
, "(analyze_scalar_evolution \n");
1957 fprintf (dump_file
, " (loop_nb = %d)\n", loop
->num
);
1958 fprintf (dump_file
, " (scalar = ");
1959 print_generic_expr (dump_file
, var
, 0);
1960 fprintf (dump_file
, ")\n");
1963 res
= get_scalar_evolution (block_before_loop (loop
), var
);
1964 res
= analyze_scalar_evolution_1 (loop
, var
, res
);
1966 if (dump_file
&& (dump_flags
& TDF_SCEV
))
1967 fprintf (dump_file
, ")\n");
1972 /* Analyzes and returns the scalar evolution of VAR address in LOOP. */
1975 analyze_scalar_evolution_for_address_of (struct loop
*loop
, tree var
)
1977 return analyze_scalar_evolution (loop
, build_fold_addr_expr (var
));
1980 /* Analyze scalar evolution of use of VERSION in USE_LOOP with respect to
1981 WRTO_LOOP (which should be a superloop of USE_LOOP)
1983 FOLDED_CASTS is set to true if resolve_mixers used
1984 chrec_convert_aggressive (TODO -- not really, we are way too conservative
1985 at the moment in order to keep things simple).
1987 To illustrate the meaning of USE_LOOP and WRTO_LOOP, consider the following
1990 for (i = 0; i < 100; i++) -- loop 1
1992 for (j = 0; j < 100; j++) -- loop 2
1999 for (t = 0; t < 100; t++) -- loop 3
2006 Both k1 and k2 are invariants in loop3, thus
2007 analyze_scalar_evolution_in_loop (loop3, loop3, k1) = k1
2008 analyze_scalar_evolution_in_loop (loop3, loop3, k2) = k2
2010 As they are invariant, it does not matter whether we consider their
2011 usage in loop 3 or loop 2, hence
2012 analyze_scalar_evolution_in_loop (loop2, loop3, k1) =
2013 analyze_scalar_evolution_in_loop (loop2, loop2, k1) = i
2014 analyze_scalar_evolution_in_loop (loop2, loop3, k2) =
2015 analyze_scalar_evolution_in_loop (loop2, loop2, k2) = [0,+,1]_2
2017 Similarly for their evolutions with respect to loop 1. The values of K2
2018 in the use in loop 2 vary independently on loop 1, thus we cannot express
2019 the evolution with respect to loop 1:
2020 analyze_scalar_evolution_in_loop (loop1, loop3, k1) =
2021 analyze_scalar_evolution_in_loop (loop1, loop2, k1) = [0,+,1]_1
2022 analyze_scalar_evolution_in_loop (loop1, loop3, k2) =
2023 analyze_scalar_evolution_in_loop (loop1, loop2, k2) = dont_know
2025 The value of k2 in the use in loop 1 is known, though:
2026 analyze_scalar_evolution_in_loop (loop1, loop1, k1) = [0,+,1]_1
2027 analyze_scalar_evolution_in_loop (loop1, loop1, k2) = 100
2031 analyze_scalar_evolution_in_loop (struct loop
*wrto_loop
, struct loop
*use_loop
,
2032 tree version
, bool *folded_casts
)
2035 tree ev
= version
, tmp
;
2037 /* We cannot just do
2039 tmp = analyze_scalar_evolution (use_loop, version);
2040 ev = resolve_mixers (wrto_loop, tmp);
2042 as resolve_mixers would query the scalar evolution with respect to
2043 wrto_loop. For example, in the situation described in the function
2044 comment, suppose that wrto_loop = loop1, use_loop = loop3 and
2047 analyze_scalar_evolution (use_loop, version) = k2
2049 and resolve_mixers (loop1, k2) finds that the value of k2 in loop 1
2050 is 100, which is a wrong result, since we are interested in the
2053 Instead, we need to proceed from use_loop to wrto_loop loop by loop,
2054 each time checking that there is no evolution in the inner loop. */
2057 *folded_casts
= false;
2060 tmp
= analyze_scalar_evolution (use_loop
, ev
);
2061 ev
= resolve_mixers (use_loop
, tmp
);
2063 if (folded_casts
&& tmp
!= ev
)
2064 *folded_casts
= true;
2066 if (use_loop
== wrto_loop
)
2069 /* If the value of the use changes in the inner loop, we cannot express
2070 its value in the outer loop (we might try to return interval chrec,
2071 but we do not have a user for it anyway) */
2072 if (!no_evolution_in_loop_p (ev
, use_loop
->num
, &val
)
2074 return chrec_dont_know
;
2076 use_loop
= loop_outer (use_loop
);
2080 /* Returns from CACHE the value for VERSION instantiated below
2081 INSTANTIATED_BELOW block. */
2084 get_instantiated_value (htab_t cache
, basic_block instantiated_below
,
2087 struct scev_info_str
*info
, pattern
;
2089 pattern
.var
= version
;
2090 pattern
.instantiated_below
= instantiated_below
;
2091 info
= (struct scev_info_str
*) htab_find (cache
, &pattern
);
2099 /* Sets in CACHE the value of VERSION instantiated below basic block
2100 INSTANTIATED_BELOW to VAL. */
2103 set_instantiated_value (htab_t cache
, basic_block instantiated_below
,
2104 tree version
, tree val
)
2106 struct scev_info_str
*info
, pattern
;
2109 pattern
.var
= version
;
2110 pattern
.instantiated_below
= instantiated_below
;
2111 slot
= htab_find_slot (cache
, &pattern
, INSERT
);
2114 *slot
= new_scev_info_str (instantiated_below
, version
);
2115 info
= (struct scev_info_str
*) *slot
;
2119 /* Return the closed_loop_phi node for VAR. If there is none, return
2123 loop_closed_phi_def (tree var
)
2128 gimple_stmt_iterator psi
;
2130 if (var
== NULL_TREE
2131 || TREE_CODE (var
) != SSA_NAME
)
2134 loop
= loop_containing_stmt (SSA_NAME_DEF_STMT (var
));
2135 exit
= single_exit (loop
);
2139 for (psi
= gsi_start_phis (exit
->dest
); !gsi_end_p (psi
); gsi_next (&psi
))
2141 phi
= gsi_stmt (psi
);
2142 if (PHI_ARG_DEF_FROM_EDGE (phi
, exit
) == var
)
2143 return PHI_RESULT (phi
);
2149 static tree
instantiate_scev_r (basic_block
, struct loop
*, struct loop
*,
2150 tree
, bool, htab_t
, int);
2152 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2153 and EVOLUTION_LOOP, that were left under a symbolic form.
2155 CHREC is an SSA_NAME to be instantiated.
2157 CACHE is the cache of already instantiated values.
2159 FOLD_CONVERSIONS should be set to true when the conversions that
2160 may wrap in signed/pointer type are folded, as long as the value of
2161 the chrec is preserved.
2163 SIZE_EXPR is used for computing the size of the expression to be
2164 instantiated, and to stop if it exceeds some limit. */
2167 instantiate_scev_name (basic_block instantiate_below
,
2168 struct loop
*evolution_loop
, struct loop
*inner_loop
,
2170 bool fold_conversions
, htab_t cache
, int size_expr
)
2173 struct loop
*def_loop
;
2174 basic_block def_bb
= gimple_bb (SSA_NAME_DEF_STMT (chrec
));
2176 /* A parameter (or loop invariant and we do not want to include
2177 evolutions in outer loops), nothing to do. */
2179 || loop_depth (def_bb
->loop_father
) == 0
2180 || dominated_by_p (CDI_DOMINATORS
, instantiate_below
, def_bb
))
2183 /* We cache the value of instantiated variable to avoid exponential
2184 time complexity due to reevaluations. We also store the convenient
2185 value in the cache in order to prevent infinite recursion -- we do
2186 not want to instantiate the SSA_NAME if it is in a mixer
2187 structure. This is used for avoiding the instantiation of
2188 recursively defined functions, such as:
2190 | a_2 -> {0, +, 1, +, a_2}_1 */
2192 res
= get_instantiated_value (cache
, instantiate_below
, chrec
);
2196 res
= chrec_dont_know
;
2197 set_instantiated_value (cache
, instantiate_below
, chrec
, res
);
2199 def_loop
= find_common_loop (evolution_loop
, def_bb
->loop_father
);
2201 /* If the analysis yields a parametric chrec, instantiate the
2203 res
= analyze_scalar_evolution (def_loop
, chrec
);
2205 /* Don't instantiate default definitions. */
2206 if (TREE_CODE (res
) == SSA_NAME
2207 && SSA_NAME_IS_DEFAULT_DEF (res
))
2210 /* Don't instantiate loop-closed-ssa phi nodes. */
2211 else if (TREE_CODE (res
) == SSA_NAME
2212 && loop_depth (loop_containing_stmt (SSA_NAME_DEF_STMT (res
)))
2213 > loop_depth (def_loop
))
2216 res
= loop_closed_phi_def (chrec
);
2220 /* When there is no loop_closed_phi_def, it means that the
2221 variable is not used after the loop: try to still compute the
2222 value of the variable when exiting the loop. */
2223 if (res
== NULL_TREE
)
2225 loop_p loop
= loop_containing_stmt (SSA_NAME_DEF_STMT (chrec
));
2226 res
= analyze_scalar_evolution (loop
, chrec
);
2227 res
= compute_overall_effect_of_inner_loop (loop
, res
);
2228 res
= instantiate_scev_r (instantiate_below
, evolution_loop
,
2230 fold_conversions
, cache
, size_expr
);
2232 else if (!dominated_by_p (CDI_DOMINATORS
, instantiate_below
,
2233 gimple_bb (SSA_NAME_DEF_STMT (res
))))
2234 res
= chrec_dont_know
;
2237 else if (res
!= chrec_dont_know
)
2240 && !flow_loop_nested_p (def_bb
->loop_father
, inner_loop
))
2241 /* ??? We could try to compute the overall effect of the loop here. */
2242 res
= chrec_dont_know
;
2244 res
= instantiate_scev_r (instantiate_below
, evolution_loop
,
2246 fold_conversions
, cache
, size_expr
);
2249 /* Store the correct value to the cache. */
2250 set_instantiated_value (cache
, instantiate_below
, chrec
, res
);
2254 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2255 and EVOLUTION_LOOP, that were left under a symbolic form.
2257 CHREC is a polynomial chain of recurrence to be instantiated.
2259 CACHE is the cache of already instantiated values.
2261 FOLD_CONVERSIONS should be set to true when the conversions that
2262 may wrap in signed/pointer type are folded, as long as the value of
2263 the chrec is preserved.
2265 SIZE_EXPR is used for computing the size of the expression to be
2266 instantiated, and to stop if it exceeds some limit. */
2269 instantiate_scev_poly (basic_block instantiate_below
,
2270 struct loop
*evolution_loop
, struct loop
*,
2272 bool fold_conversions
, htab_t cache
, int size_expr
)
2275 tree op0
= instantiate_scev_r (instantiate_below
, evolution_loop
,
2276 get_chrec_loop (chrec
),
2277 CHREC_LEFT (chrec
), fold_conversions
, cache
,
2279 if (op0
== chrec_dont_know
)
2280 return chrec_dont_know
;
2282 op1
= instantiate_scev_r (instantiate_below
, evolution_loop
,
2283 get_chrec_loop (chrec
),
2284 CHREC_RIGHT (chrec
), fold_conversions
, cache
,
2286 if (op1
== chrec_dont_know
)
2287 return chrec_dont_know
;
2289 if (CHREC_LEFT (chrec
) != op0
2290 || CHREC_RIGHT (chrec
) != op1
)
2292 op1
= chrec_convert_rhs (chrec_type (op0
), op1
, NULL
);
2293 chrec
= build_polynomial_chrec (CHREC_VARIABLE (chrec
), op0
, op1
);
2299 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2300 and EVOLUTION_LOOP, that were left under a symbolic form.
2302 "C0 CODE C1" is a binary expression of type TYPE to be instantiated.
2304 CACHE is the cache of already instantiated values.
2306 FOLD_CONVERSIONS should be set to true when the conversions that
2307 may wrap in signed/pointer type are folded, as long as the value of
2308 the chrec is preserved.
2310 SIZE_EXPR is used for computing the size of the expression to be
2311 instantiated, and to stop if it exceeds some limit. */
2314 instantiate_scev_binary (basic_block instantiate_below
,
2315 struct loop
*evolution_loop
, struct loop
*inner_loop
,
2316 tree chrec
, enum tree_code code
,
2317 tree type
, tree c0
, tree c1
,
2318 bool fold_conversions
, htab_t cache
, int size_expr
)
2321 tree op0
= instantiate_scev_r (instantiate_below
, evolution_loop
, inner_loop
,
2322 c0
, fold_conversions
, cache
,
2324 if (op0
== chrec_dont_know
)
2325 return chrec_dont_know
;
2327 op1
= instantiate_scev_r (instantiate_below
, evolution_loop
, inner_loop
,
2328 c1
, fold_conversions
, cache
,
2330 if (op1
== chrec_dont_know
)
2331 return chrec_dont_know
;
2336 op0
= chrec_convert (type
, op0
, NULL
);
2337 op1
= chrec_convert_rhs (type
, op1
, NULL
);
2341 case POINTER_PLUS_EXPR
:
2343 return chrec_fold_plus (type
, op0
, op1
);
2346 return chrec_fold_minus (type
, op0
, op1
);
2349 return chrec_fold_multiply (type
, op0
, op1
);
2356 return chrec
? chrec
: fold_build2 (code
, type
, c0
, c1
);
2359 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2360 and EVOLUTION_LOOP, that were left under a symbolic form.
2362 "CHREC" is an array reference to be instantiated.
2364 CACHE is the cache of already instantiated values.
2366 FOLD_CONVERSIONS should be set to true when the conversions that
2367 may wrap in signed/pointer type are folded, as long as the value of
2368 the chrec is preserved.
2370 SIZE_EXPR is used for computing the size of the expression to be
2371 instantiated, and to stop if it exceeds some limit. */
2374 instantiate_array_ref (basic_block instantiate_below
,
2375 struct loop
*evolution_loop
, struct loop
*inner_loop
,
2377 bool fold_conversions
, htab_t cache
, int size_expr
)
2380 tree index
= TREE_OPERAND (chrec
, 1);
2381 tree op1
= instantiate_scev_r (instantiate_below
, evolution_loop
,
2383 fold_conversions
, cache
, size_expr
);
2385 if (op1
== chrec_dont_know
)
2386 return chrec_dont_know
;
2388 if (chrec
&& op1
== index
)
2391 res
= unshare_expr (chrec
);
2392 TREE_OPERAND (res
, 1) = op1
;
2396 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2397 and EVOLUTION_LOOP, that were left under a symbolic form.
2399 "CHREC" that stands for a convert expression "(TYPE) OP" is to be
2402 CACHE is the cache of already instantiated values.
2404 FOLD_CONVERSIONS should be set to true when the conversions that
2405 may wrap in signed/pointer type are folded, as long as the value of
2406 the chrec is preserved.
2408 SIZE_EXPR is used for computing the size of the expression to be
2409 instantiated, and to stop if it exceeds some limit. */
2412 instantiate_scev_convert (basic_block instantiate_below
,
2413 struct loop
*evolution_loop
, struct loop
*inner_loop
,
2416 bool fold_conversions
, htab_t cache
, int size_expr
)
2418 tree op0
= instantiate_scev_r (instantiate_below
, evolution_loop
,
2420 fold_conversions
, cache
, size_expr
);
2422 if (op0
== chrec_dont_know
)
2423 return chrec_dont_know
;
2425 if (fold_conversions
)
2427 tree tmp
= chrec_convert_aggressive (type
, op0
);
2432 if (chrec
&& op0
== op
)
2435 /* If we used chrec_convert_aggressive, we can no longer assume that
2436 signed chrecs do not overflow, as chrec_convert does, so avoid
2437 calling it in that case. */
2438 if (fold_conversions
)
2439 return fold_convert (type
, op0
);
2441 return chrec_convert (type
, op0
, NULL
);
2444 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2445 and EVOLUTION_LOOP, that were left under a symbolic form.
2447 CHREC is a BIT_NOT_EXPR or a NEGATE_EXPR expression to be instantiated.
2448 Handle ~X as -1 - X.
2449 Handle -X as -1 * X.
2451 CACHE is the cache of already instantiated values.
2453 FOLD_CONVERSIONS should be set to true when the conversions that
2454 may wrap in signed/pointer type are folded, as long as the value of
2455 the chrec is preserved.
2457 SIZE_EXPR is used for computing the size of the expression to be
2458 instantiated, and to stop if it exceeds some limit. */
2461 instantiate_scev_not (basic_block instantiate_below
,
2462 struct loop
*evolution_loop
, struct loop
*inner_loop
,
2464 enum tree_code code
, tree type
, tree op
,
2465 bool fold_conversions
, htab_t cache
, int size_expr
)
2467 tree op0
= instantiate_scev_r (instantiate_below
, evolution_loop
,
2469 fold_conversions
, cache
, size_expr
);
2471 if (op0
== chrec_dont_know
)
2472 return chrec_dont_know
;
2476 op0
= chrec_convert (type
, op0
, NULL
);
2481 return chrec_fold_minus
2482 (type
, fold_convert (type
, integer_minus_one_node
), op0
);
2485 return chrec_fold_multiply
2486 (type
, fold_convert (type
, integer_minus_one_node
), op0
);
2493 return chrec
? chrec
: fold_build1 (code
, type
, op0
);
2496 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2497 and EVOLUTION_LOOP, that were left under a symbolic form.
2499 CHREC is an expression with 3 operands to be instantiated.
2501 CACHE is the cache of already instantiated values.
2503 FOLD_CONVERSIONS should be set to true when the conversions that
2504 may wrap in signed/pointer type are folded, as long as the value of
2505 the chrec is preserved.
2507 SIZE_EXPR is used for computing the size of the expression to be
2508 instantiated, and to stop if it exceeds some limit. */
2511 instantiate_scev_3 (basic_block instantiate_below
,
2512 struct loop
*evolution_loop
, struct loop
*inner_loop
,
2514 bool fold_conversions
, htab_t cache
, int size_expr
)
2517 tree op0
= instantiate_scev_r (instantiate_below
, evolution_loop
,
2518 inner_loop
, TREE_OPERAND (chrec
, 0),
2519 fold_conversions
, cache
, size_expr
);
2520 if (op0
== chrec_dont_know
)
2521 return chrec_dont_know
;
2523 op1
= instantiate_scev_r (instantiate_below
, evolution_loop
,
2524 inner_loop
, TREE_OPERAND (chrec
, 1),
2525 fold_conversions
, cache
, size_expr
);
2526 if (op1
== chrec_dont_know
)
2527 return chrec_dont_know
;
2529 op2
= instantiate_scev_r (instantiate_below
, evolution_loop
,
2530 inner_loop
, TREE_OPERAND (chrec
, 2),
2531 fold_conversions
, cache
, size_expr
);
2532 if (op2
== chrec_dont_know
)
2533 return chrec_dont_know
;
2535 if (op0
== TREE_OPERAND (chrec
, 0)
2536 && op1
== TREE_OPERAND (chrec
, 1)
2537 && op2
== TREE_OPERAND (chrec
, 2))
2540 return fold_build3 (TREE_CODE (chrec
),
2541 TREE_TYPE (chrec
), op0
, op1
, op2
);
2544 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2545 and EVOLUTION_LOOP, that were left under a symbolic form.
2547 CHREC is an expression with 2 operands to be instantiated.
2549 CACHE is the cache of already instantiated values.
2551 FOLD_CONVERSIONS should be set to true when the conversions that
2552 may wrap in signed/pointer type are folded, as long as the value of
2553 the chrec is preserved.
2555 SIZE_EXPR is used for computing the size of the expression to be
2556 instantiated, and to stop if it exceeds some limit. */
2559 instantiate_scev_2 (basic_block instantiate_below
,
2560 struct loop
*evolution_loop
, struct loop
*inner_loop
,
2562 bool fold_conversions
, htab_t cache
, int size_expr
)
2565 tree op0
= instantiate_scev_r (instantiate_below
, evolution_loop
,
2566 inner_loop
, TREE_OPERAND (chrec
, 0),
2567 fold_conversions
, cache
, size_expr
);
2568 if (op0
== chrec_dont_know
)
2569 return chrec_dont_know
;
2571 op1
= instantiate_scev_r (instantiate_below
, evolution_loop
,
2572 inner_loop
, TREE_OPERAND (chrec
, 1),
2573 fold_conversions
, cache
, size_expr
);
2574 if (op1
== chrec_dont_know
)
2575 return chrec_dont_know
;
2577 if (op0
== TREE_OPERAND (chrec
, 0)
2578 && op1
== TREE_OPERAND (chrec
, 1))
2581 return fold_build2 (TREE_CODE (chrec
), TREE_TYPE (chrec
), op0
, op1
);
2584 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2585 and EVOLUTION_LOOP, that were left under a symbolic form.
2587 CHREC is an expression with 2 operands to be instantiated.
2589 CACHE is the cache of already instantiated values.
2591 FOLD_CONVERSIONS should be set to true when the conversions that
2592 may wrap in signed/pointer type are folded, as long as the value of
2593 the chrec is preserved.
2595 SIZE_EXPR is used for computing the size of the expression to be
2596 instantiated, and to stop if it exceeds some limit. */
2599 instantiate_scev_1 (basic_block instantiate_below
,
2600 struct loop
*evolution_loop
, struct loop
*inner_loop
,
2602 bool fold_conversions
, htab_t cache
, int size_expr
)
2604 tree op0
= instantiate_scev_r (instantiate_below
, evolution_loop
,
2605 inner_loop
, TREE_OPERAND (chrec
, 0),
2606 fold_conversions
, cache
, size_expr
);
2608 if (op0
== chrec_dont_know
)
2609 return chrec_dont_know
;
2611 if (op0
== TREE_OPERAND (chrec
, 0))
2614 return fold_build1 (TREE_CODE (chrec
), TREE_TYPE (chrec
), op0
);
2617 /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW
2618 and EVOLUTION_LOOP, that were left under a symbolic form.
2620 CHREC is the scalar evolution to instantiate.
2622 CACHE is the cache of already instantiated values.
2624 FOLD_CONVERSIONS should be set to true when the conversions that
2625 may wrap in signed/pointer type are folded, as long as the value of
2626 the chrec is preserved.
2628 SIZE_EXPR is used for computing the size of the expression to be
2629 instantiated, and to stop if it exceeds some limit. */
2632 instantiate_scev_r (basic_block instantiate_below
,
2633 struct loop
*evolution_loop
, struct loop
*inner_loop
,
2635 bool fold_conversions
, htab_t cache
, int size_expr
)
2637 /* Give up if the expression is larger than the MAX that we allow. */
2638 if (size_expr
++ > PARAM_VALUE (PARAM_SCEV_MAX_EXPR_SIZE
))
2639 return chrec_dont_know
;
2641 if (chrec
== NULL_TREE
2642 || automatically_generated_chrec_p (chrec
)
2643 || is_gimple_min_invariant (chrec
))
2646 switch (TREE_CODE (chrec
))
2649 return instantiate_scev_name (instantiate_below
, evolution_loop
,
2651 fold_conversions
, cache
, size_expr
);
2653 case POLYNOMIAL_CHREC
:
2654 return instantiate_scev_poly (instantiate_below
, evolution_loop
,
2656 fold_conversions
, cache
, size_expr
);
2658 case POINTER_PLUS_EXPR
:
2662 return instantiate_scev_binary (instantiate_below
, evolution_loop
,
2664 TREE_CODE (chrec
), chrec_type (chrec
),
2665 TREE_OPERAND (chrec
, 0),
2666 TREE_OPERAND (chrec
, 1),
2667 fold_conversions
, cache
, size_expr
);
2670 return instantiate_scev_convert (instantiate_below
, evolution_loop
,
2672 TREE_TYPE (chrec
), TREE_OPERAND (chrec
, 0),
2673 fold_conversions
, cache
, size_expr
);
2677 return instantiate_scev_not (instantiate_below
, evolution_loop
,
2679 TREE_CODE (chrec
), TREE_TYPE (chrec
),
2680 TREE_OPERAND (chrec
, 0),
2681 fold_conversions
, cache
, size_expr
);
2684 case SCEV_NOT_KNOWN
:
2685 return chrec_dont_know
;
2691 return instantiate_array_ref (instantiate_below
, evolution_loop
,
2693 fold_conversions
, cache
, size_expr
);
2699 if (VL_EXP_CLASS_P (chrec
))
2700 return chrec_dont_know
;
2702 switch (TREE_CODE_LENGTH (TREE_CODE (chrec
)))
2705 return instantiate_scev_3 (instantiate_below
, evolution_loop
,
2707 fold_conversions
, cache
, size_expr
);
2710 return instantiate_scev_2 (instantiate_below
, evolution_loop
,
2712 fold_conversions
, cache
, size_expr
);
2715 return instantiate_scev_1 (instantiate_below
, evolution_loop
,
2717 fold_conversions
, cache
, size_expr
);
2726 /* Too complicated to handle. */
2727 return chrec_dont_know
;
2730 /* Analyze all the parameters of the chrec that were left under a
2731 symbolic form. INSTANTIATE_BELOW is the basic block that stops the
2732 recursive instantiation of parameters: a parameter is a variable
2733 that is defined in a basic block that dominates INSTANTIATE_BELOW or
2734 a function parameter. */
2737 instantiate_scev (basic_block instantiate_below
, struct loop
*evolution_loop
,
2741 htab_t cache
= htab_create (10, hash_scev_info
, eq_scev_info
, del_scev_info
);
2743 if (dump_file
&& (dump_flags
& TDF_SCEV
))
2745 fprintf (dump_file
, "(instantiate_scev \n");
2746 fprintf (dump_file
, " (instantiate_below = %d)\n", instantiate_below
->index
);
2747 fprintf (dump_file
, " (evolution_loop = %d)\n", evolution_loop
->num
);
2748 fprintf (dump_file
, " (chrec = ");
2749 print_generic_expr (dump_file
, chrec
, 0);
2750 fprintf (dump_file
, ")\n");
2753 res
= instantiate_scev_r (instantiate_below
, evolution_loop
,
2754 NULL
, chrec
, false, cache
, 0);
2756 if (dump_file
&& (dump_flags
& TDF_SCEV
))
2758 fprintf (dump_file
, " (res = ");
2759 print_generic_expr (dump_file
, res
, 0);
2760 fprintf (dump_file
, "))\n");
2763 htab_delete (cache
);
2768 /* Similar to instantiate_parameters, but does not introduce the
2769 evolutions in outer loops for LOOP invariants in CHREC, and does not
2770 care about causing overflows, as long as they do not affect value
2771 of an expression. */
2774 resolve_mixers (struct loop
*loop
, tree chrec
)
2776 htab_t cache
= htab_create (10, hash_scev_info
, eq_scev_info
, del_scev_info
);
2777 tree ret
= instantiate_scev_r (block_before_loop (loop
), loop
, NULL
,
2778 chrec
, true, cache
, 0);
2779 htab_delete (cache
);
2783 /* Entry point for the analysis of the number of iterations pass.
2784 This function tries to safely approximate the number of iterations
2785 the loop will run. When this property is not decidable at compile
2786 time, the result is chrec_dont_know. Otherwise the result is a
2787 scalar or a symbolic parameter. When the number of iterations may
2788 be equal to zero and the property cannot be determined at compile
2789 time, the result is a COND_EXPR that represents in a symbolic form
2790 the conditions under which the number of iterations is not zero.
2792 Example of analysis: suppose that the loop has an exit condition:
2794 "if (b > 49) goto end_loop;"
2796 and that in a previous analysis we have determined that the
2797 variable 'b' has an evolution function:
2799 "EF = {23, +, 5}_2".
2801 When we evaluate the function at the point 5, i.e. the value of the
2802 variable 'b' after 5 iterations in the loop, we have EF (5) = 48,
2803 and EF (6) = 53. In this case the value of 'b' on exit is '53' and
2804 the loop body has been executed 6 times. */
2807 number_of_latch_executions (struct loop
*loop
)
2810 struct tree_niter_desc niter_desc
;
2814 /* Determine whether the number of iterations in loop has already
2816 res
= loop
->nb_iterations
;
2820 may_be_zero
= NULL_TREE
;
2822 if (dump_file
&& (dump_flags
& TDF_SCEV
))
2823 fprintf (dump_file
, "(number_of_iterations_in_loop = \n");
2825 res
= chrec_dont_know
;
2826 exit
= single_exit (loop
);
2828 if (exit
&& number_of_iterations_exit (loop
, exit
, &niter_desc
, false))
2830 may_be_zero
= niter_desc
.may_be_zero
;
2831 res
= niter_desc
.niter
;
2834 if (res
== chrec_dont_know
2836 || integer_zerop (may_be_zero
))
2838 else if (integer_nonzerop (may_be_zero
))
2839 res
= build_int_cst (TREE_TYPE (res
), 0);
2841 else if (COMPARISON_CLASS_P (may_be_zero
))
2842 res
= fold_build3 (COND_EXPR
, TREE_TYPE (res
), may_be_zero
,
2843 build_int_cst (TREE_TYPE (res
), 0), res
);
2845 res
= chrec_dont_know
;
2847 if (dump_file
&& (dump_flags
& TDF_SCEV
))
2849 fprintf (dump_file
, " (set_nb_iterations_in_loop = ");
2850 print_generic_expr (dump_file
, res
, 0);
2851 fprintf (dump_file
, "))\n");
2854 loop
->nb_iterations
= res
;
2858 /* Returns the number of executions of the exit condition of LOOP,
2859 i.e., the number by one higher than number_of_latch_executions.
2860 Note that unlike number_of_latch_executions, this number does
2861 not necessarily fit in the unsigned variant of the type of
2862 the control variable -- if the number of iterations is a constant,
2863 we return chrec_dont_know if adding one to number_of_latch_executions
2864 overflows; however, in case the number of iterations is symbolic
2865 expression, the caller is responsible for dealing with this
2866 the possible overflow. */
2869 number_of_exit_cond_executions (struct loop
*loop
)
2871 tree ret
= number_of_latch_executions (loop
);
2872 tree type
= chrec_type (ret
);
2874 if (chrec_contains_undetermined (ret
))
2877 ret
= chrec_fold_plus (type
, ret
, build_int_cst (type
, 1));
2878 if (TREE_CODE (ret
) == INTEGER_CST
2879 && TREE_OVERFLOW (ret
))
2880 return chrec_dont_know
;
2885 /* One of the drivers for testing the scalar evolutions analysis.
2886 This function computes the number of iterations for all the loops
2887 from the EXIT_CONDITIONS array. */
2890 number_of_iterations_for_all_loops (vec
<gimple
> *exit_conditions
)
2893 unsigned nb_chrec_dont_know_loops
= 0;
2894 unsigned nb_static_loops
= 0;
2897 FOR_EACH_VEC_ELT (*exit_conditions
, i
, cond
)
2899 tree res
= number_of_latch_executions (loop_containing_stmt (cond
));
2900 if (chrec_contains_undetermined (res
))
2901 nb_chrec_dont_know_loops
++;
2908 fprintf (dump_file
, "\n(\n");
2909 fprintf (dump_file
, "-----------------------------------------\n");
2910 fprintf (dump_file
, "%d\tnb_chrec_dont_know_loops\n", nb_chrec_dont_know_loops
);
2911 fprintf (dump_file
, "%d\tnb_static_loops\n", nb_static_loops
);
2912 fprintf (dump_file
, "%d\tnb_total_loops\n", number_of_loops ());
2913 fprintf (dump_file
, "-----------------------------------------\n");
2914 fprintf (dump_file
, ")\n\n");
2916 print_loops (dump_file
, 3);
2922 /* Counters for the stats. */
2928 unsigned nb_affine_multivar
;
2929 unsigned nb_higher_poly
;
2930 unsigned nb_chrec_dont_know
;
2931 unsigned nb_undetermined
;
2934 /* Reset the counters. */
2937 reset_chrecs_counters (struct chrec_stats
*stats
)
2939 stats
->nb_chrecs
= 0;
2940 stats
->nb_affine
= 0;
2941 stats
->nb_affine_multivar
= 0;
2942 stats
->nb_higher_poly
= 0;
2943 stats
->nb_chrec_dont_know
= 0;
2944 stats
->nb_undetermined
= 0;
2947 /* Dump the contents of a CHREC_STATS structure. */
2950 dump_chrecs_stats (FILE *file
, struct chrec_stats
*stats
)
2952 fprintf (file
, "\n(\n");
2953 fprintf (file
, "-----------------------------------------\n");
2954 fprintf (file
, "%d\taffine univariate chrecs\n", stats
->nb_affine
);
2955 fprintf (file
, "%d\taffine multivariate chrecs\n", stats
->nb_affine_multivar
);
2956 fprintf (file
, "%d\tdegree greater than 2 polynomials\n",
2957 stats
->nb_higher_poly
);
2958 fprintf (file
, "%d\tchrec_dont_know chrecs\n", stats
->nb_chrec_dont_know
);
2959 fprintf (file
, "-----------------------------------------\n");
2960 fprintf (file
, "%d\ttotal chrecs\n", stats
->nb_chrecs
);
2961 fprintf (file
, "%d\twith undetermined coefficients\n",
2962 stats
->nb_undetermined
);
2963 fprintf (file
, "-----------------------------------------\n");
2964 fprintf (file
, "%d\tchrecs in the scev database\n",
2965 (int) htab_elements (scalar_evolution_info
));
2966 fprintf (file
, "%d\tsets in the scev database\n", nb_set_scev
);
2967 fprintf (file
, "%d\tgets in the scev database\n", nb_get_scev
);
2968 fprintf (file
, "-----------------------------------------\n");
2969 fprintf (file
, ")\n\n");
2972 /* Gather statistics about CHREC. */
2975 gather_chrec_stats (tree chrec
, struct chrec_stats
*stats
)
2977 if (dump_file
&& (dump_flags
& TDF_STATS
))
2979 fprintf (dump_file
, "(classify_chrec ");
2980 print_generic_expr (dump_file
, chrec
, 0);
2981 fprintf (dump_file
, "\n");
2986 if (chrec
== NULL_TREE
)
2988 stats
->nb_undetermined
++;
2992 switch (TREE_CODE (chrec
))
2994 case POLYNOMIAL_CHREC
:
2995 if (evolution_function_is_affine_p (chrec
))
2997 if (dump_file
&& (dump_flags
& TDF_STATS
))
2998 fprintf (dump_file
, " affine_univariate\n");
3001 else if (evolution_function_is_affine_multivariate_p (chrec
, 0))
3003 if (dump_file
&& (dump_flags
& TDF_STATS
))
3004 fprintf (dump_file
, " affine_multivariate\n");
3005 stats
->nb_affine_multivar
++;
3009 if (dump_file
&& (dump_flags
& TDF_STATS
))
3010 fprintf (dump_file
, " higher_degree_polynomial\n");
3011 stats
->nb_higher_poly
++;
3020 if (chrec_contains_undetermined (chrec
))
3022 if (dump_file
&& (dump_flags
& TDF_STATS
))
3023 fprintf (dump_file
, " undetermined\n");
3024 stats
->nb_undetermined
++;
3027 if (dump_file
&& (dump_flags
& TDF_STATS
))
3028 fprintf (dump_file
, ")\n");
3031 /* One of the drivers for testing the scalar evolutions analysis.
3032 This function analyzes the scalar evolution of all the scalars
3033 defined as loop phi nodes in one of the loops from the
3034 EXIT_CONDITIONS array.
3036 TODO Optimization: A loop is in canonical form if it contains only
3037 a single scalar loop phi node. All the other scalars that have an
3038 evolution in the loop are rewritten in function of this single
3039 index. This allows the parallelization of the loop. */
3042 analyze_scalar_evolution_for_all_loop_phi_nodes (vec
<gimple
> *exit_conditions
)
3045 struct chrec_stats stats
;
3047 gimple_stmt_iterator psi
;
3049 reset_chrecs_counters (&stats
);
3051 FOR_EACH_VEC_ELT (*exit_conditions
, i
, cond
)
3057 loop
= loop_containing_stmt (cond
);
3060 for (psi
= gsi_start_phis (bb
); !gsi_end_p (psi
); gsi_next (&psi
))
3062 phi
= gsi_stmt (psi
);
3063 if (!virtual_operand_p (PHI_RESULT (phi
)))
3065 chrec
= instantiate_parameters
3067 analyze_scalar_evolution (loop
, PHI_RESULT (phi
)));
3069 if (dump_file
&& (dump_flags
& TDF_STATS
))
3070 gather_chrec_stats (chrec
, &stats
);
3075 if (dump_file
&& (dump_flags
& TDF_STATS
))
3076 dump_chrecs_stats (dump_file
, &stats
);
3079 /* Callback for htab_traverse, gathers information on chrecs in the
3083 gather_stats_on_scev_database_1 (void **slot
, void *stats
)
3085 struct scev_info_str
*entry
= (struct scev_info_str
*) *slot
;
3087 gather_chrec_stats (entry
->chrec
, (struct chrec_stats
*) stats
);
3092 /* Classify the chrecs of the whole database. */
3095 gather_stats_on_scev_database (void)
3097 struct chrec_stats stats
;
3102 reset_chrecs_counters (&stats
);
3104 htab_traverse (scalar_evolution_info
, gather_stats_on_scev_database_1
,
3107 dump_chrecs_stats (dump_file
, &stats
);
3115 initialize_scalar_evolutions_analyzer (void)
3117 /* The elements below are unique. */
3118 if (chrec_dont_know
== NULL_TREE
)
3120 chrec_not_analyzed_yet
= NULL_TREE
;
3121 chrec_dont_know
= make_node (SCEV_NOT_KNOWN
);
3122 chrec_known
= make_node (SCEV_KNOWN
);
3123 TREE_TYPE (chrec_dont_know
) = void_type_node
;
3124 TREE_TYPE (chrec_known
) = void_type_node
;
3128 /* Initialize the analysis of scalar evolutions for LOOPS. */
3131 scev_initialize (void)
3137 scalar_evolution_info
= htab_create_ggc (100, hash_scev_info
, eq_scev_info
,
3140 initialize_scalar_evolutions_analyzer ();
3142 FOR_EACH_LOOP (li
, loop
, 0)
3144 loop
->nb_iterations
= NULL_TREE
;
3148 /* Return true if SCEV is initialized. */
3151 scev_initialized_p (void)
3153 return scalar_evolution_info
!= NULL
;
3156 /* Cleans up the information cached by the scalar evolutions analysis
3157 in the hash table. */
3160 scev_reset_htab (void)
3162 if (!scalar_evolution_info
)
3165 htab_empty (scalar_evolution_info
);
3168 /* Cleans up the information cached by the scalar evolutions analysis
3169 in the hash table and in the loop->nb_iterations. */
3182 FOR_EACH_LOOP (li
, loop
, 0)
3184 loop
->nb_iterations
= NULL_TREE
;
3188 /* Checks whether use of OP in USE_LOOP behaves as a simple affine iv with
3189 respect to WRTO_LOOP and returns its base and step in IV if possible
3190 (see analyze_scalar_evolution_in_loop for more details on USE_LOOP
3191 and WRTO_LOOP). If ALLOW_NONCONSTANT_STEP is true, we want step to be
3192 invariant in LOOP. Otherwise we require it to be an integer constant.
3194 IV->no_overflow is set to true if we are sure the iv cannot overflow (e.g.
3195 because it is computed in signed arithmetics). Consequently, adding an
3198 for (i = IV->base; ; i += IV->step)
3200 is only safe if IV->no_overflow is false, or TYPE_OVERFLOW_UNDEFINED is
3201 false for the type of the induction variable, or you can prove that i does
3202 not wrap by some other argument. Otherwise, this might introduce undefined
3205 for (i = iv->base; ; i = (type) ((unsigned type) i + (unsigned type) iv->step))
3207 must be used instead. */
3210 simple_iv (struct loop
*wrto_loop
, struct loop
*use_loop
, tree op
,
3211 affine_iv
*iv
, bool allow_nonconstant_step
)
3216 iv
->base
= NULL_TREE
;
3217 iv
->step
= NULL_TREE
;
3218 iv
->no_overflow
= false;
3220 type
= TREE_TYPE (op
);
3221 if (!POINTER_TYPE_P (type
)
3222 && !INTEGRAL_TYPE_P (type
))
3225 ev
= analyze_scalar_evolution_in_loop (wrto_loop
, use_loop
, op
,
3227 if (chrec_contains_undetermined (ev
)
3228 || chrec_contains_symbols_defined_in_loop (ev
, wrto_loop
->num
))
3231 if (tree_does_not_contain_chrecs (ev
))
3234 iv
->step
= build_int_cst (TREE_TYPE (ev
), 0);
3235 iv
->no_overflow
= true;
3239 if (TREE_CODE (ev
) != POLYNOMIAL_CHREC
3240 || CHREC_VARIABLE (ev
) != (unsigned) wrto_loop
->num
)
3243 iv
->step
= CHREC_RIGHT (ev
);
3244 if ((!allow_nonconstant_step
&& TREE_CODE (iv
->step
) != INTEGER_CST
)
3245 || tree_contains_chrecs (iv
->step
, NULL
))
3248 iv
->base
= CHREC_LEFT (ev
);
3249 if (tree_contains_chrecs (iv
->base
, NULL
))
3252 iv
->no_overflow
= !folded_casts
&& TYPE_OVERFLOW_UNDEFINED (type
);
3257 /* Runs the analysis of scalar evolutions. */
3260 scev_analysis (void)
3262 vec
<gimple
> exit_conditions
;
3264 exit_conditions
.create (37);
3265 select_loops_exit_conditions (&exit_conditions
);
3267 if (dump_file
&& (dump_flags
& TDF_STATS
))
3268 analyze_scalar_evolution_for_all_loop_phi_nodes (&exit_conditions
);
3270 number_of_iterations_for_all_loops (&exit_conditions
);
3271 exit_conditions
.release ();
3274 /* Finalize the scalar evolution analysis. */
3277 scev_finalize (void)
3279 if (!scalar_evolution_info
)
3281 htab_delete (scalar_evolution_info
);
3282 scalar_evolution_info
= NULL
;
3285 /* Returns true if the expression EXPR is considered to be too expensive
3286 for scev_const_prop. */
3289 expression_expensive_p (tree expr
)
3291 enum tree_code code
;
3293 if (is_gimple_val (expr
))
3296 code
= TREE_CODE (expr
);
3297 if (code
== TRUNC_DIV_EXPR
3298 || code
== CEIL_DIV_EXPR
3299 || code
== FLOOR_DIV_EXPR
3300 || code
== ROUND_DIV_EXPR
3301 || code
== TRUNC_MOD_EXPR
3302 || code
== CEIL_MOD_EXPR
3303 || code
== FLOOR_MOD_EXPR
3304 || code
== ROUND_MOD_EXPR
3305 || code
== EXACT_DIV_EXPR
)
3307 /* Division by power of two is usually cheap, so we allow it.
3308 Forbid anything else. */
3309 if (!integer_pow2p (TREE_OPERAND (expr
, 1)))
3313 switch (TREE_CODE_CLASS (code
))
3316 case tcc_comparison
:
3317 if (expression_expensive_p (TREE_OPERAND (expr
, 1)))
3322 return expression_expensive_p (TREE_OPERAND (expr
, 0));
3329 /* Replace ssa names for that scev can prove they are constant by the
3330 appropriate constants. Also perform final value replacement in loops,
3331 in case the replacement expressions are cheap.
3333 We only consider SSA names defined by phi nodes; rest is left to the
3334 ordinary constant propagation pass. */
3337 scev_const_prop (void)
3340 tree name
, type
, ev
;
3342 struct loop
*loop
, *ex_loop
;
3343 bitmap ssa_names_to_remove
= NULL
;
3346 gimple_stmt_iterator psi
;
3348 if (number_of_loops () <= 1)
3353 loop
= bb
->loop_father
;
3355 for (psi
= gsi_start_phis (bb
); !gsi_end_p (psi
); gsi_next (&psi
))
3357 phi
= gsi_stmt (psi
);
3358 name
= PHI_RESULT (phi
);
3360 if (virtual_operand_p (name
))
3363 type
= TREE_TYPE (name
);
3365 if (!POINTER_TYPE_P (type
)
3366 && !INTEGRAL_TYPE_P (type
))
3369 ev
= resolve_mixers (loop
, analyze_scalar_evolution (loop
, name
));
3370 if (!is_gimple_min_invariant (ev
)
3371 || !may_propagate_copy (name
, ev
))
3374 /* Replace the uses of the name. */
3376 replace_uses_by (name
, ev
);
3378 if (!ssa_names_to_remove
)
3379 ssa_names_to_remove
= BITMAP_ALLOC (NULL
);
3380 bitmap_set_bit (ssa_names_to_remove
, SSA_NAME_VERSION (name
));
3384 /* Remove the ssa names that were replaced by constants. We do not
3385 remove them directly in the previous cycle, since this
3386 invalidates scev cache. */
3387 if (ssa_names_to_remove
)
3391 EXECUTE_IF_SET_IN_BITMAP (ssa_names_to_remove
, 0, i
, bi
)
3393 gimple_stmt_iterator psi
;
3394 name
= ssa_name (i
);
3395 phi
= SSA_NAME_DEF_STMT (name
);
3397 gcc_assert (gimple_code (phi
) == GIMPLE_PHI
);
3398 psi
= gsi_for_stmt (phi
);
3399 remove_phi_node (&psi
, true);
3402 BITMAP_FREE (ssa_names_to_remove
);
3406 /* Now the regular final value replacement. */
3407 FOR_EACH_LOOP (li
, loop
, LI_FROM_INNERMOST
)
3410 tree def
, rslt
, niter
;
3411 gimple_stmt_iterator bsi
;
3413 /* If we do not know exact number of iterations of the loop, we cannot
3414 replace the final value. */
3415 exit
= single_exit (loop
);
3419 niter
= number_of_latch_executions (loop
);
3420 if (niter
== chrec_dont_know
)
3423 /* Ensure that it is possible to insert new statements somewhere. */
3424 if (!single_pred_p (exit
->dest
))
3425 split_loop_exit_edge (exit
);
3426 bsi
= gsi_after_labels (exit
->dest
);
3428 ex_loop
= superloop_at_depth (loop
,
3429 loop_depth (exit
->dest
->loop_father
) + 1);
3431 for (psi
= gsi_start_phis (exit
->dest
); !gsi_end_p (psi
); )
3433 phi
= gsi_stmt (psi
);
3434 rslt
= PHI_RESULT (phi
);
3435 def
= PHI_ARG_DEF_FROM_EDGE (phi
, exit
);
3436 if (virtual_operand_p (def
))
3442 if (!POINTER_TYPE_P (TREE_TYPE (def
))
3443 && !INTEGRAL_TYPE_P (TREE_TYPE (def
)))
3449 def
= analyze_scalar_evolution_in_loop (ex_loop
, loop
, def
, NULL
);
3450 def
= compute_overall_effect_of_inner_loop (ex_loop
, def
);
3451 if (!tree_does_not_contain_chrecs (def
)
3452 || chrec_contains_symbols_defined_in_loop (def
, ex_loop
->num
)
3453 /* Moving the computation from the loop may prolong life range
3454 of some ssa names, which may cause problems if they appear
3455 on abnormal edges. */
3456 || contains_abnormal_ssa_name_p (def
)
3457 /* Do not emit expensive expressions. The rationale is that
3458 when someone writes a code like
3460 while (n > 45) n -= 45;
3462 he probably knows that n is not large, and does not want it
3463 to be turned into n %= 45. */
3464 || expression_expensive_p (def
))
3470 /* Eliminate the PHI node and replace it by a computation outside
3472 def
= unshare_expr (def
);
3473 remove_phi_node (&psi
, false);
3475 def
= force_gimple_operand_gsi (&bsi
, def
, false, NULL_TREE
,
3476 true, GSI_SAME_STMT
);
3477 ass
= gimple_build_assign (rslt
, def
);
3478 gsi_insert_before (&bsi
, ass
, GSI_SAME_STMT
);
3484 #include "gt-tree-scalar-evolution.h"