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

时间:2018-03-09 13:59:51

标签: c++ assembly x86 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);
}

使用-O2进行编译会产生一个非常有趣的区别:

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

See the comparison here (Compiler explorer)

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

任何人都可以告诉我为什么 clang会遇到所有这些麻烦, 它想要做什么(并且无论是大小还是速度)吗

1 个答案:

答案 0 :(得分:4)

  

任何人都可以告诉我为什么clang会遇到所有这些麻烦,以及它尝试做什么(并且在尺寸和速度上都失败了)?

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

它的规模肯定是失败的。至于它是否在速度上失败,你有没有标记呢?

如果添加命令行选项-ftree-vectorize

gcc也会这样做。