http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56379
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> 2013-02-19 10:16:17 UTC --- Yeah, the bug is obvious. glibc refuses to compile with -O0, so it was never a problem for it. The problem is that while mpn_lshift_1 function is always_inline, at -O0 the __builtin_constant_p folds to 0 early in: if (__builtin_constant_p (count) && count == BITS_PER_MP_LIMB) and the else code isn't prepared to handle BITS_PER_MP_LIMB value. The function is always either called with constant BITS_PER_MP_LIMB count, or variable count that is always < BITS_PER_MP_LIMB, so it works fine for -O1+. To fix this, either mpn_lshift_1 could be rewritten as macro, or as a macro calling two different inline functions, or __builtin_constant_p (count) && could be guarded with #ifdef __OPTIMIZE__.