https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121803
Bug ID: 121803
Summary: gcc missed optimze manual byte swap to bswap
instrution
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: rockeet at gmail dot com
Target Milestone: ---
gcc missed optimization:
```
long long get_big_endian(const unsigned char* p) {
long long r = 0;
for (int i = 0; i < sizeof(long long); i++)
r |= (long long)(p[i]) << ((sizeof(long long)-1-i)*8);
return r;
}
```
clang(-O2) optimized this code to bswap:
```
get_big_endian(unsigned char const*):
mov rax, qword ptr [rdi]
bswap rax
ret
```
but gcc(-O2) does not:
```
"get_big_endian(unsigned char const*)":
mov ecx, 56
xor edx, edx
.L2:
movzx eax, BYTE PTR [rdi]
add rdi, 1
sal rax, cl
sub ecx, 8
or rdx, rax
cmp ecx, -8
jne .L2
mov rax, rdx
ret
```
see: https://godbolt.org/z/f9bcTGeah