为什么三元没有编译成同一个程序集?
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
我有两个文件:
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