<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">