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

    <tr>
        <th>Summary</th>
        <td>
            [AVX-512] `vpternlog` can be used even when a subexpression is consumed
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    This code:

```zig
export fn foo(a: @Vector(8, u64), b: @Vector(8, u64), c: @Vector(8, u64)) @Vector(8, u64) {
 const x = a & b;
    const y = a & b & c;
    return x *% y;
}
```

```llvm
define dso_local <8 x i64> @foo(<8 x i64> %0, <8 x i64> %1, <8 x i64> %2) local_unnamed_addr {
Entry:
  %3 = and <8 x i64> %1, %0
  %4 = and <8 x i64> %3, %2
  %5 = mul <8 x i64> %4, %3
  ret <8 x i64> %5
}
```

Compiles to:

```asm
        vpandq  zmm0, zmm1, zmm0
 vpandq  zmm1, zmm0, zmm2
        vpmullq zmm0, zmm1, zmm0
```

Should be:

```asm
        vpandq     zmm3, zmm1, zmm0
        vpternlogq zmm2, zmm1, zmm0, 128
        vpmullq    zmm0, zmm2, zmm3
```

In the current assembly, the second `vpandq` relies on the input of the first one. `vpternlogq`, on the other hand, can be computed in parallel to `vpandq`.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyEVMtu6zYQ_RpqM4ghkXp5oYWvcw103SLoLqDEscWWIhU-cuN8fUFKaRI_WkMw7TlnhucMxeHOyZNG7Ej1g1SPGQ9-NLZ74koKbv_OeiPO3R-jdDAYgYTtSJ6eOl-ed3ki-Q7fZmM9HDUcjSG05YTtgJT5Ew7eWELbltA9hLokdBt_9f-DD_-Jb-9BQJofJN_BYLTz8AaEPQIHQuu4YUIAVvD8FUzfwyfFog9WxwJ0R2gF5wUizeNX6xedUOp1IvlO4FFqBOHMszIDV0DYvoU3kHVJ2M-ofGnRRZhWefRxFS1uRmk0m8o_B635hOKZC2FX_z-1t-flqCCy2eJVi3vl4-Yrt7zPZSuXfnCrxJ3ClUdalSuXJa5Ff02p7nV0b6ZZKnTgzfX7xt20HlL8vM5cixeA92lK7XufpmJdk6Mv-Gd8Wem3MlNQ6uVemQt9v48mKAH9jdtwWx0kAeyWwH-ZHq1W5vSySLtk0j0UtL2hGOC7p2Vl16J_0-BHhCFYi9oDdw6nXp1jQow7HEw88zpfRJM6B4tKogOzZEo9Bw_mmP4cpXUejMbNkvKhPm5H9x8pxo9oYeRapDvNNfQIg5nm4FGA1DBzy5VCBd5823qTiY6JLdvyDLuiKaumrpqGZWMneMUo9gM9bikXORtaJrZ5U7KmGQq6PWayozmt8pI2RVnVBdvUbcHatqiEqMTQCkbKHCcu1Sbe142xp0w6F7ArWFPRPFO8R-XSNKRU4y9IKKE0DkfbxaSHPpwcKXMlnXefZbz0Ko3R3dOfD1URE741J7Z07UFwKABfUcOvETVwcKHHt9mic9JoSMNWuzChyIJV3ej97OLLRg-EHk7Sj6HfDGYi9JCGzrI8zNb8hYMn9JA0O0IPq6nXjv4TAAD__0dhpsY">