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

    <tr>
        <th>Summary</th>
        <td>
            Missed optimization for a simple byteswap algorithm
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          jeremy-rifkin
      </td>
    </tr>
</table>

<pre>
    LLVM fails to optimize simple byteswap algorithms that use arrays such as

```cpp
template<std::integral T>
constexpr T byteswap(T value) noexcept {
 static_assert(std::has_unique_object_representations_v<T>, 
 "T may not have padding bits");
    auto value_representation = std::bit_cast<std::array<std::byte, sizeof(T)>>(value);
 std::ranges::reverse(value_representation);
    return std::bit_cast<T>(value_representation);
}
```

(this is the suggested possible implementation for `std::byteswap` on https://en.cppreference.com/w/cpp/numeric/byteswap)

and 

```cpp
template<typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
T byteswap(T value) {
    std::array<uint8_t, sizeof(T)> arr;
    memcpy(&arr, &value, sizeof(T));
    std::reverse(arr.begin(), arr.end());
 memcpy(&value, &arr, sizeof(T));
    return value;
}
```

```asm
foo(int): # @foo(int)
        mov     dword ptr [rsp - 8], edi
        lea rax, [rsp - 5]
        lea     rcx, [rsp - 7]
.LBB0_1: # =>This Inner Loop Header: Depth=1
        movzx   edx, byte ptr [rcx - 1]
        movzx   esi, byte ptr [rax]
        mov byte ptr [rcx - 1], sil
        mov     byte ptr [rax], dl
        dec rax
        lea     rdx, [rcx + 1]
        cmp     rcx, rax
 mov     rcx, rdx
        jb      .LBB0_1
        mov     eax, dword ptr [rsp - 8]
        ret
```

GCC and successfully optimizes this https://godbolt.org/z/jh63o6sKo

```asm
foo(int):
 vmovd   xmm1, edi
        vpshufb xmm0, xmm1, XMMWORD PTR .LC0[rip]
 vmovd   eax, xmm0
        ret
.LC0:
        .byte   3
 .byte   2
        .byte   1
        .byte   0
        .byte -128
        .byte   -128
        .byte   -128
        .byte -128
        .byte   -128
        .byte   -128
        .byte -128
        .byte   -128
        .byte   -128
        .byte -128
        .byte   -128
        .byte   -128
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcVltv4zYT_TX0yyCGRPkiPfhhba-_r2iCFguj7ZtBUSOLqUSyJOXY-fUFaUu-RFnsvjYIong4lzNnzshk1oq9RFyQ6ZJM1yPWukqZxSsabE5PRpR_CznKVXFaPD__8QIlE7UFp0BpJxrxjmBFo2uE_OTQvjENrN4rI1zVWHAVc9BaBGYMO1mwLa-AWRKtSfTl8ncWnX-51meLw0bXzCFJVtYVJPlCki9COtwbVsOWJF_PblxJ6_CoDWz72oSmWziwukVCM5AKjxy1AzJfnmPAOuYE3zFr0ThC075AxeyuleKfFncqf0Xudga1QYvSRyhpdweSrEJ1uoJLNkLpFhp2AqkcVOyAoFlRCLmHXDhLKCU0I0lXGwBY69QZ30N6IMkaejC5cDvOrLtlIDB4a_A9eyxWvKMqfeeh2tcAMe1IuJbvAw2Te7SX__GAxmIX8IDqEb5B1xo5iHN7U_Y7Wch8_TD2Oy3Q1FXCgvDKQbDtfo_WYQFaWSvyGiFIrelZK5UBMovuOAk6mEWgJFTO6dAo3RC6QTnmWhss0aDkOOaqIXTzRujGS49uZNugEZzQzVVO2S08Jgv4Yem6k0bJGoStH1L_qYeKkuU17kR5J3O765TecRrsl2muQEjXG33OoJuo34nPNuG6AADwQVKtkC7duSEx-cW9k0CDDdcnQlNCZ_7MLwOd9fju4x_kc1VgrzpmzDjHvZAhY-ZTeBPKojPcpLit3Ve84vhu7Yt0z2E_qMbOyGxztpRKEZr6Gfjsfv8TIJPoztxXDGypQ3gWb8oUoJ0BMl0aq-EJUjJde9RYiPuYGhkYdgy9dc5T7_zBK_TF7z3nvef4ebmMdnGPM1mT5OvWr9cvUqKBZ6U0_B9Zgcb7rFG7iiTr-EMH70cAwCLU8fLq--BHeIL4A7Q-xIoPIew45P5Z2jDUepjSgbR0BcWDd4E8kDnMXdFzx49A6HKgGd7oW56vuToc3UHxUOQ1Pz-7MQw2gec5fyaPuxiD7jti_d9qBf79ZFvO0dqyretT_xXtX6fCPrwO96rIVe3GyuwJ3bwTunmtZoma2V_VT23BBeWhUYcCAI5NEw_q-qBt1Za5d4i8Q-f418vLn799W8Pv228wfl5FngKhr-13iS9chfBhYkJ0D-jyMw5CAUgu5u4zHXaLh83RkPkppumw-8-f_DdzPUh1VCySIksyNsJFPEuzLIujbD6qFlmZ8SxKKZ_zCY94MUl5kUwm03mMNMvnfCQWNKJJNKc0iqdpPB9nvJyXtGSs4DTFOCOTCBsm6nFdHxqv6ZGwtsXFbBLReFSzHGsbbriUSnyDcOgvaNP1yCx8zFPe7i2ZRLWwzl6zOOFqXLwIa7Ho9ul692CfX35HrakXDxsnXNXml3uHr3B5PGmj_JWT0E3AZQndBNz_BgAA___9a0Ll">