mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-28 23:21:16 +08:00
tree-vrp.c (avoid_overflow_infinity): New static function, broken out of set_value_range_to_value.
* 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. From-SVN: r124981
This commit is contained in:
parent
24016fdb16
commit
b80cca7b47
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user