https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94914
--- Comment #4 from Marc Glisse <glisse at gcc dot gnu.org> --- I thought we might already simplify (u >> 32) != 0 to u >= cst (other possible forms are u != (uint64_t)(uint32_t)u, u & cst != 0, etc, I am trying to think which one looks most canonical). I expect in interesting cases the code will use z = (uint64_t)x * y twice, once to check for overflow, and once as (uint32_t)z to get the actual result (or there is a separate x*y and we want to CSE it with the overflow version).