为什么三元没有编译成同一个程序集?

How come the ternary is not compiled to the same assembly as if?

我有两个文件:

int PolyMod(int s);
void CreateChecksum(int isTestNet, int *mod) {
    *mod = PolyMod(isTestNet == 0 ? 5 : 9);
}

int PolyMod(int s);
void CreateChecksum(int isTestNet, int *mod) {
    if (isTestNet == 0) {
        *mod = PolyMod(5);
    } else {
        *mod = PolyMod(9);
    }
}

不知何故,他们的组装结果是不同的。为什么?您可以看到从 first file here and from the second file here.

创建的程序集

难道编译器不知道它们是等价的,而且一个更快吗?他们有不同的程序集的原因是他们的速度完全一样快,他们之间唯一的区别是操作顺序吗?

我想知道差异是否是由静态分支预测引起的。经过__builtin_expect的试验,我相信答案是否定的

C 对在硬件中生成的指令没有任何限制。

允许生成任何可能的指令,因为生成的代码的语义与 C 的抽象语义(在 ISO 9899 中定义)相同。

编译器将转换许多中间语言(组合器、rtl、ssa、泛型、gimple 等)的 C 代码,特别是在 RTL 中,并从那里生成硬件相关代码。

您应该研究中间语言,以了解生成的汇编程序为何不同。

看来问题是由 GCC 中的 GIMPLE 引起的优化缺失错误。 Clang 没有这个错误,所以它生成相同的程序集。

我已将此事报告给 GCC;可以在此处跟踪错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85971