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