I'm not sure the C-ish examples in the documentation are desirable, but I've added a few examples to make the behavior clear enough.
See the llvmdev thread. As described there:
This patch introduces a new family of intrinsics, for integer saturation: @llvm.usat, and @llvm.ssat (unsigned/signed). Quoting the added documentation:
%r = call i32 @llvm.ssat.i32(i32 %x, i32 %n)
is equivalent to the expression min(max(x, -2^(n-1)), 2^(n-1)-1), itself
implementable as the following IR:
%min_sint_n = i32 ... ; the min. signed integer of bitwidth n, -2^(n-1) %max_sint_n = i32 ... ; the max. signed integer of bitwidth n, 2^(n-1)-1 %0 = icmp slt i32 %x, %min_sint_n %1 = select i1 %0, i32 %min_sint_n, i32 %x %2 = icmp sgt i32 %1, %max_sint_n %r = select i1 %2, i32 %max_sint_n, i32 %1