为什么clang过度复杂化我的简单因子函数?

nas*_*ndx 7 c++ x86 assembly compiler-optimization clang++

考虑一个简单的阶乘函数:

static int factorial(int n) {
    if (n <= 0) return 1;
    return n * factorial(n - 1);
}

int main(int argc, char** argv) {
    return factorial(argc);
}
Run Code Online (Sandbox Code Playgroud)

编译-O2产生了一个非常有趣的区别:

  • g ++ 7.3:我实际上将相同的循环结构转换为具有10-ish指令的汇编.
  • clang ++ 5.0.0:我收到了大量的220多条指令,我不知道发生了什么.

在这里查看比较(编译器浏览器)

在本地构建并比较运行时,简单的g ++二进制文件肯定会在Ubuntu 17.10上对所有值内的运行速度更快(即不会导致溢出).

谁能告诉我,为什么铛是要这么麻烦,并且什么它试图做(和规模和速度不及格)?

Ric*_*ges 4

谁能告诉我为什么 clang 会遇到这些麻烦,以及它试图做什么(并且在大小和速度上都失败了)?

它试图通过向量化代码来最小化测试和分支操作的数量。

尺寸上肯定是失败的。至于它是否在速度上失败,你对它进行了基准测试吗?

如果添加命令行选项,gcc 也会执行相同的操作-ftree-vectorize