[llvm] specify NaN behavior more precisely (PR #66579)

James Y Knight via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 18 15:17:43 PDT 2023


================
@@ -3394,17 +3394,41 @@ Floating-Point Environment
 The default LLVM floating-point environment assumes that traps are disabled and
 status flags are not observable. Therefore, floating-point math operations do
 not have side effects and may be speculated freely. Results assume the
-round-to-nearest rounding mode.
+round-to-nearest rounding mode, and subnormals are assumed to be preserved.
+Running default LLVM code in an environment where these assumptions are not met
+can lead to undefined behavior.
+
+The representation bits of a floating-point value do not mutate arbitrarily; if
+there is no floating-point operation being performed, the NaN payload (if any)
+is preserved.
----------------
jyknight wrote:

I do think we should at least mention the major ways in which LLVM backends violate the spec:
- x86-32 with SSE2 enabled may implicitly convert floating-point values returned from a function to x86_fp80 and back; such conversions may signal a floating-point exception, or modify the value.
- x86-32 without SSE2 may do such conversions just about _anywhere_.
- older MIPS versions use the opposite polarity for the sNaN vs qNaN bit, and LLVM does not correctly represent this (this is at least potentially fixable, unlike the above).

https://github.com/llvm/llvm-project/pull/66579


More information about the llvm-commits mailing list