<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/63060>63060</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [InstCombine] unsound transform: 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/min-max-abs-cse.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 i8 @smax_nsw(i8 %a, i8 %b) {
  %sub = sub nsw i8 %a, %b
  %cmp1 = icmp slt i8 %a, %b
  %cmp2 = icmp sgt i8 %sub, 0
  %m1 = select i1 %cmp1, i8 0, i8 %sub
  %m2 = select i1 %cmp2, i8 %sub, i8 0
  %r = sub i8 %m2, %m1
  ret i8 %r
}
```


Alive2 report:

```
define i8 @smax_nsw(i8 %a, i8 %b) {
%0:
  %sub = sub nsw i8 %a, %b
  %cmp1 = icmp slt i8 %a, %b
  %cmp2 = icmp sgt i8 %sub, 0
  %m1 = select i1 %cmp1, i8 0, i8 %sub
  %m2 = select i1 %cmp2, i8 %sub, i8 0
  %r = sub i8 %m2, %m1
 ret i8 %r
}
=>
define i8 @smax_nsw(i8 %a, i8 %b) {
%0:
  %sub = sub nsw i8 %a, %b
  %cmp1 = icmp slt i8 %a, %b
  %m1 = select i1 %cmp1, i8 0, i8 %sub
  %m2 = smin i8 %sub, 0
  %r = sub i8 %m2, %m1
 ret i8 %r
}
Transformation doesn't verify! (unsound)
ERROR: Value mismatch

Example:
i8 %a = #x01 (1)
i8 %b = #xc4 (196, -60)

Source:
i8 %sub = #x3d (61)
i1 %cmp1 = #x0 (0)
i1 %cmp2 = #x1 (1)
i8 %m1 = #x3d (61)
i8 %m2 = #x3d (61)
i8 %r = #x00 (0)

Target:
i8 %sub = #x3d (61)
i1 %cmp1 = #x0 (0)
i8 %m1 = #x3d (61)
i8 %m2 = #x00 (0)
i8 %r = #xc3 (195, -61)
Source value: #x00 (0)
Target value: #xc3 (195, -61)

```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsVsGOozgU_BpzsRKZBzHhwCEz6UhzmlV2tNeVMQ72CNvINp2ev18ZSEKn0y2tpi8rrRSRBKqe67ngUcx71RohKrT5gjb7hA1BWledJJMmqW3zqzoOxijTYkRJ1z1rBIcgfEBw-OGY8SfrtEdw-EMyL767RjhlWgQHrcxKs5cVq_2Ke7HuOkQJDtLZoZV416lnARjB9qyCjKVtH1Ysnl17iShBUGIv7dnjIFnA34wPX62ulRG4F25cFDODB-PtYBocLlJYUNYg-IrZKQiHz1JxiYMUTmDlMcPPrBsE1sprFrhEZI_IbjoeRe9sM3Dh8LcjPlmHfw4-YDd3HxXwSQHKdkvifKRk_ox_G3GKWtUWo5x4zV7-Nv6MYBtPwIZFhdPPOnaKii8TDcdTfqgxyvY4fht_xgvOSLghue7TEaq47rHvwsdYWGDbC9YPdUSTBVRPRb3oBA9YpZelZtXkpj6SFzx4yIPX-EuRG89d251QGmb9Or2gnLjodfN-F_uHG788zneZE7114d61T_ELwYZcC_9v3mPzPvAu26Ps6T_hwO9uq1bmfc9-Zw9_vBp9uLHCGwRFwM_CqdMvBFHqdh6UCMqJ9XQ8fj-ibIf_encgPr0w3Xe3aTfvzSgVQfZCxsLpteTszvU6z8frJY29rMaRviz_px0cv69-8S7ysyby6WKB9JVpo4YIIW8RcEU8FKnTD1bZLmz7AOFuIu5UzL4w14rwyf39e_X34u7F82xyaTO5dKs0-TO9MOON8qjY1ONrzLsF7-Zu0lRZU2YlS0SV0u2G5oTSTSKrLM9LyGnTNHxbpAUXuaAFKTN6okUBGSSqAgIZoSRNiywlsC4pFIyeipyxrUhLjnIiNFPdOuaVtXVtorwfREUjKelYLTo_5h0ArTy3ulfdHBzig4cAxqCT7dTipQ8Q45Gr4qVVPbQe5aRTPvjbKkGFbgxSi7iCNvu3KeXtg5cMrqtkCL2PdwwcEBxaFeRQr7mNkWtOXuPivbM_BY8JbGwrpq-xs38CAAD__5qBnKY">