/* { dg-do run } */ /* { dg-options "-pthread" } */ /* { dg-require-effective-target pthread } */ #include #include static _Atomic int sem1; static void *f(void *va) { void **p = va; while (!__atomic_load_n(&sem1, __ATOMIC_ACQUIRE)) sched_yield (); exit(!*p); } int main(int argc) { void *p = 0; pthread_t thr; if (pthread_create(&thr, 0, f, &p)) return 2; // GCC used to RTL-DSE this store p = &p; __atomic_store_n(&sem1, 1, __ATOMIC_RELEASE); int r = -1; while (r < 0) { sched_yield (); asm("":"+r"(r)); } return r; }