* fold-const.c (fold): Fold A - (A & B) into ~B & A.
authorKazu Hirata <kazu@cs.umass.edu>
Thu, 20 Mar 2003 16:10:36 +0000 (16:10 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Thu, 20 Mar 2003 16:10:36 +0000 (16:10 +0000)
From-SVN: r64615

gcc/ChangeLog
gcc/fold-const.c

index 0f58a3f87f44f431164c9a2e51be52e376f99c14..d20b1758a89c983b3cc364a61972bd4ffc123d3d 100644 (file)
@@ -1,3 +1,7 @@
+2003-03-20  Kazu Hirata  <kazu at cs dot umass dot edu>
+
+       * fold-const.c (fold): Fold A - (A & B) into ~B & A.
+
 2003-03-20  Kazu Hirata  <kazu@cs.umass.edu>
 
        * config/h8300/h8300.md (a peephole2): New.
index 48c3683f8c2667de2c0967cf2aa97c61e12f6480..4890c173e816fa1f5d80397e549dd34b60cb2d29 100644 (file)
@@ -5560,6 +5560,22 @@ fold (expr)
                                             TREE_OPERAND (arg0, 0),
                                             TREE_OPERAND (arg1, 0))),
                                TREE_OPERAND (arg0, 1)));
+
+         /* Fold A - (A & B) into ~B & A.  */
+         if (!TREE_SIDE_EFFECTS (arg0)
+             && TREE_CODE (arg1) == BIT_AND_EXPR)
+           {
+             if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
+               return fold (build (BIT_AND_EXPR, type,
+                                   fold (build1 (BIT_NOT_EXPR, type,
+                                                 TREE_OPERAND (arg1, 0))),
+                                   arg0));
+             if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
+               return fold (build (BIT_AND_EXPR, type,
+                                   fold (build1 (BIT_NOT_EXPR, type,
+                                                 TREE_OPERAND (arg1, 1))),
+                                   arg0));
+           }
        }
 
       /* See if ARG1 is zero and X - ARG1 reduces to X.  */