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