https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69615
--- Comment #3 from Peter Cordes <peter at cordes dot ca> --- @Richard and Jakub: That's just addressing the first part of my report, the problem with x <= (INT_MAX-1), right? You may have missed the second part of the problem, since I probably buried it under too much detail with the first: In the case where the limit is variable, but can easily be proven to itself be in the range [0 .. INT_MAX-1) or much smaller: // gcc always fails to optimize this to an unsigned compare, but clang succeeds void rangecheck_var(int64_t x, int64_t lim2) { //lim2 >>= 60; lim2 &= 0xf; // let the compiler figure out the limited range of limit if (x>=0 && x<lim2) ext(); } --- I noticed after I submitted the report that I maybe should have tagged it tree-optimization, thanks for fixing. I don't really know gcc internals; I just file reports when it makes less than optimal code.