OSDN Git Service

PR middle-end/32559
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 1 Jul 2007 10:38:03 +0000 (10:38 +0000)
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 1 Jul 2007 10:38:03 +0000 (10:38 +0000)
        * fold-const.c (fold-binary) [PLUS_EXPR]: Convert ~X + X to 1 or
        X + ~X to 1 only for INTEGRAL_TYPE_P type.

testsuite/ChangeLog:

        PR middle-end/32559
        * gcc.dg/pr32559.c: New test.

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

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr32559.c [new file with mode: 0644]

index 7e576be..2229807 100644 (file)
@@ -1,3 +1,9 @@
+2007-07-01  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR middle-end/32559
+       * fold-const.c (fold-binary) [PLUS_EXPR]: Convert ~X + X to 1 or
+       X + ~X to 1 only for INTEGRAL_TYPE_P type.
+
 2007-06-30  Joseph Myers  <joseph@codesourcery.com>
 
        * configure.ac: Check for .gnu_attribute on MIPS.
 
 2006-06-30  Jan Hubicka  <jh@suse.cz>
 
-       * loop-unroll.c (unroll_loop_runtime_iterations): Unshare newly emit    
+       * loop-unroll.c (unroll_loop_runtime_iterations): Unshare newly emit
        code.
 
 2006-06-30  Thomas Neumann  <tneumann@users.sourceforge.net>
index d806e7a..9dfd07f 100644 (file)
@@ -9270,27 +9270,13 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
        return fold_build2 (MINUS_EXPR, type,
                            fold_convert (type, arg1),
                            fold_convert (type, TREE_OPERAND (arg0, 0)));
-      /* Convert ~A + 1 to -A.  */
-      if (INTEGRAL_TYPE_P (type)
-         && TREE_CODE (arg0) == BIT_NOT_EXPR
-         && integer_onep (arg1))
-       return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
-
-      /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
-        same or one.  */
-      if ((TREE_CODE (arg0) == MULT_EXPR
-          || TREE_CODE (arg1) == MULT_EXPR)
-         && (!FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
-        {
-         tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
-         if (tem)
-           return tem;
-       }
 
-      if (! FLOAT_TYPE_P (type))
+      if (INTEGRAL_TYPE_P (type))
        {
-         if (integer_zerop (arg1))
-           return non_lvalue (fold_convert (type, arg0));
+         /* Convert ~A + 1 to -A.  */
+         if (TREE_CODE (arg0) == BIT_NOT_EXPR
+             && integer_onep (arg1))
+           return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
 
          /* ~X + X is -1.  */
          if (TREE_CODE (arg0) == BIT_NOT_EXPR
@@ -9319,6 +9305,23 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
                  return omit_one_operand (type, t1, arg0);
                }
            }
+       }
+
+      /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
+        same or one.  */
+      if ((TREE_CODE (arg0) == MULT_EXPR
+          || TREE_CODE (arg1) == MULT_EXPR)
+         && (!FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
+        {
+         tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
+         if (tem)
+           return tem;
+       }
+
+      if (! FLOAT_TYPE_P (type))
+       {
+         if (integer_zerop (arg1))
+           return non_lvalue (fold_convert (type, arg0));
 
          /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
             with a constant, and the two constants have no bits in common,
index 9318ce2..ec17942 100644 (file)
@@ -1,3 +1,9 @@
+2007-067-01  Uros Bizjak  <ubizjak@gmail.com>
+           Volker Reichelt  <reichelt@netcologne.de>
+
+       PR middle-end/32559
+       * gcc.dg/pr32559.c: New test.
+
 2007-07-01  Uros Bizjak  <ubizjak@gmail.com>
 
        PR tree-optimization/25371
diff --git a/gcc/testsuite/gcc.dg/pr32559.c b/gcc/testsuite/gcc.dg/pr32559.c
new file mode 100644 (file)
index 0000000..fee1c97
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+int __attribute__((vector_size (8))) v;
+
+void foo()
+{
+  v += ~v;
+}