https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98513
--- Comment #11 from Richard Biener <rguenth at gcc dot gnu.org> --- So the issue is we cannot decide between [ (] ) and [ ( ) ] and the check for [ (] ) elides the "redundant" check for the upper bound relation. But the check isn't redundant in case the compare cannot be decided. So the simplest fix to the legacy code is to instantiate those not redundant checks which then results in the "expected" Intersecting int [-INF, minus_1_3(D) + 2] EQUIVALENCES: { x_6(D) } (1 elements) and int ~[-2147483647, -2147483646] EQUIVALENCES: { x_6(D) } (1 elements) to int [-INF, minus_1_3(D) + 2] EQUIVALENCES: { x_6(D) } (1 elements) (if we can't do anything fancy, intersection simply chooses the first range as result)