Clamp function was too optimistic when choosing signed or unsigned min/max function for calculations.
In fact, !IsSignedPredicate guarantees us that Smallest and Greatest can be compared safely using unsigned
predicates, but we did not check this for S which can in theory be negative.
This patch makes Clamp use signed min/max for cases when it fails to prove S being non-negative,
and it adds a test where such situation may lead to incorrect conditions calculation.
I think there is just one missed case of checking isKnownNonNegative right?
Just looked through IRCE code and we correctly check it for choosing the right predicate: ULT or SLT.