Fix build on sparc64-linux-gnu.
[official-gcc.git] / gcc / vr-values.c
blob8c9fd159146883bcc4c52209ee9860bf49cfdaf1
1 /* Support routines for Value Range Propagation (VRP).
2 Copyright (C) 2005-2018 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
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/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "insn-codes.h"
25 #include "tree.h"
26 #include "gimple.h"
27 #include "ssa.h"
28 #include "optabs-tree.h"
29 #include "gimple-pretty-print.h"
30 #include "diagnostic-core.h"
31 #include "flags.h"
32 #include "fold-const.h"
33 #include "calls.h"
34 #include "cfganal.h"
35 #include "gimple-fold.h"
36 #include "gimple-iterator.h"
37 #include "tree-cfg.h"
38 #include "tree-ssa-loop-niter.h"
39 #include "tree-ssa-loop.h"
40 #include "intl.h"
41 #include "cfgloop.h"
42 #include "tree-scalar-evolution.h"
43 #include "tree-ssa-propagate.h"
44 #include "tree-chrec.h"
45 #include "omp-general.h"
46 #include "case-cfn-macros.h"
47 #include "alloc-pool.h"
48 #include "attribs.h"
49 #include "vr-values.h"
50 #include "cfghooks.h"
52 /* Set value range VR to a non-negative range of type TYPE. */
54 static inline void
55 set_value_range_to_nonnegative (value_range *vr, tree type)
57 tree zero = build_int_cst (type, 0);
58 vr->update (VR_RANGE, zero, vrp_val_max (type));
61 /* Set value range VR to a range of a truthvalue of type TYPE. */
63 static inline void
64 set_value_range_to_truthvalue (value_range *vr, tree type)
66 if (TYPE_PRECISION (type) == 1)
67 set_value_range_to_varying (vr);
68 else
69 vr->update (VR_RANGE, build_int_cst (type, 0), build_int_cst (type, 1));
73 /* Return value range information for VAR.
75 If we have no values ranges recorded (ie, VRP is not running), then
76 return NULL. Otherwise create an empty range if none existed for VAR. */
78 value_range *
79 vr_values::get_value_range (const_tree var)
81 static const value_range vr_const_varying (VR_VARYING, NULL, NULL);
82 value_range *vr;
83 tree sym;
84 unsigned ver = SSA_NAME_VERSION (var);
86 /* If we have no recorded ranges, then return NULL. */
87 if (! vr_value)
88 return NULL;
90 /* If we query the range for a new SSA name return an unmodifiable VARYING.
91 We should get here at most from the substitute-and-fold stage which
92 will never try to change values. */
93 if (ver >= num_vr_values)
94 return CONST_CAST (value_range *, &vr_const_varying);
96 vr = vr_value[ver];
97 if (vr)
98 return vr;
100 /* After propagation finished do not allocate new value-ranges. */
101 if (values_propagated)
102 return CONST_CAST (value_range *, &vr_const_varying);
104 /* Create a default value range. */
105 vr_value[ver] = vr = vrp_value_range_pool.allocate ();
106 vr->set_undefined ();
108 /* If VAR is a default definition of a parameter, the variable can
109 take any value in VAR's type. */
110 if (SSA_NAME_IS_DEFAULT_DEF (var))
112 sym = SSA_NAME_VAR (var);
113 if (TREE_CODE (sym) == PARM_DECL)
115 /* Try to use the "nonnull" attribute to create ~[0, 0]
116 anti-ranges for pointers. Note that this is only valid with
117 default definitions of PARM_DECLs. */
118 if (POINTER_TYPE_P (TREE_TYPE (sym))
119 && (nonnull_arg_p (sym)
120 || get_ptr_nonnull (var)))
121 set_value_range_to_nonnull (vr, TREE_TYPE (sym));
122 else if (INTEGRAL_TYPE_P (TREE_TYPE (sym)))
124 wide_int min, max;
125 value_range_kind rtype = get_range_info (var, &min, &max);
126 if (rtype == VR_RANGE || rtype == VR_ANTI_RANGE)
127 set_value_range (vr, rtype,
128 wide_int_to_tree (TREE_TYPE (var), min),
129 wide_int_to_tree (TREE_TYPE (var), max),
130 NULL);
131 else
132 set_value_range_to_varying (vr);
134 else
135 set_value_range_to_varying (vr);
137 else if (TREE_CODE (sym) == RESULT_DECL
138 && DECL_BY_REFERENCE (sym))
139 set_value_range_to_nonnull (vr, TREE_TYPE (sym));
142 return vr;
145 /* Set value-ranges of all SSA names defined by STMT to varying. */
147 void
148 vr_values::set_defs_to_varying (gimple *stmt)
150 ssa_op_iter i;
151 tree def;
152 FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
154 value_range *vr = get_value_range (def);
155 /* Avoid writing to vr_const_varying get_value_range may return. */
156 if (!vr->varying_p ())
157 set_value_range_to_varying (vr);
161 /* Update the value range and equivalence set for variable VAR to
162 NEW_VR. Return true if NEW_VR is different from VAR's previous
163 value.
165 NOTE: This function assumes that NEW_VR is a temporary value range
166 object created for the sole purpose of updating VAR's range. The
167 storage used by the equivalence set from NEW_VR will be freed by
168 this function. Do not call update_value_range when NEW_VR
169 is the range object associated with another SSA name. */
171 bool
172 vr_values::update_value_range (const_tree var, value_range *new_vr)
174 value_range *old_vr;
175 bool is_new;
177 /* If there is a value-range on the SSA name from earlier analysis
178 factor that in. */
179 if (INTEGRAL_TYPE_P (TREE_TYPE (var)))
181 wide_int min, max;
182 value_range_kind rtype = get_range_info (var, &min, &max);
183 if (rtype == VR_RANGE || rtype == VR_ANTI_RANGE)
185 tree nr_min, nr_max;
186 nr_min = wide_int_to_tree (TREE_TYPE (var), min);
187 nr_max = wide_int_to_tree (TREE_TYPE (var), max);
188 value_range nr;
189 nr.set_and_canonicalize (rtype, nr_min, nr_max, NULL);
190 new_vr->intersect (&nr);
194 /* Update the value range, if necessary. */
195 old_vr = get_value_range (var);
196 is_new = *old_vr != *new_vr;
198 if (is_new)
200 /* Do not allow transitions up the lattice. The following
201 is slightly more awkward than just new_vr->type < old_vr->type
202 because VR_RANGE and VR_ANTI_RANGE need to be considered
203 the same. We may not have is_new when transitioning to
204 UNDEFINED. If old_vr->type is VARYING, we shouldn't be
205 called. */
206 if (new_vr->undefined_p ())
208 set_value_range_to_varying (old_vr);
209 set_value_range_to_varying (new_vr);
210 return true;
212 else
213 set_value_range (old_vr, new_vr->kind (),
214 new_vr->min (), new_vr->max (), new_vr->equiv ());
217 new_vr->equiv_clear ();
219 return is_new;
222 /* Return true if value range VR involves exactly one symbol SYM. */
224 static bool
225 symbolic_range_based_on_p (value_range *vr, const_tree sym)
227 bool neg, min_has_symbol, max_has_symbol;
228 tree inv;
230 if (is_gimple_min_invariant (vr->min ()))
231 min_has_symbol = false;
232 else if (get_single_symbol (vr->min (), &neg, &inv) == sym)
233 min_has_symbol = true;
234 else
235 return false;
237 if (is_gimple_min_invariant (vr->max ()))
238 max_has_symbol = false;
239 else if (get_single_symbol (vr->max (), &neg, &inv) == sym)
240 max_has_symbol = true;
241 else
242 return false;
244 return (min_has_symbol || max_has_symbol);
247 /* Return true if the result of assignment STMT is know to be non-zero. */
249 static bool
250 gimple_assign_nonzero_p (gimple *stmt)
252 enum tree_code code = gimple_assign_rhs_code (stmt);
253 bool strict_overflow_p;
254 switch (get_gimple_rhs_class (code))
256 case GIMPLE_UNARY_RHS:
257 return tree_unary_nonzero_warnv_p (gimple_assign_rhs_code (stmt),
258 gimple_expr_type (stmt),
259 gimple_assign_rhs1 (stmt),
260 &strict_overflow_p);
261 case GIMPLE_BINARY_RHS:
262 return tree_binary_nonzero_warnv_p (gimple_assign_rhs_code (stmt),
263 gimple_expr_type (stmt),
264 gimple_assign_rhs1 (stmt),
265 gimple_assign_rhs2 (stmt),
266 &strict_overflow_p);
267 case GIMPLE_TERNARY_RHS:
268 return false;
269 case GIMPLE_SINGLE_RHS:
270 return tree_single_nonzero_warnv_p (gimple_assign_rhs1 (stmt),
271 &strict_overflow_p);
272 case GIMPLE_INVALID_RHS:
273 gcc_unreachable ();
274 default:
275 gcc_unreachable ();
279 /* Return true if STMT is known to compute a non-zero value. */
281 static bool
282 gimple_stmt_nonzero_p (gimple *stmt)
284 switch (gimple_code (stmt))
286 case GIMPLE_ASSIGN:
287 return gimple_assign_nonzero_p (stmt);
288 case GIMPLE_CALL:
290 gcall *call_stmt = as_a<gcall *> (stmt);
291 return (gimple_call_nonnull_result_p (call_stmt)
292 || gimple_call_nonnull_arg (call_stmt));
294 default:
295 gcc_unreachable ();
298 /* Like tree_expr_nonzero_p, but this function uses value ranges
299 obtained so far. */
301 bool
302 vr_values::vrp_stmt_computes_nonzero (gimple *stmt)
304 if (gimple_stmt_nonzero_p (stmt))
305 return true;
307 /* If we have an expression of the form &X->a, then the expression
308 is nonnull if X is nonnull. */
309 if (is_gimple_assign (stmt)
310 && gimple_assign_rhs_code (stmt) == ADDR_EXPR)
312 tree expr = gimple_assign_rhs1 (stmt);
313 tree base = get_base_address (TREE_OPERAND (expr, 0));
315 if (base != NULL_TREE
316 && TREE_CODE (base) == MEM_REF
317 && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
319 value_range *vr = get_value_range (TREE_OPERAND (base, 0));
320 if (!range_includes_zero_p (vr))
321 return true;
325 return false;
328 /* Returns true if EXPR is a valid value (as expected by compare_values) --
329 a gimple invariant, or SSA_NAME +- CST. */
331 static bool
332 valid_value_p (tree expr)
334 if (TREE_CODE (expr) == SSA_NAME)
335 return true;
337 if (TREE_CODE (expr) == PLUS_EXPR
338 || TREE_CODE (expr) == MINUS_EXPR)
339 return (TREE_CODE (TREE_OPERAND (expr, 0)) == SSA_NAME
340 && TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST);
342 return is_gimple_min_invariant (expr);
345 /* If OP has a value range with a single constant value return that,
346 otherwise return NULL_TREE. This returns OP itself if OP is a
347 constant. */
349 tree
350 vr_values::op_with_constant_singleton_value_range (tree op)
352 if (is_gimple_min_invariant (op))
353 return op;
355 if (TREE_CODE (op) != SSA_NAME)
356 return NULL_TREE;
358 return value_range_constant_singleton (get_value_range (op));
361 /* Return true if op is in a boolean [0, 1] value-range. */
363 bool
364 vr_values::op_with_boolean_value_range_p (tree op)
366 value_range *vr;
368 if (TYPE_PRECISION (TREE_TYPE (op)) == 1)
369 return true;
371 if (integer_zerop (op)
372 || integer_onep (op))
373 return true;
375 if (TREE_CODE (op) != SSA_NAME)
376 return false;
378 vr = get_value_range (op);
379 return (vr->kind () == VR_RANGE
380 && integer_zerop (vr->min ())
381 && integer_onep (vr->max ()));
384 /* Extract value range information for VAR when (OP COND_CODE LIMIT) is
385 true and store it in *VR_P. */
387 void
388 vr_values::extract_range_for_var_from_comparison_expr (tree var,
389 enum tree_code cond_code,
390 tree op, tree limit,
391 value_range *vr_p)
393 tree min, max, type;
394 value_range *limit_vr;
395 type = TREE_TYPE (var);
397 /* For pointer arithmetic, we only keep track of pointer equality
398 and inequality. If we arrive here with unfolded conditions like
399 _1 > _1 do not derive anything. */
400 if ((POINTER_TYPE_P (type) && cond_code != NE_EXPR && cond_code != EQ_EXPR)
401 || limit == var)
403 set_value_range_to_varying (vr_p);
404 return;
407 /* If LIMIT is another SSA name and LIMIT has a range of its own,
408 try to use LIMIT's range to avoid creating symbolic ranges
409 unnecessarily. */
410 limit_vr = (TREE_CODE (limit) == SSA_NAME) ? get_value_range (limit) : NULL;
412 /* LIMIT's range is only interesting if it has any useful information. */
413 if (! limit_vr
414 || limit_vr->undefined_p ()
415 || limit_vr->varying_p ()
416 || (limit_vr->symbolic_p ()
417 && ! (limit_vr->kind () == VR_RANGE
418 && (limit_vr->min () == limit_vr->max ()
419 || operand_equal_p (limit_vr->min (),
420 limit_vr->max (), 0)))))
421 limit_vr = NULL;
423 /* Initially, the new range has the same set of equivalences of
424 VAR's range. This will be revised before returning the final
425 value. Since assertions may be chained via mutually exclusive
426 predicates, we will need to trim the set of equivalences before
427 we are done. */
428 gcc_assert (vr_p->equiv () == NULL);
429 vr_p->equiv_add (var, get_value_range (var), &vrp_equiv_obstack);
431 /* Extract a new range based on the asserted comparison for VAR and
432 LIMIT's value range. Notice that if LIMIT has an anti-range, we
433 will only use it for equality comparisons (EQ_EXPR). For any
434 other kind of assertion, we cannot derive a range from LIMIT's
435 anti-range that can be used to describe the new range. For
436 instance, ASSERT_EXPR <x_2, x_2 <= b_4>. If b_4 is ~[2, 10],
437 then b_4 takes on the ranges [-INF, 1] and [11, +INF]. There is
438 no single range for x_2 that could describe LE_EXPR, so we might
439 as well build the range [b_4, +INF] for it.
440 One special case we handle is extracting a range from a
441 range test encoded as (unsigned)var + CST <= limit. */
442 if (TREE_CODE (op) == NOP_EXPR
443 || TREE_CODE (op) == PLUS_EXPR)
445 if (TREE_CODE (op) == PLUS_EXPR)
447 min = fold_build1 (NEGATE_EXPR, TREE_TYPE (TREE_OPERAND (op, 1)),
448 TREE_OPERAND (op, 1));
449 max = int_const_binop (PLUS_EXPR, limit, min);
450 op = TREE_OPERAND (op, 0);
452 else
454 min = build_int_cst (TREE_TYPE (var), 0);
455 max = limit;
458 /* Make sure to not set TREE_OVERFLOW on the final type
459 conversion. We are willingly interpreting large positive
460 unsigned values as negative signed values here. */
461 min = force_fit_type (TREE_TYPE (var), wi::to_widest (min), 0, false);
462 max = force_fit_type (TREE_TYPE (var), wi::to_widest (max), 0, false);
464 /* We can transform a max, min range to an anti-range or
465 vice-versa. Use set_and_canonicalize which does this for
466 us. */
467 if (cond_code == LE_EXPR)
468 vr_p->set_and_canonicalize (VR_RANGE, min, max, vr_p->equiv ());
469 else if (cond_code == GT_EXPR)
470 vr_p->set_and_canonicalize (VR_ANTI_RANGE, min, max, vr_p->equiv ());
471 else
472 gcc_unreachable ();
474 else if (cond_code == EQ_EXPR)
476 enum value_range_kind range_type;
478 if (limit_vr)
480 range_type = limit_vr->kind ();
481 min = limit_vr->min ();
482 max = limit_vr->max ();
484 else
486 range_type = VR_RANGE;
487 min = limit;
488 max = limit;
491 vr_p->update (range_type, min, max);
493 /* When asserting the equality VAR == LIMIT and LIMIT is another
494 SSA name, the new range will also inherit the equivalence set
495 from LIMIT. */
496 if (TREE_CODE (limit) == SSA_NAME)
497 vr_p->equiv_add (limit, get_value_range (limit), &vrp_equiv_obstack);
499 else if (cond_code == NE_EXPR)
501 /* As described above, when LIMIT's range is an anti-range and
502 this assertion is an inequality (NE_EXPR), then we cannot
503 derive anything from the anti-range. For instance, if
504 LIMIT's range was ~[0, 0], the assertion 'VAR != LIMIT' does
505 not imply that VAR's range is [0, 0]. So, in the case of
506 anti-ranges, we just assert the inequality using LIMIT and
507 not its anti-range.
509 If LIMIT_VR is a range, we can only use it to build a new
510 anti-range if LIMIT_VR is a single-valued range. For
511 instance, if LIMIT_VR is [0, 1], the predicate
512 VAR != [0, 1] does not mean that VAR's range is ~[0, 1].
513 Rather, it means that for value 0 VAR should be ~[0, 0]
514 and for value 1, VAR should be ~[1, 1]. We cannot
515 represent these ranges.
517 The only situation in which we can build a valid
518 anti-range is when LIMIT_VR is a single-valued range
519 (i.e., LIMIT_VR->MIN == LIMIT_VR->MAX). In that case,
520 build the anti-range ~[LIMIT_VR->MIN, LIMIT_VR->MAX]. */
521 if (limit_vr
522 && limit_vr->kind () == VR_RANGE
523 && compare_values (limit_vr->min (), limit_vr->max ()) == 0)
525 min = limit_vr->min ();
526 max = limit_vr->max ();
528 else
530 /* In any other case, we cannot use LIMIT's range to build a
531 valid anti-range. */
532 min = max = limit;
535 /* If MIN and MAX cover the whole range for their type, then
536 just use the original LIMIT. */
537 if (INTEGRAL_TYPE_P (type)
538 && vrp_val_is_min (min)
539 && vrp_val_is_max (max))
540 min = max = limit;
542 vr_p->set_and_canonicalize (VR_ANTI_RANGE, min, max, vr_p->equiv ());
544 else if (cond_code == LE_EXPR || cond_code == LT_EXPR)
546 min = TYPE_MIN_VALUE (type);
548 if (limit_vr == NULL || limit_vr->kind () == VR_ANTI_RANGE)
549 max = limit;
550 else
552 /* If LIMIT_VR is of the form [N1, N2], we need to build the
553 range [MIN, N2] for LE_EXPR and [MIN, N2 - 1] for
554 LT_EXPR. */
555 max = limit_vr->max ();
558 /* If the maximum value forces us to be out of bounds, simply punt.
559 It would be pointless to try and do anything more since this
560 all should be optimized away above us. */
561 if (cond_code == LT_EXPR
562 && compare_values (max, min) == 0)
563 set_value_range_to_varying (vr_p);
564 else
566 /* For LT_EXPR, we create the range [MIN, MAX - 1]. */
567 if (cond_code == LT_EXPR)
569 if (TYPE_PRECISION (TREE_TYPE (max)) == 1
570 && !TYPE_UNSIGNED (TREE_TYPE (max)))
571 max = fold_build2 (PLUS_EXPR, TREE_TYPE (max), max,
572 build_int_cst (TREE_TYPE (max), -1));
573 else
574 max = fold_build2 (MINUS_EXPR, TREE_TYPE (max), max,
575 build_int_cst (TREE_TYPE (max), 1));
576 /* Signal to compare_values_warnv this expr doesn't overflow. */
577 if (EXPR_P (max))
578 TREE_NO_WARNING (max) = 1;
581 vr_p->update (VR_RANGE, min, max);
584 else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
586 max = TYPE_MAX_VALUE (type);
588 if (limit_vr == NULL || limit_vr->kind () == VR_ANTI_RANGE)
589 min = limit;
590 else
592 /* If LIMIT_VR is of the form [N1, N2], we need to build the
593 range [N1, MAX] for GE_EXPR and [N1 + 1, MAX] for
594 GT_EXPR. */
595 min = limit_vr->min ();
598 /* If the minimum value forces us to be out of bounds, simply punt.
599 It would be pointless to try and do anything more since this
600 all should be optimized away above us. */
601 if (cond_code == GT_EXPR
602 && compare_values (min, max) == 0)
603 set_value_range_to_varying (vr_p);
604 else
606 /* For GT_EXPR, we create the range [MIN + 1, MAX]. */
607 if (cond_code == GT_EXPR)
609 if (TYPE_PRECISION (TREE_TYPE (min)) == 1
610 && !TYPE_UNSIGNED (TREE_TYPE (min)))
611 min = fold_build2 (MINUS_EXPR, TREE_TYPE (min), min,
612 build_int_cst (TREE_TYPE (min), -1));
613 else
614 min = fold_build2 (PLUS_EXPR, TREE_TYPE (min), min,
615 build_int_cst (TREE_TYPE (min), 1));
616 /* Signal to compare_values_warnv this expr doesn't overflow. */
617 if (EXPR_P (min))
618 TREE_NO_WARNING (min) = 1;
621 vr_p->update (VR_RANGE, min, max);
624 else
625 gcc_unreachable ();
627 /* Finally intersect the new range with what we already know about var. */
628 vr_p->intersect (get_value_range (var));
631 /* Extract value range information from an ASSERT_EXPR EXPR and store
632 it in *VR_P. */
634 void
635 vr_values::extract_range_from_assert (value_range *vr_p, tree expr)
637 tree var = ASSERT_EXPR_VAR (expr);
638 tree cond = ASSERT_EXPR_COND (expr);
639 tree limit, op;
640 enum tree_code cond_code;
641 gcc_assert (COMPARISON_CLASS_P (cond));
643 /* Find VAR in the ASSERT_EXPR conditional. */
644 if (var == TREE_OPERAND (cond, 0)
645 || TREE_CODE (TREE_OPERAND (cond, 0)) == PLUS_EXPR
646 || TREE_CODE (TREE_OPERAND (cond, 0)) == NOP_EXPR)
648 /* If the predicate is of the form VAR COMP LIMIT, then we just
649 take LIMIT from the RHS and use the same comparison code. */
650 cond_code = TREE_CODE (cond);
651 limit = TREE_OPERAND (cond, 1);
652 op = TREE_OPERAND (cond, 0);
654 else
656 /* If the predicate is of the form LIMIT COMP VAR, then we need
657 to flip around the comparison code to create the proper range
658 for VAR. */
659 cond_code = swap_tree_comparison (TREE_CODE (cond));
660 limit = TREE_OPERAND (cond, 0);
661 op = TREE_OPERAND (cond, 1);
663 extract_range_for_var_from_comparison_expr (var, cond_code, op,
664 limit, vr_p);
667 /* Extract range information from SSA name VAR and store it in VR. If
668 VAR has an interesting range, use it. Otherwise, create the
669 range [VAR, VAR] and return it. This is useful in situations where
670 we may have conditionals testing values of VARYING names. For
671 instance,
673 x_3 = y_5;
674 if (x_3 > y_5)
677 Even if y_5 is deemed VARYING, we can determine that x_3 > y_5 is
678 always false. */
680 void
681 vr_values::extract_range_from_ssa_name (value_range *vr, tree var)
683 value_range *var_vr = get_value_range (var);
685 if (!var_vr->varying_p ())
686 vr->deep_copy (var_vr);
687 else
688 set_value_range (vr, VR_RANGE, var, var, NULL);
690 vr->equiv_add (var, get_value_range (var), &vrp_equiv_obstack);
693 /* Extract range information from a binary expression OP0 CODE OP1 based on
694 the ranges of each of its operands with resulting type EXPR_TYPE.
695 The resulting range is stored in *VR. */
697 void
698 vr_values::extract_range_from_binary_expr (value_range *vr,
699 enum tree_code code,
700 tree expr_type, tree op0, tree op1)
702 /* Get value ranges for each operand. For constant operands, create
703 a new value range with the operand to simplify processing. */
704 value_range vr0, vr1;
705 if (TREE_CODE (op0) == SSA_NAME)
706 vr0 = *(get_value_range (op0));
707 else if (is_gimple_min_invariant (op0))
708 set_value_range_to_value (&vr0, op0, NULL);
709 else
710 set_value_range_to_varying (&vr0);
712 if (TREE_CODE (op1) == SSA_NAME)
713 vr1 = *(get_value_range (op1));
714 else if (is_gimple_min_invariant (op1))
715 set_value_range_to_value (&vr1, op1, NULL);
716 else
717 set_value_range_to_varying (&vr1);
719 /* If one argument is varying, we can sometimes still deduce a
720 range for the output: any + [3, +INF] is in [MIN+3, +INF]. */
721 if (INTEGRAL_TYPE_P (TREE_TYPE (op0))
722 && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0)))
724 if (vr0.varying_p () && !vr1.varying_p ())
725 vr0 = value_range (VR_RANGE,
726 vrp_val_min (expr_type),
727 vrp_val_max (expr_type));
728 else if (vr1.varying_p () && !vr0.varying_p ())
729 vr1 = value_range (VR_RANGE,
730 vrp_val_min (expr_type),
731 vrp_val_max (expr_type));
734 extract_range_from_binary_expr_1 (vr, code, expr_type, &vr0, &vr1);
736 /* Set value_range for n in following sequence:
737 def = __builtin_memchr (arg, 0, sz)
738 n = def - arg
739 Here the range for n can be set to [0, PTRDIFF_MAX - 1]. */
741 if (vr->varying_p ()
742 && code == POINTER_DIFF_EXPR
743 && TREE_CODE (op0) == SSA_NAME
744 && TREE_CODE (op1) == SSA_NAME)
746 tree op0_ptype = TREE_TYPE (TREE_TYPE (op0));
747 tree op1_ptype = TREE_TYPE (TREE_TYPE (op1));
748 gcall *call_stmt = NULL;
750 if (TYPE_MODE (op0_ptype) == TYPE_MODE (char_type_node)
751 && TYPE_PRECISION (op0_ptype) == TYPE_PRECISION (char_type_node)
752 && TYPE_MODE (op1_ptype) == TYPE_MODE (char_type_node)
753 && TYPE_PRECISION (op1_ptype) == TYPE_PRECISION (char_type_node)
754 && (call_stmt = dyn_cast<gcall *>(SSA_NAME_DEF_STMT (op0)))
755 && gimple_call_builtin_p (call_stmt, BUILT_IN_MEMCHR)
756 && operand_equal_p (op0, gimple_call_lhs (call_stmt), 0)
757 && operand_equal_p (op1, gimple_call_arg (call_stmt, 0), 0)
758 && integer_zerop (gimple_call_arg (call_stmt, 1)))
760 tree max = vrp_val_max (ptrdiff_type_node);
761 wide_int wmax = wi::to_wide (max, TYPE_PRECISION (TREE_TYPE (max)));
762 tree range_min = build_zero_cst (expr_type);
763 tree range_max = wide_int_to_tree (expr_type, wmax - 1);
764 set_value_range (vr, VR_RANGE, range_min, range_max, NULL);
765 return;
769 /* Try harder for PLUS and MINUS if the range of one operand is symbolic
770 and based on the other operand, for example if it was deduced from a
771 symbolic comparison. When a bound of the range of the first operand
772 is invariant, we set the corresponding bound of the new range to INF
773 in order to avoid recursing on the range of the second operand. */
774 if (vr->varying_p ()
775 && (code == PLUS_EXPR || code == MINUS_EXPR)
776 && TREE_CODE (op1) == SSA_NAME
777 && vr0.kind () == VR_RANGE
778 && symbolic_range_based_on_p (&vr0, op1))
780 const bool minus_p = (code == MINUS_EXPR);
781 value_range n_vr1;
783 /* Try with VR0 and [-INF, OP1]. */
784 if (is_gimple_min_invariant (minus_p ? vr0.max () : vr0.min ()))
785 set_value_range (&n_vr1, VR_RANGE, vrp_val_min (expr_type), op1, NULL);
787 /* Try with VR0 and [OP1, +INF]. */
788 else if (is_gimple_min_invariant (minus_p ? vr0.min () : vr0.max ()))
789 set_value_range (&n_vr1, VR_RANGE, op1, vrp_val_max (expr_type), NULL);
791 /* Try with VR0 and [OP1, OP1]. */
792 else
793 set_value_range (&n_vr1, VR_RANGE, op1, op1, NULL);
795 extract_range_from_binary_expr_1 (vr, code, expr_type, &vr0, &n_vr1);
798 if (vr->varying_p ()
799 && (code == PLUS_EXPR || code == MINUS_EXPR)
800 && TREE_CODE (op0) == SSA_NAME
801 && vr1.kind () == VR_RANGE
802 && symbolic_range_based_on_p (&vr1, op0))
804 const bool minus_p = (code == MINUS_EXPR);
805 value_range n_vr0;
807 /* Try with [-INF, OP0] and VR1. */
808 if (is_gimple_min_invariant (minus_p ? vr1.max () : vr1.min ()))
809 set_value_range (&n_vr0, VR_RANGE, vrp_val_min (expr_type), op0, NULL);
811 /* Try with [OP0, +INF] and VR1. */
812 else if (is_gimple_min_invariant (minus_p ? vr1.min (): vr1.max ()))
813 set_value_range (&n_vr0, VR_RANGE, op0, vrp_val_max (expr_type), NULL);
815 /* Try with [OP0, OP0] and VR1. */
816 else
817 set_value_range (&n_vr0, VR_RANGE, op0, op0, NULL);
819 extract_range_from_binary_expr_1 (vr, code, expr_type, &n_vr0, &vr1);
822 /* If we didn't derive a range for MINUS_EXPR, and
823 op1's range is ~[op0,op0] or vice-versa, then we
824 can derive a non-null range. This happens often for
825 pointer subtraction. */
826 if (vr->varying_p ()
827 && (code == MINUS_EXPR || code == POINTER_DIFF_EXPR)
828 && TREE_CODE (op0) == SSA_NAME
829 && ((vr0.kind () == VR_ANTI_RANGE
830 && vr0.min () == op1
831 && vr0.min () == vr0.max ())
832 || (vr1.kind () == VR_ANTI_RANGE
833 && vr1.min () == op0
834 && vr1.min () == vr1.max ())))
835 set_value_range_to_nonnull (vr, expr_type);
838 /* Extract range information from a unary expression CODE OP0 based on
839 the range of its operand with resulting type TYPE.
840 The resulting range is stored in *VR. */
842 void
843 vr_values::extract_range_from_unary_expr (value_range *vr, enum tree_code code,
844 tree type, tree op0)
846 value_range vr0;
848 /* Get value ranges for the operand. For constant operands, create
849 a new value range with the operand to simplify processing. */
850 if (TREE_CODE (op0) == SSA_NAME)
851 vr0 = *(get_value_range (op0));
852 else if (is_gimple_min_invariant (op0))
853 set_value_range_to_value (&vr0, op0, NULL);
854 else
855 set_value_range_to_varying (&vr0);
857 ::extract_range_from_unary_expr (vr, code, type, &vr0, TREE_TYPE (op0));
861 /* Extract range information from a conditional expression STMT based on
862 the ranges of each of its operands and the expression code. */
864 void
865 vr_values::extract_range_from_cond_expr (value_range *vr, gassign *stmt)
867 /* Get value ranges for each operand. For constant operands, create
868 a new value range with the operand to simplify processing. */
869 tree op0 = gimple_assign_rhs2 (stmt);
870 value_range vr0;
871 if (TREE_CODE (op0) == SSA_NAME)
872 vr0 = *(get_value_range (op0));
873 else if (is_gimple_min_invariant (op0))
874 set_value_range_to_value (&vr0, op0, NULL);
875 else
876 set_value_range_to_varying (&vr0);
878 tree op1 = gimple_assign_rhs3 (stmt);
879 value_range vr1;
880 if (TREE_CODE (op1) == SSA_NAME)
881 vr1 = *(get_value_range (op1));
882 else if (is_gimple_min_invariant (op1))
883 set_value_range_to_value (&vr1, op1, NULL);
884 else
885 set_value_range_to_varying (&vr1);
887 /* The resulting value range is the union of the operand ranges */
888 vr->deep_copy (&vr0);
889 vr->union_ (&vr1);
893 /* Extract range information from a comparison expression EXPR based
894 on the range of its operand and the expression code. */
896 void
897 vr_values::extract_range_from_comparison (value_range *vr, enum tree_code code,
898 tree type, tree op0, tree op1)
900 bool sop;
901 tree val;
903 val = vrp_evaluate_conditional_warnv_with_ops (code, op0, op1, false, &sop,
904 NULL);
905 if (val)
907 /* Since this expression was found on the RHS of an assignment,
908 its type may be different from _Bool. Convert VAL to EXPR's
909 type. */
910 val = fold_convert (type, val);
911 if (is_gimple_min_invariant (val))
912 set_value_range_to_value (vr, val, vr->equiv ());
913 else
914 vr->update (VR_RANGE, val, val);
916 else
917 /* The result of a comparison is always true or false. */
918 set_value_range_to_truthvalue (vr, type);
921 /* Helper function for simplify_internal_call_using_ranges and
922 extract_range_basic. Return true if OP0 SUBCODE OP1 for
923 SUBCODE {PLUS,MINUS,MULT}_EXPR is known to never overflow or
924 always overflow. Set *OVF to true if it is known to always
925 overflow. */
927 bool
928 vr_values::check_for_binary_op_overflow (enum tree_code subcode, tree type,
929 tree op0, tree op1, bool *ovf)
931 value_range vr0, vr1;
932 if (TREE_CODE (op0) == SSA_NAME)
933 vr0 = *get_value_range (op0);
934 else if (TREE_CODE (op0) == INTEGER_CST)
935 set_value_range_to_value (&vr0, op0, NULL);
936 else
937 set_value_range_to_varying (&vr0);
939 if (TREE_CODE (op1) == SSA_NAME)
940 vr1 = *get_value_range (op1);
941 else if (TREE_CODE (op1) == INTEGER_CST)
942 set_value_range_to_value (&vr1, op1, NULL);
943 else
944 set_value_range_to_varying (&vr1);
946 tree vr0min = vr0.min (), vr0max = vr0.max ();
947 tree vr1min = vr1.min (), vr1max = vr1.max ();
948 if (!range_int_cst_p (&vr0)
949 || TREE_OVERFLOW (vr0min)
950 || TREE_OVERFLOW (vr0max))
952 vr0min = vrp_val_min (TREE_TYPE (op0));
953 vr0max = vrp_val_max (TREE_TYPE (op0));
955 if (!range_int_cst_p (&vr1)
956 || TREE_OVERFLOW (vr1min)
957 || TREE_OVERFLOW (vr1max))
959 vr1min = vrp_val_min (TREE_TYPE (op1));
960 vr1max = vrp_val_max (TREE_TYPE (op1));
962 *ovf = arith_overflowed_p (subcode, type, vr0min,
963 subcode == MINUS_EXPR ? vr1max : vr1min);
964 if (arith_overflowed_p (subcode, type, vr0max,
965 subcode == MINUS_EXPR ? vr1min : vr1max) != *ovf)
966 return false;
967 if (subcode == MULT_EXPR)
969 if (arith_overflowed_p (subcode, type, vr0min, vr1max) != *ovf
970 || arith_overflowed_p (subcode, type, vr0max, vr1min) != *ovf)
971 return false;
973 if (*ovf)
975 /* So far we found that there is an overflow on the boundaries.
976 That doesn't prove that there is an overflow even for all values
977 in between the boundaries. For that compute widest_int range
978 of the result and see if it doesn't overlap the range of
979 type. */
980 widest_int wmin, wmax;
981 widest_int w[4];
982 int i;
983 w[0] = wi::to_widest (vr0min);
984 w[1] = wi::to_widest (vr0max);
985 w[2] = wi::to_widest (vr1min);
986 w[3] = wi::to_widest (vr1max);
987 for (i = 0; i < 4; i++)
989 widest_int wt;
990 switch (subcode)
992 case PLUS_EXPR:
993 wt = wi::add (w[i & 1], w[2 + (i & 2) / 2]);
994 break;
995 case MINUS_EXPR:
996 wt = wi::sub (w[i & 1], w[2 + (i & 2) / 2]);
997 break;
998 case MULT_EXPR:
999 wt = wi::mul (w[i & 1], w[2 + (i & 2) / 2]);
1000 break;
1001 default:
1002 gcc_unreachable ();
1004 if (i == 0)
1006 wmin = wt;
1007 wmax = wt;
1009 else
1011 wmin = wi::smin (wmin, wt);
1012 wmax = wi::smax (wmax, wt);
1015 /* The result of op0 CODE op1 is known to be in range
1016 [wmin, wmax]. */
1017 widest_int wtmin = wi::to_widest (vrp_val_min (type));
1018 widest_int wtmax = wi::to_widest (vrp_val_max (type));
1019 /* If all values in [wmin, wmax] are smaller than
1020 [wtmin, wtmax] or all are larger than [wtmin, wtmax],
1021 the arithmetic operation will always overflow. */
1022 if (wmax < wtmin || wmin > wtmax)
1023 return true;
1024 return false;
1026 return true;
1029 /* Try to derive a nonnegative or nonzero range out of STMT relying
1030 primarily on generic routines in fold in conjunction with range data.
1031 Store the result in *VR */
1033 void
1034 vr_values::extract_range_basic (value_range *vr, gimple *stmt)
1036 bool sop;
1037 tree type = gimple_expr_type (stmt);
1039 if (is_gimple_call (stmt))
1041 tree arg;
1042 int mini, maxi, zerov = 0, prec;
1043 enum tree_code subcode = ERROR_MARK;
1044 combined_fn cfn = gimple_call_combined_fn (stmt);
1045 scalar_int_mode mode;
1047 switch (cfn)
1049 case CFN_BUILT_IN_CONSTANT_P:
1050 /* If the call is __builtin_constant_p and the argument is a
1051 function parameter resolve it to false. This avoids bogus
1052 array bound warnings.
1053 ??? We could do this as early as inlining is finished. */
1054 arg = gimple_call_arg (stmt, 0);
1055 if (TREE_CODE (arg) == SSA_NAME
1056 && SSA_NAME_IS_DEFAULT_DEF (arg)
1057 && TREE_CODE (SSA_NAME_VAR (arg)) == PARM_DECL
1058 && cfun->after_inlining)
1060 set_value_range_to_null (vr, type);
1061 return;
1063 break;
1064 /* Both __builtin_ffs* and __builtin_popcount return
1065 [0, prec]. */
1066 CASE_CFN_FFS:
1067 CASE_CFN_POPCOUNT:
1068 arg = gimple_call_arg (stmt, 0);
1069 prec = TYPE_PRECISION (TREE_TYPE (arg));
1070 mini = 0;
1071 maxi = prec;
1072 if (TREE_CODE (arg) == SSA_NAME)
1074 value_range *vr0 = get_value_range (arg);
1075 /* If arg is non-zero, then ffs or popcount are non-zero. */
1076 if (range_includes_zero_p (vr0) == 0)
1077 mini = 1;
1078 /* If some high bits are known to be zero,
1079 we can decrease the maximum. */
1080 if (vr0->kind () == VR_RANGE
1081 && TREE_CODE (vr0->max ()) == INTEGER_CST
1082 && !operand_less_p (vr0->min (),
1083 build_zero_cst (TREE_TYPE (vr0->min ()))))
1084 maxi = tree_floor_log2 (vr0->max ()) + 1;
1086 goto bitop_builtin;
1087 /* __builtin_parity* returns [0, 1]. */
1088 CASE_CFN_PARITY:
1089 mini = 0;
1090 maxi = 1;
1091 goto bitop_builtin;
1092 /* __builtin_c[lt]z* return [0, prec-1], except for
1093 when the argument is 0, but that is undefined behavior.
1094 On many targets where the CLZ RTL or optab value is defined
1095 for 0 the value is prec, so include that in the range
1096 by default. */
1097 CASE_CFN_CLZ:
1098 arg = gimple_call_arg (stmt, 0);
1099 prec = TYPE_PRECISION (TREE_TYPE (arg));
1100 mini = 0;
1101 maxi = prec;
1102 mode = SCALAR_INT_TYPE_MODE (TREE_TYPE (arg));
1103 if (optab_handler (clz_optab, mode) != CODE_FOR_nothing
1104 && CLZ_DEFINED_VALUE_AT_ZERO (mode, zerov)
1105 /* Handle only the single common value. */
1106 && zerov != prec)
1107 /* Magic value to give up, unless vr0 proves
1108 arg is non-zero. */
1109 mini = -2;
1110 if (TREE_CODE (arg) == SSA_NAME)
1112 value_range *vr0 = get_value_range (arg);
1113 /* From clz of VR_RANGE minimum we can compute
1114 result maximum. */
1115 if (vr0->kind () == VR_RANGE
1116 && TREE_CODE (vr0->min ()) == INTEGER_CST)
1118 maxi = prec - 1 - tree_floor_log2 (vr0->min ());
1119 if (maxi != prec)
1120 mini = 0;
1122 else if (vr0->kind () == VR_ANTI_RANGE
1123 && integer_zerop (vr0->min ()))
1125 maxi = prec - 1;
1126 mini = 0;
1128 if (mini == -2)
1129 break;
1130 /* From clz of VR_RANGE maximum we can compute
1131 result minimum. */
1132 if (vr0->kind () == VR_RANGE
1133 && TREE_CODE (vr0->max ()) == INTEGER_CST)
1135 mini = prec - 1 - tree_floor_log2 (vr0->max ());
1136 if (mini == prec)
1137 break;
1140 if (mini == -2)
1141 break;
1142 goto bitop_builtin;
1143 /* __builtin_ctz* return [0, prec-1], except for
1144 when the argument is 0, but that is undefined behavior.
1145 If there is a ctz optab for this mode and
1146 CTZ_DEFINED_VALUE_AT_ZERO, include that in the range,
1147 otherwise just assume 0 won't be seen. */
1148 CASE_CFN_CTZ:
1149 arg = gimple_call_arg (stmt, 0);
1150 prec = TYPE_PRECISION (TREE_TYPE (arg));
1151 mini = 0;
1152 maxi = prec - 1;
1153 mode = SCALAR_INT_TYPE_MODE (TREE_TYPE (arg));
1154 if (optab_handler (ctz_optab, mode) != CODE_FOR_nothing
1155 && CTZ_DEFINED_VALUE_AT_ZERO (mode, zerov))
1157 /* Handle only the two common values. */
1158 if (zerov == -1)
1159 mini = -1;
1160 else if (zerov == prec)
1161 maxi = prec;
1162 else
1163 /* Magic value to give up, unless vr0 proves
1164 arg is non-zero. */
1165 mini = -2;
1167 if (TREE_CODE (arg) == SSA_NAME)
1169 value_range *vr0 = get_value_range (arg);
1170 /* If arg is non-zero, then use [0, prec - 1]. */
1171 if ((vr0->kind () == VR_RANGE
1172 && integer_nonzerop (vr0->min ()))
1173 || (vr0->kind () == VR_ANTI_RANGE
1174 && integer_zerop (vr0->min ())))
1176 mini = 0;
1177 maxi = prec - 1;
1179 /* If some high bits are known to be zero,
1180 we can decrease the result maximum. */
1181 if (vr0->kind () == VR_RANGE
1182 && TREE_CODE (vr0->max ()) == INTEGER_CST)
1184 maxi = tree_floor_log2 (vr0->max ());
1185 /* For vr0 [0, 0] give up. */
1186 if (maxi == -1)
1187 break;
1190 if (mini == -2)
1191 break;
1192 goto bitop_builtin;
1193 /* __builtin_clrsb* returns [0, prec-1]. */
1194 CASE_CFN_CLRSB:
1195 arg = gimple_call_arg (stmt, 0);
1196 prec = TYPE_PRECISION (TREE_TYPE (arg));
1197 mini = 0;
1198 maxi = prec - 1;
1199 goto bitop_builtin;
1200 bitop_builtin:
1201 set_value_range (vr, VR_RANGE, build_int_cst (type, mini),
1202 build_int_cst (type, maxi), NULL);
1203 return;
1204 case CFN_UBSAN_CHECK_ADD:
1205 subcode = PLUS_EXPR;
1206 break;
1207 case CFN_UBSAN_CHECK_SUB:
1208 subcode = MINUS_EXPR;
1209 break;
1210 case CFN_UBSAN_CHECK_MUL:
1211 subcode = MULT_EXPR;
1212 break;
1213 case CFN_GOACC_DIM_SIZE:
1214 case CFN_GOACC_DIM_POS:
1215 /* Optimizing these two internal functions helps the loop
1216 optimizer eliminate outer comparisons. Size is [1,N]
1217 and pos is [0,N-1]. */
1219 bool is_pos = cfn == CFN_GOACC_DIM_POS;
1220 int axis = oacc_get_ifn_dim_arg (stmt);
1221 int size = oacc_get_fn_dim_size (current_function_decl, axis);
1223 if (!size)
1224 /* If it's dynamic, the backend might know a hardware
1225 limitation. */
1226 size = targetm.goacc.dim_limit (axis);
1228 tree type = TREE_TYPE (gimple_call_lhs (stmt));
1229 set_value_range (vr, VR_RANGE,
1230 build_int_cst (type, is_pos ? 0 : 1),
1231 size ? build_int_cst (type, size - is_pos)
1232 : vrp_val_max (type), NULL);
1234 return;
1235 case CFN_BUILT_IN_STRLEN:
1236 if (tree lhs = gimple_call_lhs (stmt))
1237 if (ptrdiff_type_node
1238 && (TYPE_PRECISION (ptrdiff_type_node)
1239 == TYPE_PRECISION (TREE_TYPE (lhs))))
1241 tree type = TREE_TYPE (lhs);
1242 tree max = vrp_val_max (ptrdiff_type_node);
1243 wide_int wmax = wi::to_wide (max, TYPE_PRECISION (TREE_TYPE (max)));
1244 tree range_min = build_zero_cst (type);
1245 tree range_max = wide_int_to_tree (type, wmax - 1);
1246 set_value_range (vr, VR_RANGE, range_min, range_max, NULL);
1247 return;
1249 break;
1250 default:
1251 break;
1253 if (subcode != ERROR_MARK)
1255 bool saved_flag_wrapv = flag_wrapv;
1256 /* Pretend the arithmetics is wrapping. If there is
1257 any overflow, we'll complain, but will actually do
1258 wrapping operation. */
1259 flag_wrapv = 1;
1260 extract_range_from_binary_expr (vr, subcode, type,
1261 gimple_call_arg (stmt, 0),
1262 gimple_call_arg (stmt, 1));
1263 flag_wrapv = saved_flag_wrapv;
1265 /* If for both arguments vrp_valueize returned non-NULL,
1266 this should have been already folded and if not, it
1267 wasn't folded because of overflow. Avoid removing the
1268 UBSAN_CHECK_* calls in that case. */
1269 if (vr->kind () == VR_RANGE
1270 && (vr->min () == vr->max ()
1271 || operand_equal_p (vr->min (), vr->max (), 0)))
1272 set_value_range_to_varying (vr);
1273 return;
1276 /* Handle extraction of the two results (result of arithmetics and
1277 a flag whether arithmetics overflowed) from {ADD,SUB,MUL}_OVERFLOW
1278 internal function. Similarly from ATOMIC_COMPARE_EXCHANGE. */
1279 else if (is_gimple_assign (stmt)
1280 && (gimple_assign_rhs_code (stmt) == REALPART_EXPR
1281 || gimple_assign_rhs_code (stmt) == IMAGPART_EXPR)
1282 && INTEGRAL_TYPE_P (type))
1284 enum tree_code code = gimple_assign_rhs_code (stmt);
1285 tree op = gimple_assign_rhs1 (stmt);
1286 if (TREE_CODE (op) == code && TREE_CODE (TREE_OPERAND (op, 0)) == SSA_NAME)
1288 gimple *g = SSA_NAME_DEF_STMT (TREE_OPERAND (op, 0));
1289 if (is_gimple_call (g) && gimple_call_internal_p (g))
1291 enum tree_code subcode = ERROR_MARK;
1292 switch (gimple_call_internal_fn (g))
1294 case IFN_ADD_OVERFLOW:
1295 subcode = PLUS_EXPR;
1296 break;
1297 case IFN_SUB_OVERFLOW:
1298 subcode = MINUS_EXPR;
1299 break;
1300 case IFN_MUL_OVERFLOW:
1301 subcode = MULT_EXPR;
1302 break;
1303 case IFN_ATOMIC_COMPARE_EXCHANGE:
1304 if (code == IMAGPART_EXPR)
1306 /* This is the boolean return value whether compare and
1307 exchange changed anything or not. */
1308 set_value_range (vr, VR_RANGE, build_int_cst (type, 0),
1309 build_int_cst (type, 1), NULL);
1310 return;
1312 break;
1313 default:
1314 break;
1316 if (subcode != ERROR_MARK)
1318 tree op0 = gimple_call_arg (g, 0);
1319 tree op1 = gimple_call_arg (g, 1);
1320 if (code == IMAGPART_EXPR)
1322 bool ovf = false;
1323 if (check_for_binary_op_overflow (subcode, type,
1324 op0, op1, &ovf))
1325 set_value_range_to_value (vr,
1326 build_int_cst (type, ovf),
1327 NULL);
1328 else if (TYPE_PRECISION (type) == 1
1329 && !TYPE_UNSIGNED (type))
1330 set_value_range_to_varying (vr);
1331 else
1332 set_value_range (vr, VR_RANGE, build_int_cst (type, 0),
1333 build_int_cst (type, 1), NULL);
1335 else if (types_compatible_p (type, TREE_TYPE (op0))
1336 && types_compatible_p (type, TREE_TYPE (op1)))
1338 bool saved_flag_wrapv = flag_wrapv;
1339 /* Pretend the arithmetics is wrapping. If there is
1340 any overflow, IMAGPART_EXPR will be set. */
1341 flag_wrapv = 1;
1342 extract_range_from_binary_expr (vr, subcode, type,
1343 op0, op1);
1344 flag_wrapv = saved_flag_wrapv;
1346 else
1348 value_range vr0, vr1;
1349 bool saved_flag_wrapv = flag_wrapv;
1350 /* Pretend the arithmetics is wrapping. If there is
1351 any overflow, IMAGPART_EXPR will be set. */
1352 flag_wrapv = 1;
1353 extract_range_from_unary_expr (&vr0, NOP_EXPR,
1354 type, op0);
1355 extract_range_from_unary_expr (&vr1, NOP_EXPR,
1356 type, op1);
1357 extract_range_from_binary_expr_1 (vr, subcode, type,
1358 &vr0, &vr1);
1359 flag_wrapv = saved_flag_wrapv;
1361 return;
1366 if (INTEGRAL_TYPE_P (type)
1367 && gimple_stmt_nonnegative_warnv_p (stmt, &sop))
1368 set_value_range_to_nonnegative (vr, type);
1369 else if (vrp_stmt_computes_nonzero (stmt))
1370 set_value_range_to_nonnull (vr, type);
1371 else
1372 set_value_range_to_varying (vr);
1376 /* Try to compute a useful range out of assignment STMT and store it
1377 in *VR. */
1379 void
1380 vr_values::extract_range_from_assignment (value_range *vr, gassign *stmt)
1382 enum tree_code code = gimple_assign_rhs_code (stmt);
1384 if (code == ASSERT_EXPR)
1385 extract_range_from_assert (vr, gimple_assign_rhs1 (stmt));
1386 else if (code == SSA_NAME)
1387 extract_range_from_ssa_name (vr, gimple_assign_rhs1 (stmt));
1388 else if (TREE_CODE_CLASS (code) == tcc_binary)
1389 extract_range_from_binary_expr (vr, gimple_assign_rhs_code (stmt),
1390 gimple_expr_type (stmt),
1391 gimple_assign_rhs1 (stmt),
1392 gimple_assign_rhs2 (stmt));
1393 else if (TREE_CODE_CLASS (code) == tcc_unary)
1394 extract_range_from_unary_expr (vr, gimple_assign_rhs_code (stmt),
1395 gimple_expr_type (stmt),
1396 gimple_assign_rhs1 (stmt));
1397 else if (code == COND_EXPR)
1398 extract_range_from_cond_expr (vr, stmt);
1399 else if (TREE_CODE_CLASS (code) == tcc_comparison)
1400 extract_range_from_comparison (vr, gimple_assign_rhs_code (stmt),
1401 gimple_expr_type (stmt),
1402 gimple_assign_rhs1 (stmt),
1403 gimple_assign_rhs2 (stmt));
1404 else if (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS
1405 && is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))
1406 set_value_range_to_value (vr, gimple_assign_rhs1 (stmt), NULL);
1407 else
1408 set_value_range_to_varying (vr);
1410 if (vr->varying_p ())
1411 extract_range_basic (vr, stmt);
1414 /* Given two numeric value ranges VR0, VR1 and a comparison code COMP:
1416 - Return BOOLEAN_TRUE_NODE if VR0 COMP VR1 always returns true for
1417 all the values in the ranges.
1419 - Return BOOLEAN_FALSE_NODE if the comparison always returns false.
1421 - Return NULL_TREE if it is not always possible to determine the
1422 value of the comparison.
1424 Also set *STRICT_OVERFLOW_P to indicate whether comparision evaluation
1425 assumed signed overflow is undefined. */
1428 static tree
1429 compare_ranges (enum tree_code comp, value_range *vr0, value_range *vr1,
1430 bool *strict_overflow_p)
1432 /* VARYING or UNDEFINED ranges cannot be compared. */
1433 if (vr0->varying_p ()
1434 || vr0->undefined_p ()
1435 || vr1->varying_p ()
1436 || vr1->undefined_p ())
1437 return NULL_TREE;
1439 /* Anti-ranges need to be handled separately. */
1440 if (vr0->kind () == VR_ANTI_RANGE || vr1->kind () == VR_ANTI_RANGE)
1442 /* If both are anti-ranges, then we cannot compute any
1443 comparison. */
1444 if (vr0->kind () == VR_ANTI_RANGE && vr1->kind () == VR_ANTI_RANGE)
1445 return NULL_TREE;
1447 /* These comparisons are never statically computable. */
1448 if (comp == GT_EXPR
1449 || comp == GE_EXPR
1450 || comp == LT_EXPR
1451 || comp == LE_EXPR)
1452 return NULL_TREE;
1454 /* Equality can be computed only between a range and an
1455 anti-range. ~[VAL1, VAL2] == [VAL1, VAL2] is always false. */
1456 if (vr0->kind () == VR_RANGE)
1458 /* To simplify processing, make VR0 the anti-range. */
1459 value_range *tmp = vr0;
1460 vr0 = vr1;
1461 vr1 = tmp;
1464 gcc_assert (comp == NE_EXPR || comp == EQ_EXPR);
1466 if (compare_values_warnv (vr0->min (), vr1->min (), strict_overflow_p) == 0
1467 && compare_values_warnv (vr0->max (), vr1->max (), strict_overflow_p) == 0)
1468 return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
1470 return NULL_TREE;
1473 /* Simplify processing. If COMP is GT_EXPR or GE_EXPR, switch the
1474 operands around and change the comparison code. */
1475 if (comp == GT_EXPR || comp == GE_EXPR)
1477 comp = (comp == GT_EXPR) ? LT_EXPR : LE_EXPR;
1478 std::swap (vr0, vr1);
1481 if (comp == EQ_EXPR)
1483 /* Equality may only be computed if both ranges represent
1484 exactly one value. */
1485 if (compare_values_warnv (vr0->min (), vr0->max (), strict_overflow_p) == 0
1486 && compare_values_warnv (vr1->min (), vr1->max (), strict_overflow_p) == 0)
1488 int cmp_min = compare_values_warnv (vr0->min (), vr1->min (),
1489 strict_overflow_p);
1490 int cmp_max = compare_values_warnv (vr0->max (), vr1->max (),
1491 strict_overflow_p);
1492 if (cmp_min == 0 && cmp_max == 0)
1493 return boolean_true_node;
1494 else if (cmp_min != -2 && cmp_max != -2)
1495 return boolean_false_node;
1497 /* If [V0_MIN, V1_MAX] < [V1_MIN, V1_MAX] then V0 != V1. */
1498 else if (compare_values_warnv (vr0->min (), vr1->max (),
1499 strict_overflow_p) == 1
1500 || compare_values_warnv (vr1->min (), vr0->max (),
1501 strict_overflow_p) == 1)
1502 return boolean_false_node;
1504 return NULL_TREE;
1506 else if (comp == NE_EXPR)
1508 int cmp1, cmp2;
1510 /* If VR0 is completely to the left or completely to the right
1511 of VR1, they are always different. Notice that we need to
1512 make sure that both comparisons yield similar results to
1513 avoid comparing values that cannot be compared at
1514 compile-time. */
1515 cmp1 = compare_values_warnv (vr0->max (), vr1->min (), strict_overflow_p);
1516 cmp2 = compare_values_warnv (vr0->min (), vr1->max (), strict_overflow_p);
1517 if ((cmp1 == -1 && cmp2 == -1) || (cmp1 == 1 && cmp2 == 1))
1518 return boolean_true_node;
1520 /* If VR0 and VR1 represent a single value and are identical,
1521 return false. */
1522 else if (compare_values_warnv (vr0->min (), vr0->max (),
1523 strict_overflow_p) == 0
1524 && compare_values_warnv (vr1->min (), vr1->max (),
1525 strict_overflow_p) == 0
1526 && compare_values_warnv (vr0->min (), vr1->min (),
1527 strict_overflow_p) == 0
1528 && compare_values_warnv (vr0->max (), vr1->max (),
1529 strict_overflow_p) == 0)
1530 return boolean_false_node;
1532 /* Otherwise, they may or may not be different. */
1533 else
1534 return NULL_TREE;
1536 else if (comp == LT_EXPR || comp == LE_EXPR)
1538 int tst;
1540 /* If VR0 is to the left of VR1, return true. */
1541 tst = compare_values_warnv (vr0->max (), vr1->min (), strict_overflow_p);
1542 if ((comp == LT_EXPR && tst == -1)
1543 || (comp == LE_EXPR && (tst == -1 || tst == 0)))
1544 return boolean_true_node;
1546 /* If VR0 is to the right of VR1, return false. */
1547 tst = compare_values_warnv (vr0->min (), vr1->max (), strict_overflow_p);
1548 if ((comp == LT_EXPR && (tst == 0 || tst == 1))
1549 || (comp == LE_EXPR && tst == 1))
1550 return boolean_false_node;
1552 /* Otherwise, we don't know. */
1553 return NULL_TREE;
1556 gcc_unreachable ();
1559 /* Given a value range VR, a value VAL and a comparison code COMP, return
1560 BOOLEAN_TRUE_NODE if VR COMP VAL always returns true for all the
1561 values in VR. Return BOOLEAN_FALSE_NODE if the comparison
1562 always returns false. Return NULL_TREE if it is not always
1563 possible to determine the value of the comparison. Also set
1564 *STRICT_OVERFLOW_P to indicate whether comparision evaluation
1565 assumed signed overflow is undefined. */
1567 static tree
1568 compare_range_with_value (enum tree_code comp, value_range *vr, tree val,
1569 bool *strict_overflow_p)
1571 if (vr->varying_p () || vr->undefined_p ())
1572 return NULL_TREE;
1574 /* Anti-ranges need to be handled separately. */
1575 if (vr->kind () == VR_ANTI_RANGE)
1577 /* For anti-ranges, the only predicates that we can compute at
1578 compile time are equality and inequality. */
1579 if (comp == GT_EXPR
1580 || comp == GE_EXPR
1581 || comp == LT_EXPR
1582 || comp == LE_EXPR)
1583 return NULL_TREE;
1585 /* ~[VAL_1, VAL_2] OP VAL is known if VAL_1 <= VAL <= VAL_2. */
1586 if (value_inside_range (val, vr->min (), vr->max ()) == 1)
1587 return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
1589 return NULL_TREE;
1592 if (comp == EQ_EXPR)
1594 /* EQ_EXPR may only be computed if VR represents exactly
1595 one value. */
1596 if (compare_values_warnv (vr->min (), vr->max (), strict_overflow_p) == 0)
1598 int cmp = compare_values_warnv (vr->min (), val, strict_overflow_p);
1599 if (cmp == 0)
1600 return boolean_true_node;
1601 else if (cmp == -1 || cmp == 1 || cmp == 2)
1602 return boolean_false_node;
1604 else if (compare_values_warnv (val, vr->min (), strict_overflow_p) == -1
1605 || compare_values_warnv (vr->max (), val, strict_overflow_p) == -1)
1606 return boolean_false_node;
1608 return NULL_TREE;
1610 else if (comp == NE_EXPR)
1612 /* If VAL is not inside VR, then they are always different. */
1613 if (compare_values_warnv (vr->max (), val, strict_overflow_p) == -1
1614 || compare_values_warnv (vr->min (), val, strict_overflow_p) == 1)
1615 return boolean_true_node;
1617 /* If VR represents exactly one value equal to VAL, then return
1618 false. */
1619 if (compare_values_warnv (vr->min (), vr->max (), strict_overflow_p) == 0
1620 && compare_values_warnv (vr->min (), val, strict_overflow_p) == 0)
1621 return boolean_false_node;
1623 /* Otherwise, they may or may not be different. */
1624 return NULL_TREE;
1626 else if (comp == LT_EXPR || comp == LE_EXPR)
1628 int tst;
1630 /* If VR is to the left of VAL, return true. */
1631 tst = compare_values_warnv (vr->max (), val, strict_overflow_p);
1632 if ((comp == LT_EXPR && tst == -1)
1633 || (comp == LE_EXPR && (tst == -1 || tst == 0)))
1634 return boolean_true_node;
1636 /* If VR is to the right of VAL, return false. */
1637 tst = compare_values_warnv (vr->min (), val, strict_overflow_p);
1638 if ((comp == LT_EXPR && (tst == 0 || tst == 1))
1639 || (comp == LE_EXPR && tst == 1))
1640 return boolean_false_node;
1642 /* Otherwise, we don't know. */
1643 return NULL_TREE;
1645 else if (comp == GT_EXPR || comp == GE_EXPR)
1647 int tst;
1649 /* If VR is to the right of VAL, return true. */
1650 tst = compare_values_warnv (vr->min (), val, strict_overflow_p);
1651 if ((comp == GT_EXPR && tst == 1)
1652 || (comp == GE_EXPR && (tst == 0 || tst == 1)))
1653 return boolean_true_node;
1655 /* If VR is to the left of VAL, return false. */
1656 tst = compare_values_warnv (vr->max (), val, strict_overflow_p);
1657 if ((comp == GT_EXPR && (tst == -1 || tst == 0))
1658 || (comp == GE_EXPR && tst == -1))
1659 return boolean_false_node;
1661 /* Otherwise, we don't know. */
1662 return NULL_TREE;
1665 gcc_unreachable ();
1667 /* Given a range VR, a LOOP and a variable VAR, determine whether it
1668 would be profitable to adjust VR using scalar evolution information
1669 for VAR. If so, update VR with the new limits. */
1671 void
1672 vr_values::adjust_range_with_scev (value_range *vr, struct loop *loop,
1673 gimple *stmt, tree var)
1675 tree init, step, chrec, tmin, tmax, min, max, type, tem;
1676 enum ev_direction dir;
1678 /* TODO. Don't adjust anti-ranges. An anti-range may provide
1679 better opportunities than a regular range, but I'm not sure. */
1680 if (vr->kind () == VR_ANTI_RANGE)
1681 return;
1683 chrec = instantiate_parameters (loop, analyze_scalar_evolution (loop, var));
1685 /* Like in PR19590, scev can return a constant function. */
1686 if (is_gimple_min_invariant (chrec))
1688 set_value_range_to_value (vr, chrec, vr->equiv ());
1689 return;
1692 if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
1693 return;
1695 init = initial_condition_in_loop_num (chrec, loop->num);
1696 tem = op_with_constant_singleton_value_range (init);
1697 if (tem)
1698 init = tem;
1699 step = evolution_part_in_loop_num (chrec, loop->num);
1700 tem = op_with_constant_singleton_value_range (step);
1701 if (tem)
1702 step = tem;
1704 /* If STEP is symbolic, we can't know whether INIT will be the
1705 minimum or maximum value in the range. Also, unless INIT is
1706 a simple expression, compare_values and possibly other functions
1707 in tree-vrp won't be able to handle it. */
1708 if (step == NULL_TREE
1709 || !is_gimple_min_invariant (step)
1710 || !valid_value_p (init))
1711 return;
1713 dir = scev_direction (chrec);
1714 if (/* Do not adjust ranges if we do not know whether the iv increases
1715 or decreases, ... */
1716 dir == EV_DIR_UNKNOWN
1717 /* ... or if it may wrap. */
1718 || scev_probably_wraps_p (NULL_TREE, init, step, stmt,
1719 get_chrec_loop (chrec), true))
1720 return;
1722 type = TREE_TYPE (var);
1723 if (POINTER_TYPE_P (type) || !TYPE_MIN_VALUE (type))
1724 tmin = lower_bound_in_type (type, type);
1725 else
1726 tmin = TYPE_MIN_VALUE (type);
1727 if (POINTER_TYPE_P (type) || !TYPE_MAX_VALUE (type))
1728 tmax = upper_bound_in_type (type, type);
1729 else
1730 tmax = TYPE_MAX_VALUE (type);
1732 /* Try to use estimated number of iterations for the loop to constrain the
1733 final value in the evolution. */
1734 if (TREE_CODE (step) == INTEGER_CST
1735 && is_gimple_val (init)
1736 && (TREE_CODE (init) != SSA_NAME
1737 || get_value_range (init)->kind () == VR_RANGE))
1739 widest_int nit;
1741 /* We are only entering here for loop header PHI nodes, so using
1742 the number of latch executions is the correct thing to use. */
1743 if (max_loop_iterations (loop, &nit))
1745 value_range maxvr;
1746 signop sgn = TYPE_SIGN (TREE_TYPE (step));
1747 wi::overflow_type overflow;
1749 widest_int wtmp = wi::mul (wi::to_widest (step), nit, sgn,
1750 &overflow);
1751 /* If the multiplication overflowed we can't do a meaningful
1752 adjustment. Likewise if the result doesn't fit in the type
1753 of the induction variable. For a signed type we have to
1754 check whether the result has the expected signedness which
1755 is that of the step as number of iterations is unsigned. */
1756 if (!overflow
1757 && wi::fits_to_tree_p (wtmp, TREE_TYPE (init))
1758 && (sgn == UNSIGNED
1759 || wi::gts_p (wtmp, 0) == wi::gts_p (wi::to_wide (step), 0)))
1761 tem = wide_int_to_tree (TREE_TYPE (init), wtmp);
1762 extract_range_from_binary_expr (&maxvr, PLUS_EXPR,
1763 TREE_TYPE (init), init, tem);
1764 /* Likewise if the addition did. */
1765 if (maxvr.kind () == VR_RANGE)
1767 value_range initvr;
1769 if (TREE_CODE (init) == SSA_NAME)
1770 initvr = *(get_value_range (init));
1771 else if (is_gimple_min_invariant (init))
1772 set_value_range_to_value (&initvr, init, NULL);
1773 else
1774 return;
1776 /* Check if init + nit * step overflows. Though we checked
1777 scev {init, step}_loop doesn't wrap, it is not enough
1778 because the loop may exit immediately. Overflow could
1779 happen in the plus expression in this case. */
1780 if ((dir == EV_DIR_DECREASES
1781 && compare_values (maxvr.min (), initvr.min ()) != -1)
1782 || (dir == EV_DIR_GROWS
1783 && compare_values (maxvr.max (), initvr.max ()) != 1))
1784 return;
1786 tmin = maxvr.min ();
1787 tmax = maxvr.max ();
1793 if (vr->varying_p () || vr->undefined_p ())
1795 min = tmin;
1796 max = tmax;
1798 /* For VARYING or UNDEFINED ranges, just about anything we get
1799 from scalar evolutions should be better. */
1801 if (dir == EV_DIR_DECREASES)
1802 max = init;
1803 else
1804 min = init;
1806 else if (vr->kind () == VR_RANGE)
1808 min = vr->min ();
1809 max = vr->max ();
1811 if (dir == EV_DIR_DECREASES)
1813 /* INIT is the maximum value. If INIT is lower than VR->MAX ()
1814 but no smaller than VR->MIN (), set VR->MAX () to INIT. */
1815 if (compare_values (init, max) == -1)
1816 max = init;
1818 /* According to the loop information, the variable does not
1819 overflow. */
1820 if (compare_values (min, tmin) == -1)
1821 min = tmin;
1824 else
1826 /* If INIT is bigger than VR->MIN (), set VR->MIN () to INIT. */
1827 if (compare_values (init, min) == 1)
1828 min = init;
1830 if (compare_values (tmax, max) == -1)
1831 max = tmax;
1834 else
1835 return;
1837 /* If we just created an invalid range with the minimum
1838 greater than the maximum, we fail conservatively.
1839 This should happen only in unreachable
1840 parts of code, or for invalid programs. */
1841 if (compare_values (min, max) == 1)
1842 return;
1844 /* Even for valid range info, sometimes overflow flag will leak in.
1845 As GIMPLE IL should have no constants with TREE_OVERFLOW set, we
1846 drop them. */
1847 if (TREE_OVERFLOW_P (min))
1848 min = drop_tree_overflow (min);
1849 if (TREE_OVERFLOW_P (max))
1850 max = drop_tree_overflow (max);
1852 vr->update (VR_RANGE, min, max);
1855 /* Dump value ranges of all SSA_NAMEs to FILE. */
1857 void
1858 vr_values::dump_all_value_ranges (FILE *file)
1860 size_t i;
1862 for (i = 0; i < num_vr_values; i++)
1864 if (vr_value[i])
1866 print_generic_expr (file, ssa_name (i));
1867 fprintf (file, ": ");
1868 dump_value_range (file, vr_value[i]);
1869 fprintf (file, "\n");
1873 fprintf (file, "\n");
1876 /* Initialize VRP lattice. */
1878 vr_values::vr_values () : vrp_value_range_pool ("Tree VRP value ranges")
1880 values_propagated = false;
1881 num_vr_values = num_ssa_names;
1882 vr_value = XCNEWVEC (value_range *, num_vr_values);
1883 vr_phi_edge_counts = XCNEWVEC (int, num_ssa_names);
1884 bitmap_obstack_initialize (&vrp_equiv_obstack);
1885 to_remove_edges = vNULL;
1886 to_update_switch_stmts = vNULL;
1889 /* Free VRP lattice. */
1891 vr_values::~vr_values ()
1893 /* Free allocated memory. */
1894 free (vr_value);
1895 free (vr_phi_edge_counts);
1896 bitmap_obstack_release (&vrp_equiv_obstack);
1897 vrp_value_range_pool.release ();
1899 /* So that we can distinguish between VRP data being available
1900 and not available. */
1901 vr_value = NULL;
1902 vr_phi_edge_counts = NULL;
1904 /* If there are entries left in TO_REMOVE_EDGES or TO_UPDATE_SWITCH_STMTS
1905 then an EVRP client did not clean up properly. Catch it now rather
1906 than seeing something more obscure later. */
1907 gcc_assert (to_remove_edges.is_empty ()
1908 && to_update_switch_stmts.is_empty ());
1912 /* A hack. */
1913 static class vr_values *x_vr_values;
1915 /* Return the singleton value-range for NAME or NAME. */
1917 static inline tree
1918 vrp_valueize (tree name)
1920 if (TREE_CODE (name) == SSA_NAME)
1922 value_range *vr = x_vr_values->get_value_range (name);
1923 if (vr->kind () == VR_RANGE
1924 && (TREE_CODE (vr->min ()) == SSA_NAME
1925 || is_gimple_min_invariant (vr->min ()))
1926 && vrp_operand_equal_p (vr->min (), vr->max ()))
1927 return vr->min ();
1929 return name;
1932 /* Return the singleton value-range for NAME if that is a constant
1933 but signal to not follow SSA edges. */
1935 static inline tree
1936 vrp_valueize_1 (tree name)
1938 if (TREE_CODE (name) == SSA_NAME)
1940 /* If the definition may be simulated again we cannot follow
1941 this SSA edge as the SSA propagator does not necessarily
1942 re-visit the use. */
1943 gimple *def_stmt = SSA_NAME_DEF_STMT (name);
1944 if (!gimple_nop_p (def_stmt)
1945 && prop_simulate_again_p (def_stmt))
1946 return NULL_TREE;
1947 value_range *vr = x_vr_values->get_value_range (name);
1948 tree singleton;
1949 if (vr->singleton_p (&singleton))
1950 return singleton;
1952 return name;
1955 /* Given STMT, an assignment or call, return its LHS if the type
1956 of the LHS is suitable for VRP analysis, else return NULL_TREE. */
1958 tree
1959 get_output_for_vrp (gimple *stmt)
1961 if (!is_gimple_assign (stmt) && !is_gimple_call (stmt))
1962 return NULL_TREE;
1964 /* We only keep track of ranges in integral and pointer types. */
1965 tree lhs = gimple_get_lhs (stmt);
1966 if (TREE_CODE (lhs) == SSA_NAME
1967 && ((INTEGRAL_TYPE_P (TREE_TYPE (lhs))
1968 /* It is valid to have NULL MIN/MAX values on a type. See
1969 build_range_type. */
1970 && TYPE_MIN_VALUE (TREE_TYPE (lhs))
1971 && TYPE_MAX_VALUE (TREE_TYPE (lhs)))
1972 || POINTER_TYPE_P (TREE_TYPE (lhs))))
1973 return lhs;
1975 return NULL_TREE;
1978 /* Visit assignment STMT. If it produces an interesting range, record
1979 the range in VR and set LHS to OUTPUT_P. */
1981 void
1982 vr_values::vrp_visit_assignment_or_call (gimple *stmt, tree *output_p,
1983 value_range *vr)
1985 tree lhs = get_output_for_vrp (stmt);
1986 *output_p = lhs;
1988 /* We only keep track of ranges in integral and pointer types. */
1989 if (lhs)
1991 enum gimple_code code = gimple_code (stmt);
1993 /* Try folding the statement to a constant first. */
1994 x_vr_values = this;
1995 tree tem = gimple_fold_stmt_to_constant_1 (stmt, vrp_valueize,
1996 vrp_valueize_1);
1997 x_vr_values = NULL;
1998 if (tem)
2000 if (TREE_CODE (tem) == SSA_NAME
2001 && (SSA_NAME_IS_DEFAULT_DEF (tem)
2002 || ! prop_simulate_again_p (SSA_NAME_DEF_STMT (tem))))
2004 extract_range_from_ssa_name (vr, tem);
2005 return;
2007 else if (is_gimple_min_invariant (tem))
2009 set_value_range_to_value (vr, tem, NULL);
2010 return;
2013 /* Then dispatch to value-range extracting functions. */
2014 if (code == GIMPLE_CALL)
2015 extract_range_basic (vr, stmt);
2016 else
2017 extract_range_from_assignment (vr, as_a <gassign *> (stmt));
2021 /* Helper that gets the value range of the SSA_NAME with version I
2022 or a symbolic range containing the SSA_NAME only if the value range
2023 is varying or undefined. */
2025 value_range
2026 vr_values::get_vr_for_comparison (int i)
2028 value_range vr = *get_value_range (ssa_name (i));
2030 /* If name N_i does not have a valid range, use N_i as its own
2031 range. This allows us to compare against names that may
2032 have N_i in their ranges. */
2033 if (vr.varying_p () || vr.undefined_p ())
2034 vr = value_range (VR_RANGE, ssa_name (i), ssa_name (i), NULL);
2036 return vr;
2039 /* Compare all the value ranges for names equivalent to VAR with VAL
2040 using comparison code COMP. Return the same value returned by
2041 compare_range_with_value, including the setting of
2042 *STRICT_OVERFLOW_P. */
2044 tree
2045 vr_values::compare_name_with_value (enum tree_code comp, tree var, tree val,
2046 bool *strict_overflow_p, bool use_equiv_p)
2048 bitmap_iterator bi;
2049 unsigned i;
2050 bitmap e;
2051 tree retval, t;
2052 int used_strict_overflow;
2053 bool sop;
2054 value_range equiv_vr;
2056 /* Get the set of equivalences for VAR. */
2057 e = get_value_range (var)->equiv ();
2059 /* Start at -1. Set it to 0 if we do a comparison without relying
2060 on overflow, or 1 if all comparisons rely on overflow. */
2061 used_strict_overflow = -1;
2063 /* Compare vars' value range with val. */
2064 equiv_vr = get_vr_for_comparison (SSA_NAME_VERSION (var));
2065 sop = false;
2066 retval = compare_range_with_value (comp, &equiv_vr, val, &sop);
2067 if (retval)
2068 used_strict_overflow = sop ? 1 : 0;
2070 /* If the equiv set is empty we have done all work we need to do. */
2071 if (e == NULL)
2073 if (retval
2074 && used_strict_overflow > 0)
2075 *strict_overflow_p = true;
2076 return retval;
2079 EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
2081 tree name = ssa_name (i);
2082 if (! name)
2083 continue;
2085 if (! use_equiv_p
2086 && ! SSA_NAME_IS_DEFAULT_DEF (name)
2087 && prop_simulate_again_p (SSA_NAME_DEF_STMT (name)))
2088 continue;
2090 equiv_vr = get_vr_for_comparison (i);
2091 sop = false;
2092 t = compare_range_with_value (comp, &equiv_vr, val, &sop);
2093 if (t)
2095 /* If we get different answers from different members
2096 of the equivalence set this check must be in a dead
2097 code region. Folding it to a trap representation
2098 would be correct here. For now just return don't-know. */
2099 if (retval != NULL
2100 && t != retval)
2102 retval = NULL_TREE;
2103 break;
2105 retval = t;
2107 if (!sop)
2108 used_strict_overflow = 0;
2109 else if (used_strict_overflow < 0)
2110 used_strict_overflow = 1;
2114 if (retval
2115 && used_strict_overflow > 0)
2116 *strict_overflow_p = true;
2118 return retval;
2122 /* Given a comparison code COMP and names N1 and N2, compare all the
2123 ranges equivalent to N1 against all the ranges equivalent to N2
2124 to determine the value of N1 COMP N2. Return the same value
2125 returned by compare_ranges. Set *STRICT_OVERFLOW_P to indicate
2126 whether we relied on undefined signed overflow in the comparison. */
2129 tree
2130 vr_values::compare_names (enum tree_code comp, tree n1, tree n2,
2131 bool *strict_overflow_p)
2133 tree t, retval;
2134 bitmap e1, e2;
2135 bitmap_iterator bi1, bi2;
2136 unsigned i1, i2;
2137 int used_strict_overflow;
2138 static bitmap_obstack *s_obstack = NULL;
2139 static bitmap s_e1 = NULL, s_e2 = NULL;
2141 /* Compare the ranges of every name equivalent to N1 against the
2142 ranges of every name equivalent to N2. */
2143 e1 = get_value_range (n1)->equiv ();
2144 e2 = get_value_range (n2)->equiv ();
2146 /* Use the fake bitmaps if e1 or e2 are not available. */
2147 if (s_obstack == NULL)
2149 s_obstack = XNEW (bitmap_obstack);
2150 bitmap_obstack_initialize (s_obstack);
2151 s_e1 = BITMAP_ALLOC (s_obstack);
2152 s_e2 = BITMAP_ALLOC (s_obstack);
2154 if (e1 == NULL)
2155 e1 = s_e1;
2156 if (e2 == NULL)
2157 e2 = s_e2;
2159 /* Add N1 and N2 to their own set of equivalences to avoid
2160 duplicating the body of the loop just to check N1 and N2
2161 ranges. */
2162 bitmap_set_bit (e1, SSA_NAME_VERSION (n1));
2163 bitmap_set_bit (e2, SSA_NAME_VERSION (n2));
2165 /* If the equivalence sets have a common intersection, then the two
2166 names can be compared without checking their ranges. */
2167 if (bitmap_intersect_p (e1, e2))
2169 bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
2170 bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
2172 return (comp == EQ_EXPR || comp == GE_EXPR || comp == LE_EXPR)
2173 ? boolean_true_node
2174 : boolean_false_node;
2177 /* Start at -1. Set it to 0 if we do a comparison without relying
2178 on overflow, or 1 if all comparisons rely on overflow. */
2179 used_strict_overflow = -1;
2181 /* Otherwise, compare all the equivalent ranges. First, add N1 and
2182 N2 to their own set of equivalences to avoid duplicating the body
2183 of the loop just to check N1 and N2 ranges. */
2184 EXECUTE_IF_SET_IN_BITMAP (e1, 0, i1, bi1)
2186 if (! ssa_name (i1))
2187 continue;
2189 value_range vr1 = get_vr_for_comparison (i1);
2191 t = retval = NULL_TREE;
2192 EXECUTE_IF_SET_IN_BITMAP (e2, 0, i2, bi2)
2194 if (! ssa_name (i2))
2195 continue;
2197 bool sop = false;
2199 value_range vr2 = get_vr_for_comparison (i2);
2201 t = compare_ranges (comp, &vr1, &vr2, &sop);
2202 if (t)
2204 /* If we get different answers from different members
2205 of the equivalence set this check must be in a dead
2206 code region. Folding it to a trap representation
2207 would be correct here. For now just return don't-know. */
2208 if (retval != NULL
2209 && t != retval)
2211 bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
2212 bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
2213 return NULL_TREE;
2215 retval = t;
2217 if (!sop)
2218 used_strict_overflow = 0;
2219 else if (used_strict_overflow < 0)
2220 used_strict_overflow = 1;
2224 if (retval)
2226 bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
2227 bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
2228 if (used_strict_overflow > 0)
2229 *strict_overflow_p = true;
2230 return retval;
2234 /* None of the equivalent ranges are useful in computing this
2235 comparison. */
2236 bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
2237 bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
2238 return NULL_TREE;
2241 /* Helper function for vrp_evaluate_conditional_warnv & other
2242 optimizers. */
2244 tree
2245 vr_values::vrp_evaluate_conditional_warnv_with_ops_using_ranges
2246 (enum tree_code code, tree op0, tree op1, bool * strict_overflow_p)
2248 value_range *vr0, *vr1;
2250 vr0 = (TREE_CODE (op0) == SSA_NAME) ? get_value_range (op0) : NULL;
2251 vr1 = (TREE_CODE (op1) == SSA_NAME) ? get_value_range (op1) : NULL;
2253 tree res = NULL_TREE;
2254 if (vr0 && vr1)
2255 res = compare_ranges (code, vr0, vr1, strict_overflow_p);
2256 if (!res && vr0)
2257 res = compare_range_with_value (code, vr0, op1, strict_overflow_p);
2258 if (!res && vr1)
2259 res = (compare_range_with_value
2260 (swap_tree_comparison (code), vr1, op0, strict_overflow_p));
2261 return res;
2264 /* Helper function for vrp_evaluate_conditional_warnv. */
2266 tree
2267 vr_values::vrp_evaluate_conditional_warnv_with_ops (enum tree_code code,
2268 tree op0, tree op1,
2269 bool use_equiv_p,
2270 bool *strict_overflow_p,
2271 bool *only_ranges)
2273 tree ret;
2274 if (only_ranges)
2275 *only_ranges = true;
2277 /* We only deal with integral and pointer types. */
2278 if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
2279 && !POINTER_TYPE_P (TREE_TYPE (op0)))
2280 return NULL_TREE;
2282 /* If OP0 CODE OP1 is an overflow comparison, if it can be expressed
2283 as a simple equality test, then prefer that over its current form
2284 for evaluation.
2286 An overflow test which collapses to an equality test can always be
2287 expressed as a comparison of one argument against zero. Overflow
2288 occurs when the chosen argument is zero and does not occur if the
2289 chosen argument is not zero. */
2290 tree x;
2291 if (overflow_comparison_p (code, op0, op1, use_equiv_p, &x))
2293 wide_int max = wi::max_value (TYPE_PRECISION (TREE_TYPE (op0)), UNSIGNED);
2294 /* B = A - 1; if (A < B) -> B = A - 1; if (A == 0)
2295 B = A - 1; if (A > B) -> B = A - 1; if (A != 0)
2296 B = A + 1; if (B < A) -> B = A + 1; if (B == 0)
2297 B = A + 1; if (B > A) -> B = A + 1; if (B != 0) */
2298 if (integer_zerop (x))
2300 op1 = x;
2301 code = (code == LT_EXPR || code == LE_EXPR) ? EQ_EXPR : NE_EXPR;
2303 /* B = A + 1; if (A > B) -> B = A + 1; if (B == 0)
2304 B = A + 1; if (A < B) -> B = A + 1; if (B != 0)
2305 B = A - 1; if (B > A) -> B = A - 1; if (A == 0)
2306 B = A - 1; if (B < A) -> B = A - 1; if (A != 0) */
2307 else if (wi::to_wide (x) == max - 1)
2309 op0 = op1;
2310 op1 = wide_int_to_tree (TREE_TYPE (op0), 0);
2311 code = (code == GT_EXPR || code == GE_EXPR) ? EQ_EXPR : NE_EXPR;
2315 if ((ret = vrp_evaluate_conditional_warnv_with_ops_using_ranges
2316 (code, op0, op1, strict_overflow_p)))
2317 return ret;
2318 if (only_ranges)
2319 *only_ranges = false;
2320 /* Do not use compare_names during propagation, it's quadratic. */
2321 if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME
2322 && use_equiv_p)
2323 return compare_names (code, op0, op1, strict_overflow_p);
2324 else if (TREE_CODE (op0) == SSA_NAME)
2325 return compare_name_with_value (code, op0, op1,
2326 strict_overflow_p, use_equiv_p);
2327 else if (TREE_CODE (op1) == SSA_NAME)
2328 return compare_name_with_value (swap_tree_comparison (code), op1, op0,
2329 strict_overflow_p, use_equiv_p);
2330 return NULL_TREE;
2333 /* Given (CODE OP0 OP1) within STMT, try to simplify it based on value range
2334 information. Return NULL if the conditional can not be evaluated.
2335 The ranges of all the names equivalent with the operands in COND
2336 will be used when trying to compute the value. If the result is
2337 based on undefined signed overflow, issue a warning if
2338 appropriate. */
2340 tree
2341 vr_values::vrp_evaluate_conditional (tree_code code, tree op0,
2342 tree op1, gimple *stmt)
2344 bool sop;
2345 tree ret;
2346 bool only_ranges;
2348 /* Some passes and foldings leak constants with overflow flag set
2349 into the IL. Avoid doing wrong things with these and bail out. */
2350 if ((TREE_CODE (op0) == INTEGER_CST
2351 && TREE_OVERFLOW (op0))
2352 || (TREE_CODE (op1) == INTEGER_CST
2353 && TREE_OVERFLOW (op1)))
2354 return NULL_TREE;
2356 sop = false;
2357 ret = vrp_evaluate_conditional_warnv_with_ops (code, op0, op1, true, &sop,
2358 &only_ranges);
2360 if (ret && sop)
2362 enum warn_strict_overflow_code wc;
2363 const char* warnmsg;
2365 if (is_gimple_min_invariant (ret))
2367 wc = WARN_STRICT_OVERFLOW_CONDITIONAL;
2368 warnmsg = G_("assuming signed overflow does not occur when "
2369 "simplifying conditional to constant");
2371 else
2373 wc = WARN_STRICT_OVERFLOW_COMPARISON;
2374 warnmsg = G_("assuming signed overflow does not occur when "
2375 "simplifying conditional");
2378 if (issue_strict_overflow_warning (wc))
2380 location_t location;
2382 if (!gimple_has_location (stmt))
2383 location = input_location;
2384 else
2385 location = gimple_location (stmt);
2386 warning_at (location, OPT_Wstrict_overflow, "%s", warnmsg);
2390 if (warn_type_limits
2391 && ret && only_ranges
2392 && TREE_CODE_CLASS (code) == tcc_comparison
2393 && TREE_CODE (op0) == SSA_NAME)
2395 /* If the comparison is being folded and the operand on the LHS
2396 is being compared against a constant value that is outside of
2397 the natural range of OP0's type, then the predicate will
2398 always fold regardless of the value of OP0. If -Wtype-limits
2399 was specified, emit a warning. */
2400 tree type = TREE_TYPE (op0);
2401 value_range *vr0 = get_value_range (op0);
2403 if (vr0->kind () == VR_RANGE
2404 && INTEGRAL_TYPE_P (type)
2405 && vrp_val_is_min (vr0->min ())
2406 && vrp_val_is_max (vr0->max ())
2407 && is_gimple_min_invariant (op1))
2409 location_t location;
2411 if (!gimple_has_location (stmt))
2412 location = input_location;
2413 else
2414 location = gimple_location (stmt);
2416 warning_at (location, OPT_Wtype_limits,
2417 integer_zerop (ret)
2418 ? G_("comparison always false "
2419 "due to limited range of data type")
2420 : G_("comparison always true "
2421 "due to limited range of data type"));
2425 return ret;
2429 /* Visit conditional statement STMT. If we can determine which edge
2430 will be taken out of STMT's basic block, record it in
2431 *TAKEN_EDGE_P. Otherwise, set *TAKEN_EDGE_P to NULL. */
2433 void
2434 vr_values::vrp_visit_cond_stmt (gcond *stmt, edge *taken_edge_p)
2436 tree val;
2438 *taken_edge_p = NULL;
2440 if (dump_file && (dump_flags & TDF_DETAILS))
2442 tree use;
2443 ssa_op_iter i;
2445 fprintf (dump_file, "\nVisiting conditional with predicate: ");
2446 print_gimple_stmt (dump_file, stmt, 0);
2447 fprintf (dump_file, "\nWith known ranges\n");
2449 FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
2451 fprintf (dump_file, "\t");
2452 print_generic_expr (dump_file, use);
2453 fprintf (dump_file, ": ");
2454 dump_value_range (dump_file, vr_value[SSA_NAME_VERSION (use)]);
2457 fprintf (dump_file, "\n");
2460 /* Compute the value of the predicate COND by checking the known
2461 ranges of each of its operands.
2463 Note that we cannot evaluate all the equivalent ranges here
2464 because those ranges may not yet be final and with the current
2465 propagation strategy, we cannot determine when the value ranges
2466 of the names in the equivalence set have changed.
2468 For instance, given the following code fragment
2470 i_5 = PHI <8, i_13>
2472 i_14 = ASSERT_EXPR <i_5, i_5 != 0>
2473 if (i_14 == 1)
2476 Assume that on the first visit to i_14, i_5 has the temporary
2477 range [8, 8] because the second argument to the PHI function is
2478 not yet executable. We derive the range ~[0, 0] for i_14 and the
2479 equivalence set { i_5 }. So, when we visit 'if (i_14 == 1)' for
2480 the first time, since i_14 is equivalent to the range [8, 8], we
2481 determine that the predicate is always false.
2483 On the next round of propagation, i_13 is determined to be
2484 VARYING, which causes i_5 to drop down to VARYING. So, another
2485 visit to i_14 is scheduled. In this second visit, we compute the
2486 exact same range and equivalence set for i_14, namely ~[0, 0] and
2487 { i_5 }. But we did not have the previous range for i_5
2488 registered, so vrp_visit_assignment thinks that the range for
2489 i_14 has not changed. Therefore, the predicate 'if (i_14 == 1)'
2490 is not visited again, which stops propagation from visiting
2491 statements in the THEN clause of that if().
2493 To properly fix this we would need to keep the previous range
2494 value for the names in the equivalence set. This way we would've
2495 discovered that from one visit to the other i_5 changed from
2496 range [8, 8] to VR_VARYING.
2498 However, fixing this apparent limitation may not be worth the
2499 additional checking. Testing on several code bases (GCC, DLV,
2500 MICO, TRAMP3D and SPEC2000) showed that doing this results in
2501 4 more predicates folded in SPEC. */
2503 bool sop;
2504 val = vrp_evaluate_conditional_warnv_with_ops (gimple_cond_code (stmt),
2505 gimple_cond_lhs (stmt),
2506 gimple_cond_rhs (stmt),
2507 false, &sop, NULL);
2508 if (val)
2509 *taken_edge_p = find_taken_edge (gimple_bb (stmt), val);
2511 if (dump_file && (dump_flags & TDF_DETAILS))
2513 fprintf (dump_file, "\nPredicate evaluates to: ");
2514 if (val == NULL_TREE)
2515 fprintf (dump_file, "DON'T KNOW\n");
2516 else
2517 print_generic_stmt (dump_file, val);
2521 /* Searches the case label vector VEC for the ranges of CASE_LABELs that are
2522 used in range VR. The indices are placed in MIN_IDX1, MAX_IDX, MIN_IDX2 and
2523 MAX_IDX2. If the ranges of CASE_LABELs are empty then MAX_IDX1 < MIN_IDX1.
2524 Returns true if the default label is not needed. */
2526 static bool
2527 find_case_label_ranges (gswitch *stmt, value_range *vr, size_t *min_idx1,
2528 size_t *max_idx1, size_t *min_idx2,
2529 size_t *max_idx2)
2531 size_t i, j, k, l;
2532 unsigned int n = gimple_switch_num_labels (stmt);
2533 bool take_default;
2534 tree case_low, case_high;
2535 tree min = vr->min (), max = vr->max ();
2537 gcc_checking_assert (!vr->varying_p () && !vr->undefined_p ());
2539 take_default = !find_case_label_range (stmt, min, max, &i, &j);
2541 /* Set second range to emtpy. */
2542 *min_idx2 = 1;
2543 *max_idx2 = 0;
2545 if (vr->kind () == VR_RANGE)
2547 *min_idx1 = i;
2548 *max_idx1 = j;
2549 return !take_default;
2552 /* Set first range to all case labels. */
2553 *min_idx1 = 1;
2554 *max_idx1 = n - 1;
2556 if (i > j)
2557 return false;
2559 /* Make sure all the values of case labels [i , j] are contained in
2560 range [MIN, MAX]. */
2561 case_low = CASE_LOW (gimple_switch_label (stmt, i));
2562 case_high = CASE_HIGH (gimple_switch_label (stmt, j));
2563 if (tree_int_cst_compare (case_low, min) < 0)
2564 i += 1;
2565 if (case_high != NULL_TREE
2566 && tree_int_cst_compare (max, case_high) < 0)
2567 j -= 1;
2569 if (i > j)
2570 return false;
2572 /* If the range spans case labels [i, j], the corresponding anti-range spans
2573 the labels [1, i - 1] and [j + 1, n - 1]. */
2574 k = j + 1;
2575 l = n - 1;
2576 if (k > l)
2578 k = 1;
2579 l = 0;
2582 j = i - 1;
2583 i = 1;
2584 if (i > j)
2586 i = k;
2587 j = l;
2588 k = 1;
2589 l = 0;
2592 *min_idx1 = i;
2593 *max_idx1 = j;
2594 *min_idx2 = k;
2595 *max_idx2 = l;
2596 return false;
2599 /* Visit switch statement STMT. If we can determine which edge
2600 will be taken out of STMT's basic block, record it in
2601 *TAKEN_EDGE_P. Otherwise, *TAKEN_EDGE_P set to NULL. */
2603 void
2604 vr_values::vrp_visit_switch_stmt (gswitch *stmt, edge *taken_edge_p)
2606 tree op, val;
2607 value_range *vr;
2608 size_t i = 0, j = 0, k, l;
2609 bool take_default;
2611 *taken_edge_p = NULL;
2612 op = gimple_switch_index (stmt);
2613 if (TREE_CODE (op) != SSA_NAME)
2614 return;
2616 vr = get_value_range (op);
2617 if (dump_file && (dump_flags & TDF_DETAILS))
2619 fprintf (dump_file, "\nVisiting switch expression with operand ");
2620 print_generic_expr (dump_file, op);
2621 fprintf (dump_file, " with known range ");
2622 dump_value_range (dump_file, vr);
2623 fprintf (dump_file, "\n");
2626 if (vr->undefined_p ()
2627 || vr->varying_p ()
2628 || vr->symbolic_p ())
2629 return;
2631 /* Find the single edge that is taken from the switch expression. */
2632 take_default = !find_case_label_ranges (stmt, vr, &i, &j, &k, &l);
2634 /* Check if the range spans no CASE_LABEL. If so, we only reach the default
2635 label */
2636 if (j < i)
2638 gcc_assert (take_default);
2639 val = gimple_switch_default_label (stmt);
2641 else
2643 /* Check if labels with index i to j and maybe the default label
2644 are all reaching the same label. */
2646 val = gimple_switch_label (stmt, i);
2647 if (take_default
2648 && CASE_LABEL (gimple_switch_default_label (stmt))
2649 != CASE_LABEL (val))
2651 if (dump_file && (dump_flags & TDF_DETAILS))
2652 fprintf (dump_file, " not a single destination for this "
2653 "range\n");
2654 return;
2656 for (++i; i <= j; ++i)
2658 if (CASE_LABEL (gimple_switch_label (stmt, i)) != CASE_LABEL (val))
2660 if (dump_file && (dump_flags & TDF_DETAILS))
2661 fprintf (dump_file, " not a single destination for this "
2662 "range\n");
2663 return;
2666 for (; k <= l; ++k)
2668 if (CASE_LABEL (gimple_switch_label (stmt, k)) != CASE_LABEL (val))
2670 if (dump_file && (dump_flags & TDF_DETAILS))
2671 fprintf (dump_file, " not a single destination for this "
2672 "range\n");
2673 return;
2678 *taken_edge_p = find_edge (gimple_bb (stmt),
2679 label_to_block (cfun, CASE_LABEL (val)));
2681 if (dump_file && (dump_flags & TDF_DETAILS))
2683 fprintf (dump_file, " will take edge to ");
2684 print_generic_stmt (dump_file, CASE_LABEL (val));
2689 /* Evaluate statement STMT. If the statement produces a useful range,
2690 set VR and corepsponding OUTPUT_P.
2692 If STMT is a conditional branch and we can determine its truth
2693 value, the taken edge is recorded in *TAKEN_EDGE_P. */
2695 void
2696 vr_values::extract_range_from_stmt (gimple *stmt, edge *taken_edge_p,
2697 tree *output_p, value_range *vr)
2700 if (dump_file && (dump_flags & TDF_DETAILS))
2702 fprintf (dump_file, "\nVisiting statement:\n");
2703 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
2706 if (!stmt_interesting_for_vrp (stmt))
2707 gcc_assert (stmt_ends_bb_p (stmt));
2708 else if (is_gimple_assign (stmt) || is_gimple_call (stmt))
2709 vrp_visit_assignment_or_call (stmt, output_p, vr);
2710 else if (gimple_code (stmt) == GIMPLE_COND)
2711 vrp_visit_cond_stmt (as_a <gcond *> (stmt), taken_edge_p);
2712 else if (gimple_code (stmt) == GIMPLE_SWITCH)
2713 vrp_visit_switch_stmt (as_a <gswitch *> (stmt), taken_edge_p);
2716 /* Visit all arguments for PHI node PHI that flow through executable
2717 edges. If a valid value range can be derived from all the incoming
2718 value ranges, set a new range in VR_RESULT. */
2720 void
2721 vr_values::extract_range_from_phi_node (gphi *phi, value_range *vr_result)
2723 size_t i;
2724 tree lhs = PHI_RESULT (phi);
2725 value_range *lhs_vr = get_value_range (lhs);
2726 bool first = true;
2727 int edges, old_edges;
2728 struct loop *l;
2730 if (dump_file && (dump_flags & TDF_DETAILS))
2732 fprintf (dump_file, "\nVisiting PHI node: ");
2733 print_gimple_stmt (dump_file, phi, 0, dump_flags);
2736 bool may_simulate_backedge_again = false;
2737 edges = 0;
2738 for (i = 0; i < gimple_phi_num_args (phi); i++)
2740 edge e = gimple_phi_arg_edge (phi, i);
2742 if (dump_file && (dump_flags & TDF_DETAILS))
2744 fprintf (dump_file,
2745 " Argument #%d (%d -> %d %sexecutable)\n",
2746 (int) i, e->src->index, e->dest->index,
2747 (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
2750 if (e->flags & EDGE_EXECUTABLE)
2752 tree arg = PHI_ARG_DEF (phi, i);
2753 value_range vr_arg;
2755 ++edges;
2757 if (TREE_CODE (arg) == SSA_NAME)
2759 /* See if we are eventually going to change one of the args. */
2760 gimple *def_stmt = SSA_NAME_DEF_STMT (arg);
2761 if (! gimple_nop_p (def_stmt)
2762 && prop_simulate_again_p (def_stmt)
2763 && e->flags & EDGE_DFS_BACK)
2764 may_simulate_backedge_again = true;
2766 vr_arg = *(get_value_range (arg));
2767 /* Do not allow equivalences or symbolic ranges to leak in from
2768 backedges. That creates invalid equivalencies.
2769 See PR53465 and PR54767. */
2770 if (e->flags & EDGE_DFS_BACK)
2772 if (!vr_arg.varying_p () && !vr_arg.undefined_p ())
2774 vr_arg.equiv_clear ();
2775 if (vr_arg.symbolic_p ())
2776 vr_arg.set_varying ();
2779 /* If the non-backedge arguments range is VR_VARYING then
2780 we can still try recording a simple equivalence. */
2781 else if (vr_arg.varying_p ())
2782 vr_arg = value_range (VR_RANGE, arg, arg, NULL);
2784 else
2786 if (TREE_OVERFLOW_P (arg))
2787 arg = drop_tree_overflow (arg);
2789 vr_arg = value_range (VR_RANGE, arg, arg);
2792 if (dump_file && (dump_flags & TDF_DETAILS))
2794 fprintf (dump_file, "\t");
2795 print_generic_expr (dump_file, arg, dump_flags);
2796 fprintf (dump_file, ": ");
2797 dump_value_range (dump_file, &vr_arg);
2798 fprintf (dump_file, "\n");
2801 if (first)
2802 vr_result->deep_copy (&vr_arg);
2803 else
2804 vr_result->union_ (&vr_arg);
2805 first = false;
2807 if (vr_result->varying_p ())
2808 break;
2812 if (vr_result->varying_p ())
2813 goto varying;
2814 else if (vr_result->undefined_p ())
2815 goto update_range;
2817 old_edges = vr_phi_edge_counts[SSA_NAME_VERSION (lhs)];
2818 vr_phi_edge_counts[SSA_NAME_VERSION (lhs)] = edges;
2820 /* To prevent infinite iterations in the algorithm, derive ranges
2821 when the new value is slightly bigger or smaller than the
2822 previous one. We don't do this if we have seen a new executable
2823 edge; this helps us avoid an infinity for conditionals
2824 which are not in a loop. If the old value-range was VR_UNDEFINED
2825 use the updated range and iterate one more time. If we will not
2826 simulate this PHI again via the backedge allow us to iterate. */
2827 if (edges > 0
2828 && gimple_phi_num_args (phi) > 1
2829 && edges == old_edges
2830 && !lhs_vr->undefined_p ()
2831 && may_simulate_backedge_again)
2833 /* Compare old and new ranges, fall back to varying if the
2834 values are not comparable. */
2835 int cmp_min = compare_values (lhs_vr->min (), vr_result->min ());
2836 if (cmp_min == -2)
2837 goto varying;
2838 int cmp_max = compare_values (lhs_vr->max (), vr_result->max ());
2839 if (cmp_max == -2)
2840 goto varying;
2842 /* For non VR_RANGE or for pointers fall back to varying if
2843 the range changed. */
2844 if ((lhs_vr->kind () != VR_RANGE || vr_result->kind () != VR_RANGE
2845 || POINTER_TYPE_P (TREE_TYPE (lhs)))
2846 && (cmp_min != 0 || cmp_max != 0))
2847 goto varying;
2849 /* If the new minimum is larger than the previous one
2850 retain the old value. If the new minimum value is smaller
2851 than the previous one and not -INF go all the way to -INF + 1.
2852 In the first case, to avoid infinite bouncing between different
2853 minimums, and in the other case to avoid iterating millions of
2854 times to reach -INF. Going to -INF + 1 also lets the following
2855 iteration compute whether there will be any overflow, at the
2856 expense of one additional iteration. */
2857 tree new_min = vr_result->min ();
2858 tree new_max = vr_result->max ();
2859 if (cmp_min < 0)
2860 new_min = lhs_vr->min ();
2861 else if (cmp_min > 0
2862 && !vrp_val_is_min (vr_result->min ()))
2863 new_min = int_const_binop (PLUS_EXPR,
2864 vrp_val_min (vr_result->type ()),
2865 build_int_cst (vr_result->type (), 1));
2867 /* Similarly for the maximum value. */
2868 if (cmp_max > 0)
2869 new_max = lhs_vr->max ();
2870 else if (cmp_max < 0
2871 && !vrp_val_is_max (vr_result->max ()))
2872 new_max = int_const_binop (MINUS_EXPR,
2873 vrp_val_max (vr_result->type ()),
2874 build_int_cst (vr_result->type (), 1));
2876 *vr_result = value_range (vr_result->kind (), new_min, new_max,
2877 vr_result->equiv ());
2879 /* If we dropped either bound to +-INF then if this is a loop
2880 PHI node SCEV may known more about its value-range. */
2881 if (cmp_min > 0 || cmp_min < 0
2882 || cmp_max < 0 || cmp_max > 0)
2883 goto scev_check;
2885 goto infinite_check;
2888 goto update_range;
2890 varying:
2891 set_value_range_to_varying (vr_result);
2893 scev_check:
2894 /* If this is a loop PHI node SCEV may known more about its value-range.
2895 scev_check can be reached from two paths, one is a fall through from above
2896 "varying" label, the other is direct goto from code block which tries to
2897 avoid infinite simulation. */
2898 if (scev_initialized_p ()
2899 && (l = loop_containing_stmt (phi))
2900 && l->header == gimple_bb (phi))
2901 adjust_range_with_scev (vr_result, l, phi, lhs);
2903 infinite_check:
2904 /* If we will end up with a (-INF, +INF) range, set it to
2905 VARYING. Same if the previous max value was invalid for
2906 the type and we end up with vr_result.min > vr_result.max. */
2907 if ((!vr_result->varying_p () && !vr_result->undefined_p ())
2908 && !((vrp_val_is_max (vr_result->max ()) && vrp_val_is_min (vr_result->min ()))
2909 || compare_values (vr_result->min (), vr_result->max ()) > 0))
2911 else
2912 set_value_range_to_varying (vr_result);
2914 /* If the new range is different than the previous value, keep
2915 iterating. */
2916 update_range:
2917 return;
2920 /* Simplify boolean operations if the source is known
2921 to be already a boolean. */
2922 bool
2923 vr_values::simplify_truth_ops_using_ranges (gimple_stmt_iterator *gsi,
2924 gimple *stmt)
2926 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
2927 tree lhs, op0, op1;
2928 bool need_conversion;
2930 /* We handle only !=/== case here. */
2931 gcc_assert (rhs_code == EQ_EXPR || rhs_code == NE_EXPR);
2933 op0 = gimple_assign_rhs1 (stmt);
2934 if (!op_with_boolean_value_range_p (op0))
2935 return false;
2937 op1 = gimple_assign_rhs2 (stmt);
2938 if (!op_with_boolean_value_range_p (op1))
2939 return false;
2941 /* Reduce number of cases to handle to NE_EXPR. As there is no
2942 BIT_XNOR_EXPR we cannot replace A == B with a single statement. */
2943 if (rhs_code == EQ_EXPR)
2945 if (TREE_CODE (op1) == INTEGER_CST)
2946 op1 = int_const_binop (BIT_XOR_EXPR, op1,
2947 build_int_cst (TREE_TYPE (op1), 1));
2948 else
2949 return false;
2952 lhs = gimple_assign_lhs (stmt);
2953 need_conversion
2954 = !useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (op0));
2956 /* Make sure to not sign-extend a 1-bit 1 when converting the result. */
2957 if (need_conversion
2958 && !TYPE_UNSIGNED (TREE_TYPE (op0))
2959 && TYPE_PRECISION (TREE_TYPE (op0)) == 1
2960 && TYPE_PRECISION (TREE_TYPE (lhs)) > 1)
2961 return false;
2963 /* For A != 0 we can substitute A itself. */
2964 if (integer_zerop (op1))
2965 gimple_assign_set_rhs_with_ops (gsi,
2966 need_conversion
2967 ? NOP_EXPR : TREE_CODE (op0), op0);
2968 /* For A != B we substitute A ^ B. Either with conversion. */
2969 else if (need_conversion)
2971 tree tem = make_ssa_name (TREE_TYPE (op0));
2972 gassign *newop
2973 = gimple_build_assign (tem, BIT_XOR_EXPR, op0, op1);
2974 gsi_insert_before (gsi, newop, GSI_SAME_STMT);
2975 if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
2976 && TYPE_PRECISION (TREE_TYPE (tem)) > 1)
2977 set_range_info (tem, VR_RANGE,
2978 wi::zero (TYPE_PRECISION (TREE_TYPE (tem))),
2979 wi::one (TYPE_PRECISION (TREE_TYPE (tem))));
2980 gimple_assign_set_rhs_with_ops (gsi, NOP_EXPR, tem);
2982 /* Or without. */
2983 else
2984 gimple_assign_set_rhs_with_ops (gsi, BIT_XOR_EXPR, op0, op1);
2985 update_stmt (gsi_stmt (*gsi));
2986 fold_stmt (gsi, follow_single_use_edges);
2988 return true;
2991 /* Simplify a division or modulo operator to a right shift or bitwise and
2992 if the first operand is unsigned or is greater than zero and the second
2993 operand is an exact power of two. For TRUNC_MOD_EXPR op0 % op1 with
2994 constant op1 (op1min = op1) or with op1 in [op1min, op1max] range,
2995 optimize it into just op0 if op0's range is known to be a subset of
2996 [-op1min + 1, op1min - 1] for signed and [0, op1min - 1] for unsigned
2997 modulo. */
2999 bool
3000 vr_values::simplify_div_or_mod_using_ranges (gimple_stmt_iterator *gsi,
3001 gimple *stmt)
3003 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3004 tree val = NULL;
3005 tree op0 = gimple_assign_rhs1 (stmt);
3006 tree op1 = gimple_assign_rhs2 (stmt);
3007 tree op0min = NULL_TREE, op0max = NULL_TREE;
3008 tree op1min = op1;
3009 value_range *vr = NULL;
3011 if (TREE_CODE (op0) == INTEGER_CST)
3013 op0min = op0;
3014 op0max = op0;
3016 else
3018 vr = get_value_range (op0);
3019 if (range_int_cst_p (vr))
3021 op0min = vr->min ();
3022 op0max = vr->max ();
3026 if (rhs_code == TRUNC_MOD_EXPR
3027 && TREE_CODE (op1) == SSA_NAME)
3029 value_range *vr1 = get_value_range (op1);
3030 if (range_int_cst_p (vr1))
3031 op1min = vr1->min ();
3033 if (rhs_code == TRUNC_MOD_EXPR
3034 && TREE_CODE (op1min) == INTEGER_CST
3035 && tree_int_cst_sgn (op1min) == 1
3036 && op0max
3037 && tree_int_cst_lt (op0max, op1min))
3039 if (TYPE_UNSIGNED (TREE_TYPE (op0))
3040 || tree_int_cst_sgn (op0min) >= 0
3041 || tree_int_cst_lt (fold_unary (NEGATE_EXPR, TREE_TYPE (op1min), op1min),
3042 op0min))
3044 /* If op0 already has the range op0 % op1 has,
3045 then TRUNC_MOD_EXPR won't change anything. */
3046 gimple_assign_set_rhs_from_tree (gsi, op0);
3047 return true;
3051 if (TREE_CODE (op0) != SSA_NAME)
3052 return false;
3054 if (!integer_pow2p (op1))
3056 /* X % -Y can be only optimized into X % Y either if
3057 X is not INT_MIN, or Y is not -1. Fold it now, as after
3058 remove_range_assertions the range info might be not available
3059 anymore. */
3060 if (rhs_code == TRUNC_MOD_EXPR
3061 && fold_stmt (gsi, follow_single_use_edges))
3062 return true;
3063 return false;
3066 if (TYPE_UNSIGNED (TREE_TYPE (op0)))
3067 val = integer_one_node;
3068 else
3070 bool sop = false;
3072 val = compare_range_with_value (GE_EXPR, vr, integer_zero_node, &sop);
3074 if (val
3075 && sop
3076 && integer_onep (val)
3077 && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
3079 location_t location;
3081 if (!gimple_has_location (stmt))
3082 location = input_location;
3083 else
3084 location = gimple_location (stmt);
3085 warning_at (location, OPT_Wstrict_overflow,
3086 "assuming signed overflow does not occur when "
3087 "simplifying %</%> or %<%%%> to %<>>%> or %<&%>");
3091 if (val && integer_onep (val))
3093 tree t;
3095 if (rhs_code == TRUNC_DIV_EXPR)
3097 t = build_int_cst (integer_type_node, tree_log2 (op1));
3098 gimple_assign_set_rhs_code (stmt, RSHIFT_EXPR);
3099 gimple_assign_set_rhs1 (stmt, op0);
3100 gimple_assign_set_rhs2 (stmt, t);
3102 else
3104 t = build_int_cst (TREE_TYPE (op1), 1);
3105 t = int_const_binop (MINUS_EXPR, op1, t);
3106 t = fold_convert (TREE_TYPE (op0), t);
3108 gimple_assign_set_rhs_code (stmt, BIT_AND_EXPR);
3109 gimple_assign_set_rhs1 (stmt, op0);
3110 gimple_assign_set_rhs2 (stmt, t);
3113 update_stmt (stmt);
3114 fold_stmt (gsi, follow_single_use_edges);
3115 return true;
3118 return false;
3121 /* Simplify a min or max if the ranges of the two operands are
3122 disjoint. Return true if we do simplify. */
3124 bool
3125 vr_values::simplify_min_or_max_using_ranges (gimple_stmt_iterator *gsi,
3126 gimple *stmt)
3128 tree op0 = gimple_assign_rhs1 (stmt);
3129 tree op1 = gimple_assign_rhs2 (stmt);
3130 bool sop = false;
3131 tree val;
3133 val = (vrp_evaluate_conditional_warnv_with_ops_using_ranges
3134 (LE_EXPR, op0, op1, &sop));
3135 if (!val)
3137 sop = false;
3138 val = (vrp_evaluate_conditional_warnv_with_ops_using_ranges
3139 (LT_EXPR, op0, op1, &sop));
3142 if (val)
3144 if (sop && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
3146 location_t location;
3148 if (!gimple_has_location (stmt))
3149 location = input_location;
3150 else
3151 location = gimple_location (stmt);
3152 warning_at (location, OPT_Wstrict_overflow,
3153 "assuming signed overflow does not occur when "
3154 "simplifying %<min/max (X,Y)%> to %<X%> or %<Y%>");
3157 /* VAL == TRUE -> OP0 < or <= op1
3158 VAL == FALSE -> OP0 > or >= op1. */
3159 tree res = ((gimple_assign_rhs_code (stmt) == MAX_EXPR)
3160 == integer_zerop (val)) ? op0 : op1;
3161 gimple_assign_set_rhs_from_tree (gsi, res);
3162 return true;
3165 return false;
3168 /* If the operand to an ABS_EXPR is >= 0, then eliminate the
3169 ABS_EXPR. If the operand is <= 0, then simplify the
3170 ABS_EXPR into a NEGATE_EXPR. */
3172 bool
3173 vr_values::simplify_abs_using_ranges (gimple_stmt_iterator *gsi, gimple *stmt)
3175 tree op = gimple_assign_rhs1 (stmt);
3176 value_range *vr = get_value_range (op);
3178 if (vr)
3180 tree val = NULL;
3181 bool sop = false;
3183 val = compare_range_with_value (LE_EXPR, vr, integer_zero_node, &sop);
3184 if (!val)
3186 /* The range is neither <= 0 nor > 0. Now see if it is
3187 either < 0 or >= 0. */
3188 sop = false;
3189 val = compare_range_with_value (LT_EXPR, vr, integer_zero_node,
3190 &sop);
3193 if (val)
3195 if (sop && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
3197 location_t location;
3199 if (!gimple_has_location (stmt))
3200 location = input_location;
3201 else
3202 location = gimple_location (stmt);
3203 warning_at (location, OPT_Wstrict_overflow,
3204 "assuming signed overflow does not occur when "
3205 "simplifying %<abs (X)%> to %<X%> or %<-X%>");
3208 gimple_assign_set_rhs1 (stmt, op);
3209 if (integer_zerop (val))
3210 gimple_assign_set_rhs_code (stmt, SSA_NAME);
3211 else
3212 gimple_assign_set_rhs_code (stmt, NEGATE_EXPR);
3213 update_stmt (stmt);
3214 fold_stmt (gsi, follow_single_use_edges);
3215 return true;
3219 return false;
3222 /* Optimize away redundant BIT_AND_EXPR and BIT_IOR_EXPR.
3223 If all the bits that are being cleared by & are already
3224 known to be zero from VR, or all the bits that are being
3225 set by | are already known to be one from VR, the bit
3226 operation is redundant. */
3228 bool
3229 vr_values::simplify_bit_ops_using_ranges (gimple_stmt_iterator *gsi,
3230 gimple *stmt)
3232 tree op0 = gimple_assign_rhs1 (stmt);
3233 tree op1 = gimple_assign_rhs2 (stmt);
3234 tree op = NULL_TREE;
3235 value_range vr0, vr1;
3236 wide_int may_be_nonzero0, may_be_nonzero1;
3237 wide_int must_be_nonzero0, must_be_nonzero1;
3238 wide_int mask;
3240 if (TREE_CODE (op0) == SSA_NAME)
3241 vr0 = *(get_value_range (op0));
3242 else if (is_gimple_min_invariant (op0))
3243 set_value_range_to_value (&vr0, op0, NULL);
3244 else
3245 return false;
3247 if (TREE_CODE (op1) == SSA_NAME)
3248 vr1 = *(get_value_range (op1));
3249 else if (is_gimple_min_invariant (op1))
3250 set_value_range_to_value (&vr1, op1, NULL);
3251 else
3252 return false;
3254 if (!vrp_set_zero_nonzero_bits (TREE_TYPE (op0), &vr0, &may_be_nonzero0,
3255 &must_be_nonzero0))
3256 return false;
3257 if (!vrp_set_zero_nonzero_bits (TREE_TYPE (op1), &vr1, &may_be_nonzero1,
3258 &must_be_nonzero1))
3259 return false;
3261 switch (gimple_assign_rhs_code (stmt))
3263 case BIT_AND_EXPR:
3264 mask = wi::bit_and_not (may_be_nonzero0, must_be_nonzero1);
3265 if (mask == 0)
3267 op = op0;
3268 break;
3270 mask = wi::bit_and_not (may_be_nonzero1, must_be_nonzero0);
3271 if (mask == 0)
3273 op = op1;
3274 break;
3276 break;
3277 case BIT_IOR_EXPR:
3278 mask = wi::bit_and_not (may_be_nonzero0, must_be_nonzero1);
3279 if (mask == 0)
3281 op = op1;
3282 break;
3284 mask = wi::bit_and_not (may_be_nonzero1, must_be_nonzero0);
3285 if (mask == 0)
3287 op = op0;
3288 break;
3290 break;
3291 default:
3292 gcc_unreachable ();
3295 if (op == NULL_TREE)
3296 return false;
3298 gimple_assign_set_rhs_with_ops (gsi, TREE_CODE (op), op);
3299 update_stmt (gsi_stmt (*gsi));
3300 return true;
3303 /* We are comparing trees OP0 and OP1 using COND_CODE. OP0 has
3304 a known value range VR.
3306 If there is one and only one value which will satisfy the
3307 conditional, then return that value. Else return NULL.
3309 If signed overflow must be undefined for the value to satisfy
3310 the conditional, then set *STRICT_OVERFLOW_P to true. */
3312 static tree
3313 test_for_singularity (enum tree_code cond_code, tree op0,
3314 tree op1, value_range *vr)
3316 tree min = NULL;
3317 tree max = NULL;
3319 /* Extract minimum/maximum values which satisfy the conditional as it was
3320 written. */
3321 if (cond_code == LE_EXPR || cond_code == LT_EXPR)
3323 min = TYPE_MIN_VALUE (TREE_TYPE (op0));
3325 max = op1;
3326 if (cond_code == LT_EXPR)
3328 tree one = build_int_cst (TREE_TYPE (op0), 1);
3329 max = fold_build2 (MINUS_EXPR, TREE_TYPE (op0), max, one);
3330 /* Signal to compare_values_warnv this expr doesn't overflow. */
3331 if (EXPR_P (max))
3332 TREE_NO_WARNING (max) = 1;
3335 else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
3337 max = TYPE_MAX_VALUE (TREE_TYPE (op0));
3339 min = op1;
3340 if (cond_code == GT_EXPR)
3342 tree one = build_int_cst (TREE_TYPE (op0), 1);
3343 min = fold_build2 (PLUS_EXPR, TREE_TYPE (op0), min, one);
3344 /* Signal to compare_values_warnv this expr doesn't overflow. */
3345 if (EXPR_P (min))
3346 TREE_NO_WARNING (min) = 1;
3350 /* Now refine the minimum and maximum values using any
3351 value range information we have for op0. */
3352 if (min && max)
3354 if (compare_values (vr->min (), min) == 1)
3355 min = vr->min ();
3356 if (compare_values (vr->max (), max) == -1)
3357 max = vr->max ();
3359 /* If the new min/max values have converged to a single value,
3360 then there is only one value which can satisfy the condition,
3361 return that value. */
3362 if (operand_equal_p (min, max, 0) && is_gimple_min_invariant (min))
3363 return min;
3365 return NULL;
3368 /* Return whether the value range *VR fits in an integer type specified
3369 by PRECISION and UNSIGNED_P. */
3371 static bool
3372 range_fits_type_p (value_range *vr, unsigned dest_precision, signop dest_sgn)
3374 tree src_type;
3375 unsigned src_precision;
3376 widest_int tem;
3377 signop src_sgn;
3379 /* We can only handle integral and pointer types. */
3380 src_type = vr->type ();
3381 if (!INTEGRAL_TYPE_P (src_type)
3382 && !POINTER_TYPE_P (src_type))
3383 return false;
3385 /* An extension is fine unless VR is SIGNED and dest_sgn is UNSIGNED,
3386 and so is an identity transform. */
3387 src_precision = TYPE_PRECISION (vr->type ());
3388 src_sgn = TYPE_SIGN (src_type);
3389 if ((src_precision < dest_precision
3390 && !(dest_sgn == UNSIGNED && src_sgn == SIGNED))
3391 || (src_precision == dest_precision && src_sgn == dest_sgn))
3392 return true;
3394 /* Now we can only handle ranges with constant bounds. */
3395 if (!range_int_cst_p (vr))
3396 return false;
3398 /* For sign changes, the MSB of the wide_int has to be clear.
3399 An unsigned value with its MSB set cannot be represented by
3400 a signed wide_int, while a negative value cannot be represented
3401 by an unsigned wide_int. */
3402 if (src_sgn != dest_sgn
3403 && (wi::lts_p (wi::to_wide (vr->min ()), 0)
3404 || wi::lts_p (wi::to_wide (vr->max ()), 0)))
3405 return false;
3407 /* Then we can perform the conversion on both ends and compare
3408 the result for equality. */
3409 tem = wi::ext (wi::to_widest (vr->min ()), dest_precision, dest_sgn);
3410 if (tem != wi::to_widest (vr->min ()))
3411 return false;
3412 tem = wi::ext (wi::to_widest (vr->max ()), dest_precision, dest_sgn);
3413 if (tem != wi::to_widest (vr->max ()))
3414 return false;
3416 return true;
3419 /* Simplify a conditional using a relational operator to an equality
3420 test if the range information indicates only one value can satisfy
3421 the original conditional. */
3423 bool
3424 vr_values::simplify_cond_using_ranges_1 (gcond *stmt)
3426 tree op0 = gimple_cond_lhs (stmt);
3427 tree op1 = gimple_cond_rhs (stmt);
3428 enum tree_code cond_code = gimple_cond_code (stmt);
3430 if (cond_code != NE_EXPR
3431 && cond_code != EQ_EXPR
3432 && TREE_CODE (op0) == SSA_NAME
3433 && INTEGRAL_TYPE_P (TREE_TYPE (op0))
3434 && is_gimple_min_invariant (op1))
3436 value_range *vr = get_value_range (op0);
3438 /* If we have range information for OP0, then we might be
3439 able to simplify this conditional. */
3440 if (vr->kind () == VR_RANGE)
3442 tree new_tree = test_for_singularity (cond_code, op0, op1, vr);
3443 if (new_tree)
3445 if (dump_file)
3447 fprintf (dump_file, "Simplified relational ");
3448 print_gimple_stmt (dump_file, stmt, 0);
3449 fprintf (dump_file, " into ");
3452 gimple_cond_set_code (stmt, EQ_EXPR);
3453 gimple_cond_set_lhs (stmt, op0);
3454 gimple_cond_set_rhs (stmt, new_tree);
3456 update_stmt (stmt);
3458 if (dump_file)
3460 print_gimple_stmt (dump_file, stmt, 0);
3461 fprintf (dump_file, "\n");
3464 return true;
3467 /* Try again after inverting the condition. We only deal
3468 with integral types here, so no need to worry about
3469 issues with inverting FP comparisons. */
3470 new_tree = test_for_singularity
3471 (invert_tree_comparison (cond_code, false),
3472 op0, op1, vr);
3473 if (new_tree)
3475 if (dump_file)
3477 fprintf (dump_file, "Simplified relational ");
3478 print_gimple_stmt (dump_file, stmt, 0);
3479 fprintf (dump_file, " into ");
3482 gimple_cond_set_code (stmt, NE_EXPR);
3483 gimple_cond_set_lhs (stmt, op0);
3484 gimple_cond_set_rhs (stmt, new_tree);
3486 update_stmt (stmt);
3488 if (dump_file)
3490 print_gimple_stmt (dump_file, stmt, 0);
3491 fprintf (dump_file, "\n");
3494 return true;
3498 return false;
3501 /* STMT is a conditional at the end of a basic block.
3503 If the conditional is of the form SSA_NAME op constant and the SSA_NAME
3504 was set via a type conversion, try to replace the SSA_NAME with the RHS
3505 of the type conversion. Doing so makes the conversion dead which helps
3506 subsequent passes. */
3508 void
3509 vr_values::simplify_cond_using_ranges_2 (gcond *stmt)
3511 tree op0 = gimple_cond_lhs (stmt);
3512 tree op1 = gimple_cond_rhs (stmt);
3514 /* If we have a comparison of an SSA_NAME (OP0) against a constant,
3515 see if OP0 was set by a type conversion where the source of
3516 the conversion is another SSA_NAME with a range that fits
3517 into the range of OP0's type.
3519 If so, the conversion is redundant as the earlier SSA_NAME can be
3520 used for the comparison directly if we just massage the constant in the
3521 comparison. */
3522 if (TREE_CODE (op0) == SSA_NAME
3523 && TREE_CODE (op1) == INTEGER_CST)
3525 gimple *def_stmt = SSA_NAME_DEF_STMT (op0);
3526 tree innerop;
3528 if (!is_gimple_assign (def_stmt)
3529 || !CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def_stmt)))
3530 return;
3532 innerop = gimple_assign_rhs1 (def_stmt);
3534 if (TREE_CODE (innerop) == SSA_NAME
3535 && !POINTER_TYPE_P (TREE_TYPE (innerop))
3536 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (innerop)
3537 && desired_pro_or_demotion_p (TREE_TYPE (innerop), TREE_TYPE (op0)))
3539 value_range *vr = get_value_range (innerop);
3541 if (range_int_cst_p (vr)
3542 && range_fits_type_p (vr,
3543 TYPE_PRECISION (TREE_TYPE (op0)),
3544 TYPE_SIGN (TREE_TYPE (op0)))
3545 && int_fits_type_p (op1, TREE_TYPE (innerop)))
3547 tree newconst = fold_convert (TREE_TYPE (innerop), op1);
3548 gimple_cond_set_lhs (stmt, innerop);
3549 gimple_cond_set_rhs (stmt, newconst);
3550 update_stmt (stmt);
3551 if (dump_file && (dump_flags & TDF_DETAILS))
3553 fprintf (dump_file, "Folded into: ");
3554 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
3555 fprintf (dump_file, "\n");
3562 /* Simplify a switch statement using the value range of the switch
3563 argument. */
3565 bool
3566 vr_values::simplify_switch_using_ranges (gswitch *stmt)
3568 tree op = gimple_switch_index (stmt);
3569 value_range *vr = NULL;
3570 bool take_default;
3571 edge e;
3572 edge_iterator ei;
3573 size_t i = 0, j = 0, n, n2;
3574 tree vec2;
3575 switch_update su;
3576 size_t k = 1, l = 0;
3578 if (TREE_CODE (op) == SSA_NAME)
3580 vr = get_value_range (op);
3582 /* We can only handle integer ranges. */
3583 if (vr->varying_p ()
3584 || vr->undefined_p ()
3585 || vr->symbolic_p ())
3586 return false;
3588 /* Find case label for min/max of the value range. */
3589 take_default = !find_case_label_ranges (stmt, vr, &i, &j, &k, &l);
3591 else if (TREE_CODE (op) == INTEGER_CST)
3593 take_default = !find_case_label_index (stmt, 1, op, &i);
3594 if (take_default)
3596 i = 1;
3597 j = 0;
3599 else
3601 j = i;
3604 else
3605 return false;
3607 n = gimple_switch_num_labels (stmt);
3609 /* We can truncate the case label ranges that partially overlap with OP's
3610 value range. */
3611 size_t min_idx = 1, max_idx = 0;
3612 if (vr != NULL)
3613 find_case_label_range (stmt, vr->min (), vr->max (), &min_idx, &max_idx);
3614 if (min_idx <= max_idx)
3616 tree min_label = gimple_switch_label (stmt, min_idx);
3617 tree max_label = gimple_switch_label (stmt, max_idx);
3619 /* Avoid changing the type of the case labels when truncating. */
3620 tree case_label_type = TREE_TYPE (CASE_LOW (min_label));
3621 tree vr_min = fold_convert (case_label_type, vr->min ());
3622 tree vr_max = fold_convert (case_label_type, vr->max ());
3624 if (vr->kind () == VR_RANGE)
3626 /* If OP's value range is [2,8] and the low label range is
3627 0 ... 3, truncate the label's range to 2 .. 3. */
3628 if (tree_int_cst_compare (CASE_LOW (min_label), vr_min) < 0
3629 && CASE_HIGH (min_label) != NULL_TREE
3630 && tree_int_cst_compare (CASE_HIGH (min_label), vr_min) >= 0)
3631 CASE_LOW (min_label) = vr_min;
3633 /* If OP's value range is [2,8] and the high label range is
3634 7 ... 10, truncate the label's range to 7 .. 8. */
3635 if (tree_int_cst_compare (CASE_LOW (max_label), vr_max) <= 0
3636 && CASE_HIGH (max_label) != NULL_TREE
3637 && tree_int_cst_compare (CASE_HIGH (max_label), vr_max) > 0)
3638 CASE_HIGH (max_label) = vr_max;
3640 else if (vr->kind () == VR_ANTI_RANGE)
3642 tree one_cst = build_one_cst (case_label_type);
3644 if (min_label == max_label)
3646 /* If OP's value range is ~[7,8] and the label's range is
3647 7 ... 10, truncate the label's range to 9 ... 10. */
3648 if (tree_int_cst_compare (CASE_LOW (min_label), vr_min) == 0
3649 && CASE_HIGH (min_label) != NULL_TREE
3650 && tree_int_cst_compare (CASE_HIGH (min_label), vr_max) > 0)
3651 CASE_LOW (min_label)
3652 = int_const_binop (PLUS_EXPR, vr_max, one_cst);
3654 /* If OP's value range is ~[7,8] and the label's range is
3655 5 ... 8, truncate the label's range to 5 ... 6. */
3656 if (tree_int_cst_compare (CASE_LOW (min_label), vr_min) < 0
3657 && CASE_HIGH (min_label) != NULL_TREE
3658 && tree_int_cst_compare (CASE_HIGH (min_label), vr_max) == 0)
3659 CASE_HIGH (min_label)
3660 = int_const_binop (MINUS_EXPR, vr_min, one_cst);
3662 else
3664 /* If OP's value range is ~[2,8] and the low label range is
3665 0 ... 3, truncate the label's range to 0 ... 1. */
3666 if (tree_int_cst_compare (CASE_LOW (min_label), vr_min) < 0
3667 && CASE_HIGH (min_label) != NULL_TREE
3668 && tree_int_cst_compare (CASE_HIGH (min_label), vr_min) >= 0)
3669 CASE_HIGH (min_label)
3670 = int_const_binop (MINUS_EXPR, vr_min, one_cst);
3672 /* If OP's value range is ~[2,8] and the high label range is
3673 7 ... 10, truncate the label's range to 9 ... 10. */
3674 if (tree_int_cst_compare (CASE_LOW (max_label), vr_max) <= 0
3675 && CASE_HIGH (max_label) != NULL_TREE
3676 && tree_int_cst_compare (CASE_HIGH (max_label), vr_max) > 0)
3677 CASE_LOW (max_label)
3678 = int_const_binop (PLUS_EXPR, vr_max, one_cst);
3682 /* Canonicalize singleton case ranges. */
3683 if (tree_int_cst_equal (CASE_LOW (min_label), CASE_HIGH (min_label)))
3684 CASE_HIGH (min_label) = NULL_TREE;
3685 if (tree_int_cst_equal (CASE_LOW (max_label), CASE_HIGH (max_label)))
3686 CASE_HIGH (max_label) = NULL_TREE;
3689 /* We can also eliminate case labels that lie completely outside OP's value
3690 range. */
3692 /* Bail out if this is just all edges taken. */
3693 if (i == 1
3694 && j == n - 1
3695 && take_default)
3696 return false;
3698 /* Build a new vector of taken case labels. */
3699 vec2 = make_tree_vec (j - i + 1 + l - k + 1 + (int)take_default);
3700 n2 = 0;
3702 /* Add the default edge, if necessary. */
3703 if (take_default)
3704 TREE_VEC_ELT (vec2, n2++) = gimple_switch_default_label (stmt);
3706 for (; i <= j; ++i, ++n2)
3707 TREE_VEC_ELT (vec2, n2) = gimple_switch_label (stmt, i);
3709 for (; k <= l; ++k, ++n2)
3710 TREE_VEC_ELT (vec2, n2) = gimple_switch_label (stmt, k);
3712 /* Mark needed edges. */
3713 for (i = 0; i < n2; ++i)
3715 e = find_edge (gimple_bb (stmt),
3716 label_to_block (cfun,
3717 CASE_LABEL (TREE_VEC_ELT (vec2, i))));
3718 e->aux = (void *)-1;
3721 /* Queue not needed edges for later removal. */
3722 FOR_EACH_EDGE (e, ei, gimple_bb (stmt)->succs)
3724 if (e->aux == (void *)-1)
3726 e->aux = NULL;
3727 continue;
3730 if (dump_file && (dump_flags & TDF_DETAILS))
3732 fprintf (dump_file, "removing unreachable case label\n");
3734 to_remove_edges.safe_push (e);
3735 e->flags &= ~EDGE_EXECUTABLE;
3736 e->flags |= EDGE_IGNORE;
3739 /* And queue an update for the stmt. */
3740 su.stmt = stmt;
3741 su.vec = vec2;
3742 to_update_switch_stmts.safe_push (su);
3743 return false;
3746 void
3747 vr_values::cleanup_edges_and_switches (void)
3749 int i;
3750 edge e;
3751 switch_update *su;
3753 /* Remove dead edges from SWITCH_EXPR optimization. This leaves the
3754 CFG in a broken state and requires a cfg_cleanup run. */
3755 FOR_EACH_VEC_ELT (to_remove_edges, i, e)
3756 remove_edge (e);
3758 /* Update SWITCH_EXPR case label vector. */
3759 FOR_EACH_VEC_ELT (to_update_switch_stmts, i, su)
3761 size_t j;
3762 size_t n = TREE_VEC_LENGTH (su->vec);
3763 tree label;
3764 gimple_switch_set_num_labels (su->stmt, n);
3765 for (j = 0; j < n; j++)
3766 gimple_switch_set_label (su->stmt, j, TREE_VEC_ELT (su->vec, j));
3767 /* As we may have replaced the default label with a regular one
3768 make sure to make it a real default label again. This ensures
3769 optimal expansion. */
3770 label = gimple_switch_label (su->stmt, 0);
3771 CASE_LOW (label) = NULL_TREE;
3772 CASE_HIGH (label) = NULL_TREE;
3775 if (!to_remove_edges.is_empty ())
3777 free_dominance_info (CDI_DOMINATORS);
3778 loops_state_set (LOOPS_NEED_FIXUP);
3781 to_remove_edges.release ();
3782 to_update_switch_stmts.release ();
3785 /* Simplify an integral conversion from an SSA name in STMT. */
3787 static bool
3788 simplify_conversion_using_ranges (gimple_stmt_iterator *gsi, gimple *stmt)
3790 tree innerop, middleop, finaltype;
3791 gimple *def_stmt;
3792 signop inner_sgn, middle_sgn, final_sgn;
3793 unsigned inner_prec, middle_prec, final_prec;
3794 widest_int innermin, innermed, innermax, middlemin, middlemed, middlemax;
3796 finaltype = TREE_TYPE (gimple_assign_lhs (stmt));
3797 if (!INTEGRAL_TYPE_P (finaltype))
3798 return false;
3799 middleop = gimple_assign_rhs1 (stmt);
3800 def_stmt = SSA_NAME_DEF_STMT (middleop);
3801 if (!is_gimple_assign (def_stmt)
3802 || !CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def_stmt)))
3803 return false;
3804 innerop = gimple_assign_rhs1 (def_stmt);
3805 if (TREE_CODE (innerop) != SSA_NAME
3806 || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (innerop))
3807 return false;
3809 /* Get the value-range of the inner operand. Use get_range_info in
3810 case innerop was created during substitute-and-fold. */
3811 wide_int imin, imax;
3812 if (!INTEGRAL_TYPE_P (TREE_TYPE (innerop))
3813 || get_range_info (innerop, &imin, &imax) != VR_RANGE)
3814 return false;
3815 innermin = widest_int::from (imin, TYPE_SIGN (TREE_TYPE (innerop)));
3816 innermax = widest_int::from (imax, TYPE_SIGN (TREE_TYPE (innerop)));
3818 /* Simulate the conversion chain to check if the result is equal if
3819 the middle conversion is removed. */
3820 inner_prec = TYPE_PRECISION (TREE_TYPE (innerop));
3821 middle_prec = TYPE_PRECISION (TREE_TYPE (middleop));
3822 final_prec = TYPE_PRECISION (finaltype);
3824 /* If the first conversion is not injective, the second must not
3825 be widening. */
3826 if (wi::gtu_p (innermax - innermin,
3827 wi::mask <widest_int> (middle_prec, false))
3828 && middle_prec < final_prec)
3829 return false;
3830 /* We also want a medium value so that we can track the effect that
3831 narrowing conversions with sign change have. */
3832 inner_sgn = TYPE_SIGN (TREE_TYPE (innerop));
3833 if (inner_sgn == UNSIGNED)
3834 innermed = wi::shifted_mask <widest_int> (1, inner_prec - 1, false);
3835 else
3836 innermed = 0;
3837 if (wi::cmp (innermin, innermed, inner_sgn) >= 0
3838 || wi::cmp (innermed, innermax, inner_sgn) >= 0)
3839 innermed = innermin;
3841 middle_sgn = TYPE_SIGN (TREE_TYPE (middleop));
3842 middlemin = wi::ext (innermin, middle_prec, middle_sgn);
3843 middlemed = wi::ext (innermed, middle_prec, middle_sgn);
3844 middlemax = wi::ext (innermax, middle_prec, middle_sgn);
3846 /* Require that the final conversion applied to both the original
3847 and the intermediate range produces the same result. */
3848 final_sgn = TYPE_SIGN (finaltype);
3849 if (wi::ext (middlemin, final_prec, final_sgn)
3850 != wi::ext (innermin, final_prec, final_sgn)
3851 || wi::ext (middlemed, final_prec, final_sgn)
3852 != wi::ext (innermed, final_prec, final_sgn)
3853 || wi::ext (middlemax, final_prec, final_sgn)
3854 != wi::ext (innermax, final_prec, final_sgn))
3855 return false;
3857 gimple_assign_set_rhs1 (stmt, innerop);
3858 fold_stmt (gsi, follow_single_use_edges);
3859 return true;
3862 /* Simplify a conversion from integral SSA name to float in STMT. */
3864 bool
3865 vr_values::simplify_float_conversion_using_ranges (gimple_stmt_iterator *gsi,
3866 gimple *stmt)
3868 tree rhs1 = gimple_assign_rhs1 (stmt);
3869 value_range *vr = get_value_range (rhs1);
3870 scalar_float_mode fltmode
3871 = SCALAR_FLOAT_TYPE_MODE (TREE_TYPE (gimple_assign_lhs (stmt)));
3872 scalar_int_mode mode;
3873 tree tem;
3874 gassign *conv;
3876 /* We can only handle constant ranges. */
3877 if (!range_int_cst_p (vr))
3878 return false;
3880 /* First check if we can use a signed type in place of an unsigned. */
3881 scalar_int_mode rhs_mode = SCALAR_INT_TYPE_MODE (TREE_TYPE (rhs1));
3882 if (TYPE_UNSIGNED (TREE_TYPE (rhs1))
3883 && can_float_p (fltmode, rhs_mode, 0) != CODE_FOR_nothing
3884 && range_fits_type_p (vr, TYPE_PRECISION (TREE_TYPE (rhs1)), SIGNED))
3885 mode = rhs_mode;
3886 /* If we can do the conversion in the current input mode do nothing. */
3887 else if (can_float_p (fltmode, rhs_mode,
3888 TYPE_UNSIGNED (TREE_TYPE (rhs1))) != CODE_FOR_nothing)
3889 return false;
3890 /* Otherwise search for a mode we can use, starting from the narrowest
3891 integer mode available. */
3892 else
3894 mode = NARROWEST_INT_MODE;
3895 for (;;)
3897 /* If we cannot do a signed conversion to float from mode
3898 or if the value-range does not fit in the signed type
3899 try with a wider mode. */
3900 if (can_float_p (fltmode, mode, 0) != CODE_FOR_nothing
3901 && range_fits_type_p (vr, GET_MODE_PRECISION (mode), SIGNED))
3902 break;
3904 /* But do not widen the input. Instead leave that to the
3905 optabs expansion code. */
3906 if (!GET_MODE_WIDER_MODE (mode).exists (&mode)
3907 || GET_MODE_PRECISION (mode) > TYPE_PRECISION (TREE_TYPE (rhs1)))
3908 return false;
3912 /* It works, insert a truncation or sign-change before the
3913 float conversion. */
3914 tem = make_ssa_name (build_nonstandard_integer_type
3915 (GET_MODE_PRECISION (mode), 0));
3916 conv = gimple_build_assign (tem, NOP_EXPR, rhs1);
3917 gsi_insert_before (gsi, conv, GSI_SAME_STMT);
3918 gimple_assign_set_rhs1 (stmt, tem);
3919 fold_stmt (gsi, follow_single_use_edges);
3921 return true;
3924 /* Simplify an internal fn call using ranges if possible. */
3926 bool
3927 vr_values::simplify_internal_call_using_ranges (gimple_stmt_iterator *gsi,
3928 gimple *stmt)
3930 enum tree_code subcode;
3931 bool is_ubsan = false;
3932 bool ovf = false;
3933 switch (gimple_call_internal_fn (stmt))
3935 case IFN_UBSAN_CHECK_ADD:
3936 subcode = PLUS_EXPR;
3937 is_ubsan = true;
3938 break;
3939 case IFN_UBSAN_CHECK_SUB:
3940 subcode = MINUS_EXPR;
3941 is_ubsan = true;
3942 break;
3943 case IFN_UBSAN_CHECK_MUL:
3944 subcode = MULT_EXPR;
3945 is_ubsan = true;
3946 break;
3947 case IFN_ADD_OVERFLOW:
3948 subcode = PLUS_EXPR;
3949 break;
3950 case IFN_SUB_OVERFLOW:
3951 subcode = MINUS_EXPR;
3952 break;
3953 case IFN_MUL_OVERFLOW:
3954 subcode = MULT_EXPR;
3955 break;
3956 default:
3957 return false;
3960 tree op0 = gimple_call_arg (stmt, 0);
3961 tree op1 = gimple_call_arg (stmt, 1);
3962 tree type;
3963 if (is_ubsan)
3965 type = TREE_TYPE (op0);
3966 if (VECTOR_TYPE_P (type))
3967 return false;
3969 else if (gimple_call_lhs (stmt) == NULL_TREE)
3970 return false;
3971 else
3972 type = TREE_TYPE (TREE_TYPE (gimple_call_lhs (stmt)));
3973 if (!check_for_binary_op_overflow (subcode, type, op0, op1, &ovf)
3974 || (is_ubsan && ovf))
3975 return false;
3977 gimple *g;
3978 location_t loc = gimple_location (stmt);
3979 if (is_ubsan)
3980 g = gimple_build_assign (gimple_call_lhs (stmt), subcode, op0, op1);
3981 else
3983 int prec = TYPE_PRECISION (type);
3984 tree utype = type;
3985 if (ovf
3986 || !useless_type_conversion_p (type, TREE_TYPE (op0))
3987 || !useless_type_conversion_p (type, TREE_TYPE (op1)))
3988 utype = build_nonstandard_integer_type (prec, 1);
3989 if (TREE_CODE (op0) == INTEGER_CST)
3990 op0 = fold_convert (utype, op0);
3991 else if (!useless_type_conversion_p (utype, TREE_TYPE (op0)))
3993 g = gimple_build_assign (make_ssa_name (utype), NOP_EXPR, op0);
3994 gimple_set_location (g, loc);
3995 gsi_insert_before (gsi, g, GSI_SAME_STMT);
3996 op0 = gimple_assign_lhs (g);
3998 if (TREE_CODE (op1) == INTEGER_CST)
3999 op1 = fold_convert (utype, op1);
4000 else if (!useless_type_conversion_p (utype, TREE_TYPE (op1)))
4002 g = gimple_build_assign (make_ssa_name (utype), NOP_EXPR, op1);
4003 gimple_set_location (g, loc);
4004 gsi_insert_before (gsi, g, GSI_SAME_STMT);
4005 op1 = gimple_assign_lhs (g);
4007 g = gimple_build_assign (make_ssa_name (utype), subcode, op0, op1);
4008 gimple_set_location (g, loc);
4009 gsi_insert_before (gsi, g, GSI_SAME_STMT);
4010 if (utype != type)
4012 g = gimple_build_assign (make_ssa_name (type), NOP_EXPR,
4013 gimple_assign_lhs (g));
4014 gimple_set_location (g, loc);
4015 gsi_insert_before (gsi, g, GSI_SAME_STMT);
4017 g = gimple_build_assign (gimple_call_lhs (stmt), COMPLEX_EXPR,
4018 gimple_assign_lhs (g),
4019 build_int_cst (type, ovf));
4021 gimple_set_location (g, loc);
4022 gsi_replace (gsi, g, false);
4023 return true;
4026 /* Return true if VAR is a two-valued variable. Set a and b with the
4027 two-values when it is true. Return false otherwise. */
4029 bool
4030 vr_values::two_valued_val_range_p (tree var, tree *a, tree *b)
4032 value_range *vr = get_value_range (var);
4033 if (vr->varying_p ()
4034 || vr->undefined_p ()
4035 || TREE_CODE (vr->min ()) != INTEGER_CST
4036 || TREE_CODE (vr->max ()) != INTEGER_CST)
4037 return false;
4039 if (vr->kind () == VR_RANGE
4040 && wi::to_wide (vr->max ()) - wi::to_wide (vr->min ()) == 1)
4042 *a = vr->min ();
4043 *b = vr->max ();
4044 return true;
4047 /* ~[TYPE_MIN + 1, TYPE_MAX - 1] */
4048 if (vr->kind () == VR_ANTI_RANGE
4049 && (wi::to_wide (vr->min ())
4050 - wi::to_wide (vrp_val_min (TREE_TYPE (var)))) == 1
4051 && (wi::to_wide (vrp_val_max (TREE_TYPE (var)))
4052 - wi::to_wide (vr->max ())) == 1)
4054 *a = vrp_val_min (TREE_TYPE (var));
4055 *b = vrp_val_max (TREE_TYPE (var));
4056 return true;
4059 return false;
4062 /* Simplify STMT using ranges if possible. */
4064 bool
4065 vr_values::simplify_stmt_using_ranges (gimple_stmt_iterator *gsi)
4067 gimple *stmt = gsi_stmt (*gsi);
4068 if (is_gimple_assign (stmt))
4070 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
4071 tree rhs1 = gimple_assign_rhs1 (stmt);
4072 tree rhs2 = gimple_assign_rhs2 (stmt);
4073 tree lhs = gimple_assign_lhs (stmt);
4074 tree val1 = NULL_TREE, val2 = NULL_TREE;
4075 use_operand_p use_p;
4076 gimple *use_stmt;
4078 /* Convert:
4079 LHS = CST BINOP VAR
4080 Where VAR is two-valued and LHS is used in GIMPLE_COND only
4082 LHS = VAR == VAL1 ? (CST BINOP VAL1) : (CST BINOP VAL2)
4084 Also handles:
4085 LHS = VAR BINOP CST
4086 Where VAR is two-valued and LHS is used in GIMPLE_COND only
4088 LHS = VAR == VAL1 ? (VAL1 BINOP CST) : (VAL2 BINOP CST) */
4090 if (TREE_CODE_CLASS (rhs_code) == tcc_binary
4091 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
4092 && ((TREE_CODE (rhs1) == INTEGER_CST
4093 && TREE_CODE (rhs2) == SSA_NAME)
4094 || (TREE_CODE (rhs2) == INTEGER_CST
4095 && TREE_CODE (rhs1) == SSA_NAME))
4096 && single_imm_use (lhs, &use_p, &use_stmt)
4097 && gimple_code (use_stmt) == GIMPLE_COND)
4100 tree new_rhs1 = NULL_TREE;
4101 tree new_rhs2 = NULL_TREE;
4102 tree cmp_var = NULL_TREE;
4104 if (TREE_CODE (rhs2) == SSA_NAME
4105 && two_valued_val_range_p (rhs2, &val1, &val2))
4107 /* Optimize RHS1 OP [VAL1, VAL2]. */
4108 new_rhs1 = int_const_binop (rhs_code, rhs1, val1);
4109 new_rhs2 = int_const_binop (rhs_code, rhs1, val2);
4110 cmp_var = rhs2;
4112 else if (TREE_CODE (rhs1) == SSA_NAME
4113 && two_valued_val_range_p (rhs1, &val1, &val2))
4115 /* Optimize [VAL1, VAL2] OP RHS2. */
4116 new_rhs1 = int_const_binop (rhs_code, val1, rhs2);
4117 new_rhs2 = int_const_binop (rhs_code, val2, rhs2);
4118 cmp_var = rhs1;
4121 /* If we could not find two-vals or the optimzation is invalid as
4122 in divide by zero, new_rhs1 / new_rhs will be NULL_TREE. */
4123 if (new_rhs1 && new_rhs2)
4125 tree cond = build2 (EQ_EXPR, boolean_type_node, cmp_var, val1);
4126 gimple_assign_set_rhs_with_ops (gsi,
4127 COND_EXPR, cond,
4128 new_rhs1,
4129 new_rhs2);
4130 update_stmt (gsi_stmt (*gsi));
4131 fold_stmt (gsi, follow_single_use_edges);
4132 return true;
4136 switch (rhs_code)
4138 case EQ_EXPR:
4139 case NE_EXPR:
4140 /* Transform EQ_EXPR, NE_EXPR into BIT_XOR_EXPR or identity
4141 if the RHS is zero or one, and the LHS are known to be boolean
4142 values. */
4143 if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
4144 return simplify_truth_ops_using_ranges (gsi, stmt);
4145 break;
4147 /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
4148 and BIT_AND_EXPR respectively if the first operand is greater
4149 than zero and the second operand is an exact power of two.
4150 Also optimize TRUNC_MOD_EXPR away if the second operand is
4151 constant and the first operand already has the right value
4152 range. */
4153 case TRUNC_DIV_EXPR:
4154 case TRUNC_MOD_EXPR:
4155 if ((TREE_CODE (rhs1) == SSA_NAME
4156 || TREE_CODE (rhs1) == INTEGER_CST)
4157 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
4158 return simplify_div_or_mod_using_ranges (gsi, stmt);
4159 break;
4161 /* Transform ABS (X) into X or -X as appropriate. */
4162 case ABS_EXPR:
4163 if (TREE_CODE (rhs1) == SSA_NAME
4164 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
4165 return simplify_abs_using_ranges (gsi, stmt);
4166 break;
4168 case BIT_AND_EXPR:
4169 case BIT_IOR_EXPR:
4170 /* Optimize away BIT_AND_EXPR and BIT_IOR_EXPR
4171 if all the bits being cleared are already cleared or
4172 all the bits being set are already set. */
4173 if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
4174 return simplify_bit_ops_using_ranges (gsi, stmt);
4175 break;
4177 CASE_CONVERT:
4178 if (TREE_CODE (rhs1) == SSA_NAME
4179 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
4180 return simplify_conversion_using_ranges (gsi, stmt);
4181 break;
4183 case FLOAT_EXPR:
4184 if (TREE_CODE (rhs1) == SSA_NAME
4185 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
4186 return simplify_float_conversion_using_ranges (gsi, stmt);
4187 break;
4189 case MIN_EXPR:
4190 case MAX_EXPR:
4191 return simplify_min_or_max_using_ranges (gsi, stmt);
4193 default:
4194 break;
4197 else if (gimple_code (stmt) == GIMPLE_COND)
4198 return simplify_cond_using_ranges_1 (as_a <gcond *> (stmt));
4199 else if (gimple_code (stmt) == GIMPLE_SWITCH)
4200 return simplify_switch_using_ranges (as_a <gswitch *> (stmt));
4201 else if (is_gimple_call (stmt)
4202 && gimple_call_internal_p (stmt))
4203 return simplify_internal_call_using_ranges (gsi, stmt);
4205 return false;
4208 void
4209 vr_values::set_vr_value (tree var, value_range *vr)
4211 if (SSA_NAME_VERSION (var) >= num_vr_values)
4212 return;
4213 vr_value[SSA_NAME_VERSION (var)] = vr;