aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2006-06-08 08:49:19 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2006-06-08 08:49:19 +0000
commit960f80d1ee2d882f29886db66a3edf4c824eeaf0 (patch)
tree4bf8760f5ecfc126786bc6da8fd99de0bb85f219 /gcc
parent8e08deebfccb960a2bdbd9c7e30a9e3c4633e12d (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/fold-const.c8
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/pr15785-1.c6
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr27116.c15
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;
+}