<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/63064>63064</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[InstCombine] Unsound transform introducing `fshr`: Value mismatch
</td>
</tr>
<tr>
<th>Labels</th>
<td>
miscompilation,
llvm:instcombine
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
fhahn
</td>
</tr>
</table>
<pre>
Running `llvm/test/Transforms/PhaseOrdering/rotate.ll` through Alive2 (with `opt-alive.sh`) shows that InstCombine performs an unsound transformation, after which there is a value mismatch
Reproducer IR for just running Instcombine:
```
define i32 @rotl(i32 %a, i32 %b) {
entry:
%cmp = icmp eq i32 %b, 0
%sub = sub i32 32, %b
%shr = lshr i32 %a, %sub
%shl = shl i32 %a, %b
%or = or i32 %shr, %shl
%cond = select i1 %cmp, i32 %a, i32 %or
ret i32 %cond
}
```
Alive2 Report:
```
define i32 @rotl(i32 %a, i32 %b) {
%entry:
%cmp = icmp eq i32 %b, 0
%sub = sub i32 32, %b
%shr = lshr i32 %a, %sub
%shl = shl i32 %a, %b
%or = or i32 %shr, %shl
%cond = select i1 %cmp, i32 %a, i32 %or
ret i32 %cond
}
=>
define i32 @rotl(i32 %a, i32 %b) {
%entry:
%cond = fshr i32 %a, i32 %a, i32 %b
ret i32 %cond
}
Transformation doesn't verify! (unsound)
ERROR: Value mismatch
Example:
i32 %a = #x40000000 (1073741824)
i32 %b = #x00000011 (17)
Source:
i1 %cmp = #x0 (0)
i32 %sub = #x0000000f (15)
i32 %shr = #x00008000 (32768)
i32 %shl = #x00000000 (0)
i32 %or = #x00008000 (32768)
i32 %cond = #x00008000 (32768)
Target:
i32 %cond = #x00002000 (8192)
Source value: #x00008000 (32768)
Target value: #x00002000 (8192)
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVk2P2zYQ_TXUhYghDfXlgw6b9RrIKYWb9k5RI5MBJaoktZv99wUp2avY26AFGiCLhSxRb968maE4w51T5xGxIcVHUhwSPntpbNNLLsekNd1rc5rHUY1nSspU6-eBwNGj8wSOXywfXW_s4Agcf5Pc4WfboVXjmcDRGs897rQmZUq9tGY-S_qg1TMCJVC_KC8Do5n8Bx5Wd06SMiWwp06aF0e95J5-Gp1_NEOrRqQT2uiL8pHOozPz2FF_UcC9MiOBR8p7j5a-SCUk9RItUuUop89cz0gH5QbuhSTpgaQPy_WEkzXdLNDSTyfaG0u_zs5TuwYdFIhFAWEPW8OgdvmPjx32QaViQEmeWuM1gTo-QcGDsvW-DSGS6uNihaO3r1fi8F4MEyXsQFW4wb82Zo90dUXDgpvbiAu_AcMgICJyA5I2gnS42YpZCL5D6oVO6lvgFmYWPnNlc9Je-KTeAIUZu4UQNQpPVbYGt0nFNi3GXowt-stiIFmTXR3ezfr2um6uE07G-p9RLALFTb1-7YL9EvViB8Ke_t-sb-X2t4l6l-9fSf3y3WFCO4NuJFB5-oxW9a8EQkrq9eghsF-snk6nzyfCHuif_3jEPH3jw6Tfzo-LxBgAAfYtT5e_wJ-lFavyrIb86uISxhW_oLOoJ6uuuOX6u5mt2DjLtps0Wgez9Jb9sj3f-NM-8hd3yHWPXpD1qpxBVdb3YH1L-75_8x9Ir9X_MXotK7dn9LfJv6OAlaLO9nBlWHK5dI9Q4x_7Wzzdo9-lvp5ISdewbs_2PMEmK-uizHNW1Ilsipa1exQC9wAI2GLfd0KUVdntWSVQJKqBFFhapllWM2DZTpRVB53oyrzNsRMVyVMcuNK70Ld3xp4T5dyMTcnSMk80b1G72PcBBuWEGSal104aDicCEBs-e1CbLggQxgTbhFcf2vnsSJ5q5bx78-KV13Gg2PRvUhzoH7dtm6rRx-67zhfhaw5ZufucktnqRno_uVBIOBI4npWXc7sTJkwk62ASNU3WfEURBpQYbRhOYsB_BwAA__83jWh1">