re PR tree-optimization/14752 ([tree-ssa] "~a" should be changed to "a" if used in...
authorRoger Sayle <roger@eyesopen.com>
Tue, 28 Feb 2006 21:31:29 +0000 (21:31 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Tue, 28 Feb 2006 21:31:29 +0000 (21:31 +0000)
PR middle-end/14752
* c-common.c (c_common_truthvalue_conversion) <MINUS_EXPR,
BIT_XOR_EXPR, BIT_AND_EXPR>: Delete.  Let fold optimize these
cases via the construction of "expr != 0".

* gcc.dg/fold-eqandshift-2.c: New test case.

From-SVN: r111575

gcc/ChangeLog
gcc/c-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/fold-eqandshift-2.c [new file with mode: 0644]

index 2b678abac8d8106792b193b82f7dcb07fe52b6a4..7b11e7be9c21af712e5d4b76d798583e3eb6a0f9 100644 (file)
@@ -1,3 +1,10 @@
+2006-02-28  Roger Sayle  <roger@eyesopen.com>
+
+       PR middle-end/14752
+       * c-common.c (c_common_truthvalue_conversion) <MINUS_EXPR,
+       BIT_XOR_EXPR, BIT_AND_EXPR>: Delete.  Let fold optimize these
+       cases via the construction of "expr != 0".
+
 2006-02-28  Steven Bosscher  <stevenb.gcc@gmail.com>
 
        * alias.c (alias_invariant, alias_invariant_size): Remove.
index 4f8ab8e0d4b758dce34de92ed72e83396323739d..1a11c3b189ad90f618a629a73f4d40717014142f 100644 (file)
@@ -2537,37 +2537,6 @@ c_common_truthvalue_conversion (tree expr)
        return c_common_truthvalue_conversion (TREE_OPERAND (expr, 0));
       break;
 
-    case MINUS_EXPR:
-      /* Perhaps reduce (x - y) != 0 to (x != y).  The expressions
-        aren't guaranteed to the be same for modes that can represent
-        infinity, since if x and y are both +infinity, or both
-        -infinity, then x - y is not a number.
-
-        Note that this transformation is safe when x or y is NaN.
-        (x - y) is then NaN, and both (x - y) != 0 and x != y will
-        be false.  */
-      if (HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (TREE_OPERAND (expr, 0)))))
-       break;
-      /* Fall through....  */
-    case BIT_XOR_EXPR:
-      /* This and MINUS_EXPR can be changed into a comparison of the
-        two objects.  */
-      if (TREE_TYPE (TREE_OPERAND (expr, 0))
-         == TREE_TYPE (TREE_OPERAND (expr, 1)))
-       return fold_build2 (NE_EXPR, truthvalue_type_node,
-                           TREE_OPERAND (expr, 0), TREE_OPERAND (expr, 1));
-      return fold_build2 (NE_EXPR, truthvalue_type_node,
-                         TREE_OPERAND (expr, 0),
-                         fold_convert (TREE_TYPE (TREE_OPERAND (expr, 0)),
-                                       TREE_OPERAND (expr, 1)));
-
-    case BIT_AND_EXPR:
-      if (integer_onep (TREE_OPERAND (expr, 1))
-         && TREE_TYPE (expr) != truthvalue_type_node)
-       /* Using convert here would cause infinite recursion.  */
-       return build1 (NOP_EXPR, truthvalue_type_node, expr);
-      break;
-
     case MODIFY_EXPR:
       if (!TREE_NO_WARNING (expr))
        warning (OPT_Wparentheses,
index e0af45588a08d86c335a9bc16152de5f7e321857..5b2507cf1c93bb9d0ad7ee395ab111a6cce65a6f 100644 (file)
@@ -1,3 +1,8 @@
+2006-02-28  Roger Sayle  <roger@eyesopen.com>
+
+       PR middle-end/14752
+       * gcc.dg/fold-eqandshift-2.c: New test case.
+
 2006-02-28  Richard Guenther  <rguenther@suse.de>
 
        * gcc.dg/tree-ssa/pr26421.c: Fix testcase to force struct
diff --git a/gcc/testsuite/gcc.dg/fold-eqandshift-2.c b/gcc/testsuite/gcc.dg/fold-eqandshift-2.c
new file mode 100644 (file)
index 0000000..14ffb85
--- /dev/null
@@ -0,0 +1,22 @@
+/* PR middle-end/14752 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-original" } */
+
+void bar (void);
+
+void foo (unsigned int a)
+{
+  if ((a >> 2) & 1)
+    bar ();
+}
+
+void baz (unsigned int b)
+{
+  if ((~b >> 2) & 1)
+    bar ();
+}
+
+/* { dg-final { scan-tree-dump-times "\\(a \& 4\\) != 0" 1 "original" } } */
+/* { dg-final { scan-tree-dump-times "\\(b \& 4\\) == 0" 1 "original" } } */
+/* { dg-final { cleanup-tree-dump "original" } } */
+