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

    <tr>
        <th>Summary</th>
        <td>
            [InstCombine] Missed optimization for `zext(trunc nuw(x))`
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          Il-Capitano
      </td>
    </tr>
</table>

<pre>
    Godbolt link: https://godbolt.org/z/Ws1jPz4rE

Instcombine transforms this function:
```llvm
define i64 @test(i64 %n) {
    %trunc = trunc nuw i64 %n to i32
    %zext = zext i32 %trunc to i64
    ret i64 %zext
}
```
into this:
```llvm
define i64 @test(i64 %n) {
 %zext = and i64 %n, 4294967295
  ret i64 %zext
}
```

However, because of the `nuw` flag on `trunc`, this could be simplified into this instead:
```llvm
define i64 @test(i64 %n) {
    ret i64 %n
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysU0FvnDwQ_TXDZZSVGQyYA4dk9-NrDpV669mA2XVq7BU22XR_fWXcZNNIPVSKZBl7_ObpzQxPeq-PVqkWygcoD5lcw8kt7aO528uzDtK6rHfjz_Z_N_bOBDTa_oDiHk8hnD0U90AdUHdMrzu3HIG6K1D33edP3658-Q_YAdh92h-tD4Obe20VhkVaP7ll9hhO2uO02iFoZyNnSqlYWsY8zyk0qimm6oojcBaUD0Biu1FpgRqE-iEhETEGw7LaAaE4YDrZ9YKveAwOdUF_4K_qJWzw7aALupFEdMVv6EWFV6oI_q25PnwQn67aBreV-UnVvZcq7Yg31B45NbypamrKV7H_JDXtX9xFPasl8vVqkKtX6CYMJ4VQMbteoGI4GXlEZ2Nka1GkoH2a5uBWM2Kv0Ov5bPSk1YhvTUBtfVBy_LxRv6vQ_q28bGyLsSkamak2r4lxTkyI7NQOec7kWKiJl83ESdQNr2XJiymXkxiqMdMtMeKsZiKngnOxY3wSisuS5aquheDAmZqlNruoP5og096vqm0Ey-vMyF4ZvxmMyKoLbo9AFP22tDHnrl-PHjgz2gd_Ywk6mM2Z0Tj7ZBwoD_hVe69GdOegZ32V0TY4uSVOYhswibffHUi8ADVxVSxbF9N-cK4Op7XfDW4G6rb2p8_deXFPaghA3SbXA3WpnOeWfgUAAP__k4o2Gg">