<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/123139>123139</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missed optimization(?): LLVM ignores carry flag after a 'shr'
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
shelerr
</td>
</tr>
</table>
<pre>
https://godbolt.org/z/zdhPve74e
```
unsigned int bar1();
unsigned int bar2();
int foo(unsigned int num) {
unsigned int temp = num >> 12;
if ((num >> 11) % 2 == 0) {
return bar1() + temp;
} else {
return bar2() * temp;
}
}
```
```
foo(unsigned int):
push rbx
mov ebx, edi
shr ebx, 12
test edi, 2048
jne .LBB0_2
call bar1()@PLT
add eax, ebx
pop rbx
ret
.LBB0_2:
call bar2()@PLT
imul eax, ebx
pop rbx
ret
```
On x86 64, 'shr' sets carry flag to the value of the last bit shifted out of the destination operand. So, I would expect the conditional jump to just be 'jc', insted of 'test'+'jne'. Am I missing something?
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJx8VNGuozYQ_ZrhZbSRGSDAAw-kdyOtdFddqVVfKxNPwJHByDbp3f36yiS3l2TbRk4s-5wzZzzjWHqv-4m5geIAxUsilzBY1_iBDTuXdFZ9b4YQZg9ZC3QEOvZWddaEnXU90PFH_Krh25XLnEG0cezFfYh2mdbwCvUUsJMuBaqAasgO_wLSFgTRxu2ztUDVA3NaRqAaoYw0fIACjzNC9hI5CNlnyD5jSreAiIj6jKtHtcXTNRoVSFEa1WIT33FY3LTJHYEOq9FHWChfkI3nd8398yGlf6TtVgrlSzzp7XdTtaflzzVYq9RurObFD6tl97bZHe0VuXsD-gVZ6Q3gB7fOdzClDRbYhxVTOmIk8mqDXibG3evhIP7cak7SmDhvOpyLb6-_byhSqZulvOXzkOhs56fUHQcQ7bvTw1k3ZvQfZnpczP-a_Vyrm-FzF0T764Rv1R73eQwEVPrBAZXoOXg8See-49nIHoPFMDBepVkY7XldGOkDdjqgH_Q5sEK7hHdMsQ96kkHbCe3MTk5qh7_ZaPIF_7KLUchvM5_Cyj7ZSenIlQYvyzhHu8sSo3PM6XICKqNUT371ide8jI1c9w-RMjFQucN2xC84au_11KO3I4dBTz1kx0Q1maqzWibcpGW2r6ssK9NkaGRdsqrPuaxyplyWeSmozjNZcCH3RVUluiFBhUjTgjKiIt3xqS5EmXa1KIoiV3vIBY9Sm50x1zG-G4n2fuEmpSzN6sTIjo1_f4BcE1mfuqX3kAujffAfuqCD4ear9j6ecg561D_WGsZ7kB1vfwt8ff3jK-p-so4feiTPgR3Kjy4mizPPr5sOw9LtTnYEOkbf-_RpdvbCpwB0XJP3QMd7_teG_g4AAP__tXN-OQ">