[Bug rtl-optimization/3507] appalling optimisation with sub/cmp on multiple targets
vanyacpp at gmail dot com
gcc-bugzilla@gcc.gnu.org
Tue Jun 15 06:24:57 GMT 2021
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3507
Ivan Sorokin <vanyacpp at gmail dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |vanyacpp at gmail dot com
--- Comment #60 from Ivan Sorokin <vanyacpp at gmail dot com> ---
Another similar case. On this function:
unsigned wrap(unsigned index, unsigned limit)
{
if (index >= limit)
index -= limit;
return index;
}
GCC 11.1 -O2 generates:
wrap(unsigned int, unsigned int):
mov edx, edi
mov eax, edi
sub edx, esi
cmp edi, esi
cmovnb eax, edx
ret
I believe cmp here is redundant as the flags are already set after sub. After
removing cmp we get:
wrap(unsigned int, unsigned int):
mov edx, edi
mov eax, edi
sub edx, esi
cmovnb eax, edx
ret
Now the register edx becomes unneeded:
wrap(unsigned int, unsigned int):
mov eax, edi
sub edi, esi
cmovnb eax, edi
ret
More information about the Gcc-bugs
mailing list