<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJy9VVlvozAQ_jXwMkpEcI7ywEPSdNVK1Vba47kyeBrcGszaJun21-8YSJYcW1Va7VoG28z9eWbItPiZ3qJSOoivg2gdRMvufQeukNUL5IpXGwjYTcDWMIlhgxUa7tACh53RRMu1QJAVjB4m8KQNySGtpHEniVobvTG8DNhyqD2YR_3sjjGTVa4aUhSwa-uEwKdx4Y0OZKzjTuaw1VJAEC9rLSuHJmCrIVNLtege9-T4ai8guONBnPTci14MaPS84ENsuQ46F-uhcuKCHZfukcI8MXBZsReQrdroxE9P3RVSUcDx1cC-5_38_f7-oA_6IYN45ee5GoOuMRUxnHt9gnL7_kpIe6vxIYAYpIVKO4JWEcQKKRVAOv8VX2vMHQpwGgq-RbC6RNC1k6V8I15d2WEAW64a4il0owRkSK5xAZrsUTjjzvw3yo7RQ9xljdL6xdLWGLLibZT4fqIMb5YdsLk0KKUgmEZDgSM8S71t1x87bQTUjtCfrYysSXC1T4hgtvZQGCGPZQnx7sNZMvzRp96dM4EjvXlZf9Sn6FjyGbt1fL9aTR4nx8RXKko_kL96Ub9cDmcv_T6yh3B8tt58KyhN7ipqCnCvdQ23dOUdEGusHdXw-sSb5z7II1cvZuqt3uHWJ-h13178zneXQe5oYhj1-YjifyXPv0qAD9_URby-IJUv1aryfZuKqYOqrKmija9kpU3bZJZQOFdbD1b8ieZGi0wrN9ZmQ6c3egzLE7tYcOwUhyJlImEJD3njCm1SreRWEvAld2-jOfV5ETZGpSdqpSuabEwe0EGp7X4Z0S_hmeqdjtLaBi1tZtNoNg-L9GqeLMQiY9lkMs3o22LCniIxzTPGxEws5qHiGSqbUl1Q36pwB60K2lNdhH_vgUzjKPZzGiUxo6aFMxGxGXI2j5JkPs_oCrHkUo29Ho9YaNJWZdZsLBGVtM7-JnJr5aZCbB0mD510CtPBf5O79r9JPZQrBdzkBTmThK1baevTL8mTJ0s>54056</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            wrong code at -O1 (all archs)
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          olivier-matz-6wind
      </td>
    </tr>
</table>

<pre>
    Hello,

I think clang >= 12 generates a wrong code in -O1 for the following program:

```
#include <stddef.h>

static void *pointer;

void set_pointer(void *data)
{
    pointer = data;
}

int wait_for_pointer(void)
{
    int i = 0;

    while (pointer == NULL)
        i++;

    return i;
}
```

Since "pointer" is not volatile, it is expected to have some optimizations (pointer value should be read once).
The -O2 code looks correct to me:

```
set_pointer:                            # @set_pointer
        mov     qword ptr [rip + pointer], rdi
        ret
wait_for_pointer:                       # @wait_for_pointer
        cmp     qword ptr [rip + pointer], 0
        je      .LBB1_1
        xor     eax, eax
        ret
.LBB1_1:                                # =>This Inner Loop Header: Depth=1
        jmp     .LBB1_1
```

However, in -O1, the code looks over-optimized:

```
set_pointer:                            # @set_pointer
        ret
wait_for_pointer:                       # @wait_for_pointer
        xor     eax, eax
        ret
```

Related link to the compiler explorer : https://godbolt.org/z/r3c9s77ae

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy9VUtvozAQ_jXkMkpETCDhwKFpWrVStJX2ca4cPA1uDWZtk3T763cMJEvSbNXLrmWwzbzH3wwbLX5ld6iUDth1EK6C8Kp734MrZPUCueLVFoLoJohWMGWwxQoNd2iBw95oouVaIMgKxg9TeNKG5JBW0riXRK2N3hpeBtHVUHuQhP3sjiySVa4aUhRE19YJgU-TwhsdyFjHncxhp6WAgF3VWlYOTRAth0wt1aJ7PJDZ4iAguOMBS3vueS8GNHpe8CG2XEed89VQOXHBnkv3SGGeGbis2AvIVm145qen7gupKGC2GNj3vF9-rNdHfdAPGbCln-_VGHSNqYjhvddnWW7f3yjT3io7BsBAWqi0o9QqSrFCggJI57_ia425QwFOQ8F3CFaXCLp2spRvxKsrOwxgx1VDPIVulIANkmtcgCZ7FM6kM_-d0DF-YB1qlNYvlrbGkBVvo8SPgTK82eiYm0uDIAXBLBwKnOSz1Lt2_bnXRkDtKPvx0siaBJcHQATxyqfCCHkqSxnvPrwDw1996t15J3CiNy_rz_oUnko-Y7dO1svl9HF6SnylovQD-asX9cvlcA7SH2f2GI5H6833gmByX1FTgLXWNdzRlXeJWGHtqIZXZ94890GeuHoRqXd6jzsP0Ou-vfid7y4D7GhiGPd4RPG_wPOvAPDpm7qYr69I5Uu1qnzfpmLqUlXWVNHGV7LSpm0yV1A4V1ufLHZLc6vFRis30WZLpzd6TJSndj7n2CkeiSwSaZTykZNOYTbo-9y1fZ96AFcKuMkLS7U-aozKzoxIVzSbCflDB6V2h2VMP4hnqn46SmsbJPHbeBbGyajIeDLL02mUzheLkCcM842YxUnE4jmfxvFTPFJ8g8pmVCXUxSrcQ6uC9lQlI5mxkPk5C1MWUQPCWIRRjDxKwjRNkg1dB5Zcqon3w0c_Mlnr0qbZWiIqaZ39Q-TWym2F2Joj_bxxhTaZVnInCYQld2_jhP55YtR6kbVR_AZ5UxGy">