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