diff options
author | Richard Guenther <rguenther@suse.de> | 2006-06-08 08:49:19 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2006-06-08 08:49:19 +0000 |
commit | 960f80d1ee2d882f29886db66a3edf4c824eeaf0 (patch) | |
tree | 4bf8760f5ecfc126786bc6da8fd99de0bb85f219 /gcc | |
parent | 8e08deebfccb960a2bdbd9c7e30a9e3c4633e12d (diff) | |
download | gcc-960f80d1ee2d882f29886db66a3edf4c824eeaf0.zip gcc-960f80d1ee2d882f29886db66a3edf4c824eeaf0.tar.gz gcc-960f80d1ee2d882f29886db66a3edf4c824eeaf0.tar.bz2 |
re PR middle-end/27116 (Incorrect integer division (wrong sign).)
2006-06-08 Richard Guenther <rguenther@suse.de>
PR middle-end/27116
* fold-const.c (negate_expr_p): We can negate BIT_NOT_EXPR
only, if overflow is defined and not trapping.
(negate_expr): Likewise.
* gcc.dg/torture/pr27116.c: New testcase.
* gcc.dg/pr15785-1.c: Remove test for invalid transformation.
From-SVN: r114483
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fold-const.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr15785-1.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr27116.c | 15 |
5 files changed, 34 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ea88049..12bd419 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2006-06-08 Richard Guenther <rguenther@suse.de> + + PR middle-end/27116 + * fold-const.c (negate_expr_p): We can negate BIT_NOT_EXPR + only, if overflow is defined and not trapping. + (negate_expr): Likewise. + 2006-06-07 Zdenek Dvorak <dvorakz@suse.cz> PR tree-optimization/27872 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 6f19704..3e9ccbe 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -945,7 +945,9 @@ negate_expr_p (tree t) /* Check that -CST will not overflow type. */ return may_negate_without_overflow_p (t); case BIT_NOT_EXPR: - return INTEGRAL_TYPE_P (type); + return INTEGRAL_TYPE_P (type) + && (TYPE_UNSIGNED (type) + || (flag_wrapv && !flag_trapv)); case REAL_CST: case NEGATE_EXPR: @@ -1047,7 +1049,9 @@ negate_expr (tree t) { /* Convert - (~A) to A + 1. */ case BIT_NOT_EXPR: - if (INTEGRAL_TYPE_P (type)) + if (INTEGRAL_TYPE_P (type) + && (TYPE_UNSIGNED (type) + || (flag_wrapv && !flag_trapv))) return fold_build2 (PLUS_EXPR, type, TREE_OPERAND (t, 0), build_int_cst (type, 1)); break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 78cbebc..cfeeaeb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-06-08 Richard Guenther <rguenther@suse.de> + + PR middle-end/27116 + * gcc.dg/torture/pr27116.c: New testcase. + * gcc.dg/pr15785-1.c: Remove test for invalid transformation. + 2006-06-07 Zdenek Dvorak <dvorakz@suse.cz> PR rtl-optimization/26449 diff --git a/gcc/testsuite/gcc.dg/pr15785-1.c b/gcc/testsuite/gcc.dg/pr15785-1.c index 47cd3d7..5e79ec5 100644 --- a/gcc/testsuite/gcc.dg/pr15785-1.c +++ b/gcc/testsuite/gcc.dg/pr15785-1.c @@ -11,11 +11,6 @@ void b (int x) { link_error (); } -void c (int x) { - if (!(- (~x) - x)) - link_error (); -} - void d (int x) { if (!(~ (-x) - x)) link_error (); @@ -34,7 +29,6 @@ void f (int x) { int main (int argc, char *argv[]) { a(argc); b(argc); - c(argc); d(argc); e(argc); f(argc); diff --git a/gcc/testsuite/gcc.dg/torture/pr27116.c b/gcc/testsuite/gcc.dg/torture/pr27116.c new file mode 100644 index 0000000..70eeb1a --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr27116.c @@ -0,0 +1,15 @@ +/* { dg-do run } */ + +extern void abort(void); + +int f(int a, int b) +{ + return (-1 - a) / (-b); +} + +int main() +{ + if (f(__INT_MAX__, 2) != __INT_MAX__/2 + 1) + abort (); + return 0; +} |