https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83377
--- Comment #3 from Vinay Kumar <vinay.m.engg at gmail dot com> --- The below mentioned pattern match in match.pd generates the assembly code similar to subtraction. ========================================== diff --git a/gcc/match.pd b/gcc/match.pd index fbb4d6f..3cde6a6 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -925,6 +925,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (bit_and @0 integer_all_onesp) (non_lvalue @0)) +/*Fold (x & ~CST) into (x - CST)*/ +(simplify(bit_and:c @0 INTEGER_CST@1) +(if ((INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type))) + (minus @0 (negate @1)))) + /* x & x -> x, x | x -> x */ (for bitop (bit_and bit_ior) (simplify ========================================== Assembly generated is as follows: ========================================== test.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <b>: 0: 48 83 ff fe cmp $0xfffffffffffffffe,%rdi 4: 74 04 je a <b+0xa> 6: 48 8b 7f fd mov -0x3(%rdi),%rdi a: e9 00 00 00 00 jmpq f <b+0xf> f: 90 nop 0000000000000010 <c>: 10: 48 83 ff fe cmp $0xfffffffffffffffe,%rdi 14: 74 04 je 1a <c+0xa> 16: 48 8b 7f fe mov -0x2(%rdi),%rdi 1a: e9 00 00 00 00 jmpq 1f <c+0xf> ==========================================