]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
fold-const.c (fold_truthop): Transform "a || b" into "(a|b) != 0" and "!p && !q"...
authorRoger Sayle <roger@eyesopen.com>
Sat, 1 Jun 2002 16:51:00 +0000 (16:51 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Sat, 1 Jun 2002 16:51:00 +0000 (16:51 +0000)
* fold-const.c (fold_truthop): Transform "a || b" into "(a|b) != 0"
and "!p && !q" into "(p|q) == 0" under suitable conditions.

From-SVN: r54148

gcc/ChangeLog
gcc/fold-const.c

index 753ea40e102f952cfbd56b9fb7ca95b97b143556..0dd65f30b66a24c58279b7426bd7cd79ae5a3861 100644 (file)
@@ -1,3 +1,8 @@
+2002-06-01  Roger Sayle  <roger@eyesopen.com>
+
+       * fold-const.c (fold_truthop): Transform "a || b" into "(a|b) != 0"
+       and "!p && !q" into "(p|q) == 0" under suitable conditions.
+
 2002-06-01  Andreas Jaeger  <aj@suse.de>
 
        * cppexp.c (cpp_classify_number): Cast precission to int for
index 400285e5fec2340c7c6cea2103360ced33d17f26..0998a93aa2e433e8e761b92be7dace7ebaecf64f 100644 (file)
@@ -3506,7 +3506,29 @@ fold_truthop (code, truth_type, lhs, rhs)
       && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
       && simple_operand_p (rl_arg)
       && simple_operand_p (rr_arg))
-    return build (code, truth_type, lhs, rhs);
+    {
+      /* Convert (a != 0) || (b != 0) into (a | b) != 0.  */
+      if (code == TRUTH_OR_EXPR
+         && lcode == NE_EXPR && integer_zerop (lr_arg)
+         && rcode == NE_EXPR && integer_zerop (rr_arg)
+         && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
+       return build (NE_EXPR, truth_type,
+                     build (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
+                            ll_arg, rl_arg),
+                     integer_zero_node);
+
+      /* Convert (a == 0) && (b == 0) into (a | b) == 0.  */
+      if (code == TRUTH_AND_EXPR
+         && lcode == EQ_EXPR && integer_zerop (lr_arg)
+         && rcode == EQ_EXPR && integer_zerop (rr_arg)
+         && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg))
+       return build (EQ_EXPR, truth_type,
+                     build (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
+                            ll_arg, rl_arg),
+                     integer_zero_node);
+
+      return build (code, truth_type, lhs, rhs);
+    }
 
   /* See if the comparisons can be merged.  Then get all the parameters for
      each side.  */