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

    <tr>
        <th>Summary</th>
        <td>
            [DAG] Failure to fold select(x, sub(x, c), m) -> sub(x, and(c,m))
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:X86,
            new issue,
            missed-optimization,
            llvm:SelectionDAG
      </td>
    </tr>

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

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

<pre>
    https://godbolt.org/z/a1PczEM8a

If we're selecting a subtracting a non-constant we fold the select into a and:
```c
#include <x86intrin.h>
auto masked_select(__m128i a, __m128i b, __m128i x, __m128i y) {
    return _mm_blendv_epi8(a, _mm_sub_epi32(a, b), _mm_cmpgt_epi32(x,y));
}
```
```asm
masked_select(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2)): # @masked_select(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2))
  pcmpgtd %xmm3, %xmm2
 pand %xmm1, %xmm2
  psubd %xmm2, %xmm0
  retq
```
But for constants this fails, which on x86 can result in a BLENDV instruction, which is never faster than a AND
```c
#include <x86intrin.h>
auto masked_select_const(__m128i a, __m128i x, __m128i y) {
    __m128i b = _mm_set1_epi32(24);
    return _mm_blendv_epi8(a, _mm_sub_epi32(a, b), _mm_cmpgt_epi32(x,y));
}
```
```asm
masked_select_const(long long __vector(2), long long __vector(2), long long __vector(2)): # @masked_select_const(long long __vector(2), long long __vector(2), long long __vector(2))
  movdqa %xmm0, %xmm3
  movdqa .LCPI3_0(%rip), %xmm4 # xmm4 = [4294967272,4294967272,4294967272,4294967272]
  paddd %xmm0, %xmm4
  pcmpgtd %xmm2, %xmm1
  movdqa %xmm1, %xmm0
  blendvps %xmm0, %xmm4, %xmm3
  movaps %xmm3, %xmm0
  retq
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVl2vozYQ_TXDy-hGMAYCD3lILjfVqtvVqitVfUMGnOAutlnb5H78-gpI2CibqitVW60UEcZn7PEM53jMnZNHLcQGkh0kRcAH3xq7-f3XT1IZHVSmed203vcO2BZoD7Q_mqYynV8ZewTavwHtefSxfnv6LeMQFhBu5-e7Az4LoLUV6EQnai_1ETm6ofKWXyxt9ENttPNce3wWeDBdg769TEGpvUGOXDdj-Hn1NJx_9dkmJnXdDY1AYI8vWSq1t1KvWmBPswcfvEHF3WfRlPO6QFlZqogyiRzoES9GdW28XBuvQDnCejeviIhohR-sxlKpsuqEbk6l6GUGlM0rKlW6oRrHGF0GK6D8AtaqP_oFHmO9TmgO7BwE1sVNxjcmd2oeuc2tM_qI06MsT6L2xgJldA7-Q8Ac2BaBGEIc_gy7OX-lfqpyg0DJi1JsnDa_0tmj5_qCRt-i2LuhapbBBQ8vuBX-y91vtBs8HozFC7cd-lY6PHDZuXGd51bWLRqNL1mKNddohRu6ke_Icff-6UPxB0rtvB1qL43-OkU61OIkLB6488Kib_k4Zfvhliv_QR3ltOt_0si_yGKREgIrZhkIHy1Ep_ia4j-zjpYq_L-C-dFhz3VX5tR84QufF2qzG4fV-8eP71gZAmVAiZX9OcbsHU8pzC-sQEh2MeVxnq5pPcrlu4ykWNTGm6b5dkvxfTVf6TG6m1V0R7Azw3p3L8rdGvDFl32f_oNmw5qc5TwQmyjN44TRmkVBu1mviSUU8yoNqzqKwoOokixPiMW8OqyjJJAbComFeURRwigKVyIReSaaPE0pzQ5hDnEoFJfdqutOamy_gXRuEJs0jcIo6HglOje1caKK15_F1DT_zFKgsVZApMUzTlOWESWdE82D6b1U8o3PZ80ZG6MA236am7fRxfaXEUuKwG5G7KEajg7isJPOu6978tJ3021i9E8K3HPZDVagN3N3X_rCdJC4obq81mdqqfFMeQD2dA2ONwDKaqBHNRM5GGx3ezGRvh2qVW0U0H7a_fz30Fvz1xRzP2XvgPZTzf4OAAD__9iGob8">