<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJztWEtv2zgQ_jXyhWjAN6mDD06dAsG2i0WyaBd7CfSgbRWS6EpUkvbX75CSHdmW3aZ7WmwDx7akb2b4zZDzcGrzr_M_3y_vIrZAG-e2LXyJ6Dt4rW2e2tJd2WYNV9_gPzWM_8bSREd4GeFF__5pU5QG2Ro9S44iiW-et0mdo8pUWbWNqI5ojJxFpU1yUNE625gWwX0TcDtYDJLINUndrmxTJa4AhdukbVFuAZ6gtbU5-mxTv7reuMTDq7-kwwvd3qFlV23RtQFNBv3kctBe4aCfXaN3XZ2FhS2ca7yfUNW1btvYNehoUW1XjTHw0dVPBZhsTJLbuvyKnoqybIzrmhp1Ty5JS9PrzM2qqA3KW_tQ2iwpgyjcRN9MY82zQwVBEccPfxN6276HhVa327ar_shguYX2XGsQ24JisxfdG42owJ5H0PzQ1XVSmfwhyfMGHjGMInXdrwJ5KEURWyKXFCUCeIkKRr3ptPfZzlhvorZ13QEmN41ZwX-dmcCJasl7z3nLb9HrpNbGmdJUpnZb16CiTr1ciEwkrmFnPXt9YukVH91Y-JVeta4JRuEJHn2Jd9-DlRFjFhgXQBCZLz1fcINH4x0KYhZCAOBhE6jleOef7rnFypnm15Z7xZZLC5clrRs2i9fgXVVQIfd-GIXLu3B4-HYH2sctKYt1jchIiAehZ9sEbB9IAApKCcFxLBjmUitBpIRPGTOmBNdCcsWxUloyTSTFUgGOYck1EYRyTBQRsWRwjVlM5MicCOaONrJ-OQr7gwHbkdGRoJx2hZh2hbroCjntCn3iCuWBJJYafKHAIZIxSSk4jXHCqWSEx5RzpmMVwyVVhCvMtdRAnlLwGOYYx9I7kUkN3hsZi4OxkS0eji2sYgQi-OUEwpbcQeODI-hxJOC-7XZnkPSOOXAhoVPnmZAzB5rQ4xN9WE78ibv7AHEqHHj6yTStL20-HXoz3hIOBctCaXo0zVcA1WvUmi-dT2zIrtD9p8UdnPZ7OApJg2xfV__7lQs9tsDIPEClXvvk7R0Mh2CXWs_ml1-l7Fcp-7_twTO1zYfvXGmTfAjyDxc233QPdU0TjDEnWMSYaqwwpfgnq5P-0eJ0zEVd4PL9ytRzCYVJA4UYSg4hAooP1lqzkwLzY1wOSvRQdE7YxJNshtIzTYfgaT5DJRoR6quQ0tBOECmg2DIIrOTioMqxV1CifCzJpymBxklO4hInfoaTPOEkQpQYUQpDIwR_0EJwwcZRIupnGyKiz3BS05ziS5z0NCeKTziFDEsZ01hiGvt-kMeE4QMp8gpOfBxheiYpgMYpTvRiWjiTF-hJYqAhMygR-36NekpEYHgbx4m-JjXwcW6gZ5IDnc4O9FJ6oGfyAz1JEDRkCEZh22ES2lRCoYNV41NBX5MixDhFsDMpgk7nCHYpR7AzOYKd5AgWcgQjTMDUQRW01ppDez2WYfuuuheZaqoZPwIROqAO0iATRzCKB9hBamHyGKYH2MFpZeoIxtgOdqBNH8PEDnawtvgYpnawMVN-ND4M2JPxgZ-MD3xifOCT4wM_Nz7w74wPtxFVFYIupTF5MFYla9-TWJgVNtBSoFVjKxgdYIcZ9LSBHvJldgCZGsQdchu4C20GejPMIpnNzdrU4SexHtKBeAptULaBNqy1flrZJG0YS7Ksq7oycaAQQT8EbZDksKfRY1J2xiNWxdp3OrZzXuwp8S3Yi9GrcXcIXaDJnMn3I8zvBvo4iND9xxsK5LblLJ-zPGZxMks6t7HN_GZtm2s765pyfvSrYuE2XXqV2QouyvJx9_EGOsHPYAUui7btTAtfIJxazzZznJMMa6EVVbnKpVFpSqD06HyVZQlVyaxMUlO2c-imoY2e_XuTxZz67gnGYcI4JJorjWMSp4YkOstXDAvoI00FI8aV1-N_IZ0186Ay7dYtPCyL1rUvD5O2hRRgzG6FrnBluFgsmmwD6UIsX3rsv8J2Z28zW7cuYjdRn8vC0ImKPkz3tx-Wxcrks7DweVj1P4oM8AE>53988</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [AArch64] memcmp(X, <const>) == 0 is not SIMDifed
        </td>
    </tr>

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

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

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

