http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54027
--- Comment #1 from Richard Guenther <rguenth at gcc dot gnu.org> 2012-07-19 10:07:11 UTC --- 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).