http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48812
--- Comment #1 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-04-29 09:43:16 UTC --- We do not exploit the fact that shifts bigger than the width of the type are undefined (in fact we even try to preserve the fact that some CPUs truncate the shift count when constant folding ...). We also have to make sure the shift count does not get negative, which we can't in this case. Thus (1U<<(b-2)) is not equivalent to (1U<<b) / 4.