<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">