为啥 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 如何在 linux 上实现 C++ 异常的堆栈展开?