diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-06-09 12:39:11 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-06-09 12:39:11 +0000 |
commit | 0086a3d6f91f6b6adecf17f1399939aeeacb2e37 (patch) | |
tree | 8f2366195492eca232eb1a6d8a000c1d7b4d5757 | |
parent | c8aa8448d8bcff74b6217d70fb9f60c0af32f317 (diff) | |
download | ppe42-gcc-0086a3d6f91f6b6adecf17f1399939aeeacb2e37.tar.gz ppe42-gcc-0086a3d6f91f6b6adecf17f1399939aeeacb2e37.zip |
2006-06-09 Richard Guenther <rguenther@suse.de>
PR tree-optimization/26998
* tree-vrp.c (extract_range_from_unary_expr): For NEGATE_EXPR
of signed types, only TYPE_MIN_VALUE is special, but for both,
minimum and maximum value. Likewise VR_ANTI_RANGE is special
in this case, as is -fwrapv.
* gcc.dg/torture/pr26998.c: New testcase.
* gcc.dg/tree-ssa/vrp29.c: New testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@114507 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr26998.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/vrp29.c | 20 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 23 |
5 files changed, 60 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ce53bb29627..79f68e9ca44 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2006-06-09 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/26998 + * tree-vrp.c (extract_range_from_unary_expr): For NEGATE_EXPR + of signed types, only TYPE_MIN_VALUE is special, but for both, + minimum and maximum value. Likewise VR_ANTI_RANGE is special + in this case, as is -fwrapv. + 2006-06-08 Mike Stump <mrs@apple.com> PR target/26427 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 267c08c28fa..f187c313572 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-06-09 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/26998 + * gcc.dg/torture/pr26998.c: New testcase. + * gcc.dg/tree-ssa/vrp29.c: New testcase. + 2006-06-08 Mike Stump <mrs@apple.com> * gcc.dg/pr27095.c: Account for stubs. diff --git a/gcc/testsuite/gcc.dg/torture/pr26998.c b/gcc/testsuite/gcc.dg/torture/pr26998.c new file mode 100644 index 00000000000..d50c344734e --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr26998.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ + +int decCompareOp (int result) +{ + if (result != (int)0x80000000) + { + result = -result; + return (result > 0); + } + return 0; +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp29.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp29.c new file mode 100644 index 00000000000..bace4ffcadf --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp29.c @@ -0,0 +1,20 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +extern void abort(void); + +void decCompareOp (int result) +{ + if (result != (int)0x80000000) + { + result = -result; + if (result != (int)0x80000001) + abort (); + } +} + +int main() +{ + decCompareOp (0x7fffffff); + return 0; +} diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 3ac01fb70f3..9eac7e9b67d 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -1795,14 +1795,21 @@ extract_range_from_unary_expr (value_range_t *vr, tree expr) if (code == NEGATE_EXPR && !TYPE_UNSIGNED (TREE_TYPE (expr))) { - /* NEGATE_EXPR flips the range around. */ - min = (vr0.max == TYPE_MAX_VALUE (TREE_TYPE (expr)) && !flag_wrapv) - ? TYPE_MIN_VALUE (TREE_TYPE (expr)) - : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max); - - max = (vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)) && !flag_wrapv) - ? TYPE_MAX_VALUE (TREE_TYPE (expr)) - : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min); + /* NEGATE_EXPR flips the range around. We need to treat + TYPE_MIN_VALUE specially dependent on wrapping, range type + and if it was used as minimum or maximum value: + -~[MIN, MIN] == ~[MIN, MIN] + -[MIN, 0] == [0, MAX] for -fno-wrapv + -[MIN, 0] == [0, MIN] for -fwrapv (will be set to varying later) */ + min = vr0.max == TYPE_MIN_VALUE (TREE_TYPE (expr)) + ? TYPE_MIN_VALUE (TREE_TYPE (expr)) + : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max); + + max = vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)) + ? (vr0.type == VR_ANTI_RANGE || flag_wrapv + ? TYPE_MIN_VALUE (TREE_TYPE (expr)) + : TYPE_MAX_VALUE (TREE_TYPE (expr))) + : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min); } else if (code == NEGATE_EXPR |