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

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

    <tr>
      <th>Labels</th>
      <td>
            backend:X86,
            llvm:codegen,
            missed-optimization
      </td>
    </tr>

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

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

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

unsigned long long tgt(long long a, unsigned long long b)
{
  unsigned long long t = a & 1; // known 0 or 1
  return (0-t) & b;
}
```

```
----------------------------------------
define i64 @src(i64 %0, i64 %1) {
%2:
  %3 = and i64 %0, 1
  %4 = mul i64 %3, %1
  ret i64 %4
}
=>
define i64 @tgt(i64 %0, i64 %1) {
%2:
  %3 = and i64 %0, 1
  %4 = sub i64 0, %3
  %5 = and i64 %4, %1
  ret i64 %5
}
Transformation seems to be correct!
```

```
src(long long, unsigned long long):                               # @src(long long, unsigned long long)
        mov     rax, rdi
        and     eax, 1
        imul    rax, rsi
        ret
tgt(long long, unsigned long long):                               # @tgt(long long, unsigned long long)
        mov     rax, rdi
        and     eax, 1
        neg     rax
        and     rax, rsi
        ret
```

https://godbolt.org/z/fqYcPMfvE

So the backend needs to decide if this is profitable or not.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzFVEuP2yAQ_jX4ghI5YDvJwYek2b2tVKk97B7B4ISuDVvAaXd_fQfsNInlbiO1VZEfwLy-bxiGG_FaoiIdnnSH0k2nndprKXBj9L7_OFshsjqvGSIf8IQeR2TdO0HLbT_BU3oeI7rDDCNS4AWiW5jcw4OftfmmcYqNhe3B3ErfWR1MyAYC0O0pwG6Y_Aq03_v_DRripzNAsY5GU-CvUz-5Obtx9NpC1kpLrIoMoyztDy4uSJ6GBAzzRQR14gsbBNHNCT0saU9WC3xpvLjQyKJG2zUnDRo0outzEk6ybMyb7hC9m0Lcn9o_ROw6HjXSAS690MjHPrJ3OOUjTp8t0642tmVeGY2dlK3D3mAucWWslRUQW9x-7KM7N128oXQpwHp3IELPtXCDw4FqP1pzjH_LvgcLK9S1PCQrDNnLF9dSFerjwtqNrCGd_cbosv4525sd_kW2Wu5_Wk-a_TYNk4Vx8P7FhWKP_WZvBDeNnxsL8O_f4K2_PlUfH-rj3aXRJ4P9QWLOqmcJ0bWUIlajkJUScNtqECuH4Xmxplae8UaGFqaNnyeipGJN1yzxyjeyfFDOqdABryv8Mbbkp-A1NrrHU6N7Avc1iCumQ_Ub3bwO_THpbFOO-Ch_6Pi8Mi0smuZ4-s0A15d4ae4hfCcdTPK8WKySQ0lJsVzmq1W2XBeiSnkmCpJSSWix5EIImjSMy8aVKN8iQoYcQMTHVQHr_k6TGItuKiPkXurzfgvhpJiZF69a9RapBmG-S1RJUkLSPHzJkqTzrM6zquIFl3leM55D3cmWqWYefIcTSmwZufBu70DYKOfdWchcLEgZcYJ_1vmDsaVgRxXO-AjZfn5NIvsyUv8BLw4S1g">