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

    <tr>
        <th>Summary</th>
        <td>
            Suboptimal `memcmp(s1, s2, n) == 0` expansion on AArch64
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:AArch64,
            llvm:optimizations,
            missed-optimization
      </td>
    </tr>

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

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

<pre>
    Calls to `memcmp(s1, s2, n) == 0` which require multiple loads+compares are expanded to suboptimal code which combines the results of multiple comparisons with `EOR` and `ORR`. The more efficient expansion uses `cmp` and `ccmp`:

# Example ([godbolt](https://godbolt.org/z/bocWhvrbe))
Input:
```c
bool src(uint8_t* s1, uint8_t* s2) { 
    return memcmp(s1, s2, 3) == 0; 
}
```

Compiler generated code:
```asm
ldrh    w8, [x0]
ldrh    w9, [x1]
ldrb    w10, [x0, #2]
ldrb    w11, [x1, #2]
eor     w8, w8, w9
eor     w9, w10, w11
orr     w8, w8, w9
cmp     w8, #0
cset    w0, eq
ret
```

Handwritten code:
```asm
ldrh    w8, [x0]
ldrh    w9, [x1]
ldrb    w10, [x0, #2]
ldrb    w11, [x1, #2]
cmp     w8, w9
ccmp    w10, w11, #0, eq
cset    w0, eq
ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzNVMFy2yAQ_Rp0YeKRwLKigw5OnEw7PWQm7UyPHQRriwYJBVCc5uu7SHbkuGknx3ow9u6D95a3ErVVv6prYYynwVKySltoZdsTdukzwq6pZ3HuCCsp4RscNMVFdN9o2VAHj4N2QNvBBN0boMYK5Qm7krbthQNPcaLw3ItOgYoCfqhtH3QrDJVWwYEHl9e6w-WhAST1SOep3c68E5_2tvN0r0MTC725u4-VIHWM7u5jtKDfkKG1UXW71VJDFyZ9r21HB48auCwecN4qp5DwNUk3JD3OjNObZ9FGeXSD5Fc7q2prAsk3GDch9D5uYbc4DtDCuh1GL_itrfzePLka0Lk4Rs7PXT-EWWeVTkNOcW2tod5JZB90Fy5_BMLWdGrDaYKNzSiu6LSN4sdBGFxH3-0df9M7ftxGis1ZGaenv0bDtQFHd9CBEwG7F_v1Z-3Ct1PGKNfEUvaXURTtek6jU2-x8ohlp1g9Ylk6b4x_GGfvLMpmhvNFYB2dKzjM5Rk2VnDQimwjat3fd6KhJxgKHnySHsKYH6ngccpiI_7h6id84vZOhwDd_2_n24O_2nFIn1h4tOXEho-ak6iKq5KXIgk6GKi-ztfDh6-i-fXGsV472ayWyeBMdfaK4rUx1Au8STAw5un4c9E7-xMkvlq32vsB8Pq6zVf5kidNVde5FKC2hdyKAkq5yrJUMLbacr4UK54nRtRgfIUGEsZqIR-gU6h4qAJzkzls1OPr8Wz6RQSs1s9oi8KgLk7RCOabRFcsZSwtsjxjecmLBahaFWVRKi4LBakiyxRaoc0iKsTrJ3HVeKp62HkEjfbBz6DwXu86gLFi5BdDaKyrvrQgHnSXjAZU4-l_A7A8tz4">