http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56309
--- Comment #10 from arturomdn at gmail dot com 2013-02-14 16:43:23 UTC --- Might be worth mentioning here what I said in the stackoverflow answer, that in this particular case the entire conditional branch can be avoided because it is redundant. This code if (tmp >= imax) { carry = tmp >> numbits; // <---- A tmp &= imax - 1; // <---- B } else { carry = 0; // <---- C } can be reduced to carry = tmp >> numbits; tmp &= imax - 1; Proof: 1) numbits is 32 2) imax is 1ULL << 32 so lower 32 bits are zero 3) imax - 1 is 0xFFFFFFFF (see 2) 4) if tmp >= imax then tmp has bits set in upper 32 bits 5) otherwise if tmp < imax then tmp does not have bits set in upper 32 bits 6) statement "A" is equivalent to "C" when tmp < imax (because of 4) 7) statement "B" is a NOP when tmp < imax (because of 3 and 5)