首页 > 解决方案 > 为什么三元没有像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);
    }
}

不知何故,他们的组装结果是不同的。为什么?您可以看到从这里的第一个文件和这里的第二个文件创建的程序集。

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

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

标签: cternary-operator

解决方案


看来问题是由 GCC 中的 GIMPLE 引起的错过的优化错误。Clang 没有这个错误,因此它会生成相同的程序集。

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


推荐阅读