https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80728

--- Comment #9 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
I am not 100% sure we should not transform this code. The way signals are
defined that only volatile/atomic variables can be done via signals.

This works:
```

static _Atomic int i;
static _Atomic int b;

void sighandler(void)
{
 __atomic_store_n (&b, 1, __ATOMIC_RELAXED);
  __atomic_store_n (&i, 1, __ATOMIC_RELAXED);
}

__attribute__((noinline))
static int x(void)
{
  asm volatile("":::"memory");
  return __atomic_load_n(&b, __ATOMIC_RELAXED);
}

int f(void)
{
  __atomic_store_n (&b, 0, __ATOMIC_RELAXED);
  return x() ? __atomic_load_n(&i, __ATOMIC_RELAXED) : 0;
}

```

So does marking b/i as volatile.

Marking the variable i with the attribute used also works. as that says the
variable is used outside of what the compiler knows and in this case x only has
an inline-asm which clobbers memory.

Reply via email to