[Bug rtl-optimization/63375] [4.8/4.9/5 Regression] reordering of reads across fences
bobby.prani at gmail dot com
gcc-bugzilla@gcc.gnu.org
Mon Nov 24 19:32:00 GMT 2014
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63375
--- Comment #16 from Pranith Kumar <bobby.prani at gmail dot com> ---
This is not a good use case(it is a bit twisted, invalid too maybe?), but when
I try to read the stack without aliasing, the volatile write which I performed
is not visible.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
typedef struct {
int counter;
} atomic_t;
static inline int atomic_read(atomic_t *v)
{
return (*(volatile int *)&(v)->counter);
}
static inline void atomic_write(atomic_t *v, int val)
{
v->counter = val;
}
#define smp_mb() asm volatile ("mfence":::"memory")
int i = 0;
int main(int argc, char *argv[])
{
atomic_t val1 = {2};
atomic_t val2 = {5};
int p = 0;
printf("%p %p\n", &val1, &val2); // try commenting this
smp_mb();
p = atomic_read(&val1);
smp_mb();
atomic_write(&val2, 9);
smp_mb();
printf("%d\n", *(int *)(&val1+4));
return 0;
}
In the above program, if I comment the first printf() there is no alias for
val2 and the atomic_write() is optimized out and I see 0 printed out in the
second printf(). But without commenting the first printf() the write is issued
because of which I see 9 printed in the second printf.
More information about the Gcc-bugs
mailing list