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 有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章