<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJytVU1zmzAQ_TXioomHb8yBQ1yPZzq9tZdeBayNWoFSScR2fn1XAhwnDo7bhJEFklbvvd2VV6Wsj0VjzIMm0T0JN9g0b-vFTtalFGYh1Q6nnuyv65aJXLKK-Gvi34996o_NDVlvJGV1TcIl7wwlYXog4RdaSino0X7ZWQTLKclWwxaKzwEtVyRa41I0TpNsfRPkHFLgX0KdAVayq2_QOXzs52mOlEQb-oT9PZq9Lf5Grlso7t5y6waS69iBPw_-KsFD_7WjrdSGVkyDtjz7Bjq6BxJmCmyyeLejjD4y0QO16aMttFIdqYItKOgqcJsAVSsFlRFHupWipqbh2obD7kAUqto9DrVRfWW47BZ01ZuJSyEZchkD7YOxfMMxocBNA4rKLdUgEBtqGxttWGf0yCqkRlkNOFJ77K8c6CmkGNEpoGPOMKqnvXR80FzYNwkTqF0GcDcOVM2t-QtbBebPNZJr6DGm6kbwoX9xPN7yZdYlA9qI0SXNB1b39cKqauUjiMGqOkxWGIJPCM-72q1o-j-qUfQU0Lspogmww6VvHTp3rvrS6tw39gm-XWbiWe0Z7owaAczZOrecudV0Mq9mxcfzcfjISXiN9ezLv0Tr9Of06iKq8yhnHha_Rqri-7cfvJWd1yvx6jbbYT3oy0UlWxwI8Ti97h6U_IX1AYdc697WsU0SLdPQa4q4yjPIsoxFYZ2lkDEIfD_N03Tp-_EyrzzBShC6IMmKhGHJqt_Q2ULyc4kJDEmy9j6ughehH2ILkiCN4iRYJGGcb_M0S8uo8oO4JrEPLeNiYXHsPe2pwkGW_U7jouDa6OdFpjXfdQBONCo03AgoNgjQK1ekXQW2FddW0T3qdXcKt4UXz9KphnpOZ-FE_gUelz3A>53862</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Failure to fold rmw add with conditional constants
        </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>
    https://simd.godbolt.org/z/znn85o8ac

```
auto add(int &x, bool y, int z) {
    x += z;
}
auto add(int &x, bool y) {
    x += 10;
}

auto condadd(int &x, bool y, int z, int w) {
    x += y ? z : w;
}
auto condadd(int &x, bool y, int z) {
    x += y ? z : -10;
}
auto condadd(int &x, bool y) {
    x += y ? 10 : -10;
}
```

In most cases, when we're adding a value to a memory reference, we correctly fold this into a add rmw instruction. But when wer'e attempting to add either of selected constants, we lose the fold:

```
add(int&, bool, int):
        addl    %edx, (%rdi)
        retq
add(int&, bool):
        addl    $10, (%rdi)
        retq

condadd(int&, bool, int, int):
        testl   %esi, %esi
        cmovel  %ecx, %edx
        addl    %edx, (%rdi)
        retq
condadd(int&, bool, int): 
        testl   %esi, %esi
        movl    $-10, %eax
        cmovnel %edx, %eax
        addl    %eax, (%rdi)
        retq
condadd(int&, bool):
        movl    (%rdi), %eax
        leal    -10(%rax), %ecx
        addl    $10, %eax
        testl   %esi, %esi
        cmovel  %ecx, %eax
        movl    %eax, (%rdi)
        retq
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytVdGSmjAU_ZrwklkHgiA88LDWcabTt_alryFcNW0g2ySsul_fmyiuq4u17TIYCNycc-658VLrZl9tnHuyJH0kbImnlW0zWeum1spNtFnjoxf_67oi0wUXJF6Q-PE45vHxDFPeO0150xBWyM5RwvIdYZ9orbWie3_nnyJYSclsflhC8dhh5JykC3yVHh-T2eIuyDGkJL6GOgMUumvu0Hm42Y7T7ClJl_QFx0cMe1_8nVz3UDy8l9YdJLexk3gc_KLAh_FzR1ttHRXcgvU82w10dAuEzQz4YsluTTl95qoH6stHW2i12VMDKzDQCQiLAFUbA8KpPV1p1VC3kdbb4VcgCjXtFqfWmV44qbsJnfdu4DJIhlzOQfvkPN9hm1CQbgOG6hW1oBAbGu-Ndbxz9siqtEVZGwikftvf2NCDpejoYOixZujqaS09Hhiu_JWwDJpQAVyNE9NIH_4m1oD7dYvkFvoUS3Un-GF8sz3ey2U0JQfWqWNKVh5Yw92bKNHqZ1CHKLEbotCCD7Dnj9q9aPovqlH0YOjD4GgGfHedW4fJnau-jjrPjX9AbteVeFV7hjuiRgEPsSGtEO41ncLFqPjpuA__sxMusV5z-Ru3Tn_OqKnSpkxLHjnpFFRLLlVvQq8JjcQ3Dt8MttgMQmuUvn-gJadWEPVGXXz31hjc1xOhW5wo9TxcHp6M_oGdBKfS2t53vGWWFjmLNhXUGYBY5VCukizJU5FkGU-LWmTFipWCR4rXoGxFsjlhrObiJ3S-5XwvsNSMZItIVixmeIbl0yyZZGxarsp8ltepiJNpQ6YxtJjfxGvx3-PIVEFW3a8tvlTSOvv6klsr1x1AoER8_DpstKm-fvkmW91FIYMqyP8NHkEpjQ">