为什么三元组不会编译成同一个程序集?

时间:2018-05-29 11:16:18

标签: c ternary-operator

我有两个文件:

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 herethe second file here创建的程序集。

编译器是否知道它们是等同的,一个更快?他们有不同组件的原因是他们完全同样快,他们之间的唯一区别是操作顺序?

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

2 个答案:

答案 0 :(得分:3)

似乎问题是由GCC中的GIMPLE引起的错过优化错误。 Clang没有这个bug,所以它会生成相同的程序集。

我已向海湾合作委员会汇报;可以在此处跟踪错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85971

答案 1 :(得分:1)

C不对硬件中生成的指令施加任何限制。

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

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

您应该学习中间语言,以便了解生成的汇编程序不同的原因。