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