我有两个文件:
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和the second file here创建的程序集。
编译器是否知道它们是等同的,一个更快?他们有不同组件的原因是他们完全同样快,他们之间的唯一区别是操作顺序?
我想知道差异是否是由静态分支预测引起的。在尝试__builtin_expect
后,我相信答案是否定的。
答案 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中,从那里生成硬件相关代码。
您应该学习中间语言,以便了解生成的汇编程序不同的原因。