]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/tree-chrec.cc
Update copyright years.
[thirdparty/gcc.git] / gcc / tree-chrec.cc
1 /* Chains of recurrences.
2 Copyright (C) 2003-2024 Free Software Foundation, Inc.
3 Contributed by Sebastian Pop <pop@cri.ensmp.fr>
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
20
21 /* This file implements operations on chains of recurrences. Chains
22 of recurrences are used for modeling evolution functions of scalar
23 variables.
24 */
25
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "backend.h"
30 #include "tree.h"
31 #include "gimple-expr.h"
32 #include "tree-pretty-print.h"
33 #include "fold-const.h"
34 #include "cfgloop.h"
35 #include "tree-ssa-loop-ivopts.h"
36 #include "tree-ssa-loop-niter.h"
37 #include "tree-chrec.h"
38 #include "gimple.h"
39 #include "tree-ssa-loop.h"
40 #include "dumpfile.h"
41 #include "tree-scalar-evolution.h"
42
43 /* Extended folder for chrecs. */
44
45 /* Fold the addition of two polynomial functions. */
46
47 static inline tree
48 chrec_fold_plus_poly_poly (enum tree_code code,
49 tree type,
50 tree poly0,
51 tree poly1)
52 {
53 tree left, right;
54 class loop *loop0 = get_chrec_loop (poly0);
55 class loop *loop1 = get_chrec_loop (poly1);
56 tree rtype = code == POINTER_PLUS_EXPR ? chrec_type (poly1) : type;
57
58 gcc_assert (poly0);
59 gcc_assert (poly1);
60 gcc_assert (TREE_CODE (poly0) == POLYNOMIAL_CHREC);
61 gcc_assert (TREE_CODE (poly1) == POLYNOMIAL_CHREC);
62 if (POINTER_TYPE_P (chrec_type (poly0)))
63 gcc_checking_assert (ptrofftype_p (chrec_type (poly1))
64 && useless_type_conversion_p (type, chrec_type (poly0)));
65 else
66 gcc_checking_assert (useless_type_conversion_p (type, chrec_type (poly0))
67 && useless_type_conversion_p (type, chrec_type (poly1)));
68
69 /*
70 {a, +, b}_1 + {c, +, d}_2 -> {{a, +, b}_1 + c, +, d}_2,
71 {a, +, b}_2 + {c, +, d}_1 -> {{c, +, d}_1 + a, +, b}_2,
72 {a, +, b}_x + {c, +, d}_x -> {a+c, +, b+d}_x. */
73 if (flow_loop_nested_p (loop0, loop1))
74 {
75 if (code == PLUS_EXPR || code == POINTER_PLUS_EXPR)
76 return build_polynomial_chrec
77 (CHREC_VARIABLE (poly1),
78 chrec_fold_plus (type, poly0, CHREC_LEFT (poly1)),
79 CHREC_RIGHT (poly1));
80 else
81 return build_polynomial_chrec
82 (CHREC_VARIABLE (poly1),
83 chrec_fold_minus (type, poly0, CHREC_LEFT (poly1)),
84 chrec_fold_multiply (type, CHREC_RIGHT (poly1),
85 SCALAR_FLOAT_TYPE_P (type)
86 ? build_real (type, dconstm1)
87 : build_int_cst_type (type, -1)));
88 }
89
90 if (flow_loop_nested_p (loop1, loop0))
91 {
92 if (code == PLUS_EXPR || code == POINTER_PLUS_EXPR)
93 return build_polynomial_chrec
94 (CHREC_VARIABLE (poly0),
95 chrec_fold_plus (type, CHREC_LEFT (poly0), poly1),
96 CHREC_RIGHT (poly0));
97 else
98 return build_polynomial_chrec
99 (CHREC_VARIABLE (poly0),
100 chrec_fold_minus (type, CHREC_LEFT (poly0), poly1),
101 CHREC_RIGHT (poly0));
102 }
103
104 /* This function should never be called for chrecs of loops that
105 do not belong to the same loop nest. */
106 if (loop0 != loop1)
107 {
108 /* It still can happen if we are not in loop-closed SSA form. */
109 gcc_assert (! loops_state_satisfies_p (LOOP_CLOSED_SSA));
110 return chrec_dont_know;
111 }
112
113 if (code == PLUS_EXPR || code == POINTER_PLUS_EXPR)
114 {
115 left = chrec_fold_plus
116 (type, CHREC_LEFT (poly0), CHREC_LEFT (poly1));
117 right = chrec_fold_plus
118 (rtype, CHREC_RIGHT (poly0), CHREC_RIGHT (poly1));
119 }
120 else
121 {
122 left = chrec_fold_minus
123 (type, CHREC_LEFT (poly0), CHREC_LEFT (poly1));
124 right = chrec_fold_minus
125 (type, CHREC_RIGHT (poly0), CHREC_RIGHT (poly1));
126 }
127
128 if (chrec_zerop (right))
129 return left;
130 else
131 return build_polynomial_chrec
132 (CHREC_VARIABLE (poly0), left, right);
133 }
134
135 \f
136
137 /* Fold the multiplication of two polynomial functions. */
138
139 static inline tree
140 chrec_fold_multiply_poly_poly (tree type,
141 tree poly0,
142 tree poly1)
143 {
144 tree t0, t1, t2;
145 int var;
146 class loop *loop0 = get_chrec_loop (poly0);
147 class loop *loop1 = get_chrec_loop (poly1);
148
149 gcc_assert (poly0);
150 gcc_assert (poly1);
151 gcc_assert (TREE_CODE (poly0) == POLYNOMIAL_CHREC);
152 gcc_assert (TREE_CODE (poly1) == POLYNOMIAL_CHREC);
153 gcc_checking_assert (useless_type_conversion_p (type, chrec_type (poly0))
154 && useless_type_conversion_p (type, chrec_type (poly1)));
155
156 /* {a, +, b}_1 * {c, +, d}_2 -> {c*{a, +, b}_1, +, d}_2,
157 {a, +, b}_2 * {c, +, d}_1 -> {a*{c, +, d}_1, +, b}_2,
158 {a, +, b}_x * {c, +, d}_x -> {a*c, +, a*d + b*c + b*d, +, 2*b*d}_x. */
159 if (flow_loop_nested_p (loop0, loop1))
160 /* poly0 is a constant wrt. poly1. */
161 return build_polynomial_chrec
162 (CHREC_VARIABLE (poly1),
163 chrec_fold_multiply (type, CHREC_LEFT (poly1), poly0),
164 CHREC_RIGHT (poly1));
165
166 if (flow_loop_nested_p (loop1, loop0))
167 /* poly1 is a constant wrt. poly0. */
168 return build_polynomial_chrec
169 (CHREC_VARIABLE (poly0),
170 chrec_fold_multiply (type, CHREC_LEFT (poly0), poly1),
171 CHREC_RIGHT (poly0));
172
173 if (loop0 != loop1)
174 {
175 /* It still can happen if we are not in loop-closed SSA form. */
176 gcc_assert (! loops_state_satisfies_p (LOOP_CLOSED_SSA));
177 return chrec_dont_know;
178 }
179
180 /* poly0 and poly1 are two polynomials in the same variable,
181 {a, +, b}_x * {c, +, d}_x -> {a*c, +, a*d + b*c + b*d, +, 2*b*d}_x. */
182
183 /* "a*c". */
184 t0 = chrec_fold_multiply (type, CHREC_LEFT (poly0), CHREC_LEFT (poly1));
185
186 /* "a*d + b*c". */
187 t1 = chrec_fold_multiply (type, CHREC_LEFT (poly0), CHREC_RIGHT (poly1));
188 t1 = chrec_fold_plus (type, t1, chrec_fold_multiply (type,
189 CHREC_RIGHT (poly0),
190 CHREC_LEFT (poly1)));
191 /* "b*d". */
192 t2 = chrec_fold_multiply (type, CHREC_RIGHT (poly0), CHREC_RIGHT (poly1));
193 /* "a*d + b*c + b*d". */
194 t1 = chrec_fold_plus (type, t1, t2);
195 /* "2*b*d". */
196 t2 = chrec_fold_multiply (type, SCALAR_FLOAT_TYPE_P (type)
197 ? build_real (type, dconst2)
198 : build_int_cst (type, 2), t2);
199
200 var = CHREC_VARIABLE (poly0);
201 return build_polynomial_chrec (var, t0,
202 build_polynomial_chrec (var, t1, t2));
203 }
204
205 /* When the operands are automatically_generated_chrec_p, the fold has
206 to respect the semantics of the operands. */
207
208 static inline tree
209 chrec_fold_automatically_generated_operands (tree op0,
210 tree op1)
211 {
212 if (op0 == chrec_dont_know
213 || op1 == chrec_dont_know)
214 return chrec_dont_know;
215
216 if (op0 == chrec_known
217 || op1 == chrec_known)
218 return chrec_known;
219
220 if (op0 == chrec_not_analyzed_yet
221 || op1 == chrec_not_analyzed_yet)
222 return chrec_not_analyzed_yet;
223
224 /* The default case produces a safe result. */
225 return chrec_dont_know;
226 }
227
228 /* Fold the addition of two chrecs. */
229
230 static tree
231 chrec_fold_plus_1 (enum tree_code code, tree type,
232 tree op0, tree op1)
233 {
234 if (automatically_generated_chrec_p (op0)
235 || automatically_generated_chrec_p (op1))
236 return chrec_fold_automatically_generated_operands (op0, op1);
237
238 switch (TREE_CODE (op0))
239 {
240 case POLYNOMIAL_CHREC:
241 gcc_checking_assert
242 (!chrec_contains_symbols_defined_in_loop (op0, CHREC_VARIABLE (op0)));
243 switch (TREE_CODE (op1))
244 {
245 case POLYNOMIAL_CHREC:
246 gcc_checking_assert
247 (!chrec_contains_symbols_defined_in_loop (op1,
248 CHREC_VARIABLE (op1)));
249 return chrec_fold_plus_poly_poly (code, type, op0, op1);
250
251 CASE_CONVERT:
252 {
253 /* We can strip sign-conversions to signed by performing the
254 operation in unsigned. */
255 tree optype = TREE_TYPE (TREE_OPERAND (op1, 0));
256 if (INTEGRAL_TYPE_P (type)
257 && INTEGRAL_TYPE_P (optype)
258 && tree_nop_conversion_p (type, optype)
259 && TYPE_UNSIGNED (optype))
260 return chrec_convert (type,
261 chrec_fold_plus_1 (code, optype,
262 chrec_convert (optype,
263 op0, NULL),
264 TREE_OPERAND (op1, 0)),
265 NULL);
266 if (tree_contains_chrecs (op1, NULL))
267 return chrec_dont_know;
268 }
269 /* FALLTHRU */
270
271 default:
272 if (code == PLUS_EXPR || code == POINTER_PLUS_EXPR)
273 return build_polynomial_chrec
274 (CHREC_VARIABLE (op0),
275 chrec_fold_plus (type, CHREC_LEFT (op0), op1),
276 CHREC_RIGHT (op0));
277 else
278 return build_polynomial_chrec
279 (CHREC_VARIABLE (op0),
280 chrec_fold_minus (type, CHREC_LEFT (op0), op1),
281 CHREC_RIGHT (op0));
282 }
283
284 CASE_CONVERT:
285 {
286 /* We can strip sign-conversions to signed by performing the
287 operation in unsigned. */
288 tree optype = TREE_TYPE (TREE_OPERAND (op0, 0));
289 if (INTEGRAL_TYPE_P (type)
290 && INTEGRAL_TYPE_P (optype)
291 && tree_nop_conversion_p (type, optype)
292 && TYPE_UNSIGNED (optype))
293 return chrec_convert (type,
294 chrec_fold_plus_1 (code, optype,
295 TREE_OPERAND (op0, 0),
296 chrec_convert (optype,
297 op1, NULL)),
298 NULL);
299 if (tree_contains_chrecs (op0, NULL))
300 return chrec_dont_know;
301 }
302 /* FALLTHRU */
303
304 default:
305 switch (TREE_CODE (op1))
306 {
307 case POLYNOMIAL_CHREC:
308 gcc_checking_assert
309 (!chrec_contains_symbols_defined_in_loop (op1,
310 CHREC_VARIABLE (op1)));
311 if (code == PLUS_EXPR || code == POINTER_PLUS_EXPR)
312 return build_polynomial_chrec
313 (CHREC_VARIABLE (op1),
314 chrec_fold_plus (type, op0, CHREC_LEFT (op1)),
315 CHREC_RIGHT (op1));
316 else
317 return build_polynomial_chrec
318 (CHREC_VARIABLE (op1),
319 chrec_fold_minus (type, op0, CHREC_LEFT (op1)),
320 chrec_fold_multiply (type, CHREC_RIGHT (op1),
321 SCALAR_FLOAT_TYPE_P (type)
322 ? build_real (type, dconstm1)
323 : build_int_cst_type (type, -1)));
324
325 CASE_CONVERT:
326 if (tree_contains_chrecs (op1, NULL))
327 return chrec_dont_know;
328 /* FALLTHRU */
329
330 default:
331 {
332 int size = 0;
333 if ((tree_contains_chrecs (op0, &size)
334 || tree_contains_chrecs (op1, &size))
335 && size < param_scev_max_expr_size)
336 return build2 (code, type, op0, op1);
337 else if (size < param_scev_max_expr_size)
338 {
339 if (code == POINTER_PLUS_EXPR)
340 return fold_build_pointer_plus (fold_convert (type, op0),
341 op1);
342 else
343 return fold_build2 (code, type,
344 fold_convert (type, op0),
345 fold_convert (type, op1));
346 }
347 else
348 return chrec_dont_know;
349 }
350 }
351 }
352 }
353
354 /* Fold the addition of two chrecs. */
355
356 tree
357 chrec_fold_plus (tree type,
358 tree op0,
359 tree op1)
360 {
361 enum tree_code code;
362 if (automatically_generated_chrec_p (op0)
363 || automatically_generated_chrec_p (op1))
364 return chrec_fold_automatically_generated_operands (op0, op1);
365
366 if (integer_zerop (op0))
367 return chrec_convert (type, op1, NULL);
368 if (integer_zerop (op1))
369 return chrec_convert (type, op0, NULL);
370
371 if (POINTER_TYPE_P (type))
372 code = POINTER_PLUS_EXPR;
373 else
374 code = PLUS_EXPR;
375
376 return chrec_fold_plus_1 (code, type, op0, op1);
377 }
378
379 /* Fold the subtraction of two chrecs. */
380
381 tree
382 chrec_fold_minus (tree type,
383 tree op0,
384 tree op1)
385 {
386 if (automatically_generated_chrec_p (op0)
387 || automatically_generated_chrec_p (op1))
388 return chrec_fold_automatically_generated_operands (op0, op1);
389
390 if (integer_zerop (op1))
391 return op0;
392
393 return chrec_fold_plus_1 (MINUS_EXPR, type, op0, op1);
394 }
395
396 /* Fold the multiplication of two chrecs. */
397
398 tree
399 chrec_fold_multiply (tree type,
400 tree op0,
401 tree op1)
402 {
403 if (automatically_generated_chrec_p (op0)
404 || automatically_generated_chrec_p (op1))
405 return chrec_fold_automatically_generated_operands (op0, op1);
406
407 switch (TREE_CODE (op0))
408 {
409 case POLYNOMIAL_CHREC:
410 gcc_checking_assert
411 (!chrec_contains_symbols_defined_in_loop (op0, CHREC_VARIABLE (op0)));
412 switch (TREE_CODE (op1))
413 {
414 case POLYNOMIAL_CHREC:
415 gcc_checking_assert
416 (!chrec_contains_symbols_defined_in_loop (op1,
417 CHREC_VARIABLE (op1)));
418 return chrec_fold_multiply_poly_poly (type, op0, op1);
419
420 CASE_CONVERT:
421 if (tree_contains_chrecs (op1, NULL))
422 return chrec_dont_know;
423 /* FALLTHRU */
424
425 default:
426 if (integer_onep (op1))
427 return op0;
428 if (integer_zerop (op1))
429 return build_int_cst (type, 0);
430
431 return build_polynomial_chrec
432 (CHREC_VARIABLE (op0),
433 chrec_fold_multiply (type, CHREC_LEFT (op0), op1),
434 chrec_fold_multiply (type, CHREC_RIGHT (op0), op1));
435 }
436
437 CASE_CONVERT:
438 if (tree_contains_chrecs (op0, NULL))
439 return chrec_dont_know;
440 /* FALLTHRU */
441
442 default:
443 if (integer_onep (op0))
444 return op1;
445
446 if (integer_zerop (op0))
447 return build_int_cst (type, 0);
448
449 switch (TREE_CODE (op1))
450 {
451 case POLYNOMIAL_CHREC:
452 gcc_checking_assert
453 (!chrec_contains_symbols_defined_in_loop (op1,
454 CHREC_VARIABLE (op1)));
455 return build_polynomial_chrec
456 (CHREC_VARIABLE (op1),
457 chrec_fold_multiply (type, CHREC_LEFT (op1), op0),
458 chrec_fold_multiply (type, CHREC_RIGHT (op1), op0));
459
460 CASE_CONVERT:
461 if (tree_contains_chrecs (op1, NULL))
462 return chrec_dont_know;
463 /* FALLTHRU */
464
465 default:
466 if (integer_onep (op1))
467 return op0;
468 if (integer_zerop (op1))
469 return build_int_cst (type, 0);
470 return fold_build2 (MULT_EXPR, type, op0, op1);
471 }
472 }
473 }
474
475 \f
476
477 /* Operations. */
478
479 /* Evaluate the binomial coefficient. Return NULL_TREE if the intermediate
480 calculation overflows, otherwise return C(n,k) with type TYPE. */
481
482 static tree
483 tree_fold_binomial (tree type, tree n, unsigned int k)
484 {
485 wi::overflow_type overflow;
486 unsigned int i;
487
488 /* Handle the most frequent cases. */
489 if (k == 0)
490 return build_int_cst (type, 1);
491 if (k == 1)
492 return fold_convert (type, n);
493
494 widest_int num = wi::to_widest (n);
495
496 /* Check that k <= n. */
497 if (wi::ltu_p (num, k))
498 return NULL_TREE;
499
500 /* Denominator = 2. */
501 widest_int denom = 2;
502
503 /* Index = Numerator-1. */
504 widest_int idx = num - 1;
505
506 /* Numerator = Numerator*Index = n*(n-1). */
507 num = wi::smul (num, idx, &overflow);
508 if (overflow)
509 return NULL_TREE;
510
511 for (i = 3; i <= k; i++)
512 {
513 /* Index--. */
514 --idx;
515
516 /* Numerator *= Index. */
517 num = wi::smul (num, idx, &overflow);
518 if (overflow)
519 return NULL_TREE;
520
521 /* Denominator *= i. */
522 denom *= i;
523 }
524
525 /* Result = Numerator / Denominator. */
526 num = wi::udiv_trunc (num, denom);
527 if (! wi::fits_to_tree_p (num, type))
528 return NULL_TREE;
529 return wide_int_to_tree (type, num);
530 }
531
532 /* Helper function. Use the Newton's interpolating formula for
533 evaluating the value of the evolution function.
534 The result may be in an unsigned type of CHREC. */
535
536 static tree
537 chrec_evaluate (unsigned var, tree chrec, tree n, unsigned int k)
538 {
539 tree arg0, arg1, binomial_n_k;
540 tree type = TREE_TYPE (chrec);
541 class loop *var_loop = get_loop (cfun, var);
542
543 while (TREE_CODE (chrec) == POLYNOMIAL_CHREC
544 && flow_loop_nested_p (var_loop, get_chrec_loop (chrec)))
545 chrec = CHREC_LEFT (chrec);
546
547 /* The formula associates the expression and thus we have to make
548 sure to not introduce undefined overflow. */
549 tree ctype = type;
550 if (INTEGRAL_TYPE_P (type)
551 && ! TYPE_OVERFLOW_WRAPS (type))
552 ctype = unsigned_type_for (type);
553
554 if (TREE_CODE (chrec) == POLYNOMIAL_CHREC
555 && CHREC_VARIABLE (chrec) == var)
556 {
557 arg1 = chrec_evaluate (var, CHREC_RIGHT (chrec), n, k + 1);
558 if (arg1 == chrec_dont_know)
559 return chrec_dont_know;
560 binomial_n_k = tree_fold_binomial (ctype, n, k);
561 if (!binomial_n_k)
562 return chrec_dont_know;
563 tree l = chrec_convert (ctype, CHREC_LEFT (chrec), NULL);
564 arg0 = fold_build2 (MULT_EXPR, ctype, l, binomial_n_k);
565 return chrec_fold_plus (ctype, arg0, arg1);
566 }
567
568 binomial_n_k = tree_fold_binomial (ctype, n, k);
569 if (!binomial_n_k)
570 return chrec_dont_know;
571
572 return fold_build2 (MULT_EXPR, ctype,
573 chrec_convert (ctype, chrec, NULL), binomial_n_k);
574 }
575
576 /* Evaluates "CHREC (X)" when the varying variable is VAR.
577 Example: Given the following parameters,
578
579 var = 1
580 chrec = {3, +, 4}_1
581 x = 10
582
583 The result is given by the Newton's interpolating formula:
584 3 * \binom{10}{0} + 4 * \binom{10}{1}.
585 */
586
587 tree
588 chrec_apply (unsigned var,
589 tree chrec,
590 tree x)
591 {
592 tree type = chrec_type (chrec);
593 tree res = chrec_dont_know;
594
595 if (automatically_generated_chrec_p (chrec)
596 || automatically_generated_chrec_p (x)
597
598 /* When the symbols are defined in an outer loop, it is possible
599 to symbolically compute the apply, since the symbols are
600 constants with respect to the varying loop. */
601 || chrec_contains_symbols_defined_in_loop (chrec, var))
602 return chrec_dont_know;
603
604 if (dump_file && (dump_flags & TDF_SCEV))
605 fprintf (dump_file, "(chrec_apply \n");
606
607 if (TREE_CODE (x) == INTEGER_CST && SCALAR_FLOAT_TYPE_P (type))
608 x = build_real_from_int_cst (type, x);
609
610 switch (TREE_CODE (chrec))
611 {
612 case POLYNOMIAL_CHREC:
613 if (evolution_function_is_affine_p (chrec))
614 {
615 tree chrecr = CHREC_RIGHT (chrec);
616 tree chrecl = CHREC_LEFT (chrec);
617 if (CHREC_VARIABLE (chrec) != var)
618 res = build_polynomial_chrec (CHREC_VARIABLE (chrec),
619 chrec_apply (var, chrecl, x),
620 chrec_apply (var, chrecr, x));
621
622 /* "{a, +, a}" (x-1) -> "a*x". */
623 else if (operand_equal_p (chrecl, chrecr)
624 && TREE_CODE (x) == PLUS_EXPR
625 && integer_all_onesp (TREE_OPERAND (x, 1))
626 && !POINTER_TYPE_P (type)
627 && TYPE_PRECISION (TREE_TYPE (x))
628 >= TYPE_PRECISION (type))
629 {
630 /* We know the number of iterations can't be negative. */
631 res = build_int_cst (TREE_TYPE (x), 1);
632 res = chrec_fold_plus (TREE_TYPE (x), x, res);
633 res = chrec_convert_rhs (type, res, NULL);
634 res = chrec_fold_multiply (type, chrecr, res);
635 }
636 /* "{a, +, b} (x)" -> "a + b*x". */
637 else
638 {
639 /* The overall increment might not fit in a signed type so
640 use an unsigned computation to get at the final value
641 and avoid undefined signed overflow. */
642 tree utype = TREE_TYPE (chrecr);
643 if (INTEGRAL_TYPE_P (utype) && !TYPE_OVERFLOW_WRAPS (utype))
644 utype = unsigned_type_for (TREE_TYPE (chrecr));
645 res = chrec_convert_rhs (utype, x, NULL);
646 res = chrec_fold_multiply (utype,
647 chrec_convert (utype, chrecr, NULL),
648 res);
649 /* When the resulting increment fits the original type
650 do the increment in it. */
651 if (TREE_CODE (res) == INTEGER_CST
652 && int_fits_type_p (res, TREE_TYPE (chrecr)))
653 {
654 res = chrec_convert (TREE_TYPE (chrecr), res, NULL);
655 res = chrec_fold_plus (type, chrecl, res);
656 }
657 else
658 {
659 res = chrec_fold_plus (utype,
660 chrec_convert (utype, chrecl, NULL),
661 res);
662 res = chrec_convert (type, res, NULL);
663 }
664 }
665 }
666 else if (TREE_CODE (x) == INTEGER_CST
667 && tree_int_cst_sgn (x) == 1)
668 /* testsuite/.../ssa-chrec-38.c. */
669 res = chrec_convert (type, chrec_evaluate (var, chrec, x, 0), NULL);
670 else
671 res = chrec_dont_know;
672 break;
673
674 CASE_CONVERT:
675 res = chrec_convert (TREE_TYPE (chrec),
676 chrec_apply (var, TREE_OPERAND (chrec, 0), x),
677 NULL);
678 break;
679
680 default:
681 res = chrec;
682 break;
683 }
684
685 if (dump_file && (dump_flags & TDF_SCEV))
686 {
687 fprintf (dump_file, " (varying_loop = %d", var);
688 fprintf (dump_file, ")\n (chrec = ");
689 print_generic_expr (dump_file, chrec);
690 fprintf (dump_file, ")\n (x = ");
691 print_generic_expr (dump_file, x);
692 fprintf (dump_file, ")\n (res = ");
693 print_generic_expr (dump_file, res);
694 fprintf (dump_file, "))\n");
695 }
696
697 return res;
698 }
699
700 /* For a given CHREC and an induction variable map IV_MAP that maps
701 (loop->num, expr) for every loop number of the current_loops an
702 expression, calls chrec_apply when the expression is not NULL. */
703
704 tree
705 chrec_apply_map (tree chrec, vec<tree> iv_map)
706 {
707 int i;
708 tree expr;
709
710 FOR_EACH_VEC_ELT (iv_map, i, expr)
711 if (expr)
712 chrec = chrec_apply (i, chrec, expr);
713
714 return chrec;
715 }
716
717 /* Replaces the initial condition in CHREC with INIT_COND. */
718
719 tree
720 chrec_replace_initial_condition (tree chrec,
721 tree init_cond)
722 {
723 if (automatically_generated_chrec_p (chrec))
724 return chrec;
725
726 gcc_assert (chrec_type (chrec) == chrec_type (init_cond));
727
728 switch (TREE_CODE (chrec))
729 {
730 case POLYNOMIAL_CHREC:
731 return build_polynomial_chrec
732 (CHREC_VARIABLE (chrec),
733 chrec_replace_initial_condition (CHREC_LEFT (chrec), init_cond),
734 CHREC_RIGHT (chrec));
735
736 default:
737 return init_cond;
738 }
739 }
740
741 /* Returns the initial condition of a given CHREC. */
742
743 tree
744 initial_condition (tree chrec)
745 {
746 if (automatically_generated_chrec_p (chrec))
747 return chrec;
748
749 if (TREE_CODE (chrec) == POLYNOMIAL_CHREC)
750 return initial_condition (CHREC_LEFT (chrec));
751 else
752 return chrec;
753 }
754
755 /* Returns a univariate function that represents the evolution in
756 LOOP_NUM. Mask the evolution of any other loop. */
757
758 tree
759 hide_evolution_in_other_loops_than_loop (tree chrec,
760 unsigned loop_num)
761 {
762 class loop *loop = get_loop (cfun, loop_num), *chloop;
763 if (automatically_generated_chrec_p (chrec))
764 return chrec;
765
766 switch (TREE_CODE (chrec))
767 {
768 case POLYNOMIAL_CHREC:
769 chloop = get_chrec_loop (chrec);
770
771 if (chloop == loop)
772 return build_polynomial_chrec
773 (loop_num,
774 hide_evolution_in_other_loops_than_loop (CHREC_LEFT (chrec),
775 loop_num),
776 CHREC_RIGHT (chrec));
777
778 else if (flow_loop_nested_p (chloop, loop))
779 /* There is no evolution in this loop. */
780 return initial_condition (chrec);
781
782 else if (flow_loop_nested_p (loop, chloop))
783 return hide_evolution_in_other_loops_than_loop (CHREC_LEFT (chrec),
784 loop_num);
785
786 else
787 return chrec_dont_know;
788
789 default:
790 return chrec;
791 }
792 }
793
794 /* Returns the evolution part of CHREC in LOOP_NUM when RIGHT is
795 true, otherwise returns the initial condition in LOOP_NUM. */
796
797 static tree
798 chrec_component_in_loop_num (tree chrec,
799 unsigned loop_num,
800 bool right)
801 {
802 tree component;
803 class loop *loop = get_loop (cfun, loop_num), *chloop;
804
805 if (automatically_generated_chrec_p (chrec))
806 return chrec;
807
808 switch (TREE_CODE (chrec))
809 {
810 case POLYNOMIAL_CHREC:
811 chloop = get_chrec_loop (chrec);
812
813 if (chloop == loop)
814 {
815 if (right)
816 component = CHREC_RIGHT (chrec);
817 else
818 component = CHREC_LEFT (chrec);
819
820 if (TREE_CODE (CHREC_LEFT (chrec)) != POLYNOMIAL_CHREC
821 || CHREC_VARIABLE (CHREC_LEFT (chrec)) != CHREC_VARIABLE (chrec))
822 return component;
823
824 else
825 return build_polynomial_chrec
826 (loop_num,
827 chrec_component_in_loop_num (CHREC_LEFT (chrec),
828 loop_num,
829 right),
830 component);
831 }
832
833 else if (flow_loop_nested_p (chloop, loop))
834 /* There is no evolution part in this loop. */
835 return NULL_TREE;
836
837 else
838 {
839 gcc_assert (flow_loop_nested_p (loop, chloop));
840 return chrec_component_in_loop_num (CHREC_LEFT (chrec),
841 loop_num,
842 right);
843 }
844
845 default:
846 if (right)
847 return NULL_TREE;
848 else
849 return chrec;
850 }
851 }
852
853 /* Returns the evolution part in LOOP_NUM. Example: the call
854 evolution_part_in_loop_num ({{0, +, 1}_1, +, 2}_1, 1) returns
855 {1, +, 2}_1 */
856
857 tree
858 evolution_part_in_loop_num (tree chrec,
859 unsigned loop_num)
860 {
861 return chrec_component_in_loop_num (chrec, loop_num, true);
862 }
863
864 /* Returns the initial condition in LOOP_NUM. Example: the call
865 initial_condition_in_loop_num ({{0, +, 1}_1, +, 2}_2, 2) returns
866 {0, +, 1}_1 */
867
868 tree
869 initial_condition_in_loop_num (tree chrec,
870 unsigned loop_num)
871 {
872 return chrec_component_in_loop_num (chrec, loop_num, false);
873 }
874
875 /* Set or reset the evolution of CHREC to NEW_EVOL in loop LOOP_NUM.
876 This function is essentially used for setting the evolution to
877 chrec_dont_know, for example after having determined that it is
878 impossible to say how many times a loop will execute. */
879
880 tree
881 reset_evolution_in_loop (unsigned loop_num,
882 tree chrec,
883 tree new_evol)
884 {
885 class loop *loop = get_loop (cfun, loop_num);
886
887 if (POINTER_TYPE_P (chrec_type (chrec)))
888 gcc_assert (ptrofftype_p (chrec_type (new_evol)));
889 else
890 gcc_assert (chrec_type (chrec) == chrec_type (new_evol));
891
892 if (TREE_CODE (chrec) == POLYNOMIAL_CHREC
893 && flow_loop_nested_p (loop, get_chrec_loop (chrec)))
894 {
895 tree left = reset_evolution_in_loop (loop_num, CHREC_LEFT (chrec),
896 new_evol);
897 tree right = reset_evolution_in_loop (loop_num, CHREC_RIGHT (chrec),
898 new_evol);
899 return build_polynomial_chrec (CHREC_VARIABLE (chrec), left, right);
900 }
901
902 while (TREE_CODE (chrec) == POLYNOMIAL_CHREC
903 && CHREC_VARIABLE (chrec) == loop_num)
904 chrec = CHREC_LEFT (chrec);
905
906 return build_polynomial_chrec (loop_num, chrec, new_evol);
907 }
908
909 /* Merges two evolution functions that were found by following two
910 alternate paths of a conditional expression. */
911
912 tree
913 chrec_merge (tree chrec1,
914 tree chrec2)
915 {
916 if (chrec1 == chrec_dont_know
917 || chrec2 == chrec_dont_know)
918 return chrec_dont_know;
919
920 if (chrec1 == chrec_known
921 || chrec2 == chrec_known)
922 return chrec_known;
923
924 if (chrec1 == chrec_not_analyzed_yet)
925 return chrec2;
926 if (chrec2 == chrec_not_analyzed_yet)
927 return chrec1;
928
929 if (eq_evolutions_p (chrec1, chrec2))
930 return chrec1;
931
932 return chrec_dont_know;
933 }
934
935 \f
936
937 /* Observers. */
938
939 /* Helper function for is_multivariate_chrec. */
940
941 static bool
942 is_multivariate_chrec_rec (const_tree chrec, unsigned int rec_var)
943 {
944 if (chrec == NULL_TREE)
945 return false;
946
947 if (TREE_CODE (chrec) == POLYNOMIAL_CHREC)
948 {
949 if (CHREC_VARIABLE (chrec) != rec_var)
950 return true;
951 else
952 return (is_multivariate_chrec_rec (CHREC_LEFT (chrec), rec_var)
953 || is_multivariate_chrec_rec (CHREC_RIGHT (chrec), rec_var));
954 }
955 else
956 return false;
957 }
958
959 /* Determine whether the given chrec is multivariate or not. */
960
961 bool
962 is_multivariate_chrec (const_tree chrec)
963 {
964 if (chrec == NULL_TREE)
965 return false;
966
967 if (TREE_CODE (chrec) == POLYNOMIAL_CHREC)
968 return (is_multivariate_chrec_rec (CHREC_LEFT (chrec),
969 CHREC_VARIABLE (chrec))
970 || is_multivariate_chrec_rec (CHREC_RIGHT (chrec),
971 CHREC_VARIABLE (chrec)));
972 else
973 return false;
974 }
975
976 /* Determines whether the chrec contains symbolic names or not. If LOOP isn't
977 NULL, we also consider chrec wrto outer loops of LOOP as symbol. */
978
979 static bool
980 chrec_contains_symbols (const_tree chrec, hash_set<const_tree> &visited,
981 class loop *loop)
982 {
983 int i, n;
984
985 if (chrec == NULL_TREE)
986 return false;
987
988 if (TREE_CODE (chrec) == SSA_NAME
989 || VAR_P (chrec)
990 || TREE_CODE (chrec) == POLY_INT_CST
991 || TREE_CODE (chrec) == PARM_DECL
992 || TREE_CODE (chrec) == FUNCTION_DECL
993 || TREE_CODE (chrec) == LABEL_DECL
994 || TREE_CODE (chrec) == RESULT_DECL
995 || TREE_CODE (chrec) == FIELD_DECL)
996 return true;
997
998 if (loop != NULL
999 && TREE_CODE (chrec) == POLYNOMIAL_CHREC
1000 && flow_loop_nested_p (get_chrec_loop (chrec), loop))
1001 return true;
1002
1003 if (visited.add (chrec))
1004 return false;
1005
1006 n = TREE_OPERAND_LENGTH (chrec);
1007 for (i = 0; i < n; i++)
1008 if (chrec_contains_symbols (TREE_OPERAND (chrec, i), visited, loop))
1009 return true;
1010 return false;
1011 }
1012
1013 /* Return true if CHREC contains any symbols. If LOOP is not NULL, check if
1014 CHREC contains any chrec which is invariant wrto the loop (nest), in other
1015 words, chrec defined by outer loops of loop, so from LOOP's point of view,
1016 the chrec is considered as a SYMBOL. */
1017
1018 bool
1019 chrec_contains_symbols (const_tree chrec, class loop* loop)
1020 {
1021 hash_set<const_tree> visited;
1022 return chrec_contains_symbols (chrec, visited, loop);
1023 }
1024
1025 /* Return true when CHREC contains symbolic names defined in
1026 LOOP_NB. */
1027
1028 static bool
1029 chrec_contains_symbols_defined_in_loop (const_tree chrec, unsigned loop_nb,
1030 hash_set<const_tree> &visited)
1031 {
1032 int i, n;
1033
1034 if (chrec == NULL_TREE)
1035 return false;
1036
1037 if (is_gimple_min_invariant (chrec))
1038 return false;
1039
1040 if (TREE_CODE (chrec) == SSA_NAME)
1041 {
1042 gimple *def;
1043 loop_p def_loop, loop;
1044
1045 if (SSA_NAME_IS_DEFAULT_DEF (chrec))
1046 return false;
1047
1048 def = SSA_NAME_DEF_STMT (chrec);
1049 def_loop = loop_containing_stmt (def);
1050 loop = get_loop (cfun, loop_nb);
1051
1052 if (def_loop == NULL)
1053 return false;
1054
1055 if (loop == def_loop || flow_loop_nested_p (loop, def_loop))
1056 return true;
1057
1058 return false;
1059 }
1060
1061 if (visited.add (chrec))
1062 return false;
1063
1064 n = TREE_OPERAND_LENGTH (chrec);
1065 for (i = 0; i < n; i++)
1066 if (chrec_contains_symbols_defined_in_loop (TREE_OPERAND (chrec, i),
1067 loop_nb, visited))
1068 return true;
1069 return false;
1070 }
1071
1072 /* Return true when CHREC contains symbolic names defined in
1073 LOOP_NB. */
1074
1075 bool
1076 chrec_contains_symbols_defined_in_loop (const_tree chrec, unsigned loop_nb)
1077 {
1078 hash_set<const_tree> visited;
1079 return chrec_contains_symbols_defined_in_loop (chrec, loop_nb, visited);
1080 }
1081
1082 /* Determines whether the chrec contains undetermined coefficients. */
1083
1084 static bool
1085 chrec_contains_undetermined (const_tree chrec, hash_set<const_tree> &visited)
1086 {
1087 int i, n;
1088
1089 if (chrec == chrec_dont_know)
1090 return true;
1091
1092 if (chrec == NULL_TREE)
1093 return false;
1094
1095 if (visited.add (chrec))
1096 return false;
1097
1098 n = TREE_OPERAND_LENGTH (chrec);
1099 for (i = 0; i < n; i++)
1100 if (chrec_contains_undetermined (TREE_OPERAND (chrec, i), visited))
1101 return true;
1102 return false;
1103 }
1104
1105 bool
1106 chrec_contains_undetermined (const_tree chrec)
1107 {
1108 hash_set<const_tree> visited;
1109 return chrec_contains_undetermined (chrec, visited);
1110 }
1111
1112 /* Determines whether the tree EXPR contains chrecs, and increment
1113 SIZE if it is not a NULL pointer by an estimation of the depth of
1114 the tree. */
1115
1116 static bool
1117 tree_contains_chrecs (const_tree expr, int *size, hash_set<const_tree> &visited)
1118 {
1119 int i, n;
1120
1121 if (expr == NULL_TREE)
1122 return false;
1123
1124 if (size)
1125 (*size)++;
1126
1127 if (tree_is_chrec (expr))
1128 return true;
1129
1130 if (visited.add (expr))
1131 return false;
1132
1133 n = TREE_OPERAND_LENGTH (expr);
1134 for (i = 0; i < n; i++)
1135 if (tree_contains_chrecs (TREE_OPERAND (expr, i), size, visited))
1136 return true;
1137 return false;
1138 }
1139
1140 bool
1141 tree_contains_chrecs (const_tree expr, int *size)
1142 {
1143 hash_set<const_tree> visited;
1144 return tree_contains_chrecs (expr, size, visited);
1145 }
1146
1147
1148 /* Recursive helper function. */
1149
1150 static bool
1151 evolution_function_is_invariant_rec_p (tree chrec, int loopnum)
1152 {
1153 if (evolution_function_is_constant_p (chrec))
1154 return true;
1155
1156 if (TREE_CODE (chrec) == SSA_NAME
1157 && (loopnum == 0
1158 || expr_invariant_in_loop_p (get_loop (cfun, loopnum), chrec)))
1159 return true;
1160
1161 if (TREE_CODE (chrec) == POLYNOMIAL_CHREC)
1162 {
1163 if (CHREC_VARIABLE (chrec) == (unsigned) loopnum
1164 || flow_loop_nested_p (get_loop (cfun, loopnum),
1165 get_chrec_loop (chrec))
1166 || !evolution_function_is_invariant_rec_p (CHREC_RIGHT (chrec),
1167 loopnum)
1168 || !evolution_function_is_invariant_rec_p (CHREC_LEFT (chrec),
1169 loopnum))
1170 return false;
1171 return true;
1172 }
1173
1174 switch (TREE_OPERAND_LENGTH (chrec))
1175 {
1176 case 2:
1177 if (!evolution_function_is_invariant_rec_p (TREE_OPERAND (chrec, 1),
1178 loopnum))
1179 return false;
1180 /* FALLTHRU */
1181
1182 case 1:
1183 if (!evolution_function_is_invariant_rec_p (TREE_OPERAND (chrec, 0),
1184 loopnum))
1185 return false;
1186 return true;
1187
1188 default:
1189 return false;
1190 }
1191 }
1192
1193 /* Return true if CHREC is invariant in loop LOOPNUM, false otherwise. */
1194
1195 bool
1196 evolution_function_is_invariant_p (tree chrec, int loopnum)
1197 {
1198 return evolution_function_is_invariant_rec_p (chrec, loopnum);
1199 }
1200
1201 /* Determine whether the given tree is an affine multivariate
1202 evolution. */
1203
1204 bool
1205 evolution_function_is_affine_multivariate_p (const_tree chrec, int loopnum)
1206 {
1207 if (chrec == NULL_TREE)
1208 return false;
1209
1210 switch (TREE_CODE (chrec))
1211 {
1212 case POLYNOMIAL_CHREC:
1213 if (evolution_function_is_invariant_rec_p (CHREC_LEFT (chrec), loopnum))
1214 {
1215 if (evolution_function_is_invariant_rec_p (CHREC_RIGHT (chrec), loopnum))
1216 return true;
1217 else
1218 {
1219 if (TREE_CODE (CHREC_RIGHT (chrec)) == POLYNOMIAL_CHREC
1220 && CHREC_VARIABLE (CHREC_RIGHT (chrec))
1221 != CHREC_VARIABLE (chrec)
1222 && evolution_function_is_affine_multivariate_p
1223 (CHREC_RIGHT (chrec), loopnum))
1224 return true;
1225 else
1226 return false;
1227 }
1228 }
1229 else
1230 {
1231 if (evolution_function_is_invariant_rec_p (CHREC_RIGHT (chrec), loopnum)
1232 && TREE_CODE (CHREC_LEFT (chrec)) == POLYNOMIAL_CHREC
1233 && CHREC_VARIABLE (CHREC_LEFT (chrec)) != CHREC_VARIABLE (chrec)
1234 && evolution_function_is_affine_multivariate_p
1235 (CHREC_LEFT (chrec), loopnum))
1236 return true;
1237 else
1238 return false;
1239 }
1240
1241 default:
1242 return false;
1243 }
1244 }
1245
1246 /* Determine whether the given tree is a function in zero or one
1247 variables with respect to loop specified by LOOPNUM. Note only positive
1248 LOOPNUM stands for a real loop. */
1249
1250 bool
1251 evolution_function_is_univariate_p (const_tree chrec, int loopnum)
1252 {
1253 if (chrec == NULL_TREE)
1254 return true;
1255
1256 tree sub_chrec;
1257 switch (TREE_CODE (chrec))
1258 {
1259 case POLYNOMIAL_CHREC:
1260 switch (TREE_CODE (CHREC_LEFT (chrec)))
1261 {
1262 case POLYNOMIAL_CHREC:
1263 sub_chrec = CHREC_LEFT (chrec);
1264 if (CHREC_VARIABLE (chrec) != CHREC_VARIABLE (sub_chrec)
1265 && (loopnum <= 0
1266 || CHREC_VARIABLE (sub_chrec) == (unsigned) loopnum
1267 || flow_loop_nested_p (get_loop (cfun, loopnum),
1268 get_chrec_loop (sub_chrec))))
1269 return false;
1270 if (!evolution_function_is_univariate_p (sub_chrec, loopnum))
1271 return false;
1272 break;
1273
1274 default:
1275 if (tree_contains_chrecs (CHREC_LEFT (chrec), NULL))
1276 return false;
1277 break;
1278 }
1279
1280 switch (TREE_CODE (CHREC_RIGHT (chrec)))
1281 {
1282 case POLYNOMIAL_CHREC:
1283 sub_chrec = CHREC_RIGHT (chrec);
1284 if (CHREC_VARIABLE (chrec) != CHREC_VARIABLE (sub_chrec)
1285 && (loopnum <= 0
1286 || CHREC_VARIABLE (sub_chrec) == (unsigned) loopnum
1287 || flow_loop_nested_p (get_loop (cfun, loopnum),
1288 get_chrec_loop (sub_chrec))))
1289 return false;
1290 if (!evolution_function_is_univariate_p (sub_chrec, loopnum))
1291 return false;
1292 break;
1293
1294 default:
1295 if (tree_contains_chrecs (CHREC_RIGHT (chrec), NULL))
1296 return false;
1297 break;
1298 }
1299 return true;
1300
1301 default:
1302 return true;
1303 }
1304 }
1305
1306 /* Returns the number of variables of CHREC. Example: the call
1307 nb_vars_in_chrec ({{0, +, 1}_5, +, 2}_6) returns 2. */
1308
1309 unsigned
1310 nb_vars_in_chrec (tree chrec)
1311 {
1312 if (chrec == NULL_TREE)
1313 return 0;
1314
1315 switch (TREE_CODE (chrec))
1316 {
1317 case POLYNOMIAL_CHREC:
1318 return 1 + nb_vars_in_chrec
1319 (initial_condition_in_loop_num (chrec, CHREC_VARIABLE (chrec)));
1320
1321 default:
1322 return 0;
1323 }
1324 }
1325
1326 /* Converts BASE and STEP of affine scev to TYPE. LOOP is the loop whose iv
1327 the scev corresponds to. AT_STMT is the statement at that the scev is
1328 evaluated. USE_OVERFLOW_SEMANTICS is true if this function should assume
1329 that the rules for overflow of the given language apply (e.g., that signed
1330 arithmetics in C does not overflow) -- i.e., to use them to avoid
1331 unnecessary tests, but also to enforce that the result follows them.
1332 FROM is the source variable converted if it's not NULL. Returns true if
1333 the conversion succeeded, false otherwise. */
1334
1335 bool
1336 convert_affine_scev (class loop *loop, tree type,
1337 tree *base, tree *step, gimple *at_stmt,
1338 bool use_overflow_semantics, tree from)
1339 {
1340 tree ct = TREE_TYPE (*step);
1341 bool enforce_overflow_semantics;
1342 bool must_check_src_overflow, must_check_rslt_overflow;
1343 tree new_base, new_step;
1344 tree step_type = POINTER_TYPE_P (type) ? sizetype : type;
1345
1346 /* In general,
1347 (TYPE) (BASE + STEP * i) = (TYPE) BASE + (TYPE -- sign extend) STEP * i,
1348 but we must check some assumptions.
1349
1350 1) If [BASE, +, STEP] wraps, the equation is not valid when precision
1351 of CT is smaller than the precision of TYPE. For example, when we
1352 cast unsigned char [254, +, 1] to unsigned, the values on left side
1353 are 254, 255, 0, 1, ..., but those on the right side are
1354 254, 255, 256, 257, ...
1355 2) In case that we must also preserve the fact that signed ivs do not
1356 overflow, we must additionally check that the new iv does not wrap.
1357 For example, unsigned char [125, +, 1] casted to signed char could
1358 become a wrapping variable with values 125, 126, 127, -128, -127, ...,
1359 which would confuse optimizers that assume that this does not
1360 happen. */
1361 must_check_src_overflow = TYPE_PRECISION (ct) < TYPE_PRECISION (type);
1362
1363 enforce_overflow_semantics = (use_overflow_semantics
1364 && nowrap_type_p (type));
1365 if (enforce_overflow_semantics)
1366 {
1367 /* We can avoid checking whether the result overflows in the following
1368 cases:
1369
1370 -- must_check_src_overflow is true, and the range of TYPE is superset
1371 of the range of CT -- i.e., in all cases except if CT signed and
1372 TYPE unsigned.
1373 -- both CT and TYPE have the same precision and signedness, and we
1374 verify instead that the source does not overflow (this may be
1375 easier than verifying it for the result, as we may use the
1376 information about the semantics of overflow in CT). */
1377 if (must_check_src_overflow)
1378 {
1379 if (TYPE_UNSIGNED (type) && !TYPE_UNSIGNED (ct))
1380 must_check_rslt_overflow = true;
1381 else
1382 must_check_rslt_overflow = false;
1383 }
1384 else if (TYPE_UNSIGNED (ct) == TYPE_UNSIGNED (type)
1385 && TYPE_PRECISION (ct) == TYPE_PRECISION (type))
1386 {
1387 must_check_rslt_overflow = false;
1388 must_check_src_overflow = true;
1389 }
1390 else
1391 must_check_rslt_overflow = true;
1392 }
1393 else
1394 must_check_rslt_overflow = false;
1395
1396 if (must_check_src_overflow
1397 && scev_probably_wraps_p (from, *base, *step, at_stmt, loop,
1398 use_overflow_semantics))
1399 return false;
1400
1401 new_base = chrec_convert (type, *base, at_stmt, use_overflow_semantics);
1402 /* The step must be sign extended, regardless of the signedness
1403 of CT and TYPE. This only needs to be handled specially when
1404 CT is unsigned -- to avoid e.g. unsigned char [100, +, 255]
1405 (with values 100, 99, 98, ...) from becoming signed or unsigned
1406 [100, +, 255] with values 100, 355, ...; the sign-extension is
1407 performed by default when CT is signed. */
1408 new_step = *step;
1409 if (TYPE_PRECISION (step_type) > TYPE_PRECISION (ct) && TYPE_UNSIGNED (ct))
1410 {
1411 tree signed_ct = build_nonstandard_integer_type (TYPE_PRECISION (ct), 0);
1412 new_step = chrec_convert (signed_ct, new_step, at_stmt,
1413 use_overflow_semantics);
1414 }
1415 new_step = chrec_convert (step_type, new_step, at_stmt,
1416 use_overflow_semantics);
1417
1418 if (automatically_generated_chrec_p (new_base)
1419 || automatically_generated_chrec_p (new_step))
1420 return false;
1421
1422 if (must_check_rslt_overflow
1423 /* Note that in this case we cannot use the fact that signed variables
1424 do not overflow, as this is what we are verifying for the new iv. */
1425 && scev_probably_wraps_p (NULL_TREE, new_base, new_step,
1426 at_stmt, loop, false))
1427 return false;
1428
1429 *base = new_base;
1430 *step = new_step;
1431 return true;
1432 }
1433 \f
1434
1435 /* Convert CHREC for the right hand side of a CHREC.
1436 The increment for a pointer type is always sizetype. */
1437
1438 tree
1439 chrec_convert_rhs (tree type, tree chrec, gimple *at_stmt)
1440 {
1441 if (POINTER_TYPE_P (type))
1442 type = sizetype;
1443
1444 return chrec_convert (type, chrec, at_stmt);
1445 }
1446
1447 /* Convert CHREC to TYPE. When the analyzer knows the context in
1448 which the CHREC is built, it sets AT_STMT to the statement that
1449 contains the definition of the analyzed variable, otherwise the
1450 conversion is less accurate: the information is used for
1451 determining a more accurate estimation of the number of iterations.
1452 By default AT_STMT could be safely set to NULL_TREE.
1453
1454 USE_OVERFLOW_SEMANTICS is true if this function should assume that
1455 the rules for overflow of the given language apply (e.g., that signed
1456 arithmetics in C does not overflow) -- i.e., to use them to avoid
1457 unnecessary tests, but also to enforce that the result follows them.
1458
1459 FROM is the source variable converted if it's not NULL. */
1460
1461 static tree
1462 chrec_convert_1 (tree type, tree chrec, gimple *at_stmt,
1463 bool use_overflow_semantics, tree from)
1464 {
1465 tree ct, res;
1466 tree base, step;
1467 class loop *loop;
1468
1469 if (automatically_generated_chrec_p (chrec))
1470 return chrec;
1471
1472 ct = chrec_type (chrec);
1473 if (useless_type_conversion_p (type, ct))
1474 return chrec;
1475
1476 if (!evolution_function_is_affine_p (chrec))
1477 goto keep_cast;
1478
1479 loop = get_chrec_loop (chrec);
1480 base = CHREC_LEFT (chrec);
1481 step = CHREC_RIGHT (chrec);
1482
1483 if (convert_affine_scev (loop, type, &base, &step, at_stmt,
1484 use_overflow_semantics, from))
1485 return build_polynomial_chrec (loop->num, base, step);
1486
1487 /* If we cannot propagate the cast inside the chrec, just keep the cast. */
1488 keep_cast:
1489 /* Fold will not canonicalize (long)(i - 1) to (long)i - 1 because that
1490 may be more expensive. We do want to perform this optimization here
1491 though for canonicalization reasons. */
1492 if (use_overflow_semantics
1493 && (TREE_CODE (chrec) == PLUS_EXPR
1494 || TREE_CODE (chrec) == MINUS_EXPR)
1495 && TREE_CODE (type) == INTEGER_TYPE
1496 && TREE_CODE (ct) == INTEGER_TYPE
1497 && TYPE_PRECISION (type) > TYPE_PRECISION (ct)
1498 && TYPE_OVERFLOW_UNDEFINED (ct))
1499 res = fold_build2 (TREE_CODE (chrec), type,
1500 fold_convert (type, TREE_OPERAND (chrec, 0)),
1501 fold_convert (type, TREE_OPERAND (chrec, 1)));
1502 /* Similar perform the trick that (signed char)((int)x + 2) can be
1503 narrowed to (signed char)((unsigned char)x + 2). */
1504 else if (use_overflow_semantics
1505 && TREE_CODE (chrec) == POLYNOMIAL_CHREC
1506 && TREE_CODE (ct) == INTEGER_TYPE
1507 && TREE_CODE (type) == INTEGER_TYPE
1508 && TYPE_OVERFLOW_UNDEFINED (type)
1509 && TYPE_PRECISION (type) < TYPE_PRECISION (ct))
1510 {
1511 tree utype = unsigned_type_for (type);
1512 res = build_polynomial_chrec (CHREC_VARIABLE (chrec),
1513 fold_convert (utype,
1514 CHREC_LEFT (chrec)),
1515 fold_convert (utype,
1516 CHREC_RIGHT (chrec)));
1517 res = chrec_convert_1 (type, res, at_stmt, use_overflow_semantics, from);
1518 }
1519 else
1520 res = fold_convert (type, chrec);
1521
1522 /* Don't propagate overflows. */
1523 if (CONSTANT_CLASS_P (res))
1524 TREE_OVERFLOW (res) = 0;
1525
1526 /* But reject constants that don't fit in their type after conversion.
1527 This can happen if TYPE_MIN_VALUE or TYPE_MAX_VALUE are not the
1528 natural values associated with TYPE_PRECISION and TYPE_UNSIGNED,
1529 and can cause problems later when computing niters of loops. Note
1530 that we don't do the check before converting because we don't want
1531 to reject conversions of negative chrecs to unsigned types. */
1532 if (TREE_CODE (res) == INTEGER_CST
1533 && TREE_CODE (type) == INTEGER_TYPE
1534 && !int_fits_type_p (res, type))
1535 res = chrec_dont_know;
1536
1537 return res;
1538 }
1539
1540 /* Convert CHREC to TYPE. When the analyzer knows the context in
1541 which the CHREC is built, it sets AT_STMT to the statement that
1542 contains the definition of the analyzed variable, otherwise the
1543 conversion is less accurate: the information is used for
1544 determining a more accurate estimation of the number of iterations.
1545 By default AT_STMT could be safely set to NULL_TREE.
1546
1547 The following rule is always true: TREE_TYPE (chrec) ==
1548 TREE_TYPE (CHREC_LEFT (chrec)) == TREE_TYPE (CHREC_RIGHT (chrec)).
1549 An example of what could happen when adding two chrecs and the type
1550 of the CHREC_RIGHT is different than CHREC_LEFT is:
1551
1552 {(uint) 0, +, (uchar) 10} +
1553 {(uint) 0, +, (uchar) 250}
1554
1555 that would produce a wrong result if CHREC_RIGHT is not (uint):
1556
1557 {(uint) 0, +, (uchar) 4}
1558
1559 instead of
1560
1561 {(uint) 0, +, (uint) 260}
1562
1563 USE_OVERFLOW_SEMANTICS is true if this function should assume that
1564 the rules for overflow of the given language apply (e.g., that signed
1565 arithmetics in C does not overflow) -- i.e., to use them to avoid
1566 unnecessary tests, but also to enforce that the result follows them.
1567
1568 FROM is the source variable converted if it's not NULL. */
1569
1570 tree
1571 chrec_convert (tree type, tree chrec, gimple *at_stmt,
1572 bool use_overflow_semantics, tree from)
1573 {
1574 return chrec_convert_1 (type, chrec, at_stmt, use_overflow_semantics, from);
1575 }
1576
1577 /* Convert CHREC to TYPE, without regard to signed overflows. Returns the new
1578 chrec if something else than what chrec_convert would do happens, NULL_TREE
1579 otherwise. This function set TRUE to variable pointed by FOLD_CONVERSIONS
1580 if the result chrec may overflow. */
1581
1582 tree
1583 chrec_convert_aggressive (tree type, tree chrec, bool *fold_conversions)
1584 {
1585 tree inner_type, left, right, lc, rc, rtype;
1586
1587 gcc_assert (fold_conversions != NULL);
1588
1589 if (automatically_generated_chrec_p (chrec)
1590 || TREE_CODE (chrec) != POLYNOMIAL_CHREC)
1591 return NULL_TREE;
1592
1593 inner_type = TREE_TYPE (chrec);
1594 if (TYPE_PRECISION (type) > TYPE_PRECISION (inner_type))
1595 return NULL_TREE;
1596
1597 if (useless_type_conversion_p (type, inner_type))
1598 return NULL_TREE;
1599
1600 if (!*fold_conversions && evolution_function_is_affine_p (chrec))
1601 {
1602 tree base, step;
1603 class loop *loop;
1604
1605 loop = get_chrec_loop (chrec);
1606 base = CHREC_LEFT (chrec);
1607 step = CHREC_RIGHT (chrec);
1608 if (convert_affine_scev (loop, type, &base, &step, NULL, true))
1609 return build_polynomial_chrec (loop->num, base, step);
1610 }
1611 rtype = POINTER_TYPE_P (type) ? sizetype : type;
1612
1613 left = CHREC_LEFT (chrec);
1614 right = CHREC_RIGHT (chrec);
1615 lc = chrec_convert_aggressive (type, left, fold_conversions);
1616 if (!lc)
1617 lc = chrec_convert (type, left, NULL);
1618 rc = chrec_convert_aggressive (rtype, right, fold_conversions);
1619 if (!rc)
1620 rc = chrec_convert (rtype, right, NULL);
1621
1622 *fold_conversions = true;
1623
1624 return build_polynomial_chrec (CHREC_VARIABLE (chrec), lc, rc);
1625 }
1626
1627 /* Returns true when CHREC0 == CHREC1. */
1628
1629 bool
1630 eq_evolutions_p (const_tree chrec0, const_tree chrec1)
1631 {
1632 if (chrec0 == NULL_TREE
1633 || chrec1 == NULL_TREE
1634 || TREE_CODE (chrec0) != TREE_CODE (chrec1))
1635 return false;
1636
1637 if (chrec0 == chrec1)
1638 return true;
1639
1640 if (! types_compatible_p (TREE_TYPE (chrec0), TREE_TYPE (chrec1)))
1641 return false;
1642
1643 switch (TREE_CODE (chrec0))
1644 {
1645 case POLYNOMIAL_CHREC:
1646 return (CHREC_VARIABLE (chrec0) == CHREC_VARIABLE (chrec1)
1647 && eq_evolutions_p (CHREC_LEFT (chrec0), CHREC_LEFT (chrec1))
1648 && eq_evolutions_p (CHREC_RIGHT (chrec0), CHREC_RIGHT (chrec1)));
1649
1650 case PLUS_EXPR:
1651 case MULT_EXPR:
1652 case MINUS_EXPR:
1653 case POINTER_PLUS_EXPR:
1654 return eq_evolutions_p (TREE_OPERAND (chrec0, 0),
1655 TREE_OPERAND (chrec1, 0))
1656 && eq_evolutions_p (TREE_OPERAND (chrec0, 1),
1657 TREE_OPERAND (chrec1, 1));
1658
1659 CASE_CONVERT:
1660 return eq_evolutions_p (TREE_OPERAND (chrec0, 0),
1661 TREE_OPERAND (chrec1, 0));
1662
1663 default:
1664 return operand_equal_p (chrec0, chrec1, 0);
1665 }
1666 }
1667
1668 /* Returns EV_GROWS if CHREC grows (assuming that it does not overflow),
1669 EV_DECREASES if it decreases, and EV_UNKNOWN if we cannot determine
1670 which of these cases happens. */
1671
1672 enum ev_direction
1673 scev_direction (const_tree chrec)
1674 {
1675 const_tree step;
1676
1677 if (!evolution_function_is_affine_p (chrec))
1678 return EV_DIR_UNKNOWN;
1679
1680 step = CHREC_RIGHT (chrec);
1681 if (TREE_CODE (step) != INTEGER_CST)
1682 return EV_DIR_UNKNOWN;
1683
1684 if (tree_int_cst_sign_bit (step))
1685 return EV_DIR_DECREASES;
1686 else
1687 return EV_DIR_GROWS;
1688 }
1689
1690 /* Iterates over all the components of SCEV, and calls CBCK. */
1691
1692 void
1693 for_each_scev_op (tree *scev, bool (*cbck) (tree *, void *), void *data)
1694 {
1695 switch (TREE_CODE_LENGTH (TREE_CODE (*scev)))
1696 {
1697 case 3:
1698 for_each_scev_op (&TREE_OPERAND (*scev, 2), cbck, data);
1699 /* FALLTHRU */
1700
1701 case 2:
1702 for_each_scev_op (&TREE_OPERAND (*scev, 1), cbck, data);
1703 /* FALLTHRU */
1704
1705 case 1:
1706 for_each_scev_op (&TREE_OPERAND (*scev, 0), cbck, data);
1707 /* FALLTHRU */
1708
1709 default:
1710 cbck (scev, data);
1711 break;
1712 }
1713 }
1714
1715 /* Returns true when the operation can be part of a linear
1716 expression. */
1717
1718 static inline bool
1719 operator_is_linear (tree scev)
1720 {
1721 switch (TREE_CODE (scev))
1722 {
1723 case INTEGER_CST:
1724 case POLYNOMIAL_CHREC:
1725 case PLUS_EXPR:
1726 case POINTER_PLUS_EXPR:
1727 case MULT_EXPR:
1728 case MINUS_EXPR:
1729 case NEGATE_EXPR:
1730 case SSA_NAME:
1731 case NON_LVALUE_EXPR:
1732 case BIT_NOT_EXPR:
1733 CASE_CONVERT:
1734 return true;
1735
1736 default:
1737 return false;
1738 }
1739 }
1740
1741 /* Return true when SCEV is a linear expression. Linear expressions
1742 can contain additions, substractions and multiplications.
1743 Multiplications are restricted to constant scaling: "cst * x". */
1744
1745 bool
1746 scev_is_linear_expression (tree scev)
1747 {
1748 if (evolution_function_is_constant_p (scev))
1749 return true;
1750
1751 if (scev == NULL
1752 || !operator_is_linear (scev))
1753 return false;
1754
1755 if (TREE_CODE (scev) == MULT_EXPR)
1756 return !(tree_contains_chrecs (TREE_OPERAND (scev, 0), NULL)
1757 && tree_contains_chrecs (TREE_OPERAND (scev, 1), NULL));
1758
1759 if (TREE_CODE (scev) == POLYNOMIAL_CHREC
1760 && !evolution_function_is_affine_multivariate_p (scev, CHREC_VARIABLE (scev)))
1761 return false;
1762
1763 switch (TREE_CODE_LENGTH (TREE_CODE (scev)))
1764 {
1765 case 3:
1766 return scev_is_linear_expression (TREE_OPERAND (scev, 0))
1767 && scev_is_linear_expression (TREE_OPERAND (scev, 1))
1768 && scev_is_linear_expression (TREE_OPERAND (scev, 2));
1769
1770 case 2:
1771 return scev_is_linear_expression (TREE_OPERAND (scev, 0))
1772 && scev_is_linear_expression (TREE_OPERAND (scev, 1));
1773
1774 case 1:
1775 return scev_is_linear_expression (TREE_OPERAND (scev, 0));
1776
1777 case 0:
1778 return true;
1779
1780 default:
1781 return false;
1782 }
1783 }
1784
1785 /* Determines whether the expression CHREC contains only interger consts
1786 in the right parts. */
1787
1788 bool
1789 evolution_function_right_is_integer_cst (const_tree chrec)
1790 {
1791 if (chrec == NULL_TREE)
1792 return false;
1793
1794 switch (TREE_CODE (chrec))
1795 {
1796 case INTEGER_CST:
1797 return true;
1798
1799 case POLYNOMIAL_CHREC:
1800 return TREE_CODE (CHREC_RIGHT (chrec)) == INTEGER_CST
1801 && (TREE_CODE (CHREC_LEFT (chrec)) != POLYNOMIAL_CHREC
1802 || evolution_function_right_is_integer_cst (CHREC_LEFT (chrec)));
1803
1804 CASE_CONVERT:
1805 return evolution_function_right_is_integer_cst (TREE_OPERAND (chrec, 0));
1806
1807 default:
1808 return false;
1809 }
1810 }