为啥 clang 无法展开循环(即 gcc 展开)?

Posted

技术标签:

【中文标题】为啥 clang 无法展开循环(即 gcc 展开)?【英文标题】:Why does clang is unable to unroll a loop (that gcc unrolls)?为什么 clang 无法展开循环(即 gcc 展开)? 【发布时间】:2019-09-18 08:31:18 【问题描述】:

我正在用 C 语言编写并使用 clang 进行编译。我正在尝试展开一个循环。循环未展开,有警告。

循环未展开:优化器无法执行请求的转换;转换可能被禁用或指定为不受支持的转换排序的一部分 [-Wpass-failed=transform-warning]

你可以在这里找到结果:https://godbolt.org/z/4flN-k

int foo(int c)
   
    size_t w = 0;
    size_t i = sizeof(size_t);

    #pragma unroll
    while(i--)
    
        w = (w << 8) | c;
    

    return w;

GCC 可以使用 -O3 展开循环,因此我认为 clang 也应该展开它。

【问题讨论】:

clang 也可以使用 -O3 展开。 【参考方案1】:

我不知道,但如果你使用相同的选项,它可以:

https://godbolt.org/z/VYn0CA

唯一的区别是整数的大小

【讨论】:

以上是关于为啥 clang 无法展开循环(即 gcc 展开)?的主要内容,如果未能解决你的问题,请参考以下文章

强制/说服/欺骗 GCC 展开 _Longer_ 循环?

在 MSVC C++ 中强制循环展开

clang-format 展开空初始化程序

gcc 如何在 linux 上实现 C++ 异常的堆栈展开?

为啥 -O3 GCC Optimization 没有内联这个函数?

展开循环并使用矢量化进行独立求和