Clang优化函数中的“ ror”指令,但内联函数时不优化

我在clang优化中发现了一个奇怪的错误。这是代码:

#include <iostream>

unsigned int rot2(unsigned int a,size_t k) {
    return (a >> k) | (a << (sizeof(unsigned int) * 8 - k));
}

int main() {
    unsigned int x;
    std::cin >> x;
    auto n = rot2(x,5);
    std::cout << n;
}

这是使用-O3选项(来自godbolt)为clang 8.0.0和9.0.0生成的程序集:

rot2(unsigned int,unsigned long):                              # @rot2(unsigned int,unsigned long)
        mov     rcx,rsi
        mov     eax,edi
        ror     eax,cl
        ret
main:                                   # @main
        push    rax
        lea     rsi,[rsp + 4]
        mov     edi,offset std::cin
        call    std::basic_istream<char,std::char_traits<char> >& std::basic_istream<char,std::char_traits<char> >::_M_extract<unsigned int>(unsigned int&)
        mov     esi,dword ptr [rsp + 4]
        mov     rax,rsi
        shr     rax,5
        shl     esi,27
        or      rsi,rax
        mov     edi,offset std::cout
        call    std::basic_ostream<char,std::char_traits<char> >& std::basic_ostream<char,std::char_traits<char> >::_M_insert<unsigned long>(unsigned long)
        xor     eax,eax
        pop     rcx
        ret

如您所见,rot2方法已正确优化,并使用了ror指令。但是令我惊讶的是,main()中未使用此指令,并且整个代码都使用shift和or指令。

知道这个奇怪的错误为什么会发生吗? gcc和msvc不会犯这个奇怪的错误。

gao421184686 回答:Clang优化函数中的“ ror”指令,但内联函数时不优化

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3046170.html

大家都在问