SLSR may generate new signed wrap for cases where the original did not wrap. This can be seen in the function f from gcc.dg/tree-ssa/slsr-19.c: int f (int c, int s) { int x1, x2, y1, y2; y1 = c + 2; x1 = s * y1; y2 = y1 + 2; x2 = s * y2; return x1 + x2; } SLSR optimizes this to int f (int c, int s) { int y1; int x2; int x1; int _7; int slsr_9; <bb 2>: y1_2 = c_1(D) + 2; x1_4 = y1_2 * s_3(D); slsr_9 = s_3(D) * 2; x2_6 = x1_4 + slsr_9; _7 = x1_4 + x2_6; return _7; Calling f(-3, 0x75181005) does not make any operation wrap in the original function, but slsr_9 overflow in the optimized code.
Confirmed - thanks for reporting! Since there's a VRP pass after SLSR it might be possible to craft a testcase that fails at runtime.