+2007-05-22 Ian Lance Taylor <iant@google.com>
+
+ * tree-vrp.c (avoid_overflow_infinity): New static function,
+ broken out of set_value_range_to_value.
+ (set_value_range_to_value): Call avoid_overflow_infinity.
+ (extract_range_from_assert): Likewise.
+
2007-05-22 Andrew Pinski <andrew_pinski@playstation.sony.com>
PR middle-end/31095
|| operand_equal_p (val, TYPE_MIN_VALUE (TREE_TYPE (val)), 0)));
}
+/* If VAL is now an overflow infinity, return VAL. Otherwise, return
+ the same value with TREE_OVERFLOW clear. This can be used to avoid
+ confusing a regular value with an overflow value. */
+
+static inline tree
+avoid_overflow_infinity (tree val)
+{
+ if (!is_overflow_infinity (val))
+ return val;
+
+ if (operand_equal_p (val, TYPE_MAX_VALUE (TREE_TYPE (val)), 0))
+ return TYPE_MAX_VALUE (TREE_TYPE (val));
+ else
+ {
+#ifdef ENABLE_CHECKING
+ gcc_assert (operand_equal_p (val, TYPE_MIN_VALUE (TREE_TYPE (val)), 0));
+#endif
+ return TYPE_MIN_VALUE (TREE_TYPE (val));
+ }
+}
+
/* Return whether VAL is equal to the maximum value of its type. This
will be true for a positive overflow infinity. We can't do a
set_value_range_to_value (value_range_t *vr, tree val, bitmap equiv)
{
gcc_assert (is_gimple_min_invariant (val));
- if (is_overflow_infinity (val))
- {
- if (operand_equal_p (val, TYPE_MAX_VALUE (TREE_TYPE (val)), 0))
- val = TYPE_MAX_VALUE (TREE_TYPE (val));
- else
- {
-#ifdef ENABLE_CHECKING
- gcc_assert (operand_equal_p (val,
- TYPE_MIN_VALUE (TREE_TYPE (val)), 0));
-#endif
- val = TYPE_MIN_VALUE (TREE_TYPE (val));
- }
- }
+ val = avoid_overflow_infinity (val);
set_value_range (vr, VR_RANGE, val, val, equiv);
}
cond_code = swap_tree_comparison (TREE_CODE (cond));
}
+ limit = avoid_overflow_infinity (limit);
+
type = TREE_TYPE (limit);
gcc_assert (limit != var);