<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/128722>128722</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Suboptimal register use on x86-64
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          tavianator
      </td>
    </tr>
</table>

<pre>
    Saw this while looking at https://github.com/llvm/llvm-project/issues/128441, but this seems like a more general issue.  This C code

```c
int foo(int *a, int *b, int size) {
    int ret = 0;

    for (int i = 0; i < size; ++i) {
        int diff = a[i] ^ b[i];
        ret += diff;
        if (!diff) {
 break;
        }
    }

    return ret;
}
```

[compiles](https://godbolt.org/z/dK74hY1r4) at all optimization levels to:

```asm
foo:
        test    edx, edx
 jle     .LBB0_1
        mov     ecx, edx
        dec     rcx
        xor edx, edx
        xor     eax, eax
.LBB0_3:
        mov     r8d, eax
 mov     r9d, dword ptr [rdi + 4*rdx]
        mov     r10d, dword ptr [rsi + 4*rdx]
        mov     eax, r10d
        xor     eax, r9d
 add     eax, r8d
        xor     r10d, r9d
        je      .LBB0_5
 lea     r8, [rdx + 1]
        cmp     rcx, rdx
        mov     rdx, r8
 jne     .LBB0_3
.LBB0_5:
        ret
.LBB0_1:
        xor     eax, eax
        ret
```

It keeps moving the accumulator from `eax` to `r8d` and back.  It also materializes the `xor` result twice when it doesn't need to.  Ideally I think it would look more like this:

```asm
.LBB0_3:
 mov     r8d, dword ptr [rdi + 4*rdx]
        xor     r8d, dword ptr [rsi + 4*rdx]
        je      .LBB0_5
        add     eax, r8d
        inc edx
        cmp     ecx, edx
        jne     .LBB0_3
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykVcuO47gO_RplQ3Qgy69k4UVcdQMU7ux6NrMayBaTqCJbgSRX0vX1A8pOKs6kGw2MYUAPkkdHJEVK7_W-R6xYXrP8dSGHcLCuCvJDy14G6xaNVT-q7_IM4aA9nA_aIBhrj7rfgwxwCOHkWbphYsvEdq_DYWiWre2Y2BrzcR2-nZx9xzYwsdXeD-iZ2CZilWUJEy_QDGFE94idB6OPCBI66xD22KOTBqLVEuBPUnuB1ipkfEN_wce_ZXyj-wA7a5lY0YyJjST4ad5c515_IhNrYGXN-AYA4q7DACx9Bc7SeoQmyc46mOD0TRynLyNOWgMTNRO1nkNeYZXe7aKhZHmtWf4KLP8fNNNiPOuqHymImrTJbC7UOyLCRBJFX2c1DuVxrsrK12k1zqaFwzC4nobpiqPw6sDJn3nd2u6kDXriJ1YPAbaqsSYsrdszsf1kYqv-X2aHvxKXEScZQBoD9hR0pz9l0LYHgx9oPARLIPOYSd8xvqGIpZs7_gF9oBHVhWJGA9_Au8EoXf5R1_zv5E6_sx9xxPZef_oUtqNz2_vdi3UP8HeCiCVHoSTheGQ6Z3k91a3Ul-bX7jruqrN1Ck7BActrpzTFFzImNk5dyL9P4BL-xNL_huVEOQL89ELEi29AKjXbXT0zuVKZbKbvfQzDFIecJAbl5ApSjze9RL7JnGnbnW6xINyZ528OUBOlGPT-PujpLRb5PBaU01dRMhc9Dejc7uEJvAU4Ip48MaIqFw4Ism2HbjBUEWHnbAes4ARVcAiWFuTBgoPsFTSyPS4B3ugteAudDOi0NPoTfcRiBb9YR9oO_WAChLNuEc4H7EEHUBZ9z0QZoEdUECxhKZTG_IA3qpP9kdTOdjAqVuKxUsaqSVX0Z89snsQP2fv7eXpLjmeGv0rTJ3kzfb9MRt23D0_0mkVPn_u_E-bmhoWqUrVO13KBVVJmPFvnZcoXhyovsryUci3btC1zzMq1KGQj22SdFUmx5gtdCS5yLkSe5FwkfMnXCnmZoCplq3hZsoxjJ7VZUrOj4riIDatKxKoUYmFkg8bHHitEj-exnTEhqOW6KnbIZth7lnGjffBfMEEHg9X3oYklVRpwuNc-oIPBI9geLqviW5EtBmeq_9SKieZHJf4JAAD__yjZOnA">