繁体   English   中英

__builtin_unreachable 与 GCC 中的浮点数

[英]__builtin_unreachable with floats in GCC

我有以下代码,我正在使用 gcc 进行编译。

float add(float a, float b) {
    float sum = a + b;
    if (sum != 0) __builtin_unreachable();
    return sum;
}

当我使用-O3时,我得到以下程序集

add:
        addss   xmm0, xmm1
        ret

但是使用-Ofast我得到以下内容

add:
        pxor    xmm0, xmm0
        ret

看起来编译器确实理解假设 function 预计返回 0。是什么阻止 GCC 在没有-Ofast的第二个示例中返回 0?

来自GCC 文档

-fno-signed-zeros
允许对忽略零符号的浮点算术进行优化。 IEEE 算术指定不同的 +0.0 和 -0.0 值的行为,然后禁止简化表达式,例如 x+0.0 或 0.0*x(即使使用 -ffinite-math-only)。 此选项意味着零结果的符号不重要。

默认值为 -fsigned-zeros。

-Ofast包括这个优化选项,而-O3没有。

如果没有这个选项,function 需要返回加法结果的有符号零的确切值,因此编译器只需执行加法。

如果0更改为其他值,例如11.2f1.5 ,则编译器将在没有-ffast-math的情况下进行优化。

备注:如果将值更改为1.2 (因此比较与标准要求的static_cast<double>(sum).=1.2相同),则编译器将保留加法,尽管__builtin_unreachable()将始终为执行是因为在转换为双精度时没有完全等于1.2float值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM