<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/109888>109888</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AVX2] `vpsllvq` builtin-semantics are not recognized by LLVM vectors
</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 wrote some Zig code trying to get the semantics of `vpsllvq`:
```zig
export fn foo(vec: @Vector(4, u64)) @Vector(4, u64) {
return @select(
u64,
vec < @as(@Vector(4, u64), @splat(64)),
@as(@Vector(4, u64), @splat(1)) << @truncate(vec),
@as(@Vector(4, u64), @splat(0))
);
}
```
Optimized LLVM:
```llvm
define dso_local range(i64 0, -9223372036854775807) <4 x i64> @foo(<4 x i64> %0) local_unnamed_addr {
Entry:
%1 = icmp ult <4 x i64> %0, <i64 64, i64 64, i64 64, i64 64>
%2 = and <4 x i64> %0, <i64 63, i64 63, i64 63, i64 63>
%3 = shl nuw <4 x i64> <i64 1, i64 1, i64 1, i64 1>, %2
%4 = select <4 x i1> %1, <4 x i64> %3, <4 x i64> zeroinitializer
ret <4 x i64> %4
}
```
Compiled for Zen 3:
```asm
.LCPI0_0:
.quad -9223372036854775808
.LCPI0_1:
.quad -9223372036854775745
.LCPI0_2:
.quad 63
.LCPI0_3:
.quad 1
foo:
vpbroadcastq ymm1, qword ptr [rip + .LCPI0_0]
vpbroadcastq ymm4, qword ptr [rip + .LCPI0_2]
vpbroadcastq ymm2, qword ptr [rip + .LCPI0_1]
vpbroadcastq ymm3, qword ptr [rip + .LCPI0_3]
vpxor ymm1, ymm0, ymm1
vpand ymm0, ymm0, ymm4
vpcmpgtq ymm1, ymm1, ymm2
vpsllvq ymm0, ymm3, ymm0
vpandn ymm0, ymm1, ymm0
ret
```
I was expecting just a `vpsllvq` instruction.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyklk1v8ygXhn8N3hw1wuDPhRdt2kqV-uqdVTV6NhU2xOEZDC7gtOmvH2E7n02bGU1UFQzcl-8Dxz5mzslWC1Gh9A6l9xEb_NrY6oUpyZn9K6oN31ZP8G6NF-BMJ-CXbKExXIC3W6lb8AZa4cGvBTjRMe1l48CsAGV40zulNm8ow4jeInyP8O5_hqe_T9lOI-KjN9bDSsPKGESKjWgQvQWU4BfReGMRKRJEljBkCSIlIuV3U4DyuwkJAGCFH6wOa51QovGIFIfJ8BtFy9OxjWgA0WVQMRcU35kYl7hescDdGfuC-3eYeBceXc4evB10w7yYd-U_3wHPPidE6NF5x1B-f3Y-x4f2_97LTn4KDs_PL__77kSV2nTTEBcrqQVwZ16VaZgCy3QbopBZAjiYuikJoTQnmGZFmuR5WuB8jj2BD5BZguhDsD7lxNkwSUMkMLJfB61ZJ_gr49weUuBBe7vdO4WgiQHRe5BN18Og_PmtRuYyjAaTY27ADz36cEQmI5lpfgVK94DLvRMoHaFurUAP7-fgCRjvtJc69GG8NUnJETSZoOMTsWfGs9d49noaAf06-imskVp6yZT8FHbHt-LCrib_JMGWpuulEhxWxsIvoYF-l2TMzTm2eF7-8YRfD-8XWLwNjANcyq3iRBMf5cX0m6RfhHmSngjJN0IIh3e8kH51FU_XIZ_PIZu-tobxhjn_Fq63XTcexdu7sRx6bwGld1b2gMgd7ONO769SkmsUcqBckJNr8vhnE9uuo9cQ9ALiw9ijXdh2HZ7beO81PGtwPLVrk3NY0_XtFBGcQnct2UPHknUMo3v4GZRpruHU2elKK_wP6f4E78yB-OhF40Mh_T04D-y0boLUztuh8dLoRcQryktaskhUcU5yQpIso9G6ijHGJRNJLXDD65SRFcZFg-NVnJZ8VeaRrAgmCS5JijHNE7pIasKbOsuZaHAmsgwlWHRMqkV4fS-MbSPp3CCqGJdFUUSK1UK58RuBEC3eYZxFJGROZKsguqmH1qEEK-m8O2C89Gr8uLh9-TOsPguvHqTyUt8cvhyYFaCNBysa0-qx3NTbseKEuuyNddFgVbX2vnfhGSKPiDy20q-HetGYDpHHsQJNzU1vze-x7D-Ojh0ij3NIm4r8HQAA___VEmZR">