[Bug middle-end/62263] Good codegen for bitwise rotate requires code that is technically undefined behavior
oneill+gccbugs at cs dot hmc.edu
gcc-bugzilla@gcc.gnu.org
Tue Aug 26 17:12:00 GMT 2014
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62263
--- Comment #6 from M.E. O'Neill <oneill+gccbugs at cs dot hmc.edu> ---
(In reply to Marek Polacek from comment #3)
> We handle at least
> (x << n) | (x >> ((-n) & 31))
> (N can be 0 here) since PR57157.
Although this code does work with LLVM, testing with GCC 4.9.0, and this
implementation
unsigned int rotl32_doubleand4(unsigned int v, unsigned char r)
{
return (v << (r & 31)) | (v >> ((-r) & 31));
}
(or variations with r being a char or int) produces code like this:
_rotl32_doubleand4:
LFB6:
movl %esi, %ecx
movl %edi, %eax
negl %ecx
shrl %cl, %eax
movl %esi, %ecx
sall %cl, %edi
orl %edi, %eax
ret
... so it failed to spot the idiom entirely.
More information about the Gcc-bugs
mailing list