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

    <tr>
        <th>Summary</th>
        <td>
            [X86] Inconsistent bool splat codegen
        </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>
          RKSimon
      </td>
    </tr>
</table>

<pre>
    https://simd.godbolt.org/z/W8Kvdv5eM

For cases where we need to broadcast a scalar bool value to all vector lanes:
```c
__m128i boolv(bool accumulate) {
  return accumulate ? _mm_set1_epi8(-1) : _mm_setzero_si128();
}
```
There are various approaches, all of which result in different codegen:
```ll
define <16 x i8> @boolv8(i1 zeroext %x) {
  %r = select i1 %x, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <16 x i8> zeroinitializer
  ret <16 x i8> %r
}
define <2 x i64> @boolv64(i1 zeroext %x) {
  %r = select i1 %x, <2 x i64> <i64 -1, i64 -1>, <2 x i64> zeroinitializer
  ret <2 x i64> %r
}
define <16 x i8> @vecv8(i1 zeroext %x) {
  %v = insertelement <16 x i1> undef, i1 %x, i32 0
  %s = shufflevector <16 x i1> %v, <16 x i1> undef, <16 x i32> zeroinitializer
  %r = sext <16 x i1> %s to <16 x i8>
  ret <16 x i8> %r
}
define <2 x i64> @vecv64(i1 zeroext %x) {
  %v = insertelement <2 x i1> undef, i1 %x, i32 0
  %s = shufflevector <2 x i1> %v, <2 x i1> undef, <2 x i32> zeroinitializer
  %r = sext <2 x i1> %s to <2 x i64>
  ret <2 x i64> %r
}
define <16 x i8> @bcstv8(i1 zeroext %x) {
  %ext = sext i1 %x to i8
  %v = insertelement <16 x i8> undef, i8 %ext, i32 0
  %s = shufflevector <16 x i8> %v, <16 x i8> undef, <16 x i32> zeroinitializer
  ret <16 x i8> %s
}
define <2 x i64> @bcstv64(i1 zeroext %x) {
  %ext = sext i1 %x to i64
  %v = insertelement <2 x i64> undef, i64 %ext, i32 0
  %s = shufflevector <2 x i64> %v, <2 x i64> undef, <2 x i32> zeroinitializer
 ret <2 x i64> %s
}
```
x86-64-v3:
```asm
boolv8: # @boolv8
        vpcmpeqd        %xmm0, %xmm0, %xmm0
        testl   %edi, %edi
        jne     .LBB0_2
 vpxor   %xmm0, %xmm0, %xmm0
.LBB0_2:
        retq
boolv64: # @boolv64
        vpcmpeqd        %xmm0, %xmm0, %xmm0
        testl   %edi, %edi
        jne     .LBB1_2
 vpxor   %xmm0, %xmm0, %xmm0
.LBB1_2:
        retq
vecv8: # @vecv8
        vmovd   %edi, %xmm0
 vpbroadcastb    %xmm0, %xmm0
        vpsllw  $7, %xmm0, %xmm0
 vpxor   %xmm1, %xmm1, %xmm1
        vpcmpgtb        %xmm0, %xmm1, %xmm0
        retq
vecv64:                                 # @vecv64
        vmovd   %edi, %xmm0
        vpbroadcastd    %xmm0, %xmm0
        vpsllq  $63, %xmm0, %xmm0
        vpxor   %xmm1, %xmm1, %xmm1
        vpcmpgtq        %xmm0, %xmm1, %xmm0
 retq
bcstv8:                                 # @bcstv8
        negb %dil
        vmovd   %edi, %xmm0
        vpbroadcastb    %xmm0, %xmm0
        retq
bcstv64:                                # @bcstv64
        movl    %edi, %eax
        negq    %rax
 vmovq   %rax, %xmm0
        vpbroadcastq    %xmm0, %xmm0
 retq
```
The (branchless) broadcast approach is almost certainly the best approach, always for AVX2+ targets, and all SSE if we correctly broadcast as i32/i64 types
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMWF9v4rgX_TTm5apV4vwhPPDQ0kH6aX77srPanTfkODfgWScG20lpP_3KSYAk0E46M9IuqkpiX1-fc3zC5cKMEdsScUmiRxI9zVhld0ovf__8RRSqnKUqe1nurN0bEjwQuiZ0bUSR3W9Vlipp75XeErp-JXT9V_K5zuoIfyPeE_Ee2v9rpYEzgwaed6gRnhFKxAysglQrlnFmLDAwnEmmIVVKQs1khS6ASQk1cqs0SFZiA6BNHXvtH2_vN5vCp4lolteEJk0axnlVVJJZJHQBZP7YxgJotJUue_NAgjVsimJj0Pob3IuE0OTOb5YFD6eZV9RqY4RP3SyhCxJ0Gcn8aQSrvf2jIcw0Qs20UJUBtt9rxfgODaGrhp7K4Xkn-A40mkpaECVkIs9RY2mBqwy3WF7TlrIdyDAXpYO_8mM4gkhI8AlI6DU6OJjCBwcbjxYIjY4jIQiNNJDgCQxK5BaE30WtximDlUjAKbKC_8JF8Okao-MpSmEFk-IVde-wx2RopEcHd9GRurA47OsYhz8pZD9nsBJxeOLSXp3J9OLeJ9NP-B6ZoSlq5NM8UTdURGlQW5RYOCueszm8UJUZ5g2FC1ERUPB6WUwryK7Kc4ndUzzM4rYanOMw93k4oO9I0pP-OIbZoLBqKMUvMYbTcpov3hCT_got6S0pb2Q-jX5MSHpLx4sMv8STKTd2milbUB26TiqHSSRTnZsM1U66rB_2bnLTu8kPePemBc3UzyYn3TQPvqldHE50arvrRbw4_Lh6Q4fU1x96H_LrTduNtRsV5GMS38XhXR1cV1RminakK53BAxAa9GppR6991Xte7PGQne6doEXhNdivLwdLLRor2yWYiS7MXQ2ivpXYvN____HR29Bust4flZ623WnhiegpsUZ76BF1yg2ZXizxL1D1f5Sq_y7VtvJdiLb3Q5qFqrMx1h6len_-tpq-IcNINiPls4sL5-9qNSTqXwIGl9dHsm1x3MTivwlrqEl7-t979US7Msd3VDsDPouXTRbv0IgXB1Oc9uMiHj4iYu_haevWdPW6BQMIJW5Tt0Mm5M_KOsmTI_iTTr8Pf3z6haolXD3f7HjF8tBF6fOcY3i4DE5geHiX4YXadQ8GriHUrOQ7ica46thrPLuGDIQBJgtlLHDUlolSvoDdIaTYi2qbtmf2YiBXGh7-_EoJfQTL9BZt29KVWdPWffnyCUTuml2utEZu5Ut_V9PUNrp2ddS-7NHMsmWQLYIFm-HSn3vzJPTD0JvtluinKad5yLIwTYMwnC98L8qjRcYwZVHuzcSSejT0qB_4MQ2ixb3PvDwNuJ9ynyfePCKhhwUT8l7KunDd-kwYU-Ey8WN_PpMsRWma1p_SlPG_scxI8PA1iQmlhK4IpYUwBrM7tbeiEK_MClW6uehpppcu511abQ0JPSmMNZddrLCy-U3B5Yqe4H8lV6URxrrvFU2DbvaSnZvcWaXl6GeGrbC7Kr3nqiB07fJ2b3d7rb4ht05AR8UQum7Y_BMAAP__WE-HRw">