https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99997
Bug ID: 99997 Summary: Missed optimisation with -Os Product: gcc Version: 10.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: dhowells at redhat dot com Target Milestone: --- Created attachment 50538 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=50538&action=edit Test source Using the Fedora 33 x86_64 compiler: gcc version 10.2.1 20201125 (Red Hat 10.2.1-9) (GCC) Building the following (see also attached file): typedef _Bool bool; #define __always_inline inline __attribute__((__always_inline__)) enum { PG_head = 16 }; struct page { unsigned long flags; unsigned long compound_head; /* Bit zero is set */ }; static inline bool constant_test_bit(int nr, const void *addr) { const unsigned int *p = (const unsigned int *)addr; return ((1UL << (nr & 31)) & (p[nr >> 5])) != 0; } static __always_inline bool PageTail(struct page *page) { return page->compound_head & 1; } static __always_inline bool PageCompound(struct page *page) { return constant_test_bit(PG_head, &page->flags) || PageTail(page); } bool PageTransCompound(struct page *page) { return PageCompound(page); } with "gcc -Os" I get the following assembly: PageTransCompound: .LFB3: .cfi_startproc movl (%rdi), %edx movl $1, %eax btl $16, %edx jc .L2 movq 8(%rdi), %rax andl $1, %eax .L2: andl $1, %eax ret .cfi_endproc There are two consecutive identical ANDL instructions, one of which is superfluous. The compile could eliminate the one that's immediately prior to the .L2 instruction.