<pre>
    TLDR: https://godbolt.org/z/be34K3ba8

While on x64 `Expand memcmp() to load/stores (expandmemcmp)` transformation pass does a good job:
```
*** IR Dump Before Expand memcmp() to load/stores (expandmemcmp) ***
; Function Attrs: mustprogress nofree nounwind readonly willreturn uwtable
define dso_local noundef zeroext i1 @_Z12IsLoremIpsumPc(i8* nocapture noundef readonly %0) local_unnamed_addr #0 {
  %2 = tail call i32 @bcmp(i8* noundef nonnull dereferenceable(64) %0, i8* noundef nonnull dereferenceable(64) getelementptr inbounds ([64 x i8], [64 x i8]* @.str, i64 0, i64 0), i64 64)
  %3 = icmp eq i32 %2, 0
  ret i1 %3
}

*** IR Dump After Expand memcmp() to load/stores (expandmemcmp) ***
; Function Attrs: mustprogress nofree nounwind readonly willreturn uwtable
define dso_local noundef zeroext i1 @_Z12IsLoremIpsumPc(i8* nocapture noundef readonly %0) local_unnamed_addr #0 {
  %2 = bitcast i8* %0 to i256*
  %3 = load i256, i256* %2, align 1
  %4 = xor i256 %3, 52211099530468751664686933754856474077863816206753030648151240171596364803916
  %5 = getelementptr i8, i8* %0, i64 32
  %6 = bitcast i8* %5 to i256*
  %7 = load i256, i256* %6, align 1
  %8 = xor i256 %7, 196811072116336222543414263149244389794262714704868596226640400969530368869
  %9 = or i256 %4, %8
  %10 = icmp ne i256 %9, 0
  %11 = zext i1 %10 to i32
  %12 = icmp eq i32 %11, 0
  ret i1 %12
}
```
on ARM64 it lowers `bcmp == 0` to a very long sequence of SWAR/Scalar ops:
```
*** IR Dump Before Expand memcmp() to load/stores (expandmemcmp) ***
; Function Attrs: mustprogress nofree nounwind readonly willreturn uwtable vscale_range(1,16)
define dso_local noundef i1 @_Z12IsLoremIpsumPc(i8* nocapture noundef readonly %0) local_unnamed_addr #0 {
  %2 = tail call i32 @bcmp(i8* noundef nonnull dereferenceable(64) %0, i8* noundef nonnull dereferenceable(64) getelementptr inbounds ([64 x i8], [64 x i8]* @.str, i64 0, i64 0), i64 64)
  %3 = icmp eq i32 %2, 0
  ret i1 %3
}

*** IR Dump After Expand memcmp() to load/stores (expandmemcmp) ***
; Function Attrs: mustprogress nofree nounwind readonly willreturn uwtable vscale_range(1,16)
define dso_local noundef i1 @_Z12IsLoremIpsumPc(i8* nocapture noundef readonly %0) local_unnamed_addr #0 {
  %2 = bitcast i8* %0 to i64*
  %3 = load i64, i64* %2, align 1
  %4 = xor i64 %3, 8100041059028070220
  %5 = getelementptr i8, i8* %0, i64 8
  %6 = bitcast i8* %5 to i64*
  %7 = load i64, i64* %6, align 1
  %8 = xor i64 %7, 8028914711526208883
  %9 = getelementptr i8, i8* %0, i64 16
  %10 = bitcast i8* %9 to i64*
  %11 = load i64, i64* %10, align 1
  %12 = xor i64 %11, 7881616507232526450
  %13 = getelementptr i8, i8* %0, i64 24
  %14 = bitcast i8* %13 to i64*
  %15 = load i64, i64* %14, align 1
  %16 = xor i64 %15, 8317708033332114533
  %17 = getelementptr i8, i8* %0, i64 32
  %18 = bitcast i8* %17 to i64*
  %19 = load i64, i64* %18, align 1
  %20 = xor i64 %19, 2338060299337491301
  %21 = getelementptr i8, i8* %0, i64 40
  %22 = bitcast i8* %21 to i64*
  %23 = load i64, i64* %22, align 1
  %24 = xor i64 %23, 7594040293371503713
  %25 = getelementptr i8, i8* %0, i64 48
  %26 = bitcast i8* %25 to i64*
  %27 = load i64, i64* %26, align 1
  %28 = xor i64 %27, 3203301149241272174
  %29 = getelementptr i8, i8* %0, i64 56
  %30 = bitcast i8* %29 to i64*
  %31 = load i64, i64* %30, align 1
  %32 = xor i64 %31, 31353812700984096
  %33 = or i64 %4, %8
  %34 = or i64 %12, %16
  %35 = or i64 %20, %24
  %36 = or i64 %28, %32
  %37 = or i64 %33, %34
  %38 = or i64 %35, %36
  %39 = or i64 %37, %38
  %40 = icmp ne i64 %39, 0
  %41 = zext i1 %40 to i32
  %42 = icmp eq i32 %41, 0
  ret i1 %42
}
```
I'm scared to imagine overhead from a case where sequence aren't the same - ARM64 codegen doesn't use branches so it has to accumulate a final 64bit value to figure out it was not the same.

