<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60748>60748</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
erroneous freeze-related optimization due to DivRemPairsPass
</td>
</tr>
<tr>
<th>Labels</th>
<td>
miscompilation,
llvm:optimizations
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
regehr
</td>
</tr>
</table>
<pre>
this IR:
```llvm
define i8 @f(ptr %0, i8 %1, i8 %2) {
%4 = urem i8 %1, %2
%5 = udiv exact i8 %1, %2
store i8 %4, ptr %0, align 1
ret i8 %5
}
```
gets turned by DivRemPairsPass into:
```llvm
define i8 @f(ptr %0, i8 %1, i8 %2) {
%.frozen = freeze i8 %1
%.frozen1 = freeze i8 %2
%4 = udiv exact i8 %.frozen, %.frozen1
%5 = mul i8 %4, %.frozen1
%.decomposed = sub i8 %.frozen, %5
store i8 %.decomposed, ptr %0, align 1
ret i8 %4
}
```
but the transformed code ends up not only returning poison (as does the original code) but also storing poison into the memory cell: https://alive2.llvm.org/ce/z/pDuGCm
cc @aqjune @nunoplopes
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0VE1vozAQ_TXmMmoEAybJgUPaiNXeqv4DGw_ElbFZf0Sb_PoVJG2zTXe1l5WiYDzvjWfePCNC0IMlahh_ZHyfiRQPzjeeBjr4TDp1auJBB_j-wsody_cs37E6v_yMOY6XLUW9tgR6A6zKe4abKXpgyHOGT8su8uJjiQy3wNaPFy7MWxWwcg_J03gLX7AfIH4BKX0E-im6-CdoiM7TNVjNwdtqhNGDheIN6-ktDb92t95_avPyOlAMEJO3pECeYK-PLzQ-C-3DswgBtI3uvyq06r07k10k6D3Rmd5pd6DiHoX3Yn_W8Uq-qvmW6k7_MZlbbb-GrhR1bpxcILWQQpJfnsK_mtkN-Z-nV_19ejJFiAeC6IUNvfMjKeicIiCrAqQJrIvgrDnNKZO32g4wOR2cBYYbEUA5CksG5_WgrTALfR7TnFqY4JYWbnizIxbGSKPzJ-jIGFbu4BDjFGarYMuwFUYfCVezUVbODwzbjhi2Z4bttE_fnq72ufx33ewe8eM1WZpXNlk3GTdRgEw1pdqWW5FRU9TrutyuyxKzQyNq3nW0qankleRSin5dyJqLukBBslKZbjDHMseiKtacl7jifdERygqlkLIvKlblNApt3ovMdAiJmjpfV5vMCEkmLJ8PxFGHeXLaiKidZYgMnxjicg3KnZuiHvV5iYU5yPeZb-bgg0xDYFVudIjh45yoo6GGvHeWXApXRz94MiKSgtt8oBJBdJ_vZZa8aX5XfNDxkOSqcyPDdqns8niYvHulLjJsl_4Cw3Zp8VcAAAD__1EwgNI">