<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/80668>80668</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Unnecessary zero-extend of 4-bit vector mask
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:X86,
missed-optimization
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
chfast
</td>
</tr>
</table>
<pre>
The 4-bit vector mask produced by `vmovmskpd` is zero-extended by the instruction and stored in general purpose register.
However, LLVM represents the mask as `<4 x i1>` and later as `i4`. I think this confuses the codegen and it produces unnecessary `movzx`.
https://godbolt.org/z/WqG35G1dq
```c
#include <immintrin.h>
unsigned negmsk(const __m256d x)
{
unsigned m = _mm256_movemask_pd(x);
return m ^ 0xf; // neg mask (4 bits)
}
```
```llvm
define i32 @negmsk(<4 x double> noundef %x) {
%0 = bitcast <4 x double> %x to <4 x i64>
%1 = icmp slt <4 x i64> %0, zeroinitializer
%2 = bitcast <4 x i1> %1 to i4
%3 = xor i4 %2, -1
%xor = zext i4 %3 to i32
ret i32 %xor
}
```
```asm
negmsk:
vmovmskpd eax, ymm0
xor al, 15
movzx eax, al
ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVE2z6igQ_TVk06VFIIm6yOJ--Waq3uzma2cRaA1jgDwgjtdfPwXRO5n73maqLFT6nO5zGmgRgj5ZxJbUz6R-LcQUe-db2R9FiEXn1Hv7a49QrTod4YIyOg9GhDOM3qlJooLuHUhDL8ZdTDiPijQUdIAberfCa0SrZkzsEbQN0U8yamdBWAUhOo8KtIUTWvRigHHyowsIHk86RPRrQl8JffrJ_Y0X9IS9wNevv_8CHkePAW0MOW8WJELSQfhLBVfQJeFvSUoqM4iI_h7XFWnoGn6G2Gt7TmsA6exxCjjnkk7hCWd9Oj5sBpisRYkhCJ_9Gne5XVOqWeC89jGOgfAnwvaE7U9OdW6Ia-dPhO1vhO3_-PaF119K9W1JSqLzR97_M66tHCaFQPiLNkbb6LVd98nRgjfZfHIKLJ5MOBO2lc6GCIeDYXWj4ErY7o7fPM8_AAA-aAYIf4WDSeiDcRdMXTyMirBtpvIFyWOcvE2U-g3o9Uj4M8DsMpWfD4CwbQWdjmFR-PWTxx8aH4aLmbcUHrVF0JwBqeiHsfuhKjd1AxL-BtZNVuERCKuTVlg4JKym2VmnoxQhwnfkRILoHgHdVB-dzfQy07U0I4Qh_heW06drmO63tjpqMegb-gWd_ah6vo9z8uhAVws8z_ir86CrzE_pV-UCkWIJc8NrvIN4TsPZA-Uxzl3L6P_VfRHuzb-3mz89kn68aUBxTarejaGPYBIlhrRb1o-9_CgeYDEsxH2qWaiWqx3fiQLbckM3Ja8quiv6ltJys5GM1qISQu6aDbK6qruKdnXXlTte6JZRVlFG65JRSps1KrnpdrihZYe7uqpJRdEIPazTrUpvr9AhTNhuadNsi0F0OIQ87BjrhDyjVYQ__bltCEuNJ4wZHQKqlRujNvom0rBKsfq18G3KueqmUyAVHXSI4d8qUccB298WU2IxAsEdvx-hxeSH9tPI0LGfurV0hrB9fhbz12r07i-UkbB9dhMI22dD_wQAAP__X5au3Q">