<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/100807>100807</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AArch64] Failure to combine 2 `ldr`s into `ldp`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:AArch64,
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/jvxE5K9sW
```c
typedef __uint128_t u128;
u128 add3(u128 *x, u128 *y, u128 *z) { return *x + *y + *z; }
u128 mul3(u128 *x, u128 *y, u128 *z) { return *x * *y * *z; }
u128 mul_add(u128 *x, u128 *y, u128 *z) { return *x * *y + *z; }
```
`add3` loads each of `x`, `y`, and `z` with the `ldp` instruction, but `mul3` and `mul_add` splits the load of `y` into two `ldr`s instead of using a single `ldp`. GCC has no such issue
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysU8GO4joQ_JrOxRpk2omTHHII8PIO8wF7RI5tiGecGMX2DPD1KwfYYVe7p10J4e5OuSpVSgvvzXHSuoFiA8UuEzEMbm5eRy3ezZT1Tl2aIYSTB9YCdoDd0ane2bBy8xGwuwJ2bx_n_4rX2n8DugPaAqe3n7z14XLSSh_Ifh_NFNZY7QOJa6yAbe4Xlv80IkIpBlgtNWB7BtySR3N5bq6ANYFyQ2Yd4jwtYAK4WYCP4gpsQ6DcPQmM0f6VQPsQaP8ssBdK_RON35j4Ee5zdMDpEhynxDqhPNFCDsQdCHB6TljcpvJyL8WkUntN-E8TBhIGnQZWndLITD7MUQbjpoTuY0gPl-A4fVx-2OSU-JM1wS8kSf2ue7lRBUfCp7uxz8CpX-j1DRa9mY5EkHTYp1dYkf-3WzIITyZHfJQDMd5H_Ww5Uw1TNatFppt1iUiR1RSzoelZoaRkBSs4LznNueKV4owf8vyASujMNEgxpyXydV1UiCslpVC61MgqxkUtIKd6FMaurP0Y02eeLerNmtKKlpkVvbZ-2RfEXsh3PSlgbdvOcuA5IAJuAXE03mv14k7BjOYqbmliWrG5ScQvfTx6yKk1PvgvqWCCXZbxwVfsSCeMjbMmwRHpxt5MmuDPiQb3FV4WZ_vrypowxH4l3QjYJan78XKa3ZuWAbBbLHrA7u7yo8HvAQAA__8RZisj">