https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88797
--- Comment #5 from Cassio Neri <cassio.neri at gmail dot com> --- There's a (fragile) workaround: void use(unsigned); #define VERSION 0 bool f(unsigned x, unsigned y) { #if VERSION == 0 return x < 1111 + (y <= 2222); #else bool b = y <= 2222; return x < 1111 + b; #endif } void test_f(unsigned x, unsigned y) { for (unsigned i = 0; i < 3333; ++i) use(f(x++, y++)); } f is till the same. Version 0 of test_f has 4 jumps whereas version 1 has only one. https://godbolt.org/z/gZZQ2f