http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57124
--- Comment #2 from Jeffrey A. Law <law at redhat dot com> 2013-05-01 05:13:38 UTC --- __attribute__ ((noinline)) foo(short unsigned int *p1, short unsigned int *p2) { short unsigned int x1, x4; int x2, x3, x5, x6; unsigned int x7; x1 = *p1; x2 = (int) x1; x3 = x2 * 65536; x4 = *p2; x5 = (int) x4; x6 = x3 + x4; x7 = (unsigned int) x6; if (x7 <= 268435455U) abort (); exit (0); } main() { short unsigned int x, y; x = -5; y = -10; foo (&x, &y); } Is a much reduced testcase. Ultimately we have a range for x6 that's [0, +INF(OVF)] at which point it's not safe to replace x7 with x6 in the conditional.