aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2007-03-11 15:53:30 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2007-03-11 15:53:30 +0000
commitd7419dec458b277eb34ed15a3895c166fc47f93b (patch)
treeb7ce9f769a469cdb7f4b5350f43afde469788df8 /gcc/tree-vrp.c
parentbd91a8c4edadd47b17270c27e222cdca9472b534 (diff)
downloadgcc-d7419dec458b277eb34ed15a3895c166fc47f93b.zip
gcc-d7419dec458b277eb34ed15a3895c166fc47f93b.tar.gz
gcc-d7419dec458b277eb34ed15a3895c166fc47f93b.tar.bz2
tree-vrp.c (vrp_int_const_binop): Handle PLUS_EXPR and the *_DIV_EXPR codes correctly with overflow infinities.
* tree-vrp.c (vrp_int_const_binop): Handle PLUS_EXPR and the *_DIV_EXPR codes correctly with overflow infinities. From-SVN: r122820
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index dcb5f6a..d3fd911 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -1519,15 +1519,26 @@ vrp_int_const_binop (enum tree_code code, tree val1, tree val2)
&& !supports_overflow_infinity (TREE_TYPE (res)))
return NULL_TREE;
- /* We have to punt on subtracting infinities of the same sign,
- since we can't tell what the sign of the result should
- be. */
- if (code == MINUS_EXPR
- && sgn1 == sgn2
+ /* We have to punt on adding infinities of different signs,
+ since we can't tell what the sign of the result should be.
+ Likewise for subtracting infinities of the same sign. */
+ if (((code == PLUS_EXPR && sgn1 != sgn2)
+ || (code == MINUS_EXPR && sgn1 == sgn2))
&& is_overflow_infinity (val1)
&& is_overflow_infinity (val2))
return NULL_TREE;
+ /* Don't try to handle division or shifting of infinities. */
+ if ((code == TRUNC_DIV_EXPR
+ || code == FLOOR_DIV_EXPR
+ || code == CEIL_DIV_EXPR
+ || code == EXACT_DIV_EXPR
+ || code == ROUND_DIV_EXPR
+ || code == RSHIFT_EXPR)
+ && (is_overflow_infinity (val1)
+ || is_overflow_infinity (val2)))
+ return NULL_TREE;
+
/* Notice that we only need to handle the restricted set of
operations handled by extract_range_from_binary_expr.
Among them, only multiplication, addition and subtraction
@@ -1541,8 +1552,12 @@ vrp_int_const_binop (enum tree_code code, tree val1, tree val2)
if ((code == MULT_EXPR && sgn1 == sgn2)
/* For addition, the operands must be of the same sign
to yield an overflow. Its sign is therefore that
- of one of the operands, for example the first. */
- || (code == PLUS_EXPR && sgn1 > 0)
+ of one of the operands, for example the first. For
+ infinite operands X + -INF is negative, not positive. */
+ || (code == PLUS_EXPR
+ && (sgn1 >= 0
+ ? !is_negative_overflow_infinity (val2)
+ : is_positive_overflow_infinity (val2)))
/* For subtraction, non-infinite operands must be of
different signs to yield an overflow. Its sign is
therefore that of the first operand or the opposite of