Mark some FP intrinsics as safe to speculatively execute
Floating point intrinsics in LLVM are generally not speculatively
executed, since most of them are defined to behave the same as libm
functions, which set errno.
However, the only error that can happen when executing ceil, floor,
nearbyint, rint and round libm functions per POSIX.1-2001 is -ERANGE,
and that requires the maximum value of the exponent to be smaller
than the number of mantissa bits, which is not the case with any of
the floating point types supported by LLVM.
The trunc and copysign functions never set errno per per POSIX.1-2001.
Context: our architecture uses soft-FP, and hoisting FP out of loops provides massive gains.
Often, LLVM can turn rapidly changing FP expressions into integer expressions, and hoist
slowly changing FP expressions out of loops. Hoisting FP intrinsics are the last low-hanging
fruit in our codebase.