<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJztVk1zmzAQ_TXioimDFgubA4fYTmY6k5yS6V2AwGoFciTZcfLrK8AfMYE4aTo9VSNj0K7evt2nZUhV_pygKNjPYImCK2P1JrP4nnSPaDrvbrAboraYEYzCK0wiFPYt0Leg6fJ4f8CFAVyzUrpBPoPcL8IgWnflO8t1jbMV03jXs1lerSWzHIUL-7zmNas4fkDhNd4qkeMCwewBI4gsghifkbF-m-LyFeJ-Gbplt22OyRmts4inCPekCeEiHJ0HfKDv0xPk9fX29sfdoNMeLlw43cLrNvQBtWU_PBCEGE2C8c3H7JtRqa1JJXZ1gRkCqsW6cYGFg6Gc7d44vzzJJgR1pnGnp47H0alFzsXngmc9XLOSssOduNM44sTyfO_U2kYonrwmEaVhdPIbK6ioqvacBDsSuPEmjWPQSylrbh_76sJeIPgTdfubv6TuXxGujyvq7HV53o8JHyndO810ozTmO-YakuPvi4Wr5fAWmL_XXcPZjuY7LtdJNUJ9AsPJj5T8IuoBlw7XG3-U3Rlc5LvuukQTPsezw6Vv5Pw4sx7Y1CeXm-i_iP9axLN2HOrRlbVr00gDN26WWeaXKk-VtL7SpVt5cT-a7R4nhhWplydhHocx89jGuu-GJGdb0XhvWW1-PXsbLZMeoLCrTepnqnIPUm4Pf9_WWv3kmfssuBHGbLhpwoTTGfVWCeNxwOgsjooiIBmJsllBaBFDTF3ZYwaeZCmXJkF0jgBa0PBKra2oxAuzQtUODBBdel8nIxIIwE1CmhMBxE9TxuK4IIxEBU2nxL34ecWE9BucpmSeTlrIdFMaZ5TCWHMyMmNEWXPecncMrbCSJ3cuKs-xsUpzXHFdirrET44sToUtBJe58VpiScvqN_Jje2o>53785</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Missed store merging with bitfields
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            llvm:optimizations
      </td>
    </tr>

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

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

<pre>
    ```
struct S1
{
    int a1 : 16;
    int a2 : 16;
};
struct S2
{
    short a1;
    short a2;
};

extern char x;

template<typename T> void f(T &t) {
    t.a1 = x;
    t.a2 = x + 1;
}
template void f(S1 &);
template void f(S2 &);
```


LLVM
```
void f<S1>(S1&):                          # @void f<S1>(S1&)
        movsbl  x(%rip), %eax
        movzwl  %ax, %eax
        movw    %ax, (%rdi)
        movsbl  x(%rip), %ecx
        shll    $16, %ecx
        addl    %ecx, %eax
        addl    $65536, %eax                    # imm = 0x10000
        movl    %eax, (%rdi)
        retq
void f<S2>(S2&):                          # @void f<S2>(S2&)
        movsbl  x(%rip), %eax
        movw    %ax, (%rdi)
        movsbl  x(%rip), %eax
        incl    %eax
        movw    %ax, 2(%rdi)
        retq
```


For example ICC:
```
+void f<S1>(S1&):
        movsbl    x(%rip), %eax                                 #15.12
        movw      %ax, (%rdi)                                   #15.5
        incl      %eax                                          #16.16
        movw      %ax, 2(%rdi)                                  #16.5
        ret                                                     #17.1
void f<S2>(S2&):
        movsbl    x(%rip), %eax                                 #15.12
        movw      %ax, (%rdi)                                   #15.5
        incl      %eax                                          #16.16
        movw      %ax, 2(%rdi)                                  #16.5
        ret           

```

https://gcc.godbolt.org/z/5cxq4safb
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztVstymzAU_Rqx0ZRBkoXtBYvYjmc6k6yS6V5CAqsVyEGy4-TrK8CPmEDspJ2uqhEv3aNzH4fLwI14SUAc7We0ANGNddUmdfABtY9gPGtvoB-qdJAhCMgNRDEgXQvuWsB4cbw_8OIeXrsyVc18RrlfxL1s7VnunKxKmK5YBXcdm5PFWjMnAZm7l7UsWSHhIyC3cGuUgBnAk0cIcOwAnsKzYFzYpLh4w7hfxu2y3zaD6CysM48nDw-oduE9HME9GNzFdAR5e767-3HfC9rTkbnXjdw2rg-sTfT9A2ACwSga3nzMvh6F2Vquoa8LngBMK7WuIXjuaahku3fg12ddu6DeNAx6buM4ghpmoT7nPO3w2pXWLe_Iv40DICbEHtTYBkI8oUYxpSQ-4YYKqoqieU-iHYr8eJfG0emllCvpnrrq4r1A-Cvqdjf_kbp_RbguryrTt-X52Ce-pnQfNNPSVFDumG9ICb_P576W_Vvw7KPu6s92MN9huU6qIRoi3J_8QMkvsh54aX-94bXRndHFoe-uS2Hiz8XZ8tJ3cl4fWYdsHKLLTfRfxH8t4lk79vXoyrm1raXBSz_zNA1zI7jRLjRV7lde_UHT3dPIsowHIiFiSqYscMppmdwra6WA1plKwkJWuSpz-KzcCnLlMiW1sMGm0knHiQdseJiawj9ovT1cvq0r81Om_ldh6Xk30tauyXhCg1VCUzahGUGEj9lEpCylAjGSoRGd8BHJWKAZl9omgM4Axg0puTFrpwr1ypwypSfDgC4CleAI-4lQrTFGIeeMTacZYijOKB8j_ymXBVM6rEnqIgRV0kTHN7n1Rq2ssycjs1blpZSNZ8_PNs7_UCWCbVVdxi0r7a-XoMknaZL5DTnLZmU">