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