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