Expected:
Neon or SVE2 impl
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztWEtv2zgQ_jXyhWjAl0jq4INTp0Cw7WKRLLaLvQSURNsqJNGVqCTtr98hJTuyLbtJb4tt4NiW9M0MvyHn5dTm3-Z_flzeRWyBNs5tW_gS0Q_wWts8taW7ss0arr7Df2oY_42lWkV4GeFF__55U5QG2Ro9C44igW-et7rOUWWqrNpGVEU0Qc6i0uocVLTONqZFcN8E3A6WgCRyja7blW0q7QpQuNVti3ILcI3W1uboi0396nrjAg-v_pIOL3R7h5ZdtUXXBjQZ9JPLQXuFg352jT50dRYWtnCu8X5CVde6bWPXoKNFtV01xsBHVz8VYLIxOrd1-Q09FWXZGNc1NeqenE5L0-vMzaqoDcpb-1DaTJdBFG6i76ax5tmhgqCI44d_CL1tP8JCq9tt21V_ZLDcQnmuNYhtQbHZi-6NRjTGnkfQ_NDVta5M_qDzvIFHDKNIXverQB5KUcSWyOmiRAAvUcGoN532PtsZ603Utq47wOSmMSv4rzMTOFEleO85b_k9epvU2jhTmsrUbusaVNSplws7E8XXcLKevb546RUf3Vj4lV61rglG4QkefUl234OVEWMWGBdAEJmvPV9wg0fjHQr2LGwBgIdDIJfjk3965hYrZ5pfR-4NRy4tXKZbNxwWr8G7qqCx2PthtF3ehcPD9zvQft90WaxrREZCPAg92yZg-40EYEwpIThJYoa5UDImQsCnSBiTMVex4JJjKZVgigiKhQQcw4IrEhPKMZEkTgSDa8wSIkbm4mDu6CCrl1DYBwYcR0ZHgmLaFfG0K-RFV4hpV6gTV0gPJIlQ4AsJDhGMCUrBaYwTTgUjPKGcM5XIBC6pJFxiroQC8pSCxzDHOBHeiUwo8N7IWBKMjWzxELawihGI4JcIhCO5gyYHIehxJOC-705nkPSOOXAhoVPxTMiZgCb0OKIPy4mPuLtPsE-FA08_mab1pc2nQ2_GW8KhYFkoTY-m-Qageo1a87XziQ3ZFbr_vLiDaL-HUNANsn1d_e9XLvTYAiPzAJV67ZO3dzAEwS61ns0vv0rZr1L2fzuDZ2qb375zpU3wYZNfXdh80z3UNUUwxpzgOMFUYYkpxT9ZndRri9MxF3mBy48rU88lFCYFFBIoOYTEUHywUoqdFJjXcTko0UPROWGTTLIZSs80HYKn-QyVaESor0JSQTtBRAzFlsHGCh4fVDn2BkqUjyX5NCXQOMkpvsSJn-EkTjjFYZcYkRJDIwR_0ELwmI13icifbYiIOsNJTnNKLnFS05woPuEUMixlTGGBaeL7QZ4Qhg-kyBs48fEO0zNJATROcaIX08KZvEBPEgMNmUHGie_XqKdEYgxv432ib0kNfJwb6JnkQKezA72UHuiZ_EBPEgQNGYJROHaYhDaVUOhg5Tgq6FtSRDxOEexMiqDTOYJdyhHsTI5gJzmChRzBCIth6qASWmvFob0ey7B9V92LTDXVjB-BCB1QB2mQxUcwigfYQWph4himBthBtDJ5BGNsBzvQpo5h8Q52sLbkGCZ3sDFTfjQ-DNiT8YGfjA98Ynzgk-MDPzc-8B-MD7cRlRWCLqUxeTBW6bXvSSzMChtoKdCqsRWMDnDCDHraQA_5MjuATA3iDrkN3IU2A70bZpHM5mZt6vCTWA_pQDyFNijbQBvWWj-tbHQbxpIs66qu1A4UIuiHoA0SHM40etRlZzxiVax9p2M758WetG_BXoxejbtD6AJN5ky-H2F-N9DHwQ7d_3VDgdy2nOVzlics0TNXuNLMoa9dLJpsA5EQL1_ax7_DTrL3ma1bF7GbqA_TME-hol_B_e2nZbEy-axryvnRL5KF23TpVWYruCjLx93HO-giv8AK4bJo28608AWOglKzzTzRLCVZvsooliZmJqVZSrVKmcZa5VzOSp2asvUrhqXOijn1fRMMwoRxSDFXCickSQ3RCpQwHEMHaSoYLq68Yf_b6KyZhzWk3bqFh2XRuvbloW5bCH5jdvp15za2md-sbXNtZ2G187DUfwEpydr8">