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

    <tr>
        <th>Summary</th>
        <td>
            Missed shrink-wrap opportunity compared to GCC
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            missed-optimization
      </td>
    </tr>

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

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

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

```c++
#include <cstdint>
#include <vector>

auto push_back(std::vector<uint8_t>& xs, uint8_t x) -> void {
    xs.push_back(x);
}
```

GCC moves the code for saving/restoring registers via the stack into the subsequent basic blocks, leaving the happy path free from stack traffic. LLVM sadly does not.

```asm
; GCC output:
push_back(std::vector<unsigned char, std::allocator<unsigned char> >&, unsigned char):
        ldp     x2, x4, [x0, 8]
        mov     x3, x0
        cmp     x2, x4
        beq .L2
        strb    w1, [x2]
        ldr     x0, [x0, 8]
        add x0, x0, 1
        str     x0, [x3, 8]
        ret
.L2:
        ; grow the vector ...

; LLVM output:
push_back(std::vector<unsigned char, std::allocator<unsigned char>>&, unsigned char):
        stp     x29, x30, [sp, #-64]!
        stp     x24, x23, [sp, #16]
        stp     x22, x21, [sp, #32]
        stp     x20, x19, [sp, #48]
        mov     x29, sp
 ldp     x8, x9, [x0, #8]
        mov     x19, x0
        cmp     x8, x9
        b.eq    .LBB0_2
        strb    w1, [x8]
        ldr     x8, [x19, #8]
        add     x8, x8, #1
        str     x8, [x19, #8]
 ldp     x20, x19, [sp, #48]
        ldp     x22, x21, [sp, #32]
        ldp x24, x23, [sp, #16]
        ldp     x29, x30, [sp], #64
 ret
.LBB0_2:
        ; grow the vector ...
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0VU2ToyoU_TW4uRULQRNduEh6Om8x3VWzePW2XQgkMlGxAdPp-fWvwDj56GReNi9lBZVzD_fecxBmrdp2UpYoW6HsW8QGV2tTfm8l26kuqrT4LGvneovoEpE1IuutFpVuXKzNFpH1L0TW33_-LbMf9esPhJf-muPx4ois_IWXiFDV8WYQEhB94tYJ1TlEn79M7SV32hxn8JINTkM_2PqtYnyHSG6d8InQ5QR8GlTn8rdARuZwsIg8wfEdHBApYIboM-y1EoAWPhcAgIONz1k9DtGQ6OLbeQVjFn89PUGr99KCqyVwLSRstAHL9qrzPTDSOm1UtwUjt8o6aSzsFQto6xjfgeqcHh-Hysr3QXYOKmYVh6rRfBeSbmTgC7Ca9f0n9MzVsDFSwsbo9kjlDNtsFI_h5eWfV7BMNJ8gtLTQaRdfCcBs6x_pCnwJenD94Hz78PI_etoFUwjgNTM-t98Q1jSas1so-gyjBkGAS4JiXBSOv0b0YTwQjz2k_h9lqwP2NznKvp1hW70fsTRg8dkUb69oTlOVfIf4hZy9sc5UfvxIptXI5UKNMCMb_lM6TIgjYvxPLpe4YqA3GIx0CC99chc98SJtjf4I8o9CQBxPgtLVKPf_LeGjClo3tb4IvaBTybYPN4TO5qmvmyQ3o4LkB0Kvo5L5ZbNOEaPGJLmOoORexKhSUlxHpPccNtZiez_326J5YCkuPIEIvccxLnfbphPVmU1j-e7H-GW1wm9_tmt-x675BDhW-iU3b9mz9fOp1bece5_stGcf7esp4lHtfMTj3jjxf_Wgd14ImoevwrTnxi4_uu-mr2gkSioKWrBIlsmCzotFmuA0qst5umHFQlJOcJEUWSKyKk-xwCmWeb6pkkiVBJMMJ0lGcJqTNGZFglk6pxu-yAoiMEqxbJlq4qbZt_5EjZS1gywTQhOCo4ZVsrHhaCakVdZKMdO9U636xZzSHSK-g5EpffisGrYWpbhR1tkToVOukeVrCAZbG9XtZh-G9aD7Xhs3dMp9Atdtz4wU4LQ_KqLBNNenvnL1UMVct4isPflxmPVG_5TcIbIOqVtE1sfs9yX5NwAA___8h0WI">