include cstring as well
[official-gcc.git] / gcc / tree-vrp.c
bloba9141d76ed2371b088d16b9eba12a2bbaecda3fd
1 /* Support routines for Value Range Propagation (VRP).
2 Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
3 Contributed by Diego Novillo <dnovillo@redhat.com>.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to
19 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "ggc.h"
27 #include "flags.h"
28 #include "tree.h"
29 #include "basic-block.h"
30 #include "tree-flow.h"
31 #include "tree-pass.h"
32 #include "tree-dump.h"
33 #include "timevar.h"
34 #include "diagnostic.h"
35 #include "toplev.h"
36 #include "intl.h"
37 #include "cfgloop.h"
38 #include "tree-scalar-evolution.h"
39 #include "tree-ssa-propagate.h"
40 #include "tree-chrec.h"
42 /* Set of SSA names found during the dominator traversal of a
43 sub-graph in find_assert_locations. */
44 static sbitmap found_in_subgraph;
46 /* Local functions. */
47 static int compare_values (tree val1, tree val2);
48 static int compare_values_warnv (tree val1, tree val2, bool *);
49 static void vrp_meet (value_range_t *, value_range_t *);
50 static tree vrp_evaluate_conditional_warnv (tree, bool, bool *);
52 /* Location information for ASSERT_EXPRs. Each instance of this
53 structure describes an ASSERT_EXPR for an SSA name. Since a single
54 SSA name may have more than one assertion associated with it, these
55 locations are kept in a linked list attached to the corresponding
56 SSA name. */
57 struct assert_locus_d
59 /* Basic block where the assertion would be inserted. */
60 basic_block bb;
62 /* Some assertions need to be inserted on an edge (e.g., assertions
63 generated by COND_EXPRs). In those cases, BB will be NULL. */
64 edge e;
66 /* Pointer to the statement that generated this assertion. */
67 block_stmt_iterator si;
69 /* Predicate code for the ASSERT_EXPR. Must be COMPARISON_CLASS_P. */
70 enum tree_code comp_code;
72 /* Value being compared against. */
73 tree val;
75 /* Next node in the linked list. */
76 struct assert_locus_d *next;
79 typedef struct assert_locus_d *assert_locus_t;
81 /* If bit I is present, it means that SSA name N_i has a list of
82 assertions that should be inserted in the IL. */
83 static bitmap need_assert_for;
85 /* Array of locations lists where to insert assertions. ASSERTS_FOR[I]
86 holds a list of ASSERT_LOCUS_T nodes that describe where
87 ASSERT_EXPRs for SSA name N_I should be inserted. */
88 static assert_locus_t *asserts_for;
90 /* Set of blocks visited in find_assert_locations. Used to avoid
91 visiting the same block more than once. */
92 static sbitmap blocks_visited;
94 /* Value range array. After propagation, VR_VALUE[I] holds the range
95 of values that SSA name N_I may take. */
96 static value_range_t **vr_value;
98 /* For a PHI node which sets SSA name N_I, VR_COUNTS[I] holds the
99 number of executable edges we saw the last time we visited the
100 node. */
101 static int *vr_phi_edge_counts;
104 /* Return whether TYPE should use an overflow infinity distinct from
105 TYPE_{MIN,MAX}_VALUE. We use an overflow infinity value to
106 represent a signed overflow during VRP computations. An infinity
107 is distinct from a half-range, which will go from some number to
108 TYPE_{MIN,MAX}_VALUE. */
110 static inline bool
111 needs_overflow_infinity (tree type)
113 return INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type);
116 /* Return whether TYPE can support our overflow infinity
117 representation: we use the TREE_OVERFLOW flag, which only exists
118 for constants. If TYPE doesn't support this, we don't optimize
119 cases which would require signed overflow--we drop them to
120 VARYING. */
122 static inline bool
123 supports_overflow_infinity (tree type)
125 #ifdef ENABLE_CHECKING
126 gcc_assert (needs_overflow_infinity (type));
127 #endif
128 return (TYPE_MIN_VALUE (type) != NULL_TREE
129 && CONSTANT_CLASS_P (TYPE_MIN_VALUE (type))
130 && TYPE_MAX_VALUE (type) != NULL_TREE
131 && CONSTANT_CLASS_P (TYPE_MAX_VALUE (type)));
134 /* VAL is the maximum or minimum value of a type. Return a
135 corresponding overflow infinity. */
137 static inline tree
138 make_overflow_infinity (tree val)
140 #ifdef ENABLE_CHECKING
141 gcc_assert (val != NULL_TREE && CONSTANT_CLASS_P (val));
142 #endif
143 val = copy_node (val);
144 TREE_OVERFLOW (val) = 1;
145 return val;
148 /* Return a negative overflow infinity for TYPE. */
150 static inline tree
151 negative_overflow_infinity (tree type)
153 #ifdef ENABLE_CHECKING
154 gcc_assert (supports_overflow_infinity (type));
155 #endif
156 return make_overflow_infinity (TYPE_MIN_VALUE (type));
159 /* Return a positive overflow infinity for TYPE. */
161 static inline tree
162 positive_overflow_infinity (tree type)
164 #ifdef ENABLE_CHECKING
165 gcc_assert (supports_overflow_infinity (type));
166 #endif
167 return make_overflow_infinity (TYPE_MAX_VALUE (type));
170 /* Return whether VAL is a negative overflow infinity. */
172 static inline bool
173 is_negative_overflow_infinity (tree val)
175 return (needs_overflow_infinity (TREE_TYPE (val))
176 && CONSTANT_CLASS_P (val)
177 && TREE_OVERFLOW (val)
178 && operand_equal_p (val, TYPE_MIN_VALUE (TREE_TYPE (val)), 0));
181 /* Return whether VAL is a positive overflow infinity. */
183 static inline bool
184 is_positive_overflow_infinity (tree val)
186 return (needs_overflow_infinity (TREE_TYPE (val))
187 && CONSTANT_CLASS_P (val)
188 && TREE_OVERFLOW (val)
189 && operand_equal_p (val, TYPE_MAX_VALUE (TREE_TYPE (val)), 0));
192 /* Return whether VAL is a positive or negative overflow infinity. */
194 static inline bool
195 is_overflow_infinity (tree val)
197 return (needs_overflow_infinity (TREE_TYPE (val))
198 && CONSTANT_CLASS_P (val)
199 && TREE_OVERFLOW (val)
200 && (operand_equal_p (val, TYPE_MAX_VALUE (TREE_TYPE (val)), 0)
201 || operand_equal_p (val, TYPE_MIN_VALUE (TREE_TYPE (val)), 0)));
205 /* Return whether VAL is equal to the maximum value of its type. This
206 will be true for a positive overflow infinity. We can't do a
207 simple equality comparison with TYPE_MAX_VALUE because C typedefs
208 and Ada subtypes can produce types whose TYPE_MAX_VALUE is not ==
209 to the integer constant with the same value in the type. */
211 static inline bool
212 vrp_val_is_max (tree val)
214 tree type_max = TYPE_MAX_VALUE (TREE_TYPE (val));
216 return (val == type_max
217 || (type_max != NULL_TREE
218 && operand_equal_p (val, type_max, 0)));
221 /* Return whether VAL is equal to the minimum value of its type. This
222 will be true for a negative overflow infinity. */
224 static inline bool
225 vrp_val_is_min (tree val)
227 tree type_min = TYPE_MIN_VALUE (TREE_TYPE (val));
229 return (val == type_min
230 || (type_min != NULL_TREE
231 && operand_equal_p (val, type_min, 0)));
235 /* Return true if ARG is marked with the nonnull attribute in the
236 current function signature. */
238 static bool
239 nonnull_arg_p (tree arg)
241 tree t, attrs, fntype;
242 unsigned HOST_WIDE_INT arg_num;
244 gcc_assert (TREE_CODE (arg) == PARM_DECL && POINTER_TYPE_P (TREE_TYPE (arg)));
246 /* The static chain decl is always non null. */
247 if (arg == cfun->static_chain_decl)
248 return true;
250 fntype = TREE_TYPE (current_function_decl);
251 attrs = lookup_attribute ("nonnull", TYPE_ATTRIBUTES (fntype));
253 /* If "nonnull" wasn't specified, we know nothing about the argument. */
254 if (attrs == NULL_TREE)
255 return false;
257 /* If "nonnull" applies to all the arguments, then ARG is non-null. */
258 if (TREE_VALUE (attrs) == NULL_TREE)
259 return true;
261 /* Get the position number for ARG in the function signature. */
262 for (arg_num = 1, t = DECL_ARGUMENTS (current_function_decl);
264 t = TREE_CHAIN (t), arg_num++)
266 if (t == arg)
267 break;
270 gcc_assert (t == arg);
272 /* Now see if ARG_NUM is mentioned in the nonnull list. */
273 for (t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
275 if (compare_tree_int (TREE_VALUE (t), arg_num) == 0)
276 return true;
279 return false;
283 /* Set value range VR to {T, MIN, MAX, EQUIV}. */
285 static void
286 set_value_range (value_range_t *vr, enum value_range_type t, tree min,
287 tree max, bitmap equiv)
289 #if defined ENABLE_CHECKING
290 /* Check the validity of the range. */
291 if (t == VR_RANGE || t == VR_ANTI_RANGE)
293 int cmp;
295 gcc_assert (min && max);
297 if (INTEGRAL_TYPE_P (TREE_TYPE (min)) && t == VR_ANTI_RANGE)
298 gcc_assert (!vrp_val_is_min (min) || !vrp_val_is_max (max));
300 cmp = compare_values (min, max);
301 gcc_assert (cmp == 0 || cmp == -1 || cmp == -2);
303 if (needs_overflow_infinity (TREE_TYPE (min)))
304 gcc_assert (!is_overflow_infinity (min)
305 || !is_overflow_infinity (max));
308 if (t == VR_UNDEFINED || t == VR_VARYING)
309 gcc_assert (min == NULL_TREE && max == NULL_TREE);
311 if (t == VR_UNDEFINED || t == VR_VARYING)
312 gcc_assert (equiv == NULL || bitmap_empty_p (equiv));
313 #endif
315 vr->type = t;
316 vr->min = min;
317 vr->max = max;
319 /* Since updating the equivalence set involves deep copying the
320 bitmaps, only do it if absolutely necessary. */
321 if (vr->equiv == NULL
322 && equiv != NULL)
323 vr->equiv = BITMAP_ALLOC (NULL);
325 if (equiv != vr->equiv)
327 if (equiv && !bitmap_empty_p (equiv))
328 bitmap_copy (vr->equiv, equiv);
329 else
330 bitmap_clear (vr->equiv);
335 /* Copy value range FROM into value range TO. */
337 static inline void
338 copy_value_range (value_range_t *to, value_range_t *from)
340 set_value_range (to, from->type, from->min, from->max, from->equiv);
344 /* Set value range VR to VR_VARYING. */
346 static inline void
347 set_value_range_to_varying (value_range_t *vr)
349 vr->type = VR_VARYING;
350 vr->min = vr->max = NULL_TREE;
351 if (vr->equiv)
352 bitmap_clear (vr->equiv);
355 /* Set value range VR to a single value. This function is only called
356 with values we get from statements, and exists to clear the
357 TREE_OVERFLOW flag so that we don't think we have an overflow
358 infinity when we shouldn't. */
360 static inline void
361 set_value_range_to_value (value_range_t *vr, tree val)
363 gcc_assert (is_gimple_min_invariant (val));
364 if (is_overflow_infinity (val))
366 if (operand_equal_p (val, TYPE_MAX_VALUE (TREE_TYPE (val)), 0))
367 val = TYPE_MAX_VALUE (TREE_TYPE (val));
368 else
370 #ifdef ENABLE_CHECKING
371 gcc_assert (operand_equal_p (val,
372 TYPE_MIN_VALUE (TREE_TYPE (val)), 0));
373 #endif
374 val = TYPE_MIN_VALUE (TREE_TYPE (val));
377 set_value_range (vr, VR_RANGE, val, val, NULL);
380 /* Set value range VR to a non-negative range of type TYPE.
381 OVERFLOW_INFINITY indicates whether to use a overflow infinity
382 rather than TYPE_MAX_VALUE; this should be true if we determine
383 that the range is nonnegative based on the assumption that signed
384 overflow does not occur. */
386 static inline void
387 set_value_range_to_nonnegative (value_range_t *vr, tree type,
388 bool overflow_infinity)
390 tree zero;
392 if (overflow_infinity && !supports_overflow_infinity (type))
394 set_value_range_to_varying (vr);
395 return;
398 zero = build_int_cst (type, 0);
399 set_value_range (vr, VR_RANGE, zero,
400 (overflow_infinity
401 ? positive_overflow_infinity (type)
402 : TYPE_MAX_VALUE (type)),
403 vr->equiv);
406 /* Set value range VR to a non-NULL range of type TYPE. */
408 static inline void
409 set_value_range_to_nonnull (value_range_t *vr, tree type)
411 tree zero = build_int_cst (type, 0);
412 set_value_range (vr, VR_ANTI_RANGE, zero, zero, vr->equiv);
416 /* Set value range VR to a NULL range of type TYPE. */
418 static inline void
419 set_value_range_to_null (value_range_t *vr, tree type)
421 tree zero = build_int_cst (type, 0);
422 set_value_range (vr, VR_RANGE, zero, zero, vr->equiv);
426 /* Set value range VR to a range of a truthvalue of type TYPE. */
428 static inline void
429 set_value_range_to_truthvalue (value_range_t *vr, tree type)
431 if (TYPE_PRECISION (type) == 1)
432 set_value_range_to_varying (vr);
433 else
434 set_value_range (vr, VR_RANGE,
435 build_int_cst (type, 0), build_int_cst (type, 1),
436 vr->equiv);
440 /* Set value range VR to VR_UNDEFINED. */
442 static inline void
443 set_value_range_to_undefined (value_range_t *vr)
445 vr->type = VR_UNDEFINED;
446 vr->min = vr->max = NULL_TREE;
447 if (vr->equiv)
448 bitmap_clear (vr->equiv);
452 /* Return value range information for VAR.
454 If we have no values ranges recorded (ie, VRP is not running), then
455 return NULL. Otherwise create an empty range if none existed for VAR. */
457 static value_range_t *
458 get_value_range (tree var)
460 value_range_t *vr;
461 tree sym;
462 unsigned ver = SSA_NAME_VERSION (var);
464 /* If we have no recorded ranges, then return NULL. */
465 if (! vr_value)
466 return NULL;
468 vr = vr_value[ver];
469 if (vr)
470 return vr;
472 /* Create a default value range. */
473 vr_value[ver] = vr = XCNEW (value_range_t);
475 /* Defer allocating the equivalence set. */
476 vr->equiv = NULL;
478 /* If VAR is a default definition, the variable can take any value
479 in VAR's type. */
480 sym = SSA_NAME_VAR (var);
481 if (SSA_NAME_IS_DEFAULT_DEF (var))
483 /* Try to use the "nonnull" attribute to create ~[0, 0]
484 anti-ranges for pointers. Note that this is only valid with
485 default definitions of PARM_DECLs. */
486 if (TREE_CODE (sym) == PARM_DECL
487 && POINTER_TYPE_P (TREE_TYPE (sym))
488 && nonnull_arg_p (sym))
489 set_value_range_to_nonnull (vr, TREE_TYPE (sym));
490 else
491 set_value_range_to_varying (vr);
494 return vr;
497 /* Return true, if VAL1 and VAL2 are equal values for VRP purposes. */
499 static inline bool
500 vrp_operand_equal_p (tree val1, tree val2)
502 if (val1 == val2)
503 return true;
504 if (!val1 || !val2 || !operand_equal_p (val1, val2, 0))
505 return false;
506 if (is_overflow_infinity (val1))
507 return is_overflow_infinity (val2);
508 return true;
511 /* Return true, if the bitmaps B1 and B2 are equal. */
513 static inline bool
514 vrp_bitmap_equal_p (bitmap b1, bitmap b2)
516 return (b1 == b2
517 || (b1 && b2
518 && bitmap_equal_p (b1, b2)));
521 /* Update the value range and equivalence set for variable VAR to
522 NEW_VR. Return true if NEW_VR is different from VAR's previous
523 value.
525 NOTE: This function assumes that NEW_VR is a temporary value range
526 object created for the sole purpose of updating VAR's range. The
527 storage used by the equivalence set from NEW_VR will be freed by
528 this function. Do not call update_value_range when NEW_VR
529 is the range object associated with another SSA name. */
531 static inline bool
532 update_value_range (tree var, value_range_t *new_vr)
534 value_range_t *old_vr;
535 bool is_new;
537 /* Update the value range, if necessary. */
538 old_vr = get_value_range (var);
539 is_new = old_vr->type != new_vr->type
540 || !vrp_operand_equal_p (old_vr->min, new_vr->min)
541 || !vrp_operand_equal_p (old_vr->max, new_vr->max)
542 || !vrp_bitmap_equal_p (old_vr->equiv, new_vr->equiv);
544 if (is_new)
545 set_value_range (old_vr, new_vr->type, new_vr->min, new_vr->max,
546 new_vr->equiv);
548 BITMAP_FREE (new_vr->equiv);
550 return is_new;
554 /* Add VAR and VAR's equivalence set to EQUIV. This is the central
555 point where equivalence processing can be turned on/off. */
557 static void
558 add_equivalence (bitmap *equiv, tree var)
560 unsigned ver = SSA_NAME_VERSION (var);
561 value_range_t *vr = vr_value[ver];
563 if (*equiv == NULL)
564 *equiv = BITMAP_ALLOC (NULL);
565 bitmap_set_bit (*equiv, ver);
566 if (vr && vr->equiv)
567 bitmap_ior_into (*equiv, vr->equiv);
571 /* Return true if VR is ~[0, 0]. */
573 static inline bool
574 range_is_nonnull (value_range_t *vr)
576 return vr->type == VR_ANTI_RANGE
577 && integer_zerop (vr->min)
578 && integer_zerop (vr->max);
582 /* Return true if VR is [0, 0]. */
584 static inline bool
585 range_is_null (value_range_t *vr)
587 return vr->type == VR_RANGE
588 && integer_zerop (vr->min)
589 && integer_zerop (vr->max);
593 /* Return true if value range VR involves at least one symbol. */
595 static inline bool
596 symbolic_range_p (value_range_t *vr)
598 return (!is_gimple_min_invariant (vr->min)
599 || !is_gimple_min_invariant (vr->max));
602 /* Return true if value range VR uses a overflow infinity. */
604 static inline bool
605 overflow_infinity_range_p (value_range_t *vr)
607 return (vr->type == VR_RANGE
608 && (is_overflow_infinity (vr->min)
609 || is_overflow_infinity (vr->max)));
612 /* Return false if we can not make a valid comparison based on VR;
613 this will be the case if it uses an overflow infinity and overflow
614 is not undefined (i.e., -fno-strict-overflow is in effect).
615 Otherwise return true, and set *STRICT_OVERFLOW_P to true if VR
616 uses an overflow infinity. */
618 static bool
619 usable_range_p (value_range_t *vr, bool *strict_overflow_p)
621 gcc_assert (vr->type == VR_RANGE);
622 if (is_overflow_infinity (vr->min))
624 *strict_overflow_p = true;
625 if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (vr->min)))
626 return false;
628 if (is_overflow_infinity (vr->max))
630 *strict_overflow_p = true;
631 if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (vr->max)))
632 return false;
634 return true;
638 /* Like tree_expr_nonnegative_warnv_p, but this function uses value
639 ranges obtained so far. */
641 static bool
642 vrp_expr_computes_nonnegative (tree expr, bool *strict_overflow_p)
644 return tree_expr_nonnegative_warnv_p (expr, strict_overflow_p);
647 /* Like tree_expr_nonzero_warnv_p, but this function uses value ranges
648 obtained so far. */
650 static bool
651 vrp_expr_computes_nonzero (tree expr, bool *strict_overflow_p)
653 if (tree_expr_nonzero_warnv_p (expr, strict_overflow_p))
654 return true;
656 /* If we have an expression of the form &X->a, then the expression
657 is nonnull if X is nonnull. */
658 if (TREE_CODE (expr) == ADDR_EXPR)
660 tree base = get_base_address (TREE_OPERAND (expr, 0));
662 if (base != NULL_TREE
663 && TREE_CODE (base) == INDIRECT_REF
664 && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
666 value_range_t *vr = get_value_range (TREE_OPERAND (base, 0));
667 if (range_is_nonnull (vr))
668 return true;
672 return false;
675 /* Returns true if EXPR is a valid value (as expected by compare_values) --
676 a gimple invariant, or SSA_NAME +- CST. */
678 static bool
679 valid_value_p (tree expr)
681 if (TREE_CODE (expr) == SSA_NAME)
682 return true;
684 if (TREE_CODE (expr) == PLUS_EXPR
685 || TREE_CODE (expr) == MINUS_EXPR)
686 return (TREE_CODE (TREE_OPERAND (expr, 0)) == SSA_NAME
687 && TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST);
689 return is_gimple_min_invariant (expr);
692 /* Return
693 1 if VAL < VAL2
694 0 if !(VAL < VAL2)
695 -2 if those are incomparable. */
696 static inline int
697 operand_less_p (tree val, tree val2)
699 /* LT is folded faster than GE and others. Inline the common case. */
700 if (TREE_CODE (val) == INTEGER_CST && TREE_CODE (val2) == INTEGER_CST)
702 if (TYPE_UNSIGNED (TREE_TYPE (val)))
703 return INT_CST_LT_UNSIGNED (val, val2);
704 else
706 if (INT_CST_LT (val, val2))
707 return 1;
710 else
712 tree tcmp;
714 fold_defer_overflow_warnings ();
716 tcmp = fold_binary_to_constant (LT_EXPR, boolean_type_node, val, val2);
718 fold_undefer_and_ignore_overflow_warnings ();
720 if (!tcmp)
721 return -2;
723 if (!integer_zerop (tcmp))
724 return 1;
727 /* val >= val2, not considering overflow infinity. */
728 if (is_negative_overflow_infinity (val))
729 return is_negative_overflow_infinity (val2) ? 0 : 1;
730 else if (is_positive_overflow_infinity (val2))
731 return is_positive_overflow_infinity (val) ? 0 : 1;
733 return 0;
736 /* Compare two values VAL1 and VAL2. Return
738 -2 if VAL1 and VAL2 cannot be compared at compile-time,
739 -1 if VAL1 < VAL2,
740 0 if VAL1 == VAL2,
741 +1 if VAL1 > VAL2, and
742 +2 if VAL1 != VAL2
744 This is similar to tree_int_cst_compare but supports pointer values
745 and values that cannot be compared at compile time.
747 If STRICT_OVERFLOW_P is not NULL, then set *STRICT_OVERFLOW_P to
748 true if the return value is only valid if we assume that signed
749 overflow is undefined. */
751 static int
752 compare_values_warnv (tree val1, tree val2, bool *strict_overflow_p)
754 if (val1 == val2)
755 return 0;
757 /* Below we rely on the fact that VAL1 and VAL2 are both pointers or
758 both integers. */
759 gcc_assert (POINTER_TYPE_P (TREE_TYPE (val1))
760 == POINTER_TYPE_P (TREE_TYPE (val2)));
762 if ((TREE_CODE (val1) == SSA_NAME
763 || TREE_CODE (val1) == PLUS_EXPR
764 || TREE_CODE (val1) == MINUS_EXPR)
765 && (TREE_CODE (val2) == SSA_NAME
766 || TREE_CODE (val2) == PLUS_EXPR
767 || TREE_CODE (val2) == MINUS_EXPR))
769 tree n1, c1, n2, c2;
770 enum tree_code code1, code2;
772 /* If VAL1 and VAL2 are of the form 'NAME [+-] CST' or 'NAME',
773 return -1 or +1 accordingly. If VAL1 and VAL2 don't use the
774 same name, return -2. */
775 if (TREE_CODE (val1) == SSA_NAME)
777 code1 = SSA_NAME;
778 n1 = val1;
779 c1 = NULL_TREE;
781 else
783 code1 = TREE_CODE (val1);
784 n1 = TREE_OPERAND (val1, 0);
785 c1 = TREE_OPERAND (val1, 1);
786 if (tree_int_cst_sgn (c1) == -1)
788 if (is_negative_overflow_infinity (c1))
789 return -2;
790 c1 = fold_unary_to_constant (NEGATE_EXPR, TREE_TYPE (c1), c1);
791 if (!c1)
792 return -2;
793 code1 = code1 == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR;
797 if (TREE_CODE (val2) == SSA_NAME)
799 code2 = SSA_NAME;
800 n2 = val2;
801 c2 = NULL_TREE;
803 else
805 code2 = TREE_CODE (val2);
806 n2 = TREE_OPERAND (val2, 0);
807 c2 = TREE_OPERAND (val2, 1);
808 if (tree_int_cst_sgn (c2) == -1)
810 if (is_negative_overflow_infinity (c2))
811 return -2;
812 c2 = fold_unary_to_constant (NEGATE_EXPR, TREE_TYPE (c2), c2);
813 if (!c2)
814 return -2;
815 code2 = code2 == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR;
819 /* Both values must use the same name. */
820 if (n1 != n2)
821 return -2;
823 if (code1 == SSA_NAME
824 && code2 == SSA_NAME)
825 /* NAME == NAME */
826 return 0;
828 /* If overflow is defined we cannot simplify more. */
829 if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (val1)))
830 return -2;
832 if (strict_overflow_p != NULL)
833 *strict_overflow_p = true;
835 if (code1 == SSA_NAME)
837 if (code2 == PLUS_EXPR)
838 /* NAME < NAME + CST */
839 return -1;
840 else if (code2 == MINUS_EXPR)
841 /* NAME > NAME - CST */
842 return 1;
844 else if (code1 == PLUS_EXPR)
846 if (code2 == SSA_NAME)
847 /* NAME + CST > NAME */
848 return 1;
849 else if (code2 == PLUS_EXPR)
850 /* NAME + CST1 > NAME + CST2, if CST1 > CST2 */
851 return compare_values_warnv (c1, c2, strict_overflow_p);
852 else if (code2 == MINUS_EXPR)
853 /* NAME + CST1 > NAME - CST2 */
854 return 1;
856 else if (code1 == MINUS_EXPR)
858 if (code2 == SSA_NAME)
859 /* NAME - CST < NAME */
860 return -1;
861 else if (code2 == PLUS_EXPR)
862 /* NAME - CST1 < NAME + CST2 */
863 return -1;
864 else if (code2 == MINUS_EXPR)
865 /* NAME - CST1 > NAME - CST2, if CST1 < CST2. Notice that
866 C1 and C2 are swapped in the call to compare_values. */
867 return compare_values_warnv (c2, c1, strict_overflow_p);
870 gcc_unreachable ();
873 /* We cannot compare non-constants. */
874 if (!is_gimple_min_invariant (val1) || !is_gimple_min_invariant (val2))
875 return -2;
877 if (!POINTER_TYPE_P (TREE_TYPE (val1)))
879 /* We cannot compare overflowed values, except for overflow
880 infinities. */
881 if (TREE_OVERFLOW (val1) || TREE_OVERFLOW (val2))
883 if (strict_overflow_p != NULL)
884 *strict_overflow_p = true;
885 if (is_negative_overflow_infinity (val1))
886 return is_negative_overflow_infinity (val2) ? 0 : -1;
887 else if (is_negative_overflow_infinity (val2))
888 return 1;
889 else if (is_positive_overflow_infinity (val1))
890 return is_positive_overflow_infinity (val2) ? 0 : 1;
891 else if (is_positive_overflow_infinity (val2))
892 return -1;
893 return -2;
896 return tree_int_cst_compare (val1, val2);
898 else
900 tree t;
902 /* First see if VAL1 and VAL2 are not the same. */
903 if (val1 == val2 || operand_equal_p (val1, val2, 0))
904 return 0;
906 /* If VAL1 is a lower address than VAL2, return -1. */
907 if (operand_less_p (val1, val2) == 1)
908 return -1;
910 /* If VAL1 is a higher address than VAL2, return +1. */
911 if (operand_less_p (val2, val1) == 1)
912 return 1;
914 /* If VAL1 is different than VAL2, return +2.
915 For integer constants we either have already returned -1 or 1
916 or they are equivalent. We still might succeed in proving
917 something about non-trivial operands. */
918 if (TREE_CODE (val1) != INTEGER_CST
919 || TREE_CODE (val2) != INTEGER_CST)
921 t = fold_binary_to_constant (NE_EXPR, boolean_type_node, val1, val2);
922 if (t && tree_expr_nonzero_p (t))
923 return 2;
926 return -2;
930 /* Compare values like compare_values_warnv, but treat comparisons of
931 nonconstants which rely on undefined overflow as incomparable. */
933 static int
934 compare_values (tree val1, tree val2)
936 bool sop;
937 int ret;
939 sop = false;
940 ret = compare_values_warnv (val1, val2, &sop);
941 if (sop
942 && (!is_gimple_min_invariant (val1) || !is_gimple_min_invariant (val2)))
943 ret = -2;
944 return ret;
948 /* Return 1 if VAL is inside value range VR (VR->MIN <= VAL <= VR->MAX),
949 0 if VAL is not inside VR,
950 -2 if we cannot tell either way.
952 FIXME, the current semantics of this functions are a bit quirky
953 when taken in the context of VRP. In here we do not care
954 about VR's type. If VR is the anti-range ~[3, 5] the call
955 value_inside_range (4, VR) will return 1.
957 This is counter-intuitive in a strict sense, but the callers
958 currently expect this. They are calling the function
959 merely to determine whether VR->MIN <= VAL <= VR->MAX. The
960 callers are applying the VR_RANGE/VR_ANTI_RANGE semantics
961 themselves.
963 This also applies to value_ranges_intersect_p and
964 range_includes_zero_p. The semantics of VR_RANGE and
965 VR_ANTI_RANGE should be encoded here, but that also means
966 adapting the users of these functions to the new semantics.
968 Benchmark compile/20001226-1.c compilation time after changing this
969 function. */
971 static inline int
972 value_inside_range (tree val, value_range_t * vr)
974 int cmp1, cmp2;
976 cmp1 = operand_less_p (val, vr->min);
977 if (cmp1 == -2)
978 return -2;
979 if (cmp1 == 1)
980 return 0;
982 cmp2 = operand_less_p (vr->max, val);
983 if (cmp2 == -2)
984 return -2;
986 return !cmp2;
990 /* Return true if value ranges VR0 and VR1 have a non-empty
991 intersection.
993 Benchmark compile/20001226-1.c compilation time after changing this
994 function.
997 static inline bool
998 value_ranges_intersect_p (value_range_t *vr0, value_range_t *vr1)
1000 /* The value ranges do not intersect if the maximum of the first range is
1001 less than the minimum of the second range or vice versa.
1002 When those relations are unknown, we can't do any better. */
1003 if (operand_less_p (vr0->max, vr1->min) != 0)
1004 return false;
1005 if (operand_less_p (vr1->max, vr0->min) != 0)
1006 return false;
1007 return true;
1011 /* Return true if VR includes the value zero, false otherwise. FIXME,
1012 currently this will return false for an anti-range like ~[-4, 3].
1013 This will be wrong when the semantics of value_inside_range are
1014 modified (currently the users of this function expect these
1015 semantics). */
1017 static inline bool
1018 range_includes_zero_p (value_range_t *vr)
1020 tree zero;
1022 gcc_assert (vr->type != VR_UNDEFINED
1023 && vr->type != VR_VARYING
1024 && !symbolic_range_p (vr));
1026 zero = build_int_cst (TREE_TYPE (vr->min), 0);
1027 return (value_inside_range (zero, vr) == 1);
1030 /* Return true if T, an SSA_NAME, is known to be nonnegative. Return
1031 false otherwise or if no value range information is available. */
1033 bool
1034 ssa_name_nonnegative_p (tree t)
1036 value_range_t *vr = get_value_range (t);
1038 if (!vr)
1039 return false;
1041 /* Testing for VR_ANTI_RANGE is not useful here as any anti-range
1042 which would return a useful value should be encoded as a VR_RANGE. */
1043 if (vr->type == VR_RANGE)
1045 int result = compare_values (vr->min, integer_zero_node);
1047 return (result == 0 || result == 1);
1049 return false;
1052 /* Return true if T, an SSA_NAME, is known to be nonzero. Return
1053 false otherwise or if no value range information is available. */
1055 bool
1056 ssa_name_nonzero_p (tree t)
1058 value_range_t *vr = get_value_range (t);
1060 if (!vr)
1061 return false;
1063 /* A VR_RANGE which does not include zero is a nonzero value. */
1064 if (vr->type == VR_RANGE && !symbolic_range_p (vr))
1065 return ! range_includes_zero_p (vr);
1067 /* A VR_ANTI_RANGE which does include zero is a nonzero value. */
1068 if (vr->type == VR_ANTI_RANGE && !symbolic_range_p (vr))
1069 return range_includes_zero_p (vr);
1071 return false;
1075 /* Extract value range information from an ASSERT_EXPR EXPR and store
1076 it in *VR_P. */
1078 static void
1079 extract_range_from_assert (value_range_t *vr_p, tree expr)
1081 tree var, cond, limit, min, max, type;
1082 value_range_t *var_vr, *limit_vr;
1083 enum tree_code cond_code;
1085 var = ASSERT_EXPR_VAR (expr);
1086 cond = ASSERT_EXPR_COND (expr);
1088 gcc_assert (COMPARISON_CLASS_P (cond));
1090 /* Find VAR in the ASSERT_EXPR conditional. */
1091 if (var == TREE_OPERAND (cond, 0))
1093 /* If the predicate is of the form VAR COMP LIMIT, then we just
1094 take LIMIT from the RHS and use the same comparison code. */
1095 limit = TREE_OPERAND (cond, 1);
1096 cond_code = TREE_CODE (cond);
1098 else
1100 /* If the predicate is of the form LIMIT COMP VAR, then we need
1101 to flip around the comparison code to create the proper range
1102 for VAR. */
1103 limit = TREE_OPERAND (cond, 0);
1104 cond_code = swap_tree_comparison (TREE_CODE (cond));
1107 type = TREE_TYPE (limit);
1108 gcc_assert (limit != var);
1110 /* For pointer arithmetic, we only keep track of pointer equality
1111 and inequality. */
1112 if (POINTER_TYPE_P (type) && cond_code != NE_EXPR && cond_code != EQ_EXPR)
1114 set_value_range_to_varying (vr_p);
1115 return;
1118 /* If LIMIT is another SSA name and LIMIT has a range of its own,
1119 try to use LIMIT's range to avoid creating symbolic ranges
1120 unnecessarily. */
1121 limit_vr = (TREE_CODE (limit) == SSA_NAME) ? get_value_range (limit) : NULL;
1123 /* LIMIT's range is only interesting if it has any useful information. */
1124 if (limit_vr
1125 && (limit_vr->type == VR_UNDEFINED
1126 || limit_vr->type == VR_VARYING
1127 || symbolic_range_p (limit_vr)))
1128 limit_vr = NULL;
1130 /* Initially, the new range has the same set of equivalences of
1131 VAR's range. This will be revised before returning the final
1132 value. Since assertions may be chained via mutually exclusive
1133 predicates, we will need to trim the set of equivalences before
1134 we are done. */
1135 gcc_assert (vr_p->equiv == NULL);
1136 add_equivalence (&vr_p->equiv, var);
1138 /* Extract a new range based on the asserted comparison for VAR and
1139 LIMIT's value range. Notice that if LIMIT has an anti-range, we
1140 will only use it for equality comparisons (EQ_EXPR). For any
1141 other kind of assertion, we cannot derive a range from LIMIT's
1142 anti-range that can be used to describe the new range. For
1143 instance, ASSERT_EXPR <x_2, x_2 <= b_4>. If b_4 is ~[2, 10],
1144 then b_4 takes on the ranges [-INF, 1] and [11, +INF]. There is
1145 no single range for x_2 that could describe LE_EXPR, so we might
1146 as well build the range [b_4, +INF] for it. */
1147 if (cond_code == EQ_EXPR)
1149 enum value_range_type range_type;
1151 if (limit_vr)
1153 range_type = limit_vr->type;
1154 min = limit_vr->min;
1155 max = limit_vr->max;
1157 else
1159 range_type = VR_RANGE;
1160 min = limit;
1161 max = limit;
1164 set_value_range (vr_p, range_type, min, max, vr_p->equiv);
1166 /* When asserting the equality VAR == LIMIT and LIMIT is another
1167 SSA name, the new range will also inherit the equivalence set
1168 from LIMIT. */
1169 if (TREE_CODE (limit) == SSA_NAME)
1170 add_equivalence (&vr_p->equiv, limit);
1172 else if (cond_code == NE_EXPR)
1174 /* As described above, when LIMIT's range is an anti-range and
1175 this assertion is an inequality (NE_EXPR), then we cannot
1176 derive anything from the anti-range. For instance, if
1177 LIMIT's range was ~[0, 0], the assertion 'VAR != LIMIT' does
1178 not imply that VAR's range is [0, 0]. So, in the case of
1179 anti-ranges, we just assert the inequality using LIMIT and
1180 not its anti-range.
1182 If LIMIT_VR is a range, we can only use it to build a new
1183 anti-range if LIMIT_VR is a single-valued range. For
1184 instance, if LIMIT_VR is [0, 1], the predicate
1185 VAR != [0, 1] does not mean that VAR's range is ~[0, 1].
1186 Rather, it means that for value 0 VAR should be ~[0, 0]
1187 and for value 1, VAR should be ~[1, 1]. We cannot
1188 represent these ranges.
1190 The only situation in which we can build a valid
1191 anti-range is when LIMIT_VR is a single-valued range
1192 (i.e., LIMIT_VR->MIN == LIMIT_VR->MAX). In that case,
1193 build the anti-range ~[LIMIT_VR->MIN, LIMIT_VR->MAX]. */
1194 if (limit_vr
1195 && limit_vr->type == VR_RANGE
1196 && compare_values (limit_vr->min, limit_vr->max) == 0)
1198 min = limit_vr->min;
1199 max = limit_vr->max;
1201 else
1203 /* In any other case, we cannot use LIMIT's range to build a
1204 valid anti-range. */
1205 min = max = limit;
1208 /* If MIN and MAX cover the whole range for their type, then
1209 just use the original LIMIT. */
1210 if (INTEGRAL_TYPE_P (type)
1211 && vrp_val_is_min (min)
1212 && vrp_val_is_max (max))
1213 min = max = limit;
1215 set_value_range (vr_p, VR_ANTI_RANGE, min, max, vr_p->equiv);
1217 else if (cond_code == LE_EXPR || cond_code == LT_EXPR)
1219 min = TYPE_MIN_VALUE (type);
1221 if (limit_vr == NULL || limit_vr->type == VR_ANTI_RANGE)
1222 max = limit;
1223 else
1225 /* If LIMIT_VR is of the form [N1, N2], we need to build the
1226 range [MIN, N2] for LE_EXPR and [MIN, N2 - 1] for
1227 LT_EXPR. */
1228 max = limit_vr->max;
1231 /* If the maximum value forces us to be out of bounds, simply punt.
1232 It would be pointless to try and do anything more since this
1233 all should be optimized away above us. */
1234 if ((cond_code == LT_EXPR
1235 && compare_values (max, min) == 0)
1236 || is_overflow_infinity (max))
1237 set_value_range_to_varying (vr_p);
1238 else
1240 /* For LT_EXPR, we create the range [MIN, MAX - 1]. */
1241 if (cond_code == LT_EXPR)
1243 tree one = build_int_cst (type, 1);
1244 max = fold_build2 (MINUS_EXPR, type, max, one);
1247 set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
1250 else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
1252 max = TYPE_MAX_VALUE (type);
1254 if (limit_vr == NULL || limit_vr->type == VR_ANTI_RANGE)
1255 min = limit;
1256 else
1258 /* If LIMIT_VR is of the form [N1, N2], we need to build the
1259 range [N1, MAX] for GE_EXPR and [N1 + 1, MAX] for
1260 GT_EXPR. */
1261 min = limit_vr->min;
1264 /* If the minimum value forces us to be out of bounds, simply punt.
1265 It would be pointless to try and do anything more since this
1266 all should be optimized away above us. */
1267 if ((cond_code == GT_EXPR
1268 && compare_values (min, max) == 0)
1269 || is_overflow_infinity (min))
1270 set_value_range_to_varying (vr_p);
1271 else
1273 /* For GT_EXPR, we create the range [MIN + 1, MAX]. */
1274 if (cond_code == GT_EXPR)
1276 tree one = build_int_cst (type, 1);
1277 min = fold_build2 (PLUS_EXPR, type, min, one);
1280 set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
1283 else
1284 gcc_unreachable ();
1286 /* If VAR already had a known range, it may happen that the new
1287 range we have computed and VAR's range are not compatible. For
1288 instance,
1290 if (p_5 == NULL)
1291 p_6 = ASSERT_EXPR <p_5, p_5 == NULL>;
1292 x_7 = p_6->fld;
1293 p_8 = ASSERT_EXPR <p_6, p_6 != NULL>;
1295 While the above comes from a faulty program, it will cause an ICE
1296 later because p_8 and p_6 will have incompatible ranges and at
1297 the same time will be considered equivalent. A similar situation
1298 would arise from
1300 if (i_5 > 10)
1301 i_6 = ASSERT_EXPR <i_5, i_5 > 10>;
1302 if (i_5 < 5)
1303 i_7 = ASSERT_EXPR <i_6, i_6 < 5>;
1305 Again i_6 and i_7 will have incompatible ranges. It would be
1306 pointless to try and do anything with i_7's range because
1307 anything dominated by 'if (i_5 < 5)' will be optimized away.
1308 Note, due to the wa in which simulation proceeds, the statement
1309 i_7 = ASSERT_EXPR <...> we would never be visited because the
1310 conditional 'if (i_5 < 5)' always evaluates to false. However,
1311 this extra check does not hurt and may protect against future
1312 changes to VRP that may get into a situation similar to the
1313 NULL pointer dereference example.
1315 Note that these compatibility tests are only needed when dealing
1316 with ranges or a mix of range and anti-range. If VAR_VR and VR_P
1317 are both anti-ranges, they will always be compatible, because two
1318 anti-ranges will always have a non-empty intersection. */
1320 var_vr = get_value_range (var);
1322 /* We may need to make adjustments when VR_P and VAR_VR are numeric
1323 ranges or anti-ranges. */
1324 if (vr_p->type == VR_VARYING
1325 || vr_p->type == VR_UNDEFINED
1326 || var_vr->type == VR_VARYING
1327 || var_vr->type == VR_UNDEFINED
1328 || symbolic_range_p (vr_p)
1329 || symbolic_range_p (var_vr))
1330 return;
1332 if (var_vr->type == VR_RANGE && vr_p->type == VR_RANGE)
1334 /* If the two ranges have a non-empty intersection, we can
1335 refine the resulting range. Since the assert expression
1336 creates an equivalency and at the same time it asserts a
1337 predicate, we can take the intersection of the two ranges to
1338 get better precision. */
1339 if (value_ranges_intersect_p (var_vr, vr_p))
1341 /* Use the larger of the two minimums. */
1342 if (compare_values (vr_p->min, var_vr->min) == -1)
1343 min = var_vr->min;
1344 else
1345 min = vr_p->min;
1347 /* Use the smaller of the two maximums. */
1348 if (compare_values (vr_p->max, var_vr->max) == 1)
1349 max = var_vr->max;
1350 else
1351 max = vr_p->max;
1353 set_value_range (vr_p, vr_p->type, min, max, vr_p->equiv);
1355 else
1357 /* The two ranges do not intersect, set the new range to
1358 VARYING, because we will not be able to do anything
1359 meaningful with it. */
1360 set_value_range_to_varying (vr_p);
1363 else if ((var_vr->type == VR_RANGE && vr_p->type == VR_ANTI_RANGE)
1364 || (var_vr->type == VR_ANTI_RANGE && vr_p->type == VR_RANGE))
1366 /* A range and an anti-range will cancel each other only if
1367 their ends are the same. For instance, in the example above,
1368 p_8's range ~[0, 0] and p_6's range [0, 0] are incompatible,
1369 so VR_P should be set to VR_VARYING. */
1370 if (compare_values (var_vr->min, vr_p->min) == 0
1371 && compare_values (var_vr->max, vr_p->max) == 0)
1372 set_value_range_to_varying (vr_p);
1373 else
1375 tree min, max, anti_min, anti_max, real_min, real_max;
1376 int cmp;
1378 /* We want to compute the logical AND of the two ranges;
1379 there are three cases to consider.
1382 1. The VR_ANTI_RANGE range is completely within the
1383 VR_RANGE and the endpoints of the ranges are
1384 different. In that case the resulting range
1385 should be whichever range is more precise.
1386 Typically that will be the VR_RANGE.
1388 2. The VR_ANTI_RANGE is completely disjoint from
1389 the VR_RANGE. In this case the resulting range
1390 should be the VR_RANGE.
1392 3. There is some overlap between the VR_ANTI_RANGE
1393 and the VR_RANGE.
1395 3a. If the high limit of the VR_ANTI_RANGE resides
1396 within the VR_RANGE, then the result is a new
1397 VR_RANGE starting at the high limit of the
1398 the VR_ANTI_RANGE + 1 and extending to the
1399 high limit of the original VR_RANGE.
1401 3b. If the low limit of the VR_ANTI_RANGE resides
1402 within the VR_RANGE, then the result is a new
1403 VR_RANGE starting at the low limit of the original
1404 VR_RANGE and extending to the low limit of the
1405 VR_ANTI_RANGE - 1. */
1406 if (vr_p->type == VR_ANTI_RANGE)
1408 anti_min = vr_p->min;
1409 anti_max = vr_p->max;
1410 real_min = var_vr->min;
1411 real_max = var_vr->max;
1413 else
1415 anti_min = var_vr->min;
1416 anti_max = var_vr->max;
1417 real_min = vr_p->min;
1418 real_max = vr_p->max;
1422 /* Case 1, VR_ANTI_RANGE completely within VR_RANGE,
1423 not including any endpoints. */
1424 if (compare_values (anti_max, real_max) == -1
1425 && compare_values (anti_min, real_min) == 1)
1427 set_value_range (vr_p, VR_RANGE, real_min,
1428 real_max, vr_p->equiv);
1430 /* Case 2, VR_ANTI_RANGE completely disjoint from
1431 VR_RANGE. */
1432 else if (compare_values (anti_min, real_max) == 1
1433 || compare_values (anti_max, real_min) == -1)
1435 set_value_range (vr_p, VR_RANGE, real_min,
1436 real_max, vr_p->equiv);
1438 /* Case 3a, the anti-range extends into the low
1439 part of the real range. Thus creating a new
1440 low for the real range. */
1441 else if (((cmp = compare_values (anti_max, real_min)) == 1
1442 || cmp == 0)
1443 && compare_values (anti_max, real_max) == -1)
1445 gcc_assert (!is_positive_overflow_infinity (anti_max));
1446 if (needs_overflow_infinity (TREE_TYPE (anti_max))
1447 && vrp_val_is_max (anti_max))
1449 if (!supports_overflow_infinity (TREE_TYPE (var_vr->min)))
1451 set_value_range_to_varying (vr_p);
1452 return;
1454 min = positive_overflow_infinity (TREE_TYPE (var_vr->min));
1456 else
1457 min = fold_build2 (PLUS_EXPR, TREE_TYPE (var_vr->min),
1458 anti_max,
1459 build_int_cst (TREE_TYPE (var_vr->min), 1));
1460 max = real_max;
1461 set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
1463 /* Case 3b, the anti-range extends into the high
1464 part of the real range. Thus creating a new
1465 higher for the real range. */
1466 else if (compare_values (anti_min, real_min) == 1
1467 && ((cmp = compare_values (anti_min, real_max)) == -1
1468 || cmp == 0))
1470 gcc_assert (!is_negative_overflow_infinity (anti_min));
1471 if (needs_overflow_infinity (TREE_TYPE (anti_min))
1472 && vrp_val_is_min (anti_min))
1474 if (!supports_overflow_infinity (TREE_TYPE (var_vr->min)))
1476 set_value_range_to_varying (vr_p);
1477 return;
1479 max = negative_overflow_infinity (TREE_TYPE (var_vr->min));
1481 else
1482 max = fold_build2 (MINUS_EXPR, TREE_TYPE (var_vr->min),
1483 anti_min,
1484 build_int_cst (TREE_TYPE (var_vr->min), 1));
1485 min = real_min;
1486 set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
1493 /* Extract range information from SSA name VAR and store it in VR. If
1494 VAR has an interesting range, use it. Otherwise, create the
1495 range [VAR, VAR] and return it. This is useful in situations where
1496 we may have conditionals testing values of VARYING names. For
1497 instance,
1499 x_3 = y_5;
1500 if (x_3 > y_5)
1503 Even if y_5 is deemed VARYING, we can determine that x_3 > y_5 is
1504 always false. */
1506 static void
1507 extract_range_from_ssa_name (value_range_t *vr, tree var)
1509 value_range_t *var_vr = get_value_range (var);
1511 if (var_vr->type != VR_UNDEFINED && var_vr->type != VR_VARYING)
1512 copy_value_range (vr, var_vr);
1513 else
1514 set_value_range (vr, VR_RANGE, var, var, NULL);
1516 add_equivalence (&vr->equiv, var);
1520 /* Wrapper around int_const_binop. If the operation overflows and we
1521 are not using wrapping arithmetic, then adjust the result to be
1522 -INF or +INF depending on CODE, VAL1 and VAL2. This can return
1523 NULL_TREE if we need to use an overflow infinity representation but
1524 the type does not support it. */
1526 static tree
1527 vrp_int_const_binop (enum tree_code code, tree val1, tree val2)
1529 tree res;
1531 res = int_const_binop (code, val1, val2, 0);
1533 /* If we are not using wrapping arithmetic, operate symbolically
1534 on -INF and +INF. */
1535 if (TYPE_OVERFLOW_WRAPS (TREE_TYPE (val1)))
1537 int checkz = compare_values (res, val1);
1538 bool overflow = false;
1540 /* Ensure that res = val1 [+*] val2 >= val1
1541 or that res = val1 - val2 <= val1. */
1542 if ((code == PLUS_EXPR
1543 && !(checkz == 1 || checkz == 0))
1544 || (code == MINUS_EXPR
1545 && !(checkz == 0 || checkz == -1)))
1547 overflow = true;
1549 /* Checking for multiplication overflow is done by dividing the
1550 output of the multiplication by the first input of the
1551 multiplication. If the result of that division operation is
1552 not equal to the second input of the multiplication, then the
1553 multiplication overflowed. */
1554 else if (code == MULT_EXPR && !integer_zerop (val1))
1556 tree tmp = int_const_binop (TRUNC_DIV_EXPR,
1557 res,
1558 val1, 0);
1559 int check = compare_values (tmp, val2);
1561 if (check != 0)
1562 overflow = true;
1565 if (overflow)
1567 res = copy_node (res);
1568 TREE_OVERFLOW (res) = 1;
1572 else if ((TREE_OVERFLOW (res)
1573 && !TREE_OVERFLOW (val1)
1574 && !TREE_OVERFLOW (val2))
1575 || is_overflow_infinity (val1)
1576 || is_overflow_infinity (val2))
1578 /* If the operation overflowed but neither VAL1 nor VAL2 are
1579 overflown, return -INF or +INF depending on the operation
1580 and the combination of signs of the operands. */
1581 int sgn1 = tree_int_cst_sgn (val1);
1582 int sgn2 = tree_int_cst_sgn (val2);
1584 if (needs_overflow_infinity (TREE_TYPE (res))
1585 && !supports_overflow_infinity (TREE_TYPE (res)))
1586 return NULL_TREE;
1588 /* We have to punt on adding infinities of different signs,
1589 since we can't tell what the sign of the result should be.
1590 Likewise for subtracting infinities of the same sign. */
1591 if (((code == PLUS_EXPR && sgn1 != sgn2)
1592 || (code == MINUS_EXPR && sgn1 == sgn2))
1593 && is_overflow_infinity (val1)
1594 && is_overflow_infinity (val2))
1595 return NULL_TREE;
1597 /* Don't try to handle division or shifting of infinities. */
1598 if ((code == TRUNC_DIV_EXPR
1599 || code == FLOOR_DIV_EXPR
1600 || code == CEIL_DIV_EXPR
1601 || code == EXACT_DIV_EXPR
1602 || code == ROUND_DIV_EXPR
1603 || code == RSHIFT_EXPR)
1604 && (is_overflow_infinity (val1)
1605 || is_overflow_infinity (val2)))
1606 return NULL_TREE;
1608 /* Notice that we only need to handle the restricted set of
1609 operations handled by extract_range_from_binary_expr.
1610 Among them, only multiplication, addition and subtraction
1611 can yield overflow without overflown operands because we
1612 are working with integral types only... except in the
1613 case VAL1 = -INF and VAL2 = -1 which overflows to +INF
1614 for division too. */
1616 /* For multiplication, the sign of the overflow is given
1617 by the comparison of the signs of the operands. */
1618 if ((code == MULT_EXPR && sgn1 == sgn2)
1619 /* For addition, the operands must be of the same sign
1620 to yield an overflow. Its sign is therefore that
1621 of one of the operands, for example the first. For
1622 infinite operands X + -INF is negative, not positive. */
1623 || (code == PLUS_EXPR
1624 && (sgn1 >= 0
1625 ? !is_negative_overflow_infinity (val2)
1626 : is_positive_overflow_infinity (val2)))
1627 /* For subtraction, non-infinite operands must be of
1628 different signs to yield an overflow. Its sign is
1629 therefore that of the first operand or the opposite of
1630 that of the second operand. A first operand of 0 counts
1631 as positive here, for the corner case 0 - (-INF), which
1632 overflows, but must yield +INF. For infinite operands 0
1633 - INF is negative, not positive. */
1634 || (code == MINUS_EXPR
1635 && (sgn1 >= 0
1636 ? !is_positive_overflow_infinity (val2)
1637 : is_negative_overflow_infinity (val2)))
1638 /* We only get in here with positive shift count, so the
1639 overflow direction is the same as the sign of val1.
1640 Actually rshift does not overflow at all, but we only
1641 handle the case of shifting overflowed -INF and +INF. */
1642 || (code == RSHIFT_EXPR
1643 && sgn1 >= 0)
1644 /* For division, the only case is -INF / -1 = +INF. */
1645 || code == TRUNC_DIV_EXPR
1646 || code == FLOOR_DIV_EXPR
1647 || code == CEIL_DIV_EXPR
1648 || code == EXACT_DIV_EXPR
1649 || code == ROUND_DIV_EXPR)
1650 return (needs_overflow_infinity (TREE_TYPE (res))
1651 ? positive_overflow_infinity (TREE_TYPE (res))
1652 : TYPE_MAX_VALUE (TREE_TYPE (res)));
1653 else
1654 return (needs_overflow_infinity (TREE_TYPE (res))
1655 ? negative_overflow_infinity (TREE_TYPE (res))
1656 : TYPE_MIN_VALUE (TREE_TYPE (res)));
1659 return res;
1663 /* Extract range information from a binary expression EXPR based on
1664 the ranges of each of its operands and the expression code. */
1666 static void
1667 extract_range_from_binary_expr (value_range_t *vr, tree expr)
1669 enum tree_code code = TREE_CODE (expr);
1670 enum value_range_type type;
1671 tree op0, op1, min, max;
1672 int cmp;
1673 value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
1674 value_range_t vr1 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
1676 /* Not all binary expressions can be applied to ranges in a
1677 meaningful way. Handle only arithmetic operations. */
1678 if (code != PLUS_EXPR
1679 && code != MINUS_EXPR
1680 && code != MULT_EXPR
1681 && code != TRUNC_DIV_EXPR
1682 && code != FLOOR_DIV_EXPR
1683 && code != CEIL_DIV_EXPR
1684 && code != EXACT_DIV_EXPR
1685 && code != ROUND_DIV_EXPR
1686 && code != RSHIFT_EXPR
1687 && code != MIN_EXPR
1688 && code != MAX_EXPR
1689 && code != BIT_AND_EXPR
1690 && code != TRUTH_ANDIF_EXPR
1691 && code != TRUTH_ORIF_EXPR
1692 && code != TRUTH_AND_EXPR
1693 && code != TRUTH_OR_EXPR)
1695 set_value_range_to_varying (vr);
1696 return;
1699 /* Get value ranges for each operand. For constant operands, create
1700 a new value range with the operand to simplify processing. */
1701 op0 = TREE_OPERAND (expr, 0);
1702 if (TREE_CODE (op0) == SSA_NAME)
1703 vr0 = *(get_value_range (op0));
1704 else if (is_gimple_min_invariant (op0))
1705 set_value_range_to_value (&vr0, op0);
1706 else
1707 set_value_range_to_varying (&vr0);
1709 op1 = TREE_OPERAND (expr, 1);
1710 if (TREE_CODE (op1) == SSA_NAME)
1711 vr1 = *(get_value_range (op1));
1712 else if (is_gimple_min_invariant (op1))
1713 set_value_range_to_value (&vr1, op1);
1714 else
1715 set_value_range_to_varying (&vr1);
1717 /* If either range is UNDEFINED, so is the result. */
1718 if (vr0.type == VR_UNDEFINED || vr1.type == VR_UNDEFINED)
1720 set_value_range_to_undefined (vr);
1721 return;
1724 /* The type of the resulting value range defaults to VR0.TYPE. */
1725 type = vr0.type;
1727 /* Refuse to operate on VARYING ranges, ranges of different kinds
1728 and symbolic ranges. As an exception, we allow BIT_AND_EXPR
1729 because we may be able to derive a useful range even if one of
1730 the operands is VR_VARYING or symbolic range. TODO, we may be
1731 able to derive anti-ranges in some cases. */
1732 if (code != BIT_AND_EXPR
1733 && code != TRUTH_AND_EXPR
1734 && code != TRUTH_OR_EXPR
1735 && (vr0.type == VR_VARYING
1736 || vr1.type == VR_VARYING
1737 || vr0.type != vr1.type
1738 || symbolic_range_p (&vr0)
1739 || symbolic_range_p (&vr1)))
1741 set_value_range_to_varying (vr);
1742 return;
1745 /* Now evaluate the expression to determine the new range. */
1746 if (POINTER_TYPE_P (TREE_TYPE (expr))
1747 || POINTER_TYPE_P (TREE_TYPE (op0))
1748 || POINTER_TYPE_P (TREE_TYPE (op1)))
1750 /* For pointer types, we are really only interested in asserting
1751 whether the expression evaluates to non-NULL. FIXME, we used
1752 to gcc_assert (code == PLUS_EXPR || code == MINUS_EXPR), but
1753 ivopts is generating expressions with pointer multiplication
1754 in them. */
1755 if (code == PLUS_EXPR)
1757 if (range_is_nonnull (&vr0) || range_is_nonnull (&vr1))
1758 set_value_range_to_nonnull (vr, TREE_TYPE (expr));
1759 else if (range_is_null (&vr0) && range_is_null (&vr1))
1760 set_value_range_to_null (vr, TREE_TYPE (expr));
1761 else
1762 set_value_range_to_varying (vr);
1764 else
1766 /* Subtracting from a pointer, may yield 0, so just drop the
1767 resulting range to varying. */
1768 set_value_range_to_varying (vr);
1771 return;
1774 /* For integer ranges, apply the operation to each end of the
1775 range and see what we end up with. */
1776 if (code == TRUTH_ANDIF_EXPR
1777 || code == TRUTH_ORIF_EXPR
1778 || code == TRUTH_AND_EXPR
1779 || code == TRUTH_OR_EXPR)
1781 /* If one of the operands is zero, we know that the whole
1782 expression evaluates zero. */
1783 if (code == TRUTH_AND_EXPR
1784 && ((vr0.type == VR_RANGE
1785 && integer_zerop (vr0.min)
1786 && integer_zerop (vr0.max))
1787 || (vr1.type == VR_RANGE
1788 && integer_zerop (vr1.min)
1789 && integer_zerop (vr1.max))))
1791 type = VR_RANGE;
1792 min = max = build_int_cst (TREE_TYPE (expr), 0);
1794 /* If one of the operands is one, we know that the whole
1795 expression evaluates one. */
1796 else if (code == TRUTH_OR_EXPR
1797 && ((vr0.type == VR_RANGE
1798 && integer_onep (vr0.min)
1799 && integer_onep (vr0.max))
1800 || (vr1.type == VR_RANGE
1801 && integer_onep (vr1.min)
1802 && integer_onep (vr1.max))))
1804 type = VR_RANGE;
1805 min = max = build_int_cst (TREE_TYPE (expr), 1);
1807 else if (vr0.type != VR_VARYING
1808 && vr1.type != VR_VARYING
1809 && vr0.type == vr1.type
1810 && !symbolic_range_p (&vr0)
1811 && !overflow_infinity_range_p (&vr0)
1812 && !symbolic_range_p (&vr1)
1813 && !overflow_infinity_range_p (&vr1))
1815 /* Boolean expressions cannot be folded with int_const_binop. */
1816 min = fold_binary (code, TREE_TYPE (expr), vr0.min, vr1.min);
1817 max = fold_binary (code, TREE_TYPE (expr), vr0.max, vr1.max);
1819 else
1821 /* The result of a TRUTH_*_EXPR is always true or false. */
1822 set_value_range_to_truthvalue (vr, TREE_TYPE (expr));
1823 return;
1826 else if (code == PLUS_EXPR
1827 || code == MIN_EXPR
1828 || code == MAX_EXPR)
1830 /* If we have a PLUS_EXPR with two VR_ANTI_RANGEs, drop to
1831 VR_VARYING. It would take more effort to compute a precise
1832 range for such a case. For example, if we have op0 == 1 and
1833 op1 == -1 with their ranges both being ~[0,0], we would have
1834 op0 + op1 == 0, so we cannot claim that the sum is in ~[0,0].
1835 Note that we are guaranteed to have vr0.type == vr1.type at
1836 this point. */
1837 if (code == PLUS_EXPR && vr0.type == VR_ANTI_RANGE)
1839 set_value_range_to_varying (vr);
1840 return;
1843 /* For operations that make the resulting range directly
1844 proportional to the original ranges, apply the operation to
1845 the same end of each range. */
1846 min = vrp_int_const_binop (code, vr0.min, vr1.min);
1847 max = vrp_int_const_binop (code, vr0.max, vr1.max);
1849 else if (code == MULT_EXPR
1850 || code == TRUNC_DIV_EXPR
1851 || code == FLOOR_DIV_EXPR
1852 || code == CEIL_DIV_EXPR
1853 || code == EXACT_DIV_EXPR
1854 || code == ROUND_DIV_EXPR
1855 || code == RSHIFT_EXPR)
1857 tree val[4];
1858 size_t i;
1859 bool sop;
1861 /* If we have an unsigned MULT_EXPR with two VR_ANTI_RANGEs,
1862 drop to VR_VARYING. It would take more effort to compute a
1863 precise range for such a case. For example, if we have
1864 op0 == 65536 and op1 == 65536 with their ranges both being
1865 ~[0,0] on a 32-bit machine, we would have op0 * op1 == 0, so
1866 we cannot claim that the product is in ~[0,0]. Note that we
1867 are guaranteed to have vr0.type == vr1.type at this
1868 point. */
1869 if (code == MULT_EXPR
1870 && vr0.type == VR_ANTI_RANGE
1871 && !TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0)))
1873 set_value_range_to_varying (vr);
1874 return;
1877 /* If we have a RSHIFT_EXPR with any shift values outside [0..prec-1],
1878 then drop to VR_VARYING. Outside of this range we get undefined
1879 behavior from the shift operation. We cannot even trust
1880 SHIFT_COUNT_TRUNCATED at this stage, because that applies to rtl
1881 shifts, and the operation at the tree level may be widened. */
1882 if (code == RSHIFT_EXPR)
1884 if (vr1.type == VR_ANTI_RANGE
1885 || !vrp_expr_computes_nonnegative (op1, &sop)
1886 || (operand_less_p
1887 (build_int_cst (TREE_TYPE (vr1.max),
1888 TYPE_PRECISION (TREE_TYPE (expr)) - 1),
1889 vr1.max) != 0))
1891 set_value_range_to_varying (vr);
1892 return;
1896 /* Multiplications and divisions are a bit tricky to handle,
1897 depending on the mix of signs we have in the two ranges, we
1898 need to operate on different values to get the minimum and
1899 maximum values for the new range. One approach is to figure
1900 out all the variations of range combinations and do the
1901 operations.
1903 However, this involves several calls to compare_values and it
1904 is pretty convoluted. It's simpler to do the 4 operations
1905 (MIN0 OP MIN1, MIN0 OP MAX1, MAX0 OP MIN1 and MAX0 OP MAX0 OP
1906 MAX1) and then figure the smallest and largest values to form
1907 the new range. */
1909 /* Divisions by zero result in a VARYING value. */
1910 else if (code != MULT_EXPR
1911 && (vr0.type == VR_ANTI_RANGE || range_includes_zero_p (&vr1)))
1913 set_value_range_to_varying (vr);
1914 return;
1917 /* Compute the 4 cross operations. */
1918 sop = false;
1919 val[0] = vrp_int_const_binop (code, vr0.min, vr1.min);
1920 if (val[0] == NULL_TREE)
1921 sop = true;
1923 if (vr1.max == vr1.min)
1924 val[1] = NULL_TREE;
1925 else
1927 val[1] = vrp_int_const_binop (code, vr0.min, vr1.max);
1928 if (val[1] == NULL_TREE)
1929 sop = true;
1932 if (vr0.max == vr0.min)
1933 val[2] = NULL_TREE;
1934 else
1936 val[2] = vrp_int_const_binop (code, vr0.max, vr1.min);
1937 if (val[2] == NULL_TREE)
1938 sop = true;
1941 if (vr0.min == vr0.max || vr1.min == vr1.max)
1942 val[3] = NULL_TREE;
1943 else
1945 val[3] = vrp_int_const_binop (code, vr0.max, vr1.max);
1946 if (val[3] == NULL_TREE)
1947 sop = true;
1950 if (sop)
1952 set_value_range_to_varying (vr);
1953 return;
1956 /* Set MIN to the minimum of VAL[i] and MAX to the maximum
1957 of VAL[i]. */
1958 min = val[0];
1959 max = val[0];
1960 for (i = 1; i < 4; i++)
1962 if (!is_gimple_min_invariant (min)
1963 || (TREE_OVERFLOW (min) && !is_overflow_infinity (min))
1964 || !is_gimple_min_invariant (max)
1965 || (TREE_OVERFLOW (max) && !is_overflow_infinity (max)))
1966 break;
1968 if (val[i])
1970 if (!is_gimple_min_invariant (val[i])
1971 || (TREE_OVERFLOW (val[i])
1972 && !is_overflow_infinity (val[i])))
1974 /* If we found an overflowed value, set MIN and MAX
1975 to it so that we set the resulting range to
1976 VARYING. */
1977 min = max = val[i];
1978 break;
1981 if (compare_values (val[i], min) == -1)
1982 min = val[i];
1984 if (compare_values (val[i], max) == 1)
1985 max = val[i];
1989 else if (code == MINUS_EXPR)
1991 /* If we have a MINUS_EXPR with two VR_ANTI_RANGEs, drop to
1992 VR_VARYING. It would take more effort to compute a precise
1993 range for such a case. For example, if we have op0 == 1 and
1994 op1 == 1 with their ranges both being ~[0,0], we would have
1995 op0 - op1 == 0, so we cannot claim that the difference is in
1996 ~[0,0]. Note that we are guaranteed to have
1997 vr0.type == vr1.type at this point. */
1998 if (vr0.type == VR_ANTI_RANGE)
2000 set_value_range_to_varying (vr);
2001 return;
2004 /* For MINUS_EXPR, apply the operation to the opposite ends of
2005 each range. */
2006 min = vrp_int_const_binop (code, vr0.min, vr1.max);
2007 max = vrp_int_const_binop (code, vr0.max, vr1.min);
2009 else if (code == BIT_AND_EXPR)
2011 if (vr0.type == VR_RANGE
2012 && vr0.min == vr0.max
2013 && TREE_CODE (vr0.max) == INTEGER_CST
2014 && !TREE_OVERFLOW (vr0.max)
2015 && tree_int_cst_sgn (vr0.max) >= 0)
2017 min = build_int_cst (TREE_TYPE (expr), 0);
2018 max = vr0.max;
2020 else if (vr1.type == VR_RANGE
2021 && vr1.min == vr1.max
2022 && TREE_CODE (vr1.max) == INTEGER_CST
2023 && !TREE_OVERFLOW (vr1.max)
2024 && tree_int_cst_sgn (vr1.max) >= 0)
2026 type = VR_RANGE;
2027 min = build_int_cst (TREE_TYPE (expr), 0);
2028 max = vr1.max;
2030 else
2032 set_value_range_to_varying (vr);
2033 return;
2036 else
2037 gcc_unreachable ();
2039 /* If either MIN or MAX overflowed, then set the resulting range to
2040 VARYING. But we do accept an overflow infinity
2041 representation. */
2042 if (min == NULL_TREE
2043 || !is_gimple_min_invariant (min)
2044 || (TREE_OVERFLOW (min) && !is_overflow_infinity (min))
2045 || max == NULL_TREE
2046 || !is_gimple_min_invariant (max)
2047 || (TREE_OVERFLOW (max) && !is_overflow_infinity (max)))
2049 set_value_range_to_varying (vr);
2050 return;
2053 /* We punt if:
2054 1) [-INF, +INF]
2055 2) [-INF, +-INF(OVF)]
2056 3) [+-INF(OVF), +INF]
2057 4) [+-INF(OVF), +-INF(OVF)]
2058 We learn nothing when we have INF and INF(OVF) on both sides.
2059 Note that we do accept [-INF, -INF] and [+INF, +INF] without
2060 overflow. */
2061 if ((vrp_val_is_min (min) || is_overflow_infinity (min))
2062 && (vrp_val_is_max (max) || is_overflow_infinity (max)))
2064 set_value_range_to_varying (vr);
2065 return;
2068 cmp = compare_values (min, max);
2069 if (cmp == -2 || cmp == 1)
2071 /* If the new range has its limits swapped around (MIN > MAX),
2072 then the operation caused one of them to wrap around, mark
2073 the new range VARYING. */
2074 set_value_range_to_varying (vr);
2076 else
2077 set_value_range (vr, type, min, max, NULL);
2081 /* Extract range information from a unary expression EXPR based on
2082 the range of its operand and the expression code. */
2084 static void
2085 extract_range_from_unary_expr (value_range_t *vr, tree expr)
2087 enum tree_code code = TREE_CODE (expr);
2088 tree min, max, op0;
2089 int cmp;
2090 value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
2092 /* Refuse to operate on certain unary expressions for which we
2093 cannot easily determine a resulting range. */
2094 if (code == FIX_TRUNC_EXPR
2095 || code == FLOAT_EXPR
2096 || code == BIT_NOT_EXPR
2097 || code == NON_LVALUE_EXPR
2098 || code == CONJ_EXPR)
2100 set_value_range_to_varying (vr);
2101 return;
2104 /* Get value ranges for the operand. For constant operands, create
2105 a new value range with the operand to simplify processing. */
2106 op0 = TREE_OPERAND (expr, 0);
2107 if (TREE_CODE (op0) == SSA_NAME)
2108 vr0 = *(get_value_range (op0));
2109 else if (is_gimple_min_invariant (op0))
2110 set_value_range_to_value (&vr0, op0);
2111 else
2112 set_value_range_to_varying (&vr0);
2114 /* If VR0 is UNDEFINED, so is the result. */
2115 if (vr0.type == VR_UNDEFINED)
2117 set_value_range_to_undefined (vr);
2118 return;
2121 /* Refuse to operate on symbolic ranges, or if neither operand is
2122 a pointer or integral type. */
2123 if ((!INTEGRAL_TYPE_P (TREE_TYPE (op0))
2124 && !POINTER_TYPE_P (TREE_TYPE (op0)))
2125 || (vr0.type != VR_VARYING
2126 && symbolic_range_p (&vr0)))
2128 set_value_range_to_varying (vr);
2129 return;
2132 /* If the expression involves pointers, we are only interested in
2133 determining if it evaluates to NULL [0, 0] or non-NULL (~[0, 0]). */
2134 if (POINTER_TYPE_P (TREE_TYPE (expr)) || POINTER_TYPE_P (TREE_TYPE (op0)))
2136 bool sop;
2138 sop = false;
2139 if (range_is_nonnull (&vr0)
2140 || (tree_expr_nonzero_warnv_p (expr, &sop)
2141 && !sop))
2142 set_value_range_to_nonnull (vr, TREE_TYPE (expr));
2143 else if (range_is_null (&vr0))
2144 set_value_range_to_null (vr, TREE_TYPE (expr));
2145 else
2146 set_value_range_to_varying (vr);
2148 return;
2151 /* Handle unary expressions on integer ranges. */
2152 if (code == NOP_EXPR || code == CONVERT_EXPR)
2154 tree inner_type = TREE_TYPE (op0);
2155 tree outer_type = TREE_TYPE (expr);
2157 /* If VR0 represents a simple range, then try to convert
2158 the min and max values for the range to the same type
2159 as OUTER_TYPE. If the results compare equal to VR0's
2160 min and max values and the new min is still less than
2161 or equal to the new max, then we can safely use the newly
2162 computed range for EXPR. This allows us to compute
2163 accurate ranges through many casts. */
2164 if ((vr0.type == VR_RANGE
2165 && !overflow_infinity_range_p (&vr0))
2166 || (vr0.type == VR_VARYING
2167 && TYPE_PRECISION (outer_type) > TYPE_PRECISION (inner_type)))
2169 tree new_min, new_max, orig_min, orig_max;
2171 /* Convert the input operand min/max to OUTER_TYPE. If
2172 the input has no range information, then use the min/max
2173 for the input's type. */
2174 if (vr0.type == VR_RANGE)
2176 orig_min = vr0.min;
2177 orig_max = vr0.max;
2179 else
2181 orig_min = TYPE_MIN_VALUE (inner_type);
2182 orig_max = TYPE_MAX_VALUE (inner_type);
2185 new_min = fold_convert (outer_type, orig_min);
2186 new_max = fold_convert (outer_type, orig_max);
2188 /* Verify the new min/max values are gimple values and
2189 that they compare equal to the original input's
2190 min/max values. */
2191 if (is_gimple_val (new_min)
2192 && is_gimple_val (new_max)
2193 && tree_int_cst_equal (new_min, orig_min)
2194 && tree_int_cst_equal (new_max, orig_max)
2195 && (cmp = compare_values (new_min, new_max)) <= 0
2196 && cmp >= -1)
2198 set_value_range (vr, VR_RANGE, new_min, new_max, vr->equiv);
2199 return;
2203 /* When converting types of different sizes, set the result to
2204 VARYING. Things like sign extensions and precision loss may
2205 change the range. For instance, if x_3 is of type 'long long
2206 int' and 'y_5 = (unsigned short) x_3', if x_3 is ~[0, 0], it
2207 is impossible to know at compile time whether y_5 will be
2208 ~[0, 0]. */
2209 if (TYPE_SIZE (inner_type) != TYPE_SIZE (outer_type)
2210 || TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
2212 set_value_range_to_varying (vr);
2213 return;
2217 /* Conversion of a VR_VARYING value to a wider type can result
2218 in a usable range. So wait until after we've handled conversions
2219 before dropping the result to VR_VARYING if we had a source
2220 operand that is VR_VARYING. */
2221 if (vr0.type == VR_VARYING)
2223 set_value_range_to_varying (vr);
2224 return;
2227 /* Apply the operation to each end of the range and see what we end
2228 up with. */
2229 if (code == NEGATE_EXPR
2230 && !TYPE_UNSIGNED (TREE_TYPE (expr)))
2232 /* NEGATE_EXPR flips the range around. We need to treat
2233 TYPE_MIN_VALUE specially. */
2234 if (is_positive_overflow_infinity (vr0.max))
2235 min = negative_overflow_infinity (TREE_TYPE (expr));
2236 else if (is_negative_overflow_infinity (vr0.max))
2237 min = positive_overflow_infinity (TREE_TYPE (expr));
2238 else if (!vrp_val_is_min (vr0.max))
2239 min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
2240 else if (needs_overflow_infinity (TREE_TYPE (expr)))
2242 if (supports_overflow_infinity (TREE_TYPE (expr))
2243 && !is_overflow_infinity (vr0.min)
2244 && !vrp_val_is_min (vr0.min))
2245 min = positive_overflow_infinity (TREE_TYPE (expr));
2246 else
2248 set_value_range_to_varying (vr);
2249 return;
2252 else
2253 min = TYPE_MIN_VALUE (TREE_TYPE (expr));
2255 if (is_positive_overflow_infinity (vr0.min))
2256 max = negative_overflow_infinity (TREE_TYPE (expr));
2257 else if (is_negative_overflow_infinity (vr0.min))
2258 max = positive_overflow_infinity (TREE_TYPE (expr));
2259 else if (!vrp_val_is_min (vr0.min))
2260 max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
2261 else if (needs_overflow_infinity (TREE_TYPE (expr)))
2263 if (supports_overflow_infinity (TREE_TYPE (expr)))
2264 max = positive_overflow_infinity (TREE_TYPE (expr));
2265 else
2267 set_value_range_to_varying (vr);
2268 return;
2271 else
2272 max = TYPE_MIN_VALUE (TREE_TYPE (expr));
2274 else if (code == NEGATE_EXPR
2275 && TYPE_UNSIGNED (TREE_TYPE (expr)))
2277 if (!range_includes_zero_p (&vr0))
2279 max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
2280 min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
2282 else
2284 if (range_is_null (&vr0))
2285 set_value_range_to_null (vr, TREE_TYPE (expr));
2286 else
2287 set_value_range_to_varying (vr);
2288 return;
2291 else if (code == ABS_EXPR
2292 && !TYPE_UNSIGNED (TREE_TYPE (expr)))
2294 /* -TYPE_MIN_VALUE = TYPE_MIN_VALUE with flag_wrapv so we can't get a
2295 useful range. */
2296 if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (expr))
2297 && ((vr0.type == VR_RANGE
2298 && vrp_val_is_min (vr0.min))
2299 || (vr0.type == VR_ANTI_RANGE
2300 && !vrp_val_is_min (vr0.min)
2301 && !range_includes_zero_p (&vr0))))
2303 set_value_range_to_varying (vr);
2304 return;
2307 /* ABS_EXPR may flip the range around, if the original range
2308 included negative values. */
2309 if (is_overflow_infinity (vr0.min))
2310 min = positive_overflow_infinity (TREE_TYPE (expr));
2311 else if (!vrp_val_is_min (vr0.min))
2312 min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
2313 else if (!needs_overflow_infinity (TREE_TYPE (expr)))
2314 min = TYPE_MAX_VALUE (TREE_TYPE (expr));
2315 else if (supports_overflow_infinity (TREE_TYPE (expr)))
2316 min = positive_overflow_infinity (TREE_TYPE (expr));
2317 else
2319 set_value_range_to_varying (vr);
2320 return;
2323 if (is_overflow_infinity (vr0.max))
2324 max = positive_overflow_infinity (TREE_TYPE (expr));
2325 else if (!vrp_val_is_min (vr0.max))
2326 max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
2327 else if (!needs_overflow_infinity (TREE_TYPE (expr)))
2328 max = TYPE_MAX_VALUE (TREE_TYPE (expr));
2329 else if (supports_overflow_infinity (TREE_TYPE (expr)))
2330 max = positive_overflow_infinity (TREE_TYPE (expr));
2331 else
2333 set_value_range_to_varying (vr);
2334 return;
2337 cmp = compare_values (min, max);
2339 /* If a VR_ANTI_RANGEs contains zero, then we have
2340 ~[-INF, min(MIN, MAX)]. */
2341 if (vr0.type == VR_ANTI_RANGE)
2343 if (range_includes_zero_p (&vr0))
2345 /* Take the lower of the two values. */
2346 if (cmp != 1)
2347 max = min;
2349 /* Create ~[-INF, min (abs(MIN), abs(MAX))]
2350 or ~[-INF + 1, min (abs(MIN), abs(MAX))] when
2351 flag_wrapv is set and the original anti-range doesn't include
2352 TYPE_MIN_VALUE, remember -TYPE_MIN_VALUE = TYPE_MIN_VALUE. */
2353 if (TYPE_OVERFLOW_WRAPS (TREE_TYPE (expr)))
2355 tree type_min_value = TYPE_MIN_VALUE (TREE_TYPE (expr));
2357 min = (vr0.min != type_min_value
2358 ? int_const_binop (PLUS_EXPR, type_min_value,
2359 integer_one_node, 0)
2360 : type_min_value);
2362 else
2364 if (overflow_infinity_range_p (&vr0))
2365 min = negative_overflow_infinity (TREE_TYPE (expr));
2366 else
2367 min = TYPE_MIN_VALUE (TREE_TYPE (expr));
2370 else
2372 /* All else has failed, so create the range [0, INF], even for
2373 flag_wrapv since TYPE_MIN_VALUE is in the original
2374 anti-range. */
2375 vr0.type = VR_RANGE;
2376 min = build_int_cst (TREE_TYPE (expr), 0);
2377 if (needs_overflow_infinity (TREE_TYPE (expr)))
2379 if (supports_overflow_infinity (TREE_TYPE (expr)))
2380 max = positive_overflow_infinity (TREE_TYPE (expr));
2381 else
2383 set_value_range_to_varying (vr);
2384 return;
2387 else
2388 max = TYPE_MAX_VALUE (TREE_TYPE (expr));
2392 /* If the range contains zero then we know that the minimum value in the
2393 range will be zero. */
2394 else if (range_includes_zero_p (&vr0))
2396 if (cmp == 1)
2397 max = min;
2398 min = build_int_cst (TREE_TYPE (expr), 0);
2400 else
2402 /* If the range was reversed, swap MIN and MAX. */
2403 if (cmp == 1)
2405 tree t = min;
2406 min = max;
2407 max = t;
2411 else
2413 /* Otherwise, operate on each end of the range. */
2414 min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
2415 max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
2417 if (needs_overflow_infinity (TREE_TYPE (expr)))
2419 gcc_assert (code != NEGATE_EXPR && code != ABS_EXPR);
2421 /* If both sides have overflowed, we don't know
2422 anything. */
2423 if ((is_overflow_infinity (vr0.min)
2424 || TREE_OVERFLOW (min))
2425 && (is_overflow_infinity (vr0.max)
2426 || TREE_OVERFLOW (max)))
2428 set_value_range_to_varying (vr);
2429 return;
2432 if (is_overflow_infinity (vr0.min))
2433 min = vr0.min;
2434 else if (TREE_OVERFLOW (min))
2436 if (supports_overflow_infinity (TREE_TYPE (expr)))
2437 min = (tree_int_cst_sgn (min) >= 0
2438 ? positive_overflow_infinity (TREE_TYPE (min))
2439 : negative_overflow_infinity (TREE_TYPE (min)));
2440 else
2442 set_value_range_to_varying (vr);
2443 return;
2447 if (is_overflow_infinity (vr0.max))
2448 max = vr0.max;
2449 else if (TREE_OVERFLOW (max))
2451 if (supports_overflow_infinity (TREE_TYPE (expr)))
2452 max = (tree_int_cst_sgn (max) >= 0
2453 ? positive_overflow_infinity (TREE_TYPE (max))
2454 : negative_overflow_infinity (TREE_TYPE (max)));
2455 else
2457 set_value_range_to_varying (vr);
2458 return;
2464 cmp = compare_values (min, max);
2465 if (cmp == -2 || cmp == 1)
2467 /* If the new range has its limits swapped around (MIN > MAX),
2468 then the operation caused one of them to wrap around, mark
2469 the new range VARYING. */
2470 set_value_range_to_varying (vr);
2472 else
2473 set_value_range (vr, vr0.type, min, max, NULL);
2477 /* Extract range information from a conditional expression EXPR based on
2478 the ranges of each of its operands and the expression code. */
2480 static void
2481 extract_range_from_cond_expr (value_range_t *vr, tree expr)
2483 tree op0, op1;
2484 value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
2485 value_range_t vr1 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
2487 /* Get value ranges for each operand. For constant operands, create
2488 a new value range with the operand to simplify processing. */
2489 op0 = COND_EXPR_THEN (expr);
2490 if (TREE_CODE (op0) == SSA_NAME)
2491 vr0 = *(get_value_range (op0));
2492 else if (is_gimple_min_invariant (op0))
2493 set_value_range_to_value (&vr0, op0);
2494 else
2495 set_value_range_to_varying (&vr0);
2497 op1 = COND_EXPR_ELSE (expr);
2498 if (TREE_CODE (op1) == SSA_NAME)
2499 vr1 = *(get_value_range (op1));
2500 else if (is_gimple_min_invariant (op1))
2501 set_value_range_to_value (&vr1, op1);
2502 else
2503 set_value_range_to_varying (&vr1);
2505 /* The resulting value range is the union of the operand ranges */
2506 vrp_meet (&vr0, &vr1);
2507 copy_value_range (vr, &vr0);
2511 /* Extract range information from a comparison expression EXPR based
2512 on the range of its operand and the expression code. */
2514 static void
2515 extract_range_from_comparison (value_range_t *vr, tree expr)
2517 bool sop = false;
2518 tree val = vrp_evaluate_conditional_warnv (expr, false, &sop);
2520 /* A disadvantage of using a special infinity as an overflow
2521 representation is that we lose the ability to record overflow
2522 when we don't have an infinity. So we have to ignore a result
2523 which relies on overflow. */
2525 if (val && !is_overflow_infinity (val) && !sop)
2527 /* Since this expression was found on the RHS of an assignment,
2528 its type may be different from _Bool. Convert VAL to EXPR's
2529 type. */
2530 val = fold_convert (TREE_TYPE (expr), val);
2531 set_value_range (vr, VR_RANGE, val, val, vr->equiv);
2533 else
2534 /* The result of a comparison is always true or false. */
2535 set_value_range_to_truthvalue (vr, TREE_TYPE (expr));
2539 /* Try to compute a useful range out of expression EXPR and store it
2540 in *VR. */
2542 static void
2543 extract_range_from_expr (value_range_t *vr, tree expr)
2545 enum tree_code code = TREE_CODE (expr);
2547 if (code == ASSERT_EXPR)
2548 extract_range_from_assert (vr, expr);
2549 else if (code == SSA_NAME)
2550 extract_range_from_ssa_name (vr, expr);
2551 else if (TREE_CODE_CLASS (code) == tcc_binary
2552 || code == TRUTH_ANDIF_EXPR
2553 || code == TRUTH_ORIF_EXPR
2554 || code == TRUTH_AND_EXPR
2555 || code == TRUTH_OR_EXPR
2556 || code == TRUTH_XOR_EXPR)
2557 extract_range_from_binary_expr (vr, expr);
2558 else if (TREE_CODE_CLASS (code) == tcc_unary)
2559 extract_range_from_unary_expr (vr, expr);
2560 else if (code == COND_EXPR)
2561 extract_range_from_cond_expr (vr, expr);
2562 else if (TREE_CODE_CLASS (code) == tcc_comparison)
2563 extract_range_from_comparison (vr, expr);
2564 else if (is_gimple_min_invariant (expr))
2565 set_value_range_to_value (vr, expr);
2566 else
2567 set_value_range_to_varying (vr);
2569 /* If we got a varying range from the tests above, try a final
2570 time to derive a nonnegative or nonzero range. This time
2571 relying primarily on generic routines in fold in conjunction
2572 with range data. */
2573 if (vr->type == VR_VARYING)
2575 bool sop = false;
2577 if (INTEGRAL_TYPE_P (TREE_TYPE (expr))
2578 && vrp_expr_computes_nonnegative (expr, &sop))
2579 set_value_range_to_nonnegative (vr, TREE_TYPE (expr),
2580 sop || is_overflow_infinity (expr));
2581 else if (vrp_expr_computes_nonzero (expr, &sop)
2582 && !sop)
2583 set_value_range_to_nonnull (vr, TREE_TYPE (expr));
2587 /* Given a range VR, a LOOP and a variable VAR, determine whether it
2588 would be profitable to adjust VR using scalar evolution information
2589 for VAR. If so, update VR with the new limits. */
2591 static void
2592 adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt,
2593 tree var)
2595 tree init, step, chrec, tmin, tmax, min, max, type;
2596 enum ev_direction dir;
2598 /* TODO. Don't adjust anti-ranges. An anti-range may provide
2599 better opportunities than a regular range, but I'm not sure. */
2600 if (vr->type == VR_ANTI_RANGE)
2601 return;
2603 chrec = instantiate_parameters (loop, analyze_scalar_evolution (loop, var));
2604 if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
2605 return;
2607 init = initial_condition_in_loop_num (chrec, loop->num);
2608 step = evolution_part_in_loop_num (chrec, loop->num);
2610 /* If STEP is symbolic, we can't know whether INIT will be the
2611 minimum or maximum value in the range. Also, unless INIT is
2612 a simple expression, compare_values and possibly other functions
2613 in tree-vrp won't be able to handle it. */
2614 if (step == NULL_TREE
2615 || !is_gimple_min_invariant (step)
2616 || !valid_value_p (init))
2617 return;
2619 dir = scev_direction (chrec);
2620 if (/* Do not adjust ranges if we do not know whether the iv increases
2621 or decreases, ... */
2622 dir == EV_DIR_UNKNOWN
2623 /* ... or if it may wrap. */
2624 || scev_probably_wraps_p (init, step, stmt, get_chrec_loop (chrec),
2625 true))
2626 return;
2628 /* We use TYPE_MIN_VALUE and TYPE_MAX_VALUE here instead of
2629 negative_overflow_infinity and positive_overflow_infinity,
2630 because we have concluded that the loop probably does not
2631 wrap. */
2633 type = TREE_TYPE (var);
2634 if (POINTER_TYPE_P (type) || !TYPE_MIN_VALUE (type))
2635 tmin = lower_bound_in_type (type, type);
2636 else
2637 tmin = TYPE_MIN_VALUE (type);
2638 if (POINTER_TYPE_P (type) || !TYPE_MAX_VALUE (type))
2639 tmax = upper_bound_in_type (type, type);
2640 else
2641 tmax = TYPE_MAX_VALUE (type);
2643 if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
2645 min = tmin;
2646 max = tmax;
2648 /* For VARYING or UNDEFINED ranges, just about anything we get
2649 from scalar evolutions should be better. */
2651 if (dir == EV_DIR_DECREASES)
2652 max = init;
2653 else
2654 min = init;
2656 /* If we would create an invalid range, then just assume we
2657 know absolutely nothing. This may be over-conservative,
2658 but it's clearly safe, and should happen only in unreachable
2659 parts of code, or for invalid programs. */
2660 if (compare_values (min, max) == 1)
2661 return;
2663 set_value_range (vr, VR_RANGE, min, max, vr->equiv);
2665 else if (vr->type == VR_RANGE)
2667 min = vr->min;
2668 max = vr->max;
2670 if (dir == EV_DIR_DECREASES)
2672 /* INIT is the maximum value. If INIT is lower than VR->MAX
2673 but no smaller than VR->MIN, set VR->MAX to INIT. */
2674 if (compare_values (init, max) == -1)
2676 max = init;
2678 /* If we just created an invalid range with the minimum
2679 greater than the maximum, we fail conservatively.
2680 This should happen only in unreachable
2681 parts of code, or for invalid programs. */
2682 if (compare_values (min, max) == 1)
2683 return;
2686 else
2688 /* If INIT is bigger than VR->MIN, set VR->MIN to INIT. */
2689 if (compare_values (init, min) == 1)
2691 min = init;
2693 /* Again, avoid creating invalid range by failing. */
2694 if (compare_values (min, max) == 1)
2695 return;
2699 set_value_range (vr, VR_RANGE, min, max, vr->equiv);
2704 /* Given two numeric value ranges VR0, VR1 and a comparison code COMP:
2706 - Return BOOLEAN_TRUE_NODE if VR0 COMP VR1 always returns true for
2707 all the values in the ranges.
2709 - Return BOOLEAN_FALSE_NODE if the comparison always returns false.
2711 - Return NULL_TREE if it is not always possible to determine the
2712 value of the comparison.
2714 Also set *STRICT_OVERFLOW_P to indicate whether a range with an
2715 overflow infinity was used in the test. */
2718 static tree
2719 compare_ranges (enum tree_code comp, value_range_t *vr0, value_range_t *vr1,
2720 bool *strict_overflow_p)
2722 /* VARYING or UNDEFINED ranges cannot be compared. */
2723 if (vr0->type == VR_VARYING
2724 || vr0->type == VR_UNDEFINED
2725 || vr1->type == VR_VARYING
2726 || vr1->type == VR_UNDEFINED)
2727 return NULL_TREE;
2729 /* Anti-ranges need to be handled separately. */
2730 if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
2732 /* If both are anti-ranges, then we cannot compute any
2733 comparison. */
2734 if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
2735 return NULL_TREE;
2737 /* These comparisons are never statically computable. */
2738 if (comp == GT_EXPR
2739 || comp == GE_EXPR
2740 || comp == LT_EXPR
2741 || comp == LE_EXPR)
2742 return NULL_TREE;
2744 /* Equality can be computed only between a range and an
2745 anti-range. ~[VAL1, VAL2] == [VAL1, VAL2] is always false. */
2746 if (vr0->type == VR_RANGE)
2748 /* To simplify processing, make VR0 the anti-range. */
2749 value_range_t *tmp = vr0;
2750 vr0 = vr1;
2751 vr1 = tmp;
2754 gcc_assert (comp == NE_EXPR || comp == EQ_EXPR);
2756 if (compare_values_warnv (vr0->min, vr1->min, strict_overflow_p) == 0
2757 && compare_values_warnv (vr0->max, vr1->max, strict_overflow_p) == 0)
2758 return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
2760 return NULL_TREE;
2763 if (!usable_range_p (vr0, strict_overflow_p)
2764 || !usable_range_p (vr1, strict_overflow_p))
2765 return NULL_TREE;
2767 /* Simplify processing. If COMP is GT_EXPR or GE_EXPR, switch the
2768 operands around and change the comparison code. */
2769 if (comp == GT_EXPR || comp == GE_EXPR)
2771 value_range_t *tmp;
2772 comp = (comp == GT_EXPR) ? LT_EXPR : LE_EXPR;
2773 tmp = vr0;
2774 vr0 = vr1;
2775 vr1 = tmp;
2778 if (comp == EQ_EXPR)
2780 /* Equality may only be computed if both ranges represent
2781 exactly one value. */
2782 if (compare_values_warnv (vr0->min, vr0->max, strict_overflow_p) == 0
2783 && compare_values_warnv (vr1->min, vr1->max, strict_overflow_p) == 0)
2785 int cmp_min = compare_values_warnv (vr0->min, vr1->min,
2786 strict_overflow_p);
2787 int cmp_max = compare_values_warnv (vr0->max, vr1->max,
2788 strict_overflow_p);
2789 if (cmp_min == 0 && cmp_max == 0)
2790 return boolean_true_node;
2791 else if (cmp_min != -2 && cmp_max != -2)
2792 return boolean_false_node;
2794 /* If [V0_MIN, V1_MAX] < [V1_MIN, V1_MAX] then V0 != V1. */
2795 else if (compare_values_warnv (vr0->min, vr1->max,
2796 strict_overflow_p) == 1
2797 || compare_values_warnv (vr1->min, vr0->max,
2798 strict_overflow_p) == 1)
2799 return boolean_false_node;
2801 return NULL_TREE;
2803 else if (comp == NE_EXPR)
2805 int cmp1, cmp2;
2807 /* If VR0 is completely to the left or completely to the right
2808 of VR1, they are always different. Notice that we need to
2809 make sure that both comparisons yield similar results to
2810 avoid comparing values that cannot be compared at
2811 compile-time. */
2812 cmp1 = compare_values_warnv (vr0->max, vr1->min, strict_overflow_p);
2813 cmp2 = compare_values_warnv (vr0->min, vr1->max, strict_overflow_p);
2814 if ((cmp1 == -1 && cmp2 == -1) || (cmp1 == 1 && cmp2 == 1))
2815 return boolean_true_node;
2817 /* If VR0 and VR1 represent a single value and are identical,
2818 return false. */
2819 else if (compare_values_warnv (vr0->min, vr0->max,
2820 strict_overflow_p) == 0
2821 && compare_values_warnv (vr1->min, vr1->max,
2822 strict_overflow_p) == 0
2823 && compare_values_warnv (vr0->min, vr1->min,
2824 strict_overflow_p) == 0
2825 && compare_values_warnv (vr0->max, vr1->max,
2826 strict_overflow_p) == 0)
2827 return boolean_false_node;
2829 /* Otherwise, they may or may not be different. */
2830 else
2831 return NULL_TREE;
2833 else if (comp == LT_EXPR || comp == LE_EXPR)
2835 int tst;
2837 /* If VR0 is to the left of VR1, return true. */
2838 tst = compare_values_warnv (vr0->max, vr1->min, strict_overflow_p);
2839 if ((comp == LT_EXPR && tst == -1)
2840 || (comp == LE_EXPR && (tst == -1 || tst == 0)))
2842 if (overflow_infinity_range_p (vr0)
2843 || overflow_infinity_range_p (vr1))
2844 *strict_overflow_p = true;
2845 return boolean_true_node;
2848 /* If VR0 is to the right of VR1, return false. */
2849 tst = compare_values_warnv (vr0->min, vr1->max, strict_overflow_p);
2850 if ((comp == LT_EXPR && (tst == 0 || tst == 1))
2851 || (comp == LE_EXPR && tst == 1))
2853 if (overflow_infinity_range_p (vr0)
2854 || overflow_infinity_range_p (vr1))
2855 *strict_overflow_p = true;
2856 return boolean_false_node;
2859 /* Otherwise, we don't know. */
2860 return NULL_TREE;
2863 gcc_unreachable ();
2867 /* Given a value range VR, a value VAL and a comparison code COMP, return
2868 BOOLEAN_TRUE_NODE if VR COMP VAL always returns true for all the
2869 values in VR. Return BOOLEAN_FALSE_NODE if the comparison
2870 always returns false. Return NULL_TREE if it is not always
2871 possible to determine the value of the comparison. Also set
2872 *STRICT_OVERFLOW_P to indicate whether a range with an overflow
2873 infinity was used in the test. */
2875 static tree
2876 compare_range_with_value (enum tree_code comp, value_range_t *vr, tree val,
2877 bool *strict_overflow_p)
2879 if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
2880 return NULL_TREE;
2882 /* Anti-ranges need to be handled separately. */
2883 if (vr->type == VR_ANTI_RANGE)
2885 /* For anti-ranges, the only predicates that we can compute at
2886 compile time are equality and inequality. */
2887 if (comp == GT_EXPR
2888 || comp == GE_EXPR
2889 || comp == LT_EXPR
2890 || comp == LE_EXPR)
2891 return NULL_TREE;
2893 /* ~[VAL_1, VAL_2] OP VAL is known if VAL_1 <= VAL <= VAL_2. */
2894 if (value_inside_range (val, vr) == 1)
2895 return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
2897 return NULL_TREE;
2900 if (!usable_range_p (vr, strict_overflow_p))
2901 return NULL_TREE;
2903 if (comp == EQ_EXPR)
2905 /* EQ_EXPR may only be computed if VR represents exactly
2906 one value. */
2907 if (compare_values_warnv (vr->min, vr->max, strict_overflow_p) == 0)
2909 int cmp = compare_values_warnv (vr->min, val, strict_overflow_p);
2910 if (cmp == 0)
2911 return boolean_true_node;
2912 else if (cmp == -1 || cmp == 1 || cmp == 2)
2913 return boolean_false_node;
2915 else if (compare_values_warnv (val, vr->min, strict_overflow_p) == -1
2916 || compare_values_warnv (vr->max, val, strict_overflow_p) == -1)
2917 return boolean_false_node;
2919 return NULL_TREE;
2921 else if (comp == NE_EXPR)
2923 /* If VAL is not inside VR, then they are always different. */
2924 if (compare_values_warnv (vr->max, val, strict_overflow_p) == -1
2925 || compare_values_warnv (vr->min, val, strict_overflow_p) == 1)
2926 return boolean_true_node;
2928 /* If VR represents exactly one value equal to VAL, then return
2929 false. */
2930 if (compare_values_warnv (vr->min, vr->max, strict_overflow_p) == 0
2931 && compare_values_warnv (vr->min, val, strict_overflow_p) == 0)
2932 return boolean_false_node;
2934 /* Otherwise, they may or may not be different. */
2935 return NULL_TREE;
2937 else if (comp == LT_EXPR || comp == LE_EXPR)
2939 int tst;
2941 /* If VR is to the left of VAL, return true. */
2942 tst = compare_values_warnv (vr->max, val, strict_overflow_p);
2943 if ((comp == LT_EXPR && tst == -1)
2944 || (comp == LE_EXPR && (tst == -1 || tst == 0)))
2946 if (overflow_infinity_range_p (vr))
2947 *strict_overflow_p = true;
2948 return boolean_true_node;
2951 /* If VR is to the right of VAL, return false. */
2952 tst = compare_values_warnv (vr->min, val, strict_overflow_p);
2953 if ((comp == LT_EXPR && (tst == 0 || tst == 1))
2954 || (comp == LE_EXPR && tst == 1))
2956 if (overflow_infinity_range_p (vr))
2957 *strict_overflow_p = true;
2958 return boolean_false_node;
2961 /* Otherwise, we don't know. */
2962 return NULL_TREE;
2964 else if (comp == GT_EXPR || comp == GE_EXPR)
2966 int tst;
2968 /* If VR is to the right of VAL, return true. */
2969 tst = compare_values_warnv (vr->min, val, strict_overflow_p);
2970 if ((comp == GT_EXPR && tst == 1)
2971 || (comp == GE_EXPR && (tst == 0 || tst == 1)))
2973 if (overflow_infinity_range_p (vr))
2974 *strict_overflow_p = true;
2975 return boolean_true_node;
2978 /* If VR is to the left of VAL, return false. */
2979 tst = compare_values_warnv (vr->max, val, strict_overflow_p);
2980 if ((comp == GT_EXPR && (tst == -1 || tst == 0))
2981 || (comp == GE_EXPR && tst == -1))
2983 if (overflow_infinity_range_p (vr))
2984 *strict_overflow_p = true;
2985 return boolean_false_node;
2988 /* Otherwise, we don't know. */
2989 return NULL_TREE;
2992 gcc_unreachable ();
2996 /* Debugging dumps. */
2998 void dump_value_range (FILE *, value_range_t *);
2999 void debug_value_range (value_range_t *);
3000 void dump_all_value_ranges (FILE *);
3001 void debug_all_value_ranges (void);
3002 void dump_vr_equiv (FILE *, bitmap);
3003 void debug_vr_equiv (bitmap);
3006 /* Dump value range VR to FILE. */
3008 void
3009 dump_value_range (FILE *file, value_range_t *vr)
3011 if (vr == NULL)
3012 fprintf (file, "[]");
3013 else if (vr->type == VR_UNDEFINED)
3014 fprintf (file, "UNDEFINED");
3015 else if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
3017 tree type = TREE_TYPE (vr->min);
3019 fprintf (file, "%s[", (vr->type == VR_ANTI_RANGE) ? "~" : "");
3021 if (is_negative_overflow_infinity (vr->min))
3022 fprintf (file, "-INF(OVF)");
3023 else if (INTEGRAL_TYPE_P (type)
3024 && !TYPE_UNSIGNED (type)
3025 && vrp_val_is_min (vr->min))
3026 fprintf (file, "-INF");
3027 else
3028 print_generic_expr (file, vr->min, 0);
3030 fprintf (file, ", ");
3032 if (is_positive_overflow_infinity (vr->max))
3033 fprintf (file, "+INF(OVF)");
3034 else if (INTEGRAL_TYPE_P (type)
3035 && vrp_val_is_max (vr->max))
3036 fprintf (file, "+INF");
3037 else
3038 print_generic_expr (file, vr->max, 0);
3040 fprintf (file, "]");
3042 if (vr->equiv)
3044 bitmap_iterator bi;
3045 unsigned i, c = 0;
3047 fprintf (file, " EQUIVALENCES: { ");
3049 EXECUTE_IF_SET_IN_BITMAP (vr->equiv, 0, i, bi)
3051 print_generic_expr (file, ssa_name (i), 0);
3052 fprintf (file, " ");
3053 c++;
3056 fprintf (file, "} (%u elements)", c);
3059 else if (vr->type == VR_VARYING)
3060 fprintf (file, "VARYING");
3061 else
3062 fprintf (file, "INVALID RANGE");
3066 /* Dump value range VR to stderr. */
3068 void
3069 debug_value_range (value_range_t *vr)
3071 dump_value_range (stderr, vr);
3072 fprintf (stderr, "\n");
3076 /* Dump value ranges of all SSA_NAMEs to FILE. */
3078 void
3079 dump_all_value_ranges (FILE *file)
3081 size_t i;
3083 for (i = 0; i < num_ssa_names; i++)
3085 if (vr_value[i])
3087 print_generic_expr (file, ssa_name (i), 0);
3088 fprintf (file, ": ");
3089 dump_value_range (file, vr_value[i]);
3090 fprintf (file, "\n");
3094 fprintf (file, "\n");
3098 /* Dump all value ranges to stderr. */
3100 void
3101 debug_all_value_ranges (void)
3103 dump_all_value_ranges (stderr);
3107 /* Given a COND_EXPR COND of the form 'V OP W', and an SSA name V,
3108 create a new SSA name N and return the assertion assignment
3109 'V = ASSERT_EXPR <V, V OP W>'. */
3111 static tree
3112 build_assert_expr_for (tree cond, tree v)
3114 tree n, assertion;
3116 gcc_assert (TREE_CODE (v) == SSA_NAME);
3117 n = duplicate_ssa_name (v, NULL_TREE);
3119 if (COMPARISON_CLASS_P (cond))
3121 tree a = build2 (ASSERT_EXPR, TREE_TYPE (v), v, cond);
3122 assertion = build_gimple_modify_stmt (n, a);
3124 else if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
3126 /* Given !V, build the assignment N = false. */
3127 tree op0 = TREE_OPERAND (cond, 0);
3128 gcc_assert (op0 == v);
3129 assertion = build_gimple_modify_stmt (n, boolean_false_node);
3131 else if (TREE_CODE (cond) == SSA_NAME)
3133 /* Given V, build the assignment N = true. */
3134 gcc_assert (v == cond);
3135 assertion = build_gimple_modify_stmt (n, boolean_true_node);
3137 else
3138 gcc_unreachable ();
3140 SSA_NAME_DEF_STMT (n) = assertion;
3142 /* The new ASSERT_EXPR, creates a new SSA name that replaces the
3143 operand of the ASSERT_EXPR. Register the new name and the old one
3144 in the replacement table so that we can fix the SSA web after
3145 adding all the ASSERT_EXPRs. */
3146 register_new_name_mapping (n, v);
3148 return assertion;
3152 /* Return false if EXPR is a predicate expression involving floating
3153 point values. */
3155 static inline bool
3156 fp_predicate (tree expr)
3158 return (COMPARISON_CLASS_P (expr)
3159 && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 0))));
3163 /* If the range of values taken by OP can be inferred after STMT executes,
3164 return the comparison code (COMP_CODE_P) and value (VAL_P) that
3165 describes the inferred range. Return true if a range could be
3166 inferred. */
3168 static bool
3169 infer_value_range (tree stmt, tree op, enum tree_code *comp_code_p, tree *val_p)
3171 *val_p = NULL_TREE;
3172 *comp_code_p = ERROR_MARK;
3174 /* Do not attempt to infer anything in names that flow through
3175 abnormal edges. */
3176 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
3177 return false;
3179 /* Similarly, don't infer anything from statements that may throw
3180 exceptions. */
3181 if (tree_could_throw_p (stmt))
3182 return false;
3184 /* If STMT is the last statement of a basic block with no
3185 successors, there is no point inferring anything about any of its
3186 operands. We would not be able to find a proper insertion point
3187 for the assertion, anyway. */
3188 if (stmt_ends_bb_p (stmt) && EDGE_COUNT (bb_for_stmt (stmt)->succs) == 0)
3189 return false;
3191 /* We can only assume that a pointer dereference will yield
3192 non-NULL if -fdelete-null-pointer-checks is enabled. */
3193 if (flag_delete_null_pointer_checks && POINTER_TYPE_P (TREE_TYPE (op)))
3195 unsigned num_uses, num_loads, num_stores;
3197 count_uses_and_derefs (op, stmt, &num_uses, &num_loads, &num_stores);
3198 if (num_loads + num_stores > 0)
3200 *val_p = build_int_cst (TREE_TYPE (op), 0);
3201 *comp_code_p = NE_EXPR;
3202 return true;
3206 return false;
3210 void dump_asserts_for (FILE *, tree);
3211 void debug_asserts_for (tree);
3212 void dump_all_asserts (FILE *);
3213 void debug_all_asserts (void);
3215 /* Dump all the registered assertions for NAME to FILE. */
3217 void
3218 dump_asserts_for (FILE *file, tree name)
3220 assert_locus_t loc;
3222 fprintf (file, "Assertions to be inserted for ");
3223 print_generic_expr (file, name, 0);
3224 fprintf (file, "\n");
3226 loc = asserts_for[SSA_NAME_VERSION (name)];
3227 while (loc)
3229 fprintf (file, "\t");
3230 print_generic_expr (file, bsi_stmt (loc->si), 0);
3231 fprintf (file, "\n\tBB #%d", loc->bb->index);
3232 if (loc->e)
3234 fprintf (file, "\n\tEDGE %d->%d", loc->e->src->index,
3235 loc->e->dest->index);
3236 dump_edge_info (file, loc->e, 0);
3238 fprintf (file, "\n\tPREDICATE: ");
3239 print_generic_expr (file, name, 0);
3240 fprintf (file, " %s ", tree_code_name[(int)loc->comp_code]);
3241 print_generic_expr (file, loc->val, 0);
3242 fprintf (file, "\n\n");
3243 loc = loc->next;
3246 fprintf (file, "\n");
3250 /* Dump all the registered assertions for NAME to stderr. */
3252 void
3253 debug_asserts_for (tree name)
3255 dump_asserts_for (stderr, name);
3259 /* Dump all the registered assertions for all the names to FILE. */
3261 void
3262 dump_all_asserts (FILE *file)
3264 unsigned i;
3265 bitmap_iterator bi;
3267 fprintf (file, "\nASSERT_EXPRs to be inserted\n\n");
3268 EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
3269 dump_asserts_for (file, ssa_name (i));
3270 fprintf (file, "\n");
3274 /* Dump all the registered assertions for all the names to stderr. */
3276 void
3277 debug_all_asserts (void)
3279 dump_all_asserts (stderr);
3283 /* If NAME doesn't have an ASSERT_EXPR registered for asserting
3284 'NAME COMP_CODE VAL' at a location that dominates block BB or
3285 E->DEST, then register this location as a possible insertion point
3286 for ASSERT_EXPR <NAME, NAME COMP_CODE VAL>.
3288 BB, E and SI provide the exact insertion point for the new
3289 ASSERT_EXPR. If BB is NULL, then the ASSERT_EXPR is to be inserted
3290 on edge E. Otherwise, if E is NULL, the ASSERT_EXPR is inserted on
3291 BB. If SI points to a COND_EXPR or a SWITCH_EXPR statement, then E
3292 must not be NULL. */
3294 static void
3295 register_new_assert_for (tree name,
3296 enum tree_code comp_code,
3297 tree val,
3298 basic_block bb,
3299 edge e,
3300 block_stmt_iterator si)
3302 assert_locus_t n, loc, last_loc;
3303 bool found;
3304 basic_block dest_bb;
3306 #if defined ENABLE_CHECKING
3307 gcc_assert (bb == NULL || e == NULL);
3309 if (e == NULL)
3310 gcc_assert (TREE_CODE (bsi_stmt (si)) != COND_EXPR
3311 && TREE_CODE (bsi_stmt (si)) != SWITCH_EXPR);
3312 #endif
3314 /* The new assertion A will be inserted at BB or E. We need to
3315 determine if the new location is dominated by a previously
3316 registered location for A. If we are doing an edge insertion,
3317 assume that A will be inserted at E->DEST. Note that this is not
3318 necessarily true.
3320 If E is a critical edge, it will be split. But even if E is
3321 split, the new block will dominate the same set of blocks that
3322 E->DEST dominates.
3324 The reverse, however, is not true, blocks dominated by E->DEST
3325 will not be dominated by the new block created to split E. So,
3326 if the insertion location is on a critical edge, we will not use
3327 the new location to move another assertion previously registered
3328 at a block dominated by E->DEST. */
3329 dest_bb = (bb) ? bb : e->dest;
3331 /* If NAME already has an ASSERT_EXPR registered for COMP_CODE and
3332 VAL at a block dominating DEST_BB, then we don't need to insert a new
3333 one. Similarly, if the same assertion already exists at a block
3334 dominated by DEST_BB and the new location is not on a critical
3335 edge, then update the existing location for the assertion (i.e.,
3336 move the assertion up in the dominance tree).
3338 Note, this is implemented as a simple linked list because there
3339 should not be more than a handful of assertions registered per
3340 name. If this becomes a performance problem, a table hashed by
3341 COMP_CODE and VAL could be implemented. */
3342 loc = asserts_for[SSA_NAME_VERSION (name)];
3343 last_loc = loc;
3344 found = false;
3345 while (loc)
3347 if (loc->comp_code == comp_code
3348 && (loc->val == val
3349 || operand_equal_p (loc->val, val, 0)))
3351 /* If the assertion NAME COMP_CODE VAL has already been
3352 registered at a basic block that dominates DEST_BB, then
3353 we don't need to insert the same assertion again. Note
3354 that we don't check strict dominance here to avoid
3355 replicating the same assertion inside the same basic
3356 block more than once (e.g., when a pointer is
3357 dereferenced several times inside a block).
3359 An exception to this rule are edge insertions. If the
3360 new assertion is to be inserted on edge E, then it will
3361 dominate all the other insertions that we may want to
3362 insert in DEST_BB. So, if we are doing an edge
3363 insertion, don't do this dominance check. */
3364 if (e == NULL
3365 && dominated_by_p (CDI_DOMINATORS, dest_bb, loc->bb))
3366 return;
3368 /* Otherwise, if E is not a critical edge and DEST_BB
3369 dominates the existing location for the assertion, move
3370 the assertion up in the dominance tree by updating its
3371 location information. */
3372 if ((e == NULL || !EDGE_CRITICAL_P (e))
3373 && dominated_by_p (CDI_DOMINATORS, loc->bb, dest_bb))
3375 loc->bb = dest_bb;
3376 loc->e = e;
3377 loc->si = si;
3378 return;
3382 /* Update the last node of the list and move to the next one. */
3383 last_loc = loc;
3384 loc = loc->next;
3387 /* If we didn't find an assertion already registered for
3388 NAME COMP_CODE VAL, add a new one at the end of the list of
3389 assertions associated with NAME. */
3390 n = XNEW (struct assert_locus_d);
3391 n->bb = dest_bb;
3392 n->e = e;
3393 n->si = si;
3394 n->comp_code = comp_code;
3395 n->val = val;
3396 n->next = NULL;
3398 if (last_loc)
3399 last_loc->next = n;
3400 else
3401 asserts_for[SSA_NAME_VERSION (name)] = n;
3403 bitmap_set_bit (need_assert_for, SSA_NAME_VERSION (name));
3406 /* COND is a predicate which uses NAME. Extract a suitable test code
3407 and value and store them into *CODE_P and *VAL_P so the predicate
3408 is normalized to NAME *CODE_P *VAL_P.
3410 If no extraction was possible, return FALSE, otherwise return TRUE.
3412 If INVERT is true, then we invert the result stored into *CODE_P. */
3414 static bool
3415 extract_code_and_val_from_cond (tree name, tree cond, bool invert,
3416 enum tree_code *code_p, tree *val_p)
3418 enum tree_code comp_code;
3419 tree val;
3421 /* Predicates may be a single SSA name or NAME OP VAL. */
3422 if (cond == name)
3424 /* If the predicate is a name, it must be NAME, in which
3425 case we create the predicate NAME == true or
3426 NAME == false accordingly. */
3427 comp_code = EQ_EXPR;
3428 val = invert ? boolean_false_node : boolean_true_node;
3430 else
3432 /* Otherwise, we have a comparison of the form NAME COMP VAL
3433 or VAL COMP NAME. */
3434 if (name == TREE_OPERAND (cond, 1))
3436 /* If the predicate is of the form VAL COMP NAME, flip
3437 COMP around because we need to register NAME as the
3438 first operand in the predicate. */
3439 comp_code = swap_tree_comparison (TREE_CODE (cond));
3440 val = TREE_OPERAND (cond, 0);
3442 else
3444 /* The comparison is of the form NAME COMP VAL, so the
3445 comparison code remains unchanged. */
3446 comp_code = TREE_CODE (cond);
3447 val = TREE_OPERAND (cond, 1);
3450 /* Invert the comparison code as necessary. */
3451 if (invert)
3452 comp_code = invert_tree_comparison (comp_code, 0);
3454 /* VRP does not handle float types. */
3455 if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (val)))
3456 return false;
3458 /* Do not register always-false predicates.
3459 FIXME: this works around a limitation in fold() when dealing with
3460 enumerations. Given 'enum { N1, N2 } x;', fold will not
3461 fold 'if (x > N2)' to 'if (0)'. */
3462 if ((comp_code == GT_EXPR || comp_code == LT_EXPR)
3463 && INTEGRAL_TYPE_P (TREE_TYPE (val)))
3465 tree min = TYPE_MIN_VALUE (TREE_TYPE (val));
3466 tree max = TYPE_MAX_VALUE (TREE_TYPE (val));
3468 if (comp_code == GT_EXPR
3469 && (!max
3470 || compare_values (val, max) == 0))
3471 return false;
3473 if (comp_code == LT_EXPR
3474 && (!min
3475 || compare_values (val, min) == 0))
3476 return false;
3479 *code_p = comp_code;
3480 *val_p = val;
3481 return true;
3484 /* OP is an operand of a truth value expression which is known to have
3485 a particular value. Register any asserts for OP and for any
3486 operands in OP's defining statement.
3488 If CODE is EQ_EXPR, then we want to register OP is zero (false),
3489 if CODE is NE_EXPR, then we want to register OP is nonzero (true). */
3491 static bool
3492 register_edge_assert_for_1 (tree op, enum tree_code code,
3493 edge e, block_stmt_iterator bsi)
3495 bool retval = false;
3496 tree op_def, rhs, val;
3498 /* We only care about SSA_NAMEs. */
3499 if (TREE_CODE (op) != SSA_NAME)
3500 return false;
3502 /* We know that OP will have a zero or nonzero value. If OP is used
3503 more than once go ahead and register an assert for OP.
3505 The FOUND_IN_SUBGRAPH support is not helpful in this situation as
3506 it will always be set for OP (because OP is used in a COND_EXPR in
3507 the subgraph). */
3508 if (!has_single_use (op))
3510 val = build_int_cst (TREE_TYPE (op), 0);
3511 register_new_assert_for (op, code, val, NULL, e, bsi);
3512 retval = true;
3515 /* Now look at how OP is set. If it's set from a comparison,
3516 a truth operation or some bit operations, then we may be able
3517 to register information about the operands of that assignment. */
3518 op_def = SSA_NAME_DEF_STMT (op);
3519 if (TREE_CODE (op_def) != GIMPLE_MODIFY_STMT)
3520 return retval;
3522 rhs = GIMPLE_STMT_OPERAND (op_def, 1);
3524 if (COMPARISON_CLASS_P (rhs))
3526 bool invert = (code == EQ_EXPR ? true : false);
3527 tree op0 = TREE_OPERAND (rhs, 0);
3528 tree op1 = TREE_OPERAND (rhs, 1);
3530 /* Conditionally register an assert for each SSA_NAME in the
3531 comparison. */
3532 if (TREE_CODE (op0) == SSA_NAME
3533 && !has_single_use (op0)
3534 && extract_code_and_val_from_cond (op0, rhs,
3535 invert, &code, &val))
3537 register_new_assert_for (op0, code, val, NULL, e, bsi);
3538 retval = true;
3541 /* Similarly for the second operand of the comparison. */
3542 if (TREE_CODE (op1) == SSA_NAME
3543 && !has_single_use (op1)
3544 && extract_code_and_val_from_cond (op1, rhs,
3545 invert, &code, &val))
3547 register_new_assert_for (op1, code, val, NULL, e, bsi);
3548 retval = true;
3551 else if ((code == NE_EXPR
3552 && (TREE_CODE (rhs) == TRUTH_AND_EXPR
3553 || TREE_CODE (rhs) == BIT_AND_EXPR))
3554 || (code == EQ_EXPR
3555 && (TREE_CODE (rhs) == TRUTH_OR_EXPR
3556 || TREE_CODE (rhs) == BIT_IOR_EXPR)))
3558 /* Recurse on each operand. */
3559 retval |= register_edge_assert_for_1 (TREE_OPERAND (rhs, 0),
3560 code, e, bsi);
3561 retval |= register_edge_assert_for_1 (TREE_OPERAND (rhs, 1),
3562 code, e, bsi);
3564 else if (TREE_CODE (rhs) == TRUTH_NOT_EXPR)
3566 /* Recurse, flipping CODE. */
3567 code = invert_tree_comparison (code, false);
3568 retval |= register_edge_assert_for_1 (TREE_OPERAND (rhs, 0),
3569 code, e, bsi);
3571 else if (TREE_CODE (rhs) == SSA_NAME)
3573 /* Recurse through the copy. */
3574 retval |= register_edge_assert_for_1 (rhs, code, e, bsi);
3576 else if (TREE_CODE (rhs) == NOP_EXPR
3577 || TREE_CODE (rhs) == CONVERT_EXPR
3578 || TREE_CODE (rhs) == NON_LVALUE_EXPR)
3580 /* Recurse through the type conversion. */
3581 retval |= register_edge_assert_for_1 (TREE_OPERAND (rhs, 0),
3582 code, e, bsi);
3585 return retval;
3588 /* Try to register an edge assertion for SSA name NAME on edge E for
3589 the condition COND contributing to the conditional jump pointed to by SI.
3590 Return true if an assertion for NAME could be registered. */
3592 static bool
3593 register_edge_assert_for (tree name, edge e, block_stmt_iterator si, tree cond)
3595 tree val;
3596 enum tree_code comp_code;
3597 bool retval = false;
3598 bool is_else_edge = (e->flags & EDGE_FALSE_VALUE) != 0;
3600 /* Do not attempt to infer anything in names that flow through
3601 abnormal edges. */
3602 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
3603 return false;
3605 if (!extract_code_and_val_from_cond (name, cond, is_else_edge,
3606 &comp_code, &val))
3607 return false;
3609 /* Only register an ASSERT_EXPR if NAME was found in the sub-graph
3610 reachable from E. */
3611 if (TEST_BIT (found_in_subgraph, SSA_NAME_VERSION (name)))
3613 register_new_assert_for (name, comp_code, val, NULL, e, si);
3614 retval = true;
3617 /* If COND is effectively an equality test of an SSA_NAME against
3618 the value zero or one, then we may be able to assert values
3619 for SSA_NAMEs which flow into COND. */
3621 /* In the case of NAME == 1 or NAME != 0, for TRUTH_AND_EXPR defining
3622 statement of NAME we can assert both operands of the TRUTH_AND_EXPR
3623 have nonzero value. */
3624 if (((comp_code == EQ_EXPR && integer_onep (val))
3625 || (comp_code == NE_EXPR && integer_zerop (val))))
3627 tree def_stmt = SSA_NAME_DEF_STMT (name);
3629 if (TREE_CODE (def_stmt) == GIMPLE_MODIFY_STMT
3630 && (TREE_CODE (GIMPLE_STMT_OPERAND (def_stmt, 1)) == TRUTH_AND_EXPR
3631 || TREE_CODE (GIMPLE_STMT_OPERAND (def_stmt, 1)) == BIT_AND_EXPR))
3633 tree op0 = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 0);
3634 tree op1 = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 1);
3635 retval |= register_edge_assert_for_1 (op0, NE_EXPR, e, si);
3636 retval |= register_edge_assert_for_1 (op1, NE_EXPR, e, si);
3640 /* In the case of NAME == 0 or NAME != 1, for TRUTH_OR_EXPR defining
3641 statement of NAME we can assert both operands of the TRUTH_OR_EXPR
3642 have zero value. */
3643 if (((comp_code == EQ_EXPR && integer_zerop (val))
3644 || (comp_code == NE_EXPR && integer_onep (val))))
3646 tree def_stmt = SSA_NAME_DEF_STMT (name);
3648 if (TREE_CODE (def_stmt) == GIMPLE_MODIFY_STMT
3649 && (TREE_CODE (GIMPLE_STMT_OPERAND (def_stmt, 1)) == TRUTH_OR_EXPR
3650 || TREE_CODE (GIMPLE_STMT_OPERAND (def_stmt, 1)) == BIT_IOR_EXPR))
3652 tree op0 = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 0);
3653 tree op1 = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 1);
3654 retval |= register_edge_assert_for_1 (op0, EQ_EXPR, e, si);
3655 retval |= register_edge_assert_for_1 (op1, EQ_EXPR, e, si);
3659 return retval;
3663 static bool find_assert_locations (basic_block bb);
3665 /* Determine whether the outgoing edges of BB should receive an
3666 ASSERT_EXPR for each of the operands of BB's LAST statement.
3667 The last statement of BB must be a COND_EXPR.
3669 If any of the sub-graphs rooted at BB have an interesting use of
3670 the predicate operands, an assert location node is added to the
3671 list of assertions for the corresponding operands. */
3673 static bool
3674 find_conditional_asserts (basic_block bb, tree last)
3676 bool need_assert;
3677 block_stmt_iterator bsi;
3678 tree op;
3679 edge_iterator ei;
3680 edge e;
3681 ssa_op_iter iter;
3683 need_assert = false;
3684 bsi = bsi_for_stmt (last);
3686 /* Look for uses of the operands in each of the sub-graphs
3687 rooted at BB. We need to check each of the outgoing edges
3688 separately, so that we know what kind of ASSERT_EXPR to
3689 insert. */
3690 FOR_EACH_EDGE (e, ei, bb->succs)
3692 if (e->dest == bb)
3693 continue;
3695 /* Remove the COND_EXPR operands from the FOUND_IN_SUBGRAPH bitmap.
3696 Otherwise, when we finish traversing each of the sub-graphs, we
3697 won't know whether the variables were found in the sub-graphs or
3698 if they had been found in a block upstream from BB.
3700 This is actually a bad idea is some cases, particularly jump
3701 threading. Consider a CFG like the following:
3711 Assume that one or more operands in the conditional at the
3712 end of block 0 are used in a conditional in block 2, but not
3713 anywhere in block 1. In this case we will not insert any
3714 assert statements in block 1, which may cause us to miss
3715 opportunities to optimize, particularly for jump threading. */
3716 FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
3717 RESET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
3719 /* Traverse the strictly dominated sub-graph rooted at E->DEST
3720 to determine if any of the operands in the conditional
3721 predicate are used. */
3722 if (e->dest != bb)
3723 need_assert |= find_assert_locations (e->dest);
3725 /* Register the necessary assertions for each operand in the
3726 conditional predicate. */
3727 FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
3728 need_assert |= register_edge_assert_for (op, e, bsi,
3729 COND_EXPR_COND (last));
3732 /* Finally, indicate that we have found the operands in the
3733 conditional. */
3734 FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
3735 SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
3737 return need_assert;
3740 /* Compare two case labels sorting first by the destination label uid
3741 and then by the case value. */
3743 static int
3744 compare_case_labels (const void *p1, const void *p2)
3746 tree case1 = *(tree *)p1;
3747 tree case2 = *(tree *)p2;
3748 unsigned int uid1 = DECL_UID (CASE_LABEL (case1));
3749 unsigned int uid2 = DECL_UID (CASE_LABEL (case2));
3751 if (uid1 < uid2)
3752 return -1;
3753 else if (uid1 == uid2)
3755 /* Make sure the default label is first in a group. */
3756 if (!CASE_LOW (case1))
3757 return -1;
3758 else if (!CASE_LOW (case2))
3759 return 1;
3760 else
3761 return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
3763 else
3764 return 1;
3767 /* Determine whether the outgoing edges of BB should receive an
3768 ASSERT_EXPR for each of the operands of BB's LAST statement.
3769 The last statement of BB must be a SWITCH_EXPR.
3771 If any of the sub-graphs rooted at BB have an interesting use of
3772 the predicate operands, an assert location node is added to the
3773 list of assertions for the corresponding operands. */
3775 static bool
3776 find_switch_asserts (basic_block bb, tree last)
3778 bool need_assert;
3779 block_stmt_iterator bsi;
3780 tree op, cond;
3781 edge e;
3782 tree vec = SWITCH_LABELS (last), vec2;
3783 size_t n = TREE_VEC_LENGTH (vec);
3784 unsigned int idx;
3786 need_assert = false;
3787 bsi = bsi_for_stmt (last);
3788 op = TREE_OPERAND (last, 0);
3789 if (TREE_CODE (op) != SSA_NAME)
3790 return false;
3792 /* Build a vector of case labels sorted by destination label. */
3793 vec2 = make_tree_vec (n);
3794 for (idx = 0; idx < n; ++idx)
3795 TREE_VEC_ELT (vec2, idx) = TREE_VEC_ELT (vec, idx);
3796 qsort (&TREE_VEC_ELT (vec2, 0), n, sizeof (tree), compare_case_labels);
3798 for (idx = 0; idx < n; ++idx)
3800 tree min, max;
3801 tree cl = TREE_VEC_ELT (vec2, idx);
3803 min = CASE_LOW (cl);
3804 max = CASE_HIGH (cl);
3806 /* If there are multiple case labels with the same destination
3807 we need to combine them to a single value range for the edge. */
3808 if (idx + 1 < n
3809 && CASE_LABEL (cl) == CASE_LABEL (TREE_VEC_ELT (vec2, idx + 1)))
3811 /* Skip labels until the last of the group. */
3812 do {
3813 ++idx;
3814 } while (idx < n
3815 && CASE_LABEL (cl) == CASE_LABEL (TREE_VEC_ELT (vec2, idx)));
3816 --idx;
3818 /* Pick up the maximum of the case label range. */
3819 if (CASE_HIGH (TREE_VEC_ELT (vec2, idx)))
3820 max = CASE_HIGH (TREE_VEC_ELT (vec2, idx));
3821 else
3822 max = CASE_LOW (TREE_VEC_ELT (vec2, idx));
3825 /* Nothing to do if the range includes the default label until we
3826 can register anti-ranges. */
3827 if (min == NULL_TREE)
3828 continue;
3830 /* Find the edge to register the assert expr on. */
3831 e = find_edge (bb, label_to_block (CASE_LABEL (cl)));
3833 /* Remove the SWITCH_EXPR operand from the FOUND_IN_SUBGRAPH bitmap.
3834 Otherwise, when we finish traversing each of the sub-graphs, we
3835 won't know whether the variables were found in the sub-graphs or
3836 if they had been found in a block upstream from BB. */
3837 RESET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
3839 /* Traverse the strictly dominated sub-graph rooted at E->DEST
3840 to determine if any of the operands in the conditional
3841 predicate are used. */
3842 if (e->dest != bb)
3843 need_assert |= find_assert_locations (e->dest);
3845 /* Register the necessary assertions for the operand in the
3846 SWITCH_EXPR. */
3847 cond = build2 (max ? GE_EXPR : EQ_EXPR, boolean_type_node,
3848 op, fold_convert (TREE_TYPE (op), min));
3849 need_assert |= register_edge_assert_for (op, e, bsi, cond);
3850 if (max)
3852 cond = build2 (LE_EXPR, boolean_type_node,
3853 op, fold_convert (TREE_TYPE (op), max));
3854 need_assert |= register_edge_assert_for (op, e, bsi, cond);
3858 /* Finally, indicate that we have found the operand in the
3859 SWITCH_EXPR. */
3860 SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
3862 return need_assert;
3866 /* Traverse all the statements in block BB looking for statements that
3867 may generate useful assertions for the SSA names in their operand.
3868 If a statement produces a useful assertion A for name N_i, then the
3869 list of assertions already generated for N_i is scanned to
3870 determine if A is actually needed.
3872 If N_i already had the assertion A at a location dominating the
3873 current location, then nothing needs to be done. Otherwise, the
3874 new location for A is recorded instead.
3876 1- For every statement S in BB, all the variables used by S are
3877 added to bitmap FOUND_IN_SUBGRAPH.
3879 2- If statement S uses an operand N in a way that exposes a known
3880 value range for N, then if N was not already generated by an
3881 ASSERT_EXPR, create a new assert location for N. For instance,
3882 if N is a pointer and the statement dereferences it, we can
3883 assume that N is not NULL.
3885 3- COND_EXPRs are a special case of #2. We can derive range
3886 information from the predicate but need to insert different
3887 ASSERT_EXPRs for each of the sub-graphs rooted at the
3888 conditional block. If the last statement of BB is a conditional
3889 expression of the form 'X op Y', then
3891 a) Remove X and Y from the set FOUND_IN_SUBGRAPH.
3893 b) If the conditional is the only entry point to the sub-graph
3894 corresponding to the THEN_CLAUSE, recurse into it. On
3895 return, if X and/or Y are marked in FOUND_IN_SUBGRAPH, then
3896 an ASSERT_EXPR is added for the corresponding variable.
3898 c) Repeat step (b) on the ELSE_CLAUSE.
3900 d) Mark X and Y in FOUND_IN_SUBGRAPH.
3902 For instance,
3904 if (a == 9)
3905 b = a;
3906 else
3907 b = c + 1;
3909 In this case, an assertion on the THEN clause is useful to
3910 determine that 'a' is always 9 on that edge. However, an assertion
3911 on the ELSE clause would be unnecessary.
3913 4- If BB does not end in a conditional expression, then we recurse
3914 into BB's dominator children.
3916 At the end of the recursive traversal, every SSA name will have a
3917 list of locations where ASSERT_EXPRs should be added. When a new
3918 location for name N is found, it is registered by calling
3919 register_new_assert_for. That function keeps track of all the
3920 registered assertions to prevent adding unnecessary assertions.
3921 For instance, if a pointer P_4 is dereferenced more than once in a
3922 dominator tree, only the location dominating all the dereference of
3923 P_4 will receive an ASSERT_EXPR.
3925 If this function returns true, then it means that there are names
3926 for which we need to generate ASSERT_EXPRs. Those assertions are
3927 inserted by process_assert_insertions. */
3929 static bool
3930 find_assert_locations (basic_block bb)
3932 block_stmt_iterator si;
3933 tree last, phi;
3934 bool need_assert;
3935 basic_block son;
3937 if (TEST_BIT (blocks_visited, bb->index))
3938 return false;
3940 SET_BIT (blocks_visited, bb->index);
3942 need_assert = false;
3944 /* Traverse all PHI nodes in BB marking used operands. */
3945 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
3947 use_operand_p arg_p;
3948 ssa_op_iter i;
3950 FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_USE)
3952 tree arg = USE_FROM_PTR (arg_p);
3953 if (TREE_CODE (arg) == SSA_NAME)
3955 gcc_assert (is_gimple_reg (PHI_RESULT (phi)));
3956 SET_BIT (found_in_subgraph, SSA_NAME_VERSION (arg));
3961 /* Traverse all the statements in BB marking used names and looking
3962 for statements that may infer assertions for their used operands. */
3963 last = NULL_TREE;
3964 for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
3966 tree stmt, op;
3967 ssa_op_iter i;
3969 stmt = bsi_stmt (si);
3971 /* See if we can derive an assertion for any of STMT's operands. */
3972 FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
3974 tree value;
3975 enum tree_code comp_code;
3977 /* Mark OP in bitmap FOUND_IN_SUBGRAPH. If STMT is inside
3978 the sub-graph of a conditional block, when we return from
3979 this recursive walk, our parent will use the
3980 FOUND_IN_SUBGRAPH bitset to determine if one of the
3981 operands it was looking for was present in the sub-graph. */
3982 SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
3984 /* If OP is used in such a way that we can infer a value
3985 range for it, and we don't find a previous assertion for
3986 it, create a new assertion location node for OP. */
3987 if (infer_value_range (stmt, op, &comp_code, &value))
3989 /* If we are able to infer a nonzero value range for OP,
3990 then walk backwards through the use-def chain to see if OP
3991 was set via a typecast.
3993 If so, then we can also infer a nonzero value range
3994 for the operand of the NOP_EXPR. */
3995 if (comp_code == NE_EXPR && integer_zerop (value))
3997 tree t = op;
3998 tree def_stmt = SSA_NAME_DEF_STMT (t);
4000 while (TREE_CODE (def_stmt) == GIMPLE_MODIFY_STMT
4001 && TREE_CODE
4002 (GIMPLE_STMT_OPERAND (def_stmt, 1)) == NOP_EXPR
4003 && TREE_CODE
4004 (TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1),
4005 0)) == SSA_NAME
4006 && POINTER_TYPE_P
4007 (TREE_TYPE (TREE_OPERAND
4008 (GIMPLE_STMT_OPERAND (def_stmt,
4009 1), 0))))
4011 t = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 0);
4012 def_stmt = SSA_NAME_DEF_STMT (t);
4014 /* Note we want to register the assert for the
4015 operand of the NOP_EXPR after SI, not after the
4016 conversion. */
4017 if (! has_single_use (t))
4019 register_new_assert_for (t, comp_code, value,
4020 bb, NULL, si);
4021 need_assert = true;
4026 /* If OP is used only once, namely in this STMT, don't
4027 bother creating an ASSERT_EXPR for it. Such an
4028 ASSERT_EXPR would do nothing but increase compile time. */
4029 if (!has_single_use (op))
4031 register_new_assert_for (op, comp_code, value, bb, NULL, si);
4032 need_assert = true;
4037 /* Remember the last statement of the block. */
4038 last = stmt;
4041 /* If BB's last statement is a conditional expression
4042 involving integer operands, recurse into each of the sub-graphs
4043 rooted at BB to determine if we need to add ASSERT_EXPRs. */
4044 if (last
4045 && TREE_CODE (last) == COND_EXPR
4046 && !fp_predicate (COND_EXPR_COND (last))
4047 && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
4048 need_assert |= find_conditional_asserts (bb, last);
4050 if (last
4051 && TREE_CODE (last) == SWITCH_EXPR
4052 && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
4053 need_assert |= find_switch_asserts (bb, last);
4055 /* Recurse into the dominator children of BB. */
4056 for (son = first_dom_son (CDI_DOMINATORS, bb);
4057 son;
4058 son = next_dom_son (CDI_DOMINATORS, son))
4059 need_assert |= find_assert_locations (son);
4061 return need_assert;
4065 /* Create an ASSERT_EXPR for NAME and insert it in the location
4066 indicated by LOC. Return true if we made any edge insertions. */
4068 static bool
4069 process_assert_insertions_for (tree name, assert_locus_t loc)
4071 /* Build the comparison expression NAME_i COMP_CODE VAL. */
4072 tree stmt, cond, assert_expr;
4073 edge_iterator ei;
4074 edge e;
4076 cond = build2 (loc->comp_code, boolean_type_node, name, loc->val);
4077 assert_expr = build_assert_expr_for (cond, name);
4079 if (loc->e)
4081 /* We have been asked to insert the assertion on an edge. This
4082 is used only by COND_EXPR and SWITCH_EXPR assertions. */
4083 #if defined ENABLE_CHECKING
4084 gcc_assert (TREE_CODE (bsi_stmt (loc->si)) == COND_EXPR
4085 || TREE_CODE (bsi_stmt (loc->si)) == SWITCH_EXPR);
4086 #endif
4088 bsi_insert_on_edge (loc->e, assert_expr);
4089 return true;
4092 /* Otherwise, we can insert right after LOC->SI iff the
4093 statement must not be the last statement in the block. */
4094 stmt = bsi_stmt (loc->si);
4095 if (!stmt_ends_bb_p (stmt))
4097 bsi_insert_after (&loc->si, assert_expr, BSI_SAME_STMT);
4098 return false;
4101 /* If STMT must be the last statement in BB, we can only insert new
4102 assertions on the non-abnormal edge out of BB. Note that since
4103 STMT is not control flow, there may only be one non-abnormal edge
4104 out of BB. */
4105 FOR_EACH_EDGE (e, ei, loc->bb->succs)
4106 if (!(e->flags & EDGE_ABNORMAL))
4108 bsi_insert_on_edge (e, assert_expr);
4109 return true;
4112 gcc_unreachable ();
4116 /* Process all the insertions registered for every name N_i registered
4117 in NEED_ASSERT_FOR. The list of assertions to be inserted are
4118 found in ASSERTS_FOR[i]. */
4120 static void
4121 process_assert_insertions (void)
4123 unsigned i;
4124 bitmap_iterator bi;
4125 bool update_edges_p = false;
4126 int num_asserts = 0;
4128 if (dump_file && (dump_flags & TDF_DETAILS))
4129 dump_all_asserts (dump_file);
4131 EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
4133 assert_locus_t loc = asserts_for[i];
4134 gcc_assert (loc);
4136 while (loc)
4138 assert_locus_t next = loc->next;
4139 update_edges_p |= process_assert_insertions_for (ssa_name (i), loc);
4140 free (loc);
4141 loc = next;
4142 num_asserts++;
4146 if (update_edges_p)
4147 bsi_commit_edge_inserts ();
4149 if (dump_file && (dump_flags & TDF_STATS))
4150 fprintf (dump_file, "\nNumber of ASSERT_EXPR expressions inserted: %d\n\n",
4151 num_asserts);
4155 /* Traverse the flowgraph looking for conditional jumps to insert range
4156 expressions. These range expressions are meant to provide information
4157 to optimizations that need to reason in terms of value ranges. They
4158 will not be expanded into RTL. For instance, given:
4160 x = ...
4161 y = ...
4162 if (x < y)
4163 y = x - 2;
4164 else
4165 x = y + 3;
4167 this pass will transform the code into:
4169 x = ...
4170 y = ...
4171 if (x < y)
4173 x = ASSERT_EXPR <x, x < y>
4174 y = x - 2
4176 else
4178 y = ASSERT_EXPR <y, x <= y>
4179 x = y + 3
4182 The idea is that once copy and constant propagation have run, other
4183 optimizations will be able to determine what ranges of values can 'x'
4184 take in different paths of the code, simply by checking the reaching
4185 definition of 'x'. */
4187 static void
4188 insert_range_assertions (void)
4190 edge e;
4191 edge_iterator ei;
4192 bool update_ssa_p;
4194 found_in_subgraph = sbitmap_alloc (num_ssa_names);
4195 sbitmap_zero (found_in_subgraph);
4197 blocks_visited = sbitmap_alloc (last_basic_block);
4198 sbitmap_zero (blocks_visited);
4200 need_assert_for = BITMAP_ALLOC (NULL);
4201 asserts_for = XCNEWVEC (assert_locus_t, num_ssa_names);
4203 calculate_dominance_info (CDI_DOMINATORS);
4205 update_ssa_p = false;
4206 FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
4207 if (find_assert_locations (e->dest))
4208 update_ssa_p = true;
4210 if (update_ssa_p)
4212 process_assert_insertions ();
4213 update_ssa (TODO_update_ssa_no_phi);
4216 if (dump_file && (dump_flags & TDF_DETAILS))
4218 fprintf (dump_file, "\nSSA form after inserting ASSERT_EXPRs\n");
4219 dump_function_to_file (current_function_decl, dump_file, dump_flags);
4222 sbitmap_free (found_in_subgraph);
4223 free (asserts_for);
4224 BITMAP_FREE (need_assert_for);
4227 /* Checks one ARRAY_REF in REF, located at LOCUS. Ignores flexible arrays
4228 and "struct" hacks. If VRP can determine that the
4229 array subscript is a constant, check if it is outside valid
4230 range. If the array subscript is a RANGE, warn if it is
4231 non-overlapping with valid range.
4232 IGNORE_OFF_BY_ONE is true if the ARRAY_REF is inside a ADDR_EXPR. */
4234 static void
4235 check_array_ref (tree ref, location_t* locus, bool ignore_off_by_one)
4237 value_range_t* vr = NULL;
4238 tree low_sub, up_sub;
4239 tree low_bound, up_bound = array_ref_up_bound (ref);
4241 low_sub = up_sub = TREE_OPERAND (ref, 1);
4243 if (!up_bound || !locus || TREE_NO_WARNING (ref)
4244 || TREE_CODE (up_bound) != INTEGER_CST
4245 /* Can not check flexible arrays. */
4246 || (TYPE_SIZE (TREE_TYPE (ref)) == NULL_TREE
4247 && TYPE_DOMAIN (TREE_TYPE (ref)) != NULL_TREE
4248 && TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (ref))) == NULL_TREE)
4249 /* Accesses after the end of arrays of size 0 (gcc
4250 extension) and 1 are likely intentional ("struct
4251 hack"). */
4252 || compare_tree_int (up_bound, 1) <= 0)
4253 return;
4255 low_bound = array_ref_low_bound (ref);
4257 if (TREE_CODE (low_sub) == SSA_NAME)
4259 vr = get_value_range (low_sub);
4260 if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
4262 low_sub = vr->type == VR_RANGE ? vr->max : vr->min;
4263 up_sub = vr->type == VR_RANGE ? vr->min : vr->max;
4267 if (vr && vr->type == VR_ANTI_RANGE)
4269 if (TREE_CODE (up_sub) == INTEGER_CST
4270 && tree_int_cst_lt (up_bound, up_sub)
4271 && TREE_CODE (low_sub) == INTEGER_CST
4272 && tree_int_cst_lt (low_sub, low_bound))
4274 warning (OPT_Warray_bounds,
4275 "%Harray subscript is outside array bounds", locus);
4276 TREE_NO_WARNING (ref) = 1;
4279 else if (TREE_CODE (up_sub) == INTEGER_CST
4280 && tree_int_cst_lt (up_bound, up_sub)
4281 && !tree_int_cst_equal (up_bound, up_sub)
4282 && (!ignore_off_by_one
4283 || !tree_int_cst_equal (int_const_binop (PLUS_EXPR,
4284 up_bound,
4285 integer_one_node,
4287 up_sub)))
4289 warning (OPT_Warray_bounds, "%Harray subscript is above array bounds",
4290 locus);
4291 TREE_NO_WARNING (ref) = 1;
4293 else if (TREE_CODE (low_sub) == INTEGER_CST
4294 && tree_int_cst_lt (low_sub, low_bound))
4296 warning (OPT_Warray_bounds, "%Harray subscript is below array bounds",
4297 locus);
4298 TREE_NO_WARNING (ref) = 1;
4302 /* Searches if the expr T, located at LOCATION computes
4303 address of an ARRAY_REF, and call check_array_ref on it. */
4305 static void
4306 search_for_addr_array(tree t, location_t* location)
4308 while (TREE_CODE (t) == SSA_NAME)
4310 t = SSA_NAME_DEF_STMT (t);
4311 if (TREE_CODE (t) != GIMPLE_MODIFY_STMT)
4312 return;
4313 t = GIMPLE_STMT_OPERAND (t, 1);
4317 /* We are only interested in addresses of ARRAY_REF's. */
4318 if (TREE_CODE (t) != ADDR_EXPR)
4319 return;
4321 /* Check each ARRAY_REFs in the reference chain. */
4324 if (TREE_CODE (t) == ARRAY_REF)
4325 check_array_ref (t, location, true /*ignore_off_by_one*/);
4327 t = TREE_OPERAND(t,0);
4329 while (handled_component_p (t));
4332 /* walk_tree() callback that checks if *TP is
4333 an ARRAY_REF inside an ADDR_EXPR (in which an array
4334 subscript one outside the valid range is allowed). Call
4335 check_array_ref for each ARRAY_REF found. The location is
4336 passed in DATA. */
4338 static tree
4339 check_array_bounds (tree *tp, int *walk_subtree, void *data)
4341 tree t = *tp;
4342 tree stmt = (tree)data;
4343 location_t *location = EXPR_LOCUS (stmt);
4345 *walk_subtree = TRUE;
4347 if (TREE_CODE (t) == ARRAY_REF)
4348 check_array_ref (t, location, false /*ignore_off_by_one*/);
4350 if (TREE_CODE (t) == INDIRECT_REF
4351 || (TREE_CODE (t) == RETURN_EXPR && TREE_OPERAND (t, 0)))
4352 search_for_addr_array (TREE_OPERAND (t, 0), location);
4353 else if (TREE_CODE (t) == CALL_EXPR)
4355 tree arg;
4356 call_expr_arg_iterator iter;
4358 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
4359 search_for_addr_array (arg, location);
4362 if (TREE_CODE (t) == ADDR_EXPR)
4363 *walk_subtree = FALSE;
4365 return NULL_TREE;
4368 /* Walk over all statements of all reachable BBs and call check_array_bounds
4369 on them. */
4371 static void
4372 check_all_array_refs (void)
4374 basic_block bb;
4375 block_stmt_iterator si;
4377 FOR_EACH_BB (bb)
4379 /* Skip bb's that are clearly unreachable. */
4380 if (single_pred_p (bb))
4382 basic_block pred_bb = EDGE_PRED (bb, 0)->src;
4383 tree ls = NULL_TREE;
4385 if (!bsi_end_p (bsi_last (pred_bb)))
4386 ls = bsi_stmt (bsi_last (pred_bb));
4388 if (ls && TREE_CODE (ls) == COND_EXPR
4389 && ((COND_EXPR_COND (ls) == boolean_false_node
4390 && (EDGE_PRED (bb, 0)->flags & EDGE_TRUE_VALUE))
4391 || (COND_EXPR_COND (ls) == boolean_true_node
4392 && (EDGE_PRED (bb, 0)->flags & EDGE_FALSE_VALUE))))
4393 continue;
4395 for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
4396 walk_tree (bsi_stmt_ptr (si), check_array_bounds,
4397 bsi_stmt (si), NULL);
4401 /* Convert range assertion expressions into the implied copies and
4402 copy propagate away the copies. Doing the trivial copy propagation
4403 here avoids the need to run the full copy propagation pass after
4404 VRP.
4406 FIXME, this will eventually lead to copy propagation removing the
4407 names that had useful range information attached to them. For
4408 instance, if we had the assertion N_i = ASSERT_EXPR <N_j, N_j > 3>,
4409 then N_i will have the range [3, +INF].
4411 However, by converting the assertion into the implied copy
4412 operation N_i = N_j, we will then copy-propagate N_j into the uses
4413 of N_i and lose the range information. We may want to hold on to
4414 ASSERT_EXPRs a little while longer as the ranges could be used in
4415 things like jump threading.
4417 The problem with keeping ASSERT_EXPRs around is that passes after
4418 VRP need to handle them appropriately.
4420 Another approach would be to make the range information a first
4421 class property of the SSA_NAME so that it can be queried from
4422 any pass. This is made somewhat more complex by the need for
4423 multiple ranges to be associated with one SSA_NAME. */
4425 static void
4426 remove_range_assertions (void)
4428 basic_block bb;
4429 block_stmt_iterator si;
4431 /* Note that the BSI iterator bump happens at the bottom of the
4432 loop and no bump is necessary if we're removing the statement
4433 referenced by the current BSI. */
4434 FOR_EACH_BB (bb)
4435 for (si = bsi_start (bb); !bsi_end_p (si);)
4437 tree stmt = bsi_stmt (si);
4438 tree use_stmt;
4440 if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
4441 && TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 1)) == ASSERT_EXPR)
4443 tree rhs = GIMPLE_STMT_OPERAND (stmt, 1), var;
4444 tree cond = fold (ASSERT_EXPR_COND (rhs));
4445 use_operand_p use_p;
4446 imm_use_iterator iter;
4448 gcc_assert (cond != boolean_false_node);
4450 /* Propagate the RHS into every use of the LHS. */
4451 var = ASSERT_EXPR_VAR (rhs);
4452 FOR_EACH_IMM_USE_STMT (use_stmt, iter,
4453 GIMPLE_STMT_OPERAND (stmt, 0))
4454 FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
4456 SET_USE (use_p, var);
4457 gcc_assert (TREE_CODE (var) == SSA_NAME);
4460 /* And finally, remove the copy, it is not needed. */
4461 bsi_remove (&si, true);
4462 release_defs (stmt);
4464 else
4465 bsi_next (&si);
4468 sbitmap_free (blocks_visited);
4472 /* Return true if STMT is interesting for VRP. */
4474 static bool
4475 stmt_interesting_for_vrp (tree stmt)
4477 if (TREE_CODE (stmt) == PHI_NODE
4478 && is_gimple_reg (PHI_RESULT (stmt))
4479 && (INTEGRAL_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))
4480 || POINTER_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))))
4481 return true;
4482 else if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT)
4484 tree lhs = GIMPLE_STMT_OPERAND (stmt, 0);
4485 tree rhs = GIMPLE_STMT_OPERAND (stmt, 1);
4487 /* In general, assignments with virtual operands are not useful
4488 for deriving ranges, with the obvious exception of calls to
4489 builtin functions. */
4490 if (TREE_CODE (lhs) == SSA_NAME
4491 && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
4492 || POINTER_TYPE_P (TREE_TYPE (lhs)))
4493 && ((TREE_CODE (rhs) == CALL_EXPR
4494 && TREE_CODE (CALL_EXPR_FN (rhs)) == ADDR_EXPR
4495 && DECL_P (TREE_OPERAND (CALL_EXPR_FN (rhs), 0))
4496 && DECL_IS_BUILTIN (TREE_OPERAND (CALL_EXPR_FN (rhs), 0)))
4497 || ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS)))
4498 return true;
4500 else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
4501 return true;
4503 return false;
4507 /* Initialize local data structures for VRP. */
4509 static void
4510 vrp_initialize (void)
4512 basic_block bb;
4514 vr_value = XCNEWVEC (value_range_t *, num_ssa_names);
4515 vr_phi_edge_counts = XCNEWVEC (int, num_ssa_names);
4517 FOR_EACH_BB (bb)
4519 block_stmt_iterator si;
4520 tree phi;
4522 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
4524 if (!stmt_interesting_for_vrp (phi))
4526 tree lhs = PHI_RESULT (phi);
4527 set_value_range_to_varying (get_value_range (lhs));
4528 DONT_SIMULATE_AGAIN (phi) = true;
4530 else
4531 DONT_SIMULATE_AGAIN (phi) = false;
4534 for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
4536 tree stmt = bsi_stmt (si);
4538 if (!stmt_interesting_for_vrp (stmt))
4540 ssa_op_iter i;
4541 tree def;
4542 FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
4543 set_value_range_to_varying (get_value_range (def));
4544 DONT_SIMULATE_AGAIN (stmt) = true;
4546 else
4548 DONT_SIMULATE_AGAIN (stmt) = false;
4555 /* Visit assignment STMT. If it produces an interesting range, record
4556 the SSA name in *OUTPUT_P. */
4558 static enum ssa_prop_result
4559 vrp_visit_assignment (tree stmt, tree *output_p)
4561 tree lhs, rhs, def;
4562 ssa_op_iter iter;
4564 lhs = GIMPLE_STMT_OPERAND (stmt, 0);
4565 rhs = GIMPLE_STMT_OPERAND (stmt, 1);
4567 /* We only keep track of ranges in integral and pointer types. */
4568 if (TREE_CODE (lhs) == SSA_NAME
4569 && ((INTEGRAL_TYPE_P (TREE_TYPE (lhs))
4570 /* It is valid to have NULL MIN/MAX values on a type. See
4571 build_range_type. */
4572 && TYPE_MIN_VALUE (TREE_TYPE (lhs))
4573 && TYPE_MAX_VALUE (TREE_TYPE (lhs)))
4574 || POINTER_TYPE_P (TREE_TYPE (lhs))))
4576 struct loop *l;
4577 value_range_t new_vr = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
4579 extract_range_from_expr (&new_vr, rhs);
4581 /* If STMT is inside a loop, we may be able to know something
4582 else about the range of LHS by examining scalar evolution
4583 information. */
4584 if (current_loops && (l = loop_containing_stmt (stmt)))
4585 adjust_range_with_scev (&new_vr, l, stmt, lhs);
4587 if (update_value_range (lhs, &new_vr))
4589 *output_p = lhs;
4591 if (dump_file && (dump_flags & TDF_DETAILS))
4593 fprintf (dump_file, "Found new range for ");
4594 print_generic_expr (dump_file, lhs, 0);
4595 fprintf (dump_file, ": ");
4596 dump_value_range (dump_file, &new_vr);
4597 fprintf (dump_file, "\n\n");
4600 if (new_vr.type == VR_VARYING)
4601 return SSA_PROP_VARYING;
4603 return SSA_PROP_INTERESTING;
4606 return SSA_PROP_NOT_INTERESTING;
4609 /* Every other statement produces no useful ranges. */
4610 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
4611 set_value_range_to_varying (get_value_range (def));
4613 return SSA_PROP_VARYING;
4616 /* Helper that gets the value range of the SSA_NAME with version I
4617 or a symbolic range contaning the SSA_NAME only if the value range
4618 is varying or undefined. */
4620 static inline value_range_t
4621 get_vr_for_comparison (int i)
4623 value_range_t vr = *(vr_value[i]);
4625 /* If name N_i does not have a valid range, use N_i as its own
4626 range. This allows us to compare against names that may
4627 have N_i in their ranges. */
4628 if (vr.type == VR_VARYING || vr.type == VR_UNDEFINED)
4630 vr.type = VR_RANGE;
4631 vr.min = ssa_name (i);
4632 vr.max = ssa_name (i);
4635 return vr;
4638 /* Compare all the value ranges for names equivalent to VAR with VAL
4639 using comparison code COMP. Return the same value returned by
4640 compare_range_with_value, including the setting of
4641 *STRICT_OVERFLOW_P. */
4643 static tree
4644 compare_name_with_value (enum tree_code comp, tree var, tree val,
4645 bool *strict_overflow_p)
4647 bitmap_iterator bi;
4648 unsigned i;
4649 bitmap e;
4650 tree retval, t;
4651 int used_strict_overflow;
4652 bool sop;
4653 value_range_t equiv_vr;
4655 /* Get the set of equivalences for VAR. */
4656 e = get_value_range (var)->equiv;
4658 /* Start at -1. Set it to 0 if we do a comparison without relying
4659 on overflow, or 1 if all comparisons rely on overflow. */
4660 used_strict_overflow = -1;
4662 /* Compare vars' value range with val. */
4663 equiv_vr = get_vr_for_comparison (SSA_NAME_VERSION (var));
4664 sop = false;
4665 retval = compare_range_with_value (comp, &equiv_vr, val, &sop);
4666 if (sop)
4667 used_strict_overflow = 1;
4669 /* If the equiv set is empty we have done all work we need to do. */
4670 if (e == NULL)
4672 if (retval
4673 && used_strict_overflow > 0)
4674 *strict_overflow_p = true;
4675 return retval;
4678 EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
4680 equiv_vr = get_vr_for_comparison (i);
4681 sop = false;
4682 t = compare_range_with_value (comp, &equiv_vr, val, &sop);
4683 if (t)
4685 /* If we get different answers from different members
4686 of the equivalence set this check must be in a dead
4687 code region. Folding it to a trap representation
4688 would be correct here. For now just return don't-know. */
4689 if (retval != NULL
4690 && t != retval)
4692 retval = NULL_TREE;
4693 break;
4695 retval = t;
4697 if (!sop)
4698 used_strict_overflow = 0;
4699 else if (used_strict_overflow < 0)
4700 used_strict_overflow = 1;
4704 if (retval
4705 && used_strict_overflow > 0)
4706 *strict_overflow_p = true;
4708 return retval;
4712 /* Given a comparison code COMP and names N1 and N2, compare all the
4713 ranges equivalent to N1 against all the ranges equivalent to N2
4714 to determine the value of N1 COMP N2. Return the same value
4715 returned by compare_ranges. Set *STRICT_OVERFLOW_P to indicate
4716 whether we relied on an overflow infinity in the comparison. */
4719 static tree
4720 compare_names (enum tree_code comp, tree n1, tree n2,
4721 bool *strict_overflow_p)
4723 tree t, retval;
4724 bitmap e1, e2;
4725 bitmap_iterator bi1, bi2;
4726 unsigned i1, i2;
4727 int used_strict_overflow;
4728 static bitmap_obstack *s_obstack = NULL;
4729 static bitmap s_e1 = NULL, s_e2 = NULL;
4731 /* Compare the ranges of every name equivalent to N1 against the
4732 ranges of every name equivalent to N2. */
4733 e1 = get_value_range (n1)->equiv;
4734 e2 = get_value_range (n2)->equiv;
4736 /* Use the fake bitmaps if e1 or e2 are not available. */
4737 if (s_obstack == NULL)
4739 s_obstack = XNEW (bitmap_obstack);
4740 bitmap_obstack_initialize (s_obstack);
4741 s_e1 = BITMAP_ALLOC (s_obstack);
4742 s_e2 = BITMAP_ALLOC (s_obstack);
4744 if (e1 == NULL)
4745 e1 = s_e1;
4746 if (e2 == NULL)
4747 e2 = s_e2;
4749 /* Add N1 and N2 to their own set of equivalences to avoid
4750 duplicating the body of the loop just to check N1 and N2
4751 ranges. */
4752 bitmap_set_bit (e1, SSA_NAME_VERSION (n1));
4753 bitmap_set_bit (e2, SSA_NAME_VERSION (n2));
4755 /* If the equivalence sets have a common intersection, then the two
4756 names can be compared without checking their ranges. */
4757 if (bitmap_intersect_p (e1, e2))
4759 bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
4760 bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
4762 return (comp == EQ_EXPR || comp == GE_EXPR || comp == LE_EXPR)
4763 ? boolean_true_node
4764 : boolean_false_node;
4767 /* Start at -1. Set it to 0 if we do a comparison without relying
4768 on overflow, or 1 if all comparisons rely on overflow. */
4769 used_strict_overflow = -1;
4771 /* Otherwise, compare all the equivalent ranges. First, add N1 and
4772 N2 to their own set of equivalences to avoid duplicating the body
4773 of the loop just to check N1 and N2 ranges. */
4774 EXECUTE_IF_SET_IN_BITMAP (e1, 0, i1, bi1)
4776 value_range_t vr1 = get_vr_for_comparison (i1);
4778 t = retval = NULL_TREE;
4779 EXECUTE_IF_SET_IN_BITMAP (e2, 0, i2, bi2)
4781 bool sop;
4783 value_range_t vr2 = get_vr_for_comparison (i2);
4785 t = compare_ranges (comp, &vr1, &vr2, &sop);
4786 if (t)
4788 /* If we get different answers from different members
4789 of the equivalence set this check must be in a dead
4790 code region. Folding it to a trap representation
4791 would be correct here. For now just return don't-know. */
4792 if (retval != NULL
4793 && t != retval)
4795 bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
4796 bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
4797 return NULL_TREE;
4799 retval = t;
4801 if (!sop)
4802 used_strict_overflow = 0;
4803 else if (used_strict_overflow < 0)
4804 used_strict_overflow = 1;
4808 if (retval)
4810 bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
4811 bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
4812 if (used_strict_overflow > 0)
4813 *strict_overflow_p = true;
4814 return retval;
4818 /* None of the equivalent ranges are useful in computing this
4819 comparison. */
4820 bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
4821 bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
4822 return NULL_TREE;
4826 /* Given a conditional predicate COND, try to determine if COND yields
4827 true or false based on the value ranges of its operands. Return
4828 BOOLEAN_TRUE_NODE if the conditional always evaluates to true,
4829 BOOLEAN_FALSE_NODE if the conditional always evaluates to false, and,
4830 NULL if the conditional cannot be evaluated at compile time.
4832 If USE_EQUIV_P is true, the ranges of all the names equivalent with
4833 the operands in COND are used when trying to compute its value.
4834 This is only used during final substitution. During propagation,
4835 we only check the range of each variable and not its equivalents.
4837 Set *STRICT_OVERFLOW_P to indicate whether we relied on an overflow
4838 infinity to produce the result. */
4840 static tree
4841 vrp_evaluate_conditional_warnv (tree cond, bool use_equiv_p,
4842 bool *strict_overflow_p)
4844 gcc_assert (TREE_CODE (cond) == SSA_NAME
4845 || TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison);
4847 if (TREE_CODE (cond) == SSA_NAME)
4849 value_range_t *vr;
4850 tree retval;
4852 if (use_equiv_p)
4853 retval = compare_name_with_value (NE_EXPR, cond, boolean_false_node,
4854 strict_overflow_p);
4855 else
4857 value_range_t *vr = get_value_range (cond);
4858 retval = compare_range_with_value (NE_EXPR, vr, boolean_false_node,
4859 strict_overflow_p);
4862 /* If COND has a known boolean range, return it. */
4863 if (retval)
4864 return retval;
4866 /* Otherwise, if COND has a symbolic range of exactly one value,
4867 return it. */
4868 vr = get_value_range (cond);
4869 if (vr->type == VR_RANGE && vr->min == vr->max)
4870 return vr->min;
4872 else
4874 tree op0 = TREE_OPERAND (cond, 0);
4875 tree op1 = TREE_OPERAND (cond, 1);
4877 /* We only deal with integral and pointer types. */
4878 if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
4879 && !POINTER_TYPE_P (TREE_TYPE (op0)))
4880 return NULL_TREE;
4882 if (use_equiv_p)
4884 if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME)
4885 return compare_names (TREE_CODE (cond), op0, op1,
4886 strict_overflow_p);
4887 else if (TREE_CODE (op0) == SSA_NAME)
4888 return compare_name_with_value (TREE_CODE (cond), op0, op1,
4889 strict_overflow_p);
4890 else if (TREE_CODE (op1) == SSA_NAME)
4891 return (compare_name_with_value
4892 (swap_tree_comparison (TREE_CODE (cond)), op1, op0,
4893 strict_overflow_p));
4895 else
4897 value_range_t *vr0, *vr1;
4899 vr0 = (TREE_CODE (op0) == SSA_NAME) ? get_value_range (op0) : NULL;
4900 vr1 = (TREE_CODE (op1) == SSA_NAME) ? get_value_range (op1) : NULL;
4902 if (vr0 && vr1)
4903 return compare_ranges (TREE_CODE (cond), vr0, vr1,
4904 strict_overflow_p);
4905 else if (vr0 && vr1 == NULL)
4906 return compare_range_with_value (TREE_CODE (cond), vr0, op1,
4907 strict_overflow_p);
4908 else if (vr0 == NULL && vr1)
4909 return (compare_range_with_value
4910 (swap_tree_comparison (TREE_CODE (cond)), vr1, op0,
4911 strict_overflow_p));
4915 /* Anything else cannot be computed statically. */
4916 return NULL_TREE;
4919 /* Given COND within STMT, try to simplify it based on value range
4920 information. Return NULL if the conditional can not be evaluated.
4921 The ranges of all the names equivalent with the operands in COND
4922 will be used when trying to compute the value. If the result is
4923 based on undefined signed overflow, issue a warning if
4924 appropriate. */
4926 tree
4927 vrp_evaluate_conditional (tree cond, tree stmt)
4929 bool sop;
4930 tree ret;
4932 sop = false;
4933 ret = vrp_evaluate_conditional_warnv (cond, true, &sop);
4935 if (ret && sop)
4937 enum warn_strict_overflow_code wc;
4938 const char* warnmsg;
4940 if (is_gimple_min_invariant (ret))
4942 wc = WARN_STRICT_OVERFLOW_CONDITIONAL;
4943 warnmsg = G_("assuming signed overflow does not occur when "
4944 "simplifying conditional to constant");
4946 else
4948 wc = WARN_STRICT_OVERFLOW_COMPARISON;
4949 warnmsg = G_("assuming signed overflow does not occur when "
4950 "simplifying conditional");
4953 if (issue_strict_overflow_warning (wc))
4955 location_t locus;
4957 if (!EXPR_HAS_LOCATION (stmt))
4958 locus = input_location;
4959 else
4960 locus = EXPR_LOCATION (stmt);
4961 warning (OPT_Wstrict_overflow, "%H%s", &locus, warnmsg);
4965 return ret;
4969 /* Visit conditional statement STMT. If we can determine which edge
4970 will be taken out of STMT's basic block, record it in
4971 *TAKEN_EDGE_P and return SSA_PROP_INTERESTING. Otherwise, return
4972 SSA_PROP_VARYING. */
4974 static enum ssa_prop_result
4975 vrp_visit_cond_stmt (tree stmt, edge *taken_edge_p)
4977 tree cond, val;
4978 bool sop;
4980 *taken_edge_p = NULL;
4982 /* FIXME. Handle SWITCH_EXPRs. */
4983 if (TREE_CODE (stmt) == SWITCH_EXPR)
4984 return SSA_PROP_VARYING;
4986 cond = COND_EXPR_COND (stmt);
4988 if (dump_file && (dump_flags & TDF_DETAILS))
4990 tree use;
4991 ssa_op_iter i;
4993 fprintf (dump_file, "\nVisiting conditional with predicate: ");
4994 print_generic_expr (dump_file, cond, 0);
4995 fprintf (dump_file, "\nWith known ranges\n");
4997 FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
4999 fprintf (dump_file, "\t");
5000 print_generic_expr (dump_file, use, 0);
5001 fprintf (dump_file, ": ");
5002 dump_value_range (dump_file, vr_value[SSA_NAME_VERSION (use)]);
5005 fprintf (dump_file, "\n");
5008 /* Compute the value of the predicate COND by checking the known
5009 ranges of each of its operands.
5011 Note that we cannot evaluate all the equivalent ranges here
5012 because those ranges may not yet be final and with the current
5013 propagation strategy, we cannot determine when the value ranges
5014 of the names in the equivalence set have changed.
5016 For instance, given the following code fragment
5018 i_5 = PHI <8, i_13>
5020 i_14 = ASSERT_EXPR <i_5, i_5 != 0>
5021 if (i_14 == 1)
5024 Assume that on the first visit to i_14, i_5 has the temporary
5025 range [8, 8] because the second argument to the PHI function is
5026 not yet executable. We derive the range ~[0, 0] for i_14 and the
5027 equivalence set { i_5 }. So, when we visit 'if (i_14 == 1)' for
5028 the first time, since i_14 is equivalent to the range [8, 8], we
5029 determine that the predicate is always false.
5031 On the next round of propagation, i_13 is determined to be
5032 VARYING, which causes i_5 to drop down to VARYING. So, another
5033 visit to i_14 is scheduled. In this second visit, we compute the
5034 exact same range and equivalence set for i_14, namely ~[0, 0] and
5035 { i_5 }. But we did not have the previous range for i_5
5036 registered, so vrp_visit_assignment thinks that the range for
5037 i_14 has not changed. Therefore, the predicate 'if (i_14 == 1)'
5038 is not visited again, which stops propagation from visiting
5039 statements in the THEN clause of that if().
5041 To properly fix this we would need to keep the previous range
5042 value for the names in the equivalence set. This way we would've
5043 discovered that from one visit to the other i_5 changed from
5044 range [8, 8] to VR_VARYING.
5046 However, fixing this apparent limitation may not be worth the
5047 additional checking. Testing on several code bases (GCC, DLV,
5048 MICO, TRAMP3D and SPEC2000) showed that doing this results in
5049 4 more predicates folded in SPEC. */
5050 sop = false;
5051 val = vrp_evaluate_conditional_warnv (cond, false, &sop);
5052 if (val)
5054 if (!sop)
5055 *taken_edge_p = find_taken_edge (bb_for_stmt (stmt), val);
5056 else
5058 if (dump_file && (dump_flags & TDF_DETAILS))
5059 fprintf (dump_file,
5060 "\nIgnoring predicate evaluation because "
5061 "it assumes that signed overflow is undefined");
5062 val = NULL_TREE;
5066 if (dump_file && (dump_flags & TDF_DETAILS))
5068 fprintf (dump_file, "\nPredicate evaluates to: ");
5069 if (val == NULL_TREE)
5070 fprintf (dump_file, "DON'T KNOW\n");
5071 else
5072 print_generic_stmt (dump_file, val, 0);
5075 return (*taken_edge_p) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
5079 /* Evaluate statement STMT. If the statement produces a useful range,
5080 return SSA_PROP_INTERESTING and record the SSA name with the
5081 interesting range into *OUTPUT_P.
5083 If STMT is a conditional branch and we can determine its truth
5084 value, the taken edge is recorded in *TAKEN_EDGE_P.
5086 If STMT produces a varying value, return SSA_PROP_VARYING. */
5088 static enum ssa_prop_result
5089 vrp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p)
5091 tree def;
5092 ssa_op_iter iter;
5093 stmt_ann_t ann;
5095 if (dump_file && (dump_flags & TDF_DETAILS))
5097 fprintf (dump_file, "\nVisiting statement:\n");
5098 print_generic_stmt (dump_file, stmt, dump_flags);
5099 fprintf (dump_file, "\n");
5102 ann = stmt_ann (stmt);
5103 if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT)
5105 tree rhs = GIMPLE_STMT_OPERAND (stmt, 1);
5107 /* In general, assignments with virtual operands are not useful
5108 for deriving ranges, with the obvious exception of calls to
5109 builtin functions. */
5110 if ((TREE_CODE (rhs) == CALL_EXPR
5111 && TREE_CODE (CALL_EXPR_FN (rhs)) == ADDR_EXPR
5112 && DECL_P (TREE_OPERAND (CALL_EXPR_FN (rhs), 0))
5113 && DECL_IS_BUILTIN (TREE_OPERAND (CALL_EXPR_FN (rhs), 0)))
5114 || ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
5115 return vrp_visit_assignment (stmt, output_p);
5117 else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
5118 return vrp_visit_cond_stmt (stmt, taken_edge_p);
5120 /* All other statements produce nothing of interest for VRP, so mark
5121 their outputs varying and prevent further simulation. */
5122 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
5123 set_value_range_to_varying (get_value_range (def));
5125 return SSA_PROP_VARYING;
5129 /* Meet operation for value ranges. Given two value ranges VR0 and
5130 VR1, store in VR0 a range that contains both VR0 and VR1. This
5131 may not be the smallest possible such range. */
5133 static void
5134 vrp_meet (value_range_t *vr0, value_range_t *vr1)
5136 if (vr0->type == VR_UNDEFINED)
5138 copy_value_range (vr0, vr1);
5139 return;
5142 if (vr1->type == VR_UNDEFINED)
5144 /* Nothing to do. VR0 already has the resulting range. */
5145 return;
5148 if (vr0->type == VR_VARYING)
5150 /* Nothing to do. VR0 already has the resulting range. */
5151 return;
5154 if (vr1->type == VR_VARYING)
5156 set_value_range_to_varying (vr0);
5157 return;
5160 if (vr0->type == VR_RANGE && vr1->type == VR_RANGE)
5162 int cmp;
5163 tree min, max;
5165 /* Compute the convex hull of the ranges. The lower limit of
5166 the new range is the minimum of the two ranges. If they
5167 cannot be compared, then give up. */
5168 cmp = compare_values (vr0->min, vr1->min);
5169 if (cmp == 0 || cmp == 1)
5170 min = vr1->min;
5171 else if (cmp == -1)
5172 min = vr0->min;
5173 else
5174 goto give_up;
5176 /* Similarly, the upper limit of the new range is the maximum
5177 of the two ranges. If they cannot be compared, then
5178 give up. */
5179 cmp = compare_values (vr0->max, vr1->max);
5180 if (cmp == 0 || cmp == -1)
5181 max = vr1->max;
5182 else if (cmp == 1)
5183 max = vr0->max;
5184 else
5185 goto give_up;
5187 /* Check for useless ranges. */
5188 if (INTEGRAL_TYPE_P (TREE_TYPE (min))
5189 && ((vrp_val_is_min (min) || is_overflow_infinity (min))
5190 && (vrp_val_is_max (max) || is_overflow_infinity (max))))
5191 goto give_up;
5193 /* The resulting set of equivalences is the intersection of
5194 the two sets. */
5195 if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
5196 bitmap_and_into (vr0->equiv, vr1->equiv);
5197 else if (vr0->equiv && !vr1->equiv)
5198 bitmap_clear (vr0->equiv);
5200 set_value_range (vr0, vr0->type, min, max, vr0->equiv);
5202 else if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
5204 /* Two anti-ranges meet only if their complements intersect.
5205 Only handle the case of identical ranges. */
5206 if (compare_values (vr0->min, vr1->min) == 0
5207 && compare_values (vr0->max, vr1->max) == 0
5208 && compare_values (vr0->min, vr0->max) == 0)
5210 /* The resulting set of equivalences is the intersection of
5211 the two sets. */
5212 if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
5213 bitmap_and_into (vr0->equiv, vr1->equiv);
5214 else if (vr0->equiv && !vr1->equiv)
5215 bitmap_clear (vr0->equiv);
5217 else
5218 goto give_up;
5220 else if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
5222 /* For a numeric range [VAL1, VAL2] and an anti-range ~[VAL3, VAL4],
5223 only handle the case where the ranges have an empty intersection.
5224 The result of the meet operation is the anti-range. */
5225 if (!symbolic_range_p (vr0)
5226 && !symbolic_range_p (vr1)
5227 && !value_ranges_intersect_p (vr0, vr1))
5229 /* Copy most of VR1 into VR0. Don't copy VR1's equivalence
5230 set. We need to compute the intersection of the two
5231 equivalence sets. */
5232 if (vr1->type == VR_ANTI_RANGE)
5233 set_value_range (vr0, vr1->type, vr1->min, vr1->max, vr0->equiv);
5235 /* The resulting set of equivalences is the intersection of
5236 the two sets. */
5237 if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
5238 bitmap_and_into (vr0->equiv, vr1->equiv);
5239 else if (vr0->equiv && !vr1->equiv)
5240 bitmap_clear (vr0->equiv);
5242 else
5243 goto give_up;
5245 else
5246 gcc_unreachable ();
5248 return;
5250 give_up:
5251 /* Failed to find an efficient meet. Before giving up and setting
5252 the result to VARYING, see if we can at least derive a useful
5253 anti-range. FIXME, all this nonsense about distinguishing
5254 anti-ranges from ranges is necessary because of the odd
5255 semantics of range_includes_zero_p and friends. */
5256 if (!symbolic_range_p (vr0)
5257 && ((vr0->type == VR_RANGE && !range_includes_zero_p (vr0))
5258 || (vr0->type == VR_ANTI_RANGE && range_includes_zero_p (vr0)))
5259 && !symbolic_range_p (vr1)
5260 && ((vr1->type == VR_RANGE && !range_includes_zero_p (vr1))
5261 || (vr1->type == VR_ANTI_RANGE && range_includes_zero_p (vr1))))
5263 set_value_range_to_nonnull (vr0, TREE_TYPE (vr0->min));
5265 /* Since this meet operation did not result from the meeting of
5266 two equivalent names, VR0 cannot have any equivalences. */
5267 if (vr0->equiv)
5268 bitmap_clear (vr0->equiv);
5270 else
5271 set_value_range_to_varying (vr0);
5275 /* Visit all arguments for PHI node PHI that flow through executable
5276 edges. If a valid value range can be derived from all the incoming
5277 value ranges, set a new range for the LHS of PHI. */
5279 static enum ssa_prop_result
5280 vrp_visit_phi_node (tree phi)
5282 int i;
5283 tree lhs = PHI_RESULT (phi);
5284 value_range_t *lhs_vr = get_value_range (lhs);
5285 value_range_t vr_result = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
5286 int edges, old_edges;
5288 copy_value_range (&vr_result, lhs_vr);
5290 if (dump_file && (dump_flags & TDF_DETAILS))
5292 fprintf (dump_file, "\nVisiting PHI node: ");
5293 print_generic_expr (dump_file, phi, dump_flags);
5296 edges = 0;
5297 for (i = 0; i < PHI_NUM_ARGS (phi); i++)
5299 edge e = PHI_ARG_EDGE (phi, i);
5301 if (dump_file && (dump_flags & TDF_DETAILS))
5303 fprintf (dump_file,
5304 "\n Argument #%d (%d -> %d %sexecutable)\n",
5305 i, e->src->index, e->dest->index,
5306 (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
5309 if (e->flags & EDGE_EXECUTABLE)
5311 tree arg = PHI_ARG_DEF (phi, i);
5312 value_range_t vr_arg;
5314 ++edges;
5316 if (TREE_CODE (arg) == SSA_NAME)
5318 vr_arg = *(get_value_range (arg));
5320 else
5322 if (is_overflow_infinity (arg))
5324 arg = copy_node (arg);
5325 TREE_OVERFLOW (arg) = 0;
5328 vr_arg.type = VR_RANGE;
5329 vr_arg.min = arg;
5330 vr_arg.max = arg;
5331 vr_arg.equiv = NULL;
5334 if (dump_file && (dump_flags & TDF_DETAILS))
5336 fprintf (dump_file, "\t");
5337 print_generic_expr (dump_file, arg, dump_flags);
5338 fprintf (dump_file, "\n\tValue: ");
5339 dump_value_range (dump_file, &vr_arg);
5340 fprintf (dump_file, "\n");
5343 vrp_meet (&vr_result, &vr_arg);
5345 if (vr_result.type == VR_VARYING)
5346 break;
5350 if (vr_result.type == VR_VARYING)
5351 goto varying;
5353 old_edges = vr_phi_edge_counts[SSA_NAME_VERSION (lhs)];
5354 vr_phi_edge_counts[SSA_NAME_VERSION (lhs)] = edges;
5356 /* To prevent infinite iterations in the algorithm, derive ranges
5357 when the new value is slightly bigger or smaller than the
5358 previous one. We don't do this if we have seen a new executable
5359 edge; this helps us avoid an overflow infinity for conditionals
5360 which are not in a loop. */
5361 if (lhs_vr->type == VR_RANGE && vr_result.type == VR_RANGE
5362 && edges <= old_edges)
5364 if (!POINTER_TYPE_P (TREE_TYPE (lhs)))
5366 int cmp_min = compare_values (lhs_vr->min, vr_result.min);
5367 int cmp_max = compare_values (lhs_vr->max, vr_result.max);
5369 /* If the new minimum is smaller or larger than the previous
5370 one, go all the way to -INF. In the first case, to avoid
5371 iterating millions of times to reach -INF, and in the
5372 other case to avoid infinite bouncing between different
5373 minimums. */
5374 if (cmp_min > 0 || cmp_min < 0)
5376 /* If we will end up with a (-INF, +INF) range, set it
5377 to VARYING. */
5378 if (vrp_val_is_max (vr_result.max))
5379 goto varying;
5381 if (!needs_overflow_infinity (TREE_TYPE (vr_result.min)))
5382 vr_result.min = TYPE_MIN_VALUE (TREE_TYPE (vr_result.min));
5383 else if (supports_overflow_infinity (TREE_TYPE (vr_result.min)))
5384 vr_result.min =
5385 negative_overflow_infinity (TREE_TYPE (vr_result.min));
5386 else
5387 goto varying;
5390 /* Similarly, if the new maximum is smaller or larger than
5391 the previous one, go all the way to +INF. */
5392 if (cmp_max < 0 || cmp_max > 0)
5394 /* If we will end up with a (-INF, +INF) range, set it
5395 to VARYING. */
5396 if (vrp_val_is_min (vr_result.min))
5397 goto varying;
5399 if (!needs_overflow_infinity (TREE_TYPE (vr_result.max)))
5400 vr_result.max = TYPE_MAX_VALUE (TREE_TYPE (vr_result.max));
5401 else if (supports_overflow_infinity (TREE_TYPE (vr_result.max)))
5402 vr_result.max =
5403 positive_overflow_infinity (TREE_TYPE (vr_result.max));
5404 else
5405 goto varying;
5410 /* If the new range is different than the previous value, keep
5411 iterating. */
5412 if (update_value_range (lhs, &vr_result))
5413 return SSA_PROP_INTERESTING;
5415 /* Nothing changed, don't add outgoing edges. */
5416 return SSA_PROP_NOT_INTERESTING;
5418 /* No match found. Set the LHS to VARYING. */
5419 varying:
5420 set_value_range_to_varying (lhs_vr);
5421 return SSA_PROP_VARYING;
5424 /* Simplify a division or modulo operator to a right shift or
5425 bitwise and if the first operand is unsigned or is greater
5426 than zero and the second operand is an exact power of two. */
5428 static void
5429 simplify_div_or_mod_using_ranges (tree stmt, tree rhs, enum tree_code rhs_code)
5431 tree val = NULL;
5432 tree op = TREE_OPERAND (rhs, 0);
5433 value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
5435 if (TYPE_UNSIGNED (TREE_TYPE (op)))
5437 val = integer_one_node;
5439 else
5441 bool sop = false;
5443 val = compare_range_with_value (GT_EXPR, vr, integer_zero_node, &sop);
5445 if (val
5446 && sop
5447 && integer_onep (val)
5448 && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
5450 location_t locus;
5452 if (!EXPR_HAS_LOCATION (stmt))
5453 locus = input_location;
5454 else
5455 locus = EXPR_LOCATION (stmt);
5456 warning (OPT_Wstrict_overflow,
5457 ("%Hassuming signed overflow does not occur when "
5458 "simplifying / or %% to >> or &"),
5459 &locus);
5463 if (val && integer_onep (val))
5465 tree t;
5466 tree op0 = TREE_OPERAND (rhs, 0);
5467 tree op1 = TREE_OPERAND (rhs, 1);
5469 if (rhs_code == TRUNC_DIV_EXPR)
5471 t = build_int_cst (NULL_TREE, tree_log2 (op1));
5472 t = build2 (RSHIFT_EXPR, TREE_TYPE (op0), op0, t);
5474 else
5476 t = build_int_cst (TREE_TYPE (op1), 1);
5477 t = int_const_binop (MINUS_EXPR, op1, t, 0);
5478 t = fold_convert (TREE_TYPE (op0), t);
5479 t = build2 (BIT_AND_EXPR, TREE_TYPE (op0), op0, t);
5482 GIMPLE_STMT_OPERAND (stmt, 1) = t;
5483 update_stmt (stmt);
5487 /* If the operand to an ABS_EXPR is >= 0, then eliminate the
5488 ABS_EXPR. If the operand is <= 0, then simplify the
5489 ABS_EXPR into a NEGATE_EXPR. */
5491 static void
5492 simplify_abs_using_ranges (tree stmt, tree rhs)
5494 tree val = NULL;
5495 tree op = TREE_OPERAND (rhs, 0);
5496 tree type = TREE_TYPE (op);
5497 value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
5499 if (TYPE_UNSIGNED (type))
5501 val = integer_zero_node;
5503 else if (vr)
5505 bool sop = false;
5507 val = compare_range_with_value (LE_EXPR, vr, integer_zero_node, &sop);
5508 if (!val)
5510 sop = false;
5511 val = compare_range_with_value (GE_EXPR, vr, integer_zero_node,
5512 &sop);
5514 if (val)
5516 if (integer_zerop (val))
5517 val = integer_one_node;
5518 else if (integer_onep (val))
5519 val = integer_zero_node;
5523 if (val
5524 && (integer_onep (val) || integer_zerop (val)))
5526 tree t;
5528 if (sop && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
5530 location_t locus;
5532 if (!EXPR_HAS_LOCATION (stmt))
5533 locus = input_location;
5534 else
5535 locus = EXPR_LOCATION (stmt);
5536 warning (OPT_Wstrict_overflow,
5537 ("%Hassuming signed overflow does not occur when "
5538 "simplifying abs (X) to X or -X"),
5539 &locus);
5542 if (integer_onep (val))
5543 t = build1 (NEGATE_EXPR, TREE_TYPE (op), op);
5544 else
5545 t = op;
5547 GIMPLE_STMT_OPERAND (stmt, 1) = t;
5548 update_stmt (stmt);
5553 /* We are comparing trees OP0 and OP1 using COND_CODE. OP0 has
5554 a known value range VR.
5556 If there is one and only one value which will satisfy the
5557 conditional, then return that value. Else return NULL. */
5559 static tree
5560 test_for_singularity (enum tree_code cond_code, tree op0,
5561 tree op1, value_range_t *vr)
5563 tree min = NULL;
5564 tree max = NULL;
5566 /* Extract minimum/maximum values which satisfy the
5567 the conditional as it was written. */
5568 if (cond_code == LE_EXPR || cond_code == LT_EXPR)
5570 /* This should not be negative infinity; there is no overflow
5571 here. */
5572 min = TYPE_MIN_VALUE (TREE_TYPE (op0));
5574 max = op1;
5575 if (cond_code == LT_EXPR && !is_overflow_infinity (max))
5577 tree one = build_int_cst (TREE_TYPE (op0), 1);
5578 max = fold_build2 (MINUS_EXPR, TREE_TYPE (op0), max, one);
5581 else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
5583 /* This should not be positive infinity; there is no overflow
5584 here. */
5585 max = TYPE_MAX_VALUE (TREE_TYPE (op0));
5587 min = op1;
5588 if (cond_code == GT_EXPR && !is_overflow_infinity (min))
5590 tree one = build_int_cst (TREE_TYPE (op0), 1);
5591 min = fold_build2 (PLUS_EXPR, TREE_TYPE (op0), min, one);
5595 /* Now refine the minimum and maximum values using any
5596 value range information we have for op0. */
5597 if (min && max)
5599 if (compare_values (vr->min, min) == -1)
5600 min = min;
5601 else
5602 min = vr->min;
5603 if (compare_values (vr->max, max) == 1)
5604 max = max;
5605 else
5606 max = vr->max;
5608 /* If the new min/max values have converged to a single value,
5609 then there is only one value which can satisfy the condition,
5610 return that value. */
5611 if (operand_equal_p (min, max, 0) && is_gimple_min_invariant (min))
5612 return min;
5614 return NULL;
5617 /* Simplify a conditional using a relational operator to an equality
5618 test if the range information indicates only one value can satisfy
5619 the original conditional. */
5621 static void
5622 simplify_cond_using_ranges (tree stmt)
5624 tree cond = COND_EXPR_COND (stmt);
5625 tree op0 = TREE_OPERAND (cond, 0);
5626 tree op1 = TREE_OPERAND (cond, 1);
5627 enum tree_code cond_code = TREE_CODE (cond);
5629 if (cond_code != NE_EXPR
5630 && cond_code != EQ_EXPR
5631 && TREE_CODE (op0) == SSA_NAME
5632 && INTEGRAL_TYPE_P (TREE_TYPE (op0))
5633 && is_gimple_min_invariant (op1))
5635 value_range_t *vr = get_value_range (op0);
5637 /* If we have range information for OP0, then we might be
5638 able to simplify this conditional. */
5639 if (vr->type == VR_RANGE)
5641 tree new = test_for_singularity (cond_code, op0, op1, vr);
5643 if (new)
5645 if (dump_file)
5647 fprintf (dump_file, "Simplified relational ");
5648 print_generic_expr (dump_file, cond, 0);
5649 fprintf (dump_file, " into ");
5652 COND_EXPR_COND (stmt)
5653 = build2 (EQ_EXPR, boolean_type_node, op0, new);
5654 update_stmt (stmt);
5656 if (dump_file)
5658 print_generic_expr (dump_file, COND_EXPR_COND (stmt), 0);
5659 fprintf (dump_file, "\n");
5661 return;
5665 /* Try again after inverting the condition. We only deal
5666 with integral types here, so no need to worry about
5667 issues with inverting FP comparisons. */
5668 cond_code = invert_tree_comparison (cond_code, false);
5669 new = test_for_singularity (cond_code, op0, op1, vr);
5671 if (new)
5673 if (dump_file)
5675 fprintf (dump_file, "Simplified relational ");
5676 print_generic_expr (dump_file, cond, 0);
5677 fprintf (dump_file, " into ");
5680 COND_EXPR_COND (stmt)
5681 = build2 (NE_EXPR, boolean_type_node, op0, new);
5682 update_stmt (stmt);
5684 if (dump_file)
5686 print_generic_expr (dump_file, COND_EXPR_COND (stmt), 0);
5687 fprintf (dump_file, "\n");
5689 return;
5696 /* Simplify STMT using ranges if possible. */
5698 void
5699 simplify_stmt_using_ranges (tree stmt)
5701 if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT)
5703 tree rhs = GIMPLE_STMT_OPERAND (stmt, 1);
5704 enum tree_code rhs_code = TREE_CODE (rhs);
5706 /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
5707 and BIT_AND_EXPR respectively if the first operand is greater
5708 than zero and the second operand is an exact power of two. */
5709 if ((rhs_code == TRUNC_DIV_EXPR || rhs_code == TRUNC_MOD_EXPR)
5710 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0)))
5711 && integer_pow2p (TREE_OPERAND (rhs, 1)))
5712 simplify_div_or_mod_using_ranges (stmt, rhs, rhs_code);
5714 /* Transform ABS (X) into X or -X as appropriate. */
5715 if (rhs_code == ABS_EXPR
5716 && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME
5717 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0))))
5718 simplify_abs_using_ranges (stmt, rhs);
5720 else if (TREE_CODE (stmt) == COND_EXPR
5721 && COMPARISON_CLASS_P (COND_EXPR_COND (stmt)))
5723 simplify_cond_using_ranges (stmt);
5727 /* Stack of dest,src equivalency pairs that need to be restored after
5728 each attempt to thread a block's incoming edge to an outgoing edge.
5730 A NULL entry is used to mark the end of pairs which need to be
5731 restored. */
5732 static VEC(tree,heap) *stack;
5734 /* A trivial wrapper so that we can present the generic jump threading
5735 code with a simple API for simplifying statements. STMT is the
5736 statement we want to simplify, WITHIN_STMT provides the location
5737 for any overflow warnings. */
5739 static tree
5740 simplify_stmt_for_jump_threading (tree stmt, tree within_stmt)
5742 /* We only use VRP information to simplify conditionals. This is
5743 overly conservative, but it's unclear if doing more would be
5744 worth the compile time cost. */
5745 if (TREE_CODE (stmt) != COND_EXPR)
5746 return NULL;
5748 return vrp_evaluate_conditional (COND_EXPR_COND (stmt), within_stmt);
5751 /* Blocks which have more than one predecessor and more than
5752 one successor present jump threading opportunities. ie,
5753 when the block is reached from a specific predecessor, we
5754 may be able to determine which of the outgoing edges will
5755 be traversed. When this optimization applies, we are able
5756 to avoid conditionals at runtime and we may expose secondary
5757 optimization opportunities.
5759 This routine is effectively a driver for the generic jump
5760 threading code. It basically just presents the generic code
5761 with edges that may be suitable for jump threading.
5763 Unlike DOM, we do not iterate VRP if jump threading was successful.
5764 While iterating may expose new opportunities for VRP, it is expected
5765 those opportunities would be very limited and the compile time cost
5766 to expose those opportunities would be significant.
5768 As jump threading opportunities are discovered, they are registered
5769 for later realization. */
5771 static void
5772 identify_jump_threads (void)
5774 basic_block bb;
5775 tree dummy;
5777 /* Ugh. When substituting values earlier in this pass we can
5778 wipe the dominance information. So rebuild the dominator
5779 information as we need it within the jump threading code. */
5780 calculate_dominance_info (CDI_DOMINATORS);
5782 /* We do not allow VRP information to be used for jump threading
5783 across a back edge in the CFG. Otherwise it becomes too
5784 difficult to avoid eliminating loop exit tests. Of course
5785 EDGE_DFS_BACK is not accurate at this time so we have to
5786 recompute it. */
5787 mark_dfs_back_edges ();
5789 /* Allocate our unwinder stack to unwind any temporary equivalences
5790 that might be recorded. */
5791 stack = VEC_alloc (tree, heap, 20);
5793 /* To avoid lots of silly node creation, we create a single
5794 conditional and just modify it in-place when attempting to
5795 thread jumps. */
5796 dummy = build2 (EQ_EXPR, boolean_type_node, NULL, NULL);
5797 dummy = build3 (COND_EXPR, void_type_node, dummy, NULL, NULL);
5799 /* Walk through all the blocks finding those which present a
5800 potential jump threading opportunity. We could set this up
5801 as a dominator walker and record data during the walk, but
5802 I doubt it's worth the effort for the classes of jump
5803 threading opportunities we are trying to identify at this
5804 point in compilation. */
5805 FOR_EACH_BB (bb)
5807 tree last, cond;
5809 /* If the generic jump threading code does not find this block
5810 interesting, then there is nothing to do. */
5811 if (! potentially_threadable_block (bb))
5812 continue;
5814 /* We only care about blocks ending in a COND_EXPR. While there
5815 may be some value in handling SWITCH_EXPR here, I doubt it's
5816 terribly important. */
5817 last = bsi_stmt (bsi_last (bb));
5818 if (TREE_CODE (last) != COND_EXPR)
5819 continue;
5821 /* We're basically looking for any kind of conditional with
5822 integral type arguments. */
5823 cond = COND_EXPR_COND (last);
5824 if ((TREE_CODE (cond) == SSA_NAME
5825 && INTEGRAL_TYPE_P (TREE_TYPE (cond)))
5826 || (COMPARISON_CLASS_P (cond)
5827 && TREE_CODE (TREE_OPERAND (cond, 0)) == SSA_NAME
5828 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (cond, 0)))
5829 && (TREE_CODE (TREE_OPERAND (cond, 1)) == SSA_NAME
5830 || is_gimple_min_invariant (TREE_OPERAND (cond, 1)))
5831 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (cond, 1)))))
5833 edge_iterator ei;
5834 edge e;
5836 /* We've got a block with multiple predecessors and multiple
5837 successors which also ends in a suitable conditional. For
5838 each predecessor, see if we can thread it to a specific
5839 successor. */
5840 FOR_EACH_EDGE (e, ei, bb->preds)
5842 /* Do not thread across back edges or abnormal edges
5843 in the CFG. */
5844 if (e->flags & (EDGE_DFS_BACK | EDGE_COMPLEX))
5845 continue;
5847 thread_across_edge (dummy, e, true,
5848 &stack,
5849 simplify_stmt_for_jump_threading);
5854 /* We do not actually update the CFG or SSA graphs at this point as
5855 ASSERT_EXPRs are still in the IL and cfg cleanup code does not yet
5856 handle ASSERT_EXPRs gracefully. */
5859 /* We identified all the jump threading opportunities earlier, but could
5860 not transform the CFG at that time. This routine transforms the
5861 CFG and arranges for the dominator tree to be rebuilt if necessary.
5863 Note the SSA graph update will occur during the normal TODO
5864 processing by the pass manager. */
5865 static void
5866 finalize_jump_threads (void)
5868 bool cfg_altered = false;
5869 cfg_altered = thread_through_all_blocks ();
5871 /* If we threaded jumps, then we need to recompute the dominance
5872 information. */
5873 if (cfg_altered)
5874 free_dominance_info (CDI_DOMINATORS);
5875 VEC_free (tree, heap, stack);
5879 /* Traverse all the blocks folding conditionals with known ranges. */
5881 static void
5882 vrp_finalize (void)
5884 size_t i;
5885 prop_value_t *single_val_range;
5886 bool do_value_subst_p;
5888 if (dump_file)
5890 fprintf (dump_file, "\nValue ranges after VRP:\n\n");
5891 dump_all_value_ranges (dump_file);
5892 fprintf (dump_file, "\n");
5895 /* We may have ended with ranges that have exactly one value. Those
5896 values can be substituted as any other copy/const propagated
5897 value using substitute_and_fold. */
5898 single_val_range = XCNEWVEC (prop_value_t, num_ssa_names);
5900 do_value_subst_p = false;
5901 for (i = 0; i < num_ssa_names; i++)
5902 if (vr_value[i]
5903 && vr_value[i]->type == VR_RANGE
5904 && vr_value[i]->min == vr_value[i]->max)
5906 single_val_range[i].value = vr_value[i]->min;
5907 do_value_subst_p = true;
5910 if (!do_value_subst_p)
5912 /* We found no single-valued ranges, don't waste time trying to
5913 do single value substitution in substitute_and_fold. */
5914 free (single_val_range);
5915 single_val_range = NULL;
5918 substitute_and_fold (single_val_range, true);
5920 if (warn_array_bounds)
5921 check_all_array_refs ();
5923 /* We must identify jump threading opportunities before we release
5924 the datastructures built by VRP. */
5925 identify_jump_threads ();
5927 /* Free allocated memory. */
5928 for (i = 0; i < num_ssa_names; i++)
5929 if (vr_value[i])
5931 BITMAP_FREE (vr_value[i]->equiv);
5932 free (vr_value[i]);
5935 free (single_val_range);
5936 free (vr_value);
5937 free (vr_phi_edge_counts);
5939 /* So that we can distinguish between VRP data being available
5940 and not available. */
5941 vr_value = NULL;
5942 vr_phi_edge_counts = NULL;
5946 /* Main entry point to VRP (Value Range Propagation). This pass is
5947 loosely based on J. R. C. Patterson, ``Accurate Static Branch
5948 Prediction by Value Range Propagation,'' in SIGPLAN Conference on
5949 Programming Language Design and Implementation, pp. 67-78, 1995.
5950 Also available at http://citeseer.ist.psu.edu/patterson95accurate.html
5952 This is essentially an SSA-CCP pass modified to deal with ranges
5953 instead of constants.
5955 While propagating ranges, we may find that two or more SSA name
5956 have equivalent, though distinct ranges. For instance,
5958 1 x_9 = p_3->a;
5959 2 p_4 = ASSERT_EXPR <p_3, p_3 != 0>
5960 3 if (p_4 == q_2)
5961 4 p_5 = ASSERT_EXPR <p_4, p_4 == q_2>;
5962 5 endif
5963 6 if (q_2)
5965 In the code above, pointer p_5 has range [q_2, q_2], but from the
5966 code we can also determine that p_5 cannot be NULL and, if q_2 had
5967 a non-varying range, p_5's range should also be compatible with it.
5969 These equivalences are created by two expressions: ASSERT_EXPR and
5970 copy operations. Since p_5 is an assertion on p_4, and p_4 was the
5971 result of another assertion, then we can use the fact that p_5 and
5972 p_4 are equivalent when evaluating p_5's range.
5974 Together with value ranges, we also propagate these equivalences
5975 between names so that we can take advantage of information from
5976 multiple ranges when doing final replacement. Note that this
5977 equivalency relation is transitive but not symmetric.
5979 In the example above, p_5 is equivalent to p_4, q_2 and p_3, but we
5980 cannot assert that q_2 is equivalent to p_5 because q_2 may be used
5981 in contexts where that assertion does not hold (e.g., in line 6).
5983 TODO, the main difference between this pass and Patterson's is that
5984 we do not propagate edge probabilities. We only compute whether
5985 edges can be taken or not. That is, instead of having a spectrum
5986 of jump probabilities between 0 and 1, we only deal with 0, 1 and
5987 DON'T KNOW. In the future, it may be worthwhile to propagate
5988 probabilities to aid branch prediction. */
5990 static unsigned int
5991 execute_vrp (void)
5993 insert_range_assertions ();
5995 loop_optimizer_init (LOOPS_NORMAL);
5996 if (current_loops)
5997 scev_initialize ();
5999 vrp_initialize ();
6000 ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
6001 vrp_finalize ();
6003 if (current_loops)
6005 scev_finalize ();
6006 loop_optimizer_finalize ();
6009 /* ASSERT_EXPRs must be removed before finalizing jump threads
6010 as finalizing jump threads calls the CFG cleanup code which
6011 does not properly handle ASSERT_EXPRs. */
6012 remove_range_assertions ();
6014 /* If we exposed any new variables, go ahead and put them into
6015 SSA form now, before we handle jump threading. This simplifies
6016 interactions between rewriting of _DECL nodes into SSA form
6017 and rewriting SSA_NAME nodes into SSA form after block
6018 duplication and CFG manipulation. */
6019 update_ssa (TODO_update_ssa);
6021 finalize_jump_threads ();
6022 return 0;
6025 static bool
6026 gate_vrp (void)
6028 return flag_tree_vrp != 0;
6031 struct tree_opt_pass pass_vrp =
6033 "vrp", /* name */
6034 gate_vrp, /* gate */
6035 execute_vrp, /* execute */
6036 NULL, /* sub */
6037 NULL, /* next */
6038 0, /* static_pass_number */
6039 TV_TREE_VRP, /* tv_id */
6040 PROP_ssa | PROP_alias, /* properties_required */
6041 0, /* properties_provided */
6042 0, /* properties_destroyed */
6043 0, /* todo_flags_start */
6044 TODO_cleanup_cfg
6045 | TODO_ggc_collect
6046 | TODO_verify_ssa
6047 | TODO_dump_func
6048 | TODO_update_ssa, /* todo_flags_finish */
6049 0 /* letter */