[Bug target/105992] New: memcmp(p, q, 7) == 0 can be optimized better on x86
pdimov at gmail dot com
gcc-bugzilla@gcc.gnu.org
Wed Jun 15 18:01:53 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105992
Bug ID: 105992
Summary: memcmp(p, q, 7) == 0 can be optimized better on x86
Product: gcc
Version: 13.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: pdimov at gmail dot com
Target Milestone: ---
bool eq( char const* p )
{
return __builtin_memcmp( p, "literal", 7 ) == 0;
}
generates
eq(char const*):
cmp DWORD PTR [rdi], 1702127980
je .L6
.L2:
mov eax, 1
test eax, eax
sete al
ret
.L6:
xor eax, eax
cmp DWORD PTR [rdi+3], 1818325605
jne .L2
test eax, eax
sete al
ret
(https://godbolt.org/z/68MKqGz9T)
but LLVM does
eq(char const*): # @eq(char const*)
mov eax, 1702127980
xor eax, dword ptr [rdi]
mov ecx, 1818325605
xor ecx, dword ptr [rdi + 3]
or ecx, eax
sete al
ret
(https://godbolt.org/z/jxcb85Ysa)
There are similar bugs for ARM
(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104611) and AVX512
(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104610) but I haven't found one
for vanilla x86.
Recent changes to std::string::operator== make it use the above pattern:
https://godbolt.org/z/8KxqqG9cx
More information about the Gcc-bugs
mailing list