/* { dg-do run } */ | |
/* { dg-options "-pthread" } */ | |
/* { dg-require-effective-target pthread } */ | |
#include <pthread.h> | |
#include <stdlib.h> | |
static _Atomic int sem1; | |
static void *f(void *va) | |
{ | |
void **p = va; | |
while (!__atomic_load_n(&sem1, __ATOMIC_ACQUIRE)); | |
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) asm("":"+r"(r)); | |
return r; | |
} |