diff options
author | Ian Lance Taylor <iant@google.com> | 2007-03-11 15:53:30 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2007-03-11 15:53:30 +0000 |
commit | d7419dec458b277eb34ed15a3895c166fc47f93b (patch) | |
tree | b7ce9f769a469cdb7f4b5350f43afde469788df8 /gcc/tree-vrp.c | |
parent | bd91a8c4edadd47b17270c27e222cdca9472b534 (diff) | |
download | gcc-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.c | 29 |
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 |