<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">