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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           See Also|                            |https://gcc.gnu.org/bugzill
                   |                            |a/show_bug.cgi?id=103536

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
```
unsigned foo(unsigned x, unsigned y, unsigned c)
{
    return (x | c) & ~(y | c); // x & ~(y | c);
}

unsigned foo_or(unsigned x, unsigned y, unsigned c)
{
    return (x & c) | ~(y & c); // x | ~(y & c);
}

unsigned foo2(unsigned x, unsigned y, unsigned c)
{
    return x & ~(y | x); // 0
}
unsigned foo2_or(unsigned x, unsigned y, unsigned c)
{
    return x | ~(y & x); // -1
}
```

// (x | c) & ~(y | c) -> x & ~(y | c)
// (x & c) | ~(y & c) -> x | ~(y & c)
(for bitop (bit_and bit_ior)
     rbitop (bit_ior bit_and)
 (bitop:c (rbitop:c @0 @1) (bit_not@3 (rbitop:c @1 @2)))
 (bitop @0 @3))

// x & ~(y | x) -> 0
// x | ~(y & x) -> -1
(for bitop (bit_and bit_ior)
     rbitop (bit_ior bit_and)
 (bitop:c @0 (bit_not (rbitop:c @0 @1)))
 (if (bitop == BIT_AND_EXPR)
  { build_zero_cst (type); }
  { build_minus_one_cst (type); }))

Reply via email to