https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119780
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Slightly cleaned up & simplified: int a = 1, b = -__INT_MAX__, c; int main () { goto d; e: a = 0; f: if (a + c <= 0) goto g; h: goto i; d: if (b >= 0) goto e; goto j; i: if (c - __INT_MAX__ * a >= 0) goto h; goto d; j: b = 7; goto f; g:; } The slrs change is <bb 9> [local count: 118111600]: - _12 = a_lsm.8_15 * -2147483647; - _13 = c.1_2 + _12; + slsr_7 = a_lsm.8_15 * -2147483648; + _13 = _3 - slsr_7; if (_13 >= 0) goto <bb 10>; [0.00%] else where _3 is _3 = c.1_2 + a_lsm.8_15; c.1_2 is 1, a_lsm.8_15 is 1, so before slsr this is 1 + (1 * -2147483647) which is well defined -2147483646, while after that change it is 2 - (1 * -2147483648), which is UB.