为什么 clang 无法展开循环(gcc 展开)?

Why does clang is unable to unroll a loop (that gcc unrolls)?

我正在用 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 也应该展开它。

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

https://godbolt.org/z/VYn0CA

唯一的区别是整数的大小