On Thu, Aug 24, 2023 at 9:16 PM Andrew Pinski via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > Even though this is handled by other code inside both VRP and CCP, > sometimes we want to optimize this outside of VRP and CCP. > An example is given in PR 106677 where phiopt will happen > after VRP (which removes a cast for a comparison) and then > phiopt will optimize the phi to be `a | 1` which can then > be optimized to `1` due to this patch.
Also works for xor, no? > OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions. OK with or without adding XOR. Richard. > Note Similar code already exists in simplify_rtx for the RTL level; > it was moved from combine to simplify_rtx in r0-72539-gbd1ef757767f6d. > gcc/ChangeLog: > > * match.pd (`a | C -> C`): New pattern. > --- > gcc/match.pd | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/gcc/match.pd b/gcc/match.pd > index c87a0795667..3bbeceb37b4 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -1456,6 +1456,12 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) > && wi::bit_and_not (get_nonzero_bits (@0), wi::to_wide (@1)) == 0) > @0)) > +/* x | C -> C if we know that x & ~C == 0. */ > +(simplify > + (bit_ior SSA_NAME@0 INTEGER_CST@1) > + (if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) > + && wi::bit_and_not (get_nonzero_bits (@0), wi::to_wide (@1)) == 0) > + @1)) > #endif > > /* ~(~X - Y) -> X + Y and ~(~X + Y) -> X - Y. */ > -- > 2.31.1 >