首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC不执行循环不变码运动

GCC不执行循环不变码运动
EN

Stack Overflow用户
提问于 2016-02-14 02:43:34
回答 1查看 1.3K关注 0票数 3

我决定用g++来检查循环不变码运动优化的结果。但是,当我使用-fmove-loop-invariants编译以下代码并分析其程序集时,我发现k + 17计算仍然在循环体中执行。

什么能阻止编译器优化它呢?

可能是编译器得出结论,认为重新计算k + 17更有效。

代码语言:javascript
复制
int main()
{
    int k = 0;
    std::cin >> k;

    for (int i = 0; i < 10000; ++i)
    {
        int n = k + 17; // not moved out of the loop
        printf("%d\n", n);
    }

    return 0;
}

使用g++ -O0 -fmove-loop-invariants 4.6.3和g++ 4.8.3尝试了g++、g++ -O3g++ -O3 -fmove-loop-invariants

EN

回答 1

Stack Overflow用户

发布于 2016-02-14 03:12:34

编辑:忽略我以前的答案。你可以看到,计算被折成一个常数。因此,是执行循环不变优化的

因为as-if rule。简单地说,编译器不允许进行任何可能影响程序可观察行为的优化,在本例中是printf。如果使n易失性并移除printf,您可以看到会发生什么情况。

代码语言:javascript
复制
for (int i = 0; i < 10000; ++i)
{
    volatile int n = k + 17; // not moved out of the loop
}

// Example assembly output for GCC 4.6.4
// ...
        movl    $10000, %eax
        addl    $17, %edx
.L2:
        subl    $1, %eax
        movl    %edx, 12(%rsp)
// ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35387788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档