https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103071
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- So a _Bool EitherIsSubset (unsigned long v0, unsigned long v1) { return (v0 & v1) == v0 || (v0 & v1) == v1; } is compiled to EitherIsSubset: .LFB0: .cfi_startproc movq %rdi, %rdx andq %rsi, %rdx cmpq %rsi, %rdx sete %al cmpq %rdi, %rdx sete %dl orl %edx, %eax ret your super-opt asm doesn't call foo or bar. On the GIMPLE level we eventually see _1 = v0_3(D) & v1_4(D); _8 = _1 == v1_4(D); _9 = _1 == v0_3(D); _10 = _8 | _9; which I think is quite optimal. With the calls it becomes and if-conversion problem on RTL (or an early RTL generation one).