2006-06-08 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 Jun 2006 08:49:19 +0000 (08:49 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 Jun 2006 08:49:19 +0000 (08:49 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@114483 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr15785-1.c
gcc/testsuite/gcc.dg/torture/pr27116.c [new file with mode: 0644]

index ea88049..12bd419 100644 (file)
@@ -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
index 6f19704..3e9ccbe 100644 (file)
@@ -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;
index 78cbebc..cfeeaeb 100644 (file)
@@ -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
index 47cd3d7..5e79ec5 100644 (file)
@@ -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 (file)
index 0000000..70eeb1a
--- /dev/null
@@ -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;
+}