aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/tree-vrp.c37
2 files changed, 31 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c882b1e..ab1dc58 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+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
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index efb4f68..dda5dd1 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -201,6 +201,27 @@ is_overflow_infinity (tree val)
|| 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
@@ -361,19 +382,7 @@ static inline void
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);
}
@@ -1103,6 +1112,8 @@ extract_range_from_assert (value_range_t *vr_p, tree expr)
cond_code = swap_tree_comparison (TREE_CODE (cond));
}
+ limit = avoid_overflow_infinity (limit);
+
type = TREE_TYPE (limit);
gcc_assert (limit != var);