Branch data Line data Source code
1 : : /* Functions to determine/estimate number of iterations of a loop.
2 : : Copyright (C) 2004-2025 Free Software Foundation, Inc.
3 : :
4 : : This file is part of GCC.
5 : :
6 : : GCC is free software; you can redistribute it and/or modify it
7 : : under the terms of the GNU General Public License as published by the
8 : : Free Software Foundation; either version 3, or (at your option) any
9 : : later version.
10 : :
11 : : GCC is distributed in the hope that it will be useful, but WITHOUT
12 : : ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 : : FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 : : for more details.
15 : :
16 : : You should have received a copy of the GNU General Public License
17 : : along with GCC; see the file COPYING3. If not see
18 : : <http://www.gnu.org/licenses/>. */
19 : :
20 : : #include "config.h"
21 : : #include "system.h"
22 : : #include "coretypes.h"
23 : : #include "backend.h"
24 : : #include "rtl.h"
25 : : #include "tree.h"
26 : : #include "gimple.h"
27 : : #include "tree-pass.h"
28 : : #include "ssa.h"
29 : : #include "gimple-pretty-print.h"
30 : : #include "diagnostic-core.h"
31 : : #include "stor-layout.h"
32 : : #include "fold-const.h"
33 : : #include "calls.h"
34 : : #include "intl.h"
35 : : #include "gimplify.h"
36 : : #include "gimple-iterator.h"
37 : : #include "tree-cfg.h"
38 : : #include "tree-ssa-loop-ivopts.h"
39 : : #include "tree-ssa-loop-niter.h"
40 : : #include "tree-ssa-loop.h"
41 : : #include "cfgloop.h"
42 : : #include "tree-chrec.h"
43 : : #include "tree-scalar-evolution.h"
44 : : #include "tree-data-ref.h"
45 : : #include "tree-dfa.h"
46 : : #include "internal-fn.h"
47 : : #include "gimple-range.h"
48 : : #include "sreal.h"
49 : :
50 : :
51 : : /* The maximum number of dominator BBs we search for conditions
52 : : of loop header copies we use for simplifying a conditional
53 : : expression. */
54 : : #define MAX_DOMINATORS_TO_WALK 8
55 : :
56 : : /*
57 : :
58 : : Analysis of number of iterations of an affine exit test.
59 : :
60 : : */
61 : :
62 : : /* Bounds on some value, BELOW <= X <= UP. */
63 : :
64 : : struct bounds
65 : : {
66 : : mpz_t below, up;
67 : : };
68 : :
69 : : /* Splits expression EXPR to a variable part VAR and constant OFFSET. */
70 : :
71 : : static void
72 : 48374440 : split_to_var_and_offset (tree expr, tree *var, mpz_t offset)
73 : : {
74 : 48374440 : tree type = TREE_TYPE (expr);
75 : 48374440 : tree op0, op1;
76 : 48374440 : bool negate = false;
77 : :
78 : 48374440 : *var = expr;
79 : 48374440 : mpz_set_ui (offset, 0);
80 : :
81 : 48374440 : switch (TREE_CODE (expr))
82 : : {
83 : 8035 : case MINUS_EXPR:
84 : 8035 : negate = true;
85 : : /* Fallthru. */
86 : :
87 : 4868305 : case PLUS_EXPR:
88 : 4868305 : case POINTER_PLUS_EXPR:
89 : 4868305 : op0 = TREE_OPERAND (expr, 0);
90 : 4868305 : op1 = TREE_OPERAND (expr, 1);
91 : :
92 : 4868305 : if (TREE_CODE (op1) != INTEGER_CST)
93 : : break;
94 : :
95 : 4857151 : *var = op0;
96 : : /* Always sign extend the offset. */
97 : 4857151 : wi::to_mpz (wi::to_wide (op1), offset, SIGNED);
98 : 4857151 : if (negate)
99 : 29 : mpz_neg (offset, offset);
100 : : break;
101 : :
102 : 21887504 : case INTEGER_CST:
103 : 21887504 : *var = build_int_cst_type (type, 0);
104 : 21887504 : wi::to_mpz (wi::to_wide (expr), offset, TYPE_SIGN (type));
105 : 21887504 : break;
106 : :
107 : : default:
108 : : break;
109 : : }
110 : 48374440 : }
111 : :
112 : : /* From condition C0 CMP C1 derives information regarding the value range
113 : : of VAR, which is of TYPE. Results are stored in to BELOW and UP. */
114 : :
115 : : static void
116 : 14763420 : refine_value_range_using_guard (tree type, tree var,
117 : : tree c0, enum tree_code cmp, tree c1,
118 : : mpz_t below, mpz_t up)
119 : : {
120 : 14763420 : tree varc0, varc1, ctype;
121 : 14763420 : mpz_t offc0, offc1;
122 : 14763420 : mpz_t mint, maxt, minc1, maxc1;
123 : 14763420 : bool no_wrap = nowrap_type_p (type);
124 : 14763420 : bool c0_ok, c1_ok;
125 : 14763420 : signop sgn = TYPE_SIGN (type);
126 : :
127 : 14763420 : switch (cmp)
128 : : {
129 : 7013676 : case LT_EXPR:
130 : 7013676 : case LE_EXPR:
131 : 7013676 : case GT_EXPR:
132 : 7013676 : case GE_EXPR:
133 : 7013676 : STRIP_SIGN_NOPS (c0);
134 : 7013676 : STRIP_SIGN_NOPS (c1);
135 : 7013676 : ctype = TREE_TYPE (c0);
136 : 7013676 : if (!useless_type_conversion_p (ctype, type))
137 : 12854362 : return;
138 : :
139 : : break;
140 : :
141 : : case EQ_EXPR:
142 : : /* We could derive quite precise information from EQ_EXPR, however,
143 : : such a guard is unlikely to appear, so we do not bother with
144 : : handling it. */
145 : : return;
146 : :
147 : 3618776 : case NE_EXPR:
148 : : /* NE_EXPR comparisons do not contain much of useful information,
149 : : except for cases of comparing with bounds. */
150 : 3618776 : if (TREE_CODE (c1) != INTEGER_CST
151 : 3386704 : || !INTEGRAL_TYPE_P (type))
152 : : return;
153 : :
154 : : /* Ensure that the condition speaks about an expression in the same
155 : : type as X and Y. */
156 : 3386704 : ctype = TREE_TYPE (c0);
157 : 3386704 : if (TYPE_PRECISION (ctype) != TYPE_PRECISION (type))
158 : : return;
159 : 1988222 : c0 = fold_convert (type, c0);
160 : 1988222 : c1 = fold_convert (type, c1);
161 : :
162 : 1988222 : if (operand_equal_p (var, c0, 0))
163 : : {
164 : : /* Case of comparing VAR with its below/up bounds. */
165 : 247549 : auto_mpz valc1;
166 : 247549 : wi::to_mpz (wi::to_wide (c1), valc1, TYPE_SIGN (type));
167 : 247549 : if (mpz_cmp (valc1, below) == 0)
168 : 108729 : cmp = GT_EXPR;
169 : 247549 : if (mpz_cmp (valc1, up) == 0)
170 : 37411 : cmp = LT_EXPR;
171 : 247549 : }
172 : : else
173 : : {
174 : : /* Case of comparing with the bounds of the type. */
175 : 1740673 : wide_int min = wi::min_value (type);
176 : 1740673 : wide_int max = wi::max_value (type);
177 : :
178 : 1740673 : if (wi::to_wide (c1) == min)
179 : 476903 : cmp = GT_EXPR;
180 : 1740673 : if (wi::to_wide (c1) == max)
181 : 17017 : cmp = LT_EXPR;
182 : 1740673 : }
183 : :
184 : : /* Quick return if no useful information. */
185 : 1988222 : if (cmp == NE_EXPR)
186 : : return;
187 : :
188 : : break;
189 : :
190 : : default:
191 : : return;
192 : : }
193 : :
194 : 6605198 : mpz_init (offc0);
195 : 6605198 : mpz_init (offc1);
196 : 6605198 : split_to_var_and_offset (expand_simple_operations (c0), &varc0, offc0);
197 : 6605198 : split_to_var_and_offset (expand_simple_operations (c1), &varc1, offc1);
198 : :
199 : : /* We are only interested in comparisons of expressions based on VAR. */
200 : 6605198 : if (operand_equal_p (var, varc1, 0))
201 : : {
202 : 520546 : std::swap (varc0, varc1);
203 : 520546 : mpz_swap (offc0, offc1);
204 : 520546 : cmp = swap_tree_comparison (cmp);
205 : : }
206 : 6084652 : else if (!operand_equal_p (var, varc0, 0))
207 : : {
208 : 4696140 : mpz_clear (offc0);
209 : 4696140 : mpz_clear (offc1);
210 : 4696140 : return;
211 : : }
212 : :
213 : 1909058 : mpz_init (mint);
214 : 1909058 : mpz_init (maxt);
215 : 1909058 : get_type_static_bounds (type, mint, maxt);
216 : 1909058 : mpz_init (minc1);
217 : 1909058 : mpz_init (maxc1);
218 : 3818116 : int_range_max r (TREE_TYPE (varc1));
219 : : /* Setup range information for varc1. */
220 : 1909058 : if (integer_zerop (varc1))
221 : : {
222 : 956683 : wi::to_mpz (0, minc1, TYPE_SIGN (type));
223 : 956683 : wi::to_mpz (0, maxc1, TYPE_SIGN (type));
224 : : }
225 : 952375 : else if (TREE_CODE (varc1) == SSA_NAME
226 : 902130 : && INTEGRAL_TYPE_P (type)
227 : 1804260 : && get_range_query (cfun)->range_of_expr (r, varc1)
228 : 902130 : && !r.undefined_p ()
229 : 1852552 : && !r.varying_p ())
230 : : {
231 : 660898 : gcc_assert (wi::le_p (r.lower_bound (), r.upper_bound (), sgn));
232 : 330449 : wi::to_mpz (r.lower_bound (), minc1, sgn);
233 : 330449 : wi::to_mpz (r.upper_bound (), maxc1, sgn);
234 : : }
235 : : else
236 : : {
237 : 621926 : mpz_set (minc1, mint);
238 : 621926 : mpz_set (maxc1, maxt);
239 : : }
240 : :
241 : : /* Compute valid range information for varc1 + offc1. Note nothing
242 : : useful can be derived if it overflows or underflows. Overflow or
243 : : underflow could happen when:
244 : :
245 : : offc1 > 0 && varc1 + offc1 > MAX_VAL (type)
246 : : offc1 < 0 && varc1 + offc1 < MIN_VAL (type). */
247 : 1909058 : mpz_add (minc1, minc1, offc1);
248 : 1909058 : mpz_add (maxc1, maxc1, offc1);
249 : 3818116 : c1_ok = (no_wrap
250 : 679200 : || mpz_sgn (offc1) == 0
251 : 82229 : || (mpz_sgn (offc1) < 0 && mpz_cmp (minc1, mint) >= 0)
252 : 1989526 : || (mpz_sgn (offc1) > 0 && mpz_cmp (maxc1, maxt) <= 0));
253 : 17620 : if (!c1_ok)
254 : 17620 : goto end;
255 : :
256 : 1891438 : if (mpz_cmp (minc1, mint) < 0)
257 : 40562 : mpz_set (minc1, mint);
258 : 1891438 : if (mpz_cmp (maxc1, maxt) > 0)
259 : 11843 : mpz_set (maxc1, maxt);
260 : :
261 : 1891438 : if (cmp == LT_EXPR)
262 : : {
263 : 296718 : cmp = LE_EXPR;
264 : 296718 : mpz_sub_ui (maxc1, maxc1, 1);
265 : : }
266 : 1891438 : if (cmp == GT_EXPR)
267 : : {
268 : 995576 : cmp = GE_EXPR;
269 : 995576 : mpz_add_ui (minc1, minc1, 1);
270 : : }
271 : :
272 : : /* Compute range information for varc0. If there is no overflow,
273 : : the condition implied that
274 : :
275 : : (varc0) cmp (varc1 + offc1 - offc0)
276 : :
277 : : We can possibly improve the upper bound of varc0 if cmp is LE_EXPR,
278 : : or the below bound if cmp is GE_EXPR.
279 : :
280 : : To prove there is no overflow/underflow, we need to check below
281 : : four cases:
282 : : 1) cmp == LE_EXPR && offc0 > 0
283 : :
284 : : (varc0 + offc0) doesn't overflow
285 : : && (varc1 + offc1 - offc0) doesn't underflow
286 : :
287 : : 2) cmp == LE_EXPR && offc0 < 0
288 : :
289 : : (varc0 + offc0) doesn't underflow
290 : : && (varc1 + offc1 - offc0) doesn't overfloe
291 : :
292 : : In this case, (varc0 + offc0) will never underflow if we can
293 : : prove (varc1 + offc1 - offc0) doesn't overflow.
294 : :
295 : : 3) cmp == GE_EXPR && offc0 < 0
296 : :
297 : : (varc0 + offc0) doesn't underflow
298 : : && (varc1 + offc1 - offc0) doesn't overflow
299 : :
300 : : 4) cmp == GE_EXPR && offc0 > 0
301 : :
302 : : (varc0 + offc0) doesn't overflow
303 : : && (varc1 + offc1 - offc0) doesn't underflow
304 : :
305 : : In this case, (varc0 + offc0) will never overflow if we can
306 : : prove (varc1 + offc1 - offc0) doesn't underflow.
307 : :
308 : : Note we only handle case 2 and 4 in below code. */
309 : :
310 : 1891438 : mpz_sub (minc1, minc1, offc0);
311 : 1891438 : mpz_sub (maxc1, maxc1, offc0);
312 : 3782876 : c0_ok = (no_wrap
313 : 661580 : || mpz_sgn (offc0) == 0
314 : 36051 : || (cmp == LE_EXPR
315 : 20864 : && mpz_sgn (offc0) < 0 && mpz_cmp (maxc1, maxt) <= 0)
316 : 1926294 : || (cmp == GE_EXPR
317 : 15187 : && mpz_sgn (offc0) > 0 && mpz_cmp (minc1, mint) >= 0));
318 : 32956 : if (!c0_ok)
319 : 32956 : goto end;
320 : :
321 : 1858482 : if (cmp == LE_EXPR)
322 : : {
323 : 641127 : if (mpz_cmp (up, maxc1) > 0)
324 : 226595 : mpz_set (up, maxc1);
325 : : }
326 : : else
327 : : {
328 : 1217355 : if (mpz_cmp (below, minc1) < 0)
329 : 1034706 : mpz_set (below, minc1);
330 : : }
331 : :
332 : 182649 : end:
333 : 1909058 : mpz_clear (mint);
334 : 1909058 : mpz_clear (maxt);
335 : 1909058 : mpz_clear (minc1);
336 : 1909058 : mpz_clear (maxc1);
337 : 1909058 : mpz_clear (offc0);
338 : 1909058 : mpz_clear (offc1);
339 : : }
340 : :
341 : : /* Stores estimate on the minimum/maximum value of the expression VAR + OFF
342 : : in TYPE to MIN and MAX. */
343 : :
344 : : static void
345 : 22346926 : determine_value_range (class loop *loop, tree type, tree var, mpz_t off,
346 : : mpz_t min, mpz_t max)
347 : : {
348 : 22346926 : int cnt = 0;
349 : 22346926 : mpz_t minm, maxm;
350 : 22346926 : basic_block bb;
351 : 22346926 : wide_int minv, maxv;
352 : 22346926 : enum value_range_kind rtype = VR_VARYING;
353 : :
354 : : /* If the expression is a constant, we know its value exactly. */
355 : 22346926 : if (integer_zerop (var))
356 : : {
357 : 15827475 : mpz_set (min, off);
358 : 15827475 : mpz_set (max, off);
359 : 15827475 : return;
360 : : }
361 : :
362 : 6519451 : get_type_static_bounds (type, min, max);
363 : :
364 : : /* See if we have some range info from VRP. */
365 : 6519451 : if (TREE_CODE (var) == SSA_NAME && INTEGRAL_TYPE_P (type))
366 : : {
367 : 4196907 : edge e = loop_preheader_edge (loop);
368 : 4196907 : signop sgn = TYPE_SIGN (type);
369 : 4196907 : gphi_iterator gsi;
370 : :
371 : : /* Either for VAR itself... */
372 : 4196907 : int_range_max var_range (TREE_TYPE (var));
373 : 8393814 : get_range_query (cfun)->range_of_expr (var_range, var);
374 : 4196907 : if (var_range.varying_p () || var_range.undefined_p ())
375 : : rtype = VR_VARYING;
376 : : else
377 : : rtype = VR_RANGE;
378 : 4196907 : if (!var_range.undefined_p ())
379 : : {
380 : 4182502 : minv = var_range.lower_bound ();
381 : 4182502 : maxv = var_range.upper_bound ();
382 : : }
383 : :
384 : : /* Or for PHI results in loop->header where VAR is used as
385 : : PHI argument from the loop preheader edge. */
386 : 4196907 : int_range_max phi_range (TREE_TYPE (var));
387 : 15803161 : for (gsi = gsi_start_phis (loop->header); !gsi_end_p (gsi); gsi_next (&gsi))
388 : : {
389 : 11606254 : gphi *phi = gsi.phi ();
390 : 11606254 : if (PHI_ARG_DEF_FROM_EDGE (phi, e) == var
391 : 2297972 : && get_range_query (cfun)->range_of_expr (phi_range,
392 : : gimple_phi_result (phi))
393 : 1148986 : && !phi_range.varying_p ()
394 : 12230758 : && !phi_range.undefined_p ())
395 : : {
396 : 624504 : if (rtype != VR_RANGE)
397 : : {
398 : 261308 : rtype = VR_RANGE;
399 : 261308 : minv = phi_range.lower_bound ();
400 : 261308 : maxv = phi_range.upper_bound ();
401 : : }
402 : : else
403 : : {
404 : 363196 : minv = wi::max (minv, phi_range.lower_bound (), sgn);
405 : 363196 : maxv = wi::min (maxv, phi_range.upper_bound (), sgn);
406 : : /* If the PHI result range are inconsistent with
407 : : the VAR range, give up on looking at the PHI
408 : : results. This can happen if VR_UNDEFINED is
409 : : involved. */
410 : 363196 : if (wi::gt_p (minv, maxv, sgn))
411 : : {
412 : 0 : int_range_max vr (TREE_TYPE (var));
413 : 0 : get_range_query (cfun)->range_of_expr (vr, var);
414 : 0 : if (vr.varying_p () || vr.undefined_p ())
415 : : rtype = VR_VARYING;
416 : : else
417 : : rtype = VR_RANGE;
418 : 0 : if (!vr.undefined_p ())
419 : : {
420 : 0 : minv = vr.lower_bound ();
421 : 0 : maxv = vr.upper_bound ();
422 : : }
423 : 0 : break;
424 : 0 : }
425 : : }
426 : : }
427 : : }
428 : 4196907 : mpz_init (minm);
429 : 4196907 : mpz_init (maxm);
430 : 4196907 : if (rtype != VR_RANGE)
431 : : {
432 : 2818459 : mpz_set (minm, min);
433 : 2818459 : mpz_set (maxm, max);
434 : : }
435 : : else
436 : : {
437 : 1378448 : gcc_assert (wi::le_p (minv, maxv, sgn));
438 : 1378448 : wi::to_mpz (minv, minm, sgn);
439 : 1378448 : wi::to_mpz (maxv, maxm, sgn);
440 : : }
441 : : /* Now walk the dominators of the loop header and use the entry
442 : : guards to refine the estimates. */
443 : 4196907 : for (bb = loop->header;
444 : 43791264 : bb != ENTRY_BLOCK_PTR_FOR_FN (cfun) && cnt < MAX_DOMINATORS_TO_WALK;
445 : 39594357 : bb = get_immediate_dominator (CDI_DOMINATORS, bb))
446 : : {
447 : 39594357 : edge e;
448 : 39594357 : tree c0, c1;
449 : 39594357 : enum tree_code cmp;
450 : :
451 : 39594357 : if (!single_pred_p (bb))
452 : 19939414 : continue;
453 : 19654943 : e = single_pred_edge (bb);
454 : :
455 : 19654943 : if (!(e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
456 : 4891523 : continue;
457 : :
458 : 29526840 : gcond *cond = as_a <gcond *> (*gsi_last_bb (e->src));
459 : 14763420 : c0 = gimple_cond_lhs (cond);
460 : 14763420 : cmp = gimple_cond_code (cond);
461 : 14763420 : c1 = gimple_cond_rhs (cond);
462 : :
463 : 14763420 : if (e->flags & EDGE_FALSE_VALUE)
464 : 7573754 : cmp = invert_tree_comparison (cmp, false);
465 : :
466 : 14763420 : refine_value_range_using_guard (type, var, c0, cmp, c1, minm, maxm);
467 : 14763420 : ++cnt;
468 : : }
469 : :
470 : 4196907 : mpz_add (minm, minm, off);
471 : 4196907 : mpz_add (maxm, maxm, off);
472 : : /* If the computation may not wrap or off is zero, then this
473 : : is always fine. If off is negative and minv + off isn't
474 : : smaller than type's minimum, or off is positive and
475 : : maxv + off isn't bigger than type's maximum, use the more
476 : : precise range too. */
477 : 4196907 : if (nowrap_type_p (type)
478 : 1810075 : || mpz_sgn (off) == 0
479 : 411992 : || (mpz_sgn (off) < 0 && mpz_cmp (minm, min) >= 0)
480 : 4547574 : || (mpz_sgn (off) > 0 && mpz_cmp (maxm, max) <= 0))
481 : : {
482 : 4064969 : mpz_set (min, minm);
483 : 4064969 : mpz_set (max, maxm);
484 : 4064969 : mpz_clear (minm);
485 : 4064969 : mpz_clear (maxm);
486 : 4064969 : return;
487 : : }
488 : 131938 : mpz_clear (minm);
489 : 131938 : mpz_clear (maxm);
490 : 4196907 : }
491 : :
492 : : /* If the computation may wrap, we know nothing about the value, except for
493 : : the range of the type. */
494 : 2454482 : if (!nowrap_type_p (type))
495 : : return;
496 : :
497 : : /* Since the addition of OFF does not wrap, if OFF is positive, then we may
498 : : add it to MIN, otherwise to MAX. */
499 : 2028054 : if (mpz_sgn (off) < 0)
500 : 159770 : mpz_add (max, max, off);
501 : : else
502 : 1868284 : mpz_add (min, min, off);
503 : 22346926 : }
504 : :
505 : : /* Stores the bounds on the difference of the values of the expressions
506 : : (var + X) and (var + Y), computed in TYPE, to BNDS. */
507 : :
508 : : static void
509 : 144856 : bound_difference_of_offsetted_base (tree type, mpz_t x, mpz_t y,
510 : : bounds *bnds)
511 : : {
512 : 144856 : int rel = mpz_cmp (x, y);
513 : 144856 : bool may_wrap = !nowrap_type_p (type);
514 : :
515 : : /* If X == Y, then the expressions are always equal.
516 : : If X > Y, there are the following possibilities:
517 : : a) neither of var + X and var + Y overflow or underflow, or both of
518 : : them do. Then their difference is X - Y.
519 : : b) var + X overflows, and var + Y does not. Then the values of the
520 : : expressions are var + X - M and var + Y, where M is the range of
521 : : the type, and their difference is X - Y - M.
522 : : c) var + Y underflows and var + X does not. Their difference again
523 : : is M - X + Y.
524 : : Therefore, if the arithmetics in type does not overflow, then the
525 : : bounds are (X - Y, X - Y), otherwise they are (X - Y - M, X - Y)
526 : : Similarly, if X < Y, the bounds are either (X - Y, X - Y) or
527 : : (X - Y, X - Y + M). */
528 : :
529 : 144856 : if (rel == 0)
530 : : {
531 : 794 : mpz_set_ui (bnds->below, 0);
532 : 794 : mpz_set_ui (bnds->up, 0);
533 : 794 : return;
534 : : }
535 : :
536 : 144062 : auto_mpz m;
537 : 144062 : wi::to_mpz (wi::minus_one (TYPE_PRECISION (type)), m, UNSIGNED);
538 : 144062 : mpz_add_ui (m, m, 1);
539 : 144062 : mpz_sub (bnds->up, x, y);
540 : 144062 : mpz_set (bnds->below, bnds->up);
541 : :
542 : 144062 : if (may_wrap)
543 : : {
544 : 129840 : if (rel > 0)
545 : 128668 : mpz_sub (bnds->below, bnds->below, m);
546 : : else
547 : 1172 : mpz_add (bnds->up, bnds->up, m);
548 : : }
549 : 144062 : }
550 : :
551 : : /* From condition C0 CMP C1 derives information regarding the
552 : : difference of values of VARX + OFFX and VARY + OFFY, computed in TYPE,
553 : : and stores it to BNDS. */
554 : :
555 : : static void
556 : 16986211 : refine_bounds_using_guard (tree type, tree varx, mpz_t offx,
557 : : tree vary, mpz_t offy,
558 : : tree c0, enum tree_code cmp, tree c1,
559 : : bounds *bnds)
560 : : {
561 : 16986211 : tree varc0, varc1, ctype;
562 : 16986211 : mpz_t offc0, offc1, loffx, loffy, bnd;
563 : 16986211 : bool lbound = false;
564 : 16986211 : bool no_wrap = nowrap_type_p (type);
565 : 16986211 : bool x_ok, y_ok;
566 : :
567 : 16986211 : switch (cmp)
568 : : {
569 : 7288420 : case LT_EXPR:
570 : 7288420 : case LE_EXPR:
571 : 7288420 : case GT_EXPR:
572 : 7288420 : case GE_EXPR:
573 : 7288420 : STRIP_SIGN_NOPS (c0);
574 : 7288420 : STRIP_SIGN_NOPS (c1);
575 : 7288420 : ctype = TREE_TYPE (c0);
576 : 7288420 : if (!useless_type_conversion_p (ctype, type))
577 : 10722508 : return;
578 : :
579 : : break;
580 : :
581 : : case EQ_EXPR:
582 : : /* We could derive quite precise information from EQ_EXPR, however, such
583 : : a guard is unlikely to appear, so we do not bother with handling
584 : : it. */
585 : : return;
586 : :
587 : 4659793 : case NE_EXPR:
588 : : /* NE_EXPR comparisons do not contain much of useful information, except for
589 : : special case of comparing with the bounds of the type. */
590 : 4659793 : if (TREE_CODE (c1) != INTEGER_CST
591 : 4085387 : || !INTEGRAL_TYPE_P (type))
592 : : return;
593 : :
594 : : /* Ensure that the condition speaks about an expression in the same type
595 : : as X and Y. */
596 : 3737489 : ctype = TREE_TYPE (c0);
597 : 3737489 : if (TYPE_PRECISION (ctype) != TYPE_PRECISION (type))
598 : : return;
599 : 2134149 : c0 = fold_convert (type, c0);
600 : 2134149 : c1 = fold_convert (type, c1);
601 : :
602 : 2134149 : if (TYPE_MIN_VALUE (type)
603 : 2134149 : && operand_equal_p (c1, TYPE_MIN_VALUE (type), 0))
604 : : {
605 : : cmp = GT_EXPR;
606 : : break;
607 : : }
608 : 1572787 : if (TYPE_MAX_VALUE (type)
609 : 1572787 : && operand_equal_p (c1, TYPE_MAX_VALUE (type), 0))
610 : : {
611 : : cmp = LT_EXPR;
612 : : break;
613 : : }
614 : :
615 : : return;
616 : : default:
617 : : return;
618 : : }
619 : :
620 : 6263703 : mpz_init (offc0);
621 : 6263703 : mpz_init (offc1);
622 : 6263703 : split_to_var_and_offset (expand_simple_operations (c0), &varc0, offc0);
623 : 6263703 : split_to_var_and_offset (expand_simple_operations (c1), &varc1, offc1);
624 : :
625 : : /* We are only interested in comparisons of expressions based on VARX and
626 : : VARY. TODO -- we might also be able to derive some bounds from
627 : : expressions containing just one of the variables. */
628 : :
629 : 6263703 : if (operand_equal_p (varx, varc1, 0))
630 : : {
631 : 863725 : std::swap (varc0, varc1);
632 : 863725 : mpz_swap (offc0, offc1);
633 : 863725 : cmp = swap_tree_comparison (cmp);
634 : : }
635 : :
636 : 6263703 : if (!operand_equal_p (varx, varc0, 0)
637 : 6263703 : || !operand_equal_p (vary, varc1, 0))
638 : 4684919 : goto end;
639 : :
640 : 1578784 : mpz_init_set (loffx, offx);
641 : 1578784 : mpz_init_set (loffy, offy);
642 : :
643 : 1578784 : if (cmp == GT_EXPR || cmp == GE_EXPR)
644 : : {
645 : 1520968 : std::swap (varx, vary);
646 : 1520968 : mpz_swap (offc0, offc1);
647 : 1520968 : mpz_swap (loffx, loffy);
648 : 1520968 : cmp = swap_tree_comparison (cmp);
649 : 1520968 : lbound = true;
650 : : }
651 : :
652 : : /* If there is no overflow, the condition implies that
653 : :
654 : : (VARX + OFFX) cmp (VARY + OFFY) + (OFFX - OFFY + OFFC1 - OFFC0).
655 : :
656 : : The overflows and underflows may complicate things a bit; each
657 : : overflow decreases the appropriate offset by M, and underflow
658 : : increases it by M. The above inequality would not necessarily be
659 : : true if
660 : :
661 : : -- VARX + OFFX underflows and VARX + OFFC0 does not, or
662 : : VARX + OFFC0 overflows, but VARX + OFFX does not.
663 : : This may only happen if OFFX < OFFC0.
664 : : -- VARY + OFFY overflows and VARY + OFFC1 does not, or
665 : : VARY + OFFC1 underflows and VARY + OFFY does not.
666 : : This may only happen if OFFY > OFFC1. */
667 : :
668 : 1578784 : if (no_wrap)
669 : : {
670 : : x_ok = true;
671 : : y_ok = true;
672 : : }
673 : : else
674 : : {
675 : 514084 : x_ok = (integer_zerop (varx)
676 : 514084 : || mpz_cmp (loffx, offc0) >= 0);
677 : 514084 : y_ok = (integer_zerop (vary)
678 : 514084 : || mpz_cmp (loffy, offc1) <= 0);
679 : : }
680 : :
681 : 511437 : if (x_ok && y_ok)
682 : : {
683 : 1572983 : mpz_init (bnd);
684 : 1572983 : mpz_sub (bnd, loffx, loffy);
685 : 1572983 : mpz_add (bnd, bnd, offc1);
686 : 1572983 : mpz_sub (bnd, bnd, offc0);
687 : :
688 : 1572983 : if (cmp == LT_EXPR)
689 : 1281574 : mpz_sub_ui (bnd, bnd, 1);
690 : :
691 : 1572983 : if (lbound)
692 : : {
693 : 1516089 : mpz_neg (bnd, bnd);
694 : 1516089 : if (mpz_cmp (bnds->below, bnd) < 0)
695 : 681039 : mpz_set (bnds->below, bnd);
696 : : }
697 : : else
698 : : {
699 : 56894 : if (mpz_cmp (bnd, bnds->up) < 0)
700 : 10762 : mpz_set (bnds->up, bnd);
701 : : }
702 : 1572983 : mpz_clear (bnd);
703 : : }
704 : :
705 : 1578784 : mpz_clear (loffx);
706 : 1578784 : mpz_clear (loffy);
707 : 6263703 : end:
708 : 6263703 : mpz_clear (offc0);
709 : 6263703 : mpz_clear (offc1);
710 : : }
711 : :
712 : : /* Stores the bounds on the value of the expression X - Y in LOOP to BNDS.
713 : : The subtraction is considered to be performed in arbitrary precision,
714 : : without overflows.
715 : :
716 : : We do not attempt to be too clever regarding the value ranges of X and
717 : : Y; most of the time, they are just integers or ssa names offsetted by
718 : : integer. However, we try to use the information contained in the
719 : : comparisons before the loop (usually created by loop header copying). */
720 : :
721 : : static void
722 : 11318319 : bound_difference (class loop *loop, tree x, tree y, bounds *bnds)
723 : : {
724 : 11318319 : tree type = TREE_TYPE (x);
725 : 11318319 : tree varx, vary;
726 : 11318319 : mpz_t offx, offy;
727 : 11318319 : int cnt = 0;
728 : 11318319 : edge e;
729 : 11318319 : basic_block bb;
730 : 11318319 : tree c0, c1;
731 : 11318319 : enum tree_code cmp;
732 : :
733 : : /* Get rid of unnecessary casts, but preserve the value of
734 : : the expressions. */
735 : 11318319 : STRIP_SIGN_NOPS (x);
736 : 11318319 : STRIP_SIGN_NOPS (y);
737 : :
738 : 11318319 : mpz_init (bnds->below);
739 : 11318319 : mpz_init (bnds->up);
740 : 11318319 : mpz_init (offx);
741 : 11318319 : mpz_init (offy);
742 : 11318319 : split_to_var_and_offset (x, &varx, offx);
743 : 11318319 : split_to_var_and_offset (y, &vary, offy);
744 : :
745 : 11318319 : if (!integer_zerop (varx)
746 : 11318319 : && operand_equal_p (varx, vary, 0))
747 : : {
748 : : /* Special case VARX == VARY -- we just need to compare the
749 : : offsets. The matters are a bit more complicated in the
750 : : case addition of offsets may wrap. */
751 : 144856 : bound_difference_of_offsetted_base (type, offx, offy, bnds);
752 : : }
753 : : else
754 : : {
755 : : /* Otherwise, use the value ranges to determine the initial
756 : : estimates on below and up. */
757 : 11173463 : auto_mpz minx, maxx, miny, maxy;
758 : 11173463 : determine_value_range (loop, type, varx, offx, minx, maxx);
759 : 11173463 : determine_value_range (loop, type, vary, offy, miny, maxy);
760 : :
761 : 11173463 : mpz_sub (bnds->below, minx, maxy);
762 : 11173463 : mpz_sub (bnds->up, maxx, miny);
763 : 11173463 : }
764 : :
765 : : /* If both X and Y are constants, we cannot get any more precise. */
766 : 11318319 : if (integer_zerop (varx) && integer_zerop (vary))
767 : 6271795 : goto end;
768 : :
769 : : /* Now walk the dominators of the loop header and use the entry
770 : : guards to refine the estimates. */
771 : 5046524 : for (bb = loop->header;
772 : 50226190 : bb != ENTRY_BLOCK_PTR_FOR_FN (cfun) && cnt < MAX_DOMINATORS_TO_WALK;
773 : 45179666 : bb = get_immediate_dominator (CDI_DOMINATORS, bb))
774 : : {
775 : 45179666 : if (!single_pred_p (bb))
776 : 21829537 : continue;
777 : 23350129 : e = single_pred_edge (bb);
778 : :
779 : 23350129 : if (!(e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
780 : 6363918 : continue;
781 : :
782 : 33972422 : gcond *cond = as_a <gcond *> (*gsi_last_bb (e->src));
783 : 16986211 : c0 = gimple_cond_lhs (cond);
784 : 16986211 : cmp = gimple_cond_code (cond);
785 : 16986211 : c1 = gimple_cond_rhs (cond);
786 : :
787 : 16986211 : if (e->flags & EDGE_FALSE_VALUE)
788 : 9537500 : cmp = invert_tree_comparison (cmp, false);
789 : :
790 : 16986211 : refine_bounds_using_guard (type, varx, offx, vary, offy,
791 : : c0, cmp, c1, bnds);
792 : 16986211 : ++cnt;
793 : : }
794 : :
795 : 5046524 : end:
796 : 11318319 : mpz_clear (offx);
797 : 11318319 : mpz_clear (offy);
798 : 11318319 : }
799 : :
800 : : /* Update the bounds in BNDS that restrict the value of X to the bounds
801 : : that restrict the value of X + DELTA. X can be obtained as a
802 : : difference of two values in TYPE. */
803 : :
804 : : static void
805 : 1797466 : bounds_add (bounds *bnds, const widest_int &delta, tree type)
806 : : {
807 : 1797466 : mpz_t mdelta, max;
808 : :
809 : 1797466 : mpz_init (mdelta);
810 : 1797466 : wi::to_mpz (delta, mdelta, SIGNED);
811 : :
812 : 1797466 : mpz_init (max);
813 : 1797466 : wi::to_mpz (wi::minus_one (TYPE_PRECISION (type)), max, UNSIGNED);
814 : :
815 : 1797466 : mpz_add (bnds->up, bnds->up, mdelta);
816 : 1797466 : mpz_add (bnds->below, bnds->below, mdelta);
817 : :
818 : 1797466 : if (mpz_cmp (bnds->up, max) > 0)
819 : 108999 : mpz_set (bnds->up, max);
820 : :
821 : 1797466 : mpz_neg (max, max);
822 : 1797466 : if (mpz_cmp (bnds->below, max) < 0)
823 : 7049 : mpz_set (bnds->below, max);
824 : :
825 : 1797466 : mpz_clear (mdelta);
826 : 1797466 : mpz_clear (max);
827 : 1797466 : }
828 : :
829 : : /* Update the bounds in BNDS that restrict the value of X to the bounds
830 : : that restrict the value of -X. */
831 : :
832 : : static void
833 : 2273592 : bounds_negate (bounds *bnds)
834 : : {
835 : 2273592 : mpz_t tmp;
836 : :
837 : 2273592 : mpz_init_set (tmp, bnds->up);
838 : 2273592 : mpz_neg (bnds->up, bnds->below);
839 : 2273592 : mpz_neg (bnds->below, tmp);
840 : 2273592 : mpz_clear (tmp);
841 : 2273592 : }
842 : :
843 : : /* Returns inverse of X modulo 2^s, where MASK = 2^s-1. */
844 : :
845 : : static tree
846 : 143770 : inverse (tree x, tree mask)
847 : : {
848 : 143770 : tree type = TREE_TYPE (x);
849 : 143770 : tree rslt;
850 : 143770 : unsigned ctr = tree_floor_log2 (mask);
851 : :
852 : 143770 : if (TYPE_PRECISION (type) <= HOST_BITS_PER_WIDE_INT)
853 : : {
854 : 143708 : unsigned HOST_WIDE_INT ix;
855 : 143708 : unsigned HOST_WIDE_INT imask;
856 : 143708 : unsigned HOST_WIDE_INT irslt = 1;
857 : :
858 : 143708 : gcc_assert (cst_and_fits_in_hwi (x));
859 : 143708 : gcc_assert (cst_and_fits_in_hwi (mask));
860 : :
861 : 143708 : ix = int_cst_value (x);
862 : 143708 : imask = int_cst_value (mask);
863 : :
864 : 8060537 : for (; ctr; ctr--)
865 : : {
866 : 7773121 : irslt *= ix;
867 : 7773121 : ix *= ix;
868 : : }
869 : 143708 : irslt &= imask;
870 : :
871 : 143708 : rslt = build_int_cst_type (type, irslt);
872 : : }
873 : : else
874 : : {
875 : 62 : rslt = build_int_cst (type, 1);
876 : 7936 : for (; ctr; ctr--)
877 : : {
878 : 7874 : rslt = int_const_binop (MULT_EXPR, rslt, x);
879 : 7874 : x = int_const_binop (MULT_EXPR, x, x);
880 : : }
881 : 62 : rslt = int_const_binop (BIT_AND_EXPR, rslt, mask);
882 : : }
883 : :
884 : 143770 : return rslt;
885 : : }
886 : :
887 : : /* Derives the upper bound BND on the number of executions of loop with exit
888 : : condition S * i <> C. If NO_OVERFLOW is true, then the control variable of
889 : : the loop does not overflow. EXIT_MUST_BE_TAKEN is true if we are guaranteed
890 : : that the loop ends through this exit, i.e., the induction variable ever
891 : : reaches the value of C.
892 : :
893 : : The value C is equal to final - base, where final and base are the final and
894 : : initial value of the actual induction variable in the analysed loop. BNDS
895 : : bounds the value of this difference when computed in signed type with
896 : : unbounded range, while the computation of C is performed in an unsigned
897 : : type with the range matching the range of the type of the induction variable.
898 : : In particular, BNDS.up contains an upper bound on C in the following cases:
899 : : -- if the iv must reach its final value without overflow, i.e., if
900 : : NO_OVERFLOW && EXIT_MUST_BE_TAKEN is true, or
901 : : -- if final >= base, which we know to hold when BNDS.below >= 0. */
902 : :
903 : : static void
904 : 6556958 : number_of_iterations_ne_max (mpz_t bnd, bool no_overflow, tree c, tree s,
905 : : bounds *bnds, bool exit_must_be_taken)
906 : : {
907 : 6556958 : widest_int max;
908 : 6556958 : mpz_t d;
909 : 6556958 : tree type = TREE_TYPE (c);
910 : 13113916 : bool bnds_u_valid = ((no_overflow && exit_must_be_taken)
911 : 6556958 : || mpz_sgn (bnds->below) >= 0);
912 : :
913 : 6556958 : if (integer_onep (s)
914 : 706162 : || (TREE_CODE (c) == INTEGER_CST
915 : 291597 : && TREE_CODE (s) == INTEGER_CST
916 : 998235 : && wi::mod_trunc (wi::to_wide (c), wi::to_wide (s),
917 : 7140152 : TYPE_SIGN (type)) == 0)
918 : 6971999 : || (TYPE_OVERFLOW_UNDEFINED (type)
919 : 0 : && multiple_of_p (type, c, s)))
920 : : {
921 : : /* If C is an exact multiple of S, then its value will be reached before
922 : : the induction variable overflows (unless the loop is exited in some
923 : : other way before). Note that the actual induction variable in the
924 : : loop (which ranges from base to final instead of from 0 to C) may
925 : : overflow, in which case BNDS.up will not be giving a correct upper
926 : : bound on C; thus, BNDS_U_VALID had to be computed in advance. */
927 : : no_overflow = true;
928 : : exit_must_be_taken = true;
929 : : }
930 : :
931 : : /* If the induction variable can overflow, the number of iterations is at
932 : : most the period of the control variable (or infinite, but in that case
933 : : the whole # of iterations analysis will fail). */
934 : 415041 : if (!no_overflow)
935 : : {
936 : 109284 : max = wi::mask <widest_int> (TYPE_PRECISION (type)
937 : 109284 : - wi::ctz (wi::to_wide (s)), false);
938 : 54642 : wi::to_mpz (max, bnd, UNSIGNED);
939 : 54642 : return;
940 : : }
941 : :
942 : : /* Now we know that the induction variable does not overflow, so the loop
943 : : iterates at most (range of type / S) times. */
944 : 6502316 : wi::to_mpz (wi::minus_one (TYPE_PRECISION (type)), bnd, UNSIGNED);
945 : :
946 : : /* If the induction variable is guaranteed to reach the value of C before
947 : : overflow, ... */
948 : 6502316 : if (exit_must_be_taken)
949 : : {
950 : : /* ... then we can strengthen this to C / S, and possibly we can use
951 : : the upper bound on C given by BNDS. */
952 : 6275814 : if (TREE_CODE (c) == INTEGER_CST)
953 : 5549638 : wi::to_mpz (wi::to_wide (c), bnd, UNSIGNED);
954 : 726176 : else if (bnds_u_valid)
955 : 572558 : mpz_set (bnd, bnds->up);
956 : : }
957 : :
958 : 6502316 : mpz_init (d);
959 : 6502316 : wi::to_mpz (wi::to_wide (s), d, UNSIGNED);
960 : 6502316 : mpz_fdiv_q (bnd, bnd, d);
961 : 6502316 : mpz_clear (d);
962 : 6556958 : }
963 : :
964 : : /* Determines number of iterations of loop whose ending condition
965 : : is IV <> FINAL. TYPE is the type of the iv. The number of
966 : : iterations is stored to NITER. EXIT_MUST_BE_TAKEN is true if
967 : : we know that the exit must be taken eventually, i.e., that the IV
968 : : ever reaches the value FINAL (we derived this earlier, and possibly set
969 : : NITER->assumptions to make sure this is the case). BNDS contains the
970 : : bounds on the difference FINAL - IV->base. */
971 : :
972 : : static bool
973 : 6556958 : number_of_iterations_ne (class loop *loop, tree type, affine_iv *iv,
974 : : tree final, class tree_niter_desc *niter,
975 : : bool exit_must_be_taken, bounds *bnds)
976 : : {
977 : 6556958 : tree niter_type = unsigned_type_for (type);
978 : 6556958 : tree s, c, d, bits, assumption, tmp, bound;
979 : :
980 : 6556958 : niter->control = *iv;
981 : 6556958 : niter->bound = final;
982 : 6556958 : niter->cmp = NE_EXPR;
983 : :
984 : : /* Rearrange the terms so that we get inequality S * i <> C, with S
985 : : positive. Also cast everything to the unsigned type. If IV does
986 : : not overflow, BNDS bounds the value of C. Also, this is the
987 : : case if the computation |FINAL - IV->base| does not overflow, i.e.,
988 : : if BNDS->below in the result is nonnegative. */
989 : 6556958 : if (tree_int_cst_sign_bit (iv->step))
990 : : {
991 : 2273592 : s = fold_convert (niter_type,
992 : : fold_build1 (NEGATE_EXPR, type, iv->step));
993 : 2273592 : c = fold_build2 (MINUS_EXPR, niter_type,
994 : : fold_convert (niter_type, iv->base),
995 : : fold_convert (niter_type, final));
996 : 2273592 : bounds_negate (bnds);
997 : : }
998 : : else
999 : : {
1000 : 4283366 : s = fold_convert (niter_type, iv->step);
1001 : 4283366 : c = fold_build2 (MINUS_EXPR, niter_type,
1002 : : fold_convert (niter_type, final),
1003 : : fold_convert (niter_type, iv->base));
1004 : : }
1005 : :
1006 : 6556958 : auto_mpz max;
1007 : 6556958 : number_of_iterations_ne_max (max, iv->no_overflow, c, s, bnds,
1008 : : exit_must_be_taken);
1009 : 13113916 : niter->max = widest_int::from (wi::from_mpz (niter_type, max, false),
1010 : 13113916 : TYPE_SIGN (niter_type));
1011 : :
1012 : : /* Compute no-overflow information for the control iv. This can be
1013 : : proven when below two conditions are satisfied:
1014 : :
1015 : : 1) IV evaluates toward FINAL at beginning, i.e:
1016 : : base <= FINAL ; step > 0
1017 : : base >= FINAL ; step < 0
1018 : :
1019 : : 2) |FINAL - base| is an exact multiple of step.
1020 : :
1021 : : Unfortunately, it's hard to prove above conditions after pass loop-ch
1022 : : because loop with exit condition (IV != FINAL) usually will be guarded
1023 : : by initial-condition (IV.base - IV.step != FINAL). In this case, we
1024 : : can alternatively try to prove below conditions:
1025 : :
1026 : : 1') IV evaluates toward FINAL at beginning, i.e:
1027 : : new_base = base - step < FINAL ; step > 0
1028 : : && base - step doesn't underflow
1029 : : new_base = base - step > FINAL ; step < 0
1030 : : && base - step doesn't overflow
1031 : :
1032 : : Please refer to PR34114 as an example of loop-ch's impact.
1033 : :
1034 : : Note, for NE_EXPR, base equals to FINAL is a special case, in
1035 : : which the loop exits immediately, and the iv does not overflow.
1036 : :
1037 : : Also note, we prove condition 2) by checking base and final seperately
1038 : : along with condition 1) or 1'). Since we ensure the difference
1039 : : computation of c does not wrap with cond below and the adjusted s
1040 : : will fit a signed type as well as an unsigned we can safely do
1041 : : this using the type of the IV if it is not pointer typed. */
1042 : 6556958 : tree mtype = type;
1043 : 6556958 : if (POINTER_TYPE_P (type))
1044 : 474629 : mtype = niter_type;
1045 : 6556958 : if (!niter->control.no_overflow
1046 : 6556958 : && (integer_onep (s)
1047 : 179547 : || (multiple_of_p (mtype, fold_convert (mtype, iv->base),
1048 : 179547 : fold_convert (mtype, s), false)
1049 : 26348 : && multiple_of_p (mtype, fold_convert (mtype, final),
1050 : 26348 : fold_convert (mtype, s), false))))
1051 : : {
1052 : 2114654 : tree t, cond, relaxed_cond = boolean_false_node;
1053 : :
1054 : 2114654 : if (tree_int_cst_sign_bit (iv->step))
1055 : : {
1056 : 2043749 : cond = fold_build2 (GE_EXPR, boolean_type_node, iv->base, final);
1057 : 2043749 : if (TREE_CODE (type) == INTEGER_TYPE)
1058 : : {
1059 : : /* Only when base - step doesn't overflow. */
1060 : 2043749 : t = TYPE_MAX_VALUE (type);
1061 : 2043749 : t = fold_build2 (PLUS_EXPR, type, t, iv->step);
1062 : 2043749 : t = fold_build2 (GE_EXPR, boolean_type_node, t, iv->base);
1063 : 2043749 : if (integer_nonzerop (t))
1064 : : {
1065 : 1889190 : t = fold_build2 (MINUS_EXPR, type, iv->base, iv->step);
1066 : 1889190 : relaxed_cond = fold_build2 (GT_EXPR, boolean_type_node, t,
1067 : : final);
1068 : : }
1069 : : }
1070 : : }
1071 : : else
1072 : : {
1073 : 70905 : cond = fold_build2 (LE_EXPR, boolean_type_node, iv->base, final);
1074 : 70905 : if (TREE_CODE (type) == INTEGER_TYPE)
1075 : : {
1076 : : /* Only when base - step doesn't underflow. */
1077 : 70905 : t = TYPE_MIN_VALUE (type);
1078 : 70905 : t = fold_build2 (PLUS_EXPR, type, t, iv->step);
1079 : 70905 : t = fold_build2 (LE_EXPR, boolean_type_node, t, iv->base);
1080 : 70905 : if (integer_nonzerop (t))
1081 : : {
1082 : 41362 : t = fold_build2 (MINUS_EXPR, type, iv->base, iv->step);
1083 : 41362 : relaxed_cond = fold_build2 (LT_EXPR, boolean_type_node, t,
1084 : : final);
1085 : : }
1086 : : }
1087 : : }
1088 : :
1089 : 2114654 : t = simplify_using_initial_conditions (loop, cond);
1090 : 2114654 : if (!t || !integer_onep (t))
1091 : 59936 : t = simplify_using_initial_conditions (loop, relaxed_cond);
1092 : :
1093 : 2114654 : if (t && integer_onep (t))
1094 : : {
1095 : 2055092 : niter->control.no_overflow = true;
1096 : 2055092 : niter->niter = fold_build2 (EXACT_DIV_EXPR, niter_type, c, s);
1097 : 2055092 : return true;
1098 : : }
1099 : : }
1100 : :
1101 : : /* Let nsd (step, size of mode) = d. If d does not divide c, the loop
1102 : : is infinite. Otherwise, the number of iterations is
1103 : : (inverse(s/d) * (c/d)) mod (size of mode/d). */
1104 : 4501866 : bits = num_ending_zeros (s);
1105 : 13505598 : bound = build_low_bits_mask (niter_type,
1106 : 4501866 : (TYPE_PRECISION (niter_type)
1107 : 4501866 : - tree_to_uhwi (bits)));
1108 : :
1109 : 4501866 : d = fold_binary_to_constant (LSHIFT_EXPR, niter_type,
1110 : 4501866 : build_int_cst (niter_type, 1), bits);
1111 : 4501866 : s = fold_binary_to_constant (RSHIFT_EXPR, niter_type, s, bits);
1112 : :
1113 : 4501866 : if (!exit_must_be_taken)
1114 : : {
1115 : : /* If we cannot assume that the exit is taken eventually, record the
1116 : : assumptions for divisibility of c. */
1117 : 1664961 : assumption = fold_build2 (FLOOR_MOD_EXPR, niter_type, c, d);
1118 : 1664961 : assumption = fold_build2 (EQ_EXPR, boolean_type_node,
1119 : : assumption, build_int_cst (niter_type, 0));
1120 : 1664961 : if (!integer_nonzerop (assumption))
1121 : 267703 : niter->assumptions = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
1122 : : niter->assumptions, assumption);
1123 : : }
1124 : :
1125 : 4501866 : c = fold_build2 (EXACT_DIV_EXPR, niter_type, c, d);
1126 : 4501866 : if (integer_onep (s))
1127 : : {
1128 : 4358096 : niter->niter = c;
1129 : : }
1130 : : else
1131 : : {
1132 : 143770 : tmp = fold_build2 (MULT_EXPR, niter_type, c, inverse (s, bound));
1133 : 143770 : niter->niter = fold_build2 (BIT_AND_EXPR, niter_type, tmp, bound);
1134 : : }
1135 : : return true;
1136 : 6556958 : }
1137 : :
1138 : : /* Checks whether we can determine the final value of the control variable
1139 : : of the loop with ending condition IV0 < IV1 (computed in TYPE).
1140 : : DELTA is the difference IV1->base - IV0->base, STEP is the absolute value
1141 : : of the step. The assumptions necessary to ensure that the computation
1142 : : of the final value does not overflow are recorded in NITER. If we
1143 : : find the final value, we adjust DELTA and return TRUE. Otherwise
1144 : : we return false. BNDS bounds the value of IV1->base - IV0->base,
1145 : : and will be updated by the same amount as DELTA. EXIT_MUST_BE_TAKEN is
1146 : : true if we know that the exit must be taken eventually. */
1147 : :
1148 : : static bool
1149 : 347023 : number_of_iterations_lt_to_ne (tree type, affine_iv *iv0, affine_iv *iv1,
1150 : : class tree_niter_desc *niter,
1151 : : tree *delta, tree step,
1152 : : bool exit_must_be_taken, bounds *bnds)
1153 : : {
1154 : 347023 : tree niter_type = TREE_TYPE (step);
1155 : 347023 : tree mod = fold_build2 (FLOOR_MOD_EXPR, niter_type, *delta, step);
1156 : 347023 : tree tmod;
1157 : 347023 : tree assumption = boolean_true_node, bound, noloop;
1158 : 347023 : bool fv_comp_no_overflow;
1159 : 347023 : tree type1 = type;
1160 : 347023 : if (POINTER_TYPE_P (type))
1161 : 103831 : type1 = sizetype;
1162 : :
1163 : 347023 : if (TREE_CODE (mod) != INTEGER_CST)
1164 : : return false;
1165 : 32110 : if (integer_nonzerop (mod))
1166 : 15016 : mod = fold_build2 (MINUS_EXPR, niter_type, step, mod);
1167 : 32110 : tmod = fold_convert (type1, mod);
1168 : :
1169 : 32110 : auto_mpz mmod;
1170 : 32110 : wi::to_mpz (wi::to_wide (mod), mmod, UNSIGNED);
1171 : 32110 : mpz_neg (mmod, mmod);
1172 : :
1173 : : /* If the induction variable does not overflow and the exit is taken,
1174 : : then the computation of the final value does not overflow. This is
1175 : : also obviously the case if the new final value is equal to the
1176 : : current one. Finally, we postulate this for pointer type variables,
1177 : : as the code cannot rely on the object to that the pointer points being
1178 : : placed at the end of the address space (and more pragmatically,
1179 : : TYPE_{MIN,MAX}_VALUE is not defined for pointers). */
1180 : 32110 : if (integer_zerop (mod) || POINTER_TYPE_P (type))
1181 : : fv_comp_no_overflow = true;
1182 : 14331 : else if (!exit_must_be_taken)
1183 : : fv_comp_no_overflow = false;
1184 : : else
1185 : 7560 : fv_comp_no_overflow =
1186 : 7560 : (iv0->no_overflow && integer_nonzerop (iv0->step))
1187 : 8385 : || (iv1->no_overflow && integer_nonzerop (iv1->step));
1188 : :
1189 : 32110 : if (integer_nonzerop (iv0->step))
1190 : : {
1191 : : /* The final value of the iv is iv1->base + MOD, assuming that this
1192 : : computation does not overflow, and that
1193 : : iv0->base <= iv1->base + MOD. */
1194 : 27917 : if (!fv_comp_no_overflow)
1195 : : {
1196 : 5248 : bound = fold_build2 (MINUS_EXPR, type1,
1197 : : TYPE_MAX_VALUE (type1), tmod);
1198 : 5248 : assumption = fold_build2 (LE_EXPR, boolean_type_node,
1199 : : iv1->base, bound);
1200 : 5248 : if (integer_zerop (assumption))
1201 : : return false;
1202 : : }
1203 : : }
1204 : : else
1205 : : {
1206 : : /* The final value of the iv is iv0->base - MOD, assuming that this
1207 : : computation does not overflow, and that
1208 : : iv0->base - MOD <= iv1->base. */
1209 : 4193 : if (!fv_comp_no_overflow)
1210 : : {
1211 : 1523 : bound = fold_build2 (PLUS_EXPR, type1,
1212 : : TYPE_MIN_VALUE (type1), tmod);
1213 : 1523 : assumption = fold_build2 (GE_EXPR, boolean_type_node,
1214 : : iv0->base, bound);
1215 : 1523 : if (integer_zerop (assumption))
1216 : : return false;
1217 : : }
1218 : : }
1219 : :
1220 : : /* IV0 < IV1 does not loop if IV0->base >= IV1->base. */
1221 : 32067 : if (mpz_cmp (mmod, bnds->below) < 0)
1222 : 22450 : noloop = boolean_false_node;
1223 : : else
1224 : 9617 : noloop = fold_build2 (GE_EXPR, boolean_type_node,
1225 : : iv0->base, iv1->base);
1226 : :
1227 : 32067 : if (!integer_nonzerop (assumption))
1228 : 196 : niter->assumptions = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
1229 : : niter->assumptions,
1230 : : assumption);
1231 : 32067 : if (!integer_zerop (noloop))
1232 : 3319 : niter->may_be_zero = fold_build2 (TRUTH_OR_EXPR, boolean_type_node,
1233 : : niter->may_be_zero,
1234 : : noloop);
1235 : 32067 : bounds_add (bnds, wi::to_widest (mod), type);
1236 : 32067 : *delta = fold_build2 (PLUS_EXPR, niter_type, *delta, mod);
1237 : :
1238 : 32067 : return true;
1239 : 32110 : }
1240 : :
1241 : : /* Add assertions to NITER that ensure that the control variable of the loop
1242 : : with ending condition IV0 < IV1 does not overflow. Types of IV0 and IV1
1243 : : are TYPE. Returns false if we can prove that there is an overflow, true
1244 : : otherwise. STEP is the absolute value of the step. */
1245 : :
1246 : : static bool
1247 : 314956 : assert_no_overflow_lt (tree type, affine_iv *iv0, affine_iv *iv1,
1248 : : class tree_niter_desc *niter, tree step)
1249 : : {
1250 : 314956 : tree bound, d, assumption, diff;
1251 : 314956 : tree niter_type = TREE_TYPE (step);
1252 : :
1253 : 314956 : if (integer_nonzerop (iv0->step))
1254 : : {
1255 : : /* for (i = iv0->base; i < iv1->base; i += iv0->step) */
1256 : 259655 : if (iv0->no_overflow)
1257 : : return true;
1258 : :
1259 : : /* If iv0->base is a constant, we can determine the last value before
1260 : : overflow precisely; otherwise we conservatively assume
1261 : : MAX - STEP + 1. */
1262 : :
1263 : 47561 : if (TREE_CODE (iv0->base) == INTEGER_CST)
1264 : : {
1265 : 17016 : d = fold_build2 (MINUS_EXPR, niter_type,
1266 : : fold_convert (niter_type, TYPE_MAX_VALUE (type)),
1267 : : fold_convert (niter_type, iv0->base));
1268 : 17016 : diff = fold_build2 (FLOOR_MOD_EXPR, niter_type, d, step);
1269 : : }
1270 : : else
1271 : 30545 : diff = fold_build2 (MINUS_EXPR, niter_type, step,
1272 : : build_int_cst (niter_type, 1));
1273 : 47561 : bound = fold_build2 (MINUS_EXPR, type,
1274 : : TYPE_MAX_VALUE (type), fold_convert (type, diff));
1275 : 47561 : assumption = fold_build2 (LE_EXPR, boolean_type_node,
1276 : : iv1->base, bound);
1277 : : }
1278 : : else
1279 : : {
1280 : : /* for (i = iv1->base; i > iv0->base; i += iv1->step) */
1281 : 55301 : if (iv1->no_overflow)
1282 : : return true;
1283 : :
1284 : 26008 : if (TREE_CODE (iv1->base) == INTEGER_CST)
1285 : : {
1286 : 43 : d = fold_build2 (MINUS_EXPR, niter_type,
1287 : : fold_convert (niter_type, iv1->base),
1288 : : fold_convert (niter_type, TYPE_MIN_VALUE (type)));
1289 : 43 : diff = fold_build2 (FLOOR_MOD_EXPR, niter_type, d, step);
1290 : : }
1291 : : else
1292 : 25965 : diff = fold_build2 (MINUS_EXPR, niter_type, step,
1293 : : build_int_cst (niter_type, 1));
1294 : 26008 : bound = fold_build2 (PLUS_EXPR, type,
1295 : : TYPE_MIN_VALUE (type), fold_convert (type, diff));
1296 : 26008 : assumption = fold_build2 (GE_EXPR, boolean_type_node,
1297 : : iv0->base, bound);
1298 : : }
1299 : :
1300 : 73569 : if (integer_zerop (assumption))
1301 : : return false;
1302 : 73518 : if (!integer_nonzerop (assumption))
1303 : 55819 : niter->assumptions = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
1304 : : niter->assumptions, assumption);
1305 : :
1306 : 73518 : iv0->no_overflow = true;
1307 : 73518 : iv1->no_overflow = true;
1308 : 73518 : return true;
1309 : : }
1310 : :
1311 : : /* Add an assumption to NITER that a loop whose ending condition
1312 : : is IV0 < IV1 rolls. TYPE is the type of the control iv. BNDS
1313 : : bounds the value of IV1->base - IV0->base. */
1314 : :
1315 : : static void
1316 : 314905 : assert_loop_rolls_lt (tree type, affine_iv *iv0, affine_iv *iv1,
1317 : : class tree_niter_desc *niter, bounds *bnds)
1318 : : {
1319 : 314905 : tree assumption = boolean_true_node, bound, diff;
1320 : 314905 : tree mbz, mbzl, mbzr, type1;
1321 : 314905 : bool rolls_p, no_overflow_p;
1322 : 314905 : widest_int dstep;
1323 : 314905 : mpz_t mstep, max;
1324 : :
1325 : : /* We are going to compute the number of iterations as
1326 : : (iv1->base - iv0->base + step - 1) / step, computed in the unsigned
1327 : : variant of TYPE. This formula only works if
1328 : :
1329 : : -step + 1 <= (iv1->base - iv0->base) <= MAX - step + 1
1330 : :
1331 : : (where MAX is the maximum value of the unsigned variant of TYPE, and
1332 : : the computations in this formula are performed in full precision,
1333 : : i.e., without overflows).
1334 : :
1335 : : Usually, for loops with exit condition iv0->base + step * i < iv1->base,
1336 : : we have a condition of the form iv0->base - step < iv1->base before the loop,
1337 : : and for loops iv0->base < iv1->base - step * i the condition
1338 : : iv0->base < iv1->base + step, due to loop header copying, which enable us
1339 : : to prove the lower bound.
1340 : :
1341 : : The upper bound is more complicated. Unless the expressions for initial
1342 : : and final value themselves contain enough information, we usually cannot
1343 : : derive it from the context. */
1344 : :
1345 : : /* First check whether the answer does not follow from the bounds we gathered
1346 : : before. */
1347 : 314905 : if (integer_nonzerop (iv0->step))
1348 : 259655 : dstep = wi::to_widest (iv0->step);
1349 : : else
1350 : : {
1351 : 55250 : dstep = wi::sext (wi::to_widest (iv1->step), TYPE_PRECISION (type));
1352 : 55250 : dstep = -dstep;
1353 : : }
1354 : :
1355 : 314905 : mpz_init (mstep);
1356 : 314905 : wi::to_mpz (dstep, mstep, UNSIGNED);
1357 : 314905 : mpz_neg (mstep, mstep);
1358 : 314905 : mpz_add_ui (mstep, mstep, 1);
1359 : :
1360 : 314905 : rolls_p = mpz_cmp (mstep, bnds->below) <= 0;
1361 : :
1362 : 314905 : mpz_init (max);
1363 : 314905 : wi::to_mpz (wi::minus_one (TYPE_PRECISION (type)), max, UNSIGNED);
1364 : 314905 : mpz_add (max, max, mstep);
1365 : 629810 : no_overflow_p = (mpz_cmp (bnds->up, max) <= 0
1366 : : /* For pointers, only values lying inside a single object
1367 : : can be compared or manipulated by pointer arithmetics.
1368 : : Gcc in general does not allow or handle objects larger
1369 : : than half of the address space, hence the upper bound
1370 : : is satisfied for pointers. */
1371 : 314905 : || POINTER_TYPE_P (type));
1372 : 314905 : mpz_clear (mstep);
1373 : 314905 : mpz_clear (max);
1374 : :
1375 : 314905 : if (rolls_p && no_overflow_p)
1376 : 105589 : return;
1377 : :
1378 : 209316 : type1 = type;
1379 : 209316 : if (POINTER_TYPE_P (type))
1380 : 60834 : type1 = sizetype;
1381 : :
1382 : : /* Now the hard part; we must formulate the assumption(s) as expressions, and
1383 : : we must be careful not to introduce overflow. */
1384 : :
1385 : 209316 : if (integer_nonzerop (iv0->step))
1386 : : {
1387 : 172669 : diff = fold_build2 (MINUS_EXPR, type1,
1388 : : iv0->step, build_int_cst (type1, 1));
1389 : :
1390 : : /* We need to know that iv0->base >= MIN + iv0->step - 1. Since
1391 : : 0 address never belongs to any object, we can assume this for
1392 : : pointers. */
1393 : 172669 : if (!POINTER_TYPE_P (type))
1394 : : {
1395 : 115859 : bound = fold_build2 (PLUS_EXPR, type1,
1396 : : TYPE_MIN_VALUE (type), diff);
1397 : 115859 : assumption = fold_build2 (GE_EXPR, boolean_type_node,
1398 : : iv0->base, bound);
1399 : : }
1400 : :
1401 : : /* And then we can compute iv0->base - diff, and compare it with
1402 : : iv1->base. */
1403 : 172669 : mbzl = fold_build2 (MINUS_EXPR, type1,
1404 : : fold_convert (type1, iv0->base), diff);
1405 : 172669 : mbzr = fold_convert (type1, iv1->base);
1406 : : }
1407 : : else
1408 : : {
1409 : 36647 : diff = fold_build2 (PLUS_EXPR, type1,
1410 : : iv1->step, build_int_cst (type1, 1));
1411 : :
1412 : 36647 : if (!POINTER_TYPE_P (type))
1413 : : {
1414 : 32623 : bound = fold_build2 (PLUS_EXPR, type1,
1415 : : TYPE_MAX_VALUE (type), diff);
1416 : 32623 : assumption = fold_build2 (LE_EXPR, boolean_type_node,
1417 : : iv1->base, bound);
1418 : : }
1419 : :
1420 : 36647 : mbzl = fold_convert (type1, iv0->base);
1421 : 36647 : mbzr = fold_build2 (MINUS_EXPR, type1,
1422 : : fold_convert (type1, iv1->base), diff);
1423 : : }
1424 : :
1425 : 209316 : if (!integer_nonzerop (assumption))
1426 : 86869 : niter->assumptions = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
1427 : : niter->assumptions, assumption);
1428 : 209316 : if (!rolls_p)
1429 : : {
1430 : 192996 : mbz = fold_build2 (GT_EXPR, boolean_type_node, mbzl, mbzr);
1431 : 192996 : niter->may_be_zero = fold_build2 (TRUTH_OR_EXPR, boolean_type_node,
1432 : : niter->may_be_zero, mbz);
1433 : : }
1434 : 314905 : }
1435 : :
1436 : : /* Determines number of iterations of loop whose ending condition
1437 : : is IV0 < IV1 which likes: {base, -C} < n, or n < {base, C}.
1438 : : The number of iterations is stored to NITER. */
1439 : :
1440 : : static bool
1441 : 65738 : number_of_iterations_until_wrap (class loop *loop, tree type, affine_iv *iv0,
1442 : : affine_iv *iv1, class tree_niter_desc *niter)
1443 : : {
1444 : 65738 : tree niter_type = unsigned_type_for (type);
1445 : 65738 : tree step, num, assumptions, may_be_zero, span;
1446 : 65738 : wide_int high, low, max, min;
1447 : :
1448 : 65738 : may_be_zero = fold_build2 (LE_EXPR, boolean_type_node, iv1->base, iv0->base);
1449 : 65738 : if (integer_onep (may_be_zero))
1450 : : return false;
1451 : :
1452 : 65528 : int prec = TYPE_PRECISION (type);
1453 : 65528 : signop sgn = TYPE_SIGN (type);
1454 : 65528 : min = wi::min_value (prec, sgn);
1455 : 65528 : max = wi::max_value (prec, sgn);
1456 : :
1457 : : /* n < {base, C}. */
1458 : 65528 : if (integer_zerop (iv0->step) && !tree_int_cst_sign_bit (iv1->step))
1459 : : {
1460 : 40804 : step = iv1->step;
1461 : : /* MIN + C - 1 <= n. */
1462 : 40804 : tree last = wide_int_to_tree (type, min + wi::to_wide (step) - 1);
1463 : 40804 : assumptions = fold_build2 (LE_EXPR, boolean_type_node, last, iv0->base);
1464 : 40804 : if (integer_zerop (assumptions))
1465 : : return false;
1466 : :
1467 : 40802 : num = fold_build2 (MINUS_EXPR, niter_type,
1468 : : wide_int_to_tree (niter_type, max),
1469 : : fold_convert (niter_type, iv1->base));
1470 : :
1471 : : /* When base has the form iv + 1, if we know iv >= n, then iv + 1 < n
1472 : : only when iv + 1 overflows, i.e. when iv == TYPE_VALUE_MAX. */
1473 : 40802 : if (sgn == UNSIGNED
1474 : 5374 : && integer_onep (step)
1475 : 941 : && TREE_CODE (iv1->base) == PLUS_EXPR
1476 : 41392 : && integer_onep (TREE_OPERAND (iv1->base, 1)))
1477 : : {
1478 : 468 : tree cond = fold_build2 (GE_EXPR, boolean_type_node,
1479 : : TREE_OPERAND (iv1->base, 0), iv0->base);
1480 : 468 : cond = simplify_using_initial_conditions (loop, cond);
1481 : 468 : if (integer_onep (cond))
1482 : 16 : may_be_zero = fold_build2 (EQ_EXPR, boolean_type_node,
1483 : : TREE_OPERAND (iv1->base, 0),
1484 : : TYPE_MAX_VALUE (type));
1485 : : }
1486 : :
1487 : 40802 : high = max;
1488 : 40802 : if (TREE_CODE (iv1->base) == INTEGER_CST)
1489 : 29493 : low = wi::to_wide (iv1->base) - 1;
1490 : 11309 : else if (TREE_CODE (iv0->base) == INTEGER_CST)
1491 : 4977 : low = wi::to_wide (iv0->base);
1492 : : else
1493 : 6332 : low = min;
1494 : : }
1495 : : /* {base, -C} < n. */
1496 : 24724 : else if (tree_int_cst_sign_bit (iv0->step) && integer_zerop (iv1->step))
1497 : : {
1498 : 24724 : step = fold_build1 (NEGATE_EXPR, TREE_TYPE (iv0->step), iv0->step);
1499 : : /* MAX - C + 1 >= n. */
1500 : 24724 : tree last = wide_int_to_tree (type, max - wi::to_wide (step) + 1);
1501 : 24724 : assumptions = fold_build2 (GE_EXPR, boolean_type_node, last, iv1->base);
1502 : 24724 : if (integer_zerop (assumptions))
1503 : : return false;
1504 : :
1505 : 24724 : num = fold_build2 (MINUS_EXPR, niter_type,
1506 : : fold_convert (niter_type, iv0->base),
1507 : : wide_int_to_tree (niter_type, min));
1508 : 24724 : low = min;
1509 : 24724 : if (TREE_CODE (iv0->base) == INTEGER_CST)
1510 : 1229 : high = wi::to_wide (iv0->base) + 1;
1511 : 23495 : else if (TREE_CODE (iv1->base) == INTEGER_CST)
1512 : 2272 : high = wi::to_wide (iv1->base);
1513 : : else
1514 : 21223 : high = max;
1515 : : }
1516 : : else
1517 : 0 : return false;
1518 : :
1519 : : /* (delta + step - 1) / step */
1520 : 65526 : step = fold_convert (niter_type, step);
1521 : 65526 : num = fold_build2 (PLUS_EXPR, niter_type, num, step);
1522 : 65526 : niter->niter = fold_build2 (FLOOR_DIV_EXPR, niter_type, num, step);
1523 : :
1524 : 65526 : widest_int delta, s;
1525 : 65526 : delta = widest_int::from (high, sgn) - widest_int::from (low, sgn);
1526 : 65526 : s = wi::to_widest (step);
1527 : 65526 : delta = delta + s - 1;
1528 : 65526 : niter->max = wi::udiv_floor (delta, s);
1529 : :
1530 : 65526 : niter->may_be_zero = may_be_zero;
1531 : :
1532 : 65526 : if (!integer_nonzerop (assumptions))
1533 : 9263 : niter->assumptions = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
1534 : : niter->assumptions, assumptions);
1535 : :
1536 : 65526 : niter->control.no_overflow = false;
1537 : :
1538 : : /* Update bound and exit condition as:
1539 : : bound = niter * STEP + (IVbase - STEP).
1540 : : { IVbase - STEP, +, STEP } != bound
1541 : : Here, biasing IVbase by 1 step makes 'bound' be the value before wrap.
1542 : : */
1543 : 65526 : tree base_type = TREE_TYPE (niter->control.base);
1544 : 65526 : if (POINTER_TYPE_P (base_type))
1545 : : {
1546 : 6583 : tree utype = unsigned_type_for (base_type);
1547 : 6583 : niter->control.base
1548 : 6583 : = fold_build2 (MINUS_EXPR, utype,
1549 : : fold_convert (utype, niter->control.base),
1550 : : fold_convert (utype, niter->control.step));
1551 : 6583 : niter->control.base = fold_convert (base_type, niter->control.base);
1552 : : }
1553 : : else
1554 : 58943 : niter->control.base
1555 : 58943 : = fold_build2 (MINUS_EXPR, base_type, niter->control.base,
1556 : : niter->control.step);
1557 : :
1558 : 65526 : span = fold_build2 (MULT_EXPR, niter_type, niter->niter,
1559 : : fold_convert (niter_type, niter->control.step));
1560 : 65526 : niter->bound = fold_build2 (PLUS_EXPR, niter_type, span,
1561 : : fold_convert (niter_type, niter->control.base));
1562 : 65526 : niter->bound = fold_convert (type, niter->bound);
1563 : 65526 : niter->cmp = NE_EXPR;
1564 : :
1565 : 65526 : return true;
1566 : 131264 : }
1567 : :
1568 : : /* Determines number of iterations of loop whose ending condition
1569 : : is IV0 < IV1. TYPE is the type of the iv. The number of
1570 : : iterations is stored to NITER. BNDS bounds the difference
1571 : : IV1->base - IV0->base. EXIT_MUST_BE_TAKEN is true if we know
1572 : : that the exit must be taken eventually. */
1573 : :
1574 : : static bool
1575 : 4793428 : number_of_iterations_lt (class loop *loop, tree type, affine_iv *iv0,
1576 : : affine_iv *iv1, class tree_niter_desc *niter,
1577 : : bool exit_must_be_taken, bounds *bnds)
1578 : : {
1579 : 4793428 : tree niter_type = unsigned_type_for (type);
1580 : 4793428 : tree delta, step, s;
1581 : 4793428 : mpz_t mstep, tmp;
1582 : :
1583 : 4793428 : if (integer_nonzerop (iv0->step))
1584 : : {
1585 : 4507579 : niter->control = *iv0;
1586 : 4507579 : niter->cmp = LT_EXPR;
1587 : 4507579 : niter->bound = iv1->base;
1588 : : }
1589 : : else
1590 : : {
1591 : 285849 : niter->control = *iv1;
1592 : 285849 : niter->cmp = GT_EXPR;
1593 : 285849 : niter->bound = iv0->base;
1594 : : }
1595 : :
1596 : : /* {base, -C} < n, or n < {base, C} */
1597 : 4793428 : if (tree_int_cst_sign_bit (iv0->step)
1598 : 4793428 : || (!integer_zerop (iv1->step) && !tree_int_cst_sign_bit (iv1->step)))
1599 : 65738 : return number_of_iterations_until_wrap (loop, type, iv0, iv1, niter);
1600 : :
1601 : 4727690 : delta = fold_build2 (MINUS_EXPR, niter_type,
1602 : : fold_convert (niter_type, iv1->base),
1603 : : fold_convert (niter_type, iv0->base));
1604 : :
1605 : : /* First handle the special case that the step is +-1. */
1606 : 8922973 : if ((integer_onep (iv0->step) && integer_zerop (iv1->step))
1607 : 4727690 : || (integer_all_onesp (iv1->step) && integer_zerop (iv0->step)))
1608 : : {
1609 : : /* for (i = iv0->base; i < iv1->base; i++)
1610 : :
1611 : : or
1612 : :
1613 : : for (i = iv1->base; i > iv0->base; i--).
1614 : :
1615 : : In both cases # of iterations is iv1->base - iv0->base, assuming that
1616 : : iv1->base >= iv0->base.
1617 : :
1618 : : First try to derive a lower bound on the value of
1619 : : iv1->base - iv0->base, computed in full precision. If the difference
1620 : : is nonnegative, we are done, otherwise we must record the
1621 : : condition. */
1622 : :
1623 : 4380667 : if (mpz_sgn (bnds->below) < 0)
1624 : 1742280 : niter->may_be_zero = fold_build2 (LT_EXPR, boolean_type_node,
1625 : : iv1->base, iv0->base);
1626 : 4380667 : niter->niter = delta;
1627 : 8761334 : niter->max = widest_int::from (wi::from_mpz (niter_type, bnds->up, false),
1628 : 8761334 : TYPE_SIGN (niter_type));
1629 : 4380667 : niter->control.no_overflow = true;
1630 : 4380667 : return true;
1631 : : }
1632 : :
1633 : 347023 : if (integer_nonzerop (iv0->step))
1634 : 287572 : step = fold_convert (niter_type, iv0->step);
1635 : : else
1636 : 59451 : step = fold_convert (niter_type,
1637 : : fold_build1 (NEGATE_EXPR, type, iv1->step));
1638 : :
1639 : : /* If we can determine the final value of the control iv exactly, we can
1640 : : transform the condition to != comparison. In particular, this will be
1641 : : the case if DELTA is constant. */
1642 : 347023 : if (number_of_iterations_lt_to_ne (type, iv0, iv1, niter, &delta, step,
1643 : : exit_must_be_taken, bnds))
1644 : : {
1645 : 32067 : affine_iv zps;
1646 : :
1647 : 32067 : zps.base = build_int_cst (niter_type, 0);
1648 : 32067 : zps.step = step;
1649 : : /* number_of_iterations_lt_to_ne will add assumptions that ensure that
1650 : : zps does not overflow. */
1651 : 32067 : zps.no_overflow = true;
1652 : :
1653 : 32067 : return number_of_iterations_ne (loop, type, &zps,
1654 : : delta, niter, true, bnds);
1655 : : }
1656 : :
1657 : : /* Make sure that the control iv does not overflow. */
1658 : 314956 : if (!assert_no_overflow_lt (type, iv0, iv1, niter, step))
1659 : : return false;
1660 : :
1661 : : /* We determine the number of iterations as (delta + step - 1) / step. For
1662 : : this to work, we must know that iv1->base >= iv0->base - step + 1,
1663 : : otherwise the loop does not roll. */
1664 : 314905 : assert_loop_rolls_lt (type, iv0, iv1, niter, bnds);
1665 : :
1666 : 314905 : s = fold_build2 (MINUS_EXPR, niter_type,
1667 : : step, build_int_cst (niter_type, 1));
1668 : 314905 : delta = fold_build2 (PLUS_EXPR, niter_type, delta, s);
1669 : 314905 : niter->niter = fold_build2 (FLOOR_DIV_EXPR, niter_type, delta, step);
1670 : :
1671 : 314905 : mpz_init (mstep);
1672 : 314905 : mpz_init (tmp);
1673 : 314905 : wi::to_mpz (wi::to_wide (step), mstep, UNSIGNED);
1674 : 314905 : mpz_add (tmp, bnds->up, mstep);
1675 : 314905 : mpz_sub_ui (tmp, tmp, 1);
1676 : 314905 : mpz_fdiv_q (tmp, tmp, mstep);
1677 : 629810 : niter->max = widest_int::from (wi::from_mpz (niter_type, tmp, false),
1678 : 629810 : TYPE_SIGN (niter_type));
1679 : 314905 : mpz_clear (mstep);
1680 : 314905 : mpz_clear (tmp);
1681 : :
1682 : 314905 : return true;
1683 : : }
1684 : :
1685 : : /* Determines number of iterations of loop whose ending condition
1686 : : is IV0 <= IV1. TYPE is the type of the iv. The number of
1687 : : iterations is stored to NITER. EXIT_MUST_BE_TAKEN is true if
1688 : : we know that this condition must eventually become false (we derived this
1689 : : earlier, and possibly set NITER->assumptions to make sure this
1690 : : is the case). BNDS bounds the difference IV1->base - IV0->base. */
1691 : :
1692 : : static bool
1693 : 1765399 : number_of_iterations_le (class loop *loop, tree type, affine_iv *iv0,
1694 : : affine_iv *iv1, class tree_niter_desc *niter,
1695 : : bool exit_must_be_taken, bounds *bnds)
1696 : : {
1697 : 1765399 : tree assumption;
1698 : 1765399 : tree type1 = type;
1699 : 1765399 : if (POINTER_TYPE_P (type))
1700 : 6027 : type1 = sizetype;
1701 : :
1702 : : /* Say that IV0 is the control variable. Then IV0 <= IV1 iff
1703 : : IV0 < IV1 + 1, assuming that IV1 is not equal to the greatest
1704 : : value of the type. This we must know anyway, since if it is
1705 : : equal to this value, the loop rolls forever. We do not check
1706 : : this condition for pointer type ivs, as the code cannot rely on
1707 : : the object to that the pointer points being placed at the end of
1708 : : the address space (and more pragmatically, TYPE_{MIN,MAX}_VALUE is
1709 : : not defined for pointers). */
1710 : :
1711 : 1765399 : if (!exit_must_be_taken && !POINTER_TYPE_P (type))
1712 : : {
1713 : 560614 : if (integer_nonzerop (iv0->step))
1714 : 498498 : assumption = fold_build2 (NE_EXPR, boolean_type_node,
1715 : : iv1->base, TYPE_MAX_VALUE (type));
1716 : : else
1717 : 62116 : assumption = fold_build2 (NE_EXPR, boolean_type_node,
1718 : : iv0->base, TYPE_MIN_VALUE (type));
1719 : :
1720 : 560614 : if (integer_zerop (assumption))
1721 : : return false;
1722 : 560614 : if (!integer_nonzerop (assumption))
1723 : 209598 : niter->assumptions = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
1724 : : niter->assumptions, assumption);
1725 : : }
1726 : :
1727 : 1765399 : if (integer_nonzerop (iv0->step))
1728 : : {
1729 : 1671390 : if (POINTER_TYPE_P (type))
1730 : 1432 : iv1->base = fold_build_pointer_plus_hwi (iv1->base, 1);
1731 : : else
1732 : 1669958 : iv1->base = fold_build2 (PLUS_EXPR, type1, iv1->base,
1733 : : build_int_cst (type1, 1));
1734 : : }
1735 : 94009 : else if (POINTER_TYPE_P (type))
1736 : 4595 : iv0->base = fold_build_pointer_plus_hwi (iv0->base, -1);
1737 : : else
1738 : 89414 : iv0->base = fold_build2 (MINUS_EXPR, type1,
1739 : : iv0->base, build_int_cst (type1, 1));
1740 : :
1741 : 1765399 : bounds_add (bnds, 1, type1);
1742 : :
1743 : 1765399 : return number_of_iterations_lt (loop, type, iv0, iv1, niter, exit_must_be_taken,
1744 : 1765399 : bnds);
1745 : : }
1746 : :
1747 : : /* Dumps description of affine induction variable IV to FILE. */
1748 : :
1749 : : static void
1750 : 72454 : dump_affine_iv (FILE *file, affine_iv *iv)
1751 : : {
1752 : 72454 : if (!integer_zerop (iv->step))
1753 : 36227 : fprintf (file, "[");
1754 : :
1755 : 72454 : print_generic_expr (dump_file, iv->base, TDF_SLIM);
1756 : :
1757 : 72454 : if (!integer_zerop (iv->step))
1758 : : {
1759 : 36227 : fprintf (file, ", + , ");
1760 : 36227 : print_generic_expr (dump_file, iv->step, TDF_SLIM);
1761 : 64756 : fprintf (file, "]%s", iv->no_overflow ? "(no_overflow)" : "");
1762 : : }
1763 : 72454 : }
1764 : :
1765 : : /* Determine the number of iterations according to condition (for staying
1766 : : inside loop) which compares two induction variables using comparison
1767 : : operator CODE. The induction variable on left side of the comparison
1768 : : is IV0, the right-hand side is IV1. Both induction variables must have
1769 : : type TYPE, which must be an integer or pointer type. The steps of the
1770 : : ivs must be constants (or NULL_TREE, which is interpreted as constant zero).
1771 : :
1772 : : LOOP is the loop whose number of iterations we are determining.
1773 : :
1774 : : ONLY_EXIT is true if we are sure this is the only way the loop could be
1775 : : exited (including possibly non-returning function calls, exceptions, etc.)
1776 : : -- in this case we can use the information whether the control induction
1777 : : variables can overflow or not in a more efficient way.
1778 : :
1779 : : if EVERY_ITERATION is true, we know the test is executed on every iteration.
1780 : :
1781 : : The results (number of iterations and assumptions as described in
1782 : : comments at class tree_niter_desc in tree-ssa-loop.h) are stored to NITER.
1783 : : Returns false if it fails to determine number of iterations, true if it
1784 : : was determined (possibly with some assumptions). */
1785 : :
1786 : : static bool
1787 : 11508129 : number_of_iterations_cond (class loop *loop,
1788 : : tree type, affine_iv *iv0, enum tree_code code,
1789 : : affine_iv *iv1, class tree_niter_desc *niter,
1790 : : bool only_exit, bool every_iteration)
1791 : : {
1792 : 11508129 : bool exit_must_be_taken = false, ret;
1793 : 11508129 : bounds bnds;
1794 : :
1795 : : /* If the test is not executed every iteration, wrapping may make the test
1796 : : to pass again.
1797 : : TODO: the overflow case can be still used as unreliable estimate of upper
1798 : : bound. But we have no API to pass it down to number of iterations code
1799 : : and, at present, it will not use it anyway. */
1800 : 11508129 : if (!every_iteration
1801 : 54807 : && (!iv0->no_overflow || !iv1->no_overflow
1802 : 40479 : || code == NE_EXPR || code == EQ_EXPR))
1803 : : return false;
1804 : :
1805 : : /* The meaning of these assumptions is this:
1806 : : if !assumptions
1807 : : then the rest of information does not have to be valid
1808 : : if may_be_zero then the loop does not roll, even if
1809 : : niter != 0. */
1810 : 11472643 : niter->assumptions = boolean_true_node;
1811 : 11472643 : niter->may_be_zero = boolean_false_node;
1812 : 11472643 : niter->niter = NULL_TREE;
1813 : 11472643 : niter->max = 0;
1814 : 11472643 : niter->bound = NULL_TREE;
1815 : 11472643 : niter->cmp = ERROR_MARK;
1816 : :
1817 : : /* Make < comparison from > ones, and for NE_EXPR comparisons, ensure that
1818 : : the control variable is on lhs. */
1819 : 11472643 : if (code == GE_EXPR || code == GT_EXPR
1820 : 11472643 : || (code == NE_EXPR && integer_zerop (iv0->step)))
1821 : : {
1822 : 2572626 : std::swap (iv0, iv1);
1823 : 2572626 : code = swap_tree_comparison (code);
1824 : : }
1825 : :
1826 : 11472643 : if (POINTER_TYPE_P (type))
1827 : : {
1828 : : /* Comparison of pointers is undefined unless both iv0 and iv1 point
1829 : : to the same object. If they do, the control variable cannot wrap
1830 : : (as wrap around the bounds of memory will never return a pointer
1831 : : that would be guaranteed to point to the same object, even if we
1832 : : avoid undefined behavior by casting to size_t and back). */
1833 : 623968 : iv0->no_overflow = true;
1834 : 623968 : iv1->no_overflow = true;
1835 : : }
1836 : :
1837 : : /* If the control induction variable does not overflow and the only exit
1838 : : from the loop is the one that we analyze, we know it must be taken
1839 : : eventually. */
1840 : 11472643 : if (only_exit)
1841 : : {
1842 : 7441456 : if (!integer_zerop (iv0->step) && iv0->no_overflow)
1843 : : exit_must_be_taken = true;
1844 : 1907743 : else if (!integer_zerop (iv1->step) && iv1->no_overflow)
1845 : 5658682 : exit_must_be_taken = true;
1846 : : }
1847 : :
1848 : : /* We can handle cases which neither of the sides of the comparison is
1849 : : invariant:
1850 : :
1851 : : {iv0.base, iv0.step} cmp_code {iv1.base, iv1.step}
1852 : : as if:
1853 : : {iv0.base, iv0.step - iv1.step} cmp_code {iv1.base, 0}
1854 : :
1855 : : provided that either below condition is satisfied:
1856 : :
1857 : : a) the test is NE_EXPR;
1858 : : b) iv0 and iv1 do not overflow and iv0.step - iv1.step is of
1859 : : the same sign and of less or equal magnitude than iv0.step
1860 : :
1861 : : This rarely occurs in practice, but it is simple enough to manage. */
1862 : 11472643 : if (!integer_zerop (iv0->step) && !integer_zerop (iv1->step))
1863 : : {
1864 : 5037 : tree step_type = POINTER_TYPE_P (type) ? sizetype : type;
1865 : 5037 : tree step = fold_binary_to_constant (MINUS_EXPR, step_type,
1866 : : iv0->step, iv1->step);
1867 : :
1868 : : /* For code other than NE_EXPR we have to ensure moving the evolution
1869 : : of IV1 to that of IV0 does not introduce overflow. */
1870 : 5037 : if (TREE_CODE (step) != INTEGER_CST
1871 : 5037 : || !iv0->no_overflow || !iv1->no_overflow)
1872 : : {
1873 : 967 : if (code != NE_EXPR)
1874 : : return false;
1875 : 0 : iv0->no_overflow = false;
1876 : : }
1877 : : /* If the new step of IV0 has changed sign or is of greater
1878 : : magnitude then we do not know whether IV0 does overflow
1879 : : and thus the transform is not valid for code other than NE_EXPR. */
1880 : 4070 : else if (tree_int_cst_sign_bit (step) != tree_int_cst_sign_bit (iv0->step)
1881 : 7507 : || wi::gtu_p (wi::abs (wi::to_widest (step)),
1882 : 10944 : wi::abs (wi::to_widest (iv0->step))))
1883 : : {
1884 : 2837 : if (POINTER_TYPE_P (type) && code != NE_EXPR)
1885 : : /* For relational pointer compares we have further guarantees
1886 : : that the pointers always point to the same object (or one
1887 : : after it) and that objects do not cross the zero page. So
1888 : : not only is the transform always valid for relational
1889 : : pointer compares, we also know the resulting IV does not
1890 : : overflow. */
1891 : : ;
1892 : 758 : else if (code != NE_EXPR)
1893 : : return false;
1894 : : else
1895 : 510 : iv0->no_overflow = false;
1896 : : }
1897 : :
1898 : 3312 : iv0->step = step;
1899 : 3312 : iv1->step = build_int_cst (step_type, 0);
1900 : 3312 : iv1->no_overflow = true;
1901 : : }
1902 : :
1903 : : /* If the result of the comparison is a constant, the loop is weird. More
1904 : : precise handling would be possible, but the situation is not common enough
1905 : : to waste time on it. */
1906 : 11470918 : if (integer_zerop (iv0->step) && integer_zerop (iv1->step))
1907 : : return false;
1908 : :
1909 : : /* If the loop exits immediately, there is nothing to do. */
1910 : 11389268 : tree tem = fold_binary (code, boolean_type_node, iv0->base, iv1->base);
1911 : 11389268 : if (tem && integer_zerop (tem))
1912 : : {
1913 : 70949 : if (!every_iteration)
1914 : : return false;
1915 : 70932 : niter->niter = build_int_cst (unsigned_type_for (type), 0);
1916 : 70932 : niter->max = 0;
1917 : 70932 : return true;
1918 : : }
1919 : :
1920 : : /* OK, now we know we have a senseful loop. Handle several cases, depending
1921 : : on what comparison operator is used. */
1922 : 11318319 : bound_difference (loop, iv1->base, iv0->base, &bnds);
1923 : :
1924 : 11318319 : if (dump_file && (dump_flags & TDF_DETAILS))
1925 : : {
1926 : 36227 : fprintf (dump_file,
1927 : : "Analyzing # of iterations of loop %d\n", loop->num);
1928 : :
1929 : 36227 : fprintf (dump_file, " exit condition ");
1930 : 36227 : dump_affine_iv (dump_file, iv0);
1931 : 43269 : fprintf (dump_file, " %s ",
1932 : : code == NE_EXPR ? "!="
1933 : 7042 : : code == LT_EXPR ? "<"
1934 : : : "<=");
1935 : 36227 : dump_affine_iv (dump_file, iv1);
1936 : 36227 : fprintf (dump_file, "\n");
1937 : :
1938 : 36227 : fprintf (dump_file, " bounds on difference of bases: ");
1939 : 36227 : mpz_out_str (dump_file, 10, bnds.below);
1940 : 36227 : fprintf (dump_file, " ... ");
1941 : 36227 : mpz_out_str (dump_file, 10, bnds.up);
1942 : 36227 : fprintf (dump_file, "\n");
1943 : : }
1944 : :
1945 : 11318319 : switch (code)
1946 : : {
1947 : 6524891 : case NE_EXPR:
1948 : 6524891 : gcc_assert (integer_zerop (iv1->step));
1949 : 6524891 : ret = number_of_iterations_ne (loop, type, iv0, iv1->base, niter,
1950 : : exit_must_be_taken, &bnds);
1951 : 6524891 : break;
1952 : :
1953 : 3028029 : case LT_EXPR:
1954 : 3028029 : ret = number_of_iterations_lt (loop, type, iv0, iv1, niter,
1955 : : exit_must_be_taken, &bnds);
1956 : 3028029 : break;
1957 : :
1958 : 1765399 : case LE_EXPR:
1959 : 1765399 : ret = number_of_iterations_le (loop, type, iv0, iv1, niter,
1960 : : exit_must_be_taken, &bnds);
1961 : 1765399 : break;
1962 : :
1963 : 0 : default:
1964 : 0 : gcc_unreachable ();
1965 : : }
1966 : :
1967 : 11318319 : mpz_clear (bnds.up);
1968 : 11318319 : mpz_clear (bnds.below);
1969 : :
1970 : 11318319 : if (dump_file && (dump_flags & TDF_DETAILS))
1971 : : {
1972 : 36227 : if (ret)
1973 : : {
1974 : 36227 : fprintf (dump_file, " result:\n");
1975 : 36227 : if (!integer_nonzerop (niter->assumptions))
1976 : : {
1977 : 145 : fprintf (dump_file, " under assumptions ");
1978 : 145 : print_generic_expr (dump_file, niter->assumptions, TDF_SLIM);
1979 : 145 : fprintf (dump_file, "\n");
1980 : : }
1981 : :
1982 : 36227 : if (!integer_zerop (niter->may_be_zero))
1983 : : {
1984 : 905 : fprintf (dump_file, " zero if ");
1985 : 905 : print_generic_expr (dump_file, niter->may_be_zero, TDF_SLIM);
1986 : 905 : fprintf (dump_file, "\n");
1987 : : }
1988 : :
1989 : 36227 : fprintf (dump_file, " # of iterations ");
1990 : 36227 : print_generic_expr (dump_file, niter->niter, TDF_SLIM);
1991 : 36227 : fprintf (dump_file, ", bounded by ");
1992 : 36227 : print_decu (niter->max, dump_file);
1993 : 36227 : fprintf (dump_file, "\n");
1994 : : }
1995 : : else
1996 : 0 : fprintf (dump_file, " failed\n\n");
1997 : : }
1998 : : return ret;
1999 : : }
2000 : :
2001 : : /* Return an expression that computes the popcount of src. */
2002 : :
2003 : : static tree
2004 : 870 : build_popcount_expr (tree src)
2005 : : {
2006 : 870 : tree fn;
2007 : 870 : bool use_ifn = false;
2008 : 870 : int prec = TYPE_PRECISION (TREE_TYPE (src));
2009 : 870 : int i_prec = TYPE_PRECISION (integer_type_node);
2010 : 870 : int li_prec = TYPE_PRECISION (long_integer_type_node);
2011 : 870 : int lli_prec = TYPE_PRECISION (long_long_integer_type_node);
2012 : :
2013 : 870 : tree utype = unsigned_type_for (TREE_TYPE (src));
2014 : 870 : src = fold_convert (utype, src);
2015 : :
2016 : 870 : if (direct_internal_fn_supported_p (IFN_POPCOUNT, utype, OPTIMIZE_FOR_BOTH))
2017 : : use_ifn = true;
2018 : 822 : else if (prec <= i_prec)
2019 : 748 : fn = builtin_decl_implicit (BUILT_IN_POPCOUNT);
2020 : 74 : else if (prec == li_prec)
2021 : 58 : fn = builtin_decl_implicit (BUILT_IN_POPCOUNTL);
2022 : 16 : else if (prec == lli_prec || prec == 2 * lli_prec)
2023 : 16 : fn = builtin_decl_implicit (BUILT_IN_POPCOUNTLL);
2024 : : else
2025 : : return NULL_TREE;
2026 : :
2027 : 48 : tree call;
2028 : 48 : if (use_ifn)
2029 : 48 : call = build_call_expr_internal_loc (UNKNOWN_LOCATION, IFN_POPCOUNT,
2030 : : integer_type_node, 1, src);
2031 : 822 : else if (prec == 2 * lli_prec)
2032 : : {
2033 : 16 : tree src1 = fold_convert (long_long_unsigned_type_node,
2034 : : fold_build2 (RSHIFT_EXPR, TREE_TYPE (src),
2035 : : unshare_expr (src),
2036 : : build_int_cst (integer_type_node,
2037 : : lli_prec)));
2038 : 16 : tree src2 = fold_convert (long_long_unsigned_type_node, src);
2039 : 16 : tree call1 = build_call_expr (fn, 1, src1);
2040 : 16 : tree call2 = build_call_expr (fn, 1, src2);
2041 : 16 : call = fold_build2 (PLUS_EXPR, integer_type_node, call1, call2);
2042 : : }
2043 : : else
2044 : : {
2045 : 806 : if (prec < i_prec)
2046 : 280 : src = fold_convert (unsigned_type_node, src);
2047 : :
2048 : 806 : call = build_call_expr (fn, 1, src);
2049 : : }
2050 : :
2051 : : return call;
2052 : : }
2053 : :
2054 : : /* Utility function to check if OP is defined by a stmt
2055 : : that is a val - 1. */
2056 : :
2057 : : static bool
2058 : 117484 : ssa_defined_by_minus_one_stmt_p (tree op, tree val)
2059 : : {
2060 : 117484 : gimple *stmt;
2061 : 117484 : return (TREE_CODE (op) == SSA_NAME
2062 : 74732 : && (stmt = SSA_NAME_DEF_STMT (op))
2063 : 74732 : && is_gimple_assign (stmt)
2064 : 64011 : && (gimple_assign_rhs_code (stmt) == PLUS_EXPR)
2065 : 6193 : && val == gimple_assign_rhs1 (stmt)
2066 : 118604 : && integer_minus_onep (gimple_assign_rhs2 (stmt)));
2067 : : }
2068 : :
2069 : : /* See comment below for number_of_iterations_bitcount.
2070 : : For popcount, we have:
2071 : :
2072 : : modify:
2073 : : _1 = iv_1 + -1
2074 : : iv_2 = iv_1 & _1
2075 : :
2076 : : test:
2077 : : if (iv != 0)
2078 : :
2079 : : modification count:
2080 : : popcount (src)
2081 : :
2082 : : */
2083 : :
2084 : : static bool
2085 : 3284927 : number_of_iterations_popcount (loop_p loop, edge exit,
2086 : : enum tree_code code,
2087 : : class tree_niter_desc *niter)
2088 : : {
2089 : 3284927 : bool modify_before_test = true;
2090 : 3284927 : HOST_WIDE_INT max;
2091 : :
2092 : : /* Check that condition for staying inside the loop is like
2093 : : if (iv != 0). */
2094 : 6569854 : gcond *cond_stmt = safe_dyn_cast <gcond *> (*gsi_last_bb (exit->src));
2095 : 3284927 : if (!cond_stmt
2096 : 3284927 : || code != NE_EXPR
2097 : 1529137 : || !integer_zerop (gimple_cond_rhs (cond_stmt))
2098 : 4424281 : || TREE_CODE (gimple_cond_lhs (cond_stmt)) != SSA_NAME)
2099 : 2145573 : return false;
2100 : :
2101 : 1139354 : tree iv_2 = gimple_cond_lhs (cond_stmt);
2102 : 1139354 : gimple *iv_2_stmt = SSA_NAME_DEF_STMT (iv_2);
2103 : :
2104 : : /* If the test comes before the iv modification, then these will actually be
2105 : : iv_1 and a phi node. */
2106 : 1139354 : if (gimple_code (iv_2_stmt) == GIMPLE_PHI
2107 : 350196 : && gimple_bb (iv_2_stmt) == loop->header
2108 : 250131 : && gimple_phi_num_args (iv_2_stmt) == 2
2109 : 1389485 : && (TREE_CODE (gimple_phi_arg_def (iv_2_stmt,
2110 : : loop_latch_edge (loop)->dest_idx))
2111 : : == SSA_NAME))
2112 : : {
2113 : : /* iv_2 is actually one of the inputs to the phi. */
2114 : 233341 : iv_2 = gimple_phi_arg_def (iv_2_stmt, loop_latch_edge (loop)->dest_idx);
2115 : 233341 : iv_2_stmt = SSA_NAME_DEF_STMT (iv_2);
2116 : 233341 : modify_before_test = false;
2117 : : }
2118 : :
2119 : : /* Make sure iv_2_stmt is an and stmt (iv_2 = _1 & iv_1). */
2120 : 1139354 : if (!is_gimple_assign (iv_2_stmt)
2121 : 1139354 : || gimple_assign_rhs_code (iv_2_stmt) != BIT_AND_EXPR)
2122 : : return false;
2123 : :
2124 : 59151 : tree iv_1 = gimple_assign_rhs1 (iv_2_stmt);
2125 : 59151 : tree _1 = gimple_assign_rhs2 (iv_2_stmt);
2126 : :
2127 : : /* Check that _1 is defined by (_1 = iv_1 + -1).
2128 : : Also make sure that _1 is the same in and_stmt and _1 defining stmt.
2129 : : Also canonicalize if _1 and _b11 are revrsed. */
2130 : 59151 : if (ssa_defined_by_minus_one_stmt_p (iv_1, _1))
2131 : : std::swap (iv_1, _1);
2132 : 58333 : else if (ssa_defined_by_minus_one_stmt_p (_1, iv_1))
2133 : : ;
2134 : : else
2135 : : return false;
2136 : :
2137 : : /* Check the recurrence. */
2138 : 889 : gimple *phi = SSA_NAME_DEF_STMT (iv_1);
2139 : 889 : if (gimple_code (phi) != GIMPLE_PHI
2140 : 889 : || (gimple_bb (phi) != loop_latch_edge (loop)->dest)
2141 : 1759 : || (iv_2 != gimple_phi_arg_def (phi, loop_latch_edge (loop)->dest_idx)))
2142 : 19 : return false;
2143 : :
2144 : : /* We found a match. */
2145 : 870 : tree src = gimple_phi_arg_def (phi, loop_preheader_edge (loop)->dest_idx);
2146 : 870 : int src_precision = TYPE_PRECISION (TREE_TYPE (src));
2147 : :
2148 : : /* Get the corresponding popcount builtin. */
2149 : 870 : tree expr = build_popcount_expr (src);
2150 : :
2151 : 870 : if (!expr)
2152 : : return false;
2153 : :
2154 : 870 : max = src_precision;
2155 : :
2156 : 870 : tree may_be_zero = boolean_false_node;
2157 : :
2158 : 870 : if (modify_before_test)
2159 : : {
2160 : 382 : expr = fold_build2 (MINUS_EXPR, integer_type_node, expr,
2161 : : integer_one_node);
2162 : 382 : max = max - 1;
2163 : 382 : may_be_zero = fold_build2 (EQ_EXPR, boolean_type_node, src,
2164 : : build_zero_cst (TREE_TYPE (src)));
2165 : : }
2166 : :
2167 : 870 : expr = fold_convert (unsigned_type_node, expr);
2168 : :
2169 : 870 : niter->assumptions = boolean_true_node;
2170 : 870 : niter->may_be_zero = simplify_using_initial_conditions (loop, may_be_zero);
2171 : 870 : niter->niter = simplify_using_initial_conditions(loop, expr);
2172 : :
2173 : 870 : if (TREE_CODE (niter->niter) == INTEGER_CST)
2174 : 27 : niter->max = tree_to_uhwi (niter->niter);
2175 : : else
2176 : 843 : niter->max = max;
2177 : :
2178 : 870 : niter->bound = NULL_TREE;
2179 : 870 : niter->cmp = ERROR_MARK;
2180 : 870 : return true;
2181 : : }
2182 : :
2183 : : /* Return an expression that counts the leading/trailing zeroes of src.
2184 : :
2185 : : If define_at_zero is true, then the built expression will be defined to
2186 : : return the precision of src when src == 0 (using either a conditional
2187 : : expression or a suitable internal function).
2188 : : Otherwise, we can elide the conditional expression and let src = 0 invoke
2189 : : undefined behaviour. */
2190 : :
2191 : : static tree
2192 : 8313 : build_cltz_expr (tree src, bool leading, bool define_at_zero)
2193 : : {
2194 : 8313 : tree fn;
2195 : 8313 : internal_fn ifn = leading ? IFN_CLZ : IFN_CTZ;
2196 : 8313 : bool use_ifn = false;
2197 : 8313 : int prec = TYPE_PRECISION (TREE_TYPE (src));
2198 : 8313 : int i_prec = TYPE_PRECISION (integer_type_node);
2199 : 8313 : int li_prec = TYPE_PRECISION (long_integer_type_node);
2200 : 8313 : int lli_prec = TYPE_PRECISION (long_long_integer_type_node);
2201 : :
2202 : 8313 : tree utype = unsigned_type_for (TREE_TYPE (src));
2203 : 8313 : src = fold_convert (utype, src);
2204 : :
2205 : 8313 : if (direct_internal_fn_supported_p (ifn, utype, OPTIMIZE_FOR_BOTH))
2206 : : use_ifn = true;
2207 : 3256 : else if (prec <= i_prec)
2208 : 1629 : fn = leading ? builtin_decl_implicit (BUILT_IN_CLZ)
2209 : 3256 : : builtin_decl_implicit (BUILT_IN_CTZ);
2210 : 1627 : else if (prec == li_prec)
2211 : 0 : fn = leading ? builtin_decl_implicit (BUILT_IN_CLZL)
2212 : 3256 : : builtin_decl_implicit (BUILT_IN_CTZL);
2213 : 1627 : else if (prec == lli_prec || prec == 2 * lli_prec)
2214 : 1627 : fn = leading ? builtin_decl_implicit (BUILT_IN_CLZLL)
2215 : 3256 : : builtin_decl_implicit (BUILT_IN_CTZLL);
2216 : : else
2217 : : return NULL_TREE;
2218 : :
2219 : 5057 : tree call;
2220 : 5057 : if (use_ifn)
2221 : : {
2222 : 5057 : int val;
2223 : 5057 : int optab_defined_at_zero
2224 : : = (leading
2225 : 9176 : ? CLZ_DEFINED_VALUE_AT_ZERO (SCALAR_INT_TYPE_MODE (utype), val)
2226 : 1876 : : CTZ_DEFINED_VALUE_AT_ZERO (SCALAR_INT_TYPE_MODE (utype), val));
2227 : 5057 : tree arg2 = NULL_TREE;
2228 : 5057 : if (define_at_zero && optab_defined_at_zero == 2 && val == prec)
2229 : 0 : arg2 = build_int_cst (integer_type_node, val);
2230 : 5057 : call = build_call_expr_internal_loc (UNKNOWN_LOCATION, ifn,
2231 : : integer_type_node, arg2 ? 2 : 1,
2232 : : src, arg2);
2233 : 5057 : if (define_at_zero && arg2 == NULL_TREE)
2234 : : {
2235 : 4123 : tree is_zero = fold_build2 (NE_EXPR, boolean_type_node, src,
2236 : : build_zero_cst (TREE_TYPE (src)));
2237 : 4123 : call = fold_build3 (COND_EXPR, integer_type_node, is_zero, call,
2238 : : build_int_cst (integer_type_node, prec));
2239 : : }
2240 : : }
2241 : 3256 : else if (fn == NULL_TREE)
2242 : : return NULL_TREE;
2243 : 3256 : else if (prec == 2 * lli_prec)
2244 : : {
2245 : 736 : tree src1 = fold_convert (long_long_unsigned_type_node,
2246 : : fold_build2 (RSHIFT_EXPR, TREE_TYPE (src),
2247 : : unshare_expr (src),
2248 : : build_int_cst (integer_type_node,
2249 : : lli_prec)));
2250 : 736 : tree src2 = fold_convert (long_long_unsigned_type_node, src);
2251 : : /* We count the zeroes in src1, and add the number in src2 when src1
2252 : : is 0. */
2253 : 736 : if (!leading)
2254 : 10 : std::swap (src1, src2);
2255 : 736 : tree call1 = build_call_expr (fn, 1, src1);
2256 : 736 : tree call2 = build_call_expr (fn, 1, src2);
2257 : 736 : if (define_at_zero)
2258 : : {
2259 : 726 : tree is_zero2 = fold_build2 (NE_EXPR, boolean_type_node, src2,
2260 : : build_zero_cst (TREE_TYPE (src2)));
2261 : 726 : call2 = fold_build3 (COND_EXPR, integer_type_node, is_zero2, call2,
2262 : : build_int_cst (integer_type_node, lli_prec));
2263 : : }
2264 : 736 : tree is_zero1 = fold_build2 (NE_EXPR, boolean_type_node, src1,
2265 : : build_zero_cst (TREE_TYPE (src1)));
2266 : 736 : call = fold_build3 (COND_EXPR, integer_type_node, is_zero1, call1,
2267 : : fold_build2 (PLUS_EXPR, integer_type_node, call2,
2268 : : build_int_cst (integer_type_node,
2269 : : lli_prec)));
2270 : : }
2271 : : else
2272 : : {
2273 : 2520 : if (prec < i_prec)
2274 : 1629 : src = fold_convert (unsigned_type_node, src);
2275 : :
2276 : 2520 : call = build_call_expr (fn, 1, src);
2277 : 2520 : if (leading && prec < i_prec)
2278 : 1529 : call = fold_build2 (MINUS_EXPR, integer_type_node, call,
2279 : : build_int_cst (integer_type_node, i_prec - prec));
2280 : 2520 : if (define_at_zero)
2281 : : {
2282 : 2363 : tree is_zero = fold_build2 (NE_EXPR, boolean_type_node, src,
2283 : : build_zero_cst (TREE_TYPE (src)));
2284 : 2363 : call = fold_build3 (COND_EXPR, integer_type_node, is_zero, call,
2285 : : build_int_cst (integer_type_node, prec));
2286 : : }
2287 : : }
2288 : :
2289 : : return call;
2290 : : }
2291 : :
2292 : : /* Returns true if STMT is equivalent to x << 1. */
2293 : :
2294 : : static bool
2295 : 904759 : is_lshift_by_1 (gassign *stmt)
2296 : : {
2297 : 904759 : if (gimple_assign_rhs_code (stmt) == LSHIFT_EXPR
2298 : 905967 : && integer_onep (gimple_assign_rhs2 (stmt)))
2299 : : return true;
2300 : 904085 : if (gimple_assign_rhs_code (stmt) == MULT_EXPR
2301 : 1226 : && tree_fits_shwi_p (gimple_assign_rhs2 (stmt))
2302 : 905010 : && tree_to_shwi (gimple_assign_rhs2 (stmt)) == 2)
2303 : : return true;
2304 : : return false;
2305 : : }
2306 : :
2307 : : /* Returns true if STMT is equivalent to x >> 1. */
2308 : :
2309 : : static bool
2310 : 903870 : is_rshift_by_1 (gassign *stmt)
2311 : : {
2312 : 903870 : if (!TYPE_UNSIGNED (TREE_TYPE (gimple_assign_lhs (stmt))))
2313 : : return false;
2314 : 659150 : if (gimple_assign_rhs_code (stmt) == RSHIFT_EXPR
2315 : 676161 : && integer_onep (gimple_assign_rhs2 (stmt)))
2316 : : return true;
2317 : 1225940 : if (trunc_or_exact_div_p (gimple_assign_rhs_code (stmt))
2318 : 574 : && tree_fits_shwi_p (gimple_assign_rhs2 (stmt))
2319 : 651275 : && tree_to_shwi (gimple_assign_rhs2 (stmt)) == 2)
2320 : : return true;
2321 : : return false;
2322 : : }
2323 : :
2324 : : /* See comment below for number_of_iterations_bitcount.
2325 : : For c[lt]z, we have:
2326 : :
2327 : : modify:
2328 : : iv_2 = iv_1 << 1 OR iv_1 >> 1
2329 : :
2330 : : test:
2331 : : if (iv & 1 << (prec-1)) OR (iv & 1)
2332 : :
2333 : : modification count:
2334 : : src precision - c[lt]z (src)
2335 : :
2336 : : */
2337 : :
2338 : : static bool
2339 : 6167078 : number_of_iterations_cltz (loop_p loop, edge exit,
2340 : : enum tree_code code,
2341 : : class tree_niter_desc *niter)
2342 : : {
2343 : 6167078 : bool modify_before_test = true;
2344 : 6167078 : HOST_WIDE_INT max;
2345 : 6167078 : int checked_bit;
2346 : 6167078 : tree iv_2;
2347 : :
2348 : : /* Check that condition for staying inside the loop is like
2349 : : if (iv == 0). */
2350 : 12334156 : gcond *cond_stmt = safe_dyn_cast <gcond *> (*gsi_last_bb (exit->src));
2351 : 6167078 : if (!cond_stmt
2352 : 6167078 : || (code != EQ_EXPR && code != GE_EXPR)
2353 : 3141840 : || !integer_zerop (gimple_cond_rhs (cond_stmt))
2354 : 1242309 : || TREE_CODE (gimple_cond_lhs (cond_stmt)) != SSA_NAME)
2355 : 4924801 : return false;
2356 : :
2357 : 1242277 : if (code == EQ_EXPR)
2358 : : {
2359 : : /* Make sure we check a bitwise and with a suitable constant */
2360 : 1160094 : gimple *and_stmt = SSA_NAME_DEF_STMT (gimple_cond_lhs (cond_stmt));
2361 : 1160094 : if (!is_gimple_assign (and_stmt)
2362 : 695828 : || gimple_assign_rhs_code (and_stmt) != BIT_AND_EXPR
2363 : 129995 : || !integer_pow2p (gimple_assign_rhs2 (and_stmt))
2364 : 1178396 : || TREE_CODE (gimple_assign_rhs1 (and_stmt)) != SSA_NAME)
2365 : 1141792 : return false;
2366 : :
2367 : 18302 : checked_bit = tree_log2 (gimple_assign_rhs2 (and_stmt));
2368 : :
2369 : 18302 : iv_2 = gimple_assign_rhs1 (and_stmt);
2370 : : }
2371 : : else
2372 : : {
2373 : : /* We have a GE_EXPR - a signed comparison with zero is equivalent to
2374 : : testing the leading bit, so check for this pattern too. */
2375 : :
2376 : 82183 : iv_2 = gimple_cond_lhs (cond_stmt);
2377 : 82183 : tree test_value_type = TREE_TYPE (iv_2);
2378 : :
2379 : 82183 : if (TYPE_UNSIGNED (test_value_type))
2380 : : return false;
2381 : :
2382 : 82183 : gimple *test_value_stmt = SSA_NAME_DEF_STMT (iv_2);
2383 : :
2384 : 82183 : if (is_gimple_assign (test_value_stmt)
2385 : 82183 : && gimple_assign_rhs_code (test_value_stmt) == NOP_EXPR)
2386 : : {
2387 : : /* If the test value comes from a NOP_EXPR, then we need to unwrap
2388 : : this. We conservatively require that both types have the same
2389 : : precision. */
2390 : 4840 : iv_2 = gimple_assign_rhs1 (test_value_stmt);
2391 : 4840 : tree rhs_type = TREE_TYPE (iv_2);
2392 : 4840 : if (TREE_CODE (iv_2) != SSA_NAME
2393 : 4840 : || TREE_CODE (rhs_type) != INTEGER_TYPE
2394 : 9679 : || (TYPE_PRECISION (rhs_type)
2395 : 4839 : != TYPE_PRECISION (test_value_type)))
2396 : : return false;
2397 : : }
2398 : :
2399 : 81805 : checked_bit = TYPE_PRECISION (test_value_type) - 1;
2400 : : }
2401 : :
2402 : 100107 : gimple *iv_2_stmt = SSA_NAME_DEF_STMT (iv_2);
2403 : :
2404 : : /* If the test comes before the iv modification, then these will actually be
2405 : : iv_1 and a phi node. */
2406 : 100107 : if (gimple_code (iv_2_stmt) == GIMPLE_PHI
2407 : 25274 : && gimple_bb (iv_2_stmt) == loop->header
2408 : 15007 : && gimple_phi_num_args (iv_2_stmt) == 2
2409 : 115114 : && (TREE_CODE (gimple_phi_arg_def (iv_2_stmt,
2410 : : loop_latch_edge (loop)->dest_idx))
2411 : : == SSA_NAME))
2412 : : {
2413 : : /* iv_2 is actually one of the inputs to the phi. */
2414 : 14995 : iv_2 = gimple_phi_arg_def (iv_2_stmt, loop_latch_edge (loop)->dest_idx);
2415 : 14995 : iv_2_stmt = SSA_NAME_DEF_STMT (iv_2);
2416 : 14995 : modify_before_test = false;
2417 : : }
2418 : :
2419 : : /* Make sure iv_2_stmt is a logical shift by one stmt:
2420 : : iv_2 = iv_1 {<<|>>} 1 */
2421 : 100107 : if (!is_gimple_assign (iv_2_stmt))
2422 : : return false;
2423 : 71077 : bool left_shift = false;
2424 : 141759 : if (!((left_shift = is_lshift_by_1 (as_a <gassign *> (iv_2_stmt)))
2425 : 70682 : || is_rshift_by_1 (as_a <gassign *> (iv_2_stmt))))
2426 : : return false;
2427 : :
2428 : 1101 : tree iv_1 = gimple_assign_rhs1 (iv_2_stmt);
2429 : :
2430 : : /* Check the recurrence. */
2431 : 1101 : gimple *phi = SSA_NAME_DEF_STMT (iv_1);
2432 : 1101 : if (gimple_code (phi) != GIMPLE_PHI
2433 : 1101 : || (gimple_bb (phi) != loop_latch_edge (loop)->dest)
2434 : 2202 : || (iv_2 != gimple_phi_arg_def (phi, loop_latch_edge (loop)->dest_idx)))
2435 : 0 : return false;
2436 : :
2437 : : /* We found a match. */
2438 : 1101 : tree src = gimple_phi_arg_def (phi, loop_preheader_edge (loop)->dest_idx);
2439 : 1101 : int src_precision = TYPE_PRECISION (TREE_TYPE (src));
2440 : :
2441 : : /* Apply any needed preprocessing to src. */
2442 : 1101 : int num_ignored_bits;
2443 : 1101 : if (left_shift)
2444 : 395 : num_ignored_bits = src_precision - checked_bit - 1;
2445 : : else
2446 : : num_ignored_bits = checked_bit;
2447 : :
2448 : 1101 : if (modify_before_test)
2449 : 508 : num_ignored_bits++;
2450 : :
2451 : 1101 : if (num_ignored_bits != 0)
2452 : 1084 : src = fold_build2 (left_shift ? LSHIFT_EXPR : RSHIFT_EXPR,
2453 : : TREE_TYPE (src), src,
2454 : : build_int_cst (integer_type_node, num_ignored_bits));
2455 : :
2456 : : /* Get the corresponding c[lt]z builtin. */
2457 : 1101 : tree expr = build_cltz_expr (src, left_shift, false);
2458 : :
2459 : 1101 : if (!expr)
2460 : : return false;
2461 : :
2462 : 1101 : max = src_precision - num_ignored_bits - 1;
2463 : :
2464 : 1101 : expr = fold_convert (unsigned_type_node, expr);
2465 : :
2466 : 1101 : tree assumptions = fold_build2 (NE_EXPR, boolean_type_node, src,
2467 : : build_zero_cst (TREE_TYPE (src)));
2468 : :
2469 : 1101 : niter->assumptions = simplify_using_initial_conditions (loop, assumptions);
2470 : 1101 : niter->may_be_zero = boolean_false_node;
2471 : 1101 : niter->niter = simplify_using_initial_conditions (loop, expr);
2472 : :
2473 : 1101 : if (TREE_CODE (niter->niter) == INTEGER_CST)
2474 : 0 : niter->max = tree_to_uhwi (niter->niter);
2475 : : else
2476 : 1101 : niter->max = max;
2477 : :
2478 : 1101 : niter->bound = NULL_TREE;
2479 : 1101 : niter->cmp = ERROR_MARK;
2480 : :
2481 : 1101 : return true;
2482 : : }
2483 : :
2484 : : /* See comment below for number_of_iterations_bitcount.
2485 : : For c[lt]z complement, we have:
2486 : :
2487 : : modify:
2488 : : iv_2 = iv_1 >> 1 OR iv_1 << 1
2489 : :
2490 : : test:
2491 : : if (iv != 0)
2492 : :
2493 : : modification count:
2494 : : src precision - c[lt]z (src)
2495 : :
2496 : : */
2497 : :
2498 : : static bool
2499 : 3283868 : number_of_iterations_cltz_complement (loop_p loop, edge exit,
2500 : : enum tree_code code,
2501 : : class tree_niter_desc *niter)
2502 : : {
2503 : 3283868 : bool modify_before_test = true;
2504 : 3283868 : HOST_WIDE_INT max;
2505 : :
2506 : : /* Check that condition for staying inside the loop is like
2507 : : if (iv != 0). */
2508 : 6567736 : gcond *cond_stmt = safe_dyn_cast <gcond *> (*gsi_last_bb (exit->src));
2509 : 3283868 : if (!cond_stmt
2510 : 3283868 : || code != NE_EXPR
2511 : 1528267 : || !integer_zerop (gimple_cond_rhs (cond_stmt))
2512 : 4422352 : || TREE_CODE (gimple_cond_lhs (cond_stmt)) != SSA_NAME)
2513 : 2145384 : return false;
2514 : :
2515 : 1138484 : tree iv_2 = gimple_cond_lhs (cond_stmt);
2516 : 1138484 : gimple *iv_2_stmt = SSA_NAME_DEF_STMT (iv_2);
2517 : :
2518 : : /* If the test comes before the iv modification, then these will actually be
2519 : : iv_1 and a phi node. */
2520 : 1138484 : if (gimple_code (iv_2_stmt) == GIMPLE_PHI
2521 : 349708 : && gimple_bb (iv_2_stmt) == loop->header
2522 : 249643 : && gimple_phi_num_args (iv_2_stmt) == 2
2523 : 1388127 : && (TREE_CODE (gimple_phi_arg_def (iv_2_stmt,
2524 : : loop_latch_edge (loop)->dest_idx))
2525 : : == SSA_NAME))
2526 : : {
2527 : : /* iv_2 is actually one of the inputs to the phi. */
2528 : 232853 : iv_2 = gimple_phi_arg_def (iv_2_stmt, loop_latch_edge (loop)->dest_idx);
2529 : 232853 : iv_2_stmt = SSA_NAME_DEF_STMT (iv_2);
2530 : 232853 : modify_before_test = false;
2531 : : }
2532 : :
2533 : : /* Make sure iv_2_stmt is a logical shift by one stmt:
2534 : : iv_2 = iv_1 {>>|<<} 1 */
2535 : 1138484 : if (!is_gimple_assign (iv_2_stmt))
2536 : : return false;
2537 : 833682 : bool left_shift = false;
2538 : 1666870 : if (!((left_shift = is_lshift_by_1 (as_a <gassign *> (iv_2_stmt)))
2539 : 833188 : || is_rshift_by_1 (as_a <gassign *> (iv_2_stmt))))
2540 : : return false;
2541 : :
2542 : 8204 : tree iv_1 = gimple_assign_rhs1 (iv_2_stmt);
2543 : :
2544 : : /* Check the recurrence. */
2545 : 8204 : gimple *phi = SSA_NAME_DEF_STMT (iv_1);
2546 : 8204 : if (gimple_code (phi) != GIMPLE_PHI
2547 : 7508 : || (gimple_bb (phi) != loop_latch_edge (loop)->dest)
2548 : 15704 : || (iv_2 != gimple_phi_arg_def (phi, loop_latch_edge (loop)->dest_idx)))
2549 : 992 : return false;
2550 : :
2551 : : /* We found a match. */
2552 : 7212 : tree src = gimple_phi_arg_def (phi, loop_preheader_edge (loop)->dest_idx);
2553 : 7212 : int src_precision = TYPE_PRECISION (TREE_TYPE (src));
2554 : :
2555 : : /* Get the corresponding c[lt]z builtin. */
2556 : 7212 : tree expr = build_cltz_expr (src, !left_shift, true);
2557 : :
2558 : 7212 : if (!expr)
2559 : : return false;
2560 : :
2561 : 7212 : expr = fold_build2 (MINUS_EXPR, integer_type_node,
2562 : : build_int_cst (integer_type_node, src_precision),
2563 : : expr);
2564 : :
2565 : 7212 : max = src_precision;
2566 : :
2567 : 7212 : tree may_be_zero = boolean_false_node;
2568 : :
2569 : 7212 : if (modify_before_test)
2570 : : {
2571 : 5960 : expr = fold_build2 (MINUS_EXPR, integer_type_node, expr,
2572 : : integer_one_node);
2573 : 5960 : max = max - 1;
2574 : 5960 : may_be_zero = fold_build2 (EQ_EXPR, boolean_type_node, src,
2575 : : build_zero_cst (TREE_TYPE (src)));
2576 : : }
2577 : :
2578 : 7212 : expr = fold_convert (unsigned_type_node, expr);
2579 : :
2580 : 7212 : niter->assumptions = boolean_true_node;
2581 : 7212 : niter->may_be_zero = simplify_using_initial_conditions (loop, may_be_zero);
2582 : 7212 : niter->niter = simplify_using_initial_conditions (loop, expr);
2583 : :
2584 : 7212 : if (TREE_CODE (niter->niter) == INTEGER_CST)
2585 : 65 : niter->max = tree_to_uhwi (niter->niter);
2586 : : else
2587 : 7147 : niter->max = max;
2588 : :
2589 : 7212 : niter->bound = NULL_TREE;
2590 : 7212 : niter->cmp = ERROR_MARK;
2591 : 7212 : return true;
2592 : : }
2593 : :
2594 : : /* See if LOOP contains a bit counting idiom. The idiom consists of two parts:
2595 : : 1. A modification to the induction variabler;.
2596 : : 2. A test to determine whether or not to exit the loop.
2597 : :
2598 : : These can come in either order - i.e.:
2599 : :
2600 : : <bb 3>
2601 : : iv_1 = PHI <src(2), iv_2(4)>
2602 : : if (test (iv_1))
2603 : : goto <bb 4>
2604 : : else
2605 : : goto <bb 5>
2606 : :
2607 : : <bb 4>
2608 : : iv_2 = modify (iv_1)
2609 : : goto <bb 3>
2610 : :
2611 : : OR
2612 : :
2613 : : <bb 3>
2614 : : iv_1 = PHI <src(2), iv_2(4)>
2615 : : iv_2 = modify (iv_1)
2616 : :
2617 : : <bb 4>
2618 : : if (test (iv_2))
2619 : : goto <bb 3>
2620 : : else
2621 : : goto <bb 5>
2622 : :
2623 : : The second form can be generated by copying the loop header out of the loop.
2624 : :
2625 : : In the first case, the number of latch executions will be equal to the
2626 : : number of induction variable modifications required before the test fails.
2627 : :
2628 : : In the second case (modify_before_test), if we assume that the number of
2629 : : modifications required before the test fails is nonzero, then the number of
2630 : : latch executions will be one less than this number.
2631 : :
2632 : : If we recognise the pattern, then we update niter accordingly, and return
2633 : : true. */
2634 : :
2635 : : static bool
2636 : 3284927 : number_of_iterations_bitcount (loop_p loop, edge exit,
2637 : : enum tree_code code,
2638 : : class tree_niter_desc *niter)
2639 : : {
2640 : 3284927 : return (number_of_iterations_popcount (loop, exit, code, niter)
2641 : 3284057 : || number_of_iterations_cltz (loop, exit, code, niter)
2642 : 6568795 : || number_of_iterations_cltz_complement (loop, exit, code, niter));
2643 : : }
2644 : :
2645 : : /* Substitute NEW_TREE for OLD in EXPR and fold the result.
2646 : : If VALUEIZE is non-NULL then OLD and NEW_TREE are ignored and instead
2647 : : all SSA names are replaced with the result of calling the VALUEIZE
2648 : : function with the SSA name as argument. */
2649 : :
2650 : : tree
2651 : 102104295 : simplify_replace_tree (tree expr, tree old, tree new_tree,
2652 : : tree (*valueize) (tree, void*), void *context,
2653 : : bool do_fold)
2654 : : {
2655 : 102104295 : unsigned i, n;
2656 : 102104295 : tree ret = NULL_TREE, e, se;
2657 : :
2658 : 102104295 : if (!expr)
2659 : : return NULL_TREE;
2660 : :
2661 : : /* Do not bother to replace constants. */
2662 : 28416882 : if (CONSTANT_CLASS_P (expr))
2663 : : return expr;
2664 : :
2665 : 21523349 : if (valueize)
2666 : : {
2667 : 255816 : if (TREE_CODE (expr) == SSA_NAME)
2668 : : {
2669 : 81881 : new_tree = valueize (expr, context);
2670 : 81881 : if (new_tree != expr)
2671 : : return new_tree;
2672 : : }
2673 : : }
2674 : 21267533 : else if (expr == old
2675 : 21267533 : || operand_equal_p (expr, old, 0))
2676 : 213507 : return unshare_expr (new_tree);
2677 : :
2678 : 21307234 : if (!EXPR_P (expr))
2679 : : return expr;
2680 : :
2681 : 11337157 : n = TREE_OPERAND_LENGTH (expr);
2682 : 31790928 : for (i = 0; i < n; i++)
2683 : : {
2684 : 20453771 : e = TREE_OPERAND (expr, i);
2685 : 20453771 : se = simplify_replace_tree (e, old, new_tree, valueize, context, do_fold);
2686 : 20453771 : if (e == se)
2687 : 20187411 : continue;
2688 : :
2689 : 266360 : if (!ret)
2690 : 265743 : ret = copy_node (expr);
2691 : :
2692 : 266360 : TREE_OPERAND (ret, i) = se;
2693 : : }
2694 : :
2695 : 11337157 : return (ret ? (do_fold ? fold (ret) : ret) : expr);
2696 : : }
2697 : :
2698 : : /* Expand definitions of ssa names in EXPR as long as they are simple
2699 : : enough, and return the new expression. If STOP is specified, stop
2700 : : expanding if EXPR equals to it. */
2701 : :
2702 : : static tree
2703 : 108012305 : expand_simple_operations (tree expr, tree stop, hash_map<tree, tree> &cache)
2704 : : {
2705 : 108665088 : unsigned i, n;
2706 : 108665088 : tree ret = NULL_TREE, e, ee, e1;
2707 : 108665088 : enum tree_code code;
2708 : 108665088 : gimple *stmt;
2709 : :
2710 : 108665088 : if (expr == NULL_TREE)
2711 : : return expr;
2712 : :
2713 : 108665088 : if (is_gimple_min_invariant (expr))
2714 : : return expr;
2715 : :
2716 : 74403419 : code = TREE_CODE (expr);
2717 : 74403419 : if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
2718 : : {
2719 : 18781956 : n = TREE_OPERAND_LENGTH (expr);
2720 : 52105951 : for (i = 0; i < n; i++)
2721 : : {
2722 : 33323995 : e = TREE_OPERAND (expr, i);
2723 : 33323995 : if (!e)
2724 : 30063889 : continue;
2725 : : /* SCEV analysis feeds us with a proper expression
2726 : : graph matching the SSA graph. Avoid turning it
2727 : : into a tree here, thus handle tree sharing
2728 : : properly.
2729 : : ??? The SSA walk below still turns the SSA graph
2730 : : into a tree but until we find a testcase do not
2731 : : introduce additional tree sharing here. */
2732 : 33309047 : bool existed_p;
2733 : 33309047 : tree &cee = cache.get_or_insert (e, &existed_p);
2734 : 33309047 : if (existed_p)
2735 : 144744 : ee = cee;
2736 : : else
2737 : : {
2738 : 33164303 : cee = e;
2739 : 33164303 : ee = expand_simple_operations (e, stop, cache);
2740 : 33164303 : if (ee != e)
2741 : 3258490 : *cache.get (e) = ee;
2742 : : }
2743 : 33309047 : if (e == ee)
2744 : 30048941 : continue;
2745 : :
2746 : 3260106 : if (!ret)
2747 : 3090949 : ret = copy_node (expr);
2748 : :
2749 : 3260106 : TREE_OPERAND (ret, i) = ee;
2750 : : }
2751 : :
2752 : 18781956 : if (!ret)
2753 : : return expr;
2754 : :
2755 : 3090949 : fold_defer_overflow_warnings ();
2756 : 3090949 : ret = fold (ret);
2757 : 3090949 : fold_undefer_and_ignore_overflow_warnings ();
2758 : 3090949 : return ret;
2759 : : }
2760 : :
2761 : : /* Stop if it's not ssa name or the one we don't want to expand. */
2762 : 55621463 : if (TREE_CODE (expr) != SSA_NAME || expr == stop)
2763 : : return expr;
2764 : :
2765 : 55442804 : stmt = SSA_NAME_DEF_STMT (expr);
2766 : 55442804 : if (gimple_code (stmt) == GIMPLE_PHI)
2767 : : {
2768 : 15455873 : basic_block src, dest;
2769 : :
2770 : 15455873 : if (gimple_phi_num_args (stmt) != 1)
2771 : : return expr;
2772 : 636287 : e = PHI_ARG_DEF (stmt, 0);
2773 : :
2774 : : /* Avoid propagating through loop exit phi nodes, which
2775 : : could break loop-closed SSA form restrictions. */
2776 : 636287 : dest = gimple_bb (stmt);
2777 : 636287 : src = single_pred (dest);
2778 : 636287 : if (TREE_CODE (e) == SSA_NAME
2779 : 635213 : && src->loop_father != dest->loop_father)
2780 : : return expr;
2781 : :
2782 : : return expand_simple_operations (e, stop, cache);
2783 : : }
2784 : 39986931 : if (gimple_code (stmt) != GIMPLE_ASSIGN)
2785 : : return expr;
2786 : :
2787 : : /* Avoid expanding to expressions that contain SSA names that need
2788 : : to take part in abnormal coalescing. */
2789 : 35019161 : ssa_op_iter iter;
2790 : 72941888 : FOR_EACH_SSA_TREE_OPERAND (e, stmt, iter, SSA_OP_USE)
2791 : 37923358 : if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (e))
2792 : : return expr;
2793 : :
2794 : 35018530 : e = gimple_assign_rhs1 (stmt);
2795 : 35018530 : code = gimple_assign_rhs_code (stmt);
2796 : 35018530 : if (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS)
2797 : : {
2798 : 13598592 : if (is_gimple_min_invariant (e))
2799 : : return e;
2800 : :
2801 : 13574626 : if (code == SSA_NAME)
2802 : : return expand_simple_operations (e, stop, cache);
2803 : 13234466 : else if (code == ADDR_EXPR)
2804 : : {
2805 : 9034 : poly_int64 offset;
2806 : 9034 : tree base = get_addr_base_and_unit_offset (TREE_OPERAND (e, 0),
2807 : : &offset);
2808 : 9034 : if (base
2809 : 8582 : && TREE_CODE (base) == MEM_REF)
2810 : : {
2811 : 8582 : ee = expand_simple_operations (TREE_OPERAND (base, 0), stop,
2812 : : cache);
2813 : 8582 : return fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (expr), ee,
2814 : : wide_int_to_tree (sizetype,
2815 : : mem_ref_offset (base)
2816 : : + offset));
2817 : : }
2818 : : }
2819 : :
2820 : 13225884 : return expr;
2821 : : }
2822 : :
2823 : 21419938 : switch (code)
2824 : : {
2825 : 4862633 : CASE_CONVERT:
2826 : : /* Casts are simple. */
2827 : 4862633 : ee = expand_simple_operations (e, stop, cache);
2828 : 4862633 : return fold_build1 (code, TREE_TYPE (expr), ee);
2829 : :
2830 : 12191754 : case PLUS_EXPR:
2831 : 12191754 : case MINUS_EXPR:
2832 : 12191754 : case MULT_EXPR:
2833 : 24383452 : if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (expr))
2834 : 24380048 : && TYPE_OVERFLOW_TRAPS (TREE_TYPE (expr)))
2835 : : return expr;
2836 : : /* Fallthru. */
2837 : 12742372 : case POINTER_PLUS_EXPR:
2838 : : /* And increments and decrements by a constant are simple. */
2839 : 12742372 : e1 = gimple_assign_rhs2 (stmt);
2840 : 12742372 : if (!is_gimple_min_invariant (e1))
2841 : : return expr;
2842 : :
2843 : 6528655 : ee = expand_simple_operations (e, stop, cache);
2844 : 6528655 : return fold_build2 (code, TREE_TYPE (expr), ee, e1);
2845 : :
2846 : : default:
2847 : : return expr;
2848 : : }
2849 : : }
2850 : :
2851 : : tree
2852 : 63448132 : expand_simple_operations (tree expr, tree stop)
2853 : : {
2854 : 63448132 : hash_map<tree, tree> cache;
2855 : 63448132 : return expand_simple_operations (expr, stop, cache);
2856 : 63448132 : }
2857 : :
2858 : : /* Tries to simplify EXPR using the condition COND. Returns the simplified
2859 : : expression (or EXPR unchanged, if no simplification was possible). */
2860 : :
2861 : : static tree
2862 : 8569601 : tree_simplify_using_condition_1 (tree cond, tree expr)
2863 : : {
2864 : 8569601 : bool changed;
2865 : 8569601 : tree e, e0, e1, e2, notcond;
2866 : 8569601 : enum tree_code code = TREE_CODE (expr);
2867 : :
2868 : 8569601 : if (code == INTEGER_CST)
2869 : : return expr;
2870 : :
2871 : 8558167 : if (code == TRUTH_OR_EXPR
2872 : 8558167 : || code == TRUTH_AND_EXPR
2873 : 8558167 : || code == COND_EXPR)
2874 : : {
2875 : 108685 : changed = false;
2876 : :
2877 : 108685 : e0 = tree_simplify_using_condition_1 (cond, TREE_OPERAND (expr, 0));
2878 : 108685 : if (TREE_OPERAND (expr, 0) != e0)
2879 : 2030 : changed = true;
2880 : :
2881 : 108685 : e1 = tree_simplify_using_condition_1 (cond, TREE_OPERAND (expr, 1));
2882 : 108685 : if (TREE_OPERAND (expr, 1) != e1)
2883 : 0 : changed = true;
2884 : :
2885 : 108685 : if (code == COND_EXPR)
2886 : : {
2887 : 12126 : e2 = tree_simplify_using_condition_1 (cond, TREE_OPERAND (expr, 2));
2888 : 12126 : if (TREE_OPERAND (expr, 2) != e2)
2889 : : changed = true;
2890 : : }
2891 : : else
2892 : : e2 = NULL_TREE;
2893 : :
2894 : 108685 : if (changed)
2895 : : {
2896 : 2030 : if (code == COND_EXPR)
2897 : 1886 : expr = fold_build3 (code, boolean_type_node, e0, e1, e2);
2898 : : else
2899 : 144 : expr = fold_build2 (code, boolean_type_node, e0, e1);
2900 : : }
2901 : :
2902 : 108685 : return expr;
2903 : : }
2904 : :
2905 : : /* In case COND is equality, we may be able to simplify EXPR by copy/constant
2906 : : propagation, and vice versa. Fold does not handle this, since it is
2907 : : considered too expensive. */
2908 : 8449482 : if (TREE_CODE (cond) == EQ_EXPR)
2909 : : {
2910 : 1922384 : e0 = TREE_OPERAND (cond, 0);
2911 : 1922384 : e1 = TREE_OPERAND (cond, 1);
2912 : :
2913 : : /* We know that e0 == e1. Check whether we cannot simplify expr
2914 : : using this fact. */
2915 : 1922384 : e = simplify_replace_tree (expr, e0, e1);
2916 : 1922384 : if (integer_zerop (e) || integer_nonzerop (e))
2917 : 3360 : return e;
2918 : :
2919 : 1919024 : e = simplify_replace_tree (expr, e1, e0);
2920 : 1919024 : if (integer_zerop (e) || integer_nonzerop (e))
2921 : 584 : return e;
2922 : : }
2923 : 8445538 : if (TREE_CODE (expr) == EQ_EXPR)
2924 : : {
2925 : 957642 : e0 = TREE_OPERAND (expr, 0);
2926 : 957642 : e1 = TREE_OPERAND (expr, 1);
2927 : :
2928 : : /* If e0 == e1 (EXPR) implies !COND, then EXPR cannot be true. */
2929 : 957642 : e = simplify_replace_tree (cond, e0, e1);
2930 : 957642 : if (integer_zerop (e))
2931 : : return e;
2932 : 932992 : e = simplify_replace_tree (cond, e1, e0);
2933 : 932992 : if (integer_zerop (e))
2934 : : return e;
2935 : : }
2936 : 8420888 : if (TREE_CODE (expr) == NE_EXPR)
2937 : : {
2938 : 1004551 : e0 = TREE_OPERAND (expr, 0);
2939 : 1004551 : e1 = TREE_OPERAND (expr, 1);
2940 : :
2941 : : /* If e0 == e1 (!EXPR) implies !COND, then EXPR must be true. */
2942 : 1004551 : e = simplify_replace_tree (cond, e0, e1);
2943 : 1004551 : if (integer_zerop (e))
2944 : 18357 : return boolean_true_node;
2945 : 986194 : e = simplify_replace_tree (cond, e1, e0);
2946 : 986194 : if (integer_zerop (e))
2947 : 0 : return boolean_true_node;
2948 : : }
2949 : :
2950 : : /* Check whether COND ==> EXPR. */
2951 : 8402531 : notcond = invert_truthvalue (cond);
2952 : 8402531 : e = fold_binary (TRUTH_OR_EXPR, boolean_type_node, notcond, expr);
2953 : 8402531 : if (e && integer_nonzerop (e))
2954 : : return e;
2955 : :
2956 : : /* Check whether COND ==> not EXPR. */
2957 : 8397132 : e = fold_binary (TRUTH_AND_EXPR, boolean_type_node, cond, expr);
2958 : 8397132 : if (e && integer_zerop (e))
2959 : : return e;
2960 : :
2961 : : return expr;
2962 : : }
2963 : :
2964 : : /* Tries to simplify EXPR using the condition COND. Returns the simplified
2965 : : expression (or EXPR unchanged, if no simplification was possible).
2966 : : Wrapper around tree_simplify_using_condition_1 that ensures that chains
2967 : : of simple operations in definitions of ssa names in COND are expanded,
2968 : : so that things like casts or incrementing the value of the bound before
2969 : : the loop do not cause us to fail. */
2970 : :
2971 : : static tree
2972 : 8340105 : tree_simplify_using_condition (tree cond, tree expr)
2973 : : {
2974 : 8340105 : cond = expand_simple_operations (cond);
2975 : :
2976 : 8340105 : return tree_simplify_using_condition_1 (cond, expr);
2977 : : }
2978 : :
2979 : : /* Tries to simplify EXPR using the conditions on entry to LOOP.
2980 : : Returns the simplified expression (or EXPR unchanged, if no
2981 : : simplification was possible). */
2982 : :
2983 : : tree
2984 : 25027519 : simplify_using_initial_conditions (class loop *loop, tree expr)
2985 : : {
2986 : 25027519 : edge e;
2987 : 25027519 : basic_block bb;
2988 : 25027519 : tree cond, expanded, backup;
2989 : 25027519 : int cnt = 0;
2990 : :
2991 : 25027519 : if (TREE_CODE (expr) == INTEGER_CST)
2992 : : return expr;
2993 : :
2994 : 2681503 : backup = expanded = expand_simple_operations (expr);
2995 : :
2996 : : /* Limit walking the dominators to avoid quadraticness in
2997 : : the number of BBs times the number of loops in degenerate
2998 : : cases. */
2999 : 2681503 : for (bb = loop->header;
3000 : 26297169 : bb != ENTRY_BLOCK_PTR_FOR_FN (cfun) && cnt < MAX_DOMINATORS_TO_WALK;
3001 : 23615666 : bb = get_immediate_dominator (CDI_DOMINATORS, bb))
3002 : : {
3003 : 23718525 : if (!single_pred_p (bb))
3004 : 11923770 : continue;
3005 : 11794755 : e = single_pred_edge (bb);
3006 : :
3007 : 11794755 : if (!(e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
3008 : 3454650 : continue;
3009 : :
3010 : 16680210 : gcond *stmt = as_a <gcond *> (*gsi_last_bb (e->src));
3011 : 8340105 : cond = fold_build2 (gimple_cond_code (stmt),
3012 : : boolean_type_node,
3013 : : gimple_cond_lhs (stmt),
3014 : : gimple_cond_rhs (stmt));
3015 : 8340105 : if (e->flags & EDGE_FALSE_VALUE)
3016 : 4782261 : cond = invert_truthvalue (cond);
3017 : 8340105 : expanded = tree_simplify_using_condition (cond, expanded);
3018 : : /* Break if EXPR is simplified to const values. */
3019 : 8340105 : if (expanded
3020 : 8340105 : && (integer_zerop (expanded) || integer_nonzerop (expanded)))
3021 : 102859 : return expanded;
3022 : :
3023 : 8237246 : ++cnt;
3024 : : }
3025 : :
3026 : : /* Return the original expression if no simplification is done. */
3027 : 2578644 : return operand_equal_p (backup, expanded, 0) ? expr : expanded;
3028 : : }
3029 : :
3030 : : /* Tries to simplify EXPR using the evolutions of the loop invariants
3031 : : in the superloops of LOOP. Returns the simplified expression
3032 : : (or EXPR unchanged, if no simplification was possible). */
3033 : :
3034 : : static tree
3035 : 5585884 : simplify_using_outer_evolutions (class loop *loop, tree expr)
3036 : : {
3037 : 5585884 : enum tree_code code = TREE_CODE (expr);
3038 : 5585884 : bool changed;
3039 : 5585884 : tree e, e0, e1, e2;
3040 : :
3041 : 5585884 : if (is_gimple_min_invariant (expr))
3042 : : return expr;
3043 : :
3044 : 1271355 : if (code == TRUTH_OR_EXPR
3045 : 1271355 : || code == TRUTH_AND_EXPR
3046 : 1271355 : || code == COND_EXPR)
3047 : : {
3048 : 8300 : changed = false;
3049 : :
3050 : 8300 : e0 = simplify_using_outer_evolutions (loop, TREE_OPERAND (expr, 0));
3051 : 8300 : if (TREE_OPERAND (expr, 0) != e0)
3052 : 0 : changed = true;
3053 : :
3054 : 8300 : e1 = simplify_using_outer_evolutions (loop, TREE_OPERAND (expr, 1));
3055 : 8300 : if (TREE_OPERAND (expr, 1) != e1)
3056 : 0 : changed = true;
3057 : :
3058 : 8300 : if (code == COND_EXPR)
3059 : : {
3060 : 0 : e2 = simplify_using_outer_evolutions (loop, TREE_OPERAND (expr, 2));
3061 : 0 : if (TREE_OPERAND (expr, 2) != e2)
3062 : : changed = true;
3063 : : }
3064 : : else
3065 : : e2 = NULL_TREE;
3066 : :
3067 : 8300 : if (changed)
3068 : : {
3069 : 0 : if (code == COND_EXPR)
3070 : 0 : expr = fold_build3 (code, boolean_type_node, e0, e1, e2);
3071 : : else
3072 : 0 : expr = fold_build2 (code, boolean_type_node, e0, e1);
3073 : : }
3074 : :
3075 : 8300 : return expr;
3076 : : }
3077 : :
3078 : 1263055 : e = instantiate_parameters (loop, expr);
3079 : 1263055 : if (is_gimple_min_invariant (e))
3080 : : return e;
3081 : :
3082 : : return expr;
3083 : : }
3084 : :
3085 : : /* Returns true if EXIT is the only possible exit from LOOP. */
3086 : :
3087 : : bool
3088 : 11887512 : loop_only_exit_p (const class loop *loop, basic_block *body, const_edge exit)
3089 : : {
3090 : 11887512 : gimple_stmt_iterator bsi;
3091 : 11887512 : unsigned i;
3092 : :
3093 : 11887512 : if (exit != single_exit (loop))
3094 : : return false;
3095 : :
3096 : 39831250 : for (i = 0; i < loop->num_nodes; i++)
3097 : 260337427 : for (bsi = gsi_start_bb (body[i]); !gsi_end_p (bsi); gsi_next (&bsi))
3098 : 197455432 : if (stmt_can_terminate_bb_p (gsi_stmt (bsi)))
3099 : : return false;
3100 : :
3101 : : return true;
3102 : : }
3103 : :
3104 : : /* Stores description of number of iterations of LOOP derived from
3105 : : EXIT (an exit edge of the LOOP) in NITER. Returns true if some useful
3106 : : information could be derived (and fields of NITER have meaning described
3107 : : in comments at class tree_niter_desc declaration), false otherwise.
3108 : : When EVERY_ITERATION is true, only tests that are known to be executed
3109 : : every iteration are considered (i.e. only test that alone bounds the loop).
3110 : : If AT_STMT is not NULL, this function stores LOOP's condition statement in
3111 : : it when returning true. */
3112 : :
3113 : : bool
3114 : 22966982 : number_of_iterations_exit_assumptions (class loop *loop, edge exit,
3115 : : class tree_niter_desc *niter,
3116 : : gcond **at_stmt, bool every_iteration,
3117 : : basic_block *body)
3118 : : {
3119 : 22966982 : tree type;
3120 : 22966982 : tree op0, op1;
3121 : 22966982 : enum tree_code code;
3122 : 22966982 : affine_iv iv0, iv1;
3123 : 22966982 : bool safe;
3124 : :
3125 : : /* The condition at a fake exit (if it exists) does not control its
3126 : : execution. */
3127 : 22966982 : if (exit->flags & EDGE_FAKE)
3128 : : return false;
3129 : :
3130 : : /* Nothing to analyze if the loop is known to be infinite. */
3131 : 22966576 : if (loop_constraint_set_p (loop, LOOP_C_INFINITE))
3132 : : return false;
3133 : :
3134 : 22966576 : safe = dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src);
3135 : :
3136 : 22966576 : if (every_iteration && !safe)
3137 : : return false;
3138 : :
3139 : 21693843 : niter->assumptions = boolean_false_node;
3140 : 21693843 : niter->control.base = NULL_TREE;
3141 : 21693843 : niter->control.step = NULL_TREE;
3142 : 21693843 : niter->control.no_overflow = false;
3143 : 48797732 : gcond *stmt = safe_dyn_cast <gcond *> (*gsi_last_bb (exit->src));
3144 : 19071542 : if (!stmt)
3145 : : return false;
3146 : :
3147 : 19071542 : if (at_stmt)
3148 : 18491760 : *at_stmt = stmt;
3149 : :
3150 : : /* We want the condition for staying inside loop. */
3151 : 19071542 : code = gimple_cond_code (stmt);
3152 : 19071542 : if (exit->flags & EDGE_TRUE_VALUE)
3153 : 7336525 : code = invert_tree_comparison (code, false);
3154 : :
3155 : 19071542 : switch (code)
3156 : : {
3157 : 16188196 : case GT_EXPR:
3158 : 16188196 : case GE_EXPR:
3159 : 16188196 : case LT_EXPR:
3160 : 16188196 : case LE_EXPR:
3161 : 16188196 : case NE_EXPR:
3162 : 16188196 : break;
3163 : :
3164 : 2883021 : case EQ_EXPR:
3165 : 2883021 : return number_of_iterations_cltz (loop, exit, code, niter);
3166 : :
3167 : : default:
3168 : : return false;
3169 : : }
3170 : :
3171 : 16188196 : op0 = gimple_cond_lhs (stmt);
3172 : 16188196 : op1 = gimple_cond_rhs (stmt);
3173 : 16188196 : type = TREE_TYPE (op0);
3174 : :
3175 : 16188196 : if (TREE_CODE (type) != INTEGER_TYPE
3176 : 2522931 : && !POINTER_TYPE_P (type))
3177 : : return false;
3178 : :
3179 : 15393957 : tree iv0_niters = NULL_TREE;
3180 : 30787914 : if (!simple_iv_with_niters (loop, loop_containing_stmt (stmt),
3181 : : op0, &iv0, safe ? &iv0_niters : NULL, false))
3182 : 3284927 : return number_of_iterations_bitcount (loop, exit, code, niter);
3183 : 12109030 : tree iv1_niters = NULL_TREE;
3184 : 24218060 : if (!simple_iv_with_niters (loop, loop_containing_stmt (stmt),
3185 : : op1, &iv1, safe ? &iv1_niters : NULL, false))
3186 : : return false;
3187 : : /* Give up on complicated case. */
3188 : 11508129 : if (iv0_niters && iv1_niters)
3189 : : return false;
3190 : :
3191 : : /* We don't want to see undefined signed overflow warnings while
3192 : : computing the number of iterations. */
3193 : 11508129 : fold_defer_overflow_warnings ();
3194 : :
3195 : 11508129 : iv0.base = expand_simple_operations (iv0.base);
3196 : 11508129 : iv1.base = expand_simple_operations (iv1.base);
3197 : 11508129 : bool body_from_caller = true;
3198 : 11508129 : if (!body)
3199 : : {
3200 : 6862623 : body = get_loop_body (loop);
3201 : 6862623 : body_from_caller = false;
3202 : : }
3203 : 11508129 : bool only_exit_p = loop_only_exit_p (loop, body, exit);
3204 : 11508129 : if (!body_from_caller)
3205 : 6862623 : free (body);
3206 : 11508129 : if (!number_of_iterations_cond (loop, type, &iv0, code, &iv1, niter,
3207 : : only_exit_p, safe))
3208 : : {
3209 : 119141 : fold_undefer_and_ignore_overflow_warnings ();
3210 : 119141 : return false;
3211 : : }
3212 : :
3213 : : /* Incorporate additional assumption implied by control iv. */
3214 : 11388988 : tree iv_niters = iv0_niters ? iv0_niters : iv1_niters;
3215 : 11388988 : if (iv_niters)
3216 : : {
3217 : 12489 : tree assumption = fold_build2 (LE_EXPR, boolean_type_node, niter->niter,
3218 : : fold_convert (TREE_TYPE (niter->niter),
3219 : : iv_niters));
3220 : :
3221 : 12489 : if (!integer_nonzerop (assumption))
3222 : 11330 : niter->assumptions = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
3223 : : niter->assumptions, assumption);
3224 : :
3225 : : /* Refine upper bound if possible. */
3226 : 12489 : if (TREE_CODE (iv_niters) == INTEGER_CST
3227 : 24978 : && niter->max > wi::to_widest (iv_niters))
3228 : 11112 : niter->max = wi::to_widest (iv_niters);
3229 : : }
3230 : :
3231 : : /* There is no assumptions if the loop is known to be finite. */
3232 : 11388988 : if (!integer_zerop (niter->assumptions)
3233 : 11388988 : && loop_constraint_set_p (loop, LOOP_C_FINITE))
3234 : 8651 : niter->assumptions = boolean_true_node;
3235 : :
3236 : 11388988 : if (optimize >= 3)
3237 : : {
3238 : 1856428 : niter->assumptions = simplify_using_outer_evolutions (loop,
3239 : : niter->assumptions);
3240 : 1856428 : niter->may_be_zero = simplify_using_outer_evolutions (loop,
3241 : : niter->may_be_zero);
3242 : 1856428 : niter->niter = simplify_using_outer_evolutions (loop, niter->niter);
3243 : : }
3244 : :
3245 : 11388988 : niter->assumptions
3246 : 11388988 : = simplify_using_initial_conditions (loop,
3247 : : niter->assumptions);
3248 : 11388988 : niter->may_be_zero
3249 : 11388988 : = simplify_using_initial_conditions (loop,
3250 : : niter->may_be_zero);
3251 : :
3252 : 11388988 : fold_undefer_and_ignore_overflow_warnings ();
3253 : :
3254 : : /* If NITER has simplified into a constant, update MAX. */
3255 : 11388988 : if (TREE_CODE (niter->niter) == INTEGER_CST)
3256 : 6527868 : niter->max = wi::to_widest (niter->niter);
3257 : :
3258 : 11388988 : return (!integer_zerop (niter->assumptions));
3259 : : }
3260 : :
3261 : : /* Like number_of_iterations_exit_assumptions, but return TRUE only if
3262 : : the niter information holds unconditionally. */
3263 : :
3264 : : bool
3265 : 22274194 : number_of_iterations_exit (class loop *loop, edge exit,
3266 : : class tree_niter_desc *niter,
3267 : : bool warn, bool every_iteration,
3268 : : basic_block *body)
3269 : : {
3270 : 22274194 : gcond *stmt;
3271 : 22274194 : if (!number_of_iterations_exit_assumptions (loop, exit, niter,
3272 : : &stmt, every_iteration, body))
3273 : : return false;
3274 : :
3275 : 11063934 : if (integer_nonzerop (niter->assumptions))
3276 : : return true;
3277 : :
3278 : 536289 : if (warn && dump_enabled_p ())
3279 : 5 : dump_printf_loc (MSG_MISSED_OPTIMIZATION, stmt,
3280 : : "missed loop optimization: niters analysis ends up "
3281 : : "with assumptions.\n");
3282 : :
3283 : : return false;
3284 : : }
3285 : :
3286 : : /* Try to determine the number of iterations of LOOP. If we succeed,
3287 : : expression giving number of iterations is returned and *EXIT is
3288 : : set to the edge from that the information is obtained. Otherwise
3289 : : chrec_dont_know is returned. */
3290 : :
3291 : : tree
3292 : 694686 : find_loop_niter (class loop *loop, edge *exit)
3293 : : {
3294 : 694686 : unsigned i;
3295 : 694686 : auto_vec<edge> exits = get_loop_exit_edges (loop);
3296 : 694686 : edge ex;
3297 : 694686 : tree niter = NULL_TREE, aniter;
3298 : 694686 : class tree_niter_desc desc;
3299 : :
3300 : 694686 : *exit = NULL;
3301 : 3270195 : FOR_EACH_VEC_ELT (exits, i, ex)
3302 : : {
3303 : 2575509 : if (!number_of_iterations_exit (loop, ex, &desc, false))
3304 : 2109912 : continue;
3305 : :
3306 : 465597 : if (integer_nonzerop (desc.may_be_zero))
3307 : : {
3308 : : /* We exit in the first iteration through this exit.
3309 : : We won't find anything better. */
3310 : 0 : niter = build_int_cst (unsigned_type_node, 0);
3311 : 0 : *exit = ex;
3312 : 0 : break;
3313 : : }
3314 : :
3315 : 465597 : if (!integer_zerop (desc.may_be_zero))
3316 : 55459 : continue;
3317 : :
3318 : 410138 : aniter = desc.niter;
3319 : :
3320 : 410138 : if (!niter)
3321 : : {
3322 : : /* Nothing recorded yet. */
3323 : 402881 : niter = aniter;
3324 : 402881 : *exit = ex;
3325 : 402881 : continue;
3326 : : }
3327 : :
3328 : : /* Prefer constants, the lower the better. */
3329 : 7257 : if (TREE_CODE (aniter) != INTEGER_CST)
3330 : 4127 : continue;
3331 : :
3332 : 3130 : if (TREE_CODE (niter) != INTEGER_CST)
3333 : : {
3334 : 818 : niter = aniter;
3335 : 818 : *exit = ex;
3336 : 818 : continue;
3337 : : }
3338 : :
3339 : 2312 : if (tree_int_cst_lt (aniter, niter))
3340 : : {
3341 : 164 : niter = aniter;
3342 : 164 : *exit = ex;
3343 : 164 : continue;
3344 : : }
3345 : : }
3346 : :
3347 : 694686 : return niter ? niter : chrec_dont_know;
3348 : 694686 : }
3349 : :
3350 : : /* Return true if loop is known to have bounded number of iterations. */
3351 : :
3352 : : bool
3353 : 2756764 : finite_loop_p (class loop *loop)
3354 : : {
3355 : 2756764 : widest_int nit;
3356 : 2756764 : int flags;
3357 : :
3358 : 2756764 : if (loop->finite_p)
3359 : : {
3360 : 2018987 : unsigned i;
3361 : 2018987 : auto_vec<edge> exits = get_loop_exit_edges (loop);
3362 : 2018987 : edge ex;
3363 : :
3364 : : /* If the loop has a normal exit, we can assume it will terminate. */
3365 : 4057160 : FOR_EACH_VEC_ELT (exits, i, ex)
3366 : 2033665 : if (!(ex->flags & (EDGE_EH | EDGE_ABNORMAL | EDGE_FAKE)))
3367 : : {
3368 : 2014774 : if (dump_file)
3369 : 133 : fprintf (dump_file, "Assume loop %i to be finite: it has an exit "
3370 : : "and -ffinite-loops is on or loop was "
3371 : : "previously finite.\n",
3372 : : loop->num);
3373 : 2014774 : return true;
3374 : : }
3375 : 2018987 : }
3376 : :
3377 : 741990 : flags = flags_from_decl_or_type (current_function_decl);
3378 : 741990 : if ((flags & (ECF_CONST|ECF_PURE)) && !(flags & ECF_LOOPING_CONST_OR_PURE))
3379 : : {
3380 : 2211 : if (dump_file && (dump_flags & TDF_DETAILS))
3381 : 0 : fprintf (dump_file,
3382 : : "Found loop %i to be finite: it is within "
3383 : : "pure or const function.\n",
3384 : : loop->num);
3385 : 2211 : loop->finite_p = true;
3386 : 2211 : return true;
3387 : : }
3388 : :
3389 : 739779 : if (loop->any_upper_bound
3390 : : /* Loop with no normal exit will not pass max_loop_iterations. */
3391 : 739779 : || (!loop->finite_p && max_loop_iterations (loop, &nit)))
3392 : : {
3393 : 377224 : if (dump_file && (dump_flags & TDF_DETAILS))
3394 : 29 : fprintf (dump_file, "Found loop %i to be finite: upper bound found.\n",
3395 : : loop->num);
3396 : 377224 : loop->finite_p = true;
3397 : 377224 : return true;
3398 : : }
3399 : :
3400 : : return false;
3401 : 2756764 : }
3402 : :
3403 : : /*
3404 : :
3405 : : Analysis of a number of iterations of a loop by a brute-force evaluation.
3406 : :
3407 : : */
3408 : :
3409 : : /* Bound on the number of iterations we try to evaluate. */
3410 : :
3411 : : #define MAX_ITERATIONS_TO_TRACK \
3412 : : ((unsigned) param_max_iterations_to_track)
3413 : :
3414 : : /* Returns the loop phi node of LOOP such that ssa name X is derived from its
3415 : : result by a chain of operations such that all but exactly one of their
3416 : : operands are constants. */
3417 : :
3418 : : static gphi *
3419 : 1765875 : chain_of_csts_start (class loop *loop, tree x)
3420 : : {
3421 : 2126229 : gimple *stmt = SSA_NAME_DEF_STMT (x);
3422 : 2126229 : tree use;
3423 : 2126229 : basic_block bb = gimple_bb (stmt);
3424 : 2126229 : enum tree_code code;
3425 : :
3426 : 2126229 : if (!bb
3427 : 2126229 : || !flow_bb_inside_loop_p (loop, bb))
3428 : 471178 : return NULL;
3429 : :
3430 : 1655051 : if (gimple_code (stmt) == GIMPLE_PHI)
3431 : : {
3432 : 672266 : if (bb == loop->header)
3433 : 615031 : return as_a <gphi *> (stmt);
3434 : :
3435 : : return NULL;
3436 : : }
3437 : :
3438 : 982785 : if (gimple_code (stmt) != GIMPLE_ASSIGN
3439 : 1852369 : || gimple_assign_rhs_class (stmt) == GIMPLE_TERNARY_RHS)
3440 : : return NULL;
3441 : :
3442 : 869310 : code = gimple_assign_rhs_code (stmt);
3443 : 869310 : if (gimple_references_memory_p (stmt)
3444 : 488632 : || TREE_CODE_CLASS (code) == tcc_reference
3445 : 464406 : || (code == ADDR_EXPR
3446 : 526 : && !is_gimple_min_invariant (gimple_assign_rhs1 (stmt))))
3447 : 405430 : return NULL;
3448 : :
3449 : 463880 : use = SINGLE_SSA_TREE_OPERAND (stmt, SSA_OP_USE);
3450 : 463880 : if (use == NULL_TREE)
3451 : : return NULL;
3452 : :
3453 : : return chain_of_csts_start (loop, use);
3454 : : }
3455 : :
3456 : : /* Determines whether the expression X is derived from a result of a phi node
3457 : : in header of LOOP such that
3458 : :
3459 : : * the derivation of X consists only from operations with constants
3460 : : * the initial value of the phi node is constant
3461 : : * the value of the phi node in the next iteration can be derived from the
3462 : : value in the current iteration by a chain of operations with constants,
3463 : : or is also a constant
3464 : :
3465 : : If such phi node exists, it is returned, otherwise NULL is returned. */
3466 : :
3467 : : static gphi *
3468 : 1589520 : get_base_for (class loop *loop, tree x)
3469 : : {
3470 : 1589520 : gphi *phi;
3471 : 1589520 : tree init, next;
3472 : :
3473 : 1589520 : if (is_gimple_min_invariant (x))
3474 : : return NULL;
3475 : :
3476 : 1589520 : phi = chain_of_csts_start (loop, x);
3477 : 1589520 : if (!phi)
3478 : : return NULL;
3479 : :
3480 : 452882 : init = PHI_ARG_DEF_FROM_EDGE (phi, loop_preheader_edge (loop));
3481 : 452882 : next = PHI_ARG_DEF_FROM_EDGE (phi, loop_latch_edge (loop));
3482 : :
3483 : 452882 : if (!is_gimple_min_invariant (init))
3484 : : return NULL;
3485 : :
3486 : 198231 : if (TREE_CODE (next) == SSA_NAME
3487 : 198231 : && chain_of_csts_start (loop, next) != phi)
3488 : : return NULL;
3489 : :
3490 : : return phi;
3491 : : }
3492 : :
3493 : : /* Given an expression X, then
3494 : :
3495 : : * if X is NULL_TREE, we return the constant BASE.
3496 : : * if X is a constant, we return the constant X.
3497 : : * otherwise X is a SSA name, whose value in the considered loop is derived
3498 : : by a chain of operations with constant from a result of a phi node in
3499 : : the header of the loop. Then we return value of X when the value of the
3500 : : result of this phi node is given by the constant BASE. */
3501 : :
3502 : : static tree
3503 : 7516283 : get_val_for (tree x, tree base)
3504 : : {
3505 : 7531241 : gimple *stmt;
3506 : :
3507 : 7531241 : gcc_checking_assert (is_gimple_min_invariant (base));
3508 : :
3509 : 7531241 : if (!x)
3510 : : return base;
3511 : 5286703 : else if (is_gimple_min_invariant (x))
3512 : : return x;
3513 : :
3514 : 5265111 : stmt = SSA_NAME_DEF_STMT (x);
3515 : 5265111 : if (gimple_code (stmt) == GIMPLE_PHI)
3516 : : return base;
3517 : :
3518 : 2798035 : gcc_checking_assert (is_gimple_assign (stmt));
3519 : :
3520 : : /* STMT must be either an assignment of a single SSA name or an
3521 : : expression involving an SSA name and a constant. Try to fold that
3522 : : expression using the value for the SSA name. */
3523 : 2798035 : if (gimple_assign_ssa_name_copy_p (stmt))
3524 : 14958 : return get_val_for (gimple_assign_rhs1 (stmt), base);
3525 : 2783077 : else if (gimple_assign_rhs_class (stmt) == GIMPLE_UNARY_RHS
3526 : 2783077 : && TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME)
3527 : 288253 : return fold_build1 (gimple_assign_rhs_code (stmt),
3528 : : TREE_TYPE (gimple_assign_lhs (stmt)),
3529 : : get_val_for (gimple_assign_rhs1 (stmt), base));
3530 : 2494824 : else if (gimple_assign_rhs_class (stmt) == GIMPLE_BINARY_RHS)
3531 : : {
3532 : 2494824 : tree rhs1 = gimple_assign_rhs1 (stmt);
3533 : 2494824 : tree rhs2 = gimple_assign_rhs2 (stmt);
3534 : 2494824 : if (TREE_CODE (rhs1) == SSA_NAME)
3535 : 2434252 : rhs1 = get_val_for (rhs1, base);
3536 : 60572 : else if (TREE_CODE (rhs2) == SSA_NAME)
3537 : 60572 : rhs2 = get_val_for (rhs2, base);
3538 : : else
3539 : 0 : gcc_unreachable ();
3540 : 2494824 : return fold_build2 (gimple_assign_rhs_code (stmt),
3541 : : TREE_TYPE (gimple_assign_lhs (stmt)), rhs1, rhs2);
3542 : : }
3543 : : else
3544 : 0 : gcc_unreachable ();
3545 : : }
3546 : :
3547 : :
3548 : : /* Tries to count the number of iterations of LOOP till it exits by EXIT
3549 : : by brute force -- i.e. by determining the value of the operands of the
3550 : : condition at EXIT in first few iterations of the loop (assuming that
3551 : : these values are constant) and determining the first one in that the
3552 : : condition is not satisfied. Returns the constant giving the number
3553 : : of the iterations of LOOP if successful, chrec_dont_know otherwise. */
3554 : :
3555 : : tree
3556 : 1585143 : loop_niter_by_eval (class loop *loop, edge exit)
3557 : : {
3558 : 1585143 : tree acnd;
3559 : 1585143 : tree op[2], val[2], next[2], aval[2];
3560 : 1585143 : gphi *phi;
3561 : 1585143 : unsigned i, j;
3562 : 1585143 : enum tree_code cmp;
3563 : :
3564 : 3170286 : gcond *cond = safe_dyn_cast <gcond *> (*gsi_last_bb (exit->src));
3565 : 1585143 : if (!cond)
3566 : 153496 : return chrec_dont_know;
3567 : :
3568 : 1431647 : cmp = gimple_cond_code (cond);
3569 : 1431647 : if (exit->flags & EDGE_TRUE_VALUE)
3570 : 548958 : cmp = invert_tree_comparison (cmp, false);
3571 : :
3572 : 1431647 : switch (cmp)
3573 : : {
3574 : 1431619 : case EQ_EXPR:
3575 : 1431619 : case NE_EXPR:
3576 : 1431619 : case GT_EXPR:
3577 : 1431619 : case GE_EXPR:
3578 : 1431619 : case LT_EXPR:
3579 : 1431619 : case LE_EXPR:
3580 : 1431619 : op[0] = gimple_cond_lhs (cond);
3581 : 1431619 : op[1] = gimple_cond_rhs (cond);
3582 : 1431619 : break;
3583 : :
3584 : 28 : default:
3585 : 28 : return chrec_dont_know;
3586 : : }
3587 : :
3588 : 1649340 : for (j = 0; j < 2; j++)
3589 : : {
3590 : 1623254 : if (is_gimple_min_invariant (op[j]))
3591 : : {
3592 : 33734 : val[j] = op[j];
3593 : 33734 : next[j] = NULL_TREE;
3594 : 33734 : op[j] = NULL_TREE;
3595 : : }
3596 : : else
3597 : : {
3598 : 1589520 : phi = get_base_for (loop, op[j]);
3599 : 1589520 : if (!phi)
3600 : : {
3601 : 1405533 : gassign *def;
3602 : 1405533 : if (j == 0
3603 : 1239984 : && (cmp == NE_EXPR || cmp == EQ_EXPR)
3604 : 706077 : && TREE_CODE (op[0]) == SSA_NAME
3605 : 706077 : && TREE_CODE (op[1]) == INTEGER_CST
3606 : 470558 : && (def = dyn_cast <gassign *> (SSA_NAME_DEF_STMT (op[0])))
3607 : 1655536 : && gimple_assign_rhs_code (def) == MEM_REF)
3608 : : {
3609 : 52560 : tree mem = gimple_assign_rhs1 (def);
3610 : 52560 : affine_iv iv;
3611 : 52560 : if (TYPE_MODE (TREE_TYPE (mem)) == TYPE_MODE (char_type_node)
3612 : 21774 : && simple_iv (loop, loop,
3613 : 21774 : TREE_OPERAND (mem, 0), &iv, false)
3614 : 15401 : && tree_fits_uhwi_p (TREE_OPERAND (mem, 1))
3615 : 67961 : && tree_fits_uhwi_p (iv.step))
3616 : : {
3617 : 15401 : tree str, off;
3618 : : /* iv.base can be &"Foo" but also (char *)&"Foo" + 1. */
3619 : 15401 : split_constant_offset (iv.base, &str, &off);
3620 : 15401 : STRIP_NOPS (str);
3621 : 15401 : if (TREE_CODE (str) == ADDR_EXPR
3622 : 2187 : && TREE_CODE (TREE_OPERAND (str, 0)) == STRING_CST
3623 : 16164 : && tree_fits_uhwi_p (off))
3624 : : {
3625 : 763 : str = TREE_OPERAND (str, 0);
3626 : 763 : unsigned i = 0;
3627 : 1526 : for (unsigned HOST_WIDE_INT idx
3628 : 763 : = (tree_to_uhwi (TREE_OPERAND (mem, 1))
3629 : 763 : + tree_to_uhwi (off));
3630 : 12118 : idx < (unsigned)TREE_STRING_LENGTH (str)
3631 : 6059 : && i < MAX_ITERATIONS_TO_TRACK;
3632 : 5296 : idx += tree_to_uhwi (iv.step), ++i)
3633 : : {
3634 : 5825 : int res = compare_tree_int
3635 : 5825 : (op[1], TREE_STRING_POINTER (str)[idx]);
3636 : 5825 : if ((cmp == NE_EXPR && res == 0)
3637 : 5315 : || (cmp == EQ_EXPR && res != 0))
3638 : 529 : return build_int_cst (unsigned_type_node, i);
3639 : : }
3640 : : }
3641 : : }
3642 : : }
3643 : 1405004 : return chrec_dont_know;
3644 : : }
3645 : 183987 : val[j] = PHI_ARG_DEF_FROM_EDGE (phi, loop_preheader_edge (loop));
3646 : 183987 : next[j] = PHI_ARG_DEF_FROM_EDGE (phi, loop_latch_edge (loop));
3647 : : }
3648 : : }
3649 : :
3650 : : /* Don't issue signed overflow warnings. */
3651 : 26086 : fold_defer_overflow_warnings ();
3652 : :
3653 : 1222624 : for (i = 0; i < MAX_ITERATIONS_TO_TRACK; i++)
3654 : : {
3655 : 3586845 : for (j = 0; j < 2; j++)
3656 : 2391230 : aval[j] = get_val_for (op[j], val[j]);
3657 : :
3658 : 1195615 : acnd = fold_binary (cmp, boolean_type_node, aval[0], aval[1]);
3659 : 1195615 : if (acnd && integer_zerop (acnd))
3660 : : {
3661 : 24381 : fold_undefer_and_ignore_overflow_warnings ();
3662 : 24381 : if (dump_file && (dump_flags & TDF_DETAILS))
3663 : 3 : fprintf (dump_file,
3664 : : "Proved that loop %d iterates %d times using brute force.\n",
3665 : : loop->num, i);
3666 : 24381 : return build_int_cst (unsigned_type_node, i);
3667 : : }
3668 : :
3669 : 3512453 : for (j = 0; j < 2; j++)
3670 : : {
3671 : 2341976 : aval[j] = val[j];
3672 : 2341976 : val[j] = get_val_for (next[j], val[j]);
3673 : 2341976 : if (!is_gimple_min_invariant (val[j]))
3674 : : {
3675 : 757 : fold_undefer_and_ignore_overflow_warnings ();
3676 : 757 : return chrec_dont_know;
3677 : : }
3678 : : }
3679 : :
3680 : : /* If the next iteration would use the same base values
3681 : : as the current one, there is no point looping further,
3682 : : all following iterations will be the same as this one. */
3683 : 1170477 : if (val[0] == aval[0] && val[1] == aval[1])
3684 : : break;
3685 : : }
3686 : :
3687 : 948 : fold_undefer_and_ignore_overflow_warnings ();
3688 : :
3689 : 948 : return chrec_dont_know;
3690 : : }
3691 : :
3692 : : /* Finds the exit of the LOOP by that the loop exits after a constant
3693 : : number of iterations and stores the exit edge to *EXIT. The constant
3694 : : giving the number of iterations of LOOP is returned. The number of
3695 : : iterations is determined using loop_niter_by_eval (i.e. by brute force
3696 : : evaluation). If we are unable to find the exit for that loop_niter_by_eval
3697 : : determines the number of iterations, chrec_dont_know is returned. */
3698 : :
3699 : : tree
3700 : 714034 : find_loop_niter_by_eval (class loop *loop, edge *exit)
3701 : : {
3702 : 714034 : unsigned i;
3703 : 714034 : auto_vec<edge> exits = get_loop_exit_edges (loop);
3704 : 714034 : edge ex;
3705 : 714034 : tree niter = NULL_TREE, aniter;
3706 : :
3707 : 714034 : *exit = NULL;
3708 : :
3709 : : /* Loops with multiple exits are expensive to handle and less important. */
3710 : 714034 : if (!flag_expensive_optimizations
3711 : 732847 : && exits.length () > 1)
3712 : 3782 : return chrec_dont_know;
3713 : :
3714 : 2275305 : FOR_EACH_VEC_ELT (exits, i, ex)
3715 : : {
3716 : 1565053 : if (!just_once_each_iteration_p (loop, ex->src))
3717 : 509605 : continue;
3718 : :
3719 : 1055448 : aniter = loop_niter_by_eval (loop, ex);
3720 : 1055448 : if (chrec_contains_undetermined (aniter))
3721 : 1042090 : continue;
3722 : :
3723 : 13483 : if (niter
3724 : 13358 : && !tree_int_cst_lt (aniter, niter))
3725 : 125 : continue;
3726 : :
3727 : 13233 : niter = aniter;
3728 : 13233 : *exit = ex;
3729 : : }
3730 : :
3731 : 710252 : return niter ? niter : chrec_dont_know;
3732 : 714034 : }
3733 : :
3734 : : /*
3735 : :
3736 : : Analysis of upper bounds on number of iterations of a loop.
3737 : :
3738 : : */
3739 : :
3740 : : static widest_int derive_constant_upper_bound_ops (tree, tree,
3741 : : enum tree_code, tree);
3742 : :
3743 : : /* Returns a constant upper bound on the value of the right-hand side of
3744 : : an assignment statement STMT. */
3745 : :
3746 : : static widest_int
3747 : 279 : derive_constant_upper_bound_assign (gimple *stmt)
3748 : : {
3749 : 279 : enum tree_code code = gimple_assign_rhs_code (stmt);
3750 : 279 : tree op0 = gimple_assign_rhs1 (stmt);
3751 : 279 : tree op1 = gimple_assign_rhs2 (stmt);
3752 : :
3753 : 279 : return derive_constant_upper_bound_ops (TREE_TYPE (gimple_assign_lhs (stmt)),
3754 : 279 : op0, code, op1);
3755 : : }
3756 : :
3757 : : /* Returns a constant upper bound on the value of expression VAL. VAL
3758 : : is considered to be unsigned. If its type is signed, its value must
3759 : : be nonnegative. */
3760 : :
3761 : : static widest_int
3762 : 10295500 : derive_constant_upper_bound (tree val)
3763 : : {
3764 : 10295500 : enum tree_code code;
3765 : 10295500 : tree op0, op1, op2;
3766 : :
3767 : 10295500 : extract_ops_from_tree (val, &code, &op0, &op1, &op2);
3768 : 10295500 : return derive_constant_upper_bound_ops (TREE_TYPE (val), op0, code, op1);
3769 : : }
3770 : :
3771 : : /* Returns a constant upper bound on the value of expression OP0 CODE OP1,
3772 : : whose type is TYPE. The expression is considered to be unsigned. If
3773 : : its type is signed, its value must be nonnegative. */
3774 : :
3775 : : static widest_int
3776 : 10295779 : derive_constant_upper_bound_ops (tree type, tree op0,
3777 : : enum tree_code code, tree op1)
3778 : : {
3779 : 10295779 : tree subtype, maxt;
3780 : 10295779 : widest_int bnd, max, cst;
3781 : 10295779 : gimple *stmt;
3782 : :
3783 : 10295779 : if (INTEGRAL_TYPE_P (type))
3784 : 10295779 : maxt = TYPE_MAX_VALUE (type);
3785 : : else
3786 : 0 : maxt = upper_bound_in_type (type, type);
3787 : :
3788 : 10295779 : max = wi::to_widest (maxt);
3789 : :
3790 : 10295779 : switch (code)
3791 : : {
3792 : 10241603 : case INTEGER_CST:
3793 : 10241603 : return wi::to_widest (op0);
3794 : :
3795 : 1146 : CASE_CONVERT:
3796 : 1146 : subtype = TREE_TYPE (op0);
3797 : 1146 : if (!TYPE_UNSIGNED (subtype)
3798 : : /* If TYPE is also signed, the fact that VAL is nonnegative implies
3799 : : that OP0 is nonnegative. */
3800 : 867 : && TYPE_UNSIGNED (type)
3801 : 2013 : && !tree_expr_nonnegative_p (op0))
3802 : : {
3803 : : /* If we cannot prove that the casted expression is nonnegative,
3804 : : we cannot establish more useful upper bound than the precision
3805 : : of the type gives us. */
3806 : 844 : return max;
3807 : : }
3808 : :
3809 : : /* We now know that op0 is an nonnegative value. Try deriving an upper
3810 : : bound for it. */
3811 : 302 : bnd = derive_constant_upper_bound (op0);
3812 : :
3813 : : /* If the bound does not fit in TYPE, max. value of TYPE could be
3814 : : attained. */
3815 : 302 : if (wi::ltu_p (max, bnd))
3816 : 0 : return max;
3817 : :
3818 : 302 : return bnd;
3819 : :
3820 : 33836 : case PLUS_EXPR:
3821 : 33836 : case POINTER_PLUS_EXPR:
3822 : 33836 : case MINUS_EXPR:
3823 : 33836 : if (TREE_CODE (op1) != INTEGER_CST
3824 : 33836 : || !tree_expr_nonnegative_p (op0))
3825 : 33403 : return max;
3826 : :
3827 : : /* Canonicalize to OP0 - CST. Consider CST to be signed, in order to
3828 : : choose the most logical way how to treat this constant regardless
3829 : : of the signedness of the type. */
3830 : 433 : cst = wi::sext (wi::to_widest (op1), TYPE_PRECISION (type));
3831 : 433 : if (code != MINUS_EXPR)
3832 : 433 : cst = -cst;
3833 : :
3834 : 433 : bnd = derive_constant_upper_bound (op0);
3835 : :
3836 : 433 : if (wi::neg_p (cst))
3837 : : {
3838 : 29 : cst = -cst;
3839 : : /* Avoid CST == 0x80000... */
3840 : 29 : if (wi::neg_p (cst))
3841 : 0 : return max;
3842 : :
3843 : : /* OP0 + CST. We need to check that
3844 : : BND <= MAX (type) - CST. */
3845 : :
3846 : 29 : widest_int mmax = max - cst;
3847 : 29 : if (wi::leu_p (bnd, mmax))
3848 : 0 : return max;
3849 : :
3850 : 29 : return bnd + cst;
3851 : 29 : }
3852 : : else
3853 : : {
3854 : : /* OP0 - CST, where CST >= 0.
3855 : :
3856 : : If TYPE is signed, we have already verified that OP0 >= 0, and we
3857 : : know that the result is nonnegative. This implies that
3858 : : VAL <= BND - CST.
3859 : :
3860 : : If TYPE is unsigned, we must additionally know that OP0 >= CST,
3861 : : otherwise the operation underflows.
3862 : : */
3863 : :
3864 : : /* This should only happen if the type is unsigned; however, for
3865 : : buggy programs that use overflowing signed arithmetics even with
3866 : : -fno-wrapv, this condition may also be true for signed values. */
3867 : 404 : if (wi::ltu_p (bnd, cst))
3868 : 0 : return max;
3869 : :
3870 : 404 : if (TYPE_UNSIGNED (type))
3871 : : {
3872 : 404 : tree tem = fold_binary (GE_EXPR, boolean_type_node, op0,
3873 : : wide_int_to_tree (type, cst));
3874 : 404 : if (!tem || integer_nonzerop (tem))
3875 : 40 : return max;
3876 : : }
3877 : :
3878 : 364 : bnd -= cst;
3879 : : }
3880 : :
3881 : 364 : return bnd;
3882 : :
3883 : 0 : case FLOOR_DIV_EXPR:
3884 : 0 : case EXACT_DIV_EXPR:
3885 : 0 : if (TREE_CODE (op1) != INTEGER_CST
3886 : 0 : || tree_int_cst_sign_bit (op1))
3887 : 0 : return max;
3888 : :
3889 : 0 : bnd = derive_constant_upper_bound (op0);
3890 : 0 : return wi::udiv_floor (bnd, wi::to_widest (op1));
3891 : :
3892 : 7 : case BIT_AND_EXPR:
3893 : 7 : if (TREE_CODE (op1) != INTEGER_CST
3894 : 7 : || tree_int_cst_sign_bit (op1))
3895 : 0 : return max;
3896 : 7 : return wi::to_widest (op1);
3897 : :
3898 : 475 : case SSA_NAME:
3899 : 475 : stmt = SSA_NAME_DEF_STMT (op0);
3900 : 475 : if (gimple_code (stmt) != GIMPLE_ASSIGN
3901 : 475 : || gimple_assign_lhs (stmt) != op0)
3902 : 196 : return max;
3903 : 279 : return derive_constant_upper_bound_assign (stmt);
3904 : :
3905 : 18712 : default:
3906 : 18712 : return max;
3907 : : }
3908 : 10295792 : }
3909 : :
3910 : : /* Emit a -Waggressive-loop-optimizations warning if needed. */
3911 : :
3912 : : static void
3913 : 9419998 : do_warn_aggressive_loop_optimizations (class loop *loop,
3914 : : widest_int i_bound, gimple *stmt)
3915 : : {
3916 : : /* Don't warn if the loop doesn't have known constant bound. */
3917 : 9419998 : if (!loop->nb_iterations
3918 : 9419998 : || TREE_CODE (loop->nb_iterations) != INTEGER_CST
3919 : 4449026 : || !warn_aggressive_loop_optimizations
3920 : : /* To avoid warning multiple times for the same loop,
3921 : : only start warning when we preserve loops. */
3922 : 4448866 : || (cfun->curr_properties & PROP_loops) == 0
3923 : : /* Only warn once per loop. */
3924 : 4448866 : || loop->warned_aggressive_loop_optimizations
3925 : : /* Only warn if undefined behavior gives us lower estimate than the
3926 : : known constant bound. */
3927 : 4448281 : || wi::cmpu (i_bound, wi::to_widest (loop->nb_iterations)) >= 0
3928 : : /* And undefined behavior happens unconditionally. */
3929 : 9420043 : || !dominated_by_p (CDI_DOMINATORS, loop->latch, gimple_bb (stmt)))
3930 : 9419953 : return;
3931 : :
3932 : 45 : edge e = single_exit (loop);
3933 : 45 : if (e == NULL)
3934 : : return;
3935 : :
3936 : 45 : gimple *estmt = last_nondebug_stmt (e->src);
3937 : 45 : char buf[WIDE_INT_PRINT_BUFFER_SIZE], *p;
3938 : 45 : unsigned len;
3939 : 45 : if (print_dec_buf_size (i_bound, TYPE_SIGN (TREE_TYPE (loop->nb_iterations)),
3940 : : &len))
3941 : 0 : p = XALLOCAVEC (char, len);
3942 : : else
3943 : : p = buf;
3944 : 45 : print_dec (i_bound, p, TYPE_SIGN (TREE_TYPE (loop->nb_iterations)));
3945 : 45 : auto_diagnostic_group d;
3946 : 45 : if (warning_at (gimple_location (stmt), OPT_Waggressive_loop_optimizations,
3947 : : "iteration %s invokes undefined behavior", p))
3948 : 9 : inform (gimple_location (estmt), "within this loop");
3949 : 45 : loop->warned_aggressive_loop_optimizations = true;
3950 : 45 : }
3951 : :
3952 : : /* Records that AT_STMT is executed at most BOUND + 1 times in LOOP. IS_EXIT
3953 : : is true if the loop is exited immediately after STMT, and this exit
3954 : : is taken at last when the STMT is executed BOUND + 1 times.
3955 : : REALISTIC is true if BOUND is expected to be close to the real number
3956 : : of iterations. UPPER is true if we are sure the loop iterates at most
3957 : : BOUND times. I_BOUND is a widest_int upper estimate on BOUND. */
3958 : :
3959 : : static void
3960 : 14588155 : record_estimate (class loop *loop, tree bound, const widest_int &i_bound,
3961 : : gimple *at_stmt, bool is_exit, bool realistic, bool upper)
3962 : : {
3963 : 14588155 : widest_int delta;
3964 : :
3965 : 14588155 : if (dump_file && (dump_flags & TDF_DETAILS))
3966 : : {
3967 : 101211 : fprintf (dump_file, "Statement %s", is_exit ? "(exit)" : "");
3968 : 56037 : print_gimple_stmt (dump_file, at_stmt, 0, TDF_SLIM);
3969 : 56586 : fprintf (dump_file, " is %sexecuted at most ",
3970 : : upper ? "" : "probably ");
3971 : 56037 : print_generic_expr (dump_file, bound, TDF_SLIM);
3972 : 56037 : fprintf (dump_file, " (bounded by ");
3973 : 56037 : print_decu (i_bound, dump_file);
3974 : 56037 : fprintf (dump_file, ") + 1 times in loop %d.\n", loop->num);
3975 : : }
3976 : :
3977 : : /* If the I_BOUND is just an estimate of BOUND, it rarely is close to the
3978 : : real number of iterations. */
3979 : 14588155 : if (TREE_CODE (bound) != INTEGER_CST)
3980 : : realistic = false;
3981 : : else
3982 : 12934846 : gcc_checking_assert (i_bound == wi::to_widest (bound));
3983 : :
3984 : 14588155 : if (wi::min_precision (i_bound, SIGNED) > bound_wide_int ().get_precision ())
3985 : : return;
3986 : :
3987 : : /* If we have a guaranteed upper bound, record it in the appropriate
3988 : : list, unless this is an !is_exit bound (i.e. undefined behavior in
3989 : : at_stmt) in a loop with known constant number of iterations. */
3990 : 14588142 : if (upper
3991 : 14097840 : && (is_exit
3992 : 9804450 : || loop->nb_iterations == NULL_TREE
3993 : 9804450 : || TREE_CODE (loop->nb_iterations) != INTEGER_CST))
3994 : : {
3995 : 9460365 : class nb_iter_bound *elt = ggc_alloc<nb_iter_bound> ();
3996 : :
3997 : 9460365 : elt->bound = bound_wide_int::from (i_bound, SIGNED);
3998 : 9460365 : elt->stmt = at_stmt;
3999 : 9460365 : elt->is_exit = is_exit;
4000 : 9460365 : elt->next = loop->bounds;
4001 : 9460365 : loop->bounds = elt;
4002 : : }
4003 : :
4004 : : /* If statement is executed on every path to the loop latch, we can directly
4005 : : infer the upper bound on the # of iterations of the loop. */
4006 : 14588142 : if (!dominated_by_p (CDI_DOMINATORS, loop->latch, gimple_bb (at_stmt)))
4007 : 442141 : upper = false;
4008 : :
4009 : : /* Update the number of iteration estimates according to the bound.
4010 : : If at_stmt is an exit then the loop latch is executed at most BOUND times,
4011 : : otherwise it can be executed BOUND + 1 times. We will lower the estimate
4012 : : later if such statement must be executed on last iteration */
4013 : 14588142 : if (is_exit)
4014 : 4293392 : delta = 0;
4015 : : else
4016 : 10294750 : delta = 1;
4017 : 14588142 : widest_int new_i_bound = i_bound + delta;
4018 : :
4019 : : /* If an overflow occurred, ignore the result. */
4020 : 14588142 : if (wi::ltu_p (new_i_bound, delta))
4021 : 0 : return;
4022 : :
4023 : 14588142 : if (upper && !is_exit)
4024 : 9419998 : do_warn_aggressive_loop_optimizations (loop, new_i_bound, at_stmt);
4025 : 14588142 : record_niter_bound (loop, new_i_bound, realistic, upper);
4026 : 14588155 : }
4027 : :
4028 : : /* Records the control iv analyzed in NITER for LOOP if the iv is valid
4029 : : and doesn't overflow. */
4030 : :
4031 : : static void
4032 : 4293390 : record_control_iv (class loop *loop, class tree_niter_desc *niter)
4033 : : {
4034 : 4293390 : struct control_iv *iv;
4035 : :
4036 : 4293390 : if (!niter->control.base || !niter->control.step)
4037 : : return;
4038 : :
4039 : 4261122 : if (!integer_onep (niter->assumptions) || !niter->control.no_overflow)
4040 : : return;
4041 : :
4042 : 4125981 : iv = ggc_alloc<control_iv> ();
4043 : 4125981 : iv->base = niter->control.base;
4044 : 4125981 : iv->step = niter->control.step;
4045 : 4125981 : iv->next = loop->control_ivs;
4046 : 4125981 : loop->control_ivs = iv;
4047 : :
4048 : 4125981 : return;
4049 : : }
4050 : :
4051 : : /* This function returns TRUE if below conditions are satisfied:
4052 : : 1) VAR is SSA variable.
4053 : : 2) VAR is an IV:{base, step} in its defining loop.
4054 : : 3) IV doesn't overflow.
4055 : : 4) Both base and step are integer constants.
4056 : : 5) Base is the MIN/MAX value depends on IS_MIN.
4057 : : Store value of base to INIT correspondingly. */
4058 : :
4059 : : static bool
4060 : 113126 : get_cst_init_from_scev (tree var, wide_int *init, bool is_min)
4061 : : {
4062 : 113126 : if (TREE_CODE (var) != SSA_NAME)
4063 : : return false;
4064 : :
4065 : 113126 : gimple *def_stmt = SSA_NAME_DEF_STMT (var);
4066 : 209935 : class loop *loop = loop_containing_stmt (def_stmt);
4067 : :
4068 : 101637 : if (loop == NULL)
4069 : : return false;
4070 : :
4071 : 101637 : affine_iv iv;
4072 : 101637 : if (!simple_iv (loop, loop, var, &iv, false))
4073 : : return false;
4074 : :
4075 : 6305 : if (!iv.no_overflow)
4076 : : return false;
4077 : :
4078 : 6237 : if (TREE_CODE (iv.base) != INTEGER_CST || TREE_CODE (iv.step) != INTEGER_CST)
4079 : : return false;
4080 : :
4081 : 5138 : if (is_min == tree_int_cst_sign_bit (iv.step))
4082 : : return false;
4083 : :
4084 : 4828 : *init = wi::to_wide (iv.base);
4085 : 4828 : return true;
4086 : : }
4087 : :
4088 : : /* Record the estimate on number of iterations of LOOP based on the fact that
4089 : : the induction variable BASE + STEP * i evaluated in STMT does not wrap and
4090 : : its values belong to the range <LOW, HIGH>. REALISTIC is true if the
4091 : : estimated number of iterations is expected to be close to the real one.
4092 : : UPPER is true if we are sure the induction variable does not wrap. */
4093 : :
4094 : : static void
4095 : 10294763 : record_nonwrapping_iv (class loop *loop, tree base, tree step, gimple *stmt,
4096 : : tree low, tree high, bool realistic, bool upper)
4097 : : {
4098 : 10294763 : tree niter_bound, extreme, delta;
4099 : 10294763 : tree type = TREE_TYPE (base), unsigned_type;
4100 : 10294763 : tree orig_base = base;
4101 : :
4102 : 10294763 : if (TREE_CODE (step) != INTEGER_CST || integer_zerop (step))
4103 : 0 : return;
4104 : :
4105 : 10294763 : if (dump_file && (dump_flags & TDF_DETAILS))
4106 : : {
4107 : 45174 : fprintf (dump_file, "Induction variable (");
4108 : 45174 : print_generic_expr (dump_file, TREE_TYPE (base), TDF_SLIM);
4109 : 45174 : fprintf (dump_file, ") ");
4110 : 45174 : print_generic_expr (dump_file, base, TDF_SLIM);
4111 : 45174 : fprintf (dump_file, " + ");
4112 : 45174 : print_generic_expr (dump_file, step, TDF_SLIM);
4113 : 45174 : fprintf (dump_file, " * iteration does not wrap in statement ");
4114 : 45174 : print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
4115 : 45174 : fprintf (dump_file, " in loop %d.\n", loop->num);
4116 : : }
4117 : :
4118 : 10294763 : unsigned_type = unsigned_type_for (type);
4119 : 10294763 : base = fold_convert (unsigned_type, base);
4120 : 10294763 : step = fold_convert (unsigned_type, step);
4121 : :
4122 : 10294763 : if (tree_int_cst_sign_bit (step))
4123 : : {
4124 : 313754 : wide_int max;
4125 : 313754 : value_range base_range (TREE_TYPE (orig_base));
4126 : 627508 : if (get_range_query (cfun)->range_of_expr (base_range, orig_base)
4127 : 313754 : && !base_range.undefined_p ())
4128 : 313677 : max = wi::to_wide (base_range.ubound ());
4129 : 313754 : extreme = fold_convert (unsigned_type, low);
4130 : 313754 : if (TREE_CODE (orig_base) == SSA_NAME
4131 : 18778 : && TREE_CODE (high) == INTEGER_CST
4132 : 18778 : && INTEGRAL_TYPE_P (TREE_TYPE (orig_base))
4133 : 18726 : && ((!base_range.varying_p ()
4134 : 5974 : && !base_range.undefined_p ())
4135 : 12829 : || get_cst_init_from_scev (orig_base, &max, false))
4136 : 319651 : && wi::gts_p (wi::to_wide (high), max))
4137 : 1643 : base = wide_int_to_tree (unsigned_type, max);
4138 : 312111 : else if (TREE_CODE (base) != INTEGER_CST
4139 : 499671 : && dominated_by_p (CDI_DOMINATORS,
4140 : 187560 : loop->latch, gimple_bb (stmt)))
4141 : 186086 : base = fold_convert (unsigned_type, high);
4142 : 313754 : delta = fold_build2 (MINUS_EXPR, unsigned_type, base, extreme);
4143 : 313754 : step = fold_build1 (NEGATE_EXPR, unsigned_type, step);
4144 : 313755 : }
4145 : : else
4146 : : {
4147 : 9981009 : wide_int min;
4148 : 9981009 : value_range base_range (TREE_TYPE (orig_base));
4149 : 19962018 : if (get_range_query (cfun)->range_of_expr (base_range, orig_base)
4150 : 9981009 : && !base_range.undefined_p ())
4151 : 9978889 : min = wi::to_wide (base_range.lbound ());
4152 : 9981009 : extreme = fold_convert (unsigned_type, high);
4153 : 9981009 : if (TREE_CODE (orig_base) == SSA_NAME
4154 : 792012 : && TREE_CODE (low) == INTEGER_CST
4155 : 792012 : && INTEGRAL_TYPE_P (TREE_TYPE (orig_base))
4156 : 242408 : && ((!base_range.varying_p ()
4157 : 143990 : && !base_range.undefined_p ())
4158 : 100297 : || get_cst_init_from_scev (orig_base, &min, true))
4159 : 10127948 : && wi::gts_p (min, wi::to_wide (low)))
4160 : 11753 : base = wide_int_to_tree (unsigned_type, min);
4161 : 9969256 : else if (TREE_CODE (base) != INTEGER_CST
4162 : 13084376 : && dominated_by_p (CDI_DOMINATORS,
4163 : 3115120 : loop->latch, gimple_bb (stmt)))
4164 : 3063432 : base = fold_convert (unsigned_type, low);
4165 : 9981009 : delta = fold_build2 (MINUS_EXPR, unsigned_type, extreme, base);
4166 : 9981021 : }
4167 : :
4168 : : /* STMT is executed at most NITER_BOUND + 1 times, since otherwise the value
4169 : : would get out of the range. */
4170 : 10294763 : niter_bound = fold_build2 (FLOOR_DIV_EXPR, unsigned_type, delta, step);
4171 : 10294763 : widest_int max = derive_constant_upper_bound (niter_bound);
4172 : 10294763 : record_estimate (loop, niter_bound, max, stmt, false, realistic, upper);
4173 : 10294763 : }
4174 : :
4175 : : /* Determine information about number of iterations a LOOP from the index
4176 : : IDX of a data reference accessed in STMT. RELIABLE is true if STMT is
4177 : : guaranteed to be executed in every iteration of LOOP. Callback for
4178 : : for_each_index. */
4179 : :
4180 : : struct ilb_data
4181 : : {
4182 : : class loop *loop;
4183 : : gimple *stmt;
4184 : : };
4185 : :
4186 : : static bool
4187 : 31461741 : idx_infer_loop_bounds (tree base, tree *idx, void *dta)
4188 : : {
4189 : 31461741 : struct ilb_data *data = (struct ilb_data *) dta;
4190 : 31461741 : tree ev, init, step;
4191 : 31461741 : tree low, high, type, next;
4192 : 31461741 : bool sign, upper = true, has_flexible_size = false;
4193 : 31461741 : class loop *loop = data->loop;
4194 : :
4195 : 31461741 : if (TREE_CODE (base) != ARRAY_REF)
4196 : : return true;
4197 : :
4198 : : /* For arrays that might have flexible sizes, it is not guaranteed that they
4199 : : do not really extend over their declared size. */
4200 : 8887487 : if (array_ref_flexible_size_p (base))
4201 : : {
4202 : 2081163 : has_flexible_size = true;
4203 : 2081163 : upper = false;
4204 : : }
4205 : :
4206 : 8887487 : class loop *dloop = loop_containing_stmt (data->stmt);
4207 : 8887487 : if (!dloop)
4208 : : return true;
4209 : :
4210 : 8887487 : ev = analyze_scalar_evolution (dloop, *idx);
4211 : 8887487 : ev = instantiate_parameters (loop, ev);
4212 : 8887487 : init = initial_condition (ev);
4213 : 8887487 : step = evolution_part_in_loop_num (ev, loop->num);
4214 : :
4215 : 8887487 : if (!init
4216 : 8887487 : || !step
4217 : 5271424 : || TREE_CODE (step) != INTEGER_CST
4218 : 4062197 : || integer_zerop (step)
4219 : 4062197 : || tree_contains_chrecs (init, NULL)
4220 : 12949684 : || chrec_contains_symbols_defined_in_loop (init, loop->num))
4221 : 4825290 : return true;
4222 : :
4223 : 4062197 : low = array_ref_low_bound (base);
4224 : 4062197 : high = array_ref_up_bound (base);
4225 : :
4226 : : /* The case of nonconstant bounds could be handled, but it would be
4227 : : complicated. */
4228 : 4062197 : if (TREE_CODE (low) != INTEGER_CST
4229 : 4062197 : || !high
4230 : 3345576 : || TREE_CODE (high) != INTEGER_CST)
4231 : : return true;
4232 : 3180354 : sign = tree_int_cst_sign_bit (step);
4233 : 3180354 : type = TREE_TYPE (step);
4234 : :
4235 : : /* The array that might have flexible size most likely extends
4236 : : beyond its bounds. */
4237 : 3180354 : if (has_flexible_size
4238 : 3180354 : && operand_equal_p (low, high, 0))
4239 : : return true;
4240 : :
4241 : : /* In case the relevant bound of the array does not fit in type, or
4242 : : it does, but bound + step (in type) still belongs into the range of the
4243 : : array, the index may wrap and still stay within the range of the array
4244 : : (consider e.g. if the array is indexed by the full range of
4245 : : unsigned char).
4246 : :
4247 : : To make things simpler, we require both bounds to fit into type, although
4248 : : there are cases where this would not be strictly necessary. */
4249 : 3162579 : if (!int_fits_type_p (high, type)
4250 : 3162547 : || !int_fits_type_p (low, type))
4251 : : return true;
4252 : 3162547 : low = fold_convert (type, low);
4253 : 3162547 : high = fold_convert (type, high);
4254 : :
4255 : 3162547 : if (sign)
4256 : 51936 : next = fold_binary (PLUS_EXPR, type, low, step);
4257 : : else
4258 : 3110611 : next = fold_binary (PLUS_EXPR, type, high, step);
4259 : :
4260 : 3162547 : if (tree_int_cst_compare (low, next) <= 0
4261 : 3162547 : && tree_int_cst_compare (next, high) <= 0)
4262 : : return true;
4263 : :
4264 : : /* If access is not executed on every iteration, we must ensure that overlow
4265 : : may not make the access valid later. */
4266 : 3162547 : if (!dominated_by_p (CDI_DOMINATORS, loop->latch, gimple_bb (data->stmt)))
4267 : : {
4268 : 434740 : if (scev_probably_wraps_p (NULL_TREE,
4269 : 434740 : initial_condition_in_loop_num (ev, loop->num),
4270 : : step, data->stmt, loop, true))
4271 : 3162547 : upper = false;
4272 : : }
4273 : : else
4274 : 2727807 : record_nonwrapping_chrec (ev);
4275 : :
4276 : 3162547 : record_nonwrapping_iv (loop, init, step, data->stmt, low, high, false, upper);
4277 : 3162547 : return true;
4278 : : }
4279 : :
4280 : : /* Determine information about number of iterations a LOOP from the bounds
4281 : : of arrays in the data reference REF accessed in STMT. RELIABLE is true if
4282 : : STMT is guaranteed to be executed in every iteration of LOOP.*/
4283 : :
4284 : : static void
4285 : 33139105 : infer_loop_bounds_from_ref (class loop *loop, gimple *stmt, tree ref)
4286 : : {
4287 : 33139105 : struct ilb_data data;
4288 : :
4289 : 33139105 : data.loop = loop;
4290 : 33139105 : data.stmt = stmt;
4291 : 0 : for_each_index (&ref, idx_infer_loop_bounds, &data);
4292 : 0 : }
4293 : :
4294 : : /* Determine information about number of iterations of a LOOP from the way
4295 : : arrays are used in STMT. RELIABLE is true if STMT is guaranteed to be
4296 : : executed in every iteration of LOOP. */
4297 : :
4298 : : static void
4299 : 221636349 : infer_loop_bounds_from_array (class loop *loop, gimple *stmt)
4300 : : {
4301 : 221636349 : if (is_gimple_assign (stmt))
4302 : : {
4303 : 95528290 : tree op0 = gimple_assign_lhs (stmt);
4304 : 95528290 : tree op1 = gimple_assign_rhs1 (stmt);
4305 : :
4306 : : /* For each memory access, analyze its access function
4307 : : and record a bound on the loop iteration domain. */
4308 : 95528290 : if (REFERENCE_CLASS_P (op0))
4309 : 13079497 : infer_loop_bounds_from_ref (loop, stmt, op0);
4310 : :
4311 : 95528290 : if (REFERENCE_CLASS_P (op1))
4312 : 19907368 : infer_loop_bounds_from_ref (loop, stmt, op1);
4313 : : }
4314 : 126108059 : else if (is_gimple_call (stmt))
4315 : : {
4316 : 7015245 : tree arg, lhs;
4317 : 7015245 : unsigned i, n = gimple_call_num_args (stmt);
4318 : :
4319 : 7015245 : lhs = gimple_call_lhs (stmt);
4320 : 7015245 : if (lhs && REFERENCE_CLASS_P (lhs))
4321 : 7050 : infer_loop_bounds_from_ref (loop, stmt, lhs);
4322 : :
4323 : 22780958 : for (i = 0; i < n; i++)
4324 : : {
4325 : 15765713 : arg = gimple_call_arg (stmt, i);
4326 : 15765713 : if (REFERENCE_CLASS_P (arg))
4327 : 145190 : infer_loop_bounds_from_ref (loop, stmt, arg);
4328 : : }
4329 : : }
4330 : 221636349 : }
4331 : :
4332 : : /* Determine information about number of iterations of a LOOP from the fact
4333 : : that pointer arithmetics in STMT does not overflow. */
4334 : :
4335 : : static void
4336 : 108724180 : infer_loop_bounds_from_pointer_arith (class loop *loop, gimple *stmt)
4337 : : {
4338 : 108724180 : tree def, base, step, scev, type, low, high;
4339 : 108724180 : tree var, ptr;
4340 : :
4341 : 108724180 : if (!is_gimple_assign (stmt)
4342 : 108724180 : || gimple_assign_rhs_code (stmt) != POINTER_PLUS_EXPR)
4343 : : return;
4344 : :
4345 : 4124207 : def = gimple_assign_lhs (stmt);
4346 : 4124207 : if (TREE_CODE (def) != SSA_NAME)
4347 : : return;
4348 : :
4349 : 4124207 : type = TREE_TYPE (def);
4350 : 4124207 : if (!nowrap_type_p (type))
4351 : : return;
4352 : :
4353 : 4124207 : ptr = gimple_assign_rhs1 (stmt);
4354 : 4124207 : if (!expr_invariant_in_loop_p (loop, ptr))
4355 : : return;
4356 : :
4357 : 2327836 : var = gimple_assign_rhs2 (stmt);
4358 : 2327836 : if (TYPE_PRECISION (type) != TYPE_PRECISION (TREE_TYPE (var)))
4359 : : return;
4360 : :
4361 : 2327836 : class loop *uloop = loop_containing_stmt (stmt);
4362 : 2327836 : scev = instantiate_parameters (loop, analyze_scalar_evolution (uloop, def));
4363 : 2327836 : if (chrec_contains_undetermined (scev))
4364 : : return;
4365 : :
4366 : 1953823 : base = initial_condition_in_loop_num (scev, loop->num);
4367 : 1953823 : step = evolution_part_in_loop_num (scev, loop->num);
4368 : :
4369 : 1953823 : if (!base || !step
4370 : 1908172 : || TREE_CODE (step) != INTEGER_CST
4371 : 1724712 : || tree_contains_chrecs (base, NULL)
4372 : 3678535 : || chrec_contains_symbols_defined_in_loop (base, loop->num))
4373 : 229111 : return;
4374 : :
4375 : 1724712 : low = lower_bound_in_type (type, type);
4376 : 1724712 : high = upper_bound_in_type (type, type);
4377 : :
4378 : : /* In C, pointer arithmetic p + 1 cannot use a NULL pointer, and p - 1 cannot
4379 : : produce a NULL pointer. The contrary would mean NULL points to an object,
4380 : : while NULL is supposed to compare unequal with the address of all objects.
4381 : : Furthermore, p + 1 cannot produce a NULL pointer and p - 1 cannot use a
4382 : : NULL pointer since that would mean wrapping, which we assume here not to
4383 : : happen. So, we can exclude NULL from the valid range of pointer
4384 : : arithmetic. */
4385 : 1724712 : if (flag_delete_null_pointer_checks && int_cst_value (low) == 0)
4386 : 1724712 : low = build_int_cstu (TREE_TYPE (low), TYPE_ALIGN_UNIT (TREE_TYPE (type)));
4387 : :
4388 : 1724712 : record_nonwrapping_chrec (scev);
4389 : 1724712 : record_nonwrapping_iv (loop, base, step, stmt, low, high, false, true);
4390 : : }
4391 : :
4392 : : /* Determine information about number of iterations of a LOOP from the fact
4393 : : that signed arithmetics in STMT does not overflow. */
4394 : :
4395 : : static void
4396 : 108724180 : infer_loop_bounds_from_signedness (class loop *loop, gimple *stmt)
4397 : : {
4398 : 108724180 : tree def, base, step, scev, type, low, high;
4399 : :
4400 : 108724180 : if (gimple_code (stmt) != GIMPLE_ASSIGN)
4401 : 103316676 : return;
4402 : :
4403 : 47917307 : def = gimple_assign_lhs (stmt);
4404 : :
4405 : 47917307 : if (TREE_CODE (def) != SSA_NAME)
4406 : : return;
4407 : :
4408 : 41089813 : type = TREE_TYPE (def);
4409 : 41089813 : if (!INTEGRAL_TYPE_P (type)
4410 : 41089813 : || !TYPE_OVERFLOW_UNDEFINED (type))
4411 : : return;
4412 : :
4413 : 13567534 : scev = instantiate_parameters (loop, analyze_scalar_evolution (loop, def));
4414 : 13567534 : if (chrec_contains_undetermined (scev))
4415 : : return;
4416 : :
4417 : 6758657 : base = initial_condition_in_loop_num (scev, loop->num);
4418 : 6758657 : step = evolution_part_in_loop_num (scev, loop->num);
4419 : :
4420 : 6758657 : if (!base || !step
4421 : 6022422 : || TREE_CODE (step) != INTEGER_CST
4422 : 5407504 : || tree_contains_chrecs (base, NULL)
4423 : 12166161 : || chrec_contains_symbols_defined_in_loop (base, loop->num))
4424 : 1351153 : return;
4425 : :
4426 : 5407504 : low = lower_bound_in_type (type, type);
4427 : 5407504 : high = upper_bound_in_type (type, type);
4428 : 5407504 : int_range_max r (TREE_TYPE (def));
4429 : 10815008 : get_range_query (cfun)->range_of_expr (r, def);
4430 : 5407504 : if (!r.varying_p () && !r.undefined_p ())
4431 : : {
4432 : 4943571 : low = wide_int_to_tree (type, r.lower_bound ());
4433 : 4943583 : high = wide_int_to_tree (type, r.upper_bound ());
4434 : : }
4435 : :
4436 : 5407504 : record_nonwrapping_chrec (scev);
4437 : 5407504 : record_nonwrapping_iv (loop, base, step, stmt, low, high, false, true);
4438 : 5407504 : }
4439 : :
4440 : : /* The following analyzers are extracting informations on the bounds
4441 : : of LOOP from the following undefined behaviors:
4442 : :
4443 : : - data references should not access elements over the statically
4444 : : allocated size,
4445 : :
4446 : : - signed variables should not overflow when flag_wrapv is not set.
4447 : : */
4448 : :
4449 : : static void
4450 : 5939260 : infer_loop_bounds_from_undefined (class loop *loop, basic_block *bbs)
4451 : : {
4452 : 5939260 : unsigned i;
4453 : 5939260 : gimple_stmt_iterator bsi;
4454 : 5939260 : basic_block bb;
4455 : 5939260 : bool reliable;
4456 : :
4457 : 41581672 : for (i = 0; i < loop->num_nodes; i++)
4458 : : {
4459 : 35642412 : bb = bbs[i];
4460 : :
4461 : : /* If BB is not executed in each iteration of the loop, we cannot
4462 : : use the operations in it to infer reliable upper bound on the
4463 : : # of iterations of the loop. However, we can use it as a guess.
4464 : : Reliable guesses come only from array bounds. */
4465 : 35642412 : reliable = dominated_by_p (CDI_DOMINATORS, loop->latch, bb);
4466 : :
4467 : 292921173 : for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
4468 : : {
4469 : 221636349 : gimple *stmt = gsi_stmt (bsi);
4470 : :
4471 : 221636349 : infer_loop_bounds_from_array (loop, stmt);
4472 : :
4473 : 221636349 : if (reliable)
4474 : : {
4475 : 108724180 : infer_loop_bounds_from_signedness (loop, stmt);
4476 : 108724180 : infer_loop_bounds_from_pointer_arith (loop, stmt);
4477 : : }
4478 : : }
4479 : :
4480 : : }
4481 : 5939260 : }
4482 : :
4483 : : /* Compare wide ints, callback for qsort. */
4484 : :
4485 : : static int
4486 : 24863 : wide_int_cmp (const void *p1, const void *p2)
4487 : : {
4488 : 24863 : const bound_wide_int *d1 = (const bound_wide_int *) p1;
4489 : 24863 : const bound_wide_int *d2 = (const bound_wide_int *) p2;
4490 : 24863 : return wi::cmpu (*d1, *d2);
4491 : : }
4492 : :
4493 : : /* Return index of BOUND in BOUNDS array sorted in increasing order.
4494 : : Lookup by binary search. */
4495 : :
4496 : : static int
4497 : 6187 : bound_index (const vec<bound_wide_int> &bounds, const bound_wide_int &bound)
4498 : : {
4499 : 6187 : unsigned int end = bounds.length ();
4500 : : unsigned int begin = 0;
4501 : :
4502 : : /* Find a matching index by means of a binary search. */
4503 : 7086 : while (begin != end)
4504 : : {
4505 : 7086 : unsigned int middle = (begin + end) / 2;
4506 : 7086 : bound_wide_int index = bounds[middle];
4507 : :
4508 : 7086 : if (index == bound)
4509 : 6187 : return middle;
4510 : 899 : else if (wi::ltu_p (index, bound))
4511 : 293 : begin = middle + 1;
4512 : : else
4513 : : end = middle;
4514 : : }
4515 : 0 : gcc_unreachable ();
4516 : : }
4517 : :
4518 : : /* We recorded loop bounds only for statements dominating loop latch (and thus
4519 : : executed each loop iteration). If there are any bounds on statements not
4520 : : dominating the loop latch we can improve the estimate by walking the loop
4521 : : body and seeing if every path from loop header to loop latch contains
4522 : : some bounded statement. */
4523 : :
4524 : : static void
4525 : 5976083 : discover_iteration_bound_by_body_walk (class loop *loop)
4526 : : {
4527 : 5976083 : class nb_iter_bound *elt;
4528 : 5976083 : auto_vec<bound_wide_int> bounds;
4529 : 5976083 : vec<vec<basic_block> > queues = vNULL;
4530 : 5976083 : vec<basic_block> queue = vNULL;
4531 : 5976083 : ptrdiff_t queue_index;
4532 : 5976083 : ptrdiff_t latch_index = 0;
4533 : :
4534 : : /* Discover what bounds may interest us. */
4535 : 15436448 : for (elt = loop->bounds; elt; elt = elt->next)
4536 : : {
4537 : 9460365 : bound_wide_int bound = elt->bound;
4538 : :
4539 : : /* Exit terminates loop at given iteration, while non-exits produce undefined
4540 : : effect on the next iteration. */
4541 : 9460365 : if (!elt->is_exit)
4542 : : {
4543 : 5166975 : bound += 1;
4544 : : /* If an overflow occurred, ignore the result. */
4545 : 5166975 : if (bound == 0)
4546 : 0 : continue;
4547 : : }
4548 : :
4549 : 9460365 : if (!loop->any_upper_bound
4550 : 9460365 : || wi::ltu_p (bound, loop->nb_iterations_upper_bound))
4551 : 6187 : bounds.safe_push (bound);
4552 : : }
4553 : :
4554 : : /* Exit early if there is nothing to do. */
4555 : 5976083 : if (!bounds.exists ())
4556 : 5972646 : return;
4557 : :
4558 : 3437 : if (dump_file && (dump_flags & TDF_DETAILS))
4559 : 13 : fprintf (dump_file, " Trying to walk loop body to reduce the bound.\n");
4560 : :
4561 : : /* Sort the bounds in decreasing order. */
4562 : 3437 : bounds.qsort (wide_int_cmp);
4563 : :
4564 : : /* For every basic block record the lowest bound that is guaranteed to
4565 : : terminate the loop. */
4566 : :
4567 : 3437 : hash_map<basic_block, ptrdiff_t> bb_bounds;
4568 : 16957 : for (elt = loop->bounds; elt; elt = elt->next)
4569 : : {
4570 : 13520 : bound_wide_int bound = elt->bound;
4571 : 13520 : if (!elt->is_exit)
4572 : : {
4573 : 9987 : bound += 1;
4574 : : /* If an overflow occurred, ignore the result. */
4575 : 9987 : if (bound == 0)
4576 : 0 : continue;
4577 : : }
4578 : :
4579 : 13520 : if (!loop->any_upper_bound
4580 : 13520 : || wi::ltu_p (bound, loop->nb_iterations_upper_bound))
4581 : : {
4582 : 6187 : ptrdiff_t index = bound_index (bounds, bound);
4583 : 6187 : ptrdiff_t *entry = bb_bounds.get (gimple_bb (elt->stmt));
4584 : 6187 : if (!entry)
4585 : 4318 : bb_bounds.put (gimple_bb (elt->stmt), index);
4586 : 1869 : else if ((ptrdiff_t)*entry > index)
4587 : 137 : *entry = index;
4588 : : }
4589 : : }
4590 : :
4591 : 3437 : hash_map<basic_block, ptrdiff_t> block_priority;
4592 : :
4593 : : /* Perform shortest path discovery loop->header ... loop->latch.
4594 : :
4595 : : The "distance" is given by the smallest loop bound of basic block
4596 : : present in the path and we look for path with largest smallest bound
4597 : : on it.
4598 : :
4599 : : To avoid the need for fibonacci heap on double ints we simply compress
4600 : : double ints into indexes to BOUNDS array and then represent the queue
4601 : : as arrays of queues for every index.
4602 : : Index of BOUNDS.length() means that the execution of given BB has
4603 : : no bounds determined.
4604 : :
4605 : : VISITED is a pointer map translating basic block into smallest index
4606 : : it was inserted into the priority queue with. */
4607 : 3437 : latch_index = -1;
4608 : :
4609 : : /* Start walk in loop header with index set to infinite bound. */
4610 : 3437 : queue_index = bounds.length ();
4611 : 3437 : queues.safe_grow_cleared (queue_index + 1, true);
4612 : 3437 : queue.safe_push (loop->header);
4613 : 3437 : queues[queue_index] = queue;
4614 : 3437 : block_priority.put (loop->header, queue_index);
4615 : :
4616 : 13061 : for (; queue_index >= 0; queue_index--)
4617 : : {
4618 : 9624 : if (latch_index < queue_index)
4619 : : {
4620 : 34735 : while (queues[queue_index].length ())
4621 : : {
4622 : 30996 : basic_block bb;
4623 : 30996 : ptrdiff_t bound_index = queue_index;
4624 : 30996 : edge e;
4625 : 30996 : edge_iterator ei;
4626 : :
4627 : 30996 : queue = queues[queue_index];
4628 : 30996 : bb = queue.pop ();
4629 : :
4630 : : /* OK, we later inserted the BB with lower priority, skip it. */
4631 : 30996 : if (*block_priority.get (bb) > queue_index)
4632 : 0 : continue;
4633 : :
4634 : : /* See if we can improve the bound. */
4635 : 30996 : ptrdiff_t *entry = bb_bounds.get (bb);
4636 : 30996 : if (entry && *entry < bound_index)
4637 : 3792 : bound_index = *entry;
4638 : :
4639 : : /* Insert succesors into the queue, watch for latch edge
4640 : : and record greatest index we saw. */
4641 : 79185 : FOR_EACH_EDGE (e, ei, bb->succs)
4642 : : {
4643 : 48189 : bool insert = false;
4644 : :
4645 : 48189 : if (loop_exit_edge_p (loop, e))
4646 : 8727 : continue;
4647 : :
4648 : 39462 : if (e == loop_latch_edge (loop)
4649 : 39462 : && latch_index < bound_index)
4650 : : latch_index = bound_index;
4651 : 36025 : else if (!(entry = block_priority.get (e->dest)))
4652 : : {
4653 : 28743 : insert = true;
4654 : 28743 : block_priority.put (e->dest, bound_index);
4655 : : }
4656 : 7282 : else if (*entry < bound_index)
4657 : : {
4658 : 161 : insert = true;
4659 : 161 : *entry = bound_index;
4660 : : }
4661 : :
4662 : 28904 : if (insert)
4663 : 28904 : queues[bound_index].safe_push (e->dest);
4664 : : }
4665 : : }
4666 : : }
4667 : 9624 : queues[queue_index].release ();
4668 : : }
4669 : :
4670 : 3437 : gcc_assert (latch_index >= 0);
4671 : 3437 : if ((unsigned)latch_index < bounds.length ())
4672 : : {
4673 : 216 : if (dump_file && (dump_flags & TDF_DETAILS))
4674 : : {
4675 : 0 : fprintf (dump_file, "Found better loop bound ");
4676 : 0 : print_decu (bounds[latch_index], dump_file);
4677 : 0 : fprintf (dump_file, "\n");
4678 : : }
4679 : 216 : record_niter_bound (loop, widest_int::from (bounds[latch_index],
4680 : : SIGNED), false, true);
4681 : : }
4682 : :
4683 : 3437 : queues.release ();
4684 : 5976083 : }
4685 : :
4686 : : /* See if every path cross the loop goes through a statement that is known
4687 : : to not execute at the last iteration. In that case we can decrese iteration
4688 : : count by 1. */
4689 : :
4690 : : static void
4691 : 5976083 : maybe_lower_iteration_bound (class loop *loop)
4692 : : {
4693 : 5976083 : hash_set<gimple *> *not_executed_last_iteration = NULL;
4694 : 5976083 : class nb_iter_bound *elt;
4695 : 5976083 : bool found_exit = false;
4696 : 5976083 : auto_vec<basic_block> queue;
4697 : 5976083 : bitmap visited;
4698 : :
4699 : : /* Collect all statements with interesting (i.e. lower than
4700 : : nb_iterations_upper_bound) bound on them.
4701 : :
4702 : : TODO: Due to the way record_estimate choose estimates to store, the bounds
4703 : : will be always nb_iterations_upper_bound-1. We can change this to record
4704 : : also statements not dominating the loop latch and update the walk bellow
4705 : : to the shortest path algorithm. */
4706 : 15436448 : for (elt = loop->bounds; elt; elt = elt->next)
4707 : : {
4708 : 9460365 : if (!elt->is_exit
4709 : 9460365 : && wi::ltu_p (elt->bound, loop->nb_iterations_upper_bound))
4710 : : {
4711 : 2062514 : if (!not_executed_last_iteration)
4712 : 1119900 : not_executed_last_iteration = new hash_set<gimple *>;
4713 : 2062514 : not_executed_last_iteration->add (elt->stmt);
4714 : : }
4715 : : }
4716 : 5976083 : if (!not_executed_last_iteration)
4717 : 4856183 : return;
4718 : :
4719 : : /* Start DFS walk in the loop header and see if we can reach the
4720 : : loop latch or any of the exits (including statements with side
4721 : : effects that may terminate the loop otherwise) without visiting
4722 : : any of the statements known to have undefined effect on the last
4723 : : iteration. */
4724 : 1119900 : queue.safe_push (loop->header);
4725 : 1119900 : visited = BITMAP_ALLOC (NULL);
4726 : 1119900 : bitmap_set_bit (visited, loop->header->index);
4727 : 1119900 : found_exit = false;
4728 : :
4729 : 1216361 : do
4730 : : {
4731 : 1216361 : basic_block bb = queue.pop ();
4732 : 1216361 : gimple_stmt_iterator gsi;
4733 : 1216361 : bool stmt_found = false;
4734 : :
4735 : : /* Loop for possible exits and statements bounding the execution. */
4736 : 6496061 : for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4737 : : {
4738 : 4127913 : gimple *stmt = gsi_stmt (gsi);
4739 : 4127913 : if (not_executed_last_iteration->contains (stmt))
4740 : : {
4741 : : stmt_found = true;
4742 : 64574 : break;
4743 : : }
4744 : 4085886 : if (gimple_has_side_effects (stmt))
4745 : : {
4746 : : found_exit = true;
4747 : : break;
4748 : : }
4749 : : }
4750 : 1216361 : if (found_exit)
4751 : : break;
4752 : :
4753 : : /* If no bounding statement is found, continue the walk. */
4754 : 1193814 : if (!stmt_found)
4755 : : {
4756 : 1151787 : edge e;
4757 : 1151787 : edge_iterator ei;
4758 : :
4759 : 1973551 : FOR_EACH_EDGE (e, ei, bb->succs)
4760 : : {
4761 : 1882557 : if (loop_exit_edge_p (loop, e)
4762 : 822294 : || e == loop_latch_edge (loop)
4763 : : /* When exiting an inner loop, verify it is finite. */
4764 : 822263 : || (!flow_bb_inside_loop_p (bb->loop_father, e->dest)
4765 : 10041 : && !finite_loop_p (bb->loop_father))
4766 : : /* When we enter an irreducible region and the entry
4767 : : does not contain a bounding stmt assume it might be
4768 : : infinite. */
4769 : 2704321 : || (bb->flags & BB_IRREDUCIBLE_LOOP))
4770 : : {
4771 : : found_exit = true;
4772 : : break;
4773 : : }
4774 : 821764 : if (bitmap_set_bit (visited, e->dest->index))
4775 : 795988 : queue.safe_push (e->dest);
4776 : : }
4777 : : }
4778 : : }
4779 : 1193814 : while (queue.length () && !found_exit);
4780 : :
4781 : : /* If every path through the loop reach bounding statement before exit,
4782 : : then we know the last iteration of the loop will have undefined effect
4783 : : and we can decrease number of iterations. */
4784 : :
4785 : 1119900 : if (!found_exit)
4786 : : {
4787 : 36560 : if (dump_file && (dump_flags & TDF_DETAILS))
4788 : 62 : fprintf (dump_file, "Reducing loop iteration estimate by 1; "
4789 : : "undefined statement must be executed at the last iteration.\n");
4790 : 73120 : record_niter_bound (loop, widest_int::from (loop->nb_iterations_upper_bound,
4791 : 109680 : SIGNED) - 1,
4792 : : false, true);
4793 : : }
4794 : :
4795 : 1119900 : BITMAP_FREE (visited);
4796 : 1119900 : delete not_executed_last_iteration;
4797 : 5976083 : }
4798 : :
4799 : : /* Get expected upper bound for number of loop iterations for
4800 : : BUILT_IN_EXPECT_WITH_PROBABILITY for a condition COND. */
4801 : :
4802 : : static tree
4803 : 4652674 : get_upper_bound_based_on_builtin_expr_with_prob (gcond *cond)
4804 : : {
4805 : 4652674 : if (cond == NULL)
4806 : : return NULL_TREE;
4807 : :
4808 : 4499077 : tree lhs = gimple_cond_lhs (cond);
4809 : 4499077 : if (TREE_CODE (lhs) != SSA_NAME)
4810 : : return NULL_TREE;
4811 : :
4812 : 4478540 : gimple *stmt = SSA_NAME_DEF_STMT (gimple_cond_lhs (cond));
4813 : 4834980 : gcall *def = dyn_cast<gcall *> (stmt);
4814 : 182308 : if (def == NULL)
4815 : : return NULL_TREE;
4816 : :
4817 : 182308 : tree decl = gimple_call_fndecl (def);
4818 : 182308 : if (!decl
4819 : 155237 : || !fndecl_built_in_p (decl, BUILT_IN_EXPECT_WITH_PROBABILITY)
4820 : 182312 : || gimple_call_num_args (stmt) != 3)
4821 : : return NULL_TREE;
4822 : :
4823 : 4 : tree c = gimple_call_arg (def, 1);
4824 : 4 : tree condt = TREE_TYPE (lhs);
4825 : 4 : tree res = fold_build2 (gimple_cond_code (cond),
4826 : : condt, c,
4827 : : gimple_cond_rhs (cond));
4828 : 4 : if (TREE_CODE (res) != INTEGER_CST)
4829 : : return NULL_TREE;
4830 : :
4831 : :
4832 : 4 : tree prob = gimple_call_arg (def, 2);
4833 : 4 : tree t = TREE_TYPE (prob);
4834 : 4 : tree one
4835 : 8 : = build_real_from_int_cst (t,
4836 : 4 : integer_one_node);
4837 : 4 : if (integer_zerop (res))
4838 : 0 : prob = fold_build2 (MINUS_EXPR, t, one, prob);
4839 : 4 : tree r = fold_build2 (RDIV_EXPR, t, one, prob);
4840 : 4 : if (TREE_CODE (r) != REAL_CST)
4841 : : return NULL_TREE;
4842 : :
4843 : 2 : HOST_WIDE_INT probi
4844 : 2 : = real_to_integer (TREE_REAL_CST_PTR (r));
4845 : 2 : return build_int_cst (condt, probi);
4846 : : }
4847 : :
4848 : : /* Records estimates on numbers of iterations of LOOP. If USE_UNDEFINED_P
4849 : : is true also use estimates derived from undefined behavior. */
4850 : :
4851 : : void
4852 : 23586493 : estimate_numbers_of_iterations (class loop *loop)
4853 : : {
4854 : 23586493 : tree niter, type;
4855 : 23586493 : unsigned i;
4856 : 23586493 : class tree_niter_desc niter_desc;
4857 : 23586493 : edge ex;
4858 : 23586493 : widest_int bound;
4859 : 23586493 : edge likely_exit;
4860 : :
4861 : : /* Give up if we already have tried to compute an estimation. */
4862 : 23586493 : if (loop->estimate_state != EST_NOT_COMPUTED)
4863 : 17610410 : return;
4864 : :
4865 : 5976083 : if (dump_file && (dump_flags & TDF_DETAILS))
4866 : 10934 : fprintf (dump_file, "Estimating # of iterations of loop %d\n", loop->num);
4867 : :
4868 : 5976083 : loop->estimate_state = EST_AVAILABLE;
4869 : :
4870 : 5976083 : sreal nit;
4871 : 5976083 : bool reliable;
4872 : :
4873 : : /* If we have a measured profile, use it to estimate the number of
4874 : : iterations. Normally this is recorded by branch_prob right after
4875 : : reading the profile. In case we however found a new loop, record the
4876 : : information here.
4877 : :
4878 : : Explicitly check for profile status so we do not report
4879 : : wrong prediction hitrates for guessed loop iterations heuristics.
4880 : : Do not recompute already recorded bounds - we ought to be better on
4881 : : updating iteration bounds than updating profile in general and thus
4882 : : recomputing iteration bounds later in the compilation process will just
4883 : : introduce random roundoff errors. */
4884 : 5976083 : if (!loop->any_estimate
4885 : 4076658 : && expected_loop_iterations_by_profile (loop, &nit, &reliable)
4886 : 9204617 : && reliable)
4887 : : {
4888 : 17 : bound = nit.to_nearest_int ();
4889 : 17 : record_niter_bound (loop, bound, true, false);
4890 : : }
4891 : :
4892 : : /* Ensure that loop->nb_iterations is computed if possible. If it turns out
4893 : : to be constant, we avoid undefined behavior implied bounds and instead
4894 : : diagnose those loops with -Waggressive-loop-optimizations. */
4895 : 5976083 : number_of_latch_executions (loop);
4896 : :
4897 : 5976083 : basic_block *body = get_loop_body (loop);
4898 : 5976083 : auto_vec<edge> exits = get_loop_exit_edges (loop, body);
4899 : 5976083 : likely_exit = single_likely_exit (loop, exits);
4900 : 17371552 : FOR_EACH_VEC_ELT (exits, i, ex)
4901 : : {
4902 : 11395469 : if (ex == likely_exit)
4903 : : {
4904 : 4652674 : gimple *stmt = *gsi_last_bb (ex->src);
4905 : 4652674 : if (stmt != NULL)
4906 : : {
4907 : 4652674 : gcond *cond = dyn_cast<gcond *> (stmt);
4908 : 4652674 : tree niter_bound
4909 : 4652674 : = get_upper_bound_based_on_builtin_expr_with_prob (cond);
4910 : 4652674 : if (niter_bound != NULL_TREE)
4911 : : {
4912 : 2 : widest_int max = derive_constant_upper_bound (niter_bound);
4913 : 2 : record_estimate (loop, niter_bound, max, cond,
4914 : : true, true, false);
4915 : 2 : }
4916 : : }
4917 : : }
4918 : :
4919 : 11395469 : if (!number_of_iterations_exit (loop, ex, &niter_desc,
4920 : : false, false, body))
4921 : 7102079 : continue;
4922 : :
4923 : 4293390 : niter = niter_desc.niter;
4924 : 4293390 : type = TREE_TYPE (niter);
4925 : 4293390 : if (TREE_CODE (niter_desc.may_be_zero) != INTEGER_CST)
4926 : 692997 : niter = build3 (COND_EXPR, type, niter_desc.may_be_zero,
4927 : 692997 : build_int_cst (type, 0),
4928 : : niter);
4929 : 4293390 : record_estimate (loop, niter, niter_desc.max,
4930 : : last_nondebug_stmt (ex->src),
4931 : : true, ex == likely_exit, true);
4932 : 4293390 : record_control_iv (loop, &niter_desc);
4933 : : }
4934 : :
4935 : 5976083 : if (flag_aggressive_loop_optimizations)
4936 : 5939260 : infer_loop_bounds_from_undefined (loop, body);
4937 : 5976083 : free (body);
4938 : :
4939 : 5976083 : discover_iteration_bound_by_body_walk (loop);
4940 : :
4941 : 5976083 : maybe_lower_iteration_bound (loop);
4942 : :
4943 : : /* If we know the exact number of iterations of this loop, try to
4944 : : not break code with undefined behavior by not recording smaller
4945 : : maximum number of iterations. */
4946 : 5976083 : if (loop->nb_iterations
4947 : 5976083 : && TREE_CODE (loop->nb_iterations) == INTEGER_CST
4948 : 11952166 : && (wi::min_precision (wi::to_widest (loop->nb_iterations), SIGNED)
4949 : 1832068 : <= bound_wide_int ().get_precision ()))
4950 : : {
4951 : 1832068 : loop->any_upper_bound = true;
4952 : 1832068 : loop->nb_iterations_upper_bound
4953 : 1832068 : = bound_wide_int::from (wi::to_widest (loop->nb_iterations), SIGNED);
4954 : : }
4955 : 23586493 : }
4956 : :
4957 : : /* Sets NIT to the estimated number of executions of the latch of the
4958 : : LOOP. If CONSERVATIVE is true, we must be sure that NIT is at least as
4959 : : large as the number of iterations. If we have no reliable estimate,
4960 : : the function returns false, otherwise returns true. */
4961 : :
4962 : : bool
4963 : 8403452 : estimated_loop_iterations (class loop *loop, widest_int *nit)
4964 : : {
4965 : : /* When SCEV information is available, try to update loop iterations
4966 : : estimate. Otherwise just return whatever we recorded earlier. */
4967 : 8403452 : if (scev_initialized_p ())
4968 : 8403452 : estimate_numbers_of_iterations (loop);
4969 : :
4970 : 8403452 : return (get_estimated_loop_iterations (loop, nit));
4971 : : }
4972 : :
4973 : : /* Similar to estimated_loop_iterations, but returns the estimate only
4974 : : if it fits to HOST_WIDE_INT. If this is not the case, or the estimate
4975 : : on the number of iterations of LOOP could not be derived, returns -1. */
4976 : :
4977 : : HOST_WIDE_INT
4978 : 8155789 : estimated_loop_iterations_int (class loop *loop)
4979 : : {
4980 : 8155789 : widest_int nit;
4981 : 8155789 : HOST_WIDE_INT hwi_nit;
4982 : :
4983 : 8155789 : if (!estimated_loop_iterations (loop, &nit))
4984 : : return -1;
4985 : :
4986 : 3582589 : if (!wi::fits_shwi_p (nit))
4987 : : return -1;
4988 : 3582583 : hwi_nit = nit.to_shwi ();
4989 : :
4990 : 3582583 : return hwi_nit < 0 ? -1 : hwi_nit;
4991 : 8155789 : }
4992 : :
4993 : :
4994 : : /* Sets NIT to an upper bound for the maximum number of executions of the
4995 : : latch of the LOOP. If we have no reliable estimate, the function returns
4996 : : false, otherwise returns true. */
4997 : :
4998 : : bool
4999 : 7820136 : max_loop_iterations (class loop *loop, widest_int *nit)
5000 : : {
5001 : : /* When SCEV information is available, try to update loop iterations
5002 : : estimate. Otherwise just return whatever we recorded earlier. */
5003 : 7820136 : if (scev_initialized_p ())
5004 : 7807190 : estimate_numbers_of_iterations (loop);
5005 : :
5006 : 7820136 : return get_max_loop_iterations (loop, nit);
5007 : : }
5008 : :
5009 : : /* Similar to max_loop_iterations, but returns the estimate only
5010 : : if it fits to HOST_WIDE_INT. If this is not the case, or the estimate
5011 : : on the number of iterations of LOOP could not be derived, returns -1. */
5012 : :
5013 : : HOST_WIDE_INT
5014 : 2069860 : max_loop_iterations_int (class loop *loop)
5015 : : {
5016 : 2069860 : widest_int nit;
5017 : 2069860 : HOST_WIDE_INT hwi_nit;
5018 : :
5019 : 2069860 : if (!max_loop_iterations (loop, &nit))
5020 : : return -1;
5021 : :
5022 : 1556383 : if (!wi::fits_shwi_p (nit))
5023 : : return -1;
5024 : 1491351 : hwi_nit = nit.to_shwi ();
5025 : :
5026 : 1491351 : return hwi_nit < 0 ? -1 : hwi_nit;
5027 : 2069860 : }
5028 : :
5029 : : /* Sets NIT to an likely upper bound for the maximum number of executions of the
5030 : : latch of the LOOP. If we have no reliable estimate, the function returns
5031 : : false, otherwise returns true. */
5032 : :
5033 : : bool
5034 : 336827 : likely_max_loop_iterations (class loop *loop, widest_int *nit)
5035 : : {
5036 : : /* When SCEV information is available, try to update loop iterations
5037 : : estimate. Otherwise just return whatever we recorded earlier. */
5038 : 336827 : if (scev_initialized_p ())
5039 : 336827 : estimate_numbers_of_iterations (loop);
5040 : :
5041 : 336827 : return get_likely_max_loop_iterations (loop, nit);
5042 : : }
5043 : :
5044 : : /* Similar to max_loop_iterations, but returns the estimate only
5045 : : if it fits to HOST_WIDE_INT. If this is not the case, or the estimate
5046 : : on the number of iterations of LOOP could not be derived, returns -1. */
5047 : :
5048 : : HOST_WIDE_INT
5049 : 97421 : likely_max_loop_iterations_int (class loop *loop)
5050 : : {
5051 : 97421 : widest_int nit;
5052 : 97421 : HOST_WIDE_INT hwi_nit;
5053 : :
5054 : 97421 : if (!likely_max_loop_iterations (loop, &nit))
5055 : : return -1;
5056 : :
5057 : 78627 : if (!wi::fits_shwi_p (nit))
5058 : : return -1;
5059 : 72073 : hwi_nit = nit.to_shwi ();
5060 : :
5061 : 72073 : return hwi_nit < 0 ? -1 : hwi_nit;
5062 : 97421 : }
5063 : :
5064 : : /* Returns an estimate for the number of executions of statements
5065 : : in the LOOP. For statements before the loop exit, this exceeds
5066 : : the number of execution of the latch by one. */
5067 : :
5068 : : HOST_WIDE_INT
5069 : 8001050 : estimated_stmt_executions_int (class loop *loop)
5070 : : {
5071 : 8001050 : HOST_WIDE_INT nit = estimated_loop_iterations_int (loop);
5072 : 8001050 : HOST_WIDE_INT snit;
5073 : :
5074 : 8001050 : if (nit == -1)
5075 : : return -1;
5076 : :
5077 : 3525481 : snit = (HOST_WIDE_INT) ((unsigned HOST_WIDE_INT) nit + 1);
5078 : :
5079 : : /* If the computation overflows, return -1. */
5080 : 3525481 : return snit < 0 ? -1 : snit;
5081 : : }
5082 : :
5083 : : /* Sets NIT to the maximum number of executions of the latch of the
5084 : : LOOP, plus one. If we have no reliable estimate, the function returns
5085 : : false, otherwise returns true. */
5086 : :
5087 : : bool
5088 : 149 : max_stmt_executions (class loop *loop, widest_int *nit)
5089 : : {
5090 : 149 : widest_int nit_minus_one;
5091 : :
5092 : 149 : if (!max_loop_iterations (loop, nit))
5093 : : return false;
5094 : :
5095 : 149 : nit_minus_one = *nit;
5096 : :
5097 : 149 : *nit += 1;
5098 : :
5099 : 149 : return wi::gtu_p (*nit, nit_minus_one);
5100 : 149 : }
5101 : :
5102 : : /* Sets NIT to the estimated maximum number of executions of the latch of the
5103 : : LOOP, plus one. If we have no likely estimate, the function returns
5104 : : false, otherwise returns true. */
5105 : :
5106 : : bool
5107 : 239406 : likely_max_stmt_executions (class loop *loop, widest_int *nit)
5108 : : {
5109 : 239406 : widest_int nit_minus_one;
5110 : :
5111 : 239406 : if (!likely_max_loop_iterations (loop, nit))
5112 : : return false;
5113 : :
5114 : 136170 : nit_minus_one = *nit;
5115 : :
5116 : 136170 : *nit += 1;
5117 : :
5118 : 136170 : return wi::gtu_p (*nit, nit_minus_one);
5119 : 239406 : }
5120 : :
5121 : : /* Sets NIT to the estimated number of executions of the latch of the
5122 : : LOOP, plus one. If we have no reliable estimate, the function returns
5123 : : false, otherwise returns true. */
5124 : :
5125 : : bool
5126 : 247663 : estimated_stmt_executions (class loop *loop, widest_int *nit)
5127 : : {
5128 : 247663 : widest_int nit_minus_one;
5129 : :
5130 : 247663 : if (!estimated_loop_iterations (loop, nit))
5131 : : return false;
5132 : :
5133 : 7047 : nit_minus_one = *nit;
5134 : :
5135 : 7047 : *nit += 1;
5136 : :
5137 : 7047 : return wi::gtu_p (*nit, nit_minus_one);
5138 : 247663 : }
5139 : :
5140 : : /* Records estimates on numbers of iterations of loops. */
5141 : :
5142 : : void
5143 : 1152325 : estimate_numbers_of_iterations (function *fn)
5144 : : {
5145 : : /* We don't want to issue signed overflow warnings while getting
5146 : : loop iteration estimates. */
5147 : 1152325 : fold_defer_overflow_warnings ();
5148 : :
5149 : 6855581 : for (auto loop : loops_list (fn, 0))
5150 : 3398606 : estimate_numbers_of_iterations (loop);
5151 : :
5152 : 1152325 : fold_undefer_and_ignore_overflow_warnings ();
5153 : 1152325 : }
5154 : :
5155 : : /* Returns true if statement S1 dominates statement S2. */
5156 : :
5157 : : bool
5158 : 2087221 : stmt_dominates_stmt_p (gimple *s1, gimple *s2)
5159 : : {
5160 : 2087221 : basic_block bb1 = gimple_bb (s1), bb2 = gimple_bb (s2);
5161 : :
5162 : 2087221 : if (!bb1
5163 : 2087221 : || s1 == s2)
5164 : : return true;
5165 : :
5166 : 2080257 : if (bb1 == bb2)
5167 : : {
5168 : 778924 : gimple_stmt_iterator bsi;
5169 : :
5170 : 778924 : if (gimple_code (s2) == GIMPLE_PHI)
5171 : : return false;
5172 : :
5173 : 522008 : if (gimple_code (s1) == GIMPLE_PHI)
5174 : : return true;
5175 : :
5176 : 18266845 : for (bsi = gsi_start_bb (bb1); gsi_stmt (bsi) != s2; gsi_next (&bsi))
5177 : 17479845 : if (gsi_stmt (bsi) == s1)
5178 : : return true;
5179 : :
5180 : : return false;
5181 : : }
5182 : :
5183 : 1301333 : return dominated_by_p (CDI_DOMINATORS, bb2, bb1);
5184 : : }
5185 : :
5186 : : /* Returns true when we can prove that the number of executions of
5187 : : STMT in the loop is at most NITER, according to the bound on
5188 : : the number of executions of the statement NITER_BOUND->stmt recorded in
5189 : : NITER_BOUND and fact that NITER_BOUND->stmt dominate STMT.
5190 : :
5191 : : ??? This code can become quite a CPU hog - we can have many bounds,
5192 : : and large basic block forcing stmt_dominates_stmt_p to be queried
5193 : : many times on a large basic blocks, so the whole thing is O(n^2)
5194 : : for scev_probably_wraps_p invocation (that can be done n times).
5195 : :
5196 : : It would make more sense (and give better answers) to remember BB
5197 : : bounds computed by discover_iteration_bound_by_body_walk. */
5198 : :
5199 : : static bool
5200 : 2241769 : n_of_executions_at_most (gimple *stmt,
5201 : : class nb_iter_bound *niter_bound,
5202 : : tree niter)
5203 : : {
5204 : 2241769 : widest_int bound = widest_int::from (niter_bound->bound, SIGNED);
5205 : 2241769 : tree nit_type = TREE_TYPE (niter), e;
5206 : 2241769 : enum tree_code cmp;
5207 : :
5208 : 2241769 : gcc_assert (TYPE_UNSIGNED (nit_type));
5209 : :
5210 : : /* If the bound does not even fit into NIT_TYPE, it cannot tell us that
5211 : : the number of iterations is small. */
5212 : 2241769 : if (!wi::fits_to_tree_p (bound, nit_type))
5213 : : return false;
5214 : :
5215 : : /* We know that NITER_BOUND->stmt is executed at most NITER_BOUND->bound + 1
5216 : : times. This means that:
5217 : :
5218 : : -- if NITER_BOUND->is_exit is true, then everything after
5219 : : it at most NITER_BOUND->bound times.
5220 : :
5221 : : -- If NITER_BOUND->is_exit is false, then if we can prove that when STMT
5222 : : is executed, then NITER_BOUND->stmt is executed as well in the same
5223 : : iteration then STMT is executed at most NITER_BOUND->bound + 1 times.
5224 : :
5225 : : If we can determine that NITER_BOUND->stmt is always executed
5226 : : after STMT, then STMT is executed at most NITER_BOUND->bound + 2 times.
5227 : : We conclude that if both statements belong to the same
5228 : : basic block and STMT is before NITER_BOUND->stmt and there are no
5229 : : statements with side effects in between. */
5230 : :
5231 : 2087221 : if (niter_bound->is_exit)
5232 : : {
5233 : 750266 : if (stmt == niter_bound->stmt
5234 : 750266 : || !stmt_dominates_stmt_p (niter_bound->stmt, stmt))
5235 : 651666 : return false;
5236 : : cmp = GE_EXPR;
5237 : : }
5238 : : else
5239 : : {
5240 : 1336955 : if (!stmt_dominates_stmt_p (niter_bound->stmt, stmt))
5241 : : {
5242 : 542623 : gimple_stmt_iterator bsi;
5243 : 542623 : if (gimple_bb (stmt) != gimple_bb (niter_bound->stmt)
5244 : 228609 : || gimple_code (stmt) == GIMPLE_PHI
5245 : 723255 : || gimple_code (niter_bound->stmt) == GIMPLE_PHI)
5246 : 367154 : return false;
5247 : :
5248 : : /* By stmt_dominates_stmt_p we already know that STMT appears
5249 : : before NITER_BOUND->STMT. Still need to test that the loop
5250 : : cannot be terinated by a side effect in between. */
5251 : 7460625 : for (bsi = gsi_for_stmt (stmt); gsi_stmt (bsi) != niter_bound->stmt;
5252 : 7279993 : gsi_next (&bsi))
5253 : 7280718 : if (gimple_has_side_effects (gsi_stmt (bsi)))
5254 : : return false;
5255 : 179907 : bound += 1;
5256 : 355376 : if (bound == 0
5257 : 179907 : || !wi::fits_to_tree_p (bound, nit_type))
5258 : 4438 : return false;
5259 : : }
5260 : : cmp = GT_EXPR;
5261 : : }
5262 : :
5263 : 1068401 : e = fold_binary (cmp, boolean_type_node,
5264 : : niter, wide_int_to_tree (nit_type, bound));
5265 : 1068401 : return e && integer_nonzerop (e);
5266 : 2241769 : }
5267 : :
5268 : : /* Returns true if the arithmetics in TYPE can be assumed not to wrap. */
5269 : :
5270 : : bool
5271 : 73441029 : nowrap_type_p (tree type)
5272 : : {
5273 : 9806046 : if (ANY_INTEGRAL_TYPE_P (type)
5274 : 73441029 : && TYPE_OVERFLOW_UNDEFINED (type))
5275 : : return true;
5276 : :
5277 : 37265216 : if (POINTER_TYPE_P (type))
5278 : 9806046 : return true;
5279 : :
5280 : : return false;
5281 : : }
5282 : :
5283 : : /* Return true if we can prove LOOP is exited before evolution of induction
5284 : : variable {BASE, STEP} overflows with respect to its type bound. */
5285 : :
5286 : : static bool
5287 : 2967197 : loop_exits_before_overflow (tree base, tree step,
5288 : : gimple *at_stmt, class loop *loop)
5289 : : {
5290 : 2967197 : widest_int niter;
5291 : 2967197 : struct control_iv *civ;
5292 : 2967197 : class nb_iter_bound *bound;
5293 : 2967197 : tree e, delta, step_abs, unsigned_base;
5294 : 2967197 : tree type = TREE_TYPE (step);
5295 : 2967197 : tree unsigned_type, valid_niter;
5296 : :
5297 : : /* Don't issue signed overflow warnings. */
5298 : 2967197 : fold_defer_overflow_warnings ();
5299 : :
5300 : : /* Compute the number of iterations before we reach the bound of the
5301 : : type, and verify that the loop is exited before this occurs. */
5302 : 2967197 : unsigned_type = unsigned_type_for (type);
5303 : 2967197 : unsigned_base = fold_convert (unsigned_type, base);
5304 : :
5305 : 2967197 : if (tree_int_cst_sign_bit (step))
5306 : : {
5307 : 370927 : tree extreme = fold_convert (unsigned_type,
5308 : : lower_bound_in_type (type, type));
5309 : 370927 : delta = fold_build2 (MINUS_EXPR, unsigned_type, unsigned_base, extreme);
5310 : 370927 : step_abs = fold_build1 (NEGATE_EXPR, unsigned_type,
5311 : : fold_convert (unsigned_type, step));
5312 : : }
5313 : : else
5314 : : {
5315 : 2596270 : tree extreme = fold_convert (unsigned_type,
5316 : : upper_bound_in_type (type, type));
5317 : 2596270 : delta = fold_build2 (MINUS_EXPR, unsigned_type, extreme, unsigned_base);
5318 : 2596270 : step_abs = fold_convert (unsigned_type, step);
5319 : : }
5320 : :
5321 : 2967197 : valid_niter = fold_build2 (FLOOR_DIV_EXPR, unsigned_type, delta, step_abs);
5322 : :
5323 : 2967197 : estimate_numbers_of_iterations (loop);
5324 : :
5325 : 2967197 : if (max_loop_iterations (loop, &niter)
5326 : 2537788 : && wi::fits_to_tree_p (niter, TREE_TYPE (valid_niter))
5327 : 2355676 : && (e = fold_binary (GT_EXPR, boolean_type_node, valid_niter,
5328 : : wide_int_to_tree (TREE_TYPE (valid_niter),
5329 : : niter))) != NULL
5330 : 5250605 : && integer_nonzerop (e))
5331 : : {
5332 : 928301 : fold_undefer_and_ignore_overflow_warnings ();
5333 : 928301 : return true;
5334 : : }
5335 : 2038896 : if (at_stmt)
5336 : 3429228 : for (bound = loop->bounds; bound; bound = bound->next)
5337 : : {
5338 : 2241769 : if (n_of_executions_at_most (at_stmt, bound, valid_niter))
5339 : : {
5340 : 13495 : fold_undefer_and_ignore_overflow_warnings ();
5341 : 13495 : return true;
5342 : : }
5343 : : }
5344 : 2025401 : fold_undefer_and_ignore_overflow_warnings ();
5345 : :
5346 : : /* Try to prove loop is exited before {base, step} overflows with the
5347 : : help of analyzed loop control IV. This is done only for IVs with
5348 : : constant step because otherwise we don't have the information. */
5349 : 2025401 : if (TREE_CODE (step) == INTEGER_CST)
5350 : : {
5351 : 3038246 : for (civ = loop->control_ivs; civ; civ = civ->next)
5352 : : {
5353 : 1163400 : enum tree_code code;
5354 : 1163400 : tree civ_type = TREE_TYPE (civ->step);
5355 : :
5356 : : /* Have to consider type difference because operand_equal_p ignores
5357 : : that for constants. */
5358 : 1163400 : if (TYPE_UNSIGNED (type) != TYPE_UNSIGNED (civ_type)
5359 : 1163400 : || element_precision (type) != element_precision (civ_type))
5360 : 673703 : continue;
5361 : :
5362 : : /* Only consider control IV with same step. */
5363 : 489697 : if (!operand_equal_p (step, civ->step, 0))
5364 : 176551 : continue;
5365 : :
5366 : : /* Done proving if this is a no-overflow control IV. */
5367 : 313146 : if (operand_equal_p (base, civ->base, 0))
5368 : : return true;
5369 : :
5370 : : /* Control IV is recorded after expanding simple operations,
5371 : : Here we expand base and compare it too. */
5372 : 209230 : tree expanded_base = expand_simple_operations (base);
5373 : 209230 : if (operand_equal_p (expanded_base, civ->base, 0))
5374 : : return true;
5375 : :
5376 : : /* If this is a before stepping control IV, in other words, we have
5377 : :
5378 : : {civ_base, step} = {base + step, step}
5379 : :
5380 : : Because civ {base + step, step} doesn't overflow during loop
5381 : : iterations, {base, step} will not overflow if we can prove the
5382 : : operation "base + step" does not overflow. Specifically, we try
5383 : : to prove below conditions are satisfied:
5384 : :
5385 : : base <= UPPER_BOUND (type) - step ;;step > 0
5386 : : base >= LOWER_BOUND (type) - step ;;step < 0
5387 : :
5388 : : by proving the reverse conditions are false using loop's initial
5389 : : condition. */
5390 : 180309 : if (POINTER_TYPE_P (TREE_TYPE (base)))
5391 : : code = POINTER_PLUS_EXPR;
5392 : : else
5393 : : code = PLUS_EXPR;
5394 : :
5395 : 180309 : tree stepped = fold_build2 (code, TREE_TYPE (base), base, step);
5396 : 180309 : tree expanded_stepped = fold_build2 (code, TREE_TYPE (base),
5397 : : expanded_base, step);
5398 : 180309 : if (operand_equal_p (stepped, civ->base, 0)
5399 : 180309 : || operand_equal_p (expanded_stepped, civ->base, 0))
5400 : : {
5401 : 31119 : tree extreme;
5402 : :
5403 : 31119 : if (tree_int_cst_sign_bit (step))
5404 : : {
5405 : 5869 : code = LT_EXPR;
5406 : 5869 : extreme = lower_bound_in_type (type, type);
5407 : : }
5408 : : else
5409 : : {
5410 : 25250 : code = GT_EXPR;
5411 : 25250 : extreme = upper_bound_in_type (type, type);
5412 : : }
5413 : 31119 : extreme = fold_build2 (MINUS_EXPR, type, extreme, step);
5414 : 31119 : e = fold_build2 (code, boolean_type_node, base, extreme);
5415 : 31119 : e = simplify_using_initial_conditions (loop, e);
5416 : 31119 : if (integer_zerop (e))
5417 : : return true;
5418 : : }
5419 : : }
5420 : : }
5421 : :
5422 : : return false;
5423 : 2967197 : }
5424 : :
5425 : : /* VAR is scev variable whose evolution part is constant STEP, this function
5426 : : proves that VAR can't overflow by using value range info. If VAR's value
5427 : : range is [MIN, MAX], it can be proven by:
5428 : : MAX + step doesn't overflow ; if step > 0
5429 : : or
5430 : : MIN + step doesn't underflow ; if step < 0.
5431 : :
5432 : : We can only do this if var is computed in every loop iteration, i.e, var's
5433 : : definition has to dominate loop latch. Consider below example:
5434 : :
5435 : : {
5436 : : unsigned int i;
5437 : :
5438 : : <bb 3>:
5439 : :
5440 : : <bb 4>:
5441 : : # RANGE [0, 4294967294] NONZERO 65535
5442 : : # i_21 = PHI <0(3), i_18(9)>
5443 : : if (i_21 != 0)
5444 : : goto <bb 6>;
5445 : : else
5446 : : goto <bb 8>;
5447 : :
5448 : : <bb 6>:
5449 : : # RANGE [0, 65533] NONZERO 65535
5450 : : _6 = i_21 + 4294967295;
5451 : : # RANGE [0, 65533] NONZERO 65535
5452 : : _7 = (long unsigned int) _6;
5453 : : # RANGE [0, 524264] NONZERO 524280
5454 : : _8 = _7 * 8;
5455 : : # PT = nonlocal escaped
5456 : : _9 = a_14 + _8;
5457 : : *_9 = 0;
5458 : :
5459 : : <bb 8>:
5460 : : # RANGE [1, 65535] NONZERO 65535
5461 : : i_18 = i_21 + 1;
5462 : : if (i_18 >= 65535)
5463 : : goto <bb 10>;
5464 : : else
5465 : : goto <bb 9>;
5466 : :
5467 : : <bb 9>:
5468 : : goto <bb 4>;
5469 : :
5470 : : <bb 10>:
5471 : : return;
5472 : : }
5473 : :
5474 : : VAR _6 doesn't overflow only with pre-condition (i_21 != 0), here we
5475 : : can't use _6 to prove no-overlfow for _7. In fact, var _7 takes value
5476 : : sequence (4294967295, 0, 1, ..., 65533) in loop life time, rather than
5477 : : (4294967295, 4294967296, ...). */
5478 : :
5479 : : static bool
5480 : 277092 : scev_var_range_cant_overflow (tree var, tree step, class loop *loop)
5481 : : {
5482 : 277092 : tree type;
5483 : 277092 : wide_int minv, maxv, diff, step_wi;
5484 : :
5485 : 277092 : if (TREE_CODE (step) != INTEGER_CST || !INTEGRAL_TYPE_P (TREE_TYPE (var)))
5486 : : return false;
5487 : :
5488 : : /* Check if VAR evaluates in every loop iteration. It's not the case
5489 : : if VAR is default definition or does not dominate loop's latch. */
5490 : 277092 : basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (var));
5491 : 277092 : if (!def_bb || !dominated_by_p (CDI_DOMINATORS, loop->latch, def_bb))
5492 : 2657 : return false;
5493 : :
5494 : 274435 : int_range_max r (TREE_TYPE (var));
5495 : 548870 : get_range_query (cfun)->range_of_expr (r, var);
5496 : 274435 : if (r.varying_p () || r.undefined_p ())
5497 : : return false;
5498 : :
5499 : : /* VAR is a scev whose evolution part is STEP and value range info
5500 : : is [MIN, MAX], we can prove its no-overflowness by conditions:
5501 : :
5502 : : type_MAX - MAX >= step ; if step > 0
5503 : : MIN - type_MIN >= |step| ; if step < 0.
5504 : :
5505 : : Or VAR must take value outside of value range, which is not true. */
5506 : 94777 : step_wi = wi::to_wide (step);
5507 : 94777 : type = TREE_TYPE (var);
5508 : 94777 : if (tree_int_cst_sign_bit (step))
5509 : : {
5510 : 7023 : diff = r.lower_bound () - wi::to_wide (lower_bound_in_type (type, type));
5511 : 7023 : step_wi = - step_wi;
5512 : : }
5513 : : else
5514 : 87754 : diff = wi::to_wide (upper_bound_in_type (type, type)) - r.upper_bound ();
5515 : :
5516 : 94777 : return (wi::geu_p (diff, step_wi));
5517 : 551527 : }
5518 : :
5519 : : /* Return false only when the induction variable BASE + STEP * I is
5520 : : known to not overflow: i.e. when the number of iterations is small
5521 : : enough with respect to the step and initial condition in order to
5522 : : keep the evolution confined in TYPEs bounds. Return true when the
5523 : : iv is known to overflow or when the property is not computable.
5524 : :
5525 : : USE_OVERFLOW_SEMANTICS is true if this function should assume that
5526 : : the rules for overflow of the given language apply (e.g., that signed
5527 : : arithmetics in C does not overflow).
5528 : :
5529 : : If VAR is a ssa variable, this function also returns false if VAR can
5530 : : be proven not overflow with value range info. */
5531 : :
5532 : : bool
5533 : 6932364 : scev_probably_wraps_p (tree var, tree base, tree step,
5534 : : gimple *at_stmt, class loop *loop,
5535 : : bool use_overflow_semantics)
5536 : : {
5537 : : /* FIXME: We really need something like
5538 : : http://gcc.gnu.org/ml/gcc-patches/2005-06/msg02025.html.
5539 : :
5540 : : We used to test for the following situation that frequently appears
5541 : : during address arithmetics:
5542 : :
5543 : : D.1621_13 = (long unsigned intD.4) D.1620_12;
5544 : : D.1622_14 = D.1621_13 * 8;
5545 : : D.1623_15 = (doubleD.29 *) D.1622_14;
5546 : :
5547 : : And derived that the sequence corresponding to D_14
5548 : : can be proved to not wrap because it is used for computing a
5549 : : memory access; however, this is not really the case -- for example,
5550 : : if D_12 = (unsigned char) [254,+,1], then D_14 has values
5551 : : 2032, 2040, 0, 8, ..., but the code is still legal. */
5552 : :
5553 : 6932364 : if (chrec_contains_undetermined (base)
5554 : 6932364 : || chrec_contains_undetermined (step))
5555 : 0 : return true;
5556 : :
5557 : 6932364 : if (integer_zerop (step))
5558 : : return false;
5559 : :
5560 : : /* If we can use the fact that signed and pointer arithmetics does not
5561 : : wrap, we are done. */
5562 : 6932364 : if (use_overflow_semantics && nowrap_type_p (TREE_TYPE (base)))
5563 : : return false;
5564 : :
5565 : : /* To be able to use estimates on number of iterations of the loop,
5566 : : we must have an upper bound on the absolute value of the step. */
5567 : 3468946 : if (TREE_CODE (step) != INTEGER_CST)
5568 : : return true;
5569 : :
5570 : : /* Check if var can be proven not overflow with value range info. */
5571 : 278547 : if (var && TREE_CODE (var) == SSA_NAME
5572 : 3329088 : && scev_var_range_cant_overflow (var, step, loop))
5573 : : return false;
5574 : :
5575 : 2967197 : if (loop_exits_before_overflow (base, step, at_stmt, loop))
5576 : : return false;
5577 : :
5578 : : /* Check the nonwrapping flag, which may be set by niter analysis (e.g., the
5579 : : above loop exits before overflow). */
5580 : 1874846 : if (var && nonwrapping_chrec_p (analyze_scalar_evolution (loop, var)))
5581 : : return false;
5582 : :
5583 : : /* At this point we still don't have a proof that the iv does not
5584 : : overflow: give up. */
5585 : : return true;
5586 : : }
5587 : :
5588 : : /* Frees the information on upper bounds on numbers of iterations of LOOP. */
5589 : :
5590 : : void
5591 : 52375505 : free_numbers_of_iterations_estimates (class loop *loop)
5592 : : {
5593 : 52375505 : struct control_iv *civ;
5594 : 52375505 : class nb_iter_bound *bound;
5595 : :
5596 : 52375505 : loop->nb_iterations = NULL;
5597 : 52375505 : loop->estimate_state = EST_NOT_COMPUTED;
5598 : 61581024 : for (bound = loop->bounds; bound;)
5599 : : {
5600 : 9205519 : class nb_iter_bound *next = bound->next;
5601 : 9205519 : ggc_free (bound);
5602 : 9205519 : bound = next;
5603 : : }
5604 : 52375505 : loop->bounds = NULL;
5605 : :
5606 : 56401677 : for (civ = loop->control_ivs; civ;)
5607 : : {
5608 : 4026172 : struct control_iv *next = civ->next;
5609 : 4026172 : ggc_free (civ);
5610 : 4026172 : civ = next;
5611 : : }
5612 : 52375505 : loop->control_ivs = NULL;
5613 : 52375505 : }
5614 : :
5615 : : /* Frees the information on upper bounds on numbers of iterations of loops. */
5616 : :
5617 : : void
5618 : 68282207 : free_numbers_of_iterations_estimates (function *fn)
5619 : : {
5620 : 256500650 : for (auto loop : loops_list (fn, 0))
5621 : 51654029 : free_numbers_of_iterations_estimates (loop);
5622 : 68282207 : }
5623 : :
5624 : : /* Substitute value VAL for ssa name NAME inside expressions held
5625 : : at LOOP. */
5626 : :
5627 : : void
5628 : 73781039 : substitute_in_loop_info (class loop *loop, tree name, tree val)
5629 : : {
5630 : 73781039 : loop->nb_iterations = simplify_replace_tree (loop->nb_iterations, name, val);
5631 : 73781039 : }
|