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

    <tr>
        <th>Summary</th>
        <td>
            [X86] Failure to recognise masked store pattern
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:X86
      </td>
    </tr>

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

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

<pre>
    Pulled out of Issue #46917
```
__attribute__((noipa)) void
f1 (char *__restrict dst, char *__restrict src1, char *__restrict src2)
{
  for (int i = 0; i != 64; i++)
    dst[i] = src1[i] >= src2[i] ? src1[i] : dst[i];
}
```
clang -g0 -O3 -march=skx -mprefer-vector-width=512
```
define void @_Z2f1PcS_S_(ptr noalias nocapture noundef %0, ptr noalias nocapture noundef readonly %1, ptr noalias nocapture noundef readonly %2) {
  %4 = load <64 x i8>, ptr %1, align 1, !tbaa !6
  %5 = load <64 x i8>, ptr %2, align 1, !tbaa !6
  %6 = icmp slt <64 x i8> %4, %5
  %7 = call <64 x i8> @llvm.masked.load.v64i8.p0(ptr %0, i32 1, <64 x i1> %6, <64 x i8> poison), !tbaa !6
  %8 = select <64 x i1> %6, <64 x i8> %7, <64 x i8> %4
  store <64 x i8> %8, ptr %0, align 1, !tbaa !6
  ret void
}

f1(char*, char*, char*):
        vmovdqu64       (%rsi), %zmm0
        vpcmpltb        (%rdx), %zmm0, %k1
        vmovdqu8        (%rdi), %zmm1 {%k1} {z}
        vmovdqu8        %zmm1, %zmm0 {%k1}
        vmovdqu64       %zmm0, (%rdi)
        vzeroupper
        retq
```
We could have merged that vmovdqu8 reg-reg move into the final store if we'd recognised that the masked load was for the same pointer / predicate mask.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyVVU2P2zgM_TXORUhgyx-xDz50mg6w2MMWO4cWvQSyzDjqyJYryZnp_PpSsj1x0sx2NlAgkSIfnyiRrlT9s_w8SAk1UYMl6kD-MmYAEtA4yYpoG4S7IPwQZOE0vLjfM2u1qAYL-31AcxydEj0LaIGDnJSoR8NDhEA5PzKNM7ppMOjHLamNDehHcmPHaB69vUVdiJHS9m5cEHJQzjIXnSWCBPGOhEF855Y0clKWeDGgd34UsxvxLNI7EaQ77-ZDv8qfJhU9q-6vTD4sEDDGTGx3M2lcsq4h6yYk639ism6Z5kcMYR6fUeg1HECvT8Ct0usnUVu3l0b0JlQNB9GBzzMJknD_jR6iz_xh_-Auo7eadIpJwQzOnPV20ICroUM3zEkauvT-t5UGVqtO_nTm0f8zdzdEFpeDqsRnVyqGbOOPWUKeichdgifgOQjCNx3xS7w6WzHm5myBlP4Zib4PKfNIgrc9MdJeonnOo2-aLny23oczKa_tk1DKU7tpmXmEeuP4bU5ZIvJNH043MuddxHTiNSNEU8TsQutxeyWM6nxVvXmQfHy6IPHpvAvUHeSmNplRDb5B-H0_X2Q5fEeWNdhFKziXxdQZpsaAJT6X-_WywAo7F6v7nVp1qn8MyGv8-d6TaiNec5S-tG145dTjLUtbkUun-vnKaVw-RjdD5tfelyEj_-S993bn1i-v530byDsuGCwx_nTuBeUFn0unF9Bq6HvQl3q8lx8328oXIFwNsiZHdgLSgm7wq2CPzJ65a2jW-CcoA8GGq3AfCHYjJqdnIw7kCQK6rdGWq6YTZgZxlmOFjBX8hL3EtW6nN6wF99w7C-593RNsiLXgzI4um1VdxnURF2xlhZVQYtP9mmeuC98zIV0vQiqvAecwI6MeP1agu9WgZXm0tjfuWdF7HI2wx6HacNWi4Cp4mta9Vt-xnlAU7mtocJGmNI5WxzLKaAIpZ9WWQhxW-TantE4hp6ipMh6vJKtAGscwoLRi_BG6GiM6uhS_JbuVKGlIaZiGWCtRTrNNsYUoBsZ5kcZFgQWUhNDisTa-qSjdrHTpaVVDY1yvEcaa8yYzBusQfFIcPhvsUeny378fRKu6lT9B6en_AgZXNSM">