simplify-rtx.c (simplify_binary_operation_1): Handle more cases for the "(and X ...
authorSegher Boessenkool <segher@kernel.crashing.org>
Tue, 6 Jan 2015 04:29:03 +0000 (05:29 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Tue, 6 Jan 2015 04:29:03 +0000 (05:29 +0100)
* simplify-rtx.c (simplify_binary_operation_1): Handle more cases
for the "(and X (ior (not X) Y) -> (and X Y)" transform.

From-SVN: r219217

gcc/ChangeLog
gcc/simplify-rtx.c

index e85a9fdf0b197ade5ae7b044e2240e9a0f0535bd..12c2f939fe662e014962844e870cc2756f0d045c 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-05  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * simplify-rtx.c (simplify_binary_operation_1): Handle more cases
+       for the "(and X (ior (not X) Y) -> (and X Y)" transform.
+
 2015-01-05  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * combine.c (combine_validate_cost): Do not count the cost of a
index 4c2ba4c5b9415dfbc45fa65461d4b214edd780f6..56de54d9bcb8da7ac1e3d2df36d43291f5a7d5b9 100644 (file)
@@ -2933,15 +2933,27 @@ simplify_binary_operation_1 (enum rtx_code code, machine_mode mode,
       /* (and X (ior (not X) Y) -> (and X Y) */
       if (GET_CODE (op1) == IOR
          && GET_CODE (XEXP (op1, 0)) == NOT
-         && op0 == XEXP (XEXP (op1, 0), 0))
+         && rtx_equal_p (op0, XEXP (XEXP (op1, 0), 0)))
        return simplify_gen_binary (AND, mode, op0, XEXP (op1, 1));
 
       /* (and (ior (not X) Y) X) -> (and X Y) */
       if (GET_CODE (op0) == IOR
          && GET_CODE (XEXP (op0, 0)) == NOT
-         && op1 == XEXP (XEXP (op0, 0), 0))
+         && rtx_equal_p (op1, XEXP (XEXP (op0, 0), 0)))
        return simplify_gen_binary (AND, mode, op1, XEXP (op0, 1));
 
+      /* (and X (ior Y (not X)) -> (and X Y) */
+      if (GET_CODE (op1) == IOR
+         && GET_CODE (XEXP (op1, 1)) == NOT
+         && rtx_equal_p (op0, XEXP (XEXP (op1, 1), 0)))
+       return simplify_gen_binary (AND, mode, op0, XEXP (op1, 0));
+
+      /* (and (ior Y (not X)) X) -> (and X Y) */
+      if (GET_CODE (op0) == IOR
+         && GET_CODE (XEXP (op0, 1)) == NOT
+         && rtx_equal_p (op1, XEXP (XEXP (op0, 1), 0)))
+       return simplify_gen_binary (AND, mode, op1, XEXP (op0, 0));
+
       tem = simplify_byte_swapping_operation (code, mode, op0, op1);
       if (tem)
        return tem;