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