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

    <tr>
        <th>Summary</th>
        <td>
            clang misoptimization cached equality of thread local variable
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

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

<pre>
    commit where clang 18/19 fails: https://github.com/kelbon/kelcoro/pull/28/commits/541a84b207c62c19dbdbc5b35f4788f36cec7b19

code:

```cpp

 auto job_creator = [&](std::atomic<int32_t>& value) -> dd::job {
    auto th_id = std::this_thread::get_id();
    nocache(th_id);
 (void)co_await dd::jump_on(TP);
    if (th_id == std::this_thread::get_id())
      ++err_c;
    value.fetch_add(1, std::memory_order::release);
    if (value.load(std::memory_order::acquire) == 10)
 value.notify_one();
  };


```
TP - thread pool

My workaround (after this test works as expected):

```cpp
[[gnu::noinline]] void nocache(auto&) {
}
auto job_creator = [&](std::atomic<int32_t>& value) -> dd::job {
    auto th_id = std::this_thread::get_id();
    nocache(th_id);
 (void)co_await dd::jump_on(TP);
    if (th_id == std::this_thread::get_id())
      ++err_c;
    value.fetch_add(1, std::memory_order::release);
    if (value.load(std::memory_order::acquire) == 10)
 value.notify_one();
};

```

So, it is not first issue with caching thread local variables in coroutines, but now i think clang does not cache value of variable (load address), but anyway optimization thinks, that 'th_id' is equal to result of get_id
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzslc-O4ygQxp-GXErdssF_Dz50JpPbSiPt3C0M5ZhuDBnAyWaffoVJd5Kd1q7mPlLkALZ_VfXVh-Heq4NB7Ei5JeVuw5cwWde9oR6s2QxWXjph51kFOE_oEITm5gB5Q-g-b2HkSnvCXmAK4RgHhO4J3R9UmJbhWdiZ0H1CpYGwzhK6Py5aE7qnkZLontB9WeS8KQaa1aKiIm_lIAdRDqwci7ppRlYJFPWQtyTbkewlXYWVGMPeLZEqSz9xPN6vA1-ChVc79MIhD9YBYTuIZdOKlDtCGx9kZLEXHuysBGFflAmM9oGwr4RWcOJ6QUJbeCLsK8jrw692AFJvr0EAUpww9UquET6oYVK-D5NDfl04YOiVJFGGlrA7grGCiwkJbVbMw21Cm5Nd14Tt-ZmrcMtkmY99lLr5_u3fSDXCOy5m9QuJ0fZGASB0S-gWnevFA3_V5nnEIKaey_huTuiXW4wZZ-suvXUSXVpxqJF7_DzRhNOWy_u-_Azh4sei3NqUa1V5dss4UYwNarz01uBPUpN69zH71ENp-v0bPEESCI7W6vtH_7jA2bo37uxiZEydjwEdRE0hoA_rXQ_cA_51RBEwtfP_LBt34_ZgllSmscpoZTD6tNxBNMCdSaLhoomjCO9GjJWtg9-u_-36B6k_8fyj29P1TxsrUQGUB2MDjMr5OPELwlmFCWKzlDm87wttBddw4k7xQaMHZSB-7ZegDPqIGpYAxp5Bxb1h3q4nibSY-GvvU-5gxw9QlCUKAlxKh96vvUkwbi5nfgF7DGpWf_OgrEnoNVyYeABC66uX6lgH_li4hmDBoV90iHFS0zeyY7JlLd9gl9e0yVmbVe1m6hiri4o1TTWWRVOJisuyGVnGZNkWshJ8ozqa0SLPsjIvWF20z5JKVqAceNOOI8-QFBnOXOlnrU_zs3WHzaphl-c5LeuN5gNqv56-lK6SEErjQey6-MLTsBw8KTKtfPA3RFBBY5cUnJV_kGAVUqZaVbjEIj9t0WZxuvuPczsGu_49HZ19RREI3a_Jx9P6mv-po_8EAAD__2Y_cXY">