summaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2007-05-23 05:53:21 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2007-05-23 05:53:21 +0000
commitafc1ad6d9d3953447896c8b9c6cb6248c7ae0f48 (patch)
tree1980beba6fedbc0a5a4d5ca82a97a041f1f61a73 /gcc/tree-vrp.c
parent15312fe8a91102f9fd8ed9fcab3d63906ba0773b (diff)
downloadgcc-afc1ad6d9d3953447896c8b9c6cb6248c7ae0f48.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@124981 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index efb4f6890d8..dda5dd18cb0 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);