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

    <tr>
        <th>Summary</th>
        <td>
            Fold `zext nneg` into `sext` when an optimization opportunity is identified
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            llvm:optimizations,
            missed-optimization
      </td>
    </tr>

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

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

<pre>
    The following transformation is legal after adding `nneg`:

```llvm
define i32 @src(i8 %v) {
  %switch.tableidx = add nsw i8 %v, 1
  %switch.idx.cast = zext nneg i8 %switch.tableidx to i32
  %switch.offset = add nsw i32 %switch.idx.cast, -1
  ret i32 %switch.offset
}

define i32 @tgt(i8 %v) {
  %ext = sext i8 %v to i32
  ret i32 %ext
}
```

Alive2: https://alive2.llvm.org/ce/z/2iCmDs
From: https://github.com/rust-lang/rust/issues/106459#issuecomment-1925647607
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx8U01vozAQ_TXDxUpkbD4PHNJGXPa00v4BgweYlbEjbJq0v35lkmbTRqqEwIzn-b2Z51He02gRG8hfID8mag2TW5ojKfv7V9I5_d78mZANzhh3JjuysCjrB7fMKpCzjDwzOCrD1BBwYUrrmAQFtxZHKDjIA_Aj8M93wa-PMW_zNaRxIIuMpGCQcb_0ICqqGIj8DUTNoHy55rEY8mcK_bQPqjNI-sJAHiMns_7M7qBXlj5DSF_2vfJhg3zgJbCo8Ab6fmxwUc_zIW4YPIavrFH3E0sUsburWDB8y7sedOtJeXxs0dd-hDH81I9YR1Tj4-KW9U39Azlenig__XhUcDD0hgLkgU0hnHy0ULQgWrXF99G6vVtGEG2PINoPEK2g1_nor_B2cfMzeKQwrd2-dzOIdll92Bllx9saREver-hBtCkvsrwGIbdI7-YZbdiltciLrCx4mehG6lrWKsEmLVNR8UryIpmaUqZ1XZZFpbo8zxRP-0HWfdppLau0r6qEGsFFxrM05RnPebEXEitVpkNV9yj7TkLGcVZk7iUmm4amqmRWJUZ1aPw2KEJs91ce3CnQTB_bLHgQAsQrCDGT96h3j5txLz8mSxOBu24dPWTckA_-P1mgYLBpndFxgO53FArOyAYXg9Hn-H-e0DJl2SMFc6eTW8JqKbzHuSSNNtBAqJN1Mc0PdmzFXD-70-L-Yv_Fka38fwEAAP__pEhB4Q">