https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68695
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- And with -fno-if-conversion on x86_64 I see foo: .LFB0: .cfi_startproc cmpl %esi, %edi jle .L2 movl %edx, %esi movl %edx, %edi .L2: movl %edi, %eax imull %esi, %eax ret thus exactly your "good" code. I doubt this is if-conversion at play. Do you have some machine-reorg that duplicates tails? Maybe it's shrink-wrapping? Where does the tail get duplicated?