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