https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99069
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- Hmm, but phiopt2 turns it into bool f (bool x, bool y) { bool _5; bool _6; <bb 2> [local count: 1073741824]: _5 = x_2(D) & y_3(D); _6 = -_5; return _6; and we end up with _Z1fbb: .LFB0: .cfi_startproc andl %edi, %esi movl %esi, %eax andl $1, %eax ret which is optimal. On GIMPLE we fail to elide -bool to bool I guess.