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

    <tr>
        <th>Summary</th>
        <td>
            Missing transformation X * Y to X & Y iff X, Y can be only 0 or 1
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            llvm:instcombine
      </td>
    </tr>

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

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

<pre>
    unsigned long long test(long long a, unsigned long long b)
{
  unsigned long long t = a & 1; // known 0 or 1
  unsigned long long tt = b & 1; // known 0 or 1
  return t * tt;
  // return t & tt;
}



```
----------------------------------------
define i64 @src(i64 %0, i64 %1) {
%2:
  %3 = and i64 %0, 1
  %4 = and i64 %1, 1
  %5 = mul i64 %4, %3
  ret i64 %5
}
=>
define i64 @tgt(i64 %0, i64 %1) {
%2:
  %3 = and i64 %0, 1
  %4 = and i64 %1, 1
  %5 = and i64 %4, %3
  ret i64 %5
}
Transformation seems to be correct!
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzFU02P2yAQ_TX4MtoIg7GXgw9J07311kNyBBs7dAmsAKfKvy8mSeOmq9X2VAvhYebN12OQrj-3kw16tKoH4-x42aIKEZHnu0Ig8gXeAUpEOMJbhNeo2VwEeA8XAdEtCECkhhLRTRJe0oJX635awOB8Un_gfvGXn_L3Kk7ezinJOnkm9M1ydVoA6iUANdur8Pde4-vKx6dPfhd0rwZtFei6AlTh4LtEbT4Qhmder3KZuITfNCYFQXR9L53RC4e2h6VzuUBUj4jyEcEy4jiZG6KaEXPwBXs3G3ukhW4R_fpeT3GM_7unBeJfevruhQ2D80cRtbMQlDoGiA6kgs55r7rUWPkwA0Xf0p5TLoqoo1HtNx2Cnqf0z1i7PID7Odouj9oe9DDAbq5uD52wcxJnzfk6v8XkTXuI8S3MHOVRHXU8THLVuWM6GHO6_Z7evPuRa3tJuScVksAY47w4tLQRWJVD1yhc0abpnhnHg-Jy4EQQjnFhhFQmtIhtECE5KF1rG2LKItOdJiVi20K3BBOCWclJySjlq1JVsmooU7jua1WxdO3qKLRZzSFWzo-Fb3NtchpDMhodYrgbRcivWuW8Kb6Y4sH5thcn3UtnTom613ORu2lzK78ABak8KQ">