我在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;
}
Run Code Online (Sandbox Code Playgroud)
这是为带-O3选项的clang 8.0.0和9.0.0生成的程序集(来自godbolt):
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
Run Code Online (Sandbox Code Playgroud)
如您所见,rot2方法已正确优化,并使用了一条ror指令。但是令我惊讶的是,没有使用该指令main(),整个代码都使用shift和或指令。
知道为什么会发生这种奇怪的错误吗?gcc和msvc不会犯此奇怪的错误。
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |