http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59747
--- Comment #2 from Marek Polacek <mpolacek at gcc dot gnu.org> --- I think the problem is in setting the value of e. With -O in .gimple we have: e.2 = e; e.3 = e.2; e.4 = e.3 + -1; e = e.4; while with -O2: e.2 = e; e.3 = e.2; e.4 = (unsigned short) e.3; D.1762 = e.4 + 65535; e.5 = (short int) D.1762; e = e.5; Wrt the weirdo shift: -1 >> 56 is implementation-defined behavior.