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

    <tr>
        <th>Summary</th>
        <td>
            Suboptimal vpshufb of broadcast
        </td>
    </tr>

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

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

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

<pre>
    ```c
#include<stdint.h>
#include<stdbool.h>
#include<immintrin.h>
__m256i f(int32_t* b) {
  __m256i t1 = _mm256_set1_epi32(*b);
  __m256i t2 = _mm256_setr_epi8(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19);
  return _mm256_shuffle_epi8(t1, t2);
}
```
https://godbolt.org/z/fWEKevPE9 
This generates:
```asm
f:                                      # @f
        vmovd   xmm0, dword ptr [rdi]           # xmm0 = mem[0],zero,zero,zero
        vpermq  ymm0, ymm0, 68                  # ymm0 = ymm0[0,1,0,1]
        vpshufb ymm0, ymm0, ymmword ptr [rip + .LCPI0_0] # ymm0 = ymm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19]
 ret
```
whereas GCC produces the better (and more obvious):
```asm
        vpbroadcastd    ymm0, DWORD PTR [rdi]
 vpshufb ymm0, ymm0, YMMWORD PTR .LC0[rip]
 ret
```

IR:
```llvm
define <4 x i64> @f(ptr nocapture noundef readonly %b) local_unnamed_addr {
entry:
  %0 = load i32, ptr %b, align 4
  %vecinit.i.i = insertelement <8 x i32> undef, i32 %0, i64 0
 %vecinit7.i.i = shufflevector <8 x i32> %vecinit.i.i, <8 x i32> poison, <8 x i32> <i32 0, i32 poison, i32 poison, i32 poison, i32 0, i32 poison, i32 poison, i32 poison>
  %1 = bitcast <8 x i32> %vecinit7.i.i to <32 x i8>
  %2 = shufflevector <32 x i8> %1, <32 x i8> poison, <32 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 18, i32 18, i32 18, i32 18, i32 18, i32 18, i32 18, i32 18, i32 19, i32 19, i32 19, i32 19, i32 19, i32 19, i32 19, i32 19>
  %3 = bitcast <32 x i8> %2 to <4 x i64>
  ret <4 x i64> %3
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysFl1v4zbs1zAvwgUOZTvygx9apxkOu8MOtwMOewpki0k02FImy-mlv36Qne82a4s1iCla4jdpUrJt9coQ5ZDcQzIbyc6vrcvVk9SNHJVW7XJIo-FfQTSD6A6Qa1PVnSLgReuVNn68Bv7w8mlpbX3rWDeNNt5pc0awWDSYpJotAYU2nuPCA96xEjBjML0fiBg7kPkJAz5jiya8LlrykwVtNEdAAXgXuIA_Z8IrJheYBKCIAAv2BjB5KxDvhNl74LlvjnznzNGndbdc1nRwy_fGeDxngelsjxzyO7yuvd-0wO8A54DzlVWlrf3YuhXg_Alwvvz58Dttvz1kbKD_sdYtW5EhJz31jJdSZdsMO0vgd-xNP0DOII6WB9-G37axW8UY-9U0fQ7Uo3WKbbxjkNw7pSGZXckIlH2mG2oguY8gmQEWT-Ts1XKpZ0Ou-Yex3V7PYU3Fy5buDlp6wqAGixDvYU1m19JDbspn0ndNc-GP3jDAezb-Unz7HC2C6TeV_dczee0RbwTZW8DRWUf-xeJ6XJMj2bLfioJtnFVdRS3za2IleU-OAQppFGusI2bLrbZd29fszaI6hbV0VqpKtj7UyDGss59_fJ-xbz--n4pkz3grEX99_XrkGX8poiEZr7s2wM_fnxtb19u9tYqW2hADXsTsF9NpDPxhqHQUIfHGVnLjO0fM2M4oWjJHUllT7xhg0vfA2layXnTGyIbUQirlTm2RjHe7o_5QnclQLLWVivVdsRgKrBdWMFnrlWHxGf2WKm20H-ux7jm1acl5qqkh44PhIhjOMRjeWxjEaI69rh5PY7aPyJm86VHgvjNtqfLWXQm81B-kXZ5vrG6teb4fRgnHoTMH5ET32tt7WA4Tqo_TMHZK7UPF3XRjcNvbQMAxUIhLMfhyTE60va69x2e7F5EY9l8Oxf9EJh-FiA_Gsg_CLrLBr5N6mQfcZ_L07Z4N3-uPGhN-a86OVM5VxjM5onySZnGSJCjEaJ2ngnMheEKCZ0vKeFYm6bRUPJ4gl1majHSOEfIomyBOYhGJcYzVFNOpqFJBcqIiiCNqpK7HoeeEoT3SbdtRnqaTJBrVsqS67a96iIYeWX8IiOHm5_LA86nsVi3EUa1b356keO1ryv_sSrvxupH1sXvaJTs23lHn6vzq-qD9uivHlW0A530fHJZPG2f_psoDznsbWsB5b-O_AQAA__-J7b4R">