【问题标题】:Why this behavior on clang -O3?为什么在 clang -O3 上有这种行为?
【发布时间】:2013-07-18 21:19:00
【问题描述】:

这是一个计算整数除数的简短程序。该程序运行正常。然而,问题在于,在 Clang C++ 编译器(3.3 版,主干 180686)的当前主干的 -O3 优化标志下,程序的行为发生了变化,结果不再正确。

代码

代码如下:

#include <iostream>

constexpr unsigned long divisors(unsigned long n, unsigned long c)
{
    // This is supposed to sum 1 anytime a divisor shows up
    // in the recursion
    return !c ? 0 : !(n % c) + divisors(n, c - 1);
}

int main()
{
    // Here I print the number of divisors of 9 numbers! (from 1 to 9)
    for (unsigned long i = 1; i < 10; ++i)
        std::cout << i << " has " << divisors(i, i) << " divisors" << std::endl;
}

正确的行为

这是使用的编译命令,以及正确和预期的输出,程序在正常情况下会显示:

clang++ -O2 -std=c++11 -stdlib=libc++ -lcxxrt -ldl sample.cpp -o sample
./sample 
1 has 1 divisors
2 has 2 divisors
3 has 2 divisors
4 has 3 divisors
5 has 2 divisors
6 has 4 divisors
7 has 2 divisors
8 has 4 divisors
9 has 3 divisors

不正确的行为

这是用于生成提供不正确输出的二进制文件的命令行。请注意,唯一的变化是优化标志(-O2-O3。)

clang++ -O3 -std=c++11 -stdlib=libc++ -lcxxrt -ldl sample.cpp -o sample
./sample 
1 has 1 divisors
2 has 2 divisors
3 has 2 divisors
4 has 1 divisors
5 has 2 divisors
6 has 3 divisors
7 has 2 divisors
8 has 2 divisors
9 has 2 divisors

编辑

我已更新到树干尖端,clang 版本 3.4(树干 183073)。该行为不再重现,它应该已经以某种方式修复。任何知道这是什么问题的人,如果有一个实际验证和修复,请随时提供答案。如果没有经过验证,可能会发生回归。

【问题讨论】:

    标签: c++ optimization clang constexpr compiler-bug


    【解决方案1】:

    看起来你被this bug in llvm 咬了。您可以通过禁用循环矢量化器来解决它,或者(正如您已经发现的那样)通过更新到比 r181286 更新的版本的 llvm 构建。

    如果您检查差异,您会看到已添加测试用例作为修复的一部分。这应该可以防止这个问题在未来再次出现。

    【讨论】:

    • 你把它一分为二了吗?有限制吗?因为我无法在我的机器上及时将其一分为二。
    • 我做到了,而且还不错。你用的是 git 还是 svn?
    • 目前我正在使用 llvm 的 svn 存储库,但如果我确定要这样做,我会选择 git,但即使使用 git,我更关心构建时间,一分为二.
    • llvm+clang(这是我测试的全部)即使在我的机器(17" macbook pro)上从头开始构建也只需不到十分钟。也许会更长一点?但总的来说还不错. 平分步骤并不总是需要完全重建,所以通常比这更快。总的来说还不错 - 我只是在后台做这件事,同时在房子周围做其他事情。跨度>
    • 好的,我从来没有用过重的东西来做这个,我想我会试试看的。
    猜你喜欢
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 2018-06-19
    相关资源
    最近更新 更多