<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/136746>136746</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
fshr-related miscompile by AArch64 backend
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:AArch64,
llvm:codegen,
miscompilation
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
regehr
</td>
</tr>
</table>
<pre>
here's a function:
```llvm
; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.fshr.i64(i64, i64, i64) #0
define i1 @f(i64 %0) {
%2 = or i64 1, %0
%3 = call i64 @llvm.fshr.i64(i64 %2, i64 %0, i64 0)
%4 = icmp uge i64 0, %3
ret i1 %4
}
attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
```
the AArch64 backend lowers it as follows:
```
_f:
mov w0, wzr
ret
```
but `f(0)` should evaluate to 1 (and it does when compiled using Apple's latest clang)
(test case generated by @dtcxzyw's mutator)
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysU8uO6zYM_Rp5Q0ygSPIjCy88HeQ3ClmibbWyFOiRNPfrC8m-t8UsuipgRBFF8vCQhzJGszrEkbSfpP1qZE6bD2PAFbfQzF6_xw0DEtZHkLBkp5LxjvCJ0Il09Pisfe7lzj_hfnrAlFKIhE_gvJLWzlL9Cc4vARGcj2-nwPnsXsZpiA9U2cokZ4vwMtYGTDk42HH34U3Y4LxDwm6EThqVlQHBdAKIqMCXJW7hYjpB2FB_f4N_HzcgjNNSXYlejEMw1xK7HP5AWEurW_9J6ATlzoDwL_ChwlxLqup0vvL6Wkj9Rxk1zVnECXH8pweRmknUTEbtD8gr_nyuaLz6BEy1WtaKwqD_OnjIlIKZc8JYydUspP_8H1sNJ9bPCRM6pQ1hmoLaOgEFAp0G618YIpgEMsLirfWv-E0bhE6_L6eN3nb_JPT2qixfP8JhDJi-Rcw5AenqiGq_Ogpx89lqwKe0WSaE5KE0ZpBOF3ztMcJrQwfK7w9jUUOOxq0wPR72kK-VCWMCZaVbjyGUjw2HVUaEFR0GmVDD_C5z1Un99eP9qtF7TjL5cAQ2euT6xm-ywfHai5aLYaB9s40SBaV64ddr2w6z0kO7zEK0auZ6HljXN2ZklLVUMHa90U70l57PVIgbowK5kHNLBMVdGnupovJhbUyMGccr73rRNVbOaGPdVsbOMRA-nYMhrGiOMFY3kk_Ka1zR_TLvJh7tkXWLGSsrH8bi_THnNRYtm5jiP-DJJItj0fZHQFt78ysJljZ9k0STgx23lB5VB-xO2H01acvzRfmdsHst7Dg-HsH_gSoRdq8UI2H3k-VzZH8HAAD__6UpYlo">