<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/99311>99311</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[aarch64] llvm has redundant instruction to backup the argument registers
</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/xohKPYeEP
```
float foo (int num[], float r2inv, int n) {
const float expm2 = std::exp (num[10]);
float tmp = expm2 * num[10];
return tmp;
}
```
* llvm use **mov x19, x0** to backup the x0 to a **callee-saved register** [x19~x28], and use the callee-saved register after function call
```
foo(float*, float, int): // @foo(float*, float, int)
stp x29, x30, [sp, #-32]! // 16-byte Folded Spill
str x19, [sp, #16] // 8-byte Folded Spill
mov x29, sp
ldr s0, [x0, #40]
mov x19, x0 /////// backup x0 to callee-saved register
bl expf
ldr s1, [x19, #40] /////// use callee-saved register after call
fmul s0, s0, s1
ldr x19, [sp, #16] // 8-byte Folded Reload
ldp x29, x30, [sp], #32 // 16-byte Folded Reload
ret
```
* gcc: directly use the argument registers [x0~x7] after the call
foo(int*, float, int):
stp x29, x30, [sp, -32]!
mov x29, sp
ldr w1, [x0, 40]
str x0, [sp, 24]
scvtf d0, w1
bl exp
fcvt s0, d0
ldr x0, [sp, 24]
ldr s31, [x0, 40] /////// directly use the argument registers after all
ldp x29, x30, [sp], 32
scvtf s31, s31
fmul s0, s31, s0
ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVk2vqzYQ_TVmM7qRPU5CWLDIbZpNN0_tqkuDTUJLMLJNLreL99srG-cT8u6TnhVBwJ4z4zPnyAhr60OrVE5W72S1S0Tvjtrk50pWVVJo-ZkT3IJT1hG-haNznSV8S3BPcH8oy8VBy0I3bqHNgeD-P4L7QR__-Pa3-v0boTtCt2RN4y88Vo0WDiqtgeCmbh20_WlMTfA3GGcN1u3ZP4Z5ghmQ9H0MB4BSt9bFlWroTgiE78A66eviWzV0HnqEZTQAZ4Tf4sdId-pCXETALdxH3C03yvWm9euvb0m6m92bR2ma8wl6qzwkwe1Jn8GPgWV-QwMdX4PTUIjy374Dd1QwUP9CxJhSNI1Sb1aclQSjDrV1ysQ4snofWPZ9wE1kTLQypPMws4EgKn-t-rZ0tW7DovnOaE1wE9gJyWI3Yh8CiVsYGw9kSb9efmEwDOs6GHAkgVN_I6t324U_yN84hv0wuI2Yiq3fik-nYK8bqST81dWX-m_Q5sLvPSZbk9UOJiPCbr5C9Z2LBdvucaqRZkx82cdAY85lUM8E50EBsYKn30UOAwWvhXkNPAAXjRdv9aI0diktEhNrm_IBL-oJqvqRom5CugBVp7658RKvbFrgLzbrT9VoIZ9h5-U1moQg5zgH_CSuB2Sj3LzLr14_lKX3hKyNKl3zefWhMIf-pFp3ZczCqJLvQ-q3OfJ3cey9-4JzXnhv6qcgq3lPXQ31Qow_FvYHexD2vaq92QLCYz5cToRvy7OrAECGlR9sot4w1HCpoSrP7qYeSedL-zrv1QJ8Zhc_K_6f6enYxokLvBRfdWaUI8d5pmLF_hYpeTRUnH5iZqrTROZcZjwTicpZigxZimmWHHNacVZxmjIpNinL1hXlZSHKYs1TmvIlTeocKS5pylLGVkueLYoioworpHJZqAxTsqTqJOpm4c85f-gntbW9yrOMM5Y0olCNDZ8SiK36gDBJ0GsxMbmPeSv6gyVL2tTW2RuKq10TvkGEMOVx7bs6HqVHYcEo2bdStA7q1jrTjwfZ4xE67U_SmyZ_-mCp3bEvFqU-Edx7-Hh764z-R5WO4D5UbAnuxx2dc_w_AAD__3yPcsU">