<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJylU02P2yAQ_TX2ZRQLg2PHBx92G63UHtpD916BwTYthoiPpru_voOTdD9UqYdKNjDM8Hgz8xBOPg1flYJifx8XBSfvhFErOAuzk8KZWOyPBT0sMZ5Cwe4K-oDf1VU5P6P1jL-Xwlo17R8L2lfw0UJcdIDRSZUPkWNBbmNLLp8xP1ftL5tSTdoq0G0DRUMmHiJeqQ8FvQNu9GyhRlhI1vJVyW9cSg8FZQSK7v4CAGjvKRTsCMZxCfnsB7ggoIdk64b0coBtB0ISYNMZozeQHFqTV1HNFvWsfsVrCIPoMtdbjFfxQh1jr0l2x3fZvi6Bx0S0nbFE3qV5AXS7U8QRRp6CCpAbgSYSy5t4mVAQzjqOi5LgUoTJ-X_W9E9-WK7Xue1uyf2V22cXFd7P440EViaTmAyf4cwDljfECh637r6wHd160gbZ8RDUKszTViI7miQVcAtYPM9xI0SfxqidreCL17O23GDs5JJFjhZ8CnFnuM2qymtscl83TQ9VKQcme9bzkqe4OD984j-cOKpZ2TJ5M7zTp45LEhWyQiMX5TrtUN7f1Yi4DzqEpAIu9ox1XbkMdGo7lN6BCS7Gvp34WHcd20990x-kaNvScKFMGPChFJRahYLJELjGF1L-PwM9UEIpqWlDGkKaQ0UlV11L6powxpoDx5ehVq5NlXHy0yv9sEGKNAd0Gh1ieHFiJ1DvSm2EkWHU0aDxtqP60lA4L8oCilCv-jlL8436cEIN4VhulIeN72_mCUHu>53377</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            `nuw` flag is lost when optimizing `sub` to `add`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          JakobDegen
      </td>
    </tr>
</table>

<pre>
    See [the problem on godbolt](https://godbolt.org/z/rdbnnef5T). In this code:

```llvmir
define i64 @fast(i8* align 1) unnamed_addr #0 {
  %2 = load i8, i8* %0, align 1
  %3 = sub nuw i8 %2, 10
  %4 = zext i8 %3 to i64
  ret i64 %4
}
```

running through `opt` causes the `sub` to be switched out for

```llvmir
%3 = add i8 %2, -10
```

Note that the `nuw` flag was lost. This causes the compiled assembly to include an extra instruction. Originally found in rust-lang/rust#91449 .
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyFU0tv2zAM_jX2hYghS87DBx_aBQW2w3ZY74Ns0bY2WQr0WNb--lFOsnbBgAG2JIqvj5_I3qmX7isiFNvHOCOcvOsNLuAsTE71zsRieyz4YY7xFArxUPAn-q6qyvmJpFf6veqtxXH7XPC2go8W4qwDDE5hdmLHgt3WHbt8xvxctL9cKhy1RdC7BoqGjTJESqkPBX8AafRkoaawkKyVC6pvUikPBRcMiv3jJQCQvOVQiCMYJxVk3w9wiUAalqVbpDcHsTqE1INNZ7Jeg2TTmr2zalarV_wVryYCostYbzYe4wU62V6L3B_vqn1PgadCtJ2IIu_SNAOp3SnSCoNMAQPkhyCRgOVLStYjhLOOw4wKXIowOv9fTv_UR3S9r21zK-6f2D67iJRfxhsIYiaDGI2c4CwD0RtiBc_r676hHdxy0obQyRBw6c3LSpEdTFII0gKR5yVdhOjTELWzFXzxetJWGrIdXbKE0YJPIW6MtLmr8pkeua2bpoWqVJ1QrWhlGXU02N0h0xdgcJ7RApGpF_2aKf6LRdqIC1rL5E1319E6zqmvqA4SMo3XbUMD8R0HQvKkQ0gY6LAVYr8v527XjsOWjc0oOaqRK9Ez3tb79iAYQ6b60sgeTehotArOLVKL5RB0ppkqdccZ56zmDWsYaw4VVxL3O1bXTAjRHCRNAi5SmyrjyKNW-m6F1KcpkNLoEMObkpin_kZc01F8meLsfPdJ_nD9ESe05Zq9W9H_Bo0wLF0">