Clang 融合乘加取决于表达式参数的恒定性

Fed*_*dor 5 c floating-point optimization clang fma

如clang 14.0.0 浮点优化的答案所示,自版本 14 起,Clang 即使对于在编译时执行的常量计算也应用融合乘法加法 (FMA) 指令。

同时,我们可以观察到结果取决于表达式参数的形式恒定性:

#include <stdio.h>

int main() {
    const float A = 2.1f;
    const float B = 0.1f;
          float C = 0.1f;
    float V = A * B - A * B;
    float W = A * C - A * C;
    printf( "%g %g", V, W );
}
Run Code Online (Sandbox Code Playgroud)

在 Clang 中,程序打印0 1.49011e-10,在线演示:https://godbolt.org/z/a3fcYG7ob

从汇编代码可以看出, 和V都是W在编译时求值的。是否有一些规则规定只能W使用 FMA 指令进行评估?

添加-mno-fma用于禁用 FMA 指令的命令行选项不会改变结果中的任何内容。