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

    <tr>
        <th>Summary</th>
        <td>
            [X86] Poor movmskps bit extraction 
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:X86,
            llvm:SelectionDAG
      </td>
    </tr>

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

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

<pre>
    ```c
#include <x86intrin.h>
void func();
void scatter_mask_vector_i32_epi32(__m128 mask) {
        if (_mm_movemask_ps(mask) & 0x8)
                func();
}
```
is optimized to the following ir:
```ll
define void @scatter_mask_vector_i32_epi32(<4 x float> noundef %mask) {
entry:
  %0 = bitcast <4 x float> %mask to <4 x i32>
  %1 = icmp slt <4 x i32> %0, zeroinitializer
  %2 = bitcast <4 x i1> %1 to i4
  %tobool.not = icmp sgt i4 %2, -1
  br i1 %tobool.not, label %if.end, label %if.then

if.then:
  tail call void @func()()
  br label %if.end

if.end:
  ret void
}

declare void @func()() local_unnamed_addr
```
```asm
scatter_mask_vector_i32_epi32:
 vmovmskps %xmm0, %eax
  shlb $4, %al
  sarb $4, %al
  js func()@PLT # TAILCALL
  retq
```
Changing the bit test to a lower bit in the mask creates much simpler code:
```c
#include <x86intrin.h>
void func();
void scatter_mask_vector_i32_epi32(__m128 mask) {
        if (_mm_movemask_ps(mask) & 0x2)
                func();
}
```
```ll
define void @scatter_mask_vector_i32_epi32(<4 x float> noundef %mask) {
entry:
  %0 = bitcast <4 x float> %mask to <4 x i32>
  %1 = icmp slt <4 x i32> %0, zeroinitializer
  %2 = bitcast <4 x i1> %1 to i4
  %3 = and i4 %2, 2
  %tobool.not = icmp eq i4 %3, 0
  br i1 %tobool.not, label %if.end, label %if.then

if.then:
  tail call void @func()()
  br label %if.end

if.end:
  ret void
}

declare void @func()() local_unnamed_addr #1
```
```asm
scatter_mask_vector_i32_epi32:
  vmovmskps %xmm0, %eax
  testb $2, %al
  jne func()@PLT # TAILCALL
 retq
```

With suitable value tracking we should be able to convert the i4 sext_inreg into a signbit test on the source mask value.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsVsGO2zYQ_Rr6MoghkbJsHXxw1tmi6B6CJkB7EyhqbE2WIh2S8jr79QVp2ev17jZp0UuBAIZtzbyZxyEfHyS9p61BXLLZezZbT-QQOuuWv__2iXprJo1tvy1ZmR0_imVrlq0YF2SUHloEJm4Oi5JMcGSmHRMfjoi9pRY2g1GMLxivmHh_EfdKhoCu7qW_r_eognU1CV7jjgRnfFHXfc4XENOMV8DmYzHLKtpABPR93ds9pgY7z_jijOUlZIdEeSphWfXKQth8Pf45zXZ8JA92F6inR2whWAgdwsZqbR_IbIEcE6urOq2PgRY3ZBDShKzIvjckEzcFHGCjrQxMfABjB9NiHG_2YnA0wX07M0PEZMDEGhoKSvoA183GJnGAMRVJT4eTGuSpAal-B16H57BEwPgNPKKzZCiQ1PSI7qKcv8ZP-VicR2YqLvDBNtbqqbHhgncbgIrULZK9y0_4xgHlz6siQMsGdQzTZoqmvQ6FDs3p1NNRjqGnfQuSNCip9fmULpTBn1STVnDN9rxzjDw1dhhSy2ttjcJQWjp8kxO0VVLXgzGyx7aWbeteleb5Ufr-GPl7jZ2Xt-_tvvf3Ox-nOfR9OlrGZygPpwF8pxtgvCjGlNTnjHRvZL74yxteZB_vPgPjAj6vfr27Wd3dXWzO11cHuumk2cZrFS9ZQwEC-hCVI0HbB3QpRialk5yVQxnQQz-oDjz1O40OlG3x5a38nzgV__dO9dOA_pEBiYSXpr20HP4dh8KvI1pEdPbTn0Z_ivc8_29N6kdcKvpDMiP-0owM_pAbvWlGx-8_KHTgBwqy0Qh7qQeE4KS6jzb1gOA7O-gWGoQECBaUNXt0IZkUFeDxEGoyDrdAJllZfL06m5s9upm3g1OjqSWS6aRdirYSlZzgMi-roszyssgn3bIoFwuV5WpeZIv5hs_KXOW8EKIq500l582EljzjIqtykWdFVuRTNa9aLubzpik38zzPWJFhL0lPtd73U-u2E_J-wGVZ5lU-STLy6e2P80aq-6Ny_lyUjMdtZpzHOiZWn1CjCmTNevVLzM3WE7eMuXfNsPWsyDT54J9YAgWdXitjr9kaPlrr4HzIcUvwEPc2toTJ4PSyC2HnoyT4LeO3Wwrd0EyV7Rm_TWs4_rzbOfsFVWD8Ng3iGb9Ns_wVAAD__xRaFhg">