https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98028
--- Comment #2 from Andrew Macleod <amacleod at redhat dot com> ---
I see
=========== BB 2 ============
<bb 2> :
if (j_3(D) > i_4(D))
goto <bb 3>; [INV]
else
goto <bb 4>; [INV]
=========== BB 3 ============
<bb 3> :
__builtin_unreachable ();
=========== BB 4 ============
j_3(D) unsigned int VARYING
i_4(D) unsigned int VARYING
<bb 4> :
_5 = .SUB_OVERFLOW (i_4(D), j_3(D));
_1 = IMAGPART_EXPR <_5>;
_2 = (_Bool) _1;
_8 = _1;
return _8;
gimple_range_adjustment currently recognizes the SUB_OVERFLOW/IMAGPART_EXPR
pattern and marks _1 as having range [0,1].
Once we can query if i_4 >= j_3, it should be pretty straightforward to change
the range of _1 to [0,0] or [1,1] as appropriate, which should then propagate
to the return.