【发布时间】:2020-12-30 01:51:33
【问题描述】:
我有以下代码,我正在使用 gcc 进行编译。
float add(float a, float b) {
float sum = a + b;
if (sum != 0) __builtin_unreachable();
return sum;
}
当我使用-O3 时,我得到following assembly。
add:
addss xmm0, xmm1
ret
但是-Ofast 我得到了following。
add:
pxor xmm0, xmm0
ret
看起来编译器确实理解假设函数应该返回 0。是什么阻止了 GCC 在没有 -Ofast 的情况下返回 0 的第二个示例?
【问题讨论】:
-
负零? -
-
@user202729 哈哈。你说的对。它适用于 1。谢谢。
-
虽然我觉得基于 unreachable 的值优化并没有得到很好的支持(因为在大多数实际程序中你不能从中得到太多?)。
-
@user202729 也许吧。我只是好奇为什么会这样。原因很简单。谢谢。