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

    <tr>
        <th>Summary</th>
        <td>
            `__builtin_memcpy_inline` is unsafe reguarding pointer type?
        </td>
    </tr>

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

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

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

<pre>
    The following code result in different codegen on `armv7`
```c
#include <stdint.h>
#include <stdio.h>
typedef struct {
  union {
    _Alignas(16) uint64_t data[2];
#ifdef __SIZEOF_INT128__
    __extension__ unsigned __int128 whole_data;
#endif
  };
} cc_hash_uint128;

#define PROJECT_CL_HASH_GENERIC_LOAD(DST, SRC) \
 __builtin_memcpy_inline((DST), (SRC), sizeof(*(DST)))

__attribute__((noinline))
cc_hash_uint128 cc_hash_load_uint128le0(const void *data) {
  cc_hash_uint128 value;
 const uint64_t *src = (const uint64_t *)data;
 PROJECT_CL_HASH_GENERIC_LOAD(&value.data[0], (const uint8_t *)&src[0]);
 PROJECT_CL_HASH_GENERIC_LOAD(&value.data[1], (const uint8_t *)&src[1]);
 return value;
}

__attribute__((noinline))
cc_hash_uint128 cc_hash_load_uint128le1(const void *data) {
  cc_hash_uint128 value;
 const uint64_t *src = (const uint64_t *)data;
 PROJECT_CL_HASH_GENERIC_LOAD(&value.data[0], &src[0]);
 PROJECT_CL_HASH_GENERIC_LOAD(&value.data[1], &src[1]);
  return value;
}
```
ASM
```asm
cc_hash_load_uint128le0:
 push    {r11, lr}
        ldrb    r12, [r1]
        ldrb    lr, [r1, #1]
        ldrb    r2, [r1, #2]
        ldrb    r3, [r1, #3]
 orr     r2, r2, r3, lsl #8
        orr     r3, r12, lr, lsl #8
 ldrb    r12, [r1, #5]
        orr     r2, r3, r2, lsl #16
        mov r3, r1
        str     r2, [r0]
        ldrb    r2, [r3, #4]!
 orr     r12, r2, r12, lsl #8
        ldrb    r2, [r3, #2]
 ldrb    r3, [r3, #3]
        orr     r2, r2, r3, lsl #8
        mov r3, r1
        orr     r2, r12, r2, lsl #16
        ldrb    r12, [r1, #13]
        str     r2, [r0, #4]
        ldrb    r2, [r3, #12]!
 orr     r12, r2, r12, lsl #8
        ldrb    r2, [r3, #2]
 ldrb    r3, [r3, #3]
        orr     r2, r2, r3, lsl #8
        orr r2, r12, r2, lsl #16
        str     r2, [r0, #12]
        ldrb    r2, [r1, #9]
        ldrb    r3, [r1, #8]!
        orr     r2, r3, r2, lsl #8
        ldrb    r3, [r1, #2]
        ldrb    r1, [r1, #3]
 orr     r1, r3, r1, lsl #8
        orr     r1, r2, r1, lsl #16
 str     r1, [r0, #8]
        pop     {r11, lr}
        bx lr
cc_hash_load_uint128le1:
        ldm     r1, {r2, r3, r12}
 ldr     r1, [r1, #12]
        stm     r0, {r2, r3, r12}
        str r1, [r0, #12]
        bx      lr
```

The later case will cause BUS Error on such platforms.

GCC `__builtin_memcpy does not seem to have this problem.`
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUV0-P4rgT_TTmUhoUOySEAwf-zsxP85tZNb2XuVhOYohXjo1sh-7eT79yCCQE6GZXu4dpIdKxy69evec4FLNW7BTnUxTNUbQcsMoV2kw3WWF0LtSOm59FNUh1_jZ9LjhstZT6RagdZDrnYLitpAOhIBfbLTdcuXpixxVoBSgOmCkPYxQHKFiiYOb_qT9Zc09CoTJZ5RxQuLAuF8oNCxSu7k3rzqx72_Ocb8E6U2UO0Hh-HAeolPDZ2wEAOpNip5hFJMExIhOohHLxiDrImWMomhMULVE4bxNvPTalm68_Vz_W9Ov3Z0wSSjuIlL86rqzQilKoVK1jDpQK5TBJ4KXQktMavQPLVS62JxA07qQcLyHLaMFsQasjRDt3Wp3zrVAcfnv68b_V4pkuvtEvs80X-nn1ffX0dUG__ZgtEUmWm2dEFrB5WvhCUbRo8lGaVkI6oWjJy2z_RoWSQnFEktOiiV-HSHJc6m-s-JPrbR0y60TVnw43SplzRqSV45QeAZU-wbfBvQLPBUvN8tOg5AEiSaaVdXDQIgdEZrWKvpbW0j7UgcmKnxWD4_qzyYjMrMkAhUs4g3cnEZlcOPWRxIjEdcJhs3sCv3uO2rXgyRkbkdia7Bw3-cd58IN5cD-P4a4yqqeS33__lYn4VzbxX3frni0f-XI6L4-3s83_e-PMlpem9J-ksPEW9pUt_LGFxnODsWclzTkPNH8yN6m_Gkxq3tHc1JRvBknTxtRFhvdjDenHkvuxYT82bGO1MdACNt_1Ammlj00uQc_xdUxT15F5b8HN2o_5oyuuPRphS6ZBxfHlglIfzhwuZ6zrQvm0wQMyhg21Ub2jcF8d3JUHk_v63EfuGHTtTHjtzG1lPjTovjA9pG5Jd0R-x0J8zfSW8B1RH5QJk1_dAR__uMb3VcPvPNJXfkz-xuOfXCj86BN4T-Yr-Hdo40dOItwhgB84iXB3Y9xS-iwx7kucXFHd6319ffdYT1_96DvvCdy-J84SlF0O4_mFzpi0OWTeZ4vvbwjrGtjgI9jOdrvW4QZy-toQNzdfncdv38JI5riBjFkOL0JKyFhlOcx_38DKGG1832KrrIC9ZG6rTWmHXYTPi4Vva_o_pSHX3ILSDiznJTgNBTtwcIWwsDc6lbwcojgY5NMwn4QTNuBTHCcBnoxIEA-KKYmS8STMsyxlecZwnI6SIB-PkyTCOCNpNBBTEpAwCMMAx2E8iodhnGzzOMoIIyyLRyM0CnjJhBxKeSiH2uwGwtqKT2OcRMFAspRLWzd5hCj-AvUkIl7HgZn6NZ_SamfRKJDCOtuiOOEkn94o-dQ9xAEI6_sftvUN4a5ixjeOsNdCeaV9m4bC9aAyclo4t7d-r5E1IuudcEWVDjNdIrL2CZvLp73Rf_DMIbKuaVpE1nUZfwUAAP__JRvfdQ">