re PR tree-optimization/24575 (-(i /10) is not foldded to i/-10)
authorAndrew Pinski <pinskia@physics.uc.edu>
Sun, 27 Nov 2005 21:31:36 +0000 (21:31 +0000)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Sun, 27 Nov 2005 21:31:36 +0000 (13:31 -0800)
2005-11-27  Andrew Pinski  <pinskia@physics.uc.edu>

        PR middle-end/24575
        * fold-const.c (negate_expr_p): Add case for signed divides if overflow
        is undefined.
        (negate_expr): Likewise.
2005-11-27  Andrew Pinski  <pinskia@physics.uc.edu>

        PR middle-end/24575
        * gcc.dg/tree-ssa/divide-3.c: New test.
        * gcc.dg/tree-ssa/divide-4.c: New test.

From-SVN: r107575

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/divide-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/divide-4.c [new file with mode: 0644]

index 446ae10f91af764de3e771c6b0b6c6c67af50653..615160c8fe57822d5f3794a5d90c78628b5db341 100644 (file)
@@ -1,3 +1,10 @@
+2005-11-27  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR middle-end/24575
+       * fold-const.c (negate_expr_p): Add case for signed divides if overflow
+       is undefined.
+       (negate_expr): Likewise.
+
 2005-11-27  Andreas Schwab  <schwab@suse.de>
 
        * config/m68k/m68k.c: Reindent and fix whitespace, remove
index 63f12949ab71e3ed269c9a22a4a386d759724384..45863ee77e3c90f9cd119ff69d7a255e0d71c12e 100644 (file)
@@ -991,6 +991,16 @@ negate_expr_p (tree t)
               || negate_expr_p (TREE_OPERAND (t, 0));
       break;
 
+    case TRUNC_DIV_EXPR:
+    case ROUND_DIV_EXPR:
+    case FLOOR_DIV_EXPR:
+    case CEIL_DIV_EXPR:
+    case EXACT_DIV_EXPR:
+      if (TYPE_UNSIGNED (TREE_TYPE (t)) || flag_wrapv)
+        break;
+      return negate_expr_p (TREE_OPERAND (t, 1))
+             || negate_expr_p (TREE_OPERAND (t, 0));
+
     case NOP_EXPR:
       /* Negate -((double)float) as (double)(-float).  */
       if (TREE_CODE (type) == REAL_TYPE)
@@ -1132,6 +1142,28 @@ negate_expr (tree t)
        }
       break;
 
+    case TRUNC_DIV_EXPR:
+    case ROUND_DIV_EXPR:
+    case FLOOR_DIV_EXPR:
+    case CEIL_DIV_EXPR:
+    case EXACT_DIV_EXPR:
+      if (!TYPE_UNSIGNED (TREE_TYPE (t)) && !flag_wrapv)
+        {
+          tem = TREE_OPERAND (t, 1);
+          if (negate_expr_p (tem))
+            return fold_convert (type,
+                                 fold_build2 (TREE_CODE (t), TREE_TYPE (t),
+                                              TREE_OPERAND (t, 0),
+                                              negate_expr (tem)));
+          tem = TREE_OPERAND (t, 0);
+          if (negate_expr_p (tem))
+            return fold_convert (type,
+                                 fold_build2 (TREE_CODE (t), TREE_TYPE (t),
+                                              negate_expr (tem),
+                                              TREE_OPERAND (t, 1)));
+        }
+      break;
+
     case NOP_EXPR:
       /* Convert -((double)float) into (double)(-float).  */
       if (TREE_CODE (type) == REAL_TYPE)
index cb692358746853d8c750d30cc44516dbfa7e7448..8c38c880317711805b3390c01e21594694e463f9 100644 (file)
@@ -1,3 +1,9 @@
+2005-11-27  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR middle-end/24575
+       * gcc.dg/tree-ssa/divide-3.c: New test.
+       * gcc.dg/tree-ssa/divide-4.c: New test.
+
 2005-11-27  Steven G. Kargl  <kargls@comcast.net>
 
        PR fortran/24917
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/divide-3.c b/gcc/testsuite/gcc.dg/tree-ssa/divide-3.c
new file mode 100644 (file)
index 0000000..fa3e35a
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+int f(int a)
+{
+  return -(a/10);
+}
+
+/* { dg-final { scan-tree-dump-times "a / 10" 0 "optimized"} } */
+/* { dg-final { scan-tree-dump-times "a / -10" 1 "optimized"} } */
+
+/* { dg-final { cleanup-tree-dump "optimized" } } */
+
+
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/divide-4.c b/gcc/testsuite/gcc.dg/tree-ssa/divide-4.c
new file mode 100644 (file)
index 0000000..38c68cf
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+int f(int a)
+{
+  return -(-a/10);
+}
+
+/* { dg-final { scan-tree-dump-times "-a / 10" 0 "optimized"} } */
+/* { dg-final { scan-tree-dump-times "a / 10" 1 "optimized"} } */
+
+/* { dg-final { cleanup-tree-dump "optimized" } } */
+
+