https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91504
Kamlesh Kumar <kamleshbhalui at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |kamleshbhalui at gmail dot com --- Comment #2 from Kamlesh Kumar <kamleshbhalui at gmail dot com> --- diff --git a/gcc/match.pd b/gcc/match.pd index 93dcef9..b62ef36 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -137,6 +137,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (pointer_plus integer_zerop @1) (non_lvalue (convert @1))) +/* (~value & C) ^ value -> value | C */ +(simplify + (bit_xor:c (bit_and (bit_not @0) INTEGER_CST@1) @0) + (bit_ior @0 @1)) + /* ptr - 0 -> (type)ptr */ (simplify (pointer_diff @0 integer_zerop) ========================= After above both function produces same asm. i.e. foo: movl %edi, %eax orb $4, %ah ret bar: movl %edi, %eax orb $4, %ah ret