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

    <tr>
        <th>Summary</th>
        <td>
            [InstCombine] Failure to infer nuw for mul nsw of non-negative
        </td>
    </tr>

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

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

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

<pre>
    We currently fail to infer mul nuw if we have mul nsw and the operands are non-negative.

https://alive2.llvm.org/ce/z/2Dz9Uu
```llvm
define i8 @src(i8 %x, i8 %y) {
  %x.nneg = icmp sge i8 %x, 0
  call void @llvm.assume(i1 %x.nneg)
  %y.nneg = icmp sge i8 %y, 0
  call void @llvm.assume(i1 %y.nneg)
  %mul = mul nsw i8 %x, %y
  ret i8 %mul
}

define i8 @tgt(i8 %x, i8 %y) {
  %mul = mul nuw i8 %x, %y
  ret i8 %mul
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycU9tu2zAM_Rr5hUgg05fED35oGxjYBwx7lm3a4SZLgS7p0q8ffGmbABuwDTAsgSLPoQ51lPc8GqJaFM8C0fAP7gSiKE6JiuFsXb2Ektb2t_obQRedIxP0DQbFGoIFNgM5mKIGE1-BB3glOKsrrSH_Csr0EM4E9kJOmd6DcgTGmp2hUQW-0l7Ik5BP6_8cwsWL7ElgI7BRmq-Ee62v0966UWDTkcDmTWCDp7fqa9xKS7l-c-Ia6mlgQ8BHELn0rhN4nPdY_BT4Auv2JrACcXheK2A53RtDI4jsBNxNF_AjwV2dfE_tlNZwtdzP8Et7yvs40UyTfgIJrO7Ab38Ev_0b-O034LPcM_K77HddLwRbpqOwHU1Rb-odTvcTeFAujOEvlXvgj__H_z7GpK-zvsoqlVCdHtJcYlGUaXKuy6ws8-zQlcfsmLbZUFRtN_Rp2VbdIFWWJVyjxFzmWMgyxTzdZyUVqk-xL8usyKUUuaRJsf54Uwl7H6mupESZaNWS9psZlseUPbHxobNTy4ZmZ-CLQJzYe-p39hJ44jcV2JrNNa6ey3ZtHP08PPbBf1IFDnqx2hfjw8uGWZygUayjo087zQIO1n0M0w4Pjkmi0_WjU0YO59juOzsJbJbO12V3cfY7dUFgs1zUC2yWu_4KAAD__28zLCU">