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

时间:2018-05-16 15:25:12

标签: gcc exception-handling floating-point 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手册更好地解释不同浮点优化选项的文档,可能还有每个选项优化的特定代码示例?可能是其他编译器。

1 个答案:

答案 0 :(得分:3)

一个简单的例子如下:

float foo()
{
    float a = 0;
    float nan = a/a;
    return nan;
}

使用GCC 7.3 for x64编译,-O3

foo():
  pxor xmm0, xmm0
  divss xmm0, xmm0
  ret

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

使用-O3 -fno-signaling-nans -fno-trapping-math

foo():
  movss xmm0, DWORD PTR .LC0[rip]
  ret
.LC0:
  .long 2143289344

也就是说,“只需加载NaN并返回它”。这是相同的行为,只要您不依赖于存在陷阱