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