<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/86635>86635</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[aarch64] Prefer use callee save register to avoid repeat load when cross call
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
vfdff
</td>
</tr>
</table>
<pre>
* test: https://gcc.godbolt.org/z/hdPf8veEc
```
float foo (float num[], float r2inv, int n) {
float sum = 0.0;
for (int i=0; i < 1000; i++) {
float a = num[i];
// const float r = a / std::sqrt (r2inv);
const float expm2 = std::exp (a);
float tmp = expm2 * num[i];
sum += tmp * tmp;
}
return sum;
}
```
* llvm: When built with O3, use 2 load to get num[i] **before** and **after** the call expf
```
.LBB0_1: // =>This Inner Loop Header: Depth=1
ldr s0, [x19, x20] // load num[i]
bl expf
ldr s1, [x19, x20] // repeat load the num[i]
add x20, x20, #4
cmp x20, #4000
fmul s0, s0, s1
fmadd s8, s0, s0, s8
b.ne .LBB0_1
```
* gcc: Only one load for num[i] because it use the callee save register
```
.L2:
ldr s15, [x19], 4
fmov s0, s15
bl expf
fmul s15, s15, s0
fmadd s14, s15, s15, s14
cmp x19, x20
bne .L2
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyEVVGPozYQ_jXOy-giY0M2eeAhuVzUSifdPVTqY2XsIVAZTG2T3e2vr8aQDcmmrYQYjGc-fzPf2FYhtOcesWTFgRXHlRpj43x5qU1drypn3ksm9hAxRCb30MQ4BCb3TJyYOJ21Xp-dqZyNa-fPTJz-ZuLUmJ_19oLfNONHxvdsw-cnDWvrVITaOWBiOw36sZsWZ-IrTL-8aPsLDds-Qs_EDtjLYQIAmH3C2AGTR-BrzuRi0nmCpsCWySPNQQtMfoWM82nExCE996jwgawS7kSrJV7y3mvKHrTrQ7wSTiGKpiBEQyWS-_CXj8Rlzmb3iLMEwLehEwnkIxzfBopWy8gnbGM3pLgZQez_g3mqmTiQewojabth6cVejreI25fHOPqe4m9Urp4PCs9vsQdrLx11DfzeYA_V2NoIr21s4IckbceAIMA6ZSA6OGNcECdqTOwrrJ3H6RtUb-bfqo7o57-xQdDKWsq_fkpo_f1w4H9kxGRWjskjk99-a9oAv_Y9evju3AC_oDLoye2IQ2yYPGZ3xQNr_FRFTvRZcXjLdvT1JjhRvqKnjBYa3GFUdrI3tp_Qs-foV3iPA6o4163Bf11JGZMsxc8whCtkPvvpblg60AztkDuQuhvtLeX5nT36TEuF7cJnem8fkl_3SPaqyNP2EXs4a00y_OjtO7gep1xpYy8apEKtqIPamBrp2gaIENQFweO5DdQlzztC0Bb7VP6QFYvaTwdS_pisuywKkhX_K-9HCSfwq_lU6LmIWb70upoHFiTdoj3uKUw1BkryPvmVKaXZyZ1aYZm9ZFkuixcpV02JG1mZiqttVhcV3xVC74TWcqtyratqY1ZtKbjIuRQbvsm3hVwr1DUaoTHjfFMbw3KOnWrtmvY8XQarNoQRy-1mI4uVVRXakK4YIXp8hTTJhKAbx5cU86Uaz4Hl3LYhhhtKbKNNd5NSXjebnJT_6bFGn1R_pjgdJuriWnO3U17pCNLehZCCVqO35cNt1sZmrNbadUyc0tE1mS-Dd3-ijkycEu3AxCml9U8AAAD__wnG73k">