http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54027
--- Comment #2 from joseph at codesourcery dot com <joseph at codesourcery dot com> 2012-07-19 15:07:54 UTC --- On Thu, 19 Jul 2012, rguenth at gcc dot gnu.org wrote: > Isn't it invoking undefined behavior by means of a signed integer overflow? > (if shifts are not defined in terms of multiplies we may not internally > fold x << 1 to x * 2). Shifts in GCC are supposed to be defined as long as the shift amount is in range, independent of the LHS, so it should not be folding like that. (Although we document in implement-c.texi that this is subject to change for signed left shift, I don't think changing it would be a particularly good idea.)