<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/86734>86734</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Restrict pointer loads not affected by asm memory clobber
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
gooncreeper
</td>
</tr>
</table>
<pre>
When a memory clobber is used in inline assembly, restrict pointers loads are incorrectly reordered after the inline assembly. [GCC inline assembly documentation](https://gcc.gnu.org/onlinedocs/gcc/extensions-to-the-c-language-family/how-to-use-inline-assembly-language-in-c-code.html#clobbers-and-scratch-registers) states
> Further, the compiler does not assume that any values read from memory before an asm remain unchanged after that asm
Therefore it is invalid to assume that values pointed by restrict pointers are unchanged if they are not passed as input operands.
Example C Code
```C
#include <stdint.h>
void ipc_copy(uint64_t p, uint64_t *restrict a, uint64_t *restrict b) {
uint64_t s0 = a[0];
uint64_t s1 = a[1];
uint64_t s2 = a[2];
uint64_t s3 = a[3];
__asm__ __volatile__("mov %0, %%cr3" :: "r"(p) : "memory");
b[0] = s0;
b[1] = s1;
b[2] = s2;
b[3] = s3;
}
```
Clang
```ASM
ipc_copy: # @ipc_copy
mov cr3, rdi
movups xmm0, xmmword ptr [rsi]
movups xmmword ptr [rdx], xmm0
movups xmm0, xmmword ptr [rsi + 16]
movups xmmword ptr [rdx + 16], xmm0
ret
```
Expected (Clang 14.0.0 / GCC)
```ASM
ipc_copy: # @ipc_copy
movups xmm0, xmmword ptr [rsi]
movups xmm1, xmmword ptr [rsi + 16]
mov cr3, rdi
movups xmmword ptr [rdx], xmm0
movups xmmword ptr [rdx + 16], xmm1
ret
```
Related: https://github.com/llvm/llvm-project/issues/15867
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVkGPqzYQ_jXOZUQENknIgUOWbN6pl9dKPUbGHoIrYyPb5CX_vjJkySb7Vu2-FkVEzDeeb-Ybw5h7r04GsSSrF7LaL_gQWuvKk7VGOMQe3aK28lr-2aIBDh121l1BaFvX6EB5GDxKUAaU0cogcO-xq_WV0Aoc-uCUCNBbZQI6D9py6YE7BGWEdQ5F0FdwaJ1EhxJ4E9BBaPE53BLI6uVbVT3bQVoxdGgCD8oastoTWrQh9J6wHaEHQg8nIZYnMyytOxF6sONyaYWfIEIPeAlovLLGJ8EmocVEJJqb08BPmDS8U7GYQ2t_RHjwmEwpJG8p3J2VSUQirMRlGzpNKLvJ5BNuZOKF40G0icOT8lENQrfgAw_oSbon6e52Z69wGFxo0UUNoxbCdr3S6EBa9GBsiOUPHUJoeQBurnDmekAPDrmExtnurU81NtYhcAPcd-Cw48rAYETLzemd3DGK795n8UeLblqrQuyyMmeulYRgH7hvvFN_JdTXn_Q8dvtOqZpY0nW0xkr6KKMEHin6IYDt0XEj_fJ9Nq8X3vUaoYLKSrwh63T6VbdnypQRepAIhFU-SGXCsiXs9X2gs1USVC-OwvZXQotBmbDOjwH6qPX8ROhuroN_itSxgWTzMoUGgLubT4GwPXCyeknjpmRvTnePbPbIHjwewtDZiX7uxGYn9uB0PHLfHY9wPJ6t5kFpPB4JLQilnT0Doas0lkboitCVcIzQyLYjbAeEUkcoJbToxxon07SnRvv2zlLfahyT8OlDjvWtugnLPmB0xugHjM0YmzGy2T81f3qs4iv4hOx-_22yzO0eq2BA8nQ2zYzxiqrEa9SiAifVB3zoPcCl60blLl33wzoJfXDx6-S8ivJ_tuTBVV7GT1U1xfoiCxD6Atn6C2TvVjxyOgw_FfT10qOIbzShxSguZPkyXaZA6AG-VVXcAf-D3P9BzuzL2vzb3v5Co_5J7uxx5WeqT_fvqHlAGfV7mmQqtEO9FLYj9KD1-e0v6Z39C0Ug9KC8HzCOtmxVrDcLWTK5ZVu-wDLbZFlerLJ8vWjLTc42eVrLdEPrNG02W5mzhm2KIi0QRVYvVElTmqeMrmnKKF0vaYNNvWV1hjXWcr0heRqHiV7GBOJsXYzUZbHesHyheY3aj0cKSg3-gBGMX47VfuHKMel6OHmSp1r54O9Rggoay-9PQ-R2bhgnX9NMO7O-jjPt8UCyGJwuf121Mfu_AwAA___qXLor">