aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
authorJames A. Morrison <phython@gcc.gnu.org>2005-08-06 05:35:31 +0000
committerJames A. Morrison <phython@gcc.gnu.org>2005-08-06 05:35:31 +0000
commitb17775aba4c709c1fc3f19af33d50b025e3891f4 (patch)
tree2e47c97b535d7d1d721621ee6339c61536de7863 /gcc/tree-vrp.c
parent099f36ab8c55844ae47def2f3cacaef7d006d441 (diff)
downloadgcc-b17775aba4c709c1fc3f19af33d50b025e3891f4.zip
gcc-b17775aba4c709c1fc3f19af33d50b025e3891f4.tar.gz
gcc-b17775aba4c709c1fc3f19af33d50b025e3891f4.tar.bz2
re PR tree-optimization/23128 (VRP fails for unsigned values)
2005-08-05 James A. Morrison <phython@gcc.gnu.org> PR tree-optimization/23128 * tree-vrp.c (vrp_int_const_binop): Check if unsigned addition or subtraction wrap, and set TREE_OVERFLOW if they do. From-SVN: r102800
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 68bcb1e..a77be84 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -915,12 +915,25 @@ vrp_int_const_binop (enum tree_code code, tree val1, tree val2)
on -INF and +INF. */
res = int_const_binop (code, val1, val2, 0);
+ if (TYPE_UNSIGNED (TREE_TYPE (val1)))
+ {
+ int checkz = compare_values (res, val1);
+
+ /* Ensure that res = val1 + val2 >= val1
+ or that res = val1 - val2 <= val1. */
+ if ((code == PLUS_EXPR && !(checkz == 1 || checkz == 0))
+ || (code == MINUS_EXPR && !(checkz == 0 || checkz == -1)))
+ {
+ res = copy_node (res);
+ TREE_OVERFLOW (res) = 1;
+ }
+ }
/* If the operation overflowed but neither VAL1 nor VAL2 are
overflown, return -INF or +INF depending on the operation
and the combination of signs of the operands. */
- if (TREE_OVERFLOW (res)
- && !TREE_OVERFLOW (val1)
- && !TREE_OVERFLOW (val2))
+ else if (TREE_OVERFLOW (res)
+ && !TREE_OVERFLOW (val1)
+ && !TREE_OVERFLOW (val2))
{
int sgn1 = tree_int_cst_sgn (val1);
int sgn2 = tree_int_cst_sgn (val2);