<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/145360>145360</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
rem/div-related miscompile from riscv64 and aarch64 backends
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:AArch64,
backend:RISC-V,
miscompilation
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
regehr
</td>
</tr>
</table>
<pre>
I believe we're lowering this incorrectly:
```llvm
define i32 @f(i32 %0, ptr %1) {
%3 = srem i32 %0, 256
store i32 %3, ptr %1, align 4
%4 = sdiv exact i32 %0, 256
ret i32 %4
}
```
let's invoke `f` with `%0=2` and `%1` being a valid pointer to 4 bytes. in this case we should store 2 into memory and then return poison.
however, from the riscv64+m backend we get:
```
f:
sraiw a0, a0, 8
sw zero, 0(a1)
ret
```
the aarch64 output is functionally identical
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJxsU8uOqzgQ_RqzKSUyxStZsKATRbrbGWn2xi7A08aObEMm8_UjQ7qnu3URwq4Hp-qcskUIerRELaveWHXNxBIn51tPI00-6516tr-gJ6NpJXgQw8YTGPcgr-0IcdIBtJXOe5LRPFnRMd6xmu-vMevMeKdo0JZAFwis5APD07bFijO8wD36tM8ZnoE1b4x3kOwCWHGF4GmGr9lY1VtGiM7TR6T4jnMBYfRoofzAKncspVegf4SMv0X09OlPP7Lm-pUK452hyLBJfFf3TsBqPrCaw0PHKRkbXnHF5BNWvVx5MntKYglYhdEK7k7bSB6igxL6Z6RwBG13LaUISWYIk1uMerFE0DY6mGl2_rlhx4lsanjxNsEFZ4-pWd5N7kEr-cRr8G5OieB1kGtdMnyboRfynaxKJUaKP8bFeDfsLng9wQv9AACxKbV_T1_jj339l7xLMc7wJNIkU46n-AM9dSOEl1NdglvifYmgAwyLlVE7K4x5glZko5bCZKot1Lk4i4zavKl4fa7PZZ5NbdWLvOKoOMemqSolJEc5SJ6fVIn96ZzpFjlWvMYir0vE_CjloFD1VDUnJU-9ZCWnWWhzTOfz6PyY6RAWavOyKmqeGdGTCduFQHwJxoqu67bGGSLDy7fIH7_-vBz--gzMOkg337URiVVyV9fMt6nYoV_GwEpudIjh__JRR0Otp5nhTen14MmISAo-kWif5muS2xH40PHVRsgWb9opxntII8Qbw9uo47T0R-kS7nYX9-Vw9-5vkpHhbSMeGN5e3NcW_wsAAP__-_k1Qg">