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

    <tr>
        <th>Summary</th>
        <td>
            [X86][AVX2][ISEL] Unnecessary masking and comparison instructions generated for movmsk
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    The following LLVM IR:

```llvm
  %v1_l = load <4 x float>, ptr %Source
  %v1 = shufflevector <4 x float> %v1_l, <4 x float> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
  %4 = bitcast <8 x float> %v1 to <8 x i32>
  %5 = and <8 x i32> %4, <i32 -2147483648, i32 -2147483648, i32 -2147483648, i32 -2147483648, i32 poison, i32 poison, i32 poison, i32 poison>
  %bitop.i.i = shufflevector <8 x i32> %5, <8 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>
  %calltmp_to_bool.i = icmp ne <8 x i32> %bitop.i.i, zeroinitializer
  %6 = bitcast <8 x i1> %calltmp_to_bool.i to i8
  %calltmp4_to_int32.i = zext i8 %6 to i32
  store i32 %calltmp4_to_int32.i, ptr %Result, align 4
```

is code-generated to the following assembly (--mcpu=haswell):

```asm
        vmovdqa xmm0, xmmword ptr [rsi]
        vpbroadcastd    xmm1, dword ptr [rip + .LCPI0_0] # xmm1 = [2147483648,2147483648,2147483648,2147483648]
        vpand   ymm0, ymm0, ymm1
        vpcmpeqd        ymm0, ymm0, ymm1
        vmovmskps eax, ymm0
        mov     dword ptr [rdi], eax
```

although it seems to me that it can be just:

```asm
        vmovaps xmm0, xmmword ptr [rsi]
 vmovmskps       eax, xmm0
        mov     dword ptr [rdi], eax
```

For example, when we AND with <i32 -2147483648, i32 -2147483648, i32 -2147483648, i32 -2147483648, i32 0, i32 0, i32 0, i32 0> (zeros instead of poisons), ISEL manages to pick just vmovups and vmovmskps.

Compiler explorer link: https://godbolt.org/z/8qnfnbTsr

Am I missing something here?
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0Vl1v4joT_jXmZgQKdgLpBRcUFqlS31dHu3tWe1c58YR464-s7QDtrz-yA6XQ6mx19hwUKePMh5-ZxzOYey-3BnFBiltSrEe8D611C9M73T-2XGOwu1FlxdPia4vQWKXsXpot3N9_-x_cfSZsSbL0zLLhUWqnSbYEILTYTR8UELYGZbkAwlY5HKBRlgfCPhG6gi64aPfF9q7Gs1fy8W3fNAp3WAfrrp1P0WOQa1VnpbfmqCnhAJLR5MJWklHIoiYK05NATwI7Cb0R2Hx0wT6dkOcJeCVDzX047X4JGYK9hHXyLZIvN-IaNS3yYy5xyzGd5vO8ZLO8PKH4x5_Ohfrg6oy2ksF2EzmR71N1ib94y8W_wNFvoK-5UkF3D8E-VNaqYxay1h0YfIv_JdkY8BmdlUYGyZV8RncKOXuPejk9Rni7YbAgyys8edRLExg9InrGQwBZDvGjB6PJxQfrMKX2vvOr1vqMvlchfuBKbg3kr3t1aF3pobYCx1s06HhAEbcKF93OvUddqScgtByPdd31hK1b7veoFKE3b6cA98MQGH47bXfiJ4eD1onZg9Z768SAsbh1XpJi_dq-q5zlIpZSxPVB63QQxIWX7IDQW5jcr_64yx4yUqyBUJaMU_VIcXtx5j-0uMIR-xHg6Yj71Xt6YVbrDn-K0_pX5trutH_sPCA_vNid9dru0vsyW5FqRFfJ6Q2HXIXW9tsWZACPqH3kUCOElof4reYGKoQfvQ8fIYt3_tdknfMYfsdsDr-fzcY6wAPXncJos2_RwB5h-f817GVo_4tZmP2dkJq4jJ3vQRofkAuwzXGu-NgAdAV3Xz7dg-aGbzFVv5P1Yyp4KlTf-TTcX4o2GVJdWd1JhTHfTlmHDpQ0j4QtoQ2h85EsuiF0s7WisipMrNsSunkmdFP-NI2pvno3BFpquAMtvY_96q3G0EapRYeEbUZiwcQNu-EjXEznecEom2fzUbvAvJnRGW9qLqZC5FUzr4Soy2aW5U1e5vORXNCMFllO6ZRmJS0mTVNls-yGlgKnJZtXJM9Qc6km8Z8_4htJ73tcTNlsdpONFK9Q-XS9oNTgHpKWUBpvG24RncZVv_Ukz5T0wZ_DBBlUupd8L2fxtBS3y2_f6SDFYseG_9MYrNF77p5Ac_-YhpURUFvdcRfpSYS5vg7SGg_nGddYBwMXo96pxVW1ZWj7alJbTegm3WiG17hz9gfWgdBNSsMTujnmuVvQvwIAAP__ZDuszQ">