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

时间:2019-11-23 11:01:22

标签: clang clang++

我在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不会犯这个奇怪的错误。

0 个答案:

没有答案