<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/62287>62287</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[Wrong code] When no_caller_saved_registers attribute function call other function
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
youngbe
</td>
</tr>
</table>
<pre>
For code:
```c
void ppp(void);
__attribute__((no_caller_saved_registers))
void kkk(void)
{
ppp();
}
```
After compile with -O3:
```assemble
kkk: # @kkk
pushq %rax
pushq %r11
pushq %r10
pushq %r9
pushq %r8
pushq %rdi
pushq %rsi
pushq %rdx
pushq %rcx
subq $128, %rsp
movaps %xmm15, 112(%rsp) # 16-byte Spill
movaps %xmm14, 96(%rsp) # 16-byte Spill
movaps %xmm13, 80(%rsp) # 16-byte Spill
movaps %xmm12, 64(%rsp) # 16-byte Spill
movaps %xmm11, 48(%rsp) # 16-byte Spill
movaps %xmm10, 32(%rsp) # 16-byte Spill
movaps %xmm9, 16(%rsp) # 16-byte Spill
movaps %xmm8, (%rsp) # 16-byte Spill
movaps %xmm7, -16(%rsp) # 16-byte Spill
movaps %xmm6, -32(%rsp) # 16-byte Spill
movaps %xmm5, -48(%rsp) # 16-byte Spill
movaps %xmm4, -64(%rsp) # 16-byte Spill
movaps %xmm3, -80(%rsp) # 16-byte Spill
movaps %xmm2, -96(%rsp) # 16-byte Spill
movaps %xmm1, -112(%rsp) # 16-byte Spill
movaps %xmm0, -128(%rsp) # 16-byte Spill
movaps -128(%rsp), %xmm0 # 16-byte Reload
movaps -112(%rsp), %xmm1 # 16-byte Reload
movaps -96(%rsp), %xmm2 # 16-byte Reload
movaps -80(%rsp), %xmm3 # 16-byte Reload
movaps -64(%rsp), %xmm4 # 16-byte Reload
movaps -48(%rsp), %xmm5 # 16-byte Reload
movaps -32(%rsp), %xmm6 # 16-byte Reload
movaps -16(%rsp), %xmm7 # 16-byte Reload
movaps (%rsp), %xmm8 # 16-byte Reload
movaps 16(%rsp), %xmm9 # 16-byte Reload
movaps 32(%rsp), %xmm10 # 16-byte Reload
movaps 48(%rsp), %xmm11 # 16-byte Reload
movaps 64(%rsp), %xmm12 # 16-byte Reload
movaps 80(%rsp), %xmm13 # 16-byte Reload
movaps 96(%rsp), %xmm14 # 16-byte Reload
movaps 112(%rsp), %xmm15 # 16-byte Reload
addq $128, %rsp
popq %rcx
popq %rdx
popq %rsi
popq %rdi
popq %r8
popq %r9
popq %r10
popq %r11
popq %rax
jmp ppp@PLT # TAILCALL
```
The function kkk do save the registers may used by ppp, but it call ppp after restoring the registers.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysl1tvozgUgH-NebGIbHN_4CHTKtJKlXa1W2keIxvc4CnEDDbdyb8f2dAESGBS2ijKhePzca7oHKqUOBw5T0HwDQSPDm11IZv0JNvjgXGHyfyU7mQDM5lz4G0BegRoC0LUvbPu_5sUOazrGpDY_AQkAd63_qj93O-p1o1greb7PSAxIPFR7jNalrzZK_rG833DD0Jp3iijTZIB-PX1dQDuqFGPhxD2Nx7dNHqcGDo0ZvuiuXGoqkXJ4f9CF9D927t2jirFK1by7rKxwrP3-9MLEA8CHxmFzsa6VcVPKwga-utiuDV-IMN4QYZuwJL58_G8KBe3ZEaibkp6rQXDs4lMtexnFwkfm8w8dPR6fKqSb7RWlvCrqnBgzmFMbC7taZLciCwOXXbSHP5Xi7LsgROSb0hJuAC6l-QZUozWkMZO9jxieKH_ed47EBugH38dEBmgN07ChwiJTWO4HtDXy7xDH_UpMkAXr6qHm8DQAr2lSr2zwGzNu-vyNybZmne_orQ6nq189ytKvwfa0nfXdeVNIO7Sij9Rq6hDkHgNYqrXP-YMdsGtf3kpaT5HHDtzIeK1xHG8L0CyFPpF4rgkLkRvNXFctBeiv5rozyQmWE30ZhITribimcxEa4m3cfEU9wHinInXT-R7iXNhxNOWuZs4l2o8bZm7iXPliFf3zFzL4NU9M9fWeHXPzD96pk3zJyLN8zuGv1rW_anr8dHKbs6cA6WrWXUgu5pw34HTqXigM52lB6Lz7D3FXQ3sA6XpoP-jqrszdQ189M_Tsw3k8_avp4ft09PCuvJccPjSHjMt5NHsQjCX0KxMUBccnrcmWNETbBXPITt1G9EDZK2GQkOzZplLkNrFp-FKy0YcD2PAxslTL0-8hDo8xWFMMPIJipwiDV5oRAJMGfKRHzBCY4wzluWIJzFLwtwRKUHEQz7BOMEIRRtGMQ8zFuOcBZEfEuAjXlFRbsryrdrI5uAIpVqehoTEkVNSxkv1voA2qTnksvaggI9KobS6qGmhS7uqfm_k8dAtpcEj_F7wI5xdKOF597zE0cZE6oI352tO25RpoXWtzCpIdoDsDkIXLdtksgJkZ4zov9y6kT94pgHZWUcUIDvry-8AAAD__3qd8JU">