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

    <tr>
        <th>Summary</th>
        <td>
            [x86-64] Broadcasting an element of a vector should not use `vpermb` or `vpshufb`
        </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>
    I have code like so:

```zig
export fn foo(x: @Vector(8, u8)) @Vector(64, u8) {
    return @splat(x[1]);
}
```

Here is the LLVM version:

```llvm
define dso_local <64 x i8> @foo(<8 x i8> %0) local_unnamed_addr {
Entry:
  %1 = shufflevector <8 x i8> %0, <8 x i8> poison, <64 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
  ret <64 x i8> %1
}
```

Here is how it lowers on Zen 5:

```asm
.LCPI0_1:
        .byte   1
foo:
 vpbroadcastb    zmm1, byte ptr [rip + .LCPI0_1]
        vpermb  zmm0, zmm1, zmm0
        ret
```

Here is how I think it should lower:

```asm
foo:
        vpsrlq  xmm0, xmm0, 8
 vpbroadcastb    zmm0, xmm0
        ret
```

---

Same applies to broadcasting into an xmm0:

```asm
.LCPI0_0:
 .zero   16,1
foo:
        vpshufb xmm0, xmm0, xmmword ptr [rip + .LCPI0_0]
        ret
```

I would much rather avoid the trip to memory:

```asm
foo:
        vpsrlq  xmm0, xmm0, 8
 vpbroadcastb    xmm0, xmm0
        ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsVs1u4zYQfhr6MrAhkZIsH3RY2wkaIAUKFMihl4ASRxYbilRJynby9AUpxz-7m3Zz2NsahiUO5--bj-Mhd07uNGJF8jXJtzM--s7Y6okrKbh9mdVGvFYP0PE9QmMEgpIvCM4Q9oUkW5K8_xbJ9H2Tu0mCx8FYD62G1hhCyyNhX4BkyRM23lhCy5LQDYwloStCVzc7RXbeArJcT_4AACz60eqg6wbFffSar1OSb4MXdtIky-1XSV1n-htaBOnAdwiPj0-_wx6tk0Z_BEipfT-JBLZSIwhnnpVpuALCNkUGR5AlYXchqwkpYZvyIqV5EnBEi-dRa96jeOZC2Au0O-3t6zk-BJsUCNuC68a2VbiPhYHv-N3cCgcjndEn8ZQao1GbbSSjkIatXy-_Xj77wu7ez6ZF__W5p3n6mcbrzAGkB2UOaB0YDX-hhvyj9uPu1H2Lx80fD8lzetUn02dRv3oEgFMSoQfPKvuhtoaLhjtfB923vo-oosngLZB8beUAhK7hHCDf3gbYD2j7OhrHlnt3Etc3mhb9DxbgAXwn9UsohOvMqMRUj_-twg26c37Oqn8Ajqf83p_lx0W46H0i__l8fr38k_cIfBiURAfewDmI1DuQ2hvgeorxg9ReFGHxhtYETgtCN98j9gK9G9v6G-jHvj8YKz6gOPmG4v8G_gCHSFE_Nh1Y7ju0wPdGijhEfPDuDfTYm6u_8Z_J4PETDM5ExcSKrfgMq3RJVwVb5Wk566q0KEvkYoltm7IsWzJsEs7zfJnlQqwYm8mKJjRLE0opo3laLljdLNsMS8ELtmQ5kizBnku1CDNyYexuJp0bsUpTxlbFTPEalYsXC0o1HiDuEkrDPcNWwWhejztHskRJ593FjZdexRvJsSzmRUbyLayvTxfXgAp71B5MCxxOA_LUSdp4GB0CKZKpdUmRQJifYR3PSyjLaFXVeT-4wAa9J_R-J3031ovG9ITex7E_PeaDNX9j4wm9jwgcofcniPuK_hsAAP__2v5pfg">