gcc -fno-trapping-math 有啥作用?

Posted

技术标签:

【中文标题】gcc -fno-trapping-math 有啥作用?【英文标题】:What does gcc -fno-trapping-math do?gcc -fno-trapping-math 有什么作用? 【发布时间】:2018-05-16 15:25:12 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

一个简单的例子如下:

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 并返回它”。这是相同的行为,只要您不依赖陷阱

【讨论】:

以上是关于gcc -fno-trapping-math 有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

“gcc -s”和“strip”命令有啥区别?

GCC -g vs -g3 GDB 标志:有啥区别?

linux gcc编译参数有啥用?

这个 GCC 内联汇编中的参数列表有啥问题?

调用 gcc _without_ -pthread 有啥好处?

以“tree”开头的 gcc 标志有啥特别之处?