1 /* Chains of recurrences.
2 Copyright (C) 2003-2015 Free Software Foundation, Inc.
3 Contributed by Sebastian Pop <pop@cri.ensmp.fr>
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/>. */
21 /* This file implements operations on chains of recurrences. Chains
22 of recurrences are used for modeling evolution functions of scalar
28 #include "coretypes.h"
32 #include "double-int.h"
41 #include "fold-const.h"
42 #include "tree-pretty-print.h"
46 #include "hard-reg-set.h"
49 #include "dominance.h"
51 #include "basic-block.h"
52 #include "gimple-expr.h"
53 #include "tree-ssa-loop-ivopts.h"
54 #include "tree-ssa-loop-niter.h"
55 #include "tree-chrec.h"
58 #include "tree-scalar-evolution.h"
60 /* Extended folder for chrecs. */
62 /* Determines whether CST is not a constant evolution. */
65 is_not_constant_evolution (const_tree cst
)
67 return (TREE_CODE (cst
) == POLYNOMIAL_CHREC
);
70 /* Fold CODE for a polynomial function and a constant. */
73 chrec_fold_poly_cst (enum tree_code code
,
80 gcc_assert (TREE_CODE (poly
) == POLYNOMIAL_CHREC
);
81 gcc_assert (!is_not_constant_evolution (cst
));
82 gcc_assert (type
== chrec_type (poly
));
87 return build_polynomial_chrec
88 (CHREC_VARIABLE (poly
),
89 chrec_fold_plus (type
, CHREC_LEFT (poly
), cst
),
93 return build_polynomial_chrec
94 (CHREC_VARIABLE (poly
),
95 chrec_fold_minus (type
, CHREC_LEFT (poly
), cst
),
99 return build_polynomial_chrec
100 (CHREC_VARIABLE (poly
),
101 chrec_fold_multiply (type
, CHREC_LEFT (poly
), cst
),
102 chrec_fold_multiply (type
, CHREC_RIGHT (poly
), cst
));
105 return chrec_dont_know
;
109 /* Fold the addition of two polynomial functions. */
112 chrec_fold_plus_poly_poly (enum tree_code code
,
118 struct loop
*loop0
= get_chrec_loop (poly0
);
119 struct loop
*loop1
= get_chrec_loop (poly1
);
120 tree rtype
= code
== POINTER_PLUS_EXPR
? chrec_type (poly1
) : type
;
124 gcc_assert (TREE_CODE (poly0
) == POLYNOMIAL_CHREC
);
125 gcc_assert (TREE_CODE (poly1
) == POLYNOMIAL_CHREC
);
126 if (POINTER_TYPE_P (chrec_type (poly0
)))
127 gcc_assert (ptrofftype_p (chrec_type (poly1
)));
129 gcc_assert (chrec_type (poly0
) == chrec_type (poly1
));
130 gcc_assert (type
== chrec_type (poly0
));
133 {a, +, b}_1 + {c, +, d}_2 -> {{a, +, b}_1 + c, +, d}_2,
134 {a, +, b}_2 + {c, +, d}_1 -> {{c, +, d}_1 + a, +, b}_2,
135 {a, +, b}_x + {c, +, d}_x -> {a+c, +, b+d}_x. */
136 if (flow_loop_nested_p (loop0
, loop1
))
138 if (code
== PLUS_EXPR
|| code
== POINTER_PLUS_EXPR
)
139 return build_polynomial_chrec
140 (CHREC_VARIABLE (poly1
),
141 chrec_fold_plus (type
, poly0
, CHREC_LEFT (poly1
)),
142 CHREC_RIGHT (poly1
));
144 return build_polynomial_chrec
145 (CHREC_VARIABLE (poly1
),
146 chrec_fold_minus (type
, poly0
, CHREC_LEFT (poly1
)),
147 chrec_fold_multiply (type
, CHREC_RIGHT (poly1
),
148 SCALAR_FLOAT_TYPE_P (type
)
149 ? build_real (type
, dconstm1
)
150 : build_int_cst_type (type
, -1)));
153 if (flow_loop_nested_p (loop1
, loop0
))
155 if (code
== PLUS_EXPR
|| code
== POINTER_PLUS_EXPR
)
156 return build_polynomial_chrec
157 (CHREC_VARIABLE (poly0
),
158 chrec_fold_plus (type
, CHREC_LEFT (poly0
), poly1
),
159 CHREC_RIGHT (poly0
));
161 return build_polynomial_chrec
162 (CHREC_VARIABLE (poly0
),
163 chrec_fold_minus (type
, CHREC_LEFT (poly0
), poly1
),
164 CHREC_RIGHT (poly0
));
167 /* This function should never be called for chrecs of loops that
168 do not belong to the same loop nest. */
169 gcc_assert (loop0
== loop1
);
171 if (code
== PLUS_EXPR
|| code
== POINTER_PLUS_EXPR
)
173 left
= chrec_fold_plus
174 (type
, CHREC_LEFT (poly0
), CHREC_LEFT (poly1
));
175 right
= chrec_fold_plus
176 (rtype
, CHREC_RIGHT (poly0
), CHREC_RIGHT (poly1
));
180 left
= chrec_fold_minus
181 (type
, CHREC_LEFT (poly0
), CHREC_LEFT (poly1
));
182 right
= chrec_fold_minus
183 (type
, CHREC_RIGHT (poly0
), CHREC_RIGHT (poly1
));
186 if (chrec_zerop (right
))
189 return build_polynomial_chrec
190 (CHREC_VARIABLE (poly0
), left
, right
);
195 /* Fold the multiplication of two polynomial functions. */
198 chrec_fold_multiply_poly_poly (tree type
,
204 struct loop
*loop0
= get_chrec_loop (poly0
);
205 struct loop
*loop1
= get_chrec_loop (poly1
);
209 gcc_assert (TREE_CODE (poly0
) == POLYNOMIAL_CHREC
);
210 gcc_assert (TREE_CODE (poly1
) == POLYNOMIAL_CHREC
);
211 gcc_assert (chrec_type (poly0
) == chrec_type (poly1
));
212 gcc_assert (type
== chrec_type (poly0
));
214 /* {a, +, b}_1 * {c, +, d}_2 -> {c*{a, +, b}_1, +, d}_2,
215 {a, +, b}_2 * {c, +, d}_1 -> {a*{c, +, d}_1, +, b}_2,
216 {a, +, b}_x * {c, +, d}_x -> {a*c, +, a*d + b*c + b*d, +, 2*b*d}_x. */
217 if (flow_loop_nested_p (loop0
, loop1
))
218 /* poly0 is a constant wrt. poly1. */
219 return build_polynomial_chrec
220 (CHREC_VARIABLE (poly1
),
221 chrec_fold_multiply (type
, CHREC_LEFT (poly1
), poly0
),
222 CHREC_RIGHT (poly1
));
224 if (flow_loop_nested_p (loop1
, loop0
))
225 /* poly1 is a constant wrt. poly0. */
226 return build_polynomial_chrec
227 (CHREC_VARIABLE (poly0
),
228 chrec_fold_multiply (type
, CHREC_LEFT (poly0
), poly1
),
229 CHREC_RIGHT (poly0
));
231 gcc_assert (loop0
== loop1
);
233 /* poly0 and poly1 are two polynomials in the same variable,
234 {a, +, b}_x * {c, +, d}_x -> {a*c, +, a*d + b*c + b*d, +, 2*b*d}_x. */
237 t0
= chrec_fold_multiply (type
, CHREC_LEFT (poly0
), CHREC_LEFT (poly1
));
240 t1
= chrec_fold_multiply (type
, CHREC_LEFT (poly0
), CHREC_RIGHT (poly1
));
241 t1
= chrec_fold_plus (type
, t1
, chrec_fold_multiply (type
,
243 CHREC_LEFT (poly1
)));
245 t2
= chrec_fold_multiply (type
, CHREC_RIGHT (poly0
), CHREC_RIGHT (poly1
));
246 /* "a*d + b*c + b*d". */
247 t1
= chrec_fold_plus (type
, t1
, t2
);
249 t2
= chrec_fold_multiply (type
, SCALAR_FLOAT_TYPE_P (type
)
250 ? build_real (type
, dconst2
)
251 : build_int_cst (type
, 2), t2
);
253 var
= CHREC_VARIABLE (poly0
);
254 return build_polynomial_chrec (var
, t0
,
255 build_polynomial_chrec (var
, t1
, t2
));
258 /* When the operands are automatically_generated_chrec_p, the fold has
259 to respect the semantics of the operands. */
262 chrec_fold_automatically_generated_operands (tree op0
,
265 if (op0
== chrec_dont_know
266 || op1
== chrec_dont_know
)
267 return chrec_dont_know
;
269 if (op0
== chrec_known
270 || op1
== chrec_known
)
273 if (op0
== chrec_not_analyzed_yet
274 || op1
== chrec_not_analyzed_yet
)
275 return chrec_not_analyzed_yet
;
277 /* The default case produces a safe result. */
278 return chrec_dont_know
;
281 /* Fold the addition of two chrecs. */
284 chrec_fold_plus_1 (enum tree_code code
, tree type
,
287 if (automatically_generated_chrec_p (op0
)
288 || automatically_generated_chrec_p (op1
))
289 return chrec_fold_automatically_generated_operands (op0
, op1
);
291 switch (TREE_CODE (op0
))
293 case POLYNOMIAL_CHREC
:
295 (!chrec_contains_symbols_defined_in_loop (op0
, CHREC_VARIABLE (op0
)));
296 switch (TREE_CODE (op1
))
298 case POLYNOMIAL_CHREC
:
300 (!chrec_contains_symbols_defined_in_loop (op1
,
301 CHREC_VARIABLE (op1
)));
302 return chrec_fold_plus_poly_poly (code
, type
, op0
, op1
);
305 if (tree_contains_chrecs (op1
, NULL
))
306 return chrec_dont_know
;
309 if (code
== PLUS_EXPR
|| code
== POINTER_PLUS_EXPR
)
310 return build_polynomial_chrec
311 (CHREC_VARIABLE (op0
),
312 chrec_fold_plus (type
, CHREC_LEFT (op0
), op1
),
315 return build_polynomial_chrec
316 (CHREC_VARIABLE (op0
),
317 chrec_fold_minus (type
, CHREC_LEFT (op0
), op1
),
322 if (tree_contains_chrecs (op0
, NULL
))
323 return chrec_dont_know
;
326 switch (TREE_CODE (op1
))
328 case POLYNOMIAL_CHREC
:
330 (!chrec_contains_symbols_defined_in_loop (op1
,
331 CHREC_VARIABLE (op1
)));
332 if (code
== PLUS_EXPR
|| code
== POINTER_PLUS_EXPR
)
333 return build_polynomial_chrec
334 (CHREC_VARIABLE (op1
),
335 chrec_fold_plus (type
, op0
, CHREC_LEFT (op1
)),
338 return build_polynomial_chrec
339 (CHREC_VARIABLE (op1
),
340 chrec_fold_minus (type
, op0
, CHREC_LEFT (op1
)),
341 chrec_fold_multiply (type
, CHREC_RIGHT (op1
),
342 SCALAR_FLOAT_TYPE_P (type
)
343 ? build_real (type
, dconstm1
)
344 : build_int_cst_type (type
, -1)));
347 if (tree_contains_chrecs (op1
, NULL
))
348 return chrec_dont_know
;
353 if ((tree_contains_chrecs (op0
, &size
)
354 || tree_contains_chrecs (op1
, &size
))
355 && size
< PARAM_VALUE (PARAM_SCEV_MAX_EXPR_SIZE
))
356 return build2 (code
, type
, op0
, op1
);
357 else if (size
< PARAM_VALUE (PARAM_SCEV_MAX_EXPR_SIZE
))
359 if (code
== POINTER_PLUS_EXPR
)
360 return fold_build_pointer_plus (fold_convert (type
, op0
),
363 return fold_build2 (code
, type
,
364 fold_convert (type
, op0
),
365 fold_convert (type
, op1
));
368 return chrec_dont_know
;
374 /* Fold the addition of two chrecs. */
377 chrec_fold_plus (tree type
,
382 if (automatically_generated_chrec_p (op0
)
383 || automatically_generated_chrec_p (op1
))
384 return chrec_fold_automatically_generated_operands (op0
, op1
);
386 if (integer_zerop (op0
))
387 return chrec_convert (type
, op1
, NULL
);
388 if (integer_zerop (op1
))
389 return chrec_convert (type
, op0
, NULL
);
391 if (POINTER_TYPE_P (type
))
392 code
= POINTER_PLUS_EXPR
;
396 return chrec_fold_plus_1 (code
, type
, op0
, op1
);
399 /* Fold the subtraction of two chrecs. */
402 chrec_fold_minus (tree type
,
406 if (automatically_generated_chrec_p (op0
)
407 || automatically_generated_chrec_p (op1
))
408 return chrec_fold_automatically_generated_operands (op0
, op1
);
410 if (integer_zerop (op1
))
413 return chrec_fold_plus_1 (MINUS_EXPR
, type
, op0
, op1
);
416 /* Fold the multiplication of two chrecs. */
419 chrec_fold_multiply (tree type
,
423 if (automatically_generated_chrec_p (op0
)
424 || automatically_generated_chrec_p (op1
))
425 return chrec_fold_automatically_generated_operands (op0
, op1
);
427 switch (TREE_CODE (op0
))
429 case POLYNOMIAL_CHREC
:
431 (!chrec_contains_symbols_defined_in_loop (op0
, CHREC_VARIABLE (op0
)));
432 switch (TREE_CODE (op1
))
434 case POLYNOMIAL_CHREC
:
436 (!chrec_contains_symbols_defined_in_loop (op1
,
437 CHREC_VARIABLE (op1
)));
438 return chrec_fold_multiply_poly_poly (type
, op0
, op1
);
441 if (tree_contains_chrecs (op1
, NULL
))
442 return chrec_dont_know
;
445 if (integer_onep (op1
))
447 if (integer_zerop (op1
))
448 return build_int_cst (type
, 0);
450 return build_polynomial_chrec
451 (CHREC_VARIABLE (op0
),
452 chrec_fold_multiply (type
, CHREC_LEFT (op0
), op1
),
453 chrec_fold_multiply (type
, CHREC_RIGHT (op0
), op1
));
457 if (tree_contains_chrecs (op0
, NULL
))
458 return chrec_dont_know
;
461 if (integer_onep (op0
))
464 if (integer_zerop (op0
))
465 return build_int_cst (type
, 0);
467 switch (TREE_CODE (op1
))
469 case POLYNOMIAL_CHREC
:
471 (!chrec_contains_symbols_defined_in_loop (op1
,
472 CHREC_VARIABLE (op1
)));
473 return build_polynomial_chrec
474 (CHREC_VARIABLE (op1
),
475 chrec_fold_multiply (type
, CHREC_LEFT (op1
), op0
),
476 chrec_fold_multiply (type
, CHREC_RIGHT (op1
), op0
));
479 if (tree_contains_chrecs (op1
, NULL
))
480 return chrec_dont_know
;
483 if (integer_onep (op1
))
485 if (integer_zerop (op1
))
486 return build_int_cst (type
, 0);
487 return fold_build2 (MULT_EXPR
, type
, op0
, op1
);
496 /* Evaluate the binomial coefficient. Return NULL_TREE if the intermediate
497 calculation overflows, otherwise return C(n,k) with type TYPE. */
500 tree_fold_binomial (tree type
, tree n
, unsigned int k
)
506 /* Handle the most frequent cases. */
508 return build_int_cst (type
, 1);
510 return fold_convert (type
, n
);
512 /* Check that k <= n. */
513 if (wi::ltu_p (n
, k
))
516 /* Denominator = 2. */
517 wide_int denom
= wi::two (TYPE_PRECISION (TREE_TYPE (n
)));
519 /* Index = Numerator-1. */
520 wide_int idx
= wi::sub (n
, 1);
522 /* Numerator = Numerator*Index = n*(n-1). */
523 wide_int num
= wi::smul (n
, idx
, &overflow
);
527 for (i
= 3; i
<= k
; i
++)
532 /* Numerator *= Index. */
533 num
= wi::smul (num
, idx
, &overflow
);
537 /* Denominator *= i. */
541 /* Result = Numerator / Denominator. */
542 wide_int di_res
= wi::udiv_trunc (num
, denom
);
543 res
= wide_int_to_tree (type
, di_res
);
544 return int_fits_type_p (res
, type
) ? res
: NULL_TREE
;
547 /* Helper function. Use the Newton's interpolating formula for
548 evaluating the value of the evolution function. */
551 chrec_evaluate (unsigned var
, tree chrec
, tree n
, unsigned int k
)
553 tree arg0
, arg1
, binomial_n_k
;
554 tree type
= TREE_TYPE (chrec
);
555 struct loop
*var_loop
= get_loop (cfun
, var
);
557 while (TREE_CODE (chrec
) == POLYNOMIAL_CHREC
558 && flow_loop_nested_p (var_loop
, get_chrec_loop (chrec
)))
559 chrec
= CHREC_LEFT (chrec
);
561 if (TREE_CODE (chrec
) == POLYNOMIAL_CHREC
562 && CHREC_VARIABLE (chrec
) == var
)
564 arg1
= chrec_evaluate (var
, CHREC_RIGHT (chrec
), n
, k
+ 1);
565 if (arg1
== chrec_dont_know
)
566 return chrec_dont_know
;
567 binomial_n_k
= tree_fold_binomial (type
, n
, k
);
569 return chrec_dont_know
;
570 arg0
= fold_build2 (MULT_EXPR
, type
,
571 CHREC_LEFT (chrec
), binomial_n_k
);
572 return chrec_fold_plus (type
, arg0
, arg1
);
575 binomial_n_k
= tree_fold_binomial (type
, n
, k
);
577 return chrec_dont_know
;
579 return fold_build2 (MULT_EXPR
, type
, chrec
, binomial_n_k
);
582 /* Evaluates "CHREC (X)" when the varying variable is VAR.
583 Example: Given the following parameters,
589 The result is given by the Newton's interpolating formula:
590 3 * \binom{10}{0} + 4 * \binom{10}{1}.
594 chrec_apply (unsigned var
,
598 tree type
= chrec_type (chrec
);
599 tree res
= chrec_dont_know
;
601 if (automatically_generated_chrec_p (chrec
)
602 || automatically_generated_chrec_p (x
)
604 /* When the symbols are defined in an outer loop, it is possible
605 to symbolically compute the apply, since the symbols are
606 constants with respect to the varying loop. */
607 || chrec_contains_symbols_defined_in_loop (chrec
, var
))
608 return chrec_dont_know
;
610 if (dump_file
&& (dump_flags
& TDF_SCEV
))
611 fprintf (dump_file
, "(chrec_apply \n");
613 if (TREE_CODE (x
) == INTEGER_CST
&& SCALAR_FLOAT_TYPE_P (type
))
614 x
= build_real_from_int_cst (type
, x
);
616 switch (TREE_CODE (chrec
))
618 case POLYNOMIAL_CHREC
:
619 if (evolution_function_is_affine_p (chrec
))
621 if (CHREC_VARIABLE (chrec
) != var
)
622 return build_polynomial_chrec
623 (CHREC_VARIABLE (chrec
),
624 chrec_apply (var
, CHREC_LEFT (chrec
), x
),
625 chrec_apply (var
, CHREC_RIGHT (chrec
), x
));
627 /* "{a, +, b} (x)" -> "a + b*x". */
628 x
= chrec_convert_rhs (type
, x
, NULL
);
629 res
= chrec_fold_multiply (TREE_TYPE (x
), CHREC_RIGHT (chrec
), x
);
630 res
= chrec_fold_plus (type
, CHREC_LEFT (chrec
), res
);
632 else if (TREE_CODE (x
) == INTEGER_CST
633 && tree_int_cst_sgn (x
) == 1)
634 /* testsuite/.../ssa-chrec-38.c. */
635 res
= chrec_evaluate (var
, chrec
, x
, 0);
637 res
= chrec_dont_know
;
641 res
= chrec_convert (TREE_TYPE (chrec
),
642 chrec_apply (var
, TREE_OPERAND (chrec
, 0), x
),
651 if (dump_file
&& (dump_flags
& TDF_SCEV
))
653 fprintf (dump_file
, " (varying_loop = %d\n", var
);
654 fprintf (dump_file
, ")\n (chrec = ");
655 print_generic_expr (dump_file
, chrec
, 0);
656 fprintf (dump_file
, ")\n (x = ");
657 print_generic_expr (dump_file
, x
, 0);
658 fprintf (dump_file
, ")\n (res = ");
659 print_generic_expr (dump_file
, res
, 0);
660 fprintf (dump_file
, "))\n");
666 /* For a given CHREC and an induction variable map IV_MAP that maps
667 (loop->num, expr) for every loop number of the current_loops an
668 expression, calls chrec_apply when the expression is not NULL. */
671 chrec_apply_map (tree chrec
, vec
<tree
> iv_map
)
676 FOR_EACH_VEC_ELT (iv_map
, i
, expr
)
678 chrec
= chrec_apply (i
, chrec
, expr
);
683 /* Replaces the initial condition in CHREC with INIT_COND. */
686 chrec_replace_initial_condition (tree chrec
,
689 if (automatically_generated_chrec_p (chrec
))
692 gcc_assert (chrec_type (chrec
) == chrec_type (init_cond
));
694 switch (TREE_CODE (chrec
))
696 case POLYNOMIAL_CHREC
:
697 return build_polynomial_chrec
698 (CHREC_VARIABLE (chrec
),
699 chrec_replace_initial_condition (CHREC_LEFT (chrec
), init_cond
),
700 CHREC_RIGHT (chrec
));
707 /* Returns the initial condition of a given CHREC. */
710 initial_condition (tree chrec
)
712 if (automatically_generated_chrec_p (chrec
))
715 if (TREE_CODE (chrec
) == POLYNOMIAL_CHREC
)
716 return initial_condition (CHREC_LEFT (chrec
));
721 /* Returns a univariate function that represents the evolution in
722 LOOP_NUM. Mask the evolution of any other loop. */
725 hide_evolution_in_other_loops_than_loop (tree chrec
,
728 struct loop
*loop
= get_loop (cfun
, loop_num
), *chloop
;
729 if (automatically_generated_chrec_p (chrec
))
732 switch (TREE_CODE (chrec
))
734 case POLYNOMIAL_CHREC
:
735 chloop
= get_chrec_loop (chrec
);
738 return build_polynomial_chrec
740 hide_evolution_in_other_loops_than_loop (CHREC_LEFT (chrec
),
742 CHREC_RIGHT (chrec
));
744 else if (flow_loop_nested_p (chloop
, loop
))
745 /* There is no evolution in this loop. */
746 return initial_condition (chrec
);
750 gcc_assert (flow_loop_nested_p (loop
, chloop
));
751 return hide_evolution_in_other_loops_than_loop (CHREC_LEFT (chrec
),
760 /* Returns the evolution part of CHREC in LOOP_NUM when RIGHT is
761 true, otherwise returns the initial condition in LOOP_NUM. */
764 chrec_component_in_loop_num (tree chrec
,
769 struct loop
*loop
= get_loop (cfun
, loop_num
), *chloop
;
771 if (automatically_generated_chrec_p (chrec
))
774 switch (TREE_CODE (chrec
))
776 case POLYNOMIAL_CHREC
:
777 chloop
= get_chrec_loop (chrec
);
782 component
= CHREC_RIGHT (chrec
);
784 component
= CHREC_LEFT (chrec
);
786 if (TREE_CODE (CHREC_LEFT (chrec
)) != POLYNOMIAL_CHREC
787 || CHREC_VARIABLE (CHREC_LEFT (chrec
)) != CHREC_VARIABLE (chrec
))
791 return build_polynomial_chrec
793 chrec_component_in_loop_num (CHREC_LEFT (chrec
),
799 else if (flow_loop_nested_p (chloop
, loop
))
800 /* There is no evolution part in this loop. */
805 gcc_assert (flow_loop_nested_p (loop
, chloop
));
806 return chrec_component_in_loop_num (CHREC_LEFT (chrec
),
819 /* Returns the evolution part in LOOP_NUM. Example: the call
820 evolution_part_in_loop_num ({{0, +, 1}_1, +, 2}_1, 1) returns
824 evolution_part_in_loop_num (tree chrec
,
827 return chrec_component_in_loop_num (chrec
, loop_num
, true);
830 /* Returns the initial condition in LOOP_NUM. Example: the call
831 initial_condition_in_loop_num ({{0, +, 1}_1, +, 2}_2, 2) returns
835 initial_condition_in_loop_num (tree chrec
,
838 return chrec_component_in_loop_num (chrec
, loop_num
, false);
841 /* Set or reset the evolution of CHREC to NEW_EVOL in loop LOOP_NUM.
842 This function is essentially used for setting the evolution to
843 chrec_dont_know, for example after having determined that it is
844 impossible to say how many times a loop will execute. */
847 reset_evolution_in_loop (unsigned loop_num
,
851 struct loop
*loop
= get_loop (cfun
, loop_num
);
853 if (POINTER_TYPE_P (chrec_type (chrec
)))
854 gcc_assert (ptrofftype_p (chrec_type (new_evol
)));
856 gcc_assert (chrec_type (chrec
) == chrec_type (new_evol
));
858 if (TREE_CODE (chrec
) == POLYNOMIAL_CHREC
859 && flow_loop_nested_p (loop
, get_chrec_loop (chrec
)))
861 tree left
= reset_evolution_in_loop (loop_num
, CHREC_LEFT (chrec
),
863 tree right
= reset_evolution_in_loop (loop_num
, CHREC_RIGHT (chrec
),
865 return build3 (POLYNOMIAL_CHREC
, TREE_TYPE (left
),
866 CHREC_VAR (chrec
), left
, right
);
869 while (TREE_CODE (chrec
) == POLYNOMIAL_CHREC
870 && CHREC_VARIABLE (chrec
) == loop_num
)
871 chrec
= CHREC_LEFT (chrec
);
873 return build_polynomial_chrec (loop_num
, chrec
, new_evol
);
876 /* Merges two evolution functions that were found by following two
877 alternate paths of a conditional expression. */
880 chrec_merge (tree chrec1
,
883 if (chrec1
== chrec_dont_know
884 || chrec2
== chrec_dont_know
)
885 return chrec_dont_know
;
887 if (chrec1
== chrec_known
888 || chrec2
== chrec_known
)
891 if (chrec1
== chrec_not_analyzed_yet
)
893 if (chrec2
== chrec_not_analyzed_yet
)
896 if (eq_evolutions_p (chrec1
, chrec2
))
899 return chrec_dont_know
;
906 /* Helper function for is_multivariate_chrec. */
909 is_multivariate_chrec_rec (const_tree chrec
, unsigned int rec_var
)
911 if (chrec
== NULL_TREE
)
914 if (TREE_CODE (chrec
) == POLYNOMIAL_CHREC
)
916 if (CHREC_VARIABLE (chrec
) != rec_var
)
919 return (is_multivariate_chrec_rec (CHREC_LEFT (chrec
), rec_var
)
920 || is_multivariate_chrec_rec (CHREC_RIGHT (chrec
), rec_var
));
926 /* Determine whether the given chrec is multivariate or not. */
929 is_multivariate_chrec (const_tree chrec
)
931 if (chrec
== NULL_TREE
)
934 if (TREE_CODE (chrec
) == POLYNOMIAL_CHREC
)
935 return (is_multivariate_chrec_rec (CHREC_LEFT (chrec
),
936 CHREC_VARIABLE (chrec
))
937 || is_multivariate_chrec_rec (CHREC_RIGHT (chrec
),
938 CHREC_VARIABLE (chrec
)));
943 /* Determines whether the chrec contains symbolic names or not. */
946 chrec_contains_symbols (const_tree chrec
)
950 if (chrec
== NULL_TREE
)
953 if (TREE_CODE (chrec
) == SSA_NAME
954 || TREE_CODE (chrec
) == VAR_DECL
955 || TREE_CODE (chrec
) == PARM_DECL
956 || TREE_CODE (chrec
) == FUNCTION_DECL
957 || TREE_CODE (chrec
) == LABEL_DECL
958 || TREE_CODE (chrec
) == RESULT_DECL
959 || TREE_CODE (chrec
) == FIELD_DECL
)
962 n
= TREE_OPERAND_LENGTH (chrec
);
963 for (i
= 0; i
< n
; i
++)
964 if (chrec_contains_symbols (TREE_OPERAND (chrec
, i
)))
969 /* Determines whether the chrec contains undetermined coefficients. */
972 chrec_contains_undetermined (const_tree chrec
)
976 if (chrec
== chrec_dont_know
)
979 if (chrec
== NULL_TREE
)
982 n
= TREE_OPERAND_LENGTH (chrec
);
983 for (i
= 0; i
< n
; i
++)
984 if (chrec_contains_undetermined (TREE_OPERAND (chrec
, i
)))
989 /* Determines whether the tree EXPR contains chrecs, and increment
990 SIZE if it is not a NULL pointer by an estimation of the depth of
994 tree_contains_chrecs (const_tree expr
, int *size
)
998 if (expr
== NULL_TREE
)
1004 if (tree_is_chrec (expr
))
1007 n
= TREE_OPERAND_LENGTH (expr
);
1008 for (i
= 0; i
< n
; i
++)
1009 if (tree_contains_chrecs (TREE_OPERAND (expr
, i
), size
))
1014 /* Recursive helper function. */
1017 evolution_function_is_invariant_rec_p (tree chrec
, int loopnum
)
1019 if (evolution_function_is_constant_p (chrec
))
1022 if (TREE_CODE (chrec
) == SSA_NAME
1024 || expr_invariant_in_loop_p (get_loop (cfun
, loopnum
), chrec
)))
1027 if (TREE_CODE (chrec
) == POLYNOMIAL_CHREC
)
1029 if (CHREC_VARIABLE (chrec
) == (unsigned) loopnum
1030 || flow_loop_nested_p (get_loop (cfun
, loopnum
),
1031 get_chrec_loop (chrec
))
1032 || !evolution_function_is_invariant_rec_p (CHREC_RIGHT (chrec
),
1034 || !evolution_function_is_invariant_rec_p (CHREC_LEFT (chrec
),
1040 switch (TREE_OPERAND_LENGTH (chrec
))
1043 if (!evolution_function_is_invariant_rec_p (TREE_OPERAND (chrec
, 1),
1048 if (!evolution_function_is_invariant_rec_p (TREE_OPERAND (chrec
, 0),
1060 /* Return true if CHREC is invariant in loop LOOPNUM, false otherwise. */
1063 evolution_function_is_invariant_p (tree chrec
, int loopnum
)
1065 return evolution_function_is_invariant_rec_p (chrec
, loopnum
);
1068 /* Determine whether the given tree is an affine multivariate
1072 evolution_function_is_affine_multivariate_p (const_tree chrec
, int loopnum
)
1074 if (chrec
== NULL_TREE
)
1077 switch (TREE_CODE (chrec
))
1079 case POLYNOMIAL_CHREC
:
1080 if (evolution_function_is_invariant_rec_p (CHREC_LEFT (chrec
), loopnum
))
1082 if (evolution_function_is_invariant_rec_p (CHREC_RIGHT (chrec
), loopnum
))
1086 if (TREE_CODE (CHREC_RIGHT (chrec
)) == POLYNOMIAL_CHREC
1087 && CHREC_VARIABLE (CHREC_RIGHT (chrec
))
1088 != CHREC_VARIABLE (chrec
)
1089 && evolution_function_is_affine_multivariate_p
1090 (CHREC_RIGHT (chrec
), loopnum
))
1098 if (evolution_function_is_invariant_rec_p (CHREC_RIGHT (chrec
), loopnum
)
1099 && TREE_CODE (CHREC_LEFT (chrec
)) == POLYNOMIAL_CHREC
1100 && CHREC_VARIABLE (CHREC_LEFT (chrec
)) != CHREC_VARIABLE (chrec
)
1101 && evolution_function_is_affine_multivariate_p
1102 (CHREC_LEFT (chrec
), loopnum
))
1113 /* Determine whether the given tree is a function in zero or one
1117 evolution_function_is_univariate_p (const_tree chrec
)
1119 if (chrec
== NULL_TREE
)
1122 switch (TREE_CODE (chrec
))
1124 case POLYNOMIAL_CHREC
:
1125 switch (TREE_CODE (CHREC_LEFT (chrec
)))
1127 case POLYNOMIAL_CHREC
:
1128 if (CHREC_VARIABLE (chrec
) != CHREC_VARIABLE (CHREC_LEFT (chrec
)))
1130 if (!evolution_function_is_univariate_p (CHREC_LEFT (chrec
)))
1135 if (tree_contains_chrecs (CHREC_LEFT (chrec
), NULL
))
1140 switch (TREE_CODE (CHREC_RIGHT (chrec
)))
1142 case POLYNOMIAL_CHREC
:
1143 if (CHREC_VARIABLE (chrec
) != CHREC_VARIABLE (CHREC_RIGHT (chrec
)))
1145 if (!evolution_function_is_univariate_p (CHREC_RIGHT (chrec
)))
1150 if (tree_contains_chrecs (CHREC_RIGHT (chrec
), NULL
))
1160 /* Returns the number of variables of CHREC. Example: the call
1161 nb_vars_in_chrec ({{0, +, 1}_5, +, 2}_6) returns 2. */
1164 nb_vars_in_chrec (tree chrec
)
1166 if (chrec
== NULL_TREE
)
1169 switch (TREE_CODE (chrec
))
1171 case POLYNOMIAL_CHREC
:
1172 return 1 + nb_vars_in_chrec
1173 (initial_condition_in_loop_num (chrec
, CHREC_VARIABLE (chrec
)));
1180 static tree
chrec_convert_1 (tree
, tree
, gimple
, bool);
1182 /* Converts BASE and STEP of affine scev to TYPE. LOOP is the loop whose iv
1183 the scev corresponds to. AT_STMT is the statement at that the scev is
1184 evaluated. USE_OVERFLOW_SEMANTICS is true if this function should assume that
1185 the rules for overflow of the given language apply (e.g., that signed
1186 arithmetics in C does not overflow) -- i.e., to use them to avoid unnecessary
1187 tests, but also to enforce that the result follows them. Returns true if the
1188 conversion succeeded, false otherwise. */
1191 convert_affine_scev (struct loop
*loop
, tree type
,
1192 tree
*base
, tree
*step
, gimple at_stmt
,
1193 bool use_overflow_semantics
)
1195 tree ct
= TREE_TYPE (*step
);
1196 bool enforce_overflow_semantics
;
1197 bool must_check_src_overflow
, must_check_rslt_overflow
;
1198 tree new_base
, new_step
;
1199 tree step_type
= POINTER_TYPE_P (type
) ? sizetype
: type
;
1202 (TYPE) (BASE + STEP * i) = (TYPE) BASE + (TYPE -- sign extend) STEP * i,
1203 but we must check some assumptions.
1205 1) If [BASE, +, STEP] wraps, the equation is not valid when precision
1206 of CT is smaller than the precision of TYPE. For example, when we
1207 cast unsigned char [254, +, 1] to unsigned, the values on left side
1208 are 254, 255, 0, 1, ..., but those on the right side are
1209 254, 255, 256, 257, ...
1210 2) In case that we must also preserve the fact that signed ivs do not
1211 overflow, we must additionally check that the new iv does not wrap.
1212 For example, unsigned char [125, +, 1] casted to signed char could
1213 become a wrapping variable with values 125, 126, 127, -128, -127, ...,
1214 which would confuse optimizers that assume that this does not
1216 must_check_src_overflow
= TYPE_PRECISION (ct
) < TYPE_PRECISION (type
);
1218 enforce_overflow_semantics
= (use_overflow_semantics
1219 && nowrap_type_p (type
));
1220 if (enforce_overflow_semantics
)
1222 /* We can avoid checking whether the result overflows in the following
1225 -- must_check_src_overflow is true, and the range of TYPE is superset
1226 of the range of CT -- i.e., in all cases except if CT signed and
1228 -- both CT and TYPE have the same precision and signedness, and we
1229 verify instead that the source does not overflow (this may be
1230 easier than verifying it for the result, as we may use the
1231 information about the semantics of overflow in CT). */
1232 if (must_check_src_overflow
)
1234 if (TYPE_UNSIGNED (type
) && !TYPE_UNSIGNED (ct
))
1235 must_check_rslt_overflow
= true;
1237 must_check_rslt_overflow
= false;
1239 else if (TYPE_UNSIGNED (ct
) == TYPE_UNSIGNED (type
)
1240 && TYPE_PRECISION (ct
) == TYPE_PRECISION (type
))
1242 must_check_rslt_overflow
= false;
1243 must_check_src_overflow
= true;
1246 must_check_rslt_overflow
= true;
1249 must_check_rslt_overflow
= false;
1251 if (must_check_src_overflow
1252 && scev_probably_wraps_p (*base
, *step
, at_stmt
, loop
,
1253 use_overflow_semantics
))
1256 new_base
= chrec_convert_1 (type
, *base
, at_stmt
,
1257 use_overflow_semantics
);
1258 /* The step must be sign extended, regardless of the signedness
1259 of CT and TYPE. This only needs to be handled specially when
1260 CT is unsigned -- to avoid e.g. unsigned char [100, +, 255]
1261 (with values 100, 99, 98, ...) from becoming signed or unsigned
1262 [100, +, 255] with values 100, 355, ...; the sign-extension is
1263 performed by default when CT is signed. */
1265 if (TYPE_PRECISION (step_type
) > TYPE_PRECISION (ct
) && TYPE_UNSIGNED (ct
))
1267 tree signed_ct
= build_nonstandard_integer_type (TYPE_PRECISION (ct
), 0);
1268 new_step
= chrec_convert_1 (signed_ct
, new_step
, at_stmt
,
1269 use_overflow_semantics
);
1271 new_step
= chrec_convert_1 (step_type
, new_step
, at_stmt
, use_overflow_semantics
);
1273 if (automatically_generated_chrec_p (new_base
)
1274 || automatically_generated_chrec_p (new_step
))
1277 if (must_check_rslt_overflow
1278 /* Note that in this case we cannot use the fact that signed variables
1279 do not overflow, as this is what we are verifying for the new iv. */
1280 && scev_probably_wraps_p (new_base
, new_step
, at_stmt
, loop
, false))
1289 /* Convert CHREC for the right hand side of a CHREC.
1290 The increment for a pointer type is always sizetype. */
1293 chrec_convert_rhs (tree type
, tree chrec
, gimple at_stmt
)
1295 if (POINTER_TYPE_P (type
))
1298 return chrec_convert (type
, chrec
, at_stmt
);
1301 /* Convert CHREC to TYPE. When the analyzer knows the context in
1302 which the CHREC is built, it sets AT_STMT to the statement that
1303 contains the definition of the analyzed variable, otherwise the
1304 conversion is less accurate: the information is used for
1305 determining a more accurate estimation of the number of iterations.
1306 By default AT_STMT could be safely set to NULL_TREE.
1308 The following rule is always true: TREE_TYPE (chrec) ==
1309 TREE_TYPE (CHREC_LEFT (chrec)) == TREE_TYPE (CHREC_RIGHT (chrec)).
1310 An example of what could happen when adding two chrecs and the type
1311 of the CHREC_RIGHT is different than CHREC_LEFT is:
1313 {(uint) 0, +, (uchar) 10} +
1314 {(uint) 0, +, (uchar) 250}
1316 that would produce a wrong result if CHREC_RIGHT is not (uint):
1318 {(uint) 0, +, (uchar) 4}
1322 {(uint) 0, +, (uint) 260}
1326 chrec_convert (tree type
, tree chrec
, gimple at_stmt
)
1328 return chrec_convert_1 (type
, chrec
, at_stmt
, true);
1331 /* Convert CHREC to TYPE. When the analyzer knows the context in
1332 which the CHREC is built, it sets AT_STMT to the statement that
1333 contains the definition of the analyzed variable, otherwise the
1334 conversion is less accurate: the information is used for
1335 determining a more accurate estimation of the number of iterations.
1336 By default AT_STMT could be safely set to NULL_TREE.
1338 USE_OVERFLOW_SEMANTICS is true if this function should assume that
1339 the rules for overflow of the given language apply (e.g., that signed
1340 arithmetics in C does not overflow) -- i.e., to use them to avoid unnecessary
1341 tests, but also to enforce that the result follows them. */
1344 chrec_convert_1 (tree type
, tree chrec
, gimple at_stmt
,
1345 bool use_overflow_semantics
)
1351 if (automatically_generated_chrec_p (chrec
))
1354 ct
= chrec_type (chrec
);
1358 if (!evolution_function_is_affine_p (chrec
))
1361 loop
= get_chrec_loop (chrec
);
1362 base
= CHREC_LEFT (chrec
);
1363 step
= CHREC_RIGHT (chrec
);
1365 if (convert_affine_scev (loop
, type
, &base
, &step
, at_stmt
,
1366 use_overflow_semantics
))
1367 return build_polynomial_chrec (loop
->num
, base
, step
);
1369 /* If we cannot propagate the cast inside the chrec, just keep the cast. */
1371 /* Fold will not canonicalize (long)(i - 1) to (long)i - 1 because that
1372 may be more expensive. We do want to perform this optimization here
1373 though for canonicalization reasons. */
1374 if (use_overflow_semantics
1375 && (TREE_CODE (chrec
) == PLUS_EXPR
1376 || TREE_CODE (chrec
) == MINUS_EXPR
)
1377 && TREE_CODE (type
) == INTEGER_TYPE
1378 && TREE_CODE (ct
) == INTEGER_TYPE
1379 && TYPE_PRECISION (type
) > TYPE_PRECISION (ct
)
1380 && TYPE_OVERFLOW_UNDEFINED (ct
))
1381 res
= fold_build2 (TREE_CODE (chrec
), type
,
1382 fold_convert (type
, TREE_OPERAND (chrec
, 0)),
1383 fold_convert (type
, TREE_OPERAND (chrec
, 1)));
1384 /* Similar perform the trick that (signed char)((int)x + 2) can be
1385 narrowed to (signed char)((unsigned char)x + 2). */
1386 else if (use_overflow_semantics
1387 && TREE_CODE (chrec
) == POLYNOMIAL_CHREC
1388 && TREE_CODE (ct
) == INTEGER_TYPE
1389 && TREE_CODE (type
) == INTEGER_TYPE
1390 && TYPE_OVERFLOW_UNDEFINED (type
)
1391 && TYPE_PRECISION (type
) < TYPE_PRECISION (ct
))
1393 tree utype
= unsigned_type_for (type
);
1394 res
= build_polynomial_chrec (CHREC_VARIABLE (chrec
),
1395 fold_convert (utype
,
1396 CHREC_LEFT (chrec
)),
1397 fold_convert (utype
,
1398 CHREC_RIGHT (chrec
)));
1399 res
= chrec_convert_1 (type
, res
, at_stmt
, use_overflow_semantics
);
1402 res
= fold_convert (type
, chrec
);
1404 /* Don't propagate overflows. */
1405 if (CONSTANT_CLASS_P (res
))
1406 TREE_OVERFLOW (res
) = 0;
1408 /* But reject constants that don't fit in their type after conversion.
1409 This can happen if TYPE_MIN_VALUE or TYPE_MAX_VALUE are not the
1410 natural values associated with TYPE_PRECISION and TYPE_UNSIGNED,
1411 and can cause problems later when computing niters of loops. Note
1412 that we don't do the check before converting because we don't want
1413 to reject conversions of negative chrecs to unsigned types. */
1414 if (TREE_CODE (res
) == INTEGER_CST
1415 && TREE_CODE (type
) == INTEGER_TYPE
1416 && !int_fits_type_p (res
, type
))
1417 res
= chrec_dont_know
;
1422 /* Convert CHREC to TYPE, without regard to signed overflows. Returns the new
1423 chrec if something else than what chrec_convert would do happens, NULL_TREE
1427 chrec_convert_aggressive (tree type
, tree chrec
)
1429 tree inner_type
, left
, right
, lc
, rc
, rtype
;
1431 if (automatically_generated_chrec_p (chrec
)
1432 || TREE_CODE (chrec
) != POLYNOMIAL_CHREC
)
1435 inner_type
= TREE_TYPE (chrec
);
1436 if (TYPE_PRECISION (type
) > TYPE_PRECISION (inner_type
))
1439 rtype
= POINTER_TYPE_P (type
) ? sizetype
: type
;
1441 left
= CHREC_LEFT (chrec
);
1442 right
= CHREC_RIGHT (chrec
);
1443 lc
= chrec_convert_aggressive (type
, left
);
1445 lc
= chrec_convert (type
, left
, NULL
);
1446 rc
= chrec_convert_aggressive (rtype
, right
);
1448 rc
= chrec_convert (rtype
, right
, NULL
);
1450 return build_polynomial_chrec (CHREC_VARIABLE (chrec
), lc
, rc
);
1453 /* Returns true when CHREC0 == CHREC1. */
1456 eq_evolutions_p (const_tree chrec0
, const_tree chrec1
)
1458 if (chrec0
== NULL_TREE
1459 || chrec1
== NULL_TREE
1460 || TREE_CODE (chrec0
) != TREE_CODE (chrec1
))
1463 if (chrec0
== chrec1
)
1466 switch (TREE_CODE (chrec0
))
1469 return operand_equal_p (chrec0
, chrec1
, 0);
1471 case POLYNOMIAL_CHREC
:
1472 return (CHREC_VARIABLE (chrec0
) == CHREC_VARIABLE (chrec1
)
1473 && eq_evolutions_p (CHREC_LEFT (chrec0
), CHREC_LEFT (chrec1
))
1474 && eq_evolutions_p (CHREC_RIGHT (chrec0
), CHREC_RIGHT (chrec1
)));
1479 case POINTER_PLUS_EXPR
:
1480 return eq_evolutions_p (TREE_OPERAND (chrec0
, 0),
1481 TREE_OPERAND (chrec1
, 0))
1482 && eq_evolutions_p (TREE_OPERAND (chrec0
, 1),
1483 TREE_OPERAND (chrec1
, 1));
1490 /* Returns EV_GROWS if CHREC grows (assuming that it does not overflow),
1491 EV_DECREASES if it decreases, and EV_UNKNOWN if we cannot determine
1492 which of these cases happens. */
1495 scev_direction (const_tree chrec
)
1499 if (!evolution_function_is_affine_p (chrec
))
1500 return EV_DIR_UNKNOWN
;
1502 step
= CHREC_RIGHT (chrec
);
1503 if (TREE_CODE (step
) != INTEGER_CST
)
1504 return EV_DIR_UNKNOWN
;
1506 if (tree_int_cst_sign_bit (step
))
1507 return EV_DIR_DECREASES
;
1509 return EV_DIR_GROWS
;
1512 /* Iterates over all the components of SCEV, and calls CBCK. */
1515 for_each_scev_op (tree
*scev
, bool (*cbck
) (tree
*, void *), void *data
)
1517 switch (TREE_CODE_LENGTH (TREE_CODE (*scev
)))
1520 for_each_scev_op (&TREE_OPERAND (*scev
, 2), cbck
, data
);
1523 for_each_scev_op (&TREE_OPERAND (*scev
, 1), cbck
, data
);
1526 for_each_scev_op (&TREE_OPERAND (*scev
, 0), cbck
, data
);
1534 /* Returns true when the operation can be part of a linear
1538 operator_is_linear (tree scev
)
1540 switch (TREE_CODE (scev
))
1543 case POLYNOMIAL_CHREC
:
1545 case POINTER_PLUS_EXPR
:
1550 case NON_LVALUE_EXPR
:
1560 /* Return true when SCEV is a linear expression. Linear expressions
1561 can contain additions, substractions and multiplications.
1562 Multiplications are restricted to constant scaling: "cst * x". */
1565 scev_is_linear_expression (tree scev
)
1568 || !operator_is_linear (scev
))
1571 if (TREE_CODE (scev
) == MULT_EXPR
)
1572 return !(tree_contains_chrecs (TREE_OPERAND (scev
, 0), NULL
)
1573 && tree_contains_chrecs (TREE_OPERAND (scev
, 1), NULL
));
1575 if (TREE_CODE (scev
) == POLYNOMIAL_CHREC
1576 && !evolution_function_is_affine_multivariate_p (scev
, CHREC_VARIABLE (scev
)))
1579 switch (TREE_CODE_LENGTH (TREE_CODE (scev
)))
1582 return scev_is_linear_expression (TREE_OPERAND (scev
, 0))
1583 && scev_is_linear_expression (TREE_OPERAND (scev
, 1))
1584 && scev_is_linear_expression (TREE_OPERAND (scev
, 2));
1587 return scev_is_linear_expression (TREE_OPERAND (scev
, 0))
1588 && scev_is_linear_expression (TREE_OPERAND (scev
, 1));
1591 return scev_is_linear_expression (TREE_OPERAND (scev
, 0));
1601 /* Determines whether the expression CHREC contains only interger consts
1602 in the right parts. */
1605 evolution_function_right_is_integer_cst (const_tree chrec
)
1607 if (chrec
== NULL_TREE
)
1610 switch (TREE_CODE (chrec
))
1615 case POLYNOMIAL_CHREC
:
1616 return TREE_CODE (CHREC_RIGHT (chrec
)) == INTEGER_CST
1617 && (TREE_CODE (CHREC_LEFT (chrec
)) != POLYNOMIAL_CHREC
1618 || evolution_function_right_is_integer_cst (CHREC_LEFT (chrec
)));
1621 return evolution_function_right_is_integer_cst (TREE_OPERAND (chrec
, 0));