https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110919

--- Comment #8 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #7)
> Generalized for -O1 case:
> // (a & (b & ~a)) -> 0
> // (a & (b | ~a)) -> a & b
> // (a & (b ^ ~a)) -> a & b
> // (a & (b cmp !a)) -> a & (b cmp 0)
> (for op (tcc_comparison bit_and bit_xor bit_and)
>  (simplify
>   (bit_and:c zero_one_valued_p@0 (op:c @1 (convert? @2)))
>   (with { bool wascmp; }
>    (if (bitwise_inverted_equal_p (@0, @2, wascmp))
>     (bit_and @0 (op @1 { build_zero_cst (TREE_TYPE (@1)); })))))
> 
> 
> Note I filed PR 111282 for `(a & (b ^ ~a))` also.

The corrected version is:
// (a & (b & ~a)) -> 0
// (a & (b | ~a)) -> a & b
// (a & (b ^ ~a)) -> a & b
// (a & (b cmp !a)) -> a & (b cmp 0)
(for op (tcc_comparison bit_and bit_xor bit_and)
 (simplify
  (bit_and:c zero_one_valued_p@0 (op:c @1 (convert? zero_one_valued_p@2)))
  (with { bool wascmp; }
   (if (bitwise_inverted_equal_p (@0, @2, wascmp))
    (bit_and @0 (op @1 { build_zero_cst (TREE_TYPE (@1)); }))))))

Reply via email to