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

    <tr>
        <th>Summary</th>
        <td>
            [libc++] Suboptimal codegen for std::equal(std::byte)
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    ```
#include <algorithm>
bool f(char* a, char* b) {
  return std::equal(a, a+16, b, b+16);
}
bool g(std::byte* a, std::byte* b) {
  return std::equal(a, a+16, b, b+16);
}
```
`f` generates `pcmpeqb`. `g` generates a loop. `std::equal` should be aware that `std::byte` is functionally the same as `char`.

#89820 could relate.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysUtFupDoM_RrzEhVlHCZMHniYae_8wP0CJxjIKhCahK769yvQtKu2rytZEDu2z4l9KGc_LswdnG9wfqloK1NM3UTBeqxs7N870PJh8gqo_OLC1rMA9UxhjMmXaQb1H8irjTGIAfDiJkqAV0GAz-LDsYBGQHsDeRUicdnSInLpQV1BXfl1owB4OSoI8HbS-8k-PodrQO3F0L58YI2Al88W9r3wJ-iP6L9F_zISLQfQUoy8cKLCWYCWq5tXfrWgZb2749cEEiHG9bj5xkFLkae4hV5YFvSbEosyUfmSeTxJS-GzGLbFFR8XCuFdlIlFppkFHRSOuWtZ7xSPxV3MBaVwR_fEgQrXVd-p3ihDFXentsHWNEo31dRJ5fqTanq8aG3JaNLtmbE_4alhbY2pfIcSz1JhI88K0dTakRkGNzTKtLZXDhrJM_lQh_A21zGNlc954-6kULdYBbIc8ofqUrdnPdltzNDI4HPJf-uKL-HQZ_DWAd52O7-I_zcb1-JnCsLFnkdexBDTz6V-k4KpthS6qZQ172G8A95HX6bN1i7OgPcd9_F7WlP8xa4A3g_yGfD-4P_W4Z8AAAD__5x68ak">