http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52589
--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-03-14 17:24:30 UTC --- The problem is in extract_range_from_binary_expr_1, we have s_7 = ASSERT_EXPR <s_1(D), s_1(D) + 1879048192 <= 4026531839>; D.1721_3 = s_7 + 2147483648; if (D.1721_3 <= 268435455) s_7 has range ~[2147483648, 2415919103] (i.e. VR_ANTI_RANGE), the constant obviously [2147483648, 2147483648] (i.e. VR_RANGE), but as vr0.type != vr1.type, we drop it to varying, while we could combine that ~[0x80000000, 0x8fffffff] + [0x80000000, 0x80000000] into ~[0, 0xfffffff] (at least, for TYPE_UNSIGNED addition and perhaps limited only to constants (i.e. vr1.min == vr1.max VR_RANGE).