http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52589
Bug #: 52589 Summary: VRP missed optimization Classification: Unclassified Product: gcc Version: 4.8.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassig...@gcc.gnu.org ReportedBy: ja...@gcc.gnu.org extern void link_error (void); void foo (unsigned int s) { if (s + 0x70000000 < 0xf0000000U) { if (s >= 0x80000000U && s < 0x90000000U) link_error (); } } void bar (unsigned int s) { if (s + 0x70000000 >= 0xf0000000U) { if (s < 0x80000000U || s >= 0x90000000U) link_error (); } } In the above testcase, bar is optimized fine (VRP adds an ASSERT_EXPR with range [0x80000000, 0x8fffffff] and optimizes away the test), but in foo it isn't - the range there is ~[0x80000000, 0x8ffffffff] and we don't handle the VR_ANTI_RANGE somewhere where we should. I've noticed this while working on PR52267 - the vrp65.c testcase that I'm bootstrapping there right now needs to have 4 tests commented out (well, replaced by checks of a few selected values from the range which VRP optimizes out properly).