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

    <tr>
        <th>Summary</th>
        <td>
            [X86] Poor codegen for various 'allzeros' and 'allones' vetcor patterns
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:X86
      </td>
    </tr>

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

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

<pre>
    https://godbolt.org/z/EGafbfGqY
```
#include <x86intrin.h>

#ifdef __SSE4_1__
bool allones_ptest(__m128i x) {
 return _mm_test_all_ones(x);
}
#endif

bool allones(__m128i x) {
    return x[0] == -1 && x[1] == -1;
}
bool allones_movemask(__m128i x) {
    return _mm_movemask_epi8(_mm_cmpeq_epi8(x, _mm_set1_epi8(-1))) == 0xFFFF;
}

#ifdef __SSE4_1__
bool allzeros_ptest(__m128i x) {
 return _mm_test_all_zeros(x,x);
}
#endif

bool allzeros(__m128i x) {
    return x[0] == 0 && x[1] == 0;
}
bool allzeros_movemask(__m128i x) {
    return _mm_movemask_epi8(_mm_cmpeq_epi32(x, _mm_setzero_si128())) == 0xFFFF;
}
```

All the x86-64 - x86-64-v4 targets mess up on at least one of these - if ptest is available its always the best option (or maybe a similar avx512 equivalent)

clang -g0 -O3 -march=x86-64-v3
```
allones_ptest(long long __vector(2)):
 vpcmpeqd        %xmm1, %xmm1, %xmm1
        vptest  %xmm1, %xmm0
 setb    %al
        retq
allones(long long __vector(2)):
 vpshufd $238, %xmm0, %xmm1              # xmm1 = xmm0[2,3,2,3]
 vpand   %xmm0, %xmm1, %xmm0
        vmovq   %xmm0, %rax
        cmpq $-1, %rax
        sete    %al
        retq
allones_movemask(long long __vector(2)):
        vpcmpeqd        %xmm1, %xmm1, %xmm1
 vpsubb  %xmm1, %xmm0, %xmm0
        vptest  %xmm0, %xmm0
        sete %al
        retq
allzeros_ptest(long long __vector(2)):
 vptest  %xmm0, %xmm0
        sete    %al
        retq
allzeros(long long __vector(2)):
        vptest  %xmm0, %xmm0
        sete    %al
 retq
allzeros_movemask(long long __vector(2)):
        vptest %xmm0, %xmm0
        sete    %al
        retq
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVsFyozgQ_Rr50kUKWsaGgw9JPMxhD7u1ueyeKAGNrR2BsCRYZ75-Sxg7cWLX2qmhXICl1-rX74kuCWvlpiVasfiJxeuZ6N1Wm9Wfv73IRrezQlevq61znWX8kWHGMNvoqtDKPWizYZj9ZJh9-y7qov6--5uFaxY-skU4_Q5_kcu2VH1FwPjzPlnI1hnZPmwZ_zYhTri6ohry_OXl2zyP8vwwUWitQCilW7J558g6hkmeNxEmEvYMU2DLpwMUDLnetJA3Te6BuVAq93EME49kfAKy5fqUldpK1u-ZvE94PRXAMduexU8hi9fA-JrxNQQRMFwwXIwz0dnMZwZn5TV6oEbYH7ek9UUe8Tl1MvFBTZOXTUe748Ce4fOItOSi42AQeS3G35FZuM-yLLugz23e_CSjv2TOGDjxvN-hY_TdFoXXHAqvG3So8Zc6xPGDRT5HbmWEHnq7SR--uPH-qBS4LcE-WQSLOQTTSzDMwQmzIWehIWuh70C3IBwoEtaBbgl07SMtQQCyhtFVkBbEIKQShSKQzoJQ_4pXO6YoPEB3TuoWGCbaQCNeCwIBVjZSCQNi2McRAu16OQhFrfOFvSNbKtFuINiEEPzOIWiEKbeMr4-U-cU6P_YEpdsNjLc8H6h02jBMcFKRT5lg6Eb5K5guhvG-aSJvwoXXk6X-Gg5SfMZNhMCSK6Y1hTqPNeR2Z7TvIGy3fV0Bwzny5H3SN55wdjHkMI76TTMi4ydk-MwZPh-e8fq0uGirkwrhRRXCDyo0eth9CjFifw4rm27nOQfRNYQlR7eq9f67u022k2f32z10ti-Kiz5fFeVsa1zHjTX_X8Hn3fTWXXIHgRtEP7bWO8X-OokLCnzd85HGL5Hi1HNm1YpXKU_FjFbRYskXYcoXONuusKK6TKuirggpLaqYx4WoorjmWEYhJjO5whB5GEU8ijBFfFiUQkQlJulyyeuwmLN5SI2Q6kGpofEHq5m0tqdVnKZpMlOiIGXHAxpiIcof1FaMP_6VLBiiP7OZlY8Lin5j2TxU0jr7tpKTTo2nO4-P1_CH1gZKXdGGWqi1gUEYqXsLDJdvti_Bt4XD0KFZLWEgV2oDnXCOTGtnvVEfj4bSbfviodQNw8wzmB5BZ_Q_VDqG2ViYZZiNtf0XAAD__wbk95c">