* decl2.c (determine_visibility): Don't propagate visibility from
[official-gcc.git] / gcc / tree-vrp.c
blob64f292e89c40ccb56de98a80978bb426aaa981f4
1 /* Support routines for Value Range Propagation (VRP).
2 Copyright (C) 2005, 2006 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 "cfgloop.h"
36 #include "tree-scalar-evolution.h"
37 #include "tree-ssa-propagate.h"
38 #include "tree-chrec.h"
40 /* Set of SSA names found during the dominator traversal of a
41 sub-graph in find_assert_locations. */
42 static sbitmap found_in_subgraph;
44 /* Local functions. */
45 static int compare_values (tree val1, tree val2);
47 /* Location information for ASSERT_EXPRs. Each instance of this
48 structure describes an ASSERT_EXPR for an SSA name. Since a single
49 SSA name may have more than one assertion associated with it, these
50 locations are kept in a linked list attached to the corresponding
51 SSA name. */
52 struct assert_locus_d
54 /* Basic block where the assertion would be inserted. */
55 basic_block bb;
57 /* Some assertions need to be inserted on an edge (e.g., assertions
58 generated by COND_EXPRs). In those cases, BB will be NULL. */
59 edge e;
61 /* Pointer to the statement that generated this assertion. */
62 block_stmt_iterator si;
64 /* Predicate code for the ASSERT_EXPR. Must be COMPARISON_CLASS_P. */
65 enum tree_code comp_code;
67 /* Value being compared against. */
68 tree val;
70 /* Next node in the linked list. */
71 struct assert_locus_d *next;
74 typedef struct assert_locus_d *assert_locus_t;
76 /* If bit I is present, it means that SSA name N_i has a list of
77 assertions that should be inserted in the IL. */
78 static bitmap need_assert_for;
80 /* Array of locations lists where to insert assertions. ASSERTS_FOR[I]
81 holds a list of ASSERT_LOCUS_T nodes that describe where
82 ASSERT_EXPRs for SSA name N_I should be inserted. */
83 static assert_locus_t *asserts_for;
85 /* Set of blocks visited in find_assert_locations. Used to avoid
86 visiting the same block more than once. */
87 static sbitmap blocks_visited;
89 /* Value range array. After propagation, VR_VALUE[I] holds the range
90 of values that SSA name N_I may take. */
91 static value_range_t **vr_value;
94 /* Return true if ARG is marked with the nonnull attribute in the
95 current function signature. */
97 static bool
98 nonnull_arg_p (tree arg)
100 tree t, attrs, fntype;
101 unsigned HOST_WIDE_INT arg_num;
103 gcc_assert (TREE_CODE (arg) == PARM_DECL && POINTER_TYPE_P (TREE_TYPE (arg)));
105 fntype = TREE_TYPE (current_function_decl);
106 attrs = lookup_attribute ("nonnull", TYPE_ATTRIBUTES (fntype));
108 /* If "nonnull" wasn't specified, we know nothing about the argument. */
109 if (attrs == NULL_TREE)
110 return false;
112 /* If "nonnull" applies to all the arguments, then ARG is non-null. */
113 if (TREE_VALUE (attrs) == NULL_TREE)
114 return true;
116 /* Get the position number for ARG in the function signature. */
117 for (arg_num = 1, t = DECL_ARGUMENTS (current_function_decl);
119 t = TREE_CHAIN (t), arg_num++)
121 if (t == arg)
122 break;
125 gcc_assert (t == arg);
127 /* Now see if ARG_NUM is mentioned in the nonnull list. */
128 for (t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
130 if (compare_tree_int (TREE_VALUE (t), arg_num) == 0)
131 return true;
134 return false;
138 /* Set value range VR to {T, MIN, MAX, EQUIV}. */
140 static void
141 set_value_range (value_range_t *vr, enum value_range_type t, tree min,
142 tree max, bitmap equiv)
144 #if defined ENABLE_CHECKING
145 /* Check the validity of the range. */
146 if (t == VR_RANGE || t == VR_ANTI_RANGE)
148 int cmp;
150 gcc_assert (min && max);
152 if (INTEGRAL_TYPE_P (TREE_TYPE (min)) && t == VR_ANTI_RANGE)
153 gcc_assert (min != TYPE_MIN_VALUE (TREE_TYPE (min))
154 || max != TYPE_MAX_VALUE (TREE_TYPE (max)));
156 cmp = compare_values (min, max);
157 gcc_assert (cmp == 0 || cmp == -1 || cmp == -2);
160 if (t == VR_UNDEFINED || t == VR_VARYING)
161 gcc_assert (min == NULL_TREE && max == NULL_TREE);
163 if (t == VR_UNDEFINED || t == VR_VARYING)
164 gcc_assert (equiv == NULL || bitmap_empty_p (equiv));
165 #endif
167 vr->type = t;
168 vr->min = min;
169 vr->max = max;
171 /* Since updating the equivalence set involves deep copying the
172 bitmaps, only do it if absolutely necessary. */
173 if (vr->equiv == NULL)
174 vr->equiv = BITMAP_ALLOC (NULL);
176 if (equiv != vr->equiv)
178 if (equiv && !bitmap_empty_p (equiv))
179 bitmap_copy (vr->equiv, equiv);
180 else
181 bitmap_clear (vr->equiv);
186 /* Copy value range FROM into value range TO. */
188 static inline void
189 copy_value_range (value_range_t *to, value_range_t *from)
191 set_value_range (to, from->type, from->min, from->max, from->equiv);
194 /* Set value range VR to a non-negative range of type TYPE. */
196 static inline void
197 set_value_range_to_nonnegative (value_range_t *vr, tree type)
199 tree zero = build_int_cst (type, 0);
200 set_value_range (vr, VR_RANGE, zero, TYPE_MAX_VALUE (type), vr->equiv);
203 /* Set value range VR to a non-NULL range of type TYPE. */
205 static inline void
206 set_value_range_to_nonnull (value_range_t *vr, tree type)
208 tree zero = build_int_cst (type, 0);
209 set_value_range (vr, VR_ANTI_RANGE, zero, zero, vr->equiv);
213 /* Set value range VR to a NULL range of type TYPE. */
215 static inline void
216 set_value_range_to_null (value_range_t *vr, tree type)
218 tree zero = build_int_cst (type, 0);
219 set_value_range (vr, VR_RANGE, zero, zero, vr->equiv);
223 /* Set value range VR to VR_VARYING. */
225 static inline void
226 set_value_range_to_varying (value_range_t *vr)
228 vr->type = VR_VARYING;
229 vr->min = vr->max = NULL_TREE;
230 if (vr->equiv)
231 bitmap_clear (vr->equiv);
235 /* Set value range VR to VR_UNDEFINED. */
237 static inline void
238 set_value_range_to_undefined (value_range_t *vr)
240 vr->type = VR_UNDEFINED;
241 vr->min = vr->max = NULL_TREE;
242 if (vr->equiv)
243 bitmap_clear (vr->equiv);
247 /* Return value range information for VAR.
249 If we have no values ranges recorded (ie, VRP is not running), then
250 return NULL. Otherwise create an empty range if none existed for VAR. */
252 static value_range_t *
253 get_value_range (tree var)
255 value_range_t *vr;
256 tree sym;
257 unsigned ver = SSA_NAME_VERSION (var);
259 /* If we have no recorded ranges, then return NULL. */
260 if (! vr_value)
261 return NULL;
263 vr = vr_value[ver];
264 if (vr)
265 return vr;
267 /* Create a default value range. */
268 vr_value[ver] = vr = XNEW (value_range_t);
269 memset (vr, 0, sizeof (*vr));
271 /* Allocate an equivalence set. */
272 vr->equiv = BITMAP_ALLOC (NULL);
274 /* If VAR is a default definition, the variable can take any value
275 in VAR's type. */
276 sym = SSA_NAME_VAR (var);
277 if (var == default_def (sym))
279 /* Try to use the "nonnull" attribute to create ~[0, 0]
280 anti-ranges for pointers. Note that this is only valid with
281 default definitions of PARM_DECLs. */
282 if (TREE_CODE (sym) == PARM_DECL
283 && POINTER_TYPE_P (TREE_TYPE (sym))
284 && nonnull_arg_p (sym))
285 set_value_range_to_nonnull (vr, TREE_TYPE (sym));
286 else
287 set_value_range_to_varying (vr);
290 return vr;
293 /* Return true, if VAL1 and VAL2 are equal values for VRP purposes. */
295 static inline bool
296 vrp_operand_equal_p (tree val1, tree val2)
298 return (val1 == val2
299 || (val1 && val2
300 && operand_equal_p (val1, val2, 0)));
303 /* Return true, if the bitmaps B1 and B2 are equal. */
305 static inline bool
306 vrp_bitmap_equal_p (bitmap b1, bitmap b2)
308 return (b1 == b2
309 || (b1 && b2
310 && bitmap_equal_p (b1, b2)));
313 /* Update the value range and equivalence set for variable VAR to
314 NEW_VR. Return true if NEW_VR is different from VAR's previous
315 value.
317 NOTE: This function assumes that NEW_VR is a temporary value range
318 object created for the sole purpose of updating VAR's range. The
319 storage used by the equivalence set from NEW_VR will be freed by
320 this function. Do not call update_value_range when NEW_VR
321 is the range object associated with another SSA name. */
323 static inline bool
324 update_value_range (tree var, value_range_t *new_vr)
326 value_range_t *old_vr;
327 bool is_new;
329 /* Update the value range, if necessary. */
330 old_vr = get_value_range (var);
331 is_new = old_vr->type != new_vr->type
332 || !vrp_operand_equal_p (old_vr->min, new_vr->min)
333 || !vrp_operand_equal_p (old_vr->max, new_vr->max)
334 || !vrp_bitmap_equal_p (old_vr->equiv, new_vr->equiv);
336 if (is_new)
337 set_value_range (old_vr, new_vr->type, new_vr->min, new_vr->max,
338 new_vr->equiv);
340 BITMAP_FREE (new_vr->equiv);
341 new_vr->equiv = NULL;
343 return is_new;
347 /* Add VAR and VAR's equivalence set to EQUIV. */
349 static void
350 add_equivalence (bitmap equiv, tree var)
352 unsigned ver = SSA_NAME_VERSION (var);
353 value_range_t *vr = vr_value[ver];
355 bitmap_set_bit (equiv, ver);
356 if (vr && vr->equiv)
357 bitmap_ior_into (equiv, vr->equiv);
361 /* Return true if VR is ~[0, 0]. */
363 static inline bool
364 range_is_nonnull (value_range_t *vr)
366 return vr->type == VR_ANTI_RANGE
367 && integer_zerop (vr->min)
368 && integer_zerop (vr->max);
372 /* Return true if VR is [0, 0]. */
374 static inline bool
375 range_is_null (value_range_t *vr)
377 return vr->type == VR_RANGE
378 && integer_zerop (vr->min)
379 && integer_zerop (vr->max);
383 /* Return true if value range VR involves at least one symbol. */
385 static inline bool
386 symbolic_range_p (value_range_t *vr)
388 return (!is_gimple_min_invariant (vr->min)
389 || !is_gimple_min_invariant (vr->max));
392 /* Like tree_expr_nonnegative_p, but this function uses value ranges
393 obtained so far. */
395 static bool
396 vrp_expr_computes_nonnegative (tree expr)
398 return tree_expr_nonnegative_p (expr);
401 /* Like tree_expr_nonzero_p, but this function uses value ranges
402 obtained so far. */
404 static bool
405 vrp_expr_computes_nonzero (tree expr)
407 if (tree_expr_nonzero_p (expr))
408 return true;
410 /* If we have an expression of the form &X->a, then the expression
411 is nonnull if X is nonnull. */
412 if (TREE_CODE (expr) == ADDR_EXPR)
414 tree base = get_base_address (TREE_OPERAND (expr, 0));
416 if (base != NULL_TREE
417 && TREE_CODE (base) == INDIRECT_REF
418 && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
420 value_range_t *vr = get_value_range (TREE_OPERAND (base, 0));
421 if (range_is_nonnull (vr))
422 return true;
426 return false;
429 /* Returns true if EXPR is a valid value (as expected by compare_values) --
430 a gimple invariant, or SSA_NAME +- CST. */
432 static bool
433 valid_value_p (tree expr)
435 if (TREE_CODE (expr) == SSA_NAME)
436 return true;
438 if (TREE_CODE (expr) == PLUS_EXPR
439 || TREE_CODE (expr) == MINUS_EXPR)
440 return (TREE_CODE (TREE_OPERAND (expr, 0)) == SSA_NAME
441 && TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST);
443 return is_gimple_min_invariant (expr);
446 /* Compare two values VAL1 and VAL2. Return
448 -2 if VAL1 and VAL2 cannot be compared at compile-time,
449 -1 if VAL1 < VAL2,
450 0 if VAL1 == VAL2,
451 +1 if VAL1 > VAL2, and
452 +2 if VAL1 != VAL2
454 This is similar to tree_int_cst_compare but supports pointer values
455 and values that cannot be compared at compile time. */
457 static int
458 compare_values (tree val1, tree val2)
460 if (val1 == val2)
461 return 0;
463 /* Below we rely on the fact that VAL1 and VAL2 are both pointers or
464 both integers. */
465 gcc_assert (POINTER_TYPE_P (TREE_TYPE (val1))
466 == POINTER_TYPE_P (TREE_TYPE (val2)));
468 if ((TREE_CODE (val1) == SSA_NAME
469 || TREE_CODE (val1) == PLUS_EXPR
470 || TREE_CODE (val1) == MINUS_EXPR)
471 && (TREE_CODE (val2) == SSA_NAME
472 || TREE_CODE (val2) == PLUS_EXPR
473 || TREE_CODE (val2) == MINUS_EXPR))
475 tree n1, c1, n2, c2;
476 enum tree_code code1, code2;
478 /* If VAL1 and VAL2 are of the form 'NAME [+-] CST' or 'NAME',
479 return -1 or +1 accordingly. If VAL1 and VAL2 don't use the
480 same name, return -2. */
481 if (TREE_CODE (val1) == SSA_NAME)
483 code1 = SSA_NAME;
484 n1 = val1;
485 c1 = NULL_TREE;
487 else
489 code1 = TREE_CODE (val1);
490 n1 = TREE_OPERAND (val1, 0);
491 c1 = TREE_OPERAND (val1, 1);
492 if (tree_int_cst_sgn (c1) == -1)
494 c1 = fold_unary_to_constant (NEGATE_EXPR, TREE_TYPE (c1), c1);
495 if (!c1)
496 return -2;
497 code1 = code1 == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR;
501 if (TREE_CODE (val2) == SSA_NAME)
503 code2 = SSA_NAME;
504 n2 = val2;
505 c2 = NULL_TREE;
507 else
509 code2 = TREE_CODE (val2);
510 n2 = TREE_OPERAND (val2, 0);
511 c2 = TREE_OPERAND (val2, 1);
512 if (tree_int_cst_sgn (c2) == -1)
514 c2 = fold_unary_to_constant (NEGATE_EXPR, TREE_TYPE (c2), c2);
515 if (!c2)
516 return -2;
517 code2 = code2 == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR;
521 /* Both values must use the same name. */
522 if (n1 != n2)
523 return -2;
525 if (code1 == SSA_NAME
526 && code2 == SSA_NAME)
527 /* NAME == NAME */
528 return 0;
530 /* If overflow is defined we cannot simplify more. */
531 if (TYPE_UNSIGNED (TREE_TYPE (val1))
532 || flag_wrapv)
533 return -2;
535 if (code1 == SSA_NAME)
537 if (code2 == PLUS_EXPR)
538 /* NAME < NAME + CST */
539 return -1;
540 else if (code2 == MINUS_EXPR)
541 /* NAME > NAME - CST */
542 return 1;
544 else if (code1 == PLUS_EXPR)
546 if (code2 == SSA_NAME)
547 /* NAME + CST > NAME */
548 return 1;
549 else if (code2 == PLUS_EXPR)
550 /* NAME + CST1 > NAME + CST2, if CST1 > CST2 */
551 return compare_values (c1, c2);
552 else if (code2 == MINUS_EXPR)
553 /* NAME + CST1 > NAME - CST2 */
554 return 1;
556 else if (code1 == MINUS_EXPR)
558 if (code2 == SSA_NAME)
559 /* NAME - CST < NAME */
560 return -1;
561 else if (code2 == PLUS_EXPR)
562 /* NAME - CST1 < NAME + CST2 */
563 return -1;
564 else if (code2 == MINUS_EXPR)
565 /* NAME - CST1 > NAME - CST2, if CST1 < CST2. Notice that
566 C1 and C2 are swapped in the call to compare_values. */
567 return compare_values (c2, c1);
570 gcc_unreachable ();
573 /* We cannot compare non-constants. */
574 if (!is_gimple_min_invariant (val1) || !is_gimple_min_invariant (val2))
575 return -2;
577 if (!POINTER_TYPE_P (TREE_TYPE (val1)))
579 /* We cannot compare overflowed values. */
580 if (TREE_OVERFLOW (val1) || TREE_OVERFLOW (val2))
581 return -2;
583 return tree_int_cst_compare (val1, val2);
585 else
587 tree t;
589 /* First see if VAL1 and VAL2 are not the same. */
590 if (val1 == val2 || operand_equal_p (val1, val2, 0))
591 return 0;
593 /* If VAL1 is a lower address than VAL2, return -1. */
594 t = fold_binary (LT_EXPR, boolean_type_node, val1, val2);
595 if (t == boolean_true_node)
596 return -1;
598 /* If VAL1 is a higher address than VAL2, return +1. */
599 t = fold_binary (GT_EXPR, boolean_type_node, val1, val2);
600 if (t == boolean_true_node)
601 return 1;
603 /* If VAL1 is different than VAL2, return +2. */
604 t = fold_binary (NE_EXPR, boolean_type_node, val1, val2);
605 if (t == boolean_true_node)
606 return 2;
608 return -2;
613 /* Return 1 if VAL is inside value range VR (VR->MIN <= VAL <= VR->MAX),
614 0 if VAL is not inside VR,
615 -2 if we cannot tell either way.
617 FIXME, the current semantics of this functions are a bit quirky
618 when taken in the context of VRP. In here we do not care
619 about VR's type. If VR is the anti-range ~[3, 5] the call
620 value_inside_range (4, VR) will return 1.
622 This is counter-intuitive in a strict sense, but the callers
623 currently expect this. They are calling the function
624 merely to determine whether VR->MIN <= VAL <= VR->MAX. The
625 callers are applying the VR_RANGE/VR_ANTI_RANGE semantics
626 themselves.
628 This also applies to value_ranges_intersect_p and
629 range_includes_zero_p. The semantics of VR_RANGE and
630 VR_ANTI_RANGE should be encoded here, but that also means
631 adapting the users of these functions to the new semantics. */
633 static inline int
634 value_inside_range (tree val, value_range_t *vr)
636 tree cmp1, cmp2;
638 cmp1 = fold_binary_to_constant (GE_EXPR, boolean_type_node, val, vr->min);
639 if (!cmp1)
640 return -2;
642 cmp2 = fold_binary_to_constant (LE_EXPR, boolean_type_node, val, vr->max);
643 if (!cmp2)
644 return -2;
646 return cmp1 == boolean_true_node && cmp2 == boolean_true_node;
650 /* Return true if value ranges VR0 and VR1 have a non-empty
651 intersection. */
653 static inline bool
654 value_ranges_intersect_p (value_range_t *vr0, value_range_t *vr1)
656 return (value_inside_range (vr1->min, vr0) == 1
657 || value_inside_range (vr1->max, vr0) == 1
658 || value_inside_range (vr0->min, vr1) == 1
659 || value_inside_range (vr0->max, vr1) == 1);
663 /* Return true if VR includes the value zero, false otherwise. FIXME,
664 currently this will return false for an anti-range like ~[-4, 3].
665 This will be wrong when the semantics of value_inside_range are
666 modified (currently the users of this function expect these
667 semantics). */
669 static inline bool
670 range_includes_zero_p (value_range_t *vr)
672 tree zero;
674 gcc_assert (vr->type != VR_UNDEFINED
675 && vr->type != VR_VARYING
676 && !symbolic_range_p (vr));
678 zero = build_int_cst (TREE_TYPE (vr->min), 0);
679 return (value_inside_range (zero, vr) == 1);
682 /* Return true if T, an SSA_NAME, is known to be nonnegative. Return
683 false otherwise or if no value range information is available. */
685 bool
686 ssa_name_nonnegative_p (tree t)
688 value_range_t *vr = get_value_range (t);
690 if (!vr)
691 return false;
693 /* Testing for VR_ANTI_RANGE is not useful here as any anti-range
694 which would return a useful value should be encoded as a VR_RANGE. */
695 if (vr->type == VR_RANGE)
697 int result = compare_values (vr->min, integer_zero_node);
699 return (result == 0 || result == 1);
701 return false;
704 /* Return true if T, an SSA_NAME, is known to be nonzero. Return
705 false otherwise or if no value range information is available. */
707 bool
708 ssa_name_nonzero_p (tree t)
710 value_range_t *vr = get_value_range (t);
712 if (!vr)
713 return false;
715 /* A VR_RANGE which does not include zero is a nonzero value. */
716 if (vr->type == VR_RANGE && !symbolic_range_p (vr))
717 return ! range_includes_zero_p (vr);
719 /* A VR_ANTI_RANGE which does include zero is a nonzero value. */
720 if (vr->type == VR_ANTI_RANGE && !symbolic_range_p (vr))
721 return range_includes_zero_p (vr);
723 return false;
727 /* When extracting ranges from X_i = ASSERT_EXPR <Y_j, pred>, we will
728 initially consider X_i and Y_j equivalent, so the equivalence set
729 of Y_j is added to the equivalence set of X_i. However, it is
730 possible to have a chain of ASSERT_EXPRs whose predicates are
731 actually incompatible. This is usually the result of nesting of
732 contradictory if-then-else statements. For instance, in PR 24670:
734 count_4 has range [-INF, 63]
736 if (count_4 != 0)
738 count_19 = ASSERT_EXPR <count_4, count_4 != 0>
739 if (count_19 > 63)
741 count_18 = ASSERT_EXPR <count_19, count_19 > 63>
742 if (count_18 <= 63)
747 Notice that 'if (count_19 > 63)' is trivially false and will be
748 folded out at the end. However, during propagation, the flowgraph
749 is not cleaned up and so, VRP will evaluate predicates more
750 predicates than necessary, so it must support these
751 inconsistencies. The problem here is that because of the chaining
752 of ASSERT_EXPRs, the equivalency set for count_18 includes count_4.
753 Since count_4 has an incompatible range, we ICE when evaluating the
754 ranges in the equivalency set. So, we need to remove count_4 from
755 it. */
757 static void
758 fix_equivalence_set (value_range_t *vr_p)
760 bitmap_iterator bi;
761 unsigned i;
762 bitmap e = vr_p->equiv;
763 bitmap to_remove = BITMAP_ALLOC (NULL);
765 /* Only detect inconsistencies on numeric ranges. */
766 if (vr_p->type == VR_VARYING
767 || vr_p->type == VR_UNDEFINED
768 || symbolic_range_p (vr_p))
769 return;
771 EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
773 value_range_t *equiv_vr = vr_value[i];
775 if (equiv_vr->type == VR_VARYING
776 || equiv_vr->type == VR_UNDEFINED
777 || symbolic_range_p (equiv_vr))
778 continue;
780 if (equiv_vr->type == VR_RANGE
781 && vr_p->type == VR_RANGE
782 && !value_ranges_intersect_p (vr_p, equiv_vr))
783 bitmap_set_bit (to_remove, i);
784 else if ((equiv_vr->type == VR_RANGE && vr_p->type == VR_ANTI_RANGE)
785 || (equiv_vr->type == VR_ANTI_RANGE && vr_p->type == VR_RANGE))
787 /* A range and an anti-range have an empty intersection if
788 their end points are the same. FIXME,
789 value_ranges_intersect_p should handle this
790 automatically. */
791 if (compare_values (equiv_vr->min, vr_p->min) == 0
792 && compare_values (equiv_vr->max, vr_p->max) == 0)
793 bitmap_set_bit (to_remove, i);
797 bitmap_and_compl_into (vr_p->equiv, to_remove);
798 BITMAP_FREE (to_remove);
802 /* Extract value range information from an ASSERT_EXPR EXPR and store
803 it in *VR_P. */
805 static void
806 extract_range_from_assert (value_range_t *vr_p, tree expr)
808 tree var, cond, limit, min, max, type;
809 value_range_t *var_vr, *limit_vr;
810 enum tree_code cond_code;
812 var = ASSERT_EXPR_VAR (expr);
813 cond = ASSERT_EXPR_COND (expr);
815 gcc_assert (COMPARISON_CLASS_P (cond));
817 /* Find VAR in the ASSERT_EXPR conditional. */
818 if (var == TREE_OPERAND (cond, 0))
820 /* If the predicate is of the form VAR COMP LIMIT, then we just
821 take LIMIT from the RHS and use the same comparison code. */
822 limit = TREE_OPERAND (cond, 1);
823 cond_code = TREE_CODE (cond);
825 else
827 /* If the predicate is of the form LIMIT COMP VAR, then we need
828 to flip around the comparison code to create the proper range
829 for VAR. */
830 limit = TREE_OPERAND (cond, 0);
831 cond_code = swap_tree_comparison (TREE_CODE (cond));
834 type = TREE_TYPE (limit);
835 gcc_assert (limit != var);
837 /* For pointer arithmetic, we only keep track of pointer equality
838 and inequality. */
839 if (POINTER_TYPE_P (type) && cond_code != NE_EXPR && cond_code != EQ_EXPR)
841 set_value_range_to_varying (vr_p);
842 return;
845 /* If LIMIT is another SSA name and LIMIT has a range of its own,
846 try to use LIMIT's range to avoid creating symbolic ranges
847 unnecessarily. */
848 limit_vr = (TREE_CODE (limit) == SSA_NAME) ? get_value_range (limit) : NULL;
850 /* LIMIT's range is only interesting if it has any useful information. */
851 if (limit_vr
852 && (limit_vr->type == VR_UNDEFINED
853 || limit_vr->type == VR_VARYING
854 || symbolic_range_p (limit_vr)))
855 limit_vr = NULL;
857 /* Initially, the new range has the same set of equivalences of
858 VAR's range. This will be revised before returning the final
859 value. Since assertions may be chained via mutually exclusive
860 predicates, we will need to trim the set of equivalences before
861 we are done. */
862 gcc_assert (vr_p->equiv == NULL);
863 vr_p->equiv = BITMAP_ALLOC (NULL);
864 add_equivalence (vr_p->equiv, var);
866 /* Extract a new range based on the asserted comparison for VAR and
867 LIMIT's value range. Notice that if LIMIT has an anti-range, we
868 will only use it for equality comparisons (EQ_EXPR). For any
869 other kind of assertion, we cannot derive a range from LIMIT's
870 anti-range that can be used to describe the new range. For
871 instance, ASSERT_EXPR <x_2, x_2 <= b_4>. If b_4 is ~[2, 10],
872 then b_4 takes on the ranges [-INF, 1] and [11, +INF]. There is
873 no single range for x_2 that could describe LE_EXPR, so we might
874 as well build the range [b_4, +INF] for it. */
875 if (cond_code == EQ_EXPR)
877 enum value_range_type range_type;
879 if (limit_vr)
881 range_type = limit_vr->type;
882 min = limit_vr->min;
883 max = limit_vr->max;
885 else
887 range_type = VR_RANGE;
888 min = limit;
889 max = limit;
892 set_value_range (vr_p, range_type, min, max, vr_p->equiv);
894 /* When asserting the equality VAR == LIMIT and LIMIT is another
895 SSA name, the new range will also inherit the equivalence set
896 from LIMIT. */
897 if (TREE_CODE (limit) == SSA_NAME)
898 add_equivalence (vr_p->equiv, limit);
900 else if (cond_code == NE_EXPR)
902 /* As described above, when LIMIT's range is an anti-range and
903 this assertion is an inequality (NE_EXPR), then we cannot
904 derive anything from the anti-range. For instance, if
905 LIMIT's range was ~[0, 0], the assertion 'VAR != LIMIT' does
906 not imply that VAR's range is [0, 0]. So, in the case of
907 anti-ranges, we just assert the inequality using LIMIT and
908 not its anti-range.
910 If LIMIT_VR is a range, we can only use it to build a new
911 anti-range if LIMIT_VR is a single-valued range. For
912 instance, if LIMIT_VR is [0, 1], the predicate
913 VAR != [0, 1] does not mean that VAR's range is ~[0, 1].
914 Rather, it means that for value 0 VAR should be ~[0, 0]
915 and for value 1, VAR should be ~[1, 1]. We cannot
916 represent these ranges.
918 The only situation in which we can build a valid
919 anti-range is when LIMIT_VR is a single-valued range
920 (i.e., LIMIT_VR->MIN == LIMIT_VR->MAX). In that case,
921 build the anti-range ~[LIMIT_VR->MIN, LIMIT_VR->MAX]. */
922 if (limit_vr
923 && limit_vr->type == VR_RANGE
924 && compare_values (limit_vr->min, limit_vr->max) == 0)
926 min = limit_vr->min;
927 max = limit_vr->max;
929 else
931 /* In any other case, we cannot use LIMIT's range to build a
932 valid anti-range. */
933 min = max = limit;
936 /* If MIN and MAX cover the whole range for their type, then
937 just use the original LIMIT. */
938 if (INTEGRAL_TYPE_P (type)
939 && min == TYPE_MIN_VALUE (type)
940 && max == TYPE_MAX_VALUE (type))
941 min = max = limit;
943 set_value_range (vr_p, VR_ANTI_RANGE, min, max, vr_p->equiv);
945 else if (cond_code == LE_EXPR || cond_code == LT_EXPR)
947 min = TYPE_MIN_VALUE (type);
949 if (limit_vr == NULL || limit_vr->type == VR_ANTI_RANGE)
950 max = limit;
951 else
953 /* If LIMIT_VR is of the form [N1, N2], we need to build the
954 range [MIN, N2] for LE_EXPR and [MIN, N2 - 1] for
955 LT_EXPR. */
956 max = limit_vr->max;
959 /* If the maximum value forces us to be out of bounds, simply punt.
960 It would be pointless to try and do anything more since this
961 all should be optimized away above us. */
962 if (cond_code == LT_EXPR && compare_values (max, min) == 0)
963 set_value_range_to_varying (vr_p);
964 else
966 /* For LT_EXPR, we create the range [MIN, MAX - 1]. */
967 if (cond_code == LT_EXPR)
969 tree one = build_int_cst (type, 1);
970 max = fold_build2 (MINUS_EXPR, type, max, one);
973 set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
976 else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
978 max = TYPE_MAX_VALUE (type);
980 if (limit_vr == NULL || limit_vr->type == VR_ANTI_RANGE)
981 min = limit;
982 else
984 /* If LIMIT_VR is of the form [N1, N2], we need to build the
985 range [N1, MAX] for GE_EXPR and [N1 + 1, MAX] for
986 GT_EXPR. */
987 min = limit_vr->min;
990 /* If the minimum value forces us to be out of bounds, simply punt.
991 It would be pointless to try and do anything more since this
992 all should be optimized away above us. */
993 if (cond_code == GT_EXPR && compare_values (min, max) == 0)
994 set_value_range_to_varying (vr_p);
995 else
997 /* For GT_EXPR, we create the range [MIN + 1, MAX]. */
998 if (cond_code == GT_EXPR)
1000 tree one = build_int_cst (type, 1);
1001 min = fold_build2 (PLUS_EXPR, type, min, one);
1004 set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
1007 else
1008 gcc_unreachable ();
1010 /* If VAR already had a known range, it may happen that the new
1011 range we have computed and VAR's range are not compatible. For
1012 instance,
1014 if (p_5 == NULL)
1015 p_6 = ASSERT_EXPR <p_5, p_5 == NULL>;
1016 x_7 = p_6->fld;
1017 p_8 = ASSERT_EXPR <p_6, p_6 != NULL>;
1019 While the above comes from a faulty program, it will cause an ICE
1020 later because p_8 and p_6 will have incompatible ranges and at
1021 the same time will be considered equivalent. A similar situation
1022 would arise from
1024 if (i_5 > 10)
1025 i_6 = ASSERT_EXPR <i_5, i_5 > 10>;
1026 if (i_5 < 5)
1027 i_7 = ASSERT_EXPR <i_6, i_6 < 5>;
1029 Again i_6 and i_7 will have incompatible ranges. It would be
1030 pointless to try and do anything with i_7's range because
1031 anything dominated by 'if (i_5 < 5)' will be optimized away.
1032 Note, due to the wa in which simulation proceeds, the statement
1033 i_7 = ASSERT_EXPR <...> we would never be visited because the
1034 conditional 'if (i_5 < 5)' always evaluates to false. However,
1035 this extra check does not hurt and may protect against future
1036 changes to VRP that may get into a situation similar to the
1037 NULL pointer dereference example.
1039 Note that these compatibility tests are only needed when dealing
1040 with ranges or a mix of range and anti-range. If VAR_VR and VR_P
1041 are both anti-ranges, they will always be compatible, because two
1042 anti-ranges will always have a non-empty intersection. */
1044 var_vr = get_value_range (var);
1046 /* We may need to make adjustments when VR_P and VAR_VR are numeric
1047 ranges or anti-ranges. */
1048 if (vr_p->type == VR_VARYING
1049 || vr_p->type == VR_UNDEFINED
1050 || var_vr->type == VR_VARYING
1051 || var_vr->type == VR_UNDEFINED
1052 || symbolic_range_p (vr_p)
1053 || symbolic_range_p (var_vr))
1054 goto done;
1056 if (var_vr->type == VR_RANGE && vr_p->type == VR_RANGE)
1058 /* If the two ranges have a non-empty intersection, we can
1059 refine the resulting range. Since the assert expression
1060 creates an equivalency and at the same time it asserts a
1061 predicate, we can take the intersection of the two ranges to
1062 get better precision. */
1063 if (value_ranges_intersect_p (var_vr, vr_p))
1065 /* Use the larger of the two minimums. */
1066 if (compare_values (vr_p->min, var_vr->min) == -1)
1067 min = var_vr->min;
1068 else
1069 min = vr_p->min;
1071 /* Use the smaller of the two maximums. */
1072 if (compare_values (vr_p->max, var_vr->max) == 1)
1073 max = var_vr->max;
1074 else
1075 max = vr_p->max;
1077 set_value_range (vr_p, vr_p->type, min, max, vr_p->equiv);
1079 else
1081 /* The two ranges do not intersect, set the new range to
1082 VARYING, because we will not be able to do anything
1083 meaningful with it. */
1084 set_value_range_to_varying (vr_p);
1087 else if ((var_vr->type == VR_RANGE && vr_p->type == VR_ANTI_RANGE)
1088 || (var_vr->type == VR_ANTI_RANGE && vr_p->type == VR_RANGE))
1090 /* A range and an anti-range will cancel each other only if
1091 their ends are the same. For instance, in the example above,
1092 p_8's range ~[0, 0] and p_6's range [0, 0] are incompatible,
1093 so VR_P should be set to VR_VARYING. */
1094 if (compare_values (var_vr->min, vr_p->min) == 0
1095 && compare_values (var_vr->max, vr_p->max) == 0)
1096 set_value_range_to_varying (vr_p);
1097 else
1099 tree min, max, anti_min, anti_max, real_min, real_max;
1101 /* We want to compute the logical AND of the two ranges;
1102 there are three cases to consider.
1105 1. The VR_ANTI_RANGE range is completely within the
1106 VR_RANGE and the endpoints of the ranges are
1107 different. In that case the resulting range
1108 should be whichever range is more precise.
1109 Typically that will be the VR_RANGE.
1111 2. The VR_ANTI_RANGE is completely disjoint from
1112 the VR_RANGE. In this case the resulting range
1113 should be the VR_RANGE.
1115 3. There is some overlap between the VR_ANTI_RANGE
1116 and the VR_RANGE.
1118 3a. If the high limit of the VR_ANTI_RANGE resides
1119 within the VR_RANGE, then the result is a new
1120 VR_RANGE starting at the high limit of the
1121 the VR_ANTI_RANGE + 1 and extending to the
1122 high limit of the original VR_RANGE.
1124 3b. If the low limit of the VR_ANTI_RANGE resides
1125 within the VR_RANGE, then the result is a new
1126 VR_RANGE starting at the low limit of the original
1127 VR_RANGE and extending to the low limit of the
1128 VR_ANTI_RANGE - 1. */
1129 if (vr_p->type == VR_ANTI_RANGE)
1131 anti_min = vr_p->min;
1132 anti_max = vr_p->max;
1133 real_min = var_vr->min;
1134 real_max = var_vr->max;
1136 else
1138 anti_min = var_vr->min;
1139 anti_max = var_vr->max;
1140 real_min = vr_p->min;
1141 real_max = vr_p->max;
1145 /* Case 1, VR_ANTI_RANGE completely within VR_RANGE,
1146 not including any endpoints. */
1147 if (compare_values (anti_max, real_max) == -1
1148 && compare_values (anti_min, real_min) == 1)
1150 set_value_range (vr_p, VR_RANGE, real_min,
1151 real_max, vr_p->equiv);
1153 /* Case 2, VR_ANTI_RANGE completely disjoint from
1154 VR_RANGE. */
1155 else if (compare_values (anti_min, real_max) == 1
1156 || compare_values (anti_max, real_min) == -1)
1158 set_value_range (vr_p, VR_RANGE, real_min,
1159 real_max, vr_p->equiv);
1161 /* Case 3a, the anti-range extends into the low
1162 part of the real range. Thus creating a new
1163 low for the real range. */
1164 else if ((compare_values (anti_max, real_min) == 1
1165 || compare_values (anti_max, real_min) == 0)
1166 && compare_values (anti_max, real_max) == -1)
1168 min = fold_build2 (PLUS_EXPR, TREE_TYPE (var_vr->min),
1169 anti_max,
1170 build_int_cst (TREE_TYPE (var_vr->min), 1));
1171 max = real_max;
1172 set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
1174 /* Case 3b, the anti-range extends into the high
1175 part of the real range. Thus creating a new
1176 higher for the real range. */
1177 else if (compare_values (anti_min, real_min) == 1
1178 && (compare_values (anti_min, real_max) == -1
1179 || compare_values (anti_min, real_max) == 0))
1181 max = fold_build2 (MINUS_EXPR, TREE_TYPE (var_vr->min),
1182 anti_min,
1183 build_int_cst (TREE_TYPE (var_vr->min), 1));
1184 min = real_min;
1185 set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
1190 /* Remove names from the equivalence set that have ranges
1191 incompatible with VR_P. */
1192 done:
1193 fix_equivalence_set (vr_p);
1197 /* Extract range information from SSA name VAR and store it in VR. If
1198 VAR has an interesting range, use it. Otherwise, create the
1199 range [VAR, VAR] and return it. This is useful in situations where
1200 we may have conditionals testing values of VARYING names. For
1201 instance,
1203 x_3 = y_5;
1204 if (x_3 > y_5)
1207 Even if y_5 is deemed VARYING, we can determine that x_3 > y_5 is
1208 always false. */
1210 static void
1211 extract_range_from_ssa_name (value_range_t *vr, tree var)
1213 value_range_t *var_vr = get_value_range (var);
1215 if (var_vr->type != VR_UNDEFINED && var_vr->type != VR_VARYING)
1216 copy_value_range (vr, var_vr);
1217 else
1218 set_value_range (vr, VR_RANGE, var, var, NULL);
1220 add_equivalence (vr->equiv, var);
1224 /* Wrapper around int_const_binop. If the operation overflows and we
1225 are not using wrapping arithmetic, then adjust the result to be
1226 -INF or +INF depending on CODE, VAL1 and VAL2. */
1228 static inline tree
1229 vrp_int_const_binop (enum tree_code code, tree val1, tree val2)
1231 tree res;
1233 if (flag_wrapv)
1234 return int_const_binop (code, val1, val2, 0);
1236 /* If we are not using wrapping arithmetic, operate symbolically
1237 on -INF and +INF. */
1238 res = int_const_binop (code, val1, val2, 0);
1240 if (TYPE_UNSIGNED (TREE_TYPE (val1)))
1242 int checkz = compare_values (res, val1);
1243 bool overflow = false;
1245 /* Ensure that res = val1 [+*] val2 >= val1
1246 or that res = val1 - val2 <= val1. */
1247 if ((code == PLUS_EXPR
1248 && !(checkz == 1 || checkz == 0))
1249 || (code == MINUS_EXPR
1250 && !(checkz == 0 || checkz == -1)))
1252 overflow = true;
1254 /* Checking for multiplication overflow is done by dividing the
1255 output of the multiplication by the first input of the
1256 multiplication. If the result of that division operation is
1257 not equal to the second input of the multiplication, then the
1258 multiplication overflowed. */
1259 else if (code == MULT_EXPR && !integer_zerop (val1))
1261 tree tmp = int_const_binop (TRUNC_DIV_EXPR,
1262 TYPE_MAX_VALUE (TREE_TYPE (val1)),
1263 val1, 0);
1264 int check = compare_values (tmp, val2);
1266 if (check != 0)
1267 overflow = true;
1270 if (overflow)
1272 res = copy_node (res);
1273 TREE_OVERFLOW (res) = 1;
1277 else if (TREE_OVERFLOW (res)
1278 && !TREE_OVERFLOW (val1)
1279 && !TREE_OVERFLOW (val2))
1281 /* If the operation overflowed but neither VAL1 nor VAL2 are
1282 overflown, return -INF or +INF depending on the operation
1283 and the combination of signs of the operands. */
1284 int sgn1 = tree_int_cst_sgn (val1);
1285 int sgn2 = tree_int_cst_sgn (val2);
1287 /* Notice that we only need to handle the restricted set of
1288 operations handled by extract_range_from_binary_expr.
1289 Among them, only multiplication, addition and subtraction
1290 can yield overflow without overflown operands because we
1291 are working with integral types only... except in the
1292 case VAL1 = -INF and VAL2 = -1 which overflows to +INF
1293 for division too. */
1295 /* For multiplication, the sign of the overflow is given
1296 by the comparison of the signs of the operands. */
1297 if ((code == MULT_EXPR && sgn1 == sgn2)
1298 /* For addition, the operands must be of the same sign
1299 to yield an overflow. Its sign is therefore that
1300 of one of the operands, for example the first. */
1301 || (code == PLUS_EXPR && sgn1 > 0)
1302 /* For subtraction, the operands must be of different
1303 signs to yield an overflow. Its sign is therefore
1304 that of the first operand or the opposite of that
1305 of the second operand. A first operand of 0 counts
1306 as positive here, for the corner case 0 - (-INF),
1307 which overflows, but must yield +INF. */
1308 || (code == MINUS_EXPR && sgn1 >= 0)
1309 /* For division, the only case is -INF / -1 = +INF. */
1310 || code == TRUNC_DIV_EXPR
1311 || code == FLOOR_DIV_EXPR
1312 || code == CEIL_DIV_EXPR
1313 || code == EXACT_DIV_EXPR
1314 || code == ROUND_DIV_EXPR)
1315 return TYPE_MAX_VALUE (TREE_TYPE (res));
1316 else
1317 return TYPE_MIN_VALUE (TREE_TYPE (res));
1320 return res;
1324 /* Extract range information from a binary expression EXPR based on
1325 the ranges of each of its operands and the expression code. */
1327 static void
1328 extract_range_from_binary_expr (value_range_t *vr, tree expr)
1330 enum tree_code code = TREE_CODE (expr);
1331 enum value_range_type type;
1332 tree op0, op1, min, max;
1333 int cmp;
1334 value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
1335 value_range_t vr1 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
1337 /* Not all binary expressions can be applied to ranges in a
1338 meaningful way. Handle only arithmetic operations. */
1339 if (code != PLUS_EXPR
1340 && code != MINUS_EXPR
1341 && code != MULT_EXPR
1342 && code != TRUNC_DIV_EXPR
1343 && code != FLOOR_DIV_EXPR
1344 && code != CEIL_DIV_EXPR
1345 && code != EXACT_DIV_EXPR
1346 && code != ROUND_DIV_EXPR
1347 && code != MIN_EXPR
1348 && code != MAX_EXPR
1349 && code != BIT_AND_EXPR
1350 && code != TRUTH_ANDIF_EXPR
1351 && code != TRUTH_ORIF_EXPR
1352 && code != TRUTH_AND_EXPR
1353 && code != TRUTH_OR_EXPR)
1355 set_value_range_to_varying (vr);
1356 return;
1359 /* Get value ranges for each operand. For constant operands, create
1360 a new value range with the operand to simplify processing. */
1361 op0 = TREE_OPERAND (expr, 0);
1362 if (TREE_CODE (op0) == SSA_NAME)
1363 vr0 = *(get_value_range (op0));
1364 else if (is_gimple_min_invariant (op0))
1365 set_value_range (&vr0, VR_RANGE, op0, op0, NULL);
1366 else
1367 set_value_range_to_varying (&vr0);
1369 op1 = TREE_OPERAND (expr, 1);
1370 if (TREE_CODE (op1) == SSA_NAME)
1371 vr1 = *(get_value_range (op1));
1372 else if (is_gimple_min_invariant (op1))
1373 set_value_range (&vr1, VR_RANGE, op1, op1, NULL);
1374 else
1375 set_value_range_to_varying (&vr1);
1377 /* If either range is UNDEFINED, so is the result. */
1378 if (vr0.type == VR_UNDEFINED || vr1.type == VR_UNDEFINED)
1380 set_value_range_to_undefined (vr);
1381 return;
1384 /* The type of the resulting value range defaults to VR0.TYPE. */
1385 type = vr0.type;
1387 /* Refuse to operate on VARYING ranges, ranges of different kinds
1388 and symbolic ranges. As an exception, we allow BIT_AND_EXPR
1389 because we may be able to derive a useful range even if one of
1390 the operands is VR_VARYING or symbolic range. TODO, we may be
1391 able to derive anti-ranges in some cases. */
1392 if (code != BIT_AND_EXPR
1393 && code != TRUTH_AND_EXPR
1394 && code != TRUTH_OR_EXPR
1395 && (vr0.type == VR_VARYING
1396 || vr1.type == VR_VARYING
1397 || vr0.type != vr1.type
1398 || symbolic_range_p (&vr0)
1399 || symbolic_range_p (&vr1)))
1401 set_value_range_to_varying (vr);
1402 return;
1405 /* Now evaluate the expression to determine the new range. */
1406 if (POINTER_TYPE_P (TREE_TYPE (expr))
1407 || POINTER_TYPE_P (TREE_TYPE (op0))
1408 || POINTER_TYPE_P (TREE_TYPE (op1)))
1410 /* For pointer types, we are really only interested in asserting
1411 whether the expression evaluates to non-NULL. FIXME, we used
1412 to gcc_assert (code == PLUS_EXPR || code == MINUS_EXPR), but
1413 ivopts is generating expressions with pointer multiplication
1414 in them. */
1415 if (code == PLUS_EXPR)
1417 if (range_is_nonnull (&vr0) || range_is_nonnull (&vr1))
1418 set_value_range_to_nonnull (vr, TREE_TYPE (expr));
1419 else if (range_is_null (&vr0) && range_is_null (&vr1))
1420 set_value_range_to_null (vr, TREE_TYPE (expr));
1421 else
1422 set_value_range_to_varying (vr);
1424 else
1426 /* Subtracting from a pointer, may yield 0, so just drop the
1427 resulting range to varying. */
1428 set_value_range_to_varying (vr);
1431 return;
1434 /* For integer ranges, apply the operation to each end of the
1435 range and see what we end up with. */
1436 if (code == TRUTH_ANDIF_EXPR
1437 || code == TRUTH_ORIF_EXPR
1438 || code == TRUTH_AND_EXPR
1439 || code == TRUTH_OR_EXPR)
1441 /* If one of the operands is zero, we know that the whole
1442 expression evaluates zero. */
1443 if (code == TRUTH_AND_EXPR
1444 && ((vr0.type == VR_RANGE
1445 && integer_zerop (vr0.min)
1446 && integer_zerop (vr0.max))
1447 || (vr1.type == VR_RANGE
1448 && integer_zerop (vr1.min)
1449 && integer_zerop (vr1.max))))
1451 type = VR_RANGE;
1452 min = max = build_int_cst (TREE_TYPE (expr), 0);
1454 /* If one of the operands is one, we know that the whole
1455 expression evaluates one. */
1456 else if (code == TRUTH_OR_EXPR
1457 && ((vr0.type == VR_RANGE
1458 && integer_onep (vr0.min)
1459 && integer_onep (vr0.max))
1460 || (vr1.type == VR_RANGE
1461 && integer_onep (vr1.min)
1462 && integer_onep (vr1.max))))
1464 type = VR_RANGE;
1465 min = max = build_int_cst (TREE_TYPE (expr), 1);
1467 else if (vr0.type != VR_VARYING
1468 && vr1.type != VR_VARYING
1469 && vr0.type == vr1.type
1470 && !symbolic_range_p (&vr0)
1471 && !symbolic_range_p (&vr1))
1473 /* Boolean expressions cannot be folded with int_const_binop. */
1474 min = fold_binary (code, TREE_TYPE (expr), vr0.min, vr1.min);
1475 max = fold_binary (code, TREE_TYPE (expr), vr0.max, vr1.max);
1477 else
1479 set_value_range_to_varying (vr);
1480 return;
1483 else if (code == PLUS_EXPR
1484 || code == MIN_EXPR
1485 || code == MAX_EXPR)
1487 /* If we have a PLUS_EXPR with two VR_ANTI_RANGEs, drop to
1488 VR_VARYING. It would take more effort to compute a precise
1489 range for such a case. For example, if we have op0 == 1 and
1490 op1 == -1 with their ranges both being ~[0,0], we would have
1491 op0 + op1 == 0, so we cannot claim that the sum is in ~[0,0].
1492 Note that we are guaranteed to have vr0.type == vr1.type at
1493 this point. */
1494 if (code == PLUS_EXPR && vr0.type == VR_ANTI_RANGE)
1496 set_value_range_to_varying (vr);
1497 return;
1500 /* For operations that make the resulting range directly
1501 proportional to the original ranges, apply the operation to
1502 the same end of each range. */
1503 min = vrp_int_const_binop (code, vr0.min, vr1.min);
1504 max = vrp_int_const_binop (code, vr0.max, vr1.max);
1506 else if (code == MULT_EXPR
1507 || code == TRUNC_DIV_EXPR
1508 || code == FLOOR_DIV_EXPR
1509 || code == CEIL_DIV_EXPR
1510 || code == EXACT_DIV_EXPR
1511 || code == ROUND_DIV_EXPR)
1513 tree val[4];
1514 size_t i;
1516 /* If we have an unsigned MULT_EXPR with two VR_ANTI_RANGEs,
1517 drop to VR_VARYING. It would take more effort to compute a
1518 precise range for such a case. For example, if we have
1519 op0 == 65536 and op1 == 65536 with their ranges both being
1520 ~[0,0] on a 32-bit machine, we would have op0 * op1 == 0, so
1521 we cannot claim that the product is in ~[0,0]. Note that we
1522 are guaranteed to have vr0.type == vr1.type at this
1523 point. */
1524 if (code == MULT_EXPR
1525 && vr0.type == VR_ANTI_RANGE
1526 && (flag_wrapv || TYPE_UNSIGNED (TREE_TYPE (op0))))
1528 set_value_range_to_varying (vr);
1529 return;
1532 /* Multiplications and divisions are a bit tricky to handle,
1533 depending on the mix of signs we have in the two ranges, we
1534 need to operate on different values to get the minimum and
1535 maximum values for the new range. One approach is to figure
1536 out all the variations of range combinations and do the
1537 operations.
1539 However, this involves several calls to compare_values and it
1540 is pretty convoluted. It's simpler to do the 4 operations
1541 (MIN0 OP MIN1, MIN0 OP MAX1, MAX0 OP MIN1 and MAX0 OP MAX0 OP
1542 MAX1) and then figure the smallest and largest values to form
1543 the new range. */
1545 /* Divisions by zero result in a VARYING value. */
1546 if (code != MULT_EXPR
1547 && (vr0.type == VR_ANTI_RANGE || range_includes_zero_p (&vr1)))
1549 set_value_range_to_varying (vr);
1550 return;
1553 /* Compute the 4 cross operations. */
1554 val[0] = vrp_int_const_binop (code, vr0.min, vr1.min);
1556 val[1] = (vr1.max != vr1.min)
1557 ? vrp_int_const_binop (code, vr0.min, vr1.max)
1558 : NULL_TREE;
1560 val[2] = (vr0.max != vr0.min)
1561 ? vrp_int_const_binop (code, vr0.max, vr1.min)
1562 : NULL_TREE;
1564 val[3] = (vr0.min != vr0.max && vr1.min != vr1.max)
1565 ? vrp_int_const_binop (code, vr0.max, vr1.max)
1566 : NULL_TREE;
1568 /* Set MIN to the minimum of VAL[i] and MAX to the maximum
1569 of VAL[i]. */
1570 min = val[0];
1571 max = val[0];
1572 for (i = 1; i < 4; i++)
1574 if (!is_gimple_min_invariant (min) || TREE_OVERFLOW (min)
1575 || !is_gimple_min_invariant (max) || TREE_OVERFLOW (max))
1576 break;
1578 if (val[i])
1580 if (!is_gimple_min_invariant (val[i]) || TREE_OVERFLOW (val[i]))
1582 /* If we found an overflowed value, set MIN and MAX
1583 to it so that we set the resulting range to
1584 VARYING. */
1585 min = max = val[i];
1586 break;
1589 if (compare_values (val[i], min) == -1)
1590 min = val[i];
1592 if (compare_values (val[i], max) == 1)
1593 max = val[i];
1597 else if (code == MINUS_EXPR)
1599 /* If we have a MINUS_EXPR with two VR_ANTI_RANGEs, drop to
1600 VR_VARYING. It would take more effort to compute a precise
1601 range for such a case. For example, if we have op0 == 1 and
1602 op1 == 1 with their ranges both being ~[0,0], we would have
1603 op0 - op1 == 0, so we cannot claim that the difference is in
1604 ~[0,0]. Note that we are guaranteed to have
1605 vr0.type == vr1.type at this point. */
1606 if (vr0.type == VR_ANTI_RANGE)
1608 set_value_range_to_varying (vr);
1609 return;
1612 /* For MINUS_EXPR, apply the operation to the opposite ends of
1613 each range. */
1614 min = vrp_int_const_binop (code, vr0.min, vr1.max);
1615 max = vrp_int_const_binop (code, vr0.max, vr1.min);
1617 else if (code == BIT_AND_EXPR)
1619 if (vr0.type == VR_RANGE
1620 && vr0.min == vr0.max
1621 && tree_expr_nonnegative_p (vr0.max)
1622 && TREE_CODE (vr0.max) == INTEGER_CST)
1624 min = build_int_cst (TREE_TYPE (expr), 0);
1625 max = vr0.max;
1627 else if (vr1.type == VR_RANGE
1628 && vr1.min == vr1.max
1629 && tree_expr_nonnegative_p (vr1.max)
1630 && TREE_CODE (vr1.max) == INTEGER_CST)
1632 type = VR_RANGE;
1633 min = build_int_cst (TREE_TYPE (expr), 0);
1634 max = vr1.max;
1636 else
1638 set_value_range_to_varying (vr);
1639 return;
1642 else
1643 gcc_unreachable ();
1645 /* If either MIN or MAX overflowed, then set the resulting range to
1646 VARYING. */
1647 if (!is_gimple_min_invariant (min) || TREE_OVERFLOW (min)
1648 || !is_gimple_min_invariant (max) || TREE_OVERFLOW (max))
1650 set_value_range_to_varying (vr);
1651 return;
1654 cmp = compare_values (min, max);
1655 if (cmp == -2 || cmp == 1)
1657 /* If the new range has its limits swapped around (MIN > MAX),
1658 then the operation caused one of them to wrap around, mark
1659 the new range VARYING. */
1660 set_value_range_to_varying (vr);
1662 else
1663 set_value_range (vr, type, min, max, NULL);
1667 /* Extract range information from a unary expression EXPR based on
1668 the range of its operand and the expression code. */
1670 static void
1671 extract_range_from_unary_expr (value_range_t *vr, tree expr)
1673 enum tree_code code = TREE_CODE (expr);
1674 tree min, max, op0;
1675 int cmp;
1676 value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
1678 /* Refuse to operate on certain unary expressions for which we
1679 cannot easily determine a resulting range. */
1680 if (code == FIX_TRUNC_EXPR
1681 || code == FIX_CEIL_EXPR
1682 || code == FIX_FLOOR_EXPR
1683 || code == FIX_ROUND_EXPR
1684 || code == FLOAT_EXPR
1685 || code == BIT_NOT_EXPR
1686 || code == NON_LVALUE_EXPR
1687 || code == CONJ_EXPR)
1689 set_value_range_to_varying (vr);
1690 return;
1693 /* Get value ranges for the operand. For constant operands, create
1694 a new value range with the operand to simplify processing. */
1695 op0 = TREE_OPERAND (expr, 0);
1696 if (TREE_CODE (op0) == SSA_NAME)
1697 vr0 = *(get_value_range (op0));
1698 else if (is_gimple_min_invariant (op0))
1699 set_value_range (&vr0, VR_RANGE, op0, op0, NULL);
1700 else
1701 set_value_range_to_varying (&vr0);
1703 /* If VR0 is UNDEFINED, so is the result. */
1704 if (vr0.type == VR_UNDEFINED)
1706 set_value_range_to_undefined (vr);
1707 return;
1710 /* Refuse to operate on symbolic ranges, or if neither operand is
1711 a pointer or integral type. */
1712 if ((!INTEGRAL_TYPE_P (TREE_TYPE (op0))
1713 && !POINTER_TYPE_P (TREE_TYPE (op0)))
1714 || (vr0.type != VR_VARYING
1715 && symbolic_range_p (&vr0)))
1717 set_value_range_to_varying (vr);
1718 return;
1721 /* If the expression involves pointers, we are only interested in
1722 determining if it evaluates to NULL [0, 0] or non-NULL (~[0, 0]). */
1723 if (POINTER_TYPE_P (TREE_TYPE (expr)) || POINTER_TYPE_P (TREE_TYPE (op0)))
1725 if (range_is_nonnull (&vr0) || tree_expr_nonzero_p (expr))
1726 set_value_range_to_nonnull (vr, TREE_TYPE (expr));
1727 else if (range_is_null (&vr0))
1728 set_value_range_to_null (vr, TREE_TYPE (expr));
1729 else
1730 set_value_range_to_varying (vr);
1732 return;
1735 /* Handle unary expressions on integer ranges. */
1736 if (code == NOP_EXPR || code == CONVERT_EXPR)
1738 tree inner_type = TREE_TYPE (op0);
1739 tree outer_type = TREE_TYPE (expr);
1741 /* If VR0 represents a simple range, then try to convert
1742 the min and max values for the range to the same type
1743 as OUTER_TYPE. If the results compare equal to VR0's
1744 min and max values and the new min is still less than
1745 or equal to the new max, then we can safely use the newly
1746 computed range for EXPR. This allows us to compute
1747 accurate ranges through many casts. */
1748 if (vr0.type == VR_RANGE
1749 || (vr0.type == VR_VARYING
1750 && TYPE_PRECISION (outer_type) > TYPE_PRECISION (inner_type)))
1752 tree new_min, new_max, orig_min, orig_max;
1754 /* Convert the input operand min/max to OUTER_TYPE. If
1755 the input has no range information, then use the min/max
1756 for the input's type. */
1757 if (vr0.type == VR_RANGE)
1759 orig_min = vr0.min;
1760 orig_max = vr0.max;
1762 else
1764 orig_min = TYPE_MIN_VALUE (inner_type);
1765 orig_max = TYPE_MAX_VALUE (inner_type);
1768 new_min = fold_convert (outer_type, orig_min);
1769 new_max = fold_convert (outer_type, orig_max);
1771 /* Verify the new min/max values are gimple values and
1772 that they compare equal to the original input's
1773 min/max values. */
1774 if (is_gimple_val (new_min)
1775 && is_gimple_val (new_max)
1776 && tree_int_cst_equal (new_min, orig_min)
1777 && tree_int_cst_equal (new_max, orig_max)
1778 && compare_values (new_min, new_max) <= 0
1779 && compare_values (new_min, new_max) >= -1)
1781 set_value_range (vr, VR_RANGE, new_min, new_max, vr->equiv);
1782 return;
1786 /* When converting types of different sizes, set the result to
1787 VARYING. Things like sign extensions and precision loss may
1788 change the range. For instance, if x_3 is of type 'long long
1789 int' and 'y_5 = (unsigned short) x_3', if x_3 is ~[0, 0], it
1790 is impossible to know at compile time whether y_5 will be
1791 ~[0, 0]. */
1792 if (TYPE_SIZE (inner_type) != TYPE_SIZE (outer_type)
1793 || TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
1795 set_value_range_to_varying (vr);
1796 return;
1800 /* Conversion of a VR_VARYING value to a wider type can result
1801 in a usable range. So wait until after we've handled conversions
1802 before dropping the result to VR_VARYING if we had a source
1803 operand that is VR_VARYING. */
1804 if (vr0.type == VR_VARYING)
1806 set_value_range_to_varying (vr);
1807 return;
1810 /* Apply the operation to each end of the range and see what we end
1811 up with. */
1812 if (code == NEGATE_EXPR
1813 && !TYPE_UNSIGNED (TREE_TYPE (expr)))
1815 /* NEGATE_EXPR flips the range around. We need to treat
1816 TYPE_MIN_VALUE specially dependent on wrapping, range type
1817 and if it was used as minimum or maximum value:
1818 -~[MIN, MIN] == ~[MIN, MIN]
1819 -[MIN, 0] == [0, MAX] for -fno-wrapv
1820 -[MIN, 0] == [0, MIN] for -fwrapv (will be set to varying later) */
1821 min = vr0.max == TYPE_MIN_VALUE (TREE_TYPE (expr))
1822 ? TYPE_MIN_VALUE (TREE_TYPE (expr))
1823 : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
1825 max = vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr))
1826 ? (vr0.type == VR_ANTI_RANGE || flag_wrapv
1827 ? TYPE_MIN_VALUE (TREE_TYPE (expr))
1828 : TYPE_MAX_VALUE (TREE_TYPE (expr)))
1829 : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
1832 else if (code == NEGATE_EXPR
1833 && TYPE_UNSIGNED (TREE_TYPE (expr)))
1835 if (!range_includes_zero_p (&vr0))
1837 max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
1838 min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
1840 else
1842 if (range_is_null (&vr0))
1843 set_value_range_to_null (vr, TREE_TYPE (expr));
1844 else
1845 set_value_range_to_varying (vr);
1846 return;
1849 else if (code == ABS_EXPR
1850 && !TYPE_UNSIGNED (TREE_TYPE (expr)))
1852 /* -TYPE_MIN_VALUE = TYPE_MIN_VALUE with flag_wrapv so we can't get a
1853 useful range. */
1854 if (flag_wrapv
1855 && ((vr0.type == VR_RANGE
1856 && vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)))
1857 || (vr0.type == VR_ANTI_RANGE
1858 && vr0.min != TYPE_MIN_VALUE (TREE_TYPE (expr))
1859 && !range_includes_zero_p (&vr0))))
1861 set_value_range_to_varying (vr);
1862 return;
1865 /* ABS_EXPR may flip the range around, if the original range
1866 included negative values. */
1867 min = (vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)))
1868 ? TYPE_MAX_VALUE (TREE_TYPE (expr))
1869 : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
1871 max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
1873 cmp = compare_values (min, max);
1875 /* If a VR_ANTI_RANGEs contains zero, then we have
1876 ~[-INF, min(MIN, MAX)]. */
1877 if (vr0.type == VR_ANTI_RANGE)
1879 if (range_includes_zero_p (&vr0))
1881 tree type_min_value = TYPE_MIN_VALUE (TREE_TYPE (expr));
1883 /* Take the lower of the two values. */
1884 if (cmp != 1)
1885 max = min;
1887 /* Create ~[-INF, min (abs(MIN), abs(MAX))]
1888 or ~[-INF + 1, min (abs(MIN), abs(MAX))] when
1889 flag_wrapv is set and the original anti-range doesn't include
1890 TYPE_MIN_VALUE, remember -TYPE_MIN_VALUE = TYPE_MIN_VALUE. */
1891 min = (flag_wrapv && vr0.min != type_min_value
1892 ? int_const_binop (PLUS_EXPR,
1893 type_min_value,
1894 integer_one_node, 0)
1895 : type_min_value);
1897 else
1899 /* All else has failed, so create the range [0, INF], even for
1900 flag_wrapv since TYPE_MIN_VALUE is in the original
1901 anti-range. */
1902 vr0.type = VR_RANGE;
1903 min = build_int_cst (TREE_TYPE (expr), 0);
1904 max = TYPE_MAX_VALUE (TREE_TYPE (expr));
1908 /* If the range contains zero then we know that the minimum value in the
1909 range will be zero. */
1910 else if (range_includes_zero_p (&vr0))
1912 if (cmp == 1)
1913 max = min;
1914 min = build_int_cst (TREE_TYPE (expr), 0);
1916 else
1918 /* If the range was reversed, swap MIN and MAX. */
1919 if (cmp == 1)
1921 tree t = min;
1922 min = max;
1923 max = t;
1927 else
1929 /* Otherwise, operate on each end of the range. */
1930 min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
1931 max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
1934 cmp = compare_values (min, max);
1935 if (cmp == -2 || cmp == 1)
1937 /* If the new range has its limits swapped around (MIN > MAX),
1938 then the operation caused one of them to wrap around, mark
1939 the new range VARYING. */
1940 set_value_range_to_varying (vr);
1942 else
1943 set_value_range (vr, vr0.type, min, max, NULL);
1947 /* Extract range information from a comparison expression EXPR based
1948 on the range of its operand and the expression code. */
1950 static void
1951 extract_range_from_comparison (value_range_t *vr, tree expr)
1953 tree val = vrp_evaluate_conditional (expr, false);
1954 if (val)
1956 /* Since this expression was found on the RHS of an assignment,
1957 its type may be different from _Bool. Convert VAL to EXPR's
1958 type. */
1959 val = fold_convert (TREE_TYPE (expr), val);
1960 set_value_range (vr, VR_RANGE, val, val, vr->equiv);
1962 else
1963 set_value_range_to_varying (vr);
1967 /* Try to compute a useful range out of expression EXPR and store it
1968 in *VR. */
1970 static void
1971 extract_range_from_expr (value_range_t *vr, tree expr)
1973 enum tree_code code = TREE_CODE (expr);
1975 if (code == ASSERT_EXPR)
1976 extract_range_from_assert (vr, expr);
1977 else if (code == SSA_NAME)
1978 extract_range_from_ssa_name (vr, expr);
1979 else if (TREE_CODE_CLASS (code) == tcc_binary
1980 || code == TRUTH_ANDIF_EXPR
1981 || code == TRUTH_ORIF_EXPR
1982 || code == TRUTH_AND_EXPR
1983 || code == TRUTH_OR_EXPR
1984 || code == TRUTH_XOR_EXPR)
1985 extract_range_from_binary_expr (vr, expr);
1986 else if (TREE_CODE_CLASS (code) == tcc_unary)
1987 extract_range_from_unary_expr (vr, expr);
1988 else if (TREE_CODE_CLASS (code) == tcc_comparison)
1989 extract_range_from_comparison (vr, expr);
1990 else if (is_gimple_min_invariant (expr))
1991 set_value_range (vr, VR_RANGE, expr, expr, NULL);
1992 else
1993 set_value_range_to_varying (vr);
1995 /* If we got a varying range from the tests above, try a final
1996 time to derive a nonnegative or nonzero range. This time
1997 relying primarily on generic routines in fold in conjunction
1998 with range data. */
1999 if (vr->type == VR_VARYING)
2001 if (INTEGRAL_TYPE_P (TREE_TYPE (expr))
2002 && vrp_expr_computes_nonnegative (expr))
2003 set_value_range_to_nonnegative (vr, TREE_TYPE (expr));
2004 else if (vrp_expr_computes_nonzero (expr))
2005 set_value_range_to_nonnull (vr, TREE_TYPE (expr));
2009 /* Given a range VR, a LOOP and a variable VAR, determine whether it
2010 would be profitable to adjust VR using scalar evolution information
2011 for VAR. If so, update VR with the new limits. */
2013 static void
2014 adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt,
2015 tree var)
2017 tree init, step, chrec;
2018 enum ev_direction dir;
2020 /* TODO. Don't adjust anti-ranges. An anti-range may provide
2021 better opportunities than a regular range, but I'm not sure. */
2022 if (vr->type == VR_ANTI_RANGE)
2023 return;
2025 chrec = instantiate_parameters (loop, analyze_scalar_evolution (loop, var));
2026 if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
2027 return;
2029 init = initial_condition_in_loop_num (chrec, loop->num);
2030 step = evolution_part_in_loop_num (chrec, loop->num);
2032 /* If STEP is symbolic, we can't know whether INIT will be the
2033 minimum or maximum value in the range. Also, unless INIT is
2034 a simple expression, compare_values and possibly other functions
2035 in tree-vrp won't be able to handle it. */
2036 if (step == NULL_TREE
2037 || !is_gimple_min_invariant (step)
2038 || !valid_value_p (init))
2039 return;
2041 dir = scev_direction (chrec);
2042 if (/* Do not adjust ranges if we do not know whether the iv increases
2043 or decreases, ... */
2044 dir == EV_DIR_UNKNOWN
2045 /* ... or if it may wrap. */
2046 || scev_probably_wraps_p (init, step, stmt,
2047 current_loops->parray[CHREC_VARIABLE (chrec)],
2048 true))
2049 return;
2051 if (!POINTER_TYPE_P (TREE_TYPE (init))
2052 && (vr->type == VR_VARYING || vr->type == VR_UNDEFINED))
2054 /* For VARYING or UNDEFINED ranges, just about anything we get
2055 from scalar evolutions should be better. */
2056 tree min = TYPE_MIN_VALUE (TREE_TYPE (init));
2057 tree max = TYPE_MAX_VALUE (TREE_TYPE (init));
2059 if (dir == EV_DIR_DECREASES)
2060 max = init;
2061 else
2062 min = init;
2064 /* If we would create an invalid range, then just assume we
2065 know absolutely nothing. This may be over-conservative,
2066 but it's clearly safe. */
2067 if (compare_values (min, max) == 1)
2068 return;
2070 set_value_range (vr, VR_RANGE, min, max, vr->equiv);
2072 else if (vr->type == VR_RANGE)
2074 tree min = vr->min;
2075 tree max = vr->max;
2077 if (dir == EV_DIR_DECREASES)
2079 /* INIT is the maximum value. If INIT is lower than VR->MAX
2080 but no smaller than VR->MIN, set VR->MAX to INIT. */
2081 if (compare_values (init, max) == -1)
2083 max = init;
2085 /* If we just created an invalid range with the minimum
2086 greater than the maximum, take the minimum all the
2087 way to -INF. */
2088 if (compare_values (min, max) == 1)
2089 min = TYPE_MIN_VALUE (TREE_TYPE (min));
2092 else
2094 /* If INIT is bigger than VR->MIN, set VR->MIN to INIT. */
2095 if (compare_values (init, min) == 1)
2097 min = init;
2099 /* If we just created an invalid range with the minimum
2100 greater than the maximum, take the maximum all the
2101 way to +INF. */
2102 if (compare_values (min, max) == 1)
2103 max = TYPE_MAX_VALUE (TREE_TYPE (max));
2107 set_value_range (vr, VR_RANGE, min, max, vr->equiv);
2112 /* Given two numeric value ranges VR0, VR1 and a comparison code COMP:
2114 - Return BOOLEAN_TRUE_NODE if VR0 COMP VR1 always returns true for
2115 all the values in the ranges.
2117 - Return BOOLEAN_FALSE_NODE if the comparison always returns false.
2119 - Return NULL_TREE if it is not always possible to determine the
2120 value of the comparison. */
2123 static tree
2124 compare_ranges (enum tree_code comp, value_range_t *vr0, value_range_t *vr1)
2126 /* VARYING or UNDEFINED ranges cannot be compared. */
2127 if (vr0->type == VR_VARYING
2128 || vr0->type == VR_UNDEFINED
2129 || vr1->type == VR_VARYING
2130 || vr1->type == VR_UNDEFINED)
2131 return NULL_TREE;
2133 /* Anti-ranges need to be handled separately. */
2134 if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
2136 /* If both are anti-ranges, then we cannot compute any
2137 comparison. */
2138 if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
2139 return NULL_TREE;
2141 /* These comparisons are never statically computable. */
2142 if (comp == GT_EXPR
2143 || comp == GE_EXPR
2144 || comp == LT_EXPR
2145 || comp == LE_EXPR)
2146 return NULL_TREE;
2148 /* Equality can be computed only between a range and an
2149 anti-range. ~[VAL1, VAL2] == [VAL1, VAL2] is always false. */
2150 if (vr0->type == VR_RANGE)
2152 /* To simplify processing, make VR0 the anti-range. */
2153 value_range_t *tmp = vr0;
2154 vr0 = vr1;
2155 vr1 = tmp;
2158 gcc_assert (comp == NE_EXPR || comp == EQ_EXPR);
2160 if (compare_values (vr0->min, vr1->min) == 0
2161 && compare_values (vr0->max, vr1->max) == 0)
2162 return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
2164 return NULL_TREE;
2167 /* Simplify processing. If COMP is GT_EXPR or GE_EXPR, switch the
2168 operands around and change the comparison code. */
2169 if (comp == GT_EXPR || comp == GE_EXPR)
2171 value_range_t *tmp;
2172 comp = (comp == GT_EXPR) ? LT_EXPR : LE_EXPR;
2173 tmp = vr0;
2174 vr0 = vr1;
2175 vr1 = tmp;
2178 if (comp == EQ_EXPR)
2180 /* Equality may only be computed if both ranges represent
2181 exactly one value. */
2182 if (compare_values (vr0->min, vr0->max) == 0
2183 && compare_values (vr1->min, vr1->max) == 0)
2185 int cmp_min = compare_values (vr0->min, vr1->min);
2186 int cmp_max = compare_values (vr0->max, vr1->max);
2187 if (cmp_min == 0 && cmp_max == 0)
2188 return boolean_true_node;
2189 else if (cmp_min != -2 && cmp_max != -2)
2190 return boolean_false_node;
2192 /* If [V0_MIN, V1_MAX] < [V1_MIN, V1_MAX] then V0 != V1. */
2193 else if (compare_values (vr0->min, vr1->max) == 1
2194 || compare_values (vr1->min, vr0->max) == 1)
2195 return boolean_false_node;
2197 return NULL_TREE;
2199 else if (comp == NE_EXPR)
2201 int cmp1, cmp2;
2203 /* If VR0 is completely to the left or completely to the right
2204 of VR1, they are always different. Notice that we need to
2205 make sure that both comparisons yield similar results to
2206 avoid comparing values that cannot be compared at
2207 compile-time. */
2208 cmp1 = compare_values (vr0->max, vr1->min);
2209 cmp2 = compare_values (vr0->min, vr1->max);
2210 if ((cmp1 == -1 && cmp2 == -1) || (cmp1 == 1 && cmp2 == 1))
2211 return boolean_true_node;
2213 /* If VR0 and VR1 represent a single value and are identical,
2214 return false. */
2215 else if (compare_values (vr0->min, vr0->max) == 0
2216 && compare_values (vr1->min, vr1->max) == 0
2217 && compare_values (vr0->min, vr1->min) == 0
2218 && compare_values (vr0->max, vr1->max) == 0)
2219 return boolean_false_node;
2221 /* Otherwise, they may or may not be different. */
2222 else
2223 return NULL_TREE;
2225 else if (comp == LT_EXPR || comp == LE_EXPR)
2227 int tst;
2229 /* If VR0 is to the left of VR1, return true. */
2230 tst = compare_values (vr0->max, vr1->min);
2231 if ((comp == LT_EXPR && tst == -1)
2232 || (comp == LE_EXPR && (tst == -1 || tst == 0)))
2233 return boolean_true_node;
2235 /* If VR0 is to the right of VR1, return false. */
2236 tst = compare_values (vr0->min, vr1->max);
2237 if ((comp == LT_EXPR && (tst == 0 || tst == 1))
2238 || (comp == LE_EXPR && tst == 1))
2239 return boolean_false_node;
2241 /* Otherwise, we don't know. */
2242 return NULL_TREE;
2245 gcc_unreachable ();
2249 /* Given a value range VR, a value VAL and a comparison code COMP, return
2250 BOOLEAN_TRUE_NODE if VR COMP VAL always returns true for all the
2251 values in VR. Return BOOLEAN_FALSE_NODE if the comparison
2252 always returns false. Return NULL_TREE if it is not always
2253 possible to determine the value of the comparison. */
2255 static tree
2256 compare_range_with_value (enum tree_code comp, value_range_t *vr, tree val)
2258 if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
2259 return NULL_TREE;
2261 /* Anti-ranges need to be handled separately. */
2262 if (vr->type == VR_ANTI_RANGE)
2264 /* For anti-ranges, the only predicates that we can compute at
2265 compile time are equality and inequality. */
2266 if (comp == GT_EXPR
2267 || comp == GE_EXPR
2268 || comp == LT_EXPR
2269 || comp == LE_EXPR)
2270 return NULL_TREE;
2272 /* ~[VAL_1, VAL_2] OP VAL is known if VAL_1 <= VAL <= VAL_2. */
2273 if (value_inside_range (val, vr) == 1)
2274 return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
2276 return NULL_TREE;
2279 if (comp == EQ_EXPR)
2281 /* EQ_EXPR may only be computed if VR represents exactly
2282 one value. */
2283 if (compare_values (vr->min, vr->max) == 0)
2285 int cmp = compare_values (vr->min, val);
2286 if (cmp == 0)
2287 return boolean_true_node;
2288 else if (cmp == -1 || cmp == 1 || cmp == 2)
2289 return boolean_false_node;
2291 else if (compare_values (val, vr->min) == -1
2292 || compare_values (vr->max, val) == -1)
2293 return boolean_false_node;
2295 return NULL_TREE;
2297 else if (comp == NE_EXPR)
2299 /* If VAL is not inside VR, then they are always different. */
2300 if (compare_values (vr->max, val) == -1
2301 || compare_values (vr->min, val) == 1)
2302 return boolean_true_node;
2304 /* If VR represents exactly one value equal to VAL, then return
2305 false. */
2306 if (compare_values (vr->min, vr->max) == 0
2307 && compare_values (vr->min, val) == 0)
2308 return boolean_false_node;
2310 /* Otherwise, they may or may not be different. */
2311 return NULL_TREE;
2313 else if (comp == LT_EXPR || comp == LE_EXPR)
2315 int tst;
2317 /* If VR is to the left of VAL, return true. */
2318 tst = compare_values (vr->max, val);
2319 if ((comp == LT_EXPR && tst == -1)
2320 || (comp == LE_EXPR && (tst == -1 || tst == 0)))
2321 return boolean_true_node;
2323 /* If VR is to the right of VAL, return false. */
2324 tst = compare_values (vr->min, val);
2325 if ((comp == LT_EXPR && (tst == 0 || tst == 1))
2326 || (comp == LE_EXPR && tst == 1))
2327 return boolean_false_node;
2329 /* Otherwise, we don't know. */
2330 return NULL_TREE;
2332 else if (comp == GT_EXPR || comp == GE_EXPR)
2334 int tst;
2336 /* If VR is to the right of VAL, return true. */
2337 tst = compare_values (vr->min, val);
2338 if ((comp == GT_EXPR && tst == 1)
2339 || (comp == GE_EXPR && (tst == 0 || tst == 1)))
2340 return boolean_true_node;
2342 /* If VR is to the left of VAL, return false. */
2343 tst = compare_values (vr->max, val);
2344 if ((comp == GT_EXPR && (tst == -1 || tst == 0))
2345 || (comp == GE_EXPR && tst == -1))
2346 return boolean_false_node;
2348 /* Otherwise, we don't know. */
2349 return NULL_TREE;
2352 gcc_unreachable ();
2356 /* Debugging dumps. */
2358 void dump_value_range (FILE *, value_range_t *);
2359 void debug_value_range (value_range_t *);
2360 void dump_all_value_ranges (FILE *);
2361 void debug_all_value_ranges (void);
2362 void dump_vr_equiv (FILE *, bitmap);
2363 void debug_vr_equiv (bitmap);
2366 /* Dump value range VR to FILE. */
2368 void
2369 dump_value_range (FILE *file, value_range_t *vr)
2371 if (vr == NULL)
2372 fprintf (file, "[]");
2373 else if (vr->type == VR_UNDEFINED)
2374 fprintf (file, "UNDEFINED");
2375 else if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
2377 tree type = TREE_TYPE (vr->min);
2379 fprintf (file, "%s[", (vr->type == VR_ANTI_RANGE) ? "~" : "");
2381 if (INTEGRAL_TYPE_P (type)
2382 && !TYPE_UNSIGNED (type)
2383 && vr->min == TYPE_MIN_VALUE (type))
2384 fprintf (file, "-INF");
2385 else
2386 print_generic_expr (file, vr->min, 0);
2388 fprintf (file, ", ");
2390 if (INTEGRAL_TYPE_P (type)
2391 && vr->max == TYPE_MAX_VALUE (type))
2392 fprintf (file, "+INF");
2393 else
2394 print_generic_expr (file, vr->max, 0);
2396 fprintf (file, "]");
2398 if (vr->equiv)
2400 bitmap_iterator bi;
2401 unsigned i, c = 0;
2403 fprintf (file, " EQUIVALENCES: { ");
2405 EXECUTE_IF_SET_IN_BITMAP (vr->equiv, 0, i, bi)
2407 print_generic_expr (file, ssa_name (i), 0);
2408 fprintf (file, " ");
2409 c++;
2412 fprintf (file, "} (%u elements)", c);
2415 else if (vr->type == VR_VARYING)
2416 fprintf (file, "VARYING");
2417 else
2418 fprintf (file, "INVALID RANGE");
2422 /* Dump value range VR to stderr. */
2424 void
2425 debug_value_range (value_range_t *vr)
2427 dump_value_range (stderr, vr);
2431 /* Dump value ranges of all SSA_NAMEs to FILE. */
2433 void
2434 dump_all_value_ranges (FILE *file)
2436 size_t i;
2438 for (i = 0; i < num_ssa_names; i++)
2440 if (vr_value[i])
2442 print_generic_expr (file, ssa_name (i), 0);
2443 fprintf (file, ": ");
2444 dump_value_range (file, vr_value[i]);
2445 fprintf (file, "\n");
2449 fprintf (file, "\n");
2453 /* Dump all value ranges to stderr. */
2455 void
2456 debug_all_value_ranges (void)
2458 dump_all_value_ranges (stderr);
2462 /* Given a COND_EXPR COND of the form 'V OP W', and an SSA name V,
2463 create a new SSA name N and return the assertion assignment
2464 'V = ASSERT_EXPR <V, V OP W>'. */
2466 static tree
2467 build_assert_expr_for (tree cond, tree v)
2469 tree n, assertion;
2471 gcc_assert (TREE_CODE (v) == SSA_NAME);
2472 n = duplicate_ssa_name (v, NULL_TREE);
2474 if (COMPARISON_CLASS_P (cond))
2476 tree a = build2 (ASSERT_EXPR, TREE_TYPE (v), v, cond);
2477 assertion = build2 (MODIFY_EXPR, TREE_TYPE (v), n, a);
2479 else if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
2481 /* Given !V, build the assignment N = false. */
2482 tree op0 = TREE_OPERAND (cond, 0);
2483 gcc_assert (op0 == v);
2484 assertion = build2 (MODIFY_EXPR, TREE_TYPE (v), n, boolean_false_node);
2486 else if (TREE_CODE (cond) == SSA_NAME)
2488 /* Given V, build the assignment N = true. */
2489 gcc_assert (v == cond);
2490 assertion = build2 (MODIFY_EXPR, TREE_TYPE (v), n, boolean_true_node);
2492 else
2493 gcc_unreachable ();
2495 SSA_NAME_DEF_STMT (n) = assertion;
2497 /* The new ASSERT_EXPR, creates a new SSA name that replaces the
2498 operand of the ASSERT_EXPR. Register the new name and the old one
2499 in the replacement table so that we can fix the SSA web after
2500 adding all the ASSERT_EXPRs. */
2501 register_new_name_mapping (n, v);
2503 return assertion;
2507 /* Return false if EXPR is a predicate expression involving floating
2508 point values. */
2510 static inline bool
2511 fp_predicate (tree expr)
2513 return (COMPARISON_CLASS_P (expr)
2514 && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 0))));
2518 /* If the range of values taken by OP can be inferred after STMT executes,
2519 return the comparison code (COMP_CODE_P) and value (VAL_P) that
2520 describes the inferred range. Return true if a range could be
2521 inferred. */
2523 static bool
2524 infer_value_range (tree stmt, tree op, enum tree_code *comp_code_p, tree *val_p)
2526 *val_p = NULL_TREE;
2527 *comp_code_p = ERROR_MARK;
2529 /* Do not attempt to infer anything in names that flow through
2530 abnormal edges. */
2531 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
2532 return false;
2534 /* Similarly, don't infer anything from statements that may throw
2535 exceptions. */
2536 if (tree_could_throw_p (stmt))
2537 return false;
2539 /* If STMT is the last statement of a basic block with no
2540 successors, there is no point inferring anything about any of its
2541 operands. We would not be able to find a proper insertion point
2542 for the assertion, anyway. */
2543 if (stmt_ends_bb_p (stmt) && EDGE_COUNT (bb_for_stmt (stmt)->succs) == 0)
2544 return false;
2546 /* We can only assume that a pointer dereference will yield
2547 non-NULL if -fdelete-null-pointer-checks is enabled. */
2548 if (flag_delete_null_pointer_checks && POINTER_TYPE_P (TREE_TYPE (op)))
2550 bool is_store;
2551 unsigned num_uses, num_derefs;
2553 count_uses_and_derefs (op, stmt, &num_uses, &num_derefs, &is_store);
2554 if (num_derefs > 0)
2556 *val_p = build_int_cst (TREE_TYPE (op), 0);
2557 *comp_code_p = NE_EXPR;
2558 return true;
2562 return false;
2566 void dump_asserts_for (FILE *, tree);
2567 void debug_asserts_for (tree);
2568 void dump_all_asserts (FILE *);
2569 void debug_all_asserts (void);
2571 /* Dump all the registered assertions for NAME to FILE. */
2573 void
2574 dump_asserts_for (FILE *file, tree name)
2576 assert_locus_t loc;
2578 fprintf (file, "Assertions to be inserted for ");
2579 print_generic_expr (file, name, 0);
2580 fprintf (file, "\n");
2582 loc = asserts_for[SSA_NAME_VERSION (name)];
2583 while (loc)
2585 fprintf (file, "\t");
2586 print_generic_expr (file, bsi_stmt (loc->si), 0);
2587 fprintf (file, "\n\tBB #%d", loc->bb->index);
2588 if (loc->e)
2590 fprintf (file, "\n\tEDGE %d->%d", loc->e->src->index,
2591 loc->e->dest->index);
2592 dump_edge_info (file, loc->e, 0);
2594 fprintf (file, "\n\tPREDICATE: ");
2595 print_generic_expr (file, name, 0);
2596 fprintf (file, " %s ", tree_code_name[(int)loc->comp_code]);
2597 print_generic_expr (file, loc->val, 0);
2598 fprintf (file, "\n\n");
2599 loc = loc->next;
2602 fprintf (file, "\n");
2606 /* Dump all the registered assertions for NAME to stderr. */
2608 void
2609 debug_asserts_for (tree name)
2611 dump_asserts_for (stderr, name);
2615 /* Dump all the registered assertions for all the names to FILE. */
2617 void
2618 dump_all_asserts (FILE *file)
2620 unsigned i;
2621 bitmap_iterator bi;
2623 fprintf (file, "\nASSERT_EXPRs to be inserted\n\n");
2624 EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
2625 dump_asserts_for (file, ssa_name (i));
2626 fprintf (file, "\n");
2630 /* Dump all the registered assertions for all the names to stderr. */
2632 void
2633 debug_all_asserts (void)
2635 dump_all_asserts (stderr);
2639 /* If NAME doesn't have an ASSERT_EXPR registered for asserting
2640 'NAME COMP_CODE VAL' at a location that dominates block BB or
2641 E->DEST, then register this location as a possible insertion point
2642 for ASSERT_EXPR <NAME, NAME COMP_CODE VAL>.
2644 BB, E and SI provide the exact insertion point for the new
2645 ASSERT_EXPR. If BB is NULL, then the ASSERT_EXPR is to be inserted
2646 on edge E. Otherwise, if E is NULL, the ASSERT_EXPR is inserted on
2647 BB. If SI points to a COND_EXPR or a SWITCH_EXPR statement, then E
2648 must not be NULL. */
2650 static void
2651 register_new_assert_for (tree name,
2652 enum tree_code comp_code,
2653 tree val,
2654 basic_block bb,
2655 edge e,
2656 block_stmt_iterator si)
2658 assert_locus_t n, loc, last_loc;
2659 bool found;
2660 basic_block dest_bb;
2662 #if defined ENABLE_CHECKING
2663 gcc_assert (bb == NULL || e == NULL);
2665 if (e == NULL)
2666 gcc_assert (TREE_CODE (bsi_stmt (si)) != COND_EXPR
2667 && TREE_CODE (bsi_stmt (si)) != SWITCH_EXPR);
2668 #endif
2670 /* The new assertion A will be inserted at BB or E. We need to
2671 determine if the new location is dominated by a previously
2672 registered location for A. If we are doing an edge insertion,
2673 assume that A will be inserted at E->DEST. Note that this is not
2674 necessarily true.
2676 If E is a critical edge, it will be split. But even if E is
2677 split, the new block will dominate the same set of blocks that
2678 E->DEST dominates.
2680 The reverse, however, is not true, blocks dominated by E->DEST
2681 will not be dominated by the new block created to split E. So,
2682 if the insertion location is on a critical edge, we will not use
2683 the new location to move another assertion previously registered
2684 at a block dominated by E->DEST. */
2685 dest_bb = (bb) ? bb : e->dest;
2687 /* If NAME already has an ASSERT_EXPR registered for COMP_CODE and
2688 VAL at a block dominating DEST_BB, then we don't need to insert a new
2689 one. Similarly, if the same assertion already exists at a block
2690 dominated by DEST_BB and the new location is not on a critical
2691 edge, then update the existing location for the assertion (i.e.,
2692 move the assertion up in the dominance tree).
2694 Note, this is implemented as a simple linked list because there
2695 should not be more than a handful of assertions registered per
2696 name. If this becomes a performance problem, a table hashed by
2697 COMP_CODE and VAL could be implemented. */
2698 loc = asserts_for[SSA_NAME_VERSION (name)];
2699 last_loc = loc;
2700 found = false;
2701 while (loc)
2703 if (loc->comp_code == comp_code
2704 && (loc->val == val
2705 || operand_equal_p (loc->val, val, 0)))
2707 /* If the assertion NAME COMP_CODE VAL has already been
2708 registered at a basic block that dominates DEST_BB, then
2709 we don't need to insert the same assertion again. Note
2710 that we don't check strict dominance here to avoid
2711 replicating the same assertion inside the same basic
2712 block more than once (e.g., when a pointer is
2713 dereferenced several times inside a block).
2715 An exception to this rule are edge insertions. If the
2716 new assertion is to be inserted on edge E, then it will
2717 dominate all the other insertions that we may want to
2718 insert in DEST_BB. So, if we are doing an edge
2719 insertion, don't do this dominance check. */
2720 if (e == NULL
2721 && dominated_by_p (CDI_DOMINATORS, dest_bb, loc->bb))
2722 return;
2724 /* Otherwise, if E is not a critical edge and DEST_BB
2725 dominates the existing location for the assertion, move
2726 the assertion up in the dominance tree by updating its
2727 location information. */
2728 if ((e == NULL || !EDGE_CRITICAL_P (e))
2729 && dominated_by_p (CDI_DOMINATORS, loc->bb, dest_bb))
2731 loc->bb = dest_bb;
2732 loc->e = e;
2733 loc->si = si;
2734 return;
2738 /* Update the last node of the list and move to the next one. */
2739 last_loc = loc;
2740 loc = loc->next;
2743 /* If we didn't find an assertion already registered for
2744 NAME COMP_CODE VAL, add a new one at the end of the list of
2745 assertions associated with NAME. */
2746 n = XNEW (struct assert_locus_d);
2747 n->bb = dest_bb;
2748 n->e = e;
2749 n->si = si;
2750 n->comp_code = comp_code;
2751 n->val = val;
2752 n->next = NULL;
2754 if (last_loc)
2755 last_loc->next = n;
2756 else
2757 asserts_for[SSA_NAME_VERSION (name)] = n;
2759 bitmap_set_bit (need_assert_for, SSA_NAME_VERSION (name));
2763 /* Try to register an edge assertion for SSA name NAME on edge E for
2764 the conditional jump pointed to by SI. Return true if an assertion
2765 for NAME could be registered. */
2767 static bool
2768 register_edge_assert_for (tree name, edge e, block_stmt_iterator si)
2770 tree val, stmt;
2771 enum tree_code comp_code;
2773 stmt = bsi_stmt (si);
2775 /* Do not attempt to infer anything in names that flow through
2776 abnormal edges. */
2777 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
2778 return false;
2780 /* If NAME was not found in the sub-graph reachable from E, then
2781 there's nothing to do. */
2782 if (!TEST_BIT (found_in_subgraph, SSA_NAME_VERSION (name)))
2783 return false;
2785 /* We found a use of NAME in the sub-graph rooted at E->DEST.
2786 Register an assertion for NAME according to the value that NAME
2787 takes on edge E. */
2788 if (TREE_CODE (stmt) == COND_EXPR)
2790 /* If BB ends in a COND_EXPR then NAME then we should insert
2791 the original predicate on EDGE_TRUE_VALUE and the
2792 opposite predicate on EDGE_FALSE_VALUE. */
2793 tree cond = COND_EXPR_COND (stmt);
2794 bool is_else_edge = (e->flags & EDGE_FALSE_VALUE) != 0;
2796 /* Predicates may be a single SSA name or NAME OP VAL. */
2797 if (cond == name)
2799 /* If the predicate is a name, it must be NAME, in which
2800 case we create the predicate NAME == true or
2801 NAME == false accordingly. */
2802 comp_code = EQ_EXPR;
2803 val = (is_else_edge) ? boolean_false_node : boolean_true_node;
2805 else
2807 /* Otherwise, we have a comparison of the form NAME COMP VAL
2808 or VAL COMP NAME. */
2809 if (name == TREE_OPERAND (cond, 1))
2811 /* If the predicate is of the form VAL COMP NAME, flip
2812 COMP around because we need to register NAME as the
2813 first operand in the predicate. */
2814 comp_code = swap_tree_comparison (TREE_CODE (cond));
2815 val = TREE_OPERAND (cond, 0);
2817 else
2819 /* The comparison is of the form NAME COMP VAL, so the
2820 comparison code remains unchanged. */
2821 comp_code = TREE_CODE (cond);
2822 val = TREE_OPERAND (cond, 1);
2825 /* If we are inserting the assertion on the ELSE edge, we
2826 need to invert the sign comparison. */
2827 if (is_else_edge)
2828 comp_code = invert_tree_comparison (comp_code, 0);
2830 /* Do not register always-false predicates. FIXME, this
2831 works around a limitation in fold() when dealing with
2832 enumerations. Given 'enum { N1, N2 } x;', fold will not
2833 fold 'if (x > N2)' to 'if (0)'. */
2834 if ((comp_code == GT_EXPR || comp_code == LT_EXPR)
2835 && (INTEGRAL_TYPE_P (TREE_TYPE (val))
2836 || SCALAR_FLOAT_TYPE_P (TREE_TYPE (val))))
2838 tree min = TYPE_MIN_VALUE (TREE_TYPE (val));
2839 tree max = TYPE_MAX_VALUE (TREE_TYPE (val));
2841 if (comp_code == GT_EXPR && compare_values (val, max) == 0)
2842 return false;
2844 if (comp_code == LT_EXPR && compare_values (val, min) == 0)
2845 return false;
2849 else
2851 /* FIXME. Handle SWITCH_EXPR. */
2852 gcc_unreachable ();
2855 register_new_assert_for (name, comp_code, val, NULL, e, si);
2856 return true;
2860 static bool find_assert_locations (basic_block bb);
2862 /* Determine whether the outgoing edges of BB should receive an
2863 ASSERT_EXPR for each of the operands of BB's last statement. The
2864 last statement of BB must be a COND_EXPR or a SWITCH_EXPR.
2866 If any of the sub-graphs rooted at BB have an interesting use of
2867 the predicate operands, an assert location node is added to the
2868 list of assertions for the corresponding operands. */
2870 static bool
2871 find_conditional_asserts (basic_block bb)
2873 bool need_assert;
2874 block_stmt_iterator last_si;
2875 tree op, last;
2876 edge_iterator ei;
2877 edge e;
2878 ssa_op_iter iter;
2880 need_assert = false;
2881 last_si = bsi_last (bb);
2882 last = bsi_stmt (last_si);
2884 /* Look for uses of the operands in each of the sub-graphs
2885 rooted at BB. We need to check each of the outgoing edges
2886 separately, so that we know what kind of ASSERT_EXPR to
2887 insert. */
2888 FOR_EACH_EDGE (e, ei, bb->succs)
2890 if (e->dest == bb)
2891 continue;
2893 /* Remove the COND_EXPR operands from the FOUND_IN_SUBGRAPH bitmap.
2894 Otherwise, when we finish traversing each of the sub-graphs, we
2895 won't know whether the variables were found in the sub-graphs or
2896 if they had been found in a block upstream from BB.
2898 This is actually a bad idea is some cases, particularly jump
2899 threading. Consider a CFG like the following:
2909 Assume that one or more operands in the conditional at the
2910 end of block 0 are used in a conditional in block 2, but not
2911 anywhere in block 1. In this case we will not insert any
2912 assert statements in block 1, which may cause us to miss
2913 opportunities to optimize, particularly for jump threading. */
2914 FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
2915 RESET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
2917 /* Traverse the strictly dominated sub-graph rooted at E->DEST
2918 to determine if any of the operands in the conditional
2919 predicate are used. */
2920 if (e->dest != bb)
2921 need_assert |= find_assert_locations (e->dest);
2923 /* Register the necessary assertions for each operand in the
2924 conditional predicate. */
2925 FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
2926 need_assert |= register_edge_assert_for (op, e, last_si);
2929 /* Finally, indicate that we have found the operands in the
2930 conditional. */
2931 FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
2932 SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
2934 return need_assert;
2938 /* Traverse all the statements in block BB looking for statements that
2939 may generate useful assertions for the SSA names in their operand.
2940 If a statement produces a useful assertion A for name N_i, then the
2941 list of assertions already generated for N_i is scanned to
2942 determine if A is actually needed.
2944 If N_i already had the assertion A at a location dominating the
2945 current location, then nothing needs to be done. Otherwise, the
2946 new location for A is recorded instead.
2948 1- For every statement S in BB, all the variables used by S are
2949 added to bitmap FOUND_IN_SUBGRAPH.
2951 2- If statement S uses an operand N in a way that exposes a known
2952 value range for N, then if N was not already generated by an
2953 ASSERT_EXPR, create a new assert location for N. For instance,
2954 if N is a pointer and the statement dereferences it, we can
2955 assume that N is not NULL.
2957 3- COND_EXPRs are a special case of #2. We can derive range
2958 information from the predicate but need to insert different
2959 ASSERT_EXPRs for each of the sub-graphs rooted at the
2960 conditional block. If the last statement of BB is a conditional
2961 expression of the form 'X op Y', then
2963 a) Remove X and Y from the set FOUND_IN_SUBGRAPH.
2965 b) If the conditional is the only entry point to the sub-graph
2966 corresponding to the THEN_CLAUSE, recurse into it. On
2967 return, if X and/or Y are marked in FOUND_IN_SUBGRAPH, then
2968 an ASSERT_EXPR is added for the corresponding variable.
2970 c) Repeat step (b) on the ELSE_CLAUSE.
2972 d) Mark X and Y in FOUND_IN_SUBGRAPH.
2974 For instance,
2976 if (a == 9)
2977 b = a;
2978 else
2979 b = c + 1;
2981 In this case, an assertion on the THEN clause is useful to
2982 determine that 'a' is always 9 on that edge. However, an assertion
2983 on the ELSE clause would be unnecessary.
2985 4- If BB does not end in a conditional expression, then we recurse
2986 into BB's dominator children.
2988 At the end of the recursive traversal, every SSA name will have a
2989 list of locations where ASSERT_EXPRs should be added. When a new
2990 location for name N is found, it is registered by calling
2991 register_new_assert_for. That function keeps track of all the
2992 registered assertions to prevent adding unnecessary assertions.
2993 For instance, if a pointer P_4 is dereferenced more than once in a
2994 dominator tree, only the location dominating all the dereference of
2995 P_4 will receive an ASSERT_EXPR.
2997 If this function returns true, then it means that there are names
2998 for which we need to generate ASSERT_EXPRs. Those assertions are
2999 inserted by process_assert_insertions.
3001 TODO. Handle SWITCH_EXPR. */
3003 static bool
3004 find_assert_locations (basic_block bb)
3006 block_stmt_iterator si;
3007 tree last, phi;
3008 bool need_assert;
3009 basic_block son;
3011 if (TEST_BIT (blocks_visited, bb->index))
3012 return false;
3014 SET_BIT (blocks_visited, bb->index);
3016 need_assert = false;
3018 /* Traverse all PHI nodes in BB marking used operands. */
3019 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
3021 use_operand_p arg_p;
3022 ssa_op_iter i;
3024 FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_USE)
3026 tree arg = USE_FROM_PTR (arg_p);
3027 if (TREE_CODE (arg) == SSA_NAME)
3029 gcc_assert (is_gimple_reg (PHI_RESULT (phi)));
3030 SET_BIT (found_in_subgraph, SSA_NAME_VERSION (arg));
3035 /* Traverse all the statements in BB marking used names and looking
3036 for statements that may infer assertions for their used operands. */
3037 last = NULL_TREE;
3038 for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
3040 tree stmt, op;
3041 ssa_op_iter i;
3043 stmt = bsi_stmt (si);
3045 /* See if we can derive an assertion for any of STMT's operands. */
3046 FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
3048 tree value;
3049 enum tree_code comp_code;
3051 /* Mark OP in bitmap FOUND_IN_SUBGRAPH. If STMT is inside
3052 the sub-graph of a conditional block, when we return from
3053 this recursive walk, our parent will use the
3054 FOUND_IN_SUBGRAPH bitset to determine if one of the
3055 operands it was looking for was present in the sub-graph. */
3056 SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
3058 /* If OP is used in such a way that we can infer a value
3059 range for it, and we don't find a previous assertion for
3060 it, create a new assertion location node for OP. */
3061 if (infer_value_range (stmt, op, &comp_code, &value))
3063 /* If we are able to infer a nonzero value range for OP,
3064 then walk backwards through the use-def chain to see if OP
3065 was set via a typecast.
3067 If so, then we can also infer a nonzero value range
3068 for the operand of the NOP_EXPR. */
3069 if (comp_code == NE_EXPR && integer_zerop (value))
3071 tree t = op;
3072 tree def_stmt = SSA_NAME_DEF_STMT (t);
3074 while (TREE_CODE (def_stmt) == MODIFY_EXPR
3075 && TREE_CODE (TREE_OPERAND (def_stmt, 1)) == NOP_EXPR
3076 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (def_stmt, 1), 0)) == SSA_NAME
3077 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (def_stmt, 1), 0))))
3079 t = TREE_OPERAND (TREE_OPERAND (def_stmt, 1), 0);
3080 def_stmt = SSA_NAME_DEF_STMT (t);
3082 /* Note we want to register the assert for the
3083 operand of the NOP_EXPR after SI, not after the
3084 conversion. */
3085 if (! has_single_use (t))
3087 register_new_assert_for (t, comp_code, value,
3088 bb, NULL, si);
3089 need_assert = true;
3094 /* If OP is used only once, namely in this STMT, don't
3095 bother creating an ASSERT_EXPR for it. Such an
3096 ASSERT_EXPR would do nothing but increase compile time. */
3097 if (!has_single_use (op))
3099 register_new_assert_for (op, comp_code, value, bb, NULL, si);
3100 need_assert = true;
3105 /* Remember the last statement of the block. */
3106 last = stmt;
3109 /* If BB's last statement is a conditional expression
3110 involving integer operands, recurse into each of the sub-graphs
3111 rooted at BB to determine if we need to add ASSERT_EXPRs. */
3112 if (last
3113 && TREE_CODE (last) == COND_EXPR
3114 && !fp_predicate (COND_EXPR_COND (last))
3115 && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
3116 need_assert |= find_conditional_asserts (bb);
3118 /* Recurse into the dominator children of BB. */
3119 for (son = first_dom_son (CDI_DOMINATORS, bb);
3120 son;
3121 son = next_dom_son (CDI_DOMINATORS, son))
3122 need_assert |= find_assert_locations (son);
3124 return need_assert;
3128 /* Create an ASSERT_EXPR for NAME and insert it in the location
3129 indicated by LOC. Return true if we made any edge insertions. */
3131 static bool
3132 process_assert_insertions_for (tree name, assert_locus_t loc)
3134 /* Build the comparison expression NAME_i COMP_CODE VAL. */
3135 tree stmt, cond, assert_expr;
3136 edge_iterator ei;
3137 edge e;
3139 cond = build2 (loc->comp_code, boolean_type_node, name, loc->val);
3140 assert_expr = build_assert_expr_for (cond, name);
3142 if (loc->e)
3144 /* We have been asked to insert the assertion on an edge. This
3145 is used only by COND_EXPR and SWITCH_EXPR assertions. */
3146 #if defined ENABLE_CHECKING
3147 gcc_assert (TREE_CODE (bsi_stmt (loc->si)) == COND_EXPR
3148 || TREE_CODE (bsi_stmt (loc->si)) == SWITCH_EXPR);
3149 #endif
3151 bsi_insert_on_edge (loc->e, assert_expr);
3152 return true;
3155 /* Otherwise, we can insert right after LOC->SI iff the
3156 statement must not be the last statement in the block. */
3157 stmt = bsi_stmt (loc->si);
3158 if (!stmt_ends_bb_p (stmt))
3160 bsi_insert_after (&loc->si, assert_expr, BSI_SAME_STMT);
3161 return false;
3164 /* If STMT must be the last statement in BB, we can only insert new
3165 assertions on the non-abnormal edge out of BB. Note that since
3166 STMT is not control flow, there may only be one non-abnormal edge
3167 out of BB. */
3168 FOR_EACH_EDGE (e, ei, loc->bb->succs)
3169 if (!(e->flags & EDGE_ABNORMAL))
3171 bsi_insert_on_edge (e, assert_expr);
3172 return true;
3175 gcc_unreachable ();
3179 /* Process all the insertions registered for every name N_i registered
3180 in NEED_ASSERT_FOR. The list of assertions to be inserted are
3181 found in ASSERTS_FOR[i]. */
3183 static void
3184 process_assert_insertions (void)
3186 unsigned i;
3187 bitmap_iterator bi;
3188 bool update_edges_p = false;
3189 int num_asserts = 0;
3191 if (dump_file && (dump_flags & TDF_DETAILS))
3192 dump_all_asserts (dump_file);
3194 EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
3196 assert_locus_t loc = asserts_for[i];
3197 gcc_assert (loc);
3199 while (loc)
3201 assert_locus_t next = loc->next;
3202 update_edges_p |= process_assert_insertions_for (ssa_name (i), loc);
3203 free (loc);
3204 loc = next;
3205 num_asserts++;
3209 if (update_edges_p)
3210 bsi_commit_edge_inserts ();
3212 if (dump_file && (dump_flags & TDF_STATS))
3213 fprintf (dump_file, "\nNumber of ASSERT_EXPR expressions inserted: %d\n\n",
3214 num_asserts);
3218 /* Traverse the flowgraph looking for conditional jumps to insert range
3219 expressions. These range expressions are meant to provide information
3220 to optimizations that need to reason in terms of value ranges. They
3221 will not be expanded into RTL. For instance, given:
3223 x = ...
3224 y = ...
3225 if (x < y)
3226 y = x - 2;
3227 else
3228 x = y + 3;
3230 this pass will transform the code into:
3232 x = ...
3233 y = ...
3234 if (x < y)
3236 x = ASSERT_EXPR <x, x < y>
3237 y = x - 2
3239 else
3241 y = ASSERT_EXPR <y, x <= y>
3242 x = y + 3
3245 The idea is that once copy and constant propagation have run, other
3246 optimizations will be able to determine what ranges of values can 'x'
3247 take in different paths of the code, simply by checking the reaching
3248 definition of 'x'. */
3250 static void
3251 insert_range_assertions (void)
3253 edge e;
3254 edge_iterator ei;
3255 bool update_ssa_p;
3257 found_in_subgraph = sbitmap_alloc (num_ssa_names);
3258 sbitmap_zero (found_in_subgraph);
3260 blocks_visited = sbitmap_alloc (last_basic_block);
3261 sbitmap_zero (blocks_visited);
3263 need_assert_for = BITMAP_ALLOC (NULL);
3264 asserts_for = XNEWVEC (assert_locus_t, num_ssa_names);
3265 memset (asserts_for, 0, num_ssa_names * sizeof (assert_locus_t));
3267 calculate_dominance_info (CDI_DOMINATORS);
3269 update_ssa_p = false;
3270 FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
3271 if (find_assert_locations (e->dest))
3272 update_ssa_p = true;
3274 if (update_ssa_p)
3276 process_assert_insertions ();
3277 update_ssa (TODO_update_ssa_no_phi);
3280 if (dump_file && (dump_flags & TDF_DETAILS))
3282 fprintf (dump_file, "\nSSA form after inserting ASSERT_EXPRs\n");
3283 dump_function_to_file (current_function_decl, dump_file, dump_flags);
3286 sbitmap_free (found_in_subgraph);
3287 free (asserts_for);
3288 BITMAP_FREE (need_assert_for);
3292 /* Convert range assertion expressions into the implied copies and
3293 copy propagate away the copies. Doing the trivial copy propagation
3294 here avoids the need to run the full copy propagation pass after
3295 VRP.
3297 FIXME, this will eventually lead to copy propagation removing the
3298 names that had useful range information attached to them. For
3299 instance, if we had the assertion N_i = ASSERT_EXPR <N_j, N_j > 3>,
3300 then N_i will have the range [3, +INF].
3302 However, by converting the assertion into the implied copy
3303 operation N_i = N_j, we will then copy-propagate N_j into the uses
3304 of N_i and lose the range information. We may want to hold on to
3305 ASSERT_EXPRs a little while longer as the ranges could be used in
3306 things like jump threading.
3308 The problem with keeping ASSERT_EXPRs around is that passes after
3309 VRP need to handle them appropriately.
3311 Another approach would be to make the range information a first
3312 class property of the SSA_NAME so that it can be queried from
3313 any pass. This is made somewhat more complex by the need for
3314 multiple ranges to be associated with one SSA_NAME. */
3316 static void
3317 remove_range_assertions (void)
3319 basic_block bb;
3320 block_stmt_iterator si;
3322 /* Note that the BSI iterator bump happens at the bottom of the
3323 loop and no bump is necessary if we're removing the statement
3324 referenced by the current BSI. */
3325 FOR_EACH_BB (bb)
3326 for (si = bsi_start (bb); !bsi_end_p (si);)
3328 tree stmt = bsi_stmt (si);
3329 tree use_stmt;
3331 if (TREE_CODE (stmt) == MODIFY_EXPR
3332 && TREE_CODE (TREE_OPERAND (stmt, 1)) == ASSERT_EXPR)
3334 tree rhs = TREE_OPERAND (stmt, 1), var;
3335 tree cond = fold (ASSERT_EXPR_COND (rhs));
3336 use_operand_p use_p;
3337 imm_use_iterator iter;
3339 gcc_assert (cond != boolean_false_node);
3341 /* Propagate the RHS into every use of the LHS. */
3342 var = ASSERT_EXPR_VAR (rhs);
3343 FOR_EACH_IMM_USE_STMT (use_stmt, iter, TREE_OPERAND (stmt, 0))
3344 FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
3346 SET_USE (use_p, var);
3347 gcc_assert (TREE_CODE (var) == SSA_NAME);
3350 /* And finally, remove the copy, it is not needed. */
3351 bsi_remove (&si, true);
3353 else
3354 bsi_next (&si);
3357 sbitmap_free (blocks_visited);
3361 /* Return true if STMT is interesting for VRP. */
3363 static bool
3364 stmt_interesting_for_vrp (tree stmt)
3366 if (TREE_CODE (stmt) == PHI_NODE
3367 && is_gimple_reg (PHI_RESULT (stmt))
3368 && (INTEGRAL_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))
3369 || POINTER_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))))
3370 return true;
3371 else if (TREE_CODE (stmt) == MODIFY_EXPR)
3373 tree lhs = TREE_OPERAND (stmt, 0);
3374 tree rhs = TREE_OPERAND (stmt, 1);
3376 /* In general, assignments with virtual operands are not useful
3377 for deriving ranges, with the obvious exception of calls to
3378 builtin functions. */
3379 if (TREE_CODE (lhs) == SSA_NAME
3380 && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
3381 || POINTER_TYPE_P (TREE_TYPE (lhs)))
3382 && ((TREE_CODE (rhs) == CALL_EXPR
3383 && TREE_CODE (TREE_OPERAND (rhs, 0)) == ADDR_EXPR
3384 && DECL_P (TREE_OPERAND (TREE_OPERAND (rhs, 0), 0))
3385 && DECL_IS_BUILTIN (TREE_OPERAND (TREE_OPERAND (rhs, 0), 0)))
3386 || ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS)))
3387 return true;
3389 else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
3390 return true;
3392 return false;
3396 /* Initialize local data structures for VRP. */
3398 static void
3399 vrp_initialize (void)
3401 basic_block bb;
3403 vr_value = XNEWVEC (value_range_t *, num_ssa_names);
3404 memset (vr_value, 0, num_ssa_names * sizeof (value_range_t *));
3406 FOR_EACH_BB (bb)
3408 block_stmt_iterator si;
3409 tree phi;
3411 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
3413 if (!stmt_interesting_for_vrp (phi))
3415 tree lhs = PHI_RESULT (phi);
3416 set_value_range_to_varying (get_value_range (lhs));
3417 DONT_SIMULATE_AGAIN (phi) = true;
3419 else
3420 DONT_SIMULATE_AGAIN (phi) = false;
3423 for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
3425 tree stmt = bsi_stmt (si);
3427 if (!stmt_interesting_for_vrp (stmt))
3429 ssa_op_iter i;
3430 tree def;
3431 FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
3432 set_value_range_to_varying (get_value_range (def));
3433 DONT_SIMULATE_AGAIN (stmt) = true;
3435 else
3437 DONT_SIMULATE_AGAIN (stmt) = false;
3444 /* Visit assignment STMT. If it produces an interesting range, record
3445 the SSA name in *OUTPUT_P. */
3447 static enum ssa_prop_result
3448 vrp_visit_assignment (tree stmt, tree *output_p)
3450 tree lhs, rhs, def;
3451 ssa_op_iter iter;
3453 lhs = TREE_OPERAND (stmt, 0);
3454 rhs = TREE_OPERAND (stmt, 1);
3456 /* We only keep track of ranges in integral and pointer types. */
3457 if (TREE_CODE (lhs) == SSA_NAME
3458 && ((INTEGRAL_TYPE_P (TREE_TYPE (lhs))
3459 /* It is valid to have NULL MIN/MAX values on a type. See
3460 build_range_type. */
3461 && TYPE_MIN_VALUE (TREE_TYPE (lhs))
3462 && TYPE_MAX_VALUE (TREE_TYPE (lhs)))
3463 || POINTER_TYPE_P (TREE_TYPE (lhs))))
3465 struct loop *l;
3466 value_range_t new_vr = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
3468 extract_range_from_expr (&new_vr, rhs);
3470 /* If STMT is inside a loop, we may be able to know something
3471 else about the range of LHS by examining scalar evolution
3472 information. */
3473 if (current_loops && (l = loop_containing_stmt (stmt)))
3474 adjust_range_with_scev (&new_vr, l, stmt, lhs);
3476 if (update_value_range (lhs, &new_vr))
3478 *output_p = lhs;
3480 if (dump_file && (dump_flags & TDF_DETAILS))
3482 fprintf (dump_file, "Found new range for ");
3483 print_generic_expr (dump_file, lhs, 0);
3484 fprintf (dump_file, ": ");
3485 dump_value_range (dump_file, &new_vr);
3486 fprintf (dump_file, "\n\n");
3489 if (new_vr.type == VR_VARYING)
3490 return SSA_PROP_VARYING;
3492 return SSA_PROP_INTERESTING;
3495 return SSA_PROP_NOT_INTERESTING;
3498 /* Every other statement produces no useful ranges. */
3499 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
3500 set_value_range_to_varying (get_value_range (def));
3502 return SSA_PROP_VARYING;
3506 /* Compare all the value ranges for names equivalent to VAR with VAL
3507 using comparison code COMP. Return the same value returned by
3508 compare_range_with_value. */
3510 static tree
3511 compare_name_with_value (enum tree_code comp, tree var, tree val)
3513 bitmap_iterator bi;
3514 unsigned i;
3515 bitmap e;
3516 tree retval, t;
3518 t = retval = NULL_TREE;
3520 /* Get the set of equivalences for VAR. */
3521 e = get_value_range (var)->equiv;
3523 /* Add VAR to its own set of equivalences so that VAR's value range
3524 is processed by this loop (otherwise, we would have to replicate
3525 the body of the loop just to check VAR's value range). */
3526 bitmap_set_bit (e, SSA_NAME_VERSION (var));
3528 EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
3530 value_range_t equiv_vr = *(vr_value[i]);
3532 /* If name N_i does not have a valid range, use N_i as its own
3533 range. This allows us to compare against names that may
3534 have N_i in their ranges. */
3535 if (equiv_vr.type == VR_VARYING || equiv_vr.type == VR_UNDEFINED)
3537 equiv_vr.type = VR_RANGE;
3538 equiv_vr.min = ssa_name (i);
3539 equiv_vr.max = ssa_name (i);
3542 t = compare_range_with_value (comp, &equiv_vr, val);
3543 if (t)
3545 /* All the ranges should compare the same against VAL. */
3546 gcc_assert (retval == NULL || t == retval);
3547 retval = t;
3551 /* Remove VAR from its own equivalence set. */
3552 bitmap_clear_bit (e, SSA_NAME_VERSION (var));
3554 if (retval)
3555 return retval;
3557 /* We couldn't find a non-NULL value for the predicate. */
3558 return NULL_TREE;
3562 /* Given a comparison code COMP and names N1 and N2, compare all the
3563 ranges equivalent to N1 against all the ranges equivalent to N2
3564 to determine the value of N1 COMP N2. Return the same value
3565 returned by compare_ranges. */
3567 static tree
3568 compare_names (enum tree_code comp, tree n1, tree n2)
3570 tree t, retval;
3571 bitmap e1, e2;
3572 bitmap_iterator bi1, bi2;
3573 unsigned i1, i2;
3575 /* Compare the ranges of every name equivalent to N1 against the
3576 ranges of every name equivalent to N2. */
3577 e1 = get_value_range (n1)->equiv;
3578 e2 = get_value_range (n2)->equiv;
3580 /* Add N1 and N2 to their own set of equivalences to avoid
3581 duplicating the body of the loop just to check N1 and N2
3582 ranges. */
3583 bitmap_set_bit (e1, SSA_NAME_VERSION (n1));
3584 bitmap_set_bit (e2, SSA_NAME_VERSION (n2));
3586 /* If the equivalence sets have a common intersection, then the two
3587 names can be compared without checking their ranges. */
3588 if (bitmap_intersect_p (e1, e2))
3590 bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
3591 bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
3593 return (comp == EQ_EXPR || comp == GE_EXPR || comp == LE_EXPR)
3594 ? boolean_true_node
3595 : boolean_false_node;
3598 /* Otherwise, compare all the equivalent ranges. First, add N1 and
3599 N2 to their own set of equivalences to avoid duplicating the body
3600 of the loop just to check N1 and N2 ranges. */
3601 EXECUTE_IF_SET_IN_BITMAP (e1, 0, i1, bi1)
3603 value_range_t vr1 = *(vr_value[i1]);
3605 /* If the range is VARYING or UNDEFINED, use the name itself. */
3606 if (vr1.type == VR_VARYING || vr1.type == VR_UNDEFINED)
3608 vr1.type = VR_RANGE;
3609 vr1.min = ssa_name (i1);
3610 vr1.max = ssa_name (i1);
3613 t = retval = NULL_TREE;
3614 EXECUTE_IF_SET_IN_BITMAP (e2, 0, i2, bi2)
3616 value_range_t vr2 = *(vr_value[i2]);
3618 if (vr2.type == VR_VARYING || vr2.type == VR_UNDEFINED)
3620 vr2.type = VR_RANGE;
3621 vr2.min = ssa_name (i2);
3622 vr2.max = ssa_name (i2);
3625 t = compare_ranges (comp, &vr1, &vr2);
3626 if (t)
3628 /* All the ranges in the equivalent sets should compare
3629 the same. */
3630 gcc_assert (retval == NULL || t == retval);
3631 retval = t;
3635 if (retval)
3637 bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
3638 bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
3639 return retval;
3643 /* None of the equivalent ranges are useful in computing this
3644 comparison. */
3645 bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
3646 bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
3647 return NULL_TREE;
3651 /* Given a conditional predicate COND, try to determine if COND yields
3652 true or false based on the value ranges of its operands. Return
3653 BOOLEAN_TRUE_NODE if the conditional always evaluates to true,
3654 BOOLEAN_FALSE_NODE if the conditional always evaluates to false, and,
3655 NULL if the conditional cannot be evaluated at compile time.
3657 If USE_EQUIV_P is true, the ranges of all the names equivalent with
3658 the operands in COND are used when trying to compute its value.
3659 This is only used during final substitution. During propagation,
3660 we only check the range of each variable and not its equivalents. */
3662 tree
3663 vrp_evaluate_conditional (tree cond, bool use_equiv_p)
3665 gcc_assert (TREE_CODE (cond) == SSA_NAME
3666 || TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison);
3668 if (TREE_CODE (cond) == SSA_NAME)
3670 value_range_t *vr;
3671 tree retval;
3673 if (use_equiv_p)
3674 retval = compare_name_with_value (NE_EXPR, cond, boolean_false_node);
3675 else
3677 value_range_t *vr = get_value_range (cond);
3678 retval = compare_range_with_value (NE_EXPR, vr, boolean_false_node);
3681 /* If COND has a known boolean range, return it. */
3682 if (retval)
3683 return retval;
3685 /* Otherwise, if COND has a symbolic range of exactly one value,
3686 return it. */
3687 vr = get_value_range (cond);
3688 if (vr->type == VR_RANGE && vr->min == vr->max)
3689 return vr->min;
3691 else
3693 tree op0 = TREE_OPERAND (cond, 0);
3694 tree op1 = TREE_OPERAND (cond, 1);
3696 /* We only deal with integral and pointer types. */
3697 if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
3698 && !POINTER_TYPE_P (TREE_TYPE (op0)))
3699 return NULL_TREE;
3701 if (use_equiv_p)
3703 if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME)
3704 return compare_names (TREE_CODE (cond), op0, op1);
3705 else if (TREE_CODE (op0) == SSA_NAME)
3706 return compare_name_with_value (TREE_CODE (cond), op0, op1);
3707 else if (TREE_CODE (op1) == SSA_NAME)
3708 return compare_name_with_value (
3709 swap_tree_comparison (TREE_CODE (cond)), op1, op0);
3711 else
3713 value_range_t *vr0, *vr1;
3715 vr0 = (TREE_CODE (op0) == SSA_NAME) ? get_value_range (op0) : NULL;
3716 vr1 = (TREE_CODE (op1) == SSA_NAME) ? get_value_range (op1) : NULL;
3718 if (vr0 && vr1)
3719 return compare_ranges (TREE_CODE (cond), vr0, vr1);
3720 else if (vr0 && vr1 == NULL)
3721 return compare_range_with_value (TREE_CODE (cond), vr0, op1);
3722 else if (vr0 == NULL && vr1)
3723 return compare_range_with_value (
3724 swap_tree_comparison (TREE_CODE (cond)), vr1, op0);
3728 /* Anything else cannot be computed statically. */
3729 return NULL_TREE;
3733 /* Visit conditional statement STMT. If we can determine which edge
3734 will be taken out of STMT's basic block, record it in
3735 *TAKEN_EDGE_P and return SSA_PROP_INTERESTING. Otherwise, return
3736 SSA_PROP_VARYING. */
3738 static enum ssa_prop_result
3739 vrp_visit_cond_stmt (tree stmt, edge *taken_edge_p)
3741 tree cond, val;
3743 *taken_edge_p = NULL;
3745 /* FIXME. Handle SWITCH_EXPRs. But first, the assert pass needs to
3746 add ASSERT_EXPRs for them. */
3747 if (TREE_CODE (stmt) == SWITCH_EXPR)
3748 return SSA_PROP_VARYING;
3750 cond = COND_EXPR_COND (stmt);
3752 if (dump_file && (dump_flags & TDF_DETAILS))
3754 tree use;
3755 ssa_op_iter i;
3757 fprintf (dump_file, "\nVisiting conditional with predicate: ");
3758 print_generic_expr (dump_file, cond, 0);
3759 fprintf (dump_file, "\nWith known ranges\n");
3761 FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
3763 fprintf (dump_file, "\t");
3764 print_generic_expr (dump_file, use, 0);
3765 fprintf (dump_file, ": ");
3766 dump_value_range (dump_file, vr_value[SSA_NAME_VERSION (use)]);
3769 fprintf (dump_file, "\n");
3772 /* Compute the value of the predicate COND by checking the known
3773 ranges of each of its operands.
3775 Note that we cannot evaluate all the equivalent ranges here
3776 because those ranges may not yet be final and with the current
3777 propagation strategy, we cannot determine when the value ranges
3778 of the names in the equivalence set have changed.
3780 For instance, given the following code fragment
3782 i_5 = PHI <8, i_13>
3784 i_14 = ASSERT_EXPR <i_5, i_5 != 0>
3785 if (i_14 == 1)
3788 Assume that on the first visit to i_14, i_5 has the temporary
3789 range [8, 8] because the second argument to the PHI function is
3790 not yet executable. We derive the range ~[0, 0] for i_14 and the
3791 equivalence set { i_5 }. So, when we visit 'if (i_14 == 1)' for
3792 the first time, since i_14 is equivalent to the range [8, 8], we
3793 determine that the predicate is always false.
3795 On the next round of propagation, i_13 is determined to be
3796 VARYING, which causes i_5 to drop down to VARYING. So, another
3797 visit to i_14 is scheduled. In this second visit, we compute the
3798 exact same range and equivalence set for i_14, namely ~[0, 0] and
3799 { i_5 }. But we did not have the previous range for i_5
3800 registered, so vrp_visit_assignment thinks that the range for
3801 i_14 has not changed. Therefore, the predicate 'if (i_14 == 1)'
3802 is not visited again, which stops propagation from visiting
3803 statements in the THEN clause of that if().
3805 To properly fix this we would need to keep the previous range
3806 value for the names in the equivalence set. This way we would've
3807 discovered that from one visit to the other i_5 changed from
3808 range [8, 8] to VR_VARYING.
3810 However, fixing this apparent limitation may not be worth the
3811 additional checking. Testing on several code bases (GCC, DLV,
3812 MICO, TRAMP3D and SPEC2000) showed that doing this results in
3813 4 more predicates folded in SPEC. */
3814 val = vrp_evaluate_conditional (cond, false);
3815 if (val)
3816 *taken_edge_p = find_taken_edge (bb_for_stmt (stmt), val);
3818 if (dump_file && (dump_flags & TDF_DETAILS))
3820 fprintf (dump_file, "\nPredicate evaluates to: ");
3821 if (val == NULL_TREE)
3822 fprintf (dump_file, "DON'T KNOW\n");
3823 else
3824 print_generic_stmt (dump_file, val, 0);
3827 return (*taken_edge_p) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
3831 /* Evaluate statement STMT. If the statement produces a useful range,
3832 return SSA_PROP_INTERESTING and record the SSA name with the
3833 interesting range into *OUTPUT_P.
3835 If STMT is a conditional branch and we can determine its truth
3836 value, the taken edge is recorded in *TAKEN_EDGE_P.
3838 If STMT produces a varying value, return SSA_PROP_VARYING. */
3840 static enum ssa_prop_result
3841 vrp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p)
3843 tree def;
3844 ssa_op_iter iter;
3845 stmt_ann_t ann;
3847 if (dump_file && (dump_flags & TDF_DETAILS))
3849 fprintf (dump_file, "\nVisiting statement:\n");
3850 print_generic_stmt (dump_file, stmt, dump_flags);
3851 fprintf (dump_file, "\n");
3854 ann = stmt_ann (stmt);
3855 if (TREE_CODE (stmt) == MODIFY_EXPR)
3857 tree rhs = TREE_OPERAND (stmt, 1);
3859 /* In general, assignments with virtual operands are not useful
3860 for deriving ranges, with the obvious exception of calls to
3861 builtin functions. */
3862 if ((TREE_CODE (rhs) == CALL_EXPR
3863 && TREE_CODE (TREE_OPERAND (rhs, 0)) == ADDR_EXPR
3864 && DECL_P (TREE_OPERAND (TREE_OPERAND (rhs, 0), 0))
3865 && DECL_IS_BUILTIN (TREE_OPERAND (TREE_OPERAND (rhs, 0), 0)))
3866 || ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
3867 return vrp_visit_assignment (stmt, output_p);
3869 else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
3870 return vrp_visit_cond_stmt (stmt, taken_edge_p);
3872 /* All other statements produce nothing of interest for VRP, so mark
3873 their outputs varying and prevent further simulation. */
3874 FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
3875 set_value_range_to_varying (get_value_range (def));
3877 return SSA_PROP_VARYING;
3881 /* Meet operation for value ranges. Given two value ranges VR0 and
3882 VR1, store in VR0 the result of meeting VR0 and VR1.
3884 The meeting rules are as follows:
3886 1- If VR0 and VR1 have an empty intersection, set VR0 to VR_VARYING.
3888 2- If VR0 and VR1 have a non-empty intersection, set VR0 to the
3889 union of VR0 and VR1. */
3891 static void
3892 vrp_meet (value_range_t *vr0, value_range_t *vr1)
3894 if (vr0->type == VR_UNDEFINED)
3896 copy_value_range (vr0, vr1);
3897 return;
3900 if (vr1->type == VR_UNDEFINED)
3902 /* Nothing to do. VR0 already has the resulting range. */
3903 return;
3906 if (vr0->type == VR_VARYING)
3908 /* Nothing to do. VR0 already has the resulting range. */
3909 return;
3912 if (vr1->type == VR_VARYING)
3914 set_value_range_to_varying (vr0);
3915 return;
3918 if (vr0->type == VR_RANGE && vr1->type == VR_RANGE)
3920 /* If VR0 and VR1 have a non-empty intersection, compute the
3921 union of both ranges. */
3922 if (value_ranges_intersect_p (vr0, vr1))
3924 int cmp;
3925 tree min, max;
3927 /* The lower limit of the new range is the minimum of the
3928 two ranges. If they cannot be compared, the result is
3929 VARYING. */
3930 cmp = compare_values (vr0->min, vr1->min);
3931 if (cmp == 0 || cmp == 1)
3932 min = vr1->min;
3933 else if (cmp == -1)
3934 min = vr0->min;
3935 else
3937 set_value_range_to_varying (vr0);
3938 return;
3941 /* Similarly, the upper limit of the new range is the
3942 maximum of the two ranges. If they cannot be compared,
3943 the result is VARYING. */
3944 cmp = compare_values (vr0->max, vr1->max);
3945 if (cmp == 0 || cmp == -1)
3946 max = vr1->max;
3947 else if (cmp == 1)
3948 max = vr0->max;
3949 else
3951 set_value_range_to_varying (vr0);
3952 return;
3955 /* The resulting set of equivalences is the intersection of
3956 the two sets. */
3957 if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
3958 bitmap_and_into (vr0->equiv, vr1->equiv);
3959 else if (vr0->equiv && !vr1->equiv)
3960 bitmap_clear (vr0->equiv);
3962 set_value_range (vr0, vr0->type, min, max, vr0->equiv);
3964 else
3965 goto no_meet;
3967 else if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
3969 /* Two anti-ranges meet only if they are both identical. */
3970 if (compare_values (vr0->min, vr1->min) == 0
3971 && compare_values (vr0->max, vr1->max) == 0
3972 && compare_values (vr0->min, vr0->max) == 0)
3974 /* The resulting set of equivalences is the intersection of
3975 the two sets. */
3976 if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
3977 bitmap_and_into (vr0->equiv, vr1->equiv);
3978 else if (vr0->equiv && !vr1->equiv)
3979 bitmap_clear (vr0->equiv);
3981 else
3982 goto no_meet;
3984 else if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
3986 /* A numeric range [VAL1, VAL2] and an anti-range ~[VAL3, VAL4]
3987 meet only if the ranges have an empty intersection. The
3988 result of the meet operation is the anti-range. */
3989 if (!symbolic_range_p (vr0)
3990 && !symbolic_range_p (vr1)
3991 && !value_ranges_intersect_p (vr0, vr1))
3993 /* Copy most of VR1 into VR0. Don't copy VR1's equivalence
3994 set. We need to compute the intersection of the two
3995 equivalence sets. */
3996 if (vr1->type == VR_ANTI_RANGE)
3997 set_value_range (vr0, vr1->type, vr1->min, vr1->max, vr0->equiv);
3999 /* The resulting set of equivalences is the intersection of
4000 the two sets. */
4001 if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
4002 bitmap_and_into (vr0->equiv, vr1->equiv);
4003 else if (vr0->equiv && !vr1->equiv)
4004 bitmap_clear (vr0->equiv);
4006 else
4007 goto no_meet;
4009 else
4010 gcc_unreachable ();
4012 return;
4014 no_meet:
4015 /* The two range VR0 and VR1 do not meet. Before giving up and
4016 setting the result to VARYING, see if we can at least derive a
4017 useful anti-range. FIXME, all this nonsense about distinguishing
4018 anti-ranges from ranges is necessary because of the odd
4019 semantics of range_includes_zero_p and friends. */
4020 if (!symbolic_range_p (vr0)
4021 && ((vr0->type == VR_RANGE && !range_includes_zero_p (vr0))
4022 || (vr0->type == VR_ANTI_RANGE && range_includes_zero_p (vr0)))
4023 && !symbolic_range_p (vr1)
4024 && ((vr1->type == VR_RANGE && !range_includes_zero_p (vr1))
4025 || (vr1->type == VR_ANTI_RANGE && range_includes_zero_p (vr1))))
4027 set_value_range_to_nonnull (vr0, TREE_TYPE (vr0->min));
4029 /* Since this meet operation did not result from the meeting of
4030 two equivalent names, VR0 cannot have any equivalences. */
4031 if (vr0->equiv)
4032 bitmap_clear (vr0->equiv);
4034 else
4035 set_value_range_to_varying (vr0);
4039 /* Visit all arguments for PHI node PHI that flow through executable
4040 edges. If a valid value range can be derived from all the incoming
4041 value ranges, set a new range for the LHS of PHI. */
4043 static enum ssa_prop_result
4044 vrp_visit_phi_node (tree phi)
4046 int i;
4047 tree lhs = PHI_RESULT (phi);
4048 value_range_t *lhs_vr = get_value_range (lhs);
4049 value_range_t vr_result = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
4051 copy_value_range (&vr_result, lhs_vr);
4053 if (dump_file && (dump_flags & TDF_DETAILS))
4055 fprintf (dump_file, "\nVisiting PHI node: ");
4056 print_generic_expr (dump_file, phi, dump_flags);
4059 for (i = 0; i < PHI_NUM_ARGS (phi); i++)
4061 edge e = PHI_ARG_EDGE (phi, i);
4063 if (dump_file && (dump_flags & TDF_DETAILS))
4065 fprintf (dump_file,
4066 "\n Argument #%d (%d -> %d %sexecutable)\n",
4067 i, e->src->index, e->dest->index,
4068 (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
4071 if (e->flags & EDGE_EXECUTABLE)
4073 tree arg = PHI_ARG_DEF (phi, i);
4074 value_range_t vr_arg;
4076 if (TREE_CODE (arg) == SSA_NAME)
4077 vr_arg = *(get_value_range (arg));
4078 else
4080 vr_arg.type = VR_RANGE;
4081 vr_arg.min = arg;
4082 vr_arg.max = arg;
4083 vr_arg.equiv = NULL;
4086 if (dump_file && (dump_flags & TDF_DETAILS))
4088 fprintf (dump_file, "\t");
4089 print_generic_expr (dump_file, arg, dump_flags);
4090 fprintf (dump_file, "\n\tValue: ");
4091 dump_value_range (dump_file, &vr_arg);
4092 fprintf (dump_file, "\n");
4095 vrp_meet (&vr_result, &vr_arg);
4097 if (vr_result.type == VR_VARYING)
4098 break;
4102 if (vr_result.type == VR_VARYING)
4103 goto varying;
4105 /* To prevent infinite iterations in the algorithm, derive ranges
4106 when the new value is slightly bigger or smaller than the
4107 previous one. */
4108 if (lhs_vr->type == VR_RANGE && vr_result.type == VR_RANGE)
4110 if (!POINTER_TYPE_P (TREE_TYPE (lhs)))
4112 int cmp_min = compare_values (lhs_vr->min, vr_result.min);
4113 int cmp_max = compare_values (lhs_vr->max, vr_result.max);
4115 /* If the new minimum is smaller or larger than the previous
4116 one, go all the way to -INF. In the first case, to avoid
4117 iterating millions of times to reach -INF, and in the
4118 other case to avoid infinite bouncing between different
4119 minimums. */
4120 if (cmp_min > 0 || cmp_min < 0)
4121 vr_result.min = TYPE_MIN_VALUE (TREE_TYPE (vr_result.min));
4123 /* Similarly, if the new maximum is smaller or larger than
4124 the previous one, go all the way to +INF. */
4125 if (cmp_max < 0 || cmp_max > 0)
4126 vr_result.max = TYPE_MAX_VALUE (TREE_TYPE (vr_result.max));
4128 /* If we ended up with a (-INF, +INF) range, set it to
4129 VARYING. */
4130 if (vr_result.min == TYPE_MIN_VALUE (TREE_TYPE (vr_result.min))
4131 && vr_result.max == TYPE_MAX_VALUE (TREE_TYPE (vr_result.max)))
4132 goto varying;
4136 /* If the new range is different than the previous value, keep
4137 iterating. */
4138 if (update_value_range (lhs, &vr_result))
4139 return SSA_PROP_INTERESTING;
4141 /* Nothing changed, don't add outgoing edges. */
4142 return SSA_PROP_NOT_INTERESTING;
4144 /* No match found. Set the LHS to VARYING. */
4145 varying:
4146 set_value_range_to_varying (lhs_vr);
4147 return SSA_PROP_VARYING;
4150 /* Simplify a division or modulo operator to a right shift or
4151 bitwise and if the first operand is unsigned or is greater
4152 than zero and the second operand is an exact power of two. */
4154 static void
4155 simplify_div_or_mod_using_ranges (tree stmt, tree rhs, enum tree_code rhs_code)
4157 tree val = NULL;
4158 tree op = TREE_OPERAND (rhs, 0);
4159 value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
4161 if (TYPE_UNSIGNED (TREE_TYPE (op)))
4163 val = integer_one_node;
4165 else
4167 val = compare_range_with_value (GT_EXPR, vr, integer_zero_node);
4170 if (val && integer_onep (val))
4172 tree t;
4173 tree op0 = TREE_OPERAND (rhs, 0);
4174 tree op1 = TREE_OPERAND (rhs, 1);
4176 if (rhs_code == TRUNC_DIV_EXPR)
4178 t = build_int_cst (NULL_TREE, tree_log2 (op1));
4179 t = build2 (RSHIFT_EXPR, TREE_TYPE (op0), op0, t);
4181 else
4183 t = build_int_cst (TREE_TYPE (op1), 1);
4184 t = int_const_binop (MINUS_EXPR, op1, t, 0);
4185 t = fold_convert (TREE_TYPE (op0), t);
4186 t = build2 (BIT_AND_EXPR, TREE_TYPE (op0), op0, t);
4189 TREE_OPERAND (stmt, 1) = t;
4190 update_stmt (stmt);
4194 /* If the operand to an ABS_EXPR is >= 0, then eliminate the
4195 ABS_EXPR. If the operand is <= 0, then simplify the
4196 ABS_EXPR into a NEGATE_EXPR. */
4198 static void
4199 simplify_abs_using_ranges (tree stmt, tree rhs)
4201 tree val = NULL;
4202 tree op = TREE_OPERAND (rhs, 0);
4203 tree type = TREE_TYPE (op);
4204 value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
4206 if (TYPE_UNSIGNED (type))
4208 val = integer_zero_node;
4210 else if (vr)
4212 val = compare_range_with_value (LE_EXPR, vr, integer_zero_node);
4213 if (!val)
4215 val = compare_range_with_value (GE_EXPR, vr, integer_zero_node);
4217 if (val)
4219 if (integer_zerop (val))
4220 val = integer_one_node;
4221 else if (integer_onep (val))
4222 val = integer_zero_node;
4226 if (val
4227 && (integer_onep (val) || integer_zerop (val)))
4229 tree t;
4231 if (integer_onep (val))
4232 t = build1 (NEGATE_EXPR, TREE_TYPE (op), op);
4233 else
4234 t = op;
4236 TREE_OPERAND (stmt, 1) = t;
4237 update_stmt (stmt);
4242 /* We are comparing trees OP0 and OP1 using COND_CODE. OP0 has
4243 a known value range VR.
4245 If there is one and only one value which will satisfy the
4246 conditional, then return that value. Else return NULL. */
4248 static tree
4249 test_for_singularity (enum tree_code cond_code, tree op0,
4250 tree op1, value_range_t *vr)
4252 tree min = NULL;
4253 tree max = NULL;
4255 /* Extract minimum/maximum values which satisfy the
4256 the conditional as it was written. */
4257 if (cond_code == LE_EXPR || cond_code == LT_EXPR)
4259 min = TYPE_MIN_VALUE (TREE_TYPE (op0));
4261 max = op1;
4262 if (cond_code == LT_EXPR)
4264 tree one = build_int_cst (TREE_TYPE (op0), 1);
4265 max = fold_build2 (MINUS_EXPR, TREE_TYPE (op0), max, one);
4268 else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
4270 max = TYPE_MAX_VALUE (TREE_TYPE (op0));
4272 min = op1;
4273 if (cond_code == GT_EXPR)
4275 tree one = build_int_cst (TREE_TYPE (op0), 1);
4276 min = fold_build2 (PLUS_EXPR, TREE_TYPE (op0), min, one);
4280 /* Now refine the minimum and maximum values using any
4281 value range information we have for op0. */
4282 if (min && max)
4284 if (compare_values (vr->min, min) == -1)
4285 min = min;
4286 else
4287 min = vr->min;
4288 if (compare_values (vr->max, max) == 1)
4289 max = max;
4290 else
4291 max = vr->max;
4293 /* If the new min/max values have converged to a single value,
4294 then there is only one value which can satisfy the condition,
4295 return that value. */
4296 if (operand_equal_p (min, max, 0) && is_gimple_min_invariant (min))
4297 return min;
4299 return NULL;
4302 /* Simplify a conditional using a relational operator to an equality
4303 test if the range information indicates only one value can satisfy
4304 the original conditional. */
4306 static void
4307 simplify_cond_using_ranges (tree stmt)
4309 tree cond = COND_EXPR_COND (stmt);
4310 tree op0 = TREE_OPERAND (cond, 0);
4311 tree op1 = TREE_OPERAND (cond, 1);
4312 enum tree_code cond_code = TREE_CODE (cond);
4314 if (cond_code != NE_EXPR
4315 && cond_code != EQ_EXPR
4316 && TREE_CODE (op0) == SSA_NAME
4317 && INTEGRAL_TYPE_P (TREE_TYPE (op0))
4318 && is_gimple_min_invariant (op1))
4320 value_range_t *vr = get_value_range (op0);
4322 /* If we have range information for OP0, then we might be
4323 able to simplify this conditional. */
4324 if (vr->type == VR_RANGE)
4326 tree new = test_for_singularity (cond_code, op0, op1, vr);
4328 if (new)
4330 if (dump_file)
4332 fprintf (dump_file, "Simplified relational ");
4333 print_generic_expr (dump_file, cond, 0);
4334 fprintf (dump_file, " into ");
4337 COND_EXPR_COND (stmt)
4338 = build2 (EQ_EXPR, boolean_type_node, op0, new);
4339 update_stmt (stmt);
4341 if (dump_file)
4343 print_generic_expr (dump_file, COND_EXPR_COND (stmt), 0);
4344 fprintf (dump_file, "\n");
4346 return;
4350 /* Try again after inverting the condition. We only deal
4351 with integral types here, so no need to worry about
4352 issues with inverting FP comparisons. */
4353 cond_code = invert_tree_comparison (cond_code, false);
4354 new = test_for_singularity (cond_code, op0, op1, vr);
4356 if (new)
4358 if (dump_file)
4360 fprintf (dump_file, "Simplified relational ");
4361 print_generic_expr (dump_file, cond, 0);
4362 fprintf (dump_file, " into ");
4365 COND_EXPR_COND (stmt)
4366 = build2 (NE_EXPR, boolean_type_node, op0, new);
4367 update_stmt (stmt);
4369 if (dump_file)
4371 print_generic_expr (dump_file, COND_EXPR_COND (stmt), 0);
4372 fprintf (dump_file, "\n");
4374 return;
4381 /* Simplify STMT using ranges if possible. */
4383 void
4384 simplify_stmt_using_ranges (tree stmt)
4386 if (TREE_CODE (stmt) == MODIFY_EXPR)
4388 tree rhs = TREE_OPERAND (stmt, 1);
4389 enum tree_code rhs_code = TREE_CODE (rhs);
4391 /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
4392 and BIT_AND_EXPR respectively if the first operand is greater
4393 than zero and the second operand is an exact power of two. */
4394 if ((rhs_code == TRUNC_DIV_EXPR || rhs_code == TRUNC_MOD_EXPR)
4395 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0)))
4396 && integer_pow2p (TREE_OPERAND (rhs, 1)))
4397 simplify_div_or_mod_using_ranges (stmt, rhs, rhs_code);
4399 /* Transform ABS (X) into X or -X as appropriate. */
4400 if (rhs_code == ABS_EXPR
4401 && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME
4402 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0))))
4403 simplify_abs_using_ranges (stmt, rhs);
4405 else if (TREE_CODE (stmt) == COND_EXPR
4406 && COMPARISON_CLASS_P (COND_EXPR_COND (stmt)))
4408 simplify_cond_using_ranges (stmt);
4412 /* Stack of dest,src equivalency pairs that need to be restored after
4413 each attempt to thread a block's incoming edge to an outgoing edge.
4415 A NULL entry is used to mark the end of pairs which need to be
4416 restored. */
4417 static VEC(tree,heap) *stack;
4419 /* A trivial wrapper so that we can present the generic jump
4420 threading code with a simple API for simplifying statements. */
4421 static tree
4422 simplify_stmt_for_jump_threading (tree stmt)
4424 /* We only use VRP information to simplify conditionals. This is
4425 overly conservative, but it's unclear if doing more would be
4426 worth the compile time cost. */
4427 if (TREE_CODE (stmt) != COND_EXPR)
4428 return NULL;
4430 return vrp_evaluate_conditional (COND_EXPR_COND (stmt), true);
4433 /* Blocks which have more than one predecessor and more than
4434 one successor present jump threading opportunities. ie,
4435 when the block is reached from a specific predecessor, we
4436 may be able to determine which of the outgoing edges will
4437 be traversed. When this optimization applies, we are able
4438 to avoid conditionals at runtime and we may expose secondary
4439 optimization opportunities.
4441 This routine is effectively a driver for the generic jump
4442 threading code. It basically just presents the generic code
4443 with edges that may be suitable for jump threading.
4445 Unlike DOM, we do not iterate VRP if jump threading was successful.
4446 While iterating may expose new opportunities for VRP, it is expected
4447 those opportunities would be very limited and the compile time cost
4448 to expose those opportunities would be significant.
4450 As jump threading opportunities are discovered, they are registered
4451 for later realization. */
4453 static void
4454 identify_jump_threads (void)
4456 basic_block bb;
4457 tree dummy;
4459 /* Ugh. When substituting values earlier in this pass we can
4460 wipe the dominance information. So rebuild the dominator
4461 information as we need it within the jump threading code. */
4462 calculate_dominance_info (CDI_DOMINATORS);
4464 /* We do not allow VRP information to be used for jump threading
4465 across a back edge in the CFG. Otherwise it becomes too
4466 difficult to avoid eliminating loop exit tests. Of course
4467 EDGE_DFS_BACK is not accurate at this time so we have to
4468 recompute it. */
4469 mark_dfs_back_edges ();
4471 /* Allocate our unwinder stack to unwind any temporary equivalences
4472 that might be recorded. */
4473 stack = VEC_alloc (tree, heap, 20);
4475 /* To avoid lots of silly node creation, we create a single
4476 conditional and just modify it in-place when attempting to
4477 thread jumps. */
4478 dummy = build2 (EQ_EXPR, boolean_type_node, NULL, NULL);
4479 dummy = build3 (COND_EXPR, void_type_node, dummy, NULL, NULL);
4481 /* Walk through all the blocks finding those which present a
4482 potential jump threading opportunity. We could set this up
4483 as a dominator walker and record data during the walk, but
4484 I doubt it's worth the effort for the classes of jump
4485 threading opportunities we are trying to identify at this
4486 point in compilation. */
4487 FOR_EACH_BB (bb)
4489 tree last, cond;
4491 /* If the generic jump threading code does not find this block
4492 interesting, then there is nothing to do. */
4493 if (! potentially_threadable_block (bb))
4494 continue;
4496 /* We only care about blocks ending in a COND_EXPR. While there
4497 may be some value in handling SWITCH_EXPR here, I doubt it's
4498 terribly important. */
4499 last = bsi_stmt (bsi_last (bb));
4500 if (TREE_CODE (last) != COND_EXPR)
4501 continue;
4503 /* We're basically looking for any kind of conditional with
4504 integral type arguments. */
4505 cond = COND_EXPR_COND (last);
4506 if ((TREE_CODE (cond) == SSA_NAME
4507 && INTEGRAL_TYPE_P (TREE_TYPE (cond)))
4508 || (COMPARISON_CLASS_P (cond)
4509 && TREE_CODE (TREE_OPERAND (cond, 0)) == SSA_NAME
4510 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (cond, 0)))
4511 && (TREE_CODE (TREE_OPERAND (cond, 1)) == SSA_NAME
4512 || is_gimple_min_invariant (TREE_OPERAND (cond, 1)))
4513 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (cond, 1)))))
4515 edge_iterator ei;
4516 edge e;
4518 /* We've got a block with multiple predecessors and multiple
4519 successors which also ends in a suitable conditional. For
4520 each predecessor, see if we can thread it to a specific
4521 successor. */
4522 FOR_EACH_EDGE (e, ei, bb->preds)
4524 /* Do not thread across back edges or abnormal edges
4525 in the CFG. */
4526 if (e->flags & (EDGE_DFS_BACK | EDGE_COMPLEX))
4527 continue;
4529 thread_across_edge (dummy, e, true,
4530 &stack,
4531 simplify_stmt_for_jump_threading);
4536 /* We do not actually update the CFG or SSA graphs at this point as
4537 ASSERT_EXPRs are still in the IL and cfg cleanup code does not yet
4538 handle ASSERT_EXPRs gracefully. */
4541 /* We identified all the jump threading opportunities earlier, but could
4542 not transform the CFG at that time. This routine transforms the
4543 CFG and arranges for the dominator tree to be rebuilt if necessary.
4545 Note the SSA graph update will occur during the normal TODO
4546 processing by the pass manager. */
4547 static void
4548 finalize_jump_threads (void)
4550 bool cfg_altered = false;
4551 cfg_altered = thread_through_all_blocks ();
4553 /* If we threaded jumps, then we need to recompute the dominance
4554 information, to safely do that we must clean up the CFG first. */
4555 if (cfg_altered)
4557 free_dominance_info (CDI_DOMINATORS);
4558 cleanup_tree_cfg ();
4559 calculate_dominance_info (CDI_DOMINATORS);
4561 VEC_free (tree, heap, stack);
4565 /* Traverse all the blocks folding conditionals with known ranges. */
4567 static void
4568 vrp_finalize (void)
4570 size_t i;
4571 prop_value_t *single_val_range;
4572 bool do_value_subst_p;
4574 if (dump_file)
4576 fprintf (dump_file, "\nValue ranges after VRP:\n\n");
4577 dump_all_value_ranges (dump_file);
4578 fprintf (dump_file, "\n");
4581 /* We may have ended with ranges that have exactly one value. Those
4582 values can be substituted as any other copy/const propagated
4583 value using substitute_and_fold. */
4584 single_val_range = XNEWVEC (prop_value_t, num_ssa_names);
4585 memset (single_val_range, 0, num_ssa_names * sizeof (*single_val_range));
4587 do_value_subst_p = false;
4588 for (i = 0; i < num_ssa_names; i++)
4589 if (vr_value[i]
4590 && vr_value[i]->type == VR_RANGE
4591 && vr_value[i]->min == vr_value[i]->max)
4593 single_val_range[i].value = vr_value[i]->min;
4594 do_value_subst_p = true;
4597 if (!do_value_subst_p)
4599 /* We found no single-valued ranges, don't waste time trying to
4600 do single value substitution in substitute_and_fold. */
4601 free (single_val_range);
4602 single_val_range = NULL;
4605 substitute_and_fold (single_val_range, true);
4607 /* We must identify jump threading opportunities before we release
4608 the datastructures built by VRP. */
4609 identify_jump_threads ();
4611 /* Free allocated memory. */
4612 for (i = 0; i < num_ssa_names; i++)
4613 if (vr_value[i])
4615 BITMAP_FREE (vr_value[i]->equiv);
4616 free (vr_value[i]);
4619 free (single_val_range);
4620 free (vr_value);
4622 /* So that we can distinguish between VRP data being available
4623 and not available. */
4624 vr_value = NULL;
4628 /* Main entry point to VRP (Value Range Propagation). This pass is
4629 loosely based on J. R. C. Patterson, ``Accurate Static Branch
4630 Prediction by Value Range Propagation,'' in SIGPLAN Conference on
4631 Programming Language Design and Implementation, pp. 67-78, 1995.
4632 Also available at http://citeseer.ist.psu.edu/patterson95accurate.html
4634 This is essentially an SSA-CCP pass modified to deal with ranges
4635 instead of constants.
4637 While propagating ranges, we may find that two or more SSA name
4638 have equivalent, though distinct ranges. For instance,
4640 1 x_9 = p_3->a;
4641 2 p_4 = ASSERT_EXPR <p_3, p_3 != 0>
4642 3 if (p_4 == q_2)
4643 4 p_5 = ASSERT_EXPR <p_4, p_4 == q_2>;
4644 5 endif
4645 6 if (q_2)
4647 In the code above, pointer p_5 has range [q_2, q_2], but from the
4648 code we can also determine that p_5 cannot be NULL and, if q_2 had
4649 a non-varying range, p_5's range should also be compatible with it.
4651 These equivalences are created by two expressions: ASSERT_EXPR and
4652 copy operations. Since p_5 is an assertion on p_4, and p_4 was the
4653 result of another assertion, then we can use the fact that p_5 and
4654 p_4 are equivalent when evaluating p_5's range.
4656 Together with value ranges, we also propagate these equivalences
4657 between names so that we can take advantage of information from
4658 multiple ranges when doing final replacement. Note that this
4659 equivalency relation is transitive but not symmetric.
4661 In the example above, p_5 is equivalent to p_4, q_2 and p_3, but we
4662 cannot assert that q_2 is equivalent to p_5 because q_2 may be used
4663 in contexts where that assertion does not hold (e.g., in line 6).
4665 TODO, the main difference between this pass and Patterson's is that
4666 we do not propagate edge probabilities. We only compute whether
4667 edges can be taken or not. That is, instead of having a spectrum
4668 of jump probabilities between 0 and 1, we only deal with 0, 1 and
4669 DON'T KNOW. In the future, it may be worthwhile to propagate
4670 probabilities to aid branch prediction. */
4672 static unsigned int
4673 execute_vrp (void)
4675 insert_range_assertions ();
4677 current_loops = loop_optimizer_init (LOOPS_NORMAL);
4678 if (current_loops)
4679 scev_initialize (current_loops);
4681 vrp_initialize ();
4682 ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
4683 vrp_finalize ();
4685 if (current_loops)
4687 scev_finalize ();
4688 loop_optimizer_finalize (current_loops);
4689 current_loops = NULL;
4692 /* ASSERT_EXPRs must be removed before finalizing jump threads
4693 as finalizing jump threads calls the CFG cleanup code which
4694 does not properly handle ASSERT_EXPRs. */
4695 remove_range_assertions ();
4697 /* If we exposed any new variables, go ahead and put them into
4698 SSA form now, before we handle jump threading. This simplifies
4699 interactions between rewriting of _DECL nodes into SSA form
4700 and rewriting SSA_NAME nodes into SSA form after block
4701 duplication and CFG manipulation. */
4702 update_ssa (TODO_update_ssa);
4704 finalize_jump_threads ();
4705 return 0;
4708 static bool
4709 gate_vrp (void)
4711 return flag_tree_vrp != 0;
4714 struct tree_opt_pass pass_vrp =
4716 "vrp", /* name */
4717 gate_vrp, /* gate */
4718 execute_vrp, /* execute */
4719 NULL, /* sub */
4720 NULL, /* next */
4721 0, /* static_pass_number */
4722 TV_TREE_VRP, /* tv_id */
4723 PROP_ssa | PROP_alias, /* properties_required */
4724 0, /* properties_provided */
4725 PROP_smt_usage, /* properties_destroyed */
4726 0, /* todo_flags_start */
4727 TODO_cleanup_cfg
4728 | TODO_ggc_collect
4729 | TODO_verify_ssa
4730 | TODO_dump_func
4731 | TODO_update_ssa
4732 | TODO_update_smt_usage, /* todo_flags_finish */
4733 0 /* letter */