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