我找不到-fno-陷阱-数学选项有效果的任何例子。
我希望-触发器-数学将禁用可能影响是否生成陷阱的优化。例如,使用x87指令或FMA指令计算具有扩展精度的中间值可以防止溢出异常的发生。数学选项并不能阻止这一点。
公共子表达式消除可能导致一个异常而不是两个异常,例如,当x=0时,优化1.x+1.x=2.x将产生一个陷阱而不是两个陷阱。数学选项并不能阻止这一点。
请给出一些优化的例子,这些优化被-fno-陷阱-数学所阻止.
您能推荐比gcc手册更好地解释不同浮点优化选项的文档吗?可能是为了其他编译器。
发布于 2018-05-16 09:08:18
一个简单的例子如下:
float foo()
{
float a = 0;
float nan = a/a;
return nan;
}
用GCC 7.3为x64编译,at -O3
foo():
pxor xmm0, xmm0
divss xmm0, xmm0
ret
...which是很清楚的解释.请注意,它实际上是在执行div (尽管知道0/0是nan),这并不特别便宜!它必须这样做,因为您的代码可能试图故意引发浮点陷阱。
用-O3 -fno-signaling-nans -fno-trapping-math
foo():
movss xmm0, DWORD PTR .LC0[rip]
ret
.LC0:
.long 2143289344
也就是说,“只需加载一个NaN并返回它”。这是相同的行为,只要你不依赖于有陷阱。
https://stackoverflow.com/questions/50374771
复制