<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">