<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/108722>108722</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Invalid rotate-right codegen on x86_64 (LLVM 18)
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
dnadlinger
</td>
</tr>
</table>
<pre>
The following test program fails on Clang 18.1.0/x86_64 with -O1 and above:
```c
#include <assert.h>
#include <stdint.h>
uint32_t ror(uint32_t val, uint32_t amount) {
return (val >> amount) | (val << (32 - amount));
}
__attribute__((noinline))
uint32_t bytesEqual(uint32_t val) {
return ror(val, 8) == val;
}
int main() {
assert(!bytesEqual(0x12345612));
}
```
See [on the Compiler Explorer here](https://godbolt.org/z/6aG3eh85M).
Clang 17 produces the following correct output:
```asm
bytesEqual(unsigned int):
mov ecx, edi
rol ecx, 24
xor eax, eax
cmp ecx, edi
sete al
ret
```
Clang 18 replaces the computation with a `movzx` copying out the lower bytes, and a `shr` to just take the upper byte, i.e. comparing just those two:
```asm
bytesEqual(unsigned int):
movzx ecx, dil
shr edi, 24
xor eax, eax
cmp ecx, edi
sete al
ret
```
(Reported by "user1234" on the LDC mailing list.)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVVFv4zYM_jXKC1HDppzYefDDNWmGAT0M2Ia9BorNxLrJkifRadpfP8h2r03WHjDgAiOG_JHUR36kpELQJ0tUieW9WG4XauDW-aqxqjHansgvDq55rv5sCY7OGPek7QmYAkPv3cmrDo5KmwDOwsYoe4KsTLIkFbi7lKv9KocnzS3c_ZaBsg2ogzuTkF9EuhXpF7FKp6ee1yi1rc3QEAi5USGQ56QV8uEjOHCj7RU8_g_assQ9g3deYPl9eVZG4Aa-r1XnBssC1yCK-8kVAMATD96CwPKsDMTY8uHKdvOGbYQcVxLh7s0mPnKOKIrte277vWL2-jAw7fcCS4GlddoabWl2vE7h8MwUHv4ZIvWbTD6mPeU8p1qOVnIr5Hb0-YSUtgyd0nbkcxN2kmBEsisy6SVDmS9XGX6a8au20_IPIhDLe2eBW4KN63ptyMPDpTfOk4eWPInlVmDZMvchtgjuBO5Orjk4w4nzJ4G7F4G7lfpFUlsuvwpcJ-8TmduviI3ZDDWFcau3pq2d91QzuIH7gf_bhCp005frsttxPhrQk7qvbjD_Once31RfYtGp0de4d-Y9jvk1fHEeSE2u6nKN1V3_w9CBmEaVzPzdE39Y_Kv6lOCpN-q1PrXr-oEVa2enUVUgVmnnzi8XsUqhdv1zLJ4beDQ37on81JiR0zjT0SG0Ppqzg29DYGD1N432Q9_P9tFcJ5SMOyofg06mrQsE_OR-oiIvl9eiNdrcFK31U1Eb_ZkeI3yryf8W41X_H2oisPydeueZGjg8g0AcAvk4WwIR5ml53G7ihMbjGIwOnAhcL5pKNmu5VguqsgJXcpnjGhdtdcgKVTdrVeSFqpVcFjKXR1ku5bGURS5poStMMU_XWY64zCQmpJojHalZ1esCC5WKPKW4XWLMuYuDt9AhDFRlaVkgLow6kAnjdYFo6QlGVCDG28NX0enuMJyCyNNINryFYc2Gql_tWRndgHesmO68PrUMtWvoRDZmPF8bAsvHx7--QhZPpcXgTXVzMGhuh0NSu07gLm4xv-56775RzQJ3I7EgcDczP1f4bwAAAP__bmX_yA">