LLVM IR 浮点环境

默认的LLVM浮点环境假定浮点指令没有副作用。结果假设为舍入到舍入模式。此环境中不保留浮点异常状态。因此,在这些示例中,不会尝试创建或保留无效操作(SNaN)或零除异常。

这种无异常假设的好处是可以自由地推测浮点运算,而不需要对浮点模型进行任何其他快速数学松弛。

需要与此不同的行为的代码应使用 Constrained Floating-Point Intrinsics

快速数学标志

LLVM IR浮点运算(faddfsubfmulfdivfremfcmp)和call可以使用以下标志来启用其他不安全的浮点转换。

  • nnan: 没有NaNs - 允许优化假设参数和结果不是NaN。需要进行这样的优化才能在NaN上保留已定义的行为,但结果的值未定义。
  • ninf: 无Infs – 允许优化假设参数和结果不是+/-Inf。需要进行这样的优化才能在+/-Inf上保留已定义的行为,但结果的值未定义。
  • nsz: 无签名零 – 允许优化将零参数或结果的符号视为无关紧要。
  • arcp: 允许互惠(Reciprocal) – 允许优化使用参数的倒数而不是执行除法。
  • contract: 允许浮点收缩(例如,融合乘法,然后将加法融合为融合乘加)。
  • afn: 近似函数 – 允许用近似计算代替函数(sinlogsqrt等)。有关可应用于LLVM的内在数学函数的位置,请参阅浮点内在定义。
  • reassoc: 允许重新关联转换为浮点指令。这可能会显着改变浮点结果。
  • fast: 这个标志暗示其他所有的。