<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/141360>141360</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
LLVM fails to reduce zext(op(zext)) in some cases
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
AZero13
</td>
</tr>
</table>
<pre>
In the benchmark, I noticed
%30 = zext i16 %.promoted47 to i32
%31 = mul nuw nsw i32 %30, 20
%32 = zext nneg i32 %31 to i64
%31 is not used at all elsewhere.
It should be
%30 = zext i16 %.promoted47 to i64
%31 = mul nuw nsw i64 %30, 20
https://alive2.llvm.org/ce/z/XpJe59
I noticed that LLVM did in fact do this properly when I did an unrelated change: https://github.com/llvm/llvm-project/pull/140178
But that is because the DAG was different, meaning there is an edge case where this is not happening when it should be.
<img width="1067" alt="Image" src="https://github.com/user-attachments/assets/cfe835ae-12e3-4a36-883e-0feea28c6da8" />
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUk0Gv6yYQhX8N3owSmcE4zsKLvJemSvW6raruJjCxaTG2AN_0vV9fmUT3tpVatZIlIzgMH5wzlJIbAnMv9CehzxWteZxjf_qF4yxVdZvt1_4aII8MNw5mnCj-JvAzXCHM2Rm2IOrT9qFWNQh1hm_8ewYnWxCo90ucpzmzbQ6QZ3AKX1JZpNPqIawPCOmxrUEpslXH-qXDj5Ih8PCukqVc23wcLsGljQnWxBYoA3kP7BM_Ro68fwqvGdI4r97CjV_gAP8NvZwF8A_wbfN3-Po05rwkoU4CLwIv5N0b4977t2k_x0HgxbDAyzeBl5-XH1gfX4Tv75pHyvDly08_gnUWXIA7mQx2hjy6BEucF47-KzxGDnAtGgqwhsieMlswI4WBhTrBXzkGl8f1tjfzJPCy0bx-uyXOv7LJAi_L6r3Ai2xqeeieWJ_W_ARyCW5saE1cMnE-fQ8PSmDd_c6RQ94eYGIKLgybIPK2gwKwHRgMJYbix_MSL8dGWhYuO8pl3J9Mevkm1Gc3DfBwNo9CnQWirNuDQATy-TlxnWjgbSZF85z5l3uvieOOciYzThxy2vxJicvA3LlTmngnkdWuIdXuuk7xrr4zE3amtdRt52xl1XeV7ZU9qiNV3MtD08laNwddjX1tmOnQsSI6GJQ3fdcka304YktWm65yPdaoa42NbLWUem8bJKVqvEutTUNH0dQ8kfPvmalcSiv3spGqrStPN_ap9C1i4AeUVYG4tXHsi6e3dUiiqb1LOX2UyS577ku07uR82vId2a6GSwcI7OZFYPccHwUet_SleXoamKo1-v5_h6rQpRKrgv_W4x8BAAD__1eYX40">