<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/74583>74583</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missed optimization: inefficient register allocation
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:X86,
llvm:optimizations,
missed-optimization
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
dvyukov
</td>
</tr>
</table>
<pre>
The code is:
```
void foo(long* aa, long b, long c, long d) {
long a = *aa;
long t;
asm volatile(
"movq %[a], %[a];"
"movq %[b], %[b];"
"movq %[c], %[c];"
"movq %[d], %[d];"
"movq %[t], %[t];"
: [t]"=&Q"(t)
: [a]"r"(a), [b]"r"(b), [c]"r"(c), [d]"r"(d));
}
```
Clang generates:
```
foo(long*, long, long, long): # @foo(long*, long, long, long)
pushq %rbx
movq (%rdi), %rax
movq %rax, %rax
movq %rsi, %rsi
movq %rdx, %rdx
movq %rcx, %rcx
movq %rbx, %rbx
popq %rbx
retq
```
https://godbolt.org/z/GGTMcGTGz
The asm block asked for a `Q` register, but it's not necessary to use `%rbx` for it.
I think the compiler could use, say, `%r8` as the temp instead of `%rax`, and then use `%rax` as `Q` register.
Then the code could be as follows and save PUSH/POP:
```
foo(long*, long, long, long): # @foo(long*, long, long, long)
movq (%rdi), %r8
movq %r8, %r8
movq %rsi, %rsi
movq %rdx, %rdx
movq %rcx, %rcx
movq %rax, %rax
retq
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEVV1v6jgQ_TWTl1GRmZCvhzzQIrr7cLW92q60r07sgBcT09hh2_76lQ0EwuVWPKx0JUTsnHPGM_YZh1urVq2UJSSPkCwi3ru16Uqx_-g3Zh9VRnyUr2uJtRESlYV4DmwBbA4pO_7CdG-UwMYYoFybdgU0R86BntDPsBpG9TASQAVC9njQI-LhNUeIFwg05xzia9CNXnG7xb3R3CktgfIzgAhEW7N_Q6AEkkcOycKvezGLH4HoqBiTqxG5uibfCF-PFPUdCjFSiDsUbqRwtxXxHAcqQbwASr_7EeUOqLhBPWwMdQcS9yS_xmkTTkB1BuoRUJ8BMQJEAIrhuCBb3LTN4f9J83aFK9nKjjv5U4-N7HXy0Y_PIhRHMcKM3S252BvEXW_Xb-EIkq56H2PHM8k9JtSpfko6fot4DMLf72FZdWJZdWRdwmIIIr4IUg-s-nbmoaQj5bq4ndkNgQask-7ti8NbO7cLR0ZLoOXKiMpoNzHdCmj5CbR8fn79Vj-_Pn9eivyN4tu30qbeILcb6W-Pznd_yr5DyrCTK2Wd7HyqVe9QOaDMYmsctrKW1vLuA53B3kqvOWacshBGuclhnd_RrVW7QRdusO1OadlhbXotvNDHtvwj7MYhRO4jcBv4Tm53qFrrJBdomhOFv4fBE_JWeF57mUIAfYDrMiZD3e0xGSGPiVR-K7AxWpt_bYhq-V7iy19__ga0fPnj5Zf3w9lfP9o-v-HU_Bq8z-w3WP-L53_ehDesHYkyFkVc8EiW04xN86TIqYjWZS3TjLFiOkuzIk34rGHUkGRZ3BRxk8UsUiUxiqfE0ilLGBUTagSTWS5nvEgYkznMmNxypSda77e-QyJlbS_LbJbkcaR5JbUNn2Giitcb2QqI53_nabhSn4DI6yCem51TW_XJnTKtHcCtslaKh0vQY8ki6kovfKj6lYUZ08o6e07BKadl-S2IcSSO56ha2TSqVrJ1g5ORa23qQIn6TpdX_a_cuq8mtdkCLUO-h8fDrjP_yNoBLUPRFmgZ6v4vAAD__zruSEw">