The logic there only considers SLT/SGT predicates. We can use the same logic
for proving ULT/UGT predicates if all involved values are non-negative.
Adding full-scale support for unsigned might be challenging because of code amount,
so we can consider this in the future.
I'm confused by this check, it seems overly complicated given the comment? Why is this simply not:
if (isKnownNonNegative(LHS) && isKnownNonNegative(RHS) &&
}