gcc -fno-trapping-math 有什么作用?

A F*_*Fog 7 floating-point gcc exception-handling compiler-optimization

我找不到任何 -fno-trapping-math 选项有效的示例。

我希望 -ftrapping-math 禁用可能影响是否生成陷阱的优化。例如,使用 x87 指令或 FMA 指令计算具有扩展精度的中间值可以防止发生溢出异常。-ftrapping-math 选项不会阻止这种情况。

公共子表达式消除可能会导致发生一个异常而不是两个异常,例如优化 1./x + 1./x = 2./x 在 x=0 时将生成一个陷阱而不是两个。-ftrapping-math 选项不会阻止这种情况。

请给出一些被 -fno-trapping-math 阻止的优化示例。

您能否推荐比 gcc 手册更好地解释不同浮点优化选项的任何文档,也许包含每个选项优化的代码的具体示例?可能适用于其他编译器。

Sne*_*tel 6

一个简单的例子如下:

float foo()
{
    float a = 0;
    float nan = a/a;
    return nan;
}
Run Code Online (Sandbox Code Playgroud)

使用 GCC 7.3 for x64 编译,位于-O3

foo():
  pxor xmm0, xmm0
  divss xmm0, xmm0
  ret
Run Code Online (Sandbox Code Playgroud)

...这是不言自明的。请注意,它实际上是在做 div(尽管知道 0/0 是 nan),这并不是特别便宜!它必须这样做,因为您的代码可能试图故意引发浮点陷阱。

-O3 -fno-signaling-nans -fno-trapping-math

foo():
  movss xmm0, DWORD PTR .LC0[rip]
  ret
.LC0:
  .long 2143289344
Run Code Online (Sandbox Code Playgroud)

也就是说,“只需加载一个 NaN 并返回它”。这是相同的行为,只要你不依赖有一个 trap