diff options
author | Andrew Pinski <apinski@marvell.com> | 2023-07-29 13:00:04 -0700 |
---|---|---|
committer | Andrew Pinski <apinski@marvell.com> | 2023-08-02 01:08:31 -0700 |
commit | 2bae476b511dc441bf61da8a49cca655575e7dd6 (patch) | |
tree | c37a8ed4935f666166f34367eb7eeb0d5ecbdc23 /gcc | |
parent | 7ff1d1b156cc78034e299757629de33e110a30b1 (diff) | |
download | gcc-2bae476b511dc441bf61da8a49cca655575e7dd6.zip gcc-2bae476b511dc441bf61da8a49cca655575e7dd6.tar.gz gcc-2bae476b511dc441bf61da8a49cca655575e7dd6.tar.bz2 |
Move `~X & X` and `~X | X` over to use bitwise_inverted_equal_p
This is a simple patch to move these 2 patterns over to use
bitwise_inverted_equal_p. It also allows us to remove 2 other patterns
which were used on comparisons as they are now handled by
the original pattern.
OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
gcc/ChangeLog:
* match.pd (`~X & X`, `~X | X`): Move over to
use bitwise_inverted_equal_p, removing :c as bitwise_inverted_equal_p
handles that already.
Remove range test simplifications to true/false as they
are now handled by these patterns.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/match.pd | 28 |
1 files changed, 6 insertions, 22 deletions
diff --git a/gcc/match.pd b/gcc/match.pd index cfd6ea0..c62f205 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1157,8 +1157,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) /* Simplify ~X & X as zero. */ (simplify - (bit_and:c (convert? @0) (convert? (bit_not @0))) - { build_zero_cst (type); }) + (bit_and (convert? @0) (convert? @1)) + (if (bitwise_inverted_equal_p (@0, @1)) + { build_zero_cst (type); })) /* PR71636: Transform x & ((1U << b) - 1) -> x & ~(~0U << b); */ (simplify @@ -1395,8 +1396,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) /* ~x ^ x -> -1 */ (for op (bit_ior bit_xor) (simplify - (op:c (convert? @0) (convert? (bit_not @0))) - (convert { build_all_ones_cst (TREE_TYPE (@0)); }))) + (op (convert? @0) (convert? @1)) + (if (bitwise_inverted_equal_p (@0, @1)) + (convert { build_all_ones_cst (TREE_TYPE (@0)); })))) /* x ^ x -> 0 */ (simplify @@ -6004,24 +6006,6 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (bit_and:c (ordered @0 @0) (ordered:c@2 @0 @1)) @2) -/* Simple range test simplifications. */ -/* A < B || A >= B -> true. */ -(for test1 (lt le le le ne ge) - test2 (ge gt ge ne eq ne) - (simplify - (bit_ior:c (test1 @0 @1) (test2 @0 @1)) - (if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) - || VECTOR_INTEGER_TYPE_P (TREE_TYPE (@0))) - { constant_boolean_node (true, type); }))) -/* A < B && A >= B -> false. */ -(for test1 (lt lt lt le ne eq) - test2 (ge gt eq gt eq gt) - (simplify - (bit_and:c (test1 @0 @1) (test2 @0 @1)) - (if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) - || VECTOR_INTEGER_TYPE_P (TREE_TYPE (@0))) - { constant_boolean_node (false, type); }))) - /* A & (2**N - 1) <= 2**K - 1 -> A & (2**N - 2**K) == 0 A & (2**N - 1) > 2**K - 1 -> A & (2**N - 2**K) != 0